[dpdk-dev] [PATCH v2] ixgbe: support multicast promiscuous mode on VF

Lu, Wenzhuo wenzhuo.lu at intel.com
Mon Feb 15 09:43:34 CET 2016


Hi Xiao,

> -----Original Message-----
> From: Wang, Xiao W
> Sent: Monday, February 15, 2016 4:10 PM
> To: Lu, Wenzhuo; dev at dpdk.org
> Subject: RE: [dpdk-dev] [PATCH v2] ixgbe: support multicast promiscuous mode
> on VF
> 
> Hi,
> 
> Best Regards,
> Wang, Xiao
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Wenzhuo Lu
> > Sent: Sunday, February 14, 2016 2:25 PM
> > To: dev at dpdk.org
> > Subject: [dpdk-dev] [PATCH v2] ixgbe: support multicast promiscuous
> > mode on VF
> >
> > Add multicast promiscuous mode support on ixgbe VF driver.
> >
> > Please note if we want to use this promiscuous mode, we need both PF
> > and VF driver to support it. The reason is this VF feature is configged on PF.
> > If use kernel PF driver + dpdk VF driver, make sure kernel PF driver
> > support VF multicast promiscuous mode. If use dpdk PF + dpdk VF,
> > better make sure PF driver is the same version as VF.
> >
> > V2:
> >  Update release note.
> 
> Maybe it's better to put change log below the "---"
> 
> >
> > Signed-off-by: Wenzhuo Lu <wenzhuo.lu at intel.com>
> > Acked-by: Shaopeng He <shaopeng.he at intel.com>
> > ---
> >  doc/guides/rel_notes/release_16_04.rst | 11 ++++++
> >  drivers/net/ixgbe/base/ixgbe_mbx.h     |  4 +++
> >  drivers/net/ixgbe/ixgbe_ethdev.c       | 66
> > ++++++++++++++++++++++++++++++++++
> >  drivers/net/ixgbe/ixgbe_pf.c           | 65
> > +++++++++++++++++++++++++++++++++
> >  4 files changed, 146 insertions(+)
> >
> > diff --git a/doc/guides/rel_notes/release_16_04.rst
> > b/doc/guides/rel_notes/release_16_04.rst
> > index 27fc624..e71d316 100644
> > --- a/doc/guides/rel_notes/release_16_04.rst
> > +++ b/doc/guides/rel_notes/release_16_04.rst
> > @@ -39,6 +39,17 @@ This section should contain new features added in
> > this release. Sample format:
> >
> >    Enabled virtio 1.0 support for virtio pmd driver.
> >
> > +* **Added multicast promiscuous mode support on VF for ixgbe.**
> > +
> > +  Added multicast promiscuous mode support on ixgbe VF driver. So all
> > + the VFs  can receive the multicast packets.
> > +
> > +  Please note if we want to use this promiscuous mode, we need both
> > + PF and VF  driver to support it. The reason is this VF feature is configged on
> PF.
> > +  If use kernel PF driver + dpdk VF driver, make sure kernel PF
> > + driver support  VF multicast promiscuous mode. If use dpdk PF + dpdk
> > + VF, better make sure PF  driver is the same version as VF.
> > +
> >
> >  Resolved Issues
> >  ---------------
> > diff --git a/drivers/net/ixgbe/base/ixgbe_mbx.h
> > b/drivers/net/ixgbe/base/ixgbe_mbx.h
> > index 445df10..4a120a3 100644
> > --- a/drivers/net/ixgbe/base/ixgbe_mbx.h
> > +++ b/drivers/net/ixgbe/base/ixgbe_mbx.h
> > @@ -89,6 +89,7 @@ enum ixgbe_pfvf_api_rev {
> >  	ixgbe_mbox_api_10,	/* API version 1.0, linux/freebsd VF driver */
> >  	ixgbe_mbox_api_20,	/* API version 2.0, solaris Phase1 VF driver */
> >  	ixgbe_mbox_api_11,	/* API version 1.1, linux/freebsd VF driver */
> > +	ixgbe_mbox_api_12,	/* API version 1.2, linux/freebsd VF driver */
> >  	/* This value should always be last */
> >  	ixgbe_mbox_api_unknown,	/* indicates that API version is not
> > known */
> >  };
> > @@ -107,6 +108,9 @@ enum ixgbe_pfvf_api_rev {
> >  /* mailbox API, version 1.1 VF requests */
> >  #define IXGBE_VF_GET_QUEUES	0x09 /* get queue configuration */
> >
> > +/* mailbox API, version 1.2 VF requests */
> > +#define IXGBE_VF_UPDATE_XCAST_MODE     0x0C
> > +
> >  /* GET_QUEUES return data indices within the mailbox */
> >  #define IXGBE_VF_TX_QUEUES	1	/* number of Tx queues
> supported */
> >  #define IXGBE_VF_RX_QUEUES	2	/* number of Rx queues
> supported */
> > diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c
> > b/drivers/net/ixgbe/ixgbe_ethdev.c
> > index 3e6fe86..82ba755 100644
> > --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> > +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> > @@ -138,6 +138,12 @@
> >
> >  #define IXGBE_CYCLECOUNTER_MASK   0xffffffffffffffffULL
> >
> > +enum ixgbevf_xcast_modes {
> > +	IXGBEVF_XCAST_MODE_NONE = 0,
> > +	IXGBEVF_XCAST_MODE_MULTI,
> > +	IXGBEVF_XCAST_MODE_ALLMULTI,
> > +};
> > +
> >  static int eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev);  static
> > int eth_ixgbe_dev_uninit(struct rte_eth_dev *eth_dev);  static int
> > ixgbe_dev_configure(struct rte_eth_dev *dev); @@ -237,6 +243,8 @@
> > static int ixgbevf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
> > static void ixgbevf_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
> >  				 uint8_t queue, uint8_t msix_vector);  static
> void
> > ixgbevf_configure_msix(struct rte_eth_dev *dev);
> > +static void ixgbevf_dev_allmulticast_enable(struct rte_eth_dev *dev);
> > +static void ixgbevf_dev_allmulticast_disable(struct rte_eth_dev
> > +*dev);
> >
> >  /* For Eth VMDQ APIs support */
> >  static int ixgbe_uc_hash_table_set(struct rte_eth_dev *dev, struct @@
> > -511,6
> > +519,8 @@ static const struct eth_dev_ops ixgbevf_eth_dev_ops = {
> >  	.stats_reset          = ixgbevf_dev_stats_reset,
> >  	.xstats_reset         = ixgbevf_dev_stats_reset,
> >  	.dev_close            = ixgbevf_dev_close,
> > +	.allmulticast_enable  = ixgbevf_dev_allmulticast_enable,
> > +	.allmulticast_disable = ixgbevf_dev_allmulticast_disable,
> >  	.dev_infos_get        = ixgbevf_dev_info_get,
> >  	.mtu_set              = ixgbevf_dev_set_mtu,
> >  	.vlan_filter_set      = ixgbevf_vlan_filter_set,
> > @@ -1224,6 +1234,7 @@ ixgbevf_negotiate_api(struct ixgbe_hw *hw)
> >
> >  	/* start with highest supported, proceed down */
> >  	static const enum ixgbe_pfvf_api_rev sup_ver[] = {
> > +		ixgbe_mbox_api_12,
> >  		ixgbe_mbox_api_11,
> >  		ixgbe_mbox_api_10,
> >  	};
> > @@ -6191,6 +6202,61 @@ ixgbe_dev_get_dcb_info(struct rte_eth_dev *dev,
> >  	return 0;
> >  }
> >
> > +/* ixgbevf_update_xcast_mode - Update Multicast mode
> > + * @hw: pointer to the HW structure
> > + * @netdev: pointer to net device structure
> > + * @xcast_mode: new multicast mode
> > + *
> > + * Updates the Multicast Mode of VF.
> > + */
> > +static int ixgbevf_update_xcast_mode(struct ixgbe_hw *hw,
> > +				     int xcast_mode)
> > +{
> > +	struct ixgbe_mbx_info *mbx = &hw->mbx;
> > +	u32 msgbuf[2];
> > +	s32 err;
> > +
> > +	switch (hw->api_version) {
> > +	case ixgbe_mbox_api_12:
> > +		break;
> > +	default:
> > +		return -EOPNOTSUPP;
> > +	}
> > +
> > +	msgbuf[0] = IXGBE_VF_UPDATE_XCAST_MODE;
> > +	msgbuf[1] = xcast_mode;
> > +
> > +	err = mbx->ops.write_posted(hw, msgbuf, 2, 0);
> > +	if (err)
> > +		return err;
> > +
> > +	err = mbx->ops.read_posted(hw, msgbuf, 2, 0);
> 
> Is it more reasonable to read a message of size 1 than 2? Pf side only write 1
> word into mbx.
Thanks for the comment. But actually PF writes 16 words into the mbx, and 2 words have meaning.
Word0 is used to check ack/nack. PF uses word1 to write the xcast_mode back. I don't check the word1 because I don't see the necessary:)

> 
> > +	if (err)
> > +		return err;



More information about the dev mailing list