[dpdk-dev] [PATCH] i40e: fix vlan filter in promiscuous mode

Peng, Yuan yuan.peng at intel.com
Mon May 30 04:41:45 CEST 2016


Tested-by: Peng Yuan <yuan.peng at intel.com>



- Test Commit: a3f9ec846f9e7347d3a98da52256607345b4861d

- OS/Kernel: Fedora 23/4.2.3

- GCC: gcc version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)

- CPU: Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz

- Total 7 cases, 7 passed, 0 failed.



pf

vf(pf_kerneldriver)


mac_filter

vlan_filter

mac+vlan_filter

mac_filter

vlan_filter

mac+vlan_filter

promisc off

PASS(dts case)

PASS

PASS

PASS(dts case)

PASS(dts case)

PASS

promisc on

N/A

PASS(dts case)

N/A

N/A

N/A

N/A






All the test cases I verified covers 7 scenarios as below table.



The issue happened in vlan_filter/promisc on, so I just describe the test steps in this scenario.



Test_vlan_enable_receipt



1.       Fortpark i40e driver,  . /dpdk_nic_bind.py --bind=igb_uio 0000:8a:00.1 0000:8a:00.3

2.       ./x86_64-native-linuxapp-gcc/app/testpmd -c 0x6 -n 4  -- -i --portmask=0x1 --port-topology=loop --txqflags=0

3.       Testpmd> set verbose 1

Testpmd> set fwd mac

Testpmd> vlan set filter on 0

Testpmd> vlan set strip off 0

Testpmd> rx_vlan add 51 0

Testpmd>start

4.       Tester:

sendp([Ether(dst="00:00:00:00:03:15")/Dot1Q(vlan=51)/IP()/UDP()],iface="enp138s0f0", count=1)

5.       DUT can receive the packet, and check the vlan ID is correct.

6.       Send packet with vlan0 and the packet can be received,
send packet without vlan and the packet can be received.

Send packet with wrong vlan(52/4095) and packet can't be receive.



Test_ vlan_disable_receipt



1.       Testpmd>rx_vlan rm 51 0

Testpmd>start

2.       Tester:

sendp([Ether(dst="00:00:00:00:03:15")/Dot1Q(vlan=51)/IP()/UDP()],iface="enp138s0f0", count=1)

3.       DUT can not receive the packet.



The vlan filter works normally.



Thanks

Yuan.





-----Original Message-----
From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Jingjing Wu
Sent: Friday, May 27, 2016 4:06 PM
To: Zhang, Helin <helin.zhang at intel.com>
Cc: dev at dpdk.org; Wu, Jingjing <jingjing.wu at intel.com>; Pei, Yulong <yulong.pei at intel.com>
Subject: [dpdk-dev] [PATCH] i40e: fix vlan filter in promiscuous mode



Vlan filter didn't work if promiscuous mode is enabled. That is because i40e driver uses MAC VLAN table for the l2 filtering and internal switch. And the vlan table is disabled by default, till the first time to add rule in vlan table.

This patch fixed this issue to enable vlan filter by using vlan table.



Fixes: 4861cde46116 (i40e: new poll mode driver)

Signed-off-by: Jingjing Wu <jingjing.wu at intel.com<mailto:jingjing.wu at intel.com>>

---

drivers/net/i40e/i40e_ethdev.c | 23 +++++++++++++++++++----

1 file changed, 19 insertions(+), 4 deletions(-)



diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 24777d5..0d91e29 100644

--- a/drivers/net/i40e/i40e_ethdev.c

+++ b/drivers/net/i40e/i40e_ethdev.c

@@ -2443,12 +2443,16 @@ i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask)  {

       struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);

       struct i40e_vsi *vsi = pf->main_vsi;

+       struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);

        if (mask & ETH_VLAN_FILTER_MASK) {

-                 if (dev->data->dev_conf.rxmode.hw_vlan_filter)

+                if (dev->data->dev_conf.rxmode.hw_vlan_filter) {

+                          i40e_aq_set_vsi_vlan_promisc(hw, vsi->seid, false, NULL);

                          i40e_vsi_config_vlan_filter(vsi, TRUE);

-                 else

+                } else {

+                          i40e_aq_set_vsi_vlan_promisc(hw, vsi->seid, true, NULL);

                          i40e_vsi_config_vlan_filter(vsi, FALSE);

+                }

       }

        if (mask & ETH_VLAN_STRIP_MASK) {

@@ -5419,17 +5423,28 @@ i40e_set_vlan_filter(struct i40e_vsi *vsi,

                           uint16_t vlan_id, bool on)

{

       uint32_t vid_idx, vid_bit;

+       struct i40e_hw *hw = I40E_VSI_TO_HW(vsi);

+       struct i40e_aqc_add_remove_vlan_element_data vlan_data = {0};

+       int ret;

        if (vlan_id > ETH_VLAN_ID_MAX)

                return;

        vid_idx = I40E_VFTA_IDX(vlan_id);

       vid_bit = I40E_VFTA_BIT(vlan_id);

+       vlan_data.vlan_tag = rte_cpu_to_le_16(vlan_id);

-        if (on)

+       if (on) {

+                ret = i40e_aq_add_vlan(hw, vsi->seid, &vlan_data, 1, NULL);

+                if (ret != I40E_SUCCESS)

+                          PMD_DRV_LOG(ERR, "Failed to add vlan filter");

                vsi->vfta[vid_idx] |= vid_bit;

-        else

+       } else {

+                ret = i40e_aq_remove_vlan(hw, vsi->seid, &vlan_data, 1, NULL);

+                if (ret != I40E_SUCCESS)

+                          PMD_DRV_LOG(ERR, "Failed to remove vlan filter");

                vsi->vfta[vid_idx] &= ~vid_bit;

+       }

}

 /**

--

2.4.0




More information about the dev mailing list