[dpdk-dev] net/i40e: fix VF Tx error issue
Checks
Commit Message
When using kernel PF + DPDK VF, if setting VLAN strip on
or off in VF side after setting VLAN for VF with ethtool in
PF side, it will case VF Tx error. The root case is that
setting VLAN for VF in kernel PF side is to set PVID, then
Rx VLAN offload is not permitted.
This patch fixes the issue by check VLAN offload capability
when setting VLAN offload.
Fixes: 5f0b95d5 ("net/i40e: support VLAN stripping for VF")
Cc: stable@dpdk.org
Signed-off-by: Beilei Xing <beilei.xing@intel.com>
---
drivers/net/i40e/i40e_ethdev_vf.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
Comments
> -----Original Message-----
> From: Xing, Beilei
> Sent: Tuesday, December 5, 2017 10:41 AM
> To: Wu, Jingjing <jingjing.wu@intel.com>; Zhang, Qi Z <qi.z.zhang@intel.com>
> Cc: dev@dpdk.org; stable@dpdk.org
> Subject: [PATCH] net/i40e: fix VF Tx error issue
>
> When using kernel PF + DPDK VF, if setting VLAN strip on or off in VF side after
> setting VLAN for VF with ethtool in PF side, it will case VF Tx error. The root
> case is that setting VLAN for VF in kernel PF side is to set PVID, then Rx VLAN
> offload is not permitted.
> This patch fixes the issue by check VLAN offload capability when setting VLAN
> offload.
>
> Fixes: 5f0b95d5 ("net/i40e: support VLAN stripping for VF")
> Cc: stable@dpdk.org
>
> Signed-off-by: Beilei Xing <beilei.xing@intel.com>
Acked-by: Jingjing Wu <jingjing.wu@intel.com>
@@ -1585,13 +1585,19 @@ static int
i40evf_init_vlan(struct rte_eth_dev *dev)
{
/* Apply vlan offload setting */
- return i40evf_vlan_offload_set(dev, ETH_VLAN_STRIP_MASK);
+ i40evf_vlan_offload_set(dev, ETH_VLAN_STRIP_MASK);
+
+ return 0;
}
static int
i40evf_vlan_offload_set(struct rte_eth_dev *dev, int mask)
{
struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
+ struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
+
+ if (!(vf->vf_res->vf_offload_flags & VIRTCHNL_VF_OFFLOAD_VLAN))
+ return -ENOTSUP;
/* Vlan stripping setting */
if (mask & ETH_VLAN_STRIP_MASK) {