RE: [PATCH v7 3/3] ixgbe, ixgbevf: Add new mbox API xcast mode

2015-07-17 Thread Skidmore, Donald C


 -Original Message-
 From: Hiroshi Shimamoto [mailto:h-shimam...@ct.jp.nec.com]
 Sent: Thursday, July 16, 2015 3:36 AM
 To: Alexander Duyck; Skidmore, Donald C; Rose, Gregory V; Kirsher, Jeffrey
 T; intel-wired-...@lists.osuosl.org
 Cc: nhor...@redhat.com; jogre...@redhat.com; Linux Netdev List; Choi,
 Sy Jong; Rony Efraim; Or Gerlitz; Edward Cree; David Miller;
 sassm...@redhat.com
 Subject: [PATCH v7 3/3] ixgbe, ixgbevf: Add new mbox API xcast mode
 
 From: Hiroshi Shimamoto h-shimam...@ct.jp.nec.com
 
 The limitation of the number of multicast address for VF is not enough for
 the large scale server with SR-IOV feature. IPv6 requires the multicast MAC
 address for each IP address to handle the Neighbor Solicitation message. We
 couldn't assign over 30 IPv6 addresses to a single VF.
 
 This patch introduces the new mailbox API,
 IXGBE_VF_UPDATE_XCAST_MODE, to update multicast mode of VF. This
 adds 3 modes;
   - NONE only L2 exact match addresses or Flow Director enabled
   - MULTIBAM and ROMPE set
   - ALLMULTI BAM, ROMPE and MPE set
 
 If a guest VF user wants over 30 MAC multicast addresses, set IFF_ALLMULTI
 to request PF to update xcast mode to enable VF multicast promiscuous
 mode.
 
 On the other hand, enabling VF multicast promiscuous mode may affect
 security and performance in the network of the NIC. Only trusted VF can
 enable multicast promiscuous mode. The behavior of untrusted VF is the
 same as previous version.
 
 Signed-off-by: Hiroshi Shimamoto h-shimam...@ct.jp.nec.com
 ---
  drivers/net/ethernet/intel/ixgbe/ixgbe.h  |  7 +++
  drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h  |  2 +
  drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c| 59
 +++
  drivers/net/ethernet/intel/ixgbevf/ixgbevf.h  |  6 +++
  drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c |  8 +++
  drivers/net/ethernet/intel/ixgbevf/mbx.h  |  2 +
  drivers/net/ethernet/intel/ixgbevf/vf.c   | 41 
  drivers/net/ethernet/intel/ixgbevf/vf.h   |  1 +
  8 files changed, 126 insertions(+)
 
 diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
 b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
 index fb72622..17250ef 100644
 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
 +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
 @@ -153,9 +153,16 @@ struct vf_data_storage {
   u8 spoofchk_enabled;
   bool rss_query_enabled;
   u8 trusted;
 + int xcast_mode;
   unsigned int vf_api;
  };
 
 +enum ixgbevf_xcast_modes {
 + IXGBEVF_XCAST_MODE_NONE = 0,
 + IXGBEVF_XCAST_MODE_MULTI,
 + IXGBEVF_XCAST_MODE_ALLMULTI,
 +};
 +
  struct vf_macvlans {
   struct list_head l;
   int vf;
 diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
 b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
 index b1e4703..8daa95f 100644
 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
 +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
 @@ -102,6 +102,8 @@ enum ixgbe_pfvf_api_rev {
  #define IXGBE_VF_GET_RETA0x0a/* VF request for RETA */
  #define IXGBE_VF_GET_RSS_KEY 0x0b/* get RSS key */
 
 +#define IXGBE_VF_UPDATE_XCAST_MODE   0x0c
 +
  /* length of permanent address message returned from PF */  #define
 IXGBE_VF_PERMADDR_MSG_LEN 4
  /* word in permanent address message with the current multicast type */
 diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
 b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
 index 65aeb58..ac071e5 100644
 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
 +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
 @@ -119,6 +119,9 @@ static int __ixgbe_enable_sriov(struct ixgbe_adapter
 *adapter)
 
   /* Untrust all VFs */
   adapter-vfinfo[i].trusted = false;
 +
 + /* set the default xcast mode */
 + adapter-vfinfo[i].xcast_mode =
 IXGBEVF_XCAST_MODE_NONE;
   }
 
   return 0;
 @@ -1004,6 +1007,59 @@ static int ixgbe_get_vf_rss_key(struct
 ixgbe_adapter *adapter,
   return 0;
  }
 
 +static int ixgbe_update_vf_xcast_mode(struct ixgbe_adapter *adapter,
 +   u32 *msgbuf, u32 vf)
 +{
 + struct ixgbe_hw *hw = adapter-hw;
 + int xcast_mode = msgbuf[1];
 + u32 vmolr, disable, enable;
 +
 + /* verify the PF is supporting the correct APIs */
 + switch (adapter-vfinfo[vf].vf_api) {
 + case ixgbe_mbox_api_12:
 + break;
 + default:
 + return -1;

Shouldn't you return -EOPNOTSUPP.

 + }
 +
 + if (xcast_mode  IXGBEVF_XCAST_MODE_MULTI 
 + !adapter-vfinfo[vf].trusted) {
 + xcast_mode = IXGBEVF_XCAST_MODE_MULTI;
 + }
 +
 + if (adapter-vfinfo[vf].xcast_mode == xcast_mode)
 + goto out;
 +
 + switch (xcast_mode) {
 + case IXGBEVF_XCAST_MODE_NONE:
 + disable = IXGBE_VMOLR_BAM | IXGBE_VMOLR_ROMPE |
 IXGBE_VMOLR_MPE;
 + enable = 0

[PATCH v7 3/3] ixgbe, ixgbevf: Add new mbox API xcast mode

2015-07-16 Thread Hiroshi Shimamoto
From: Hiroshi Shimamoto h-shimam...@ct.jp.nec.com

The limitation of the number of multicast address for VF is not enough
for the large scale server with SR-IOV feature. IPv6 requires the multicast
MAC address for each IP address to handle the Neighbor Solicitation
message. We couldn't assign over 30 IPv6 addresses to a single VF.

This patch introduces the new mailbox API, IXGBE_VF_UPDATE_XCAST_MODE,
to update multicast mode of VF. This adds 3 modes;
  - NONE only L2 exact match addresses or Flow Director enabled
  - MULTIBAM and ROMPE set
  - ALLMULTI BAM, ROMPE and MPE set

If a guest VF user wants over 30 MAC multicast addresses, set IFF_ALLMULTI
to request PF to update xcast mode to enable VF multicast promiscuous mode.

On the other hand, enabling VF multicast promiscuous mode may affect
security and performance in the network of the NIC. Only trusted VF can
enable multicast promiscuous mode. The behavior of untrusted VF is the
same as previous version.

Signed-off-by: Hiroshi Shimamoto h-shimam...@ct.jp.nec.com
---
 drivers/net/ethernet/intel/ixgbe/ixgbe.h  |  7 +++
 drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h  |  2 +
 drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c| 59 +++
 drivers/net/ethernet/intel/ixgbevf/ixgbevf.h  |  6 +++
 drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c |  8 +++
 drivers/net/ethernet/intel/ixgbevf/mbx.h  |  2 +
 drivers/net/ethernet/intel/ixgbevf/vf.c   | 41 
 drivers/net/ethernet/intel/ixgbevf/vf.h   |  1 +
 8 files changed, 126 insertions(+)

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h 
b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
index fb72622..17250ef 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
@@ -153,9 +153,16 @@ struct vf_data_storage {
u8 spoofchk_enabled;
bool rss_query_enabled;
u8 trusted;
+   int xcast_mode;
unsigned int vf_api;
 };
 
+enum ixgbevf_xcast_modes {
+   IXGBEVF_XCAST_MODE_NONE = 0,
+   IXGBEVF_XCAST_MODE_MULTI,
+   IXGBEVF_XCAST_MODE_ALLMULTI,
+};
+
 struct vf_macvlans {
struct list_head l;
int vf;
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
index b1e4703..8daa95f 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
@@ -102,6 +102,8 @@ enum ixgbe_pfvf_api_rev {
 #define IXGBE_VF_GET_RETA  0x0a/* VF request for RETA */
 #define IXGBE_VF_GET_RSS_KEY   0x0b/* get RSS key */
 
+#define IXGBE_VF_UPDATE_XCAST_MODE 0x0c
+
 /* length of permanent address message returned from PF */
 #define IXGBE_VF_PERMADDR_MSG_LEN 4
 /* word in permanent address message with the current multicast type */
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
index 65aeb58..ac071e5 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
@@ -119,6 +119,9 @@ static int __ixgbe_enable_sriov(struct ixgbe_adapter 
*adapter)
 
/* Untrust all VFs */
adapter-vfinfo[i].trusted = false;
+
+   /* set the default xcast mode */
+   adapter-vfinfo[i].xcast_mode = IXGBEVF_XCAST_MODE_NONE;
}
 
return 0;
@@ -1004,6 +1007,59 @@ static int ixgbe_get_vf_rss_key(struct ixgbe_adapter 
*adapter,
return 0;
 }
 
+static int ixgbe_update_vf_xcast_mode(struct ixgbe_adapter *adapter,
+ u32 *msgbuf, u32 vf)
+{
+   struct ixgbe_hw *hw = adapter-hw;
+   int xcast_mode = msgbuf[1];
+   u32 vmolr, disable, enable;
+
+   /* verify the PF is supporting the correct APIs */
+   switch (adapter-vfinfo[vf].vf_api) {
+   case ixgbe_mbox_api_12:
+   break;
+   default:
+   return -1;
+   }
+
+   if (xcast_mode  IXGBEVF_XCAST_MODE_MULTI 
+   !adapter-vfinfo[vf].trusted) {
+   xcast_mode = IXGBEVF_XCAST_MODE_MULTI;
+   }
+
+   if (adapter-vfinfo[vf].xcast_mode == xcast_mode)
+   goto out;
+
+   switch (xcast_mode) {
+   case IXGBEVF_XCAST_MODE_NONE:
+   disable = IXGBE_VMOLR_BAM | IXGBE_VMOLR_ROMPE | IXGBE_VMOLR_MPE;
+   enable = 0;
+   break;
+   case IXGBEVF_XCAST_MODE_MULTI:
+   disable = IXGBE_VMOLR_MPE;
+   enable = IXGBE_VMOLR_BAM | IXGBE_VMOLR_ROMPE;
+   break;
+   case IXGBEVF_XCAST_MODE_ALLMULTI:
+   disable = 0;
+   enable = IXGBE_VMOLR_BAM | IXGBE_VMOLR_ROMPE | IXGBE_VMOLR_MPE;
+   break;
+   default:
+   return -1;
+   }
+
+   vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(vf));
+   vmolr = ~disable;
+   vmolr |= enable;
+