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

Wang, Xiao W xiao.w.wang at intel.com
Mon Feb 15 09:09:42 CET 2016


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.

> +	if (err)
> +		return err;



More information about the dev mailing list