57. Dual VLAN Offload Tests

The support of Dual VLAN offload features by Poll Mode Drivers consists in:

  • Dynamically enable/disable inner VLAN filtering on an interface on x7xx series, 82576/82599,
  • Dynamically enable/disable extended VLAN mode on 82576/82599,
  • Dynamically configure outer VLAN TPID value, i.e. S-TPID value, on 82576/82599.

57.1. Prerequisites

In this feature, x7xx series, Intel® Ethernet 800 Series, 82576 and 82599 are supported.

If using vfio the kernel must be >= 3.6+ and VT-d must be enabled in bios.When using vfio, use the following commands to load the vfio driver and bind it to the device under test:

modprobe vfio
modprobe vfio-pci
usertools/dpdk-devbind.py --bind=vfio-pci device_bus_id

Assuming that ports 0 and 1 are connected to the traffic generator’s port A and B, launch the testpmd with the following arguments:

./<build>/app/dpdk-testpmd -c ffffff -n 3 -- -i --burst=1 --txpt=32 \
    --txht=8 --txwt=0 --txfreet=0 --rxfreet=64 --mbcache=250 --portmask=0x3

The -n command is used to select the number of memory channels. It should match the number of memory channels on that setup.

57.2. Test Case: Enable/Disable VLAN packets filtering

Due to the kernel enables Qinq and cannot be closed, the DPDK only add extend on to make the VLAN filter work normally. Therefore, if the i40e firmware version >= 8.4 the DPDK can only add extend on to make the VLAN filter work normally:

testpmd> vlan set extend on 0

Setup the mac forwarding mode:

testpmd> set fwd mac
Set mac packet forwarding mode

Enable vlan filtering on port 0:

testpmd> vlan set filter on 0

Disable extend on port 0:

testpmd> vlan set extend off 0

Check whether the mode is set successful:

testpmd> show port info 0

********************* Infos for port 0  *********************
MAC address: 90:E2:BA:1B:DF:60
Link status: up
Link speed: 10000 Mbps
Link duplex: full-duplex
Promiscuous mode: enabled
Allmulticast mode: disabled
Maximum number of MAC addresses: 127
VLAN offload:
    strip off, filter on, extend on, qinq strip off

start forwarding packets:

testpmd> start
mac packet forwarding - CRC stripping disabled - packets/burst=32
nb forwarding cores=1 - nb forwarding ports=10
RX queues=1 - RX desc=128 - RX free threshold=64
RX threshold registers: pthresh=8 hthresh=8 wthresh=4
TX queues=1 - TX desc=512 - TX free threshold=0
TX threshold registers: pthresh=32 hthresh=8 wthresh=8
Configure the traffic generator to send VLAN packets with the Tag Identifier
1 and send 1 packet on port A.Verify that the VLAN packet cannot been received in port B.

Disable vlan filtering on port 0:

testpmd> vlan set filter off 0

Check whether the mode is set successful:

testpmd> show port info 0

********************* Infos for port 0  *********************
MAC address: 90:E2:BA:1B:DF:60
Link status: up
Link speed: 10000 Mbps
Link duplex: full-duplex
Promiscuous mode: enabled
Allmulticast mode: disabled
Maximum number of MAC addresses: 127
VLAN offload:
  strip off
  filter off
  qinq(extend) off
Configure the traffic generator to send VLAN packets with the Tag Identifier
1 and send 1 packet on port A.Verify that the VLAN packet can been received in port B with VLAN Tag Identifier 1.

57.3. Test Case: Add/Remove VLAN Tag Identifier pass VLAN filtering

Disable VLAN packet extend and strip port 0:

testpmd> vlan set extend off 0
testpmd> vlan set strip off 0

Due to the kernel enables Qinq and cannot be closed, the DPDK only add extend on to make the VLAN filter work normally. Therefore, if the i40e firmware version >= 8.4 the DPDK can only add extend on to make the VLAN filter work normally:

testpmd> vlan set extend on 0

Enable VLAN filtering on port 0:

testpmd> vlan set filter on 0

Add a VLAN Tag Identifier 1 on port 0:

testpmd> rx_vlan add 1 0
Configure the traffic generator to send VLAN packets with the Tag Identifier
1 and send 1 packet on port A.Verify that the VLAN packet can been received in port B.

Remove the VLAN Tag Identifier 1 on port 0:

testpmd> rx_vlan rm 1 0
Configure the traffic generator to send VLAN packets with the Tag Identifier
1 and send 1 packet on port A.Verify that the VLAN packet cannot been received in port B.

57.4. Test Case: Enable/Disable VLAN header stripping

Enable vlan packet forwarding on port 0 first:

testpmd> vlan set filter off 0

Enable vlan header stripping on port 0:

testpmd> vlan set strip on 0

Check whether the mode is set successful:

testpmd> show port info 0

********************* Infos for port 0  *********************
MAC address: 90:E2:BA:1B:DF:60
Link status: up
Link speed: 10000 Mbps
Link duplex: full-duplex
Promiscuous mode: enabled
Allmulticast mode: disabled
Maximum number of MAC addresses: 127
VLAN offload:
  strip on
  filter off
  qinq(extend) off

Configure the traffic generator to send VLAN packets with the Tag Identifier 1 and send 1 packet on port A. Verify that the packet without VLAN Tag Identifier can been received in port B.

Disable vlan header stripping on port 0:

testpmd> vlan set strip off 0

Check whether the mode is set successfully:

testpmd> show port info 0

********************* Infos for port 0  *********************
MAC address: 90:E2:BA:1B:DF:60
Link status: up
Link speed: 10000 Mbps
Link duplex: full-duplex
Promiscuous mode: enabled
Allmulticast mode: disabled
Maximum number of MAC addresses: 127
VLAN offload:
  strip off
  filter off
  qinq(extend) off

Configure the traffic generator to send VLAN packets with the Tag Identifier 1 and send 1 packet on port A. Verify that the packet with VLAN Tag Identifier 1 can been received in port B.

57.5. Test Case: Enable/Disable VLAN header stripping in queue

Enable vlan packet forwarding on port 0 first:

testpmd> vlan set filter off 0

Disable vlan header stripping on port 0:

testpmd> vlan set strip off 0

Disable vlan header stripping in queue 0 on port 0:

testpmd> vlan set stripq off 0,0

Configure the traffic generator to send VLAN packets with the Tag Identifier 1 and send 1 packet on port A. Verify that the packet with VLAN Tag Identifier 1 can been received in port B.

Enable vlan header stripping in queue 0 on port 0:

testpmd> vlan set stripq on 0,0

Configure the traffic generator to send VLAN packets with the Tag Identifier 1 and send 1 packet on port A. Verify that the packet without VLAN Tag Identifier 1 can been received in port B.

Enable vlan header stripping on port 0.

MISSING COMMAND

Configure the traffic generator to send VLAN packets with the Tag Identifier 1 and send 1 packet on port A. Verify that the packet without VLAN Tag Identifier 1 can been received in port B.

57.6. Test Case: Enable/Disable VLAN header inserting

Enable vlan packet forwarding on port 0 first:

testpmd> vlan set filter off 0

Insert VLAN Tag Identifier 1 on port 1:

testpmd> port stop all
testpmd> tx_vlan set 1 1
testpmd> port start all

Configure the traffic generator to send VLAN packet without VLAN Tag Identifier and send 1 packet on port A. Verify that the packet can been received on port B with VLAN Tag Identifier 1.

Delete the VLAN Tag Identifier 1 on port 1:

testpmd> port stop all
testpmd> tx_vlan reset 1
testpmd> port start all

Configure the traffic generator to send VLAN packet without VLAN Tag Identifier and send 1 packet on port A. Verify that the packet can been received on port B without VLAN Tag Identifier.

57.7. Test Case: Configure receive port inner VLAN TPID

Enable vlan header QinQ on port 0 firstly to support set TPID:

testpmd> vlan set extend on 0

Check whether the mode is set successfully:

testpmd> show port info 0

********************* Infos for port 0  *********************
MAC address: 90:E2:BA:1B:DF:60
Link status: up
Link speed: 10000 Mbps
Link duplex: full-duplex
Promiscuous mode: enabled
Allmulticast mode: disabled
Maximum number of MAC addresses: 127
VLAN offload:
  strip off, filter off, extend on, qinq strip off

Set Tag Protocol ID 0x1234 on port 0. Nic only support inner model, except Intel® Ethernet 700 Series:

testpmd> vlan set inner tpid 0x1234 0

Enable vlan packet filtering and strip on port 0

testpmd> vlan set filter on 0
testpmd> vlan set strip on 0

Configure the traffic generator to send VLAN packet whose outer vlan tag is 0x1, inter vlan tag is 0x2 and outer Tag Protocol ID is 0x8100 and send 1 packet on port A. Verify that one packet whose vlan header has not been strip has been received on port B.

Set Tag Protocol ID 0x8100 on port 0:

testpmd> vlan set inner tpid 0x8100 0

Configure the traffic generator to send VLAN packet whose outer vlan tag is 0x1, inter vlan tag is 0x2 and outer Tag Protocol ID is 0x8100 and send 1 packet on port A. Verify that no packets has been received on port B

57.8. Test Case: Strip/Filter/Extend/Insert enable/disable synthetic test

Do the synthetic test following the below table and check the result is the same as the table(the inserted VLAN Tag Identifier is limited to 0x3, and all modes except insert are set on rx port).

Configure setting Result
Outer vlan Inner vlan Vlan strip Vlan filter Vlan extend Vlan insert Pass/ Drop Outer vlan Inner vlan
0x1 0x2 no no no no pass 0x1 0x2
0x1 0x2 yes no no no pass no 0x2
0x1 0x2 no yes,0x1 no no pass 0x1 0x2
0x1 0x2 no yes,0x2 no no drop no no
0x1 0x2 yes yes,0x1 no no pass no 0x2
0x1 0x2 yes yes,0x2 no no drop no no
0x1 0x2 no no yes no pass 0x1 0x2
0x1 0x2 yes no yes no pass no 0x1
0x1 0x2 no yes,0x1 yes no drop no no
0x1 0x2 no yes,0x2 yes no pass 0x1 0x2
0x1 0x2 yes yes,0x1 yes no drop no no
0x1 0x2 yes yes,0x2 yes no pass no 0x1
0x1 0x2 no no no yes pass 0x3 0x1 0x2
0x1 0x2 yes no no yes pass 0x3 0x2
0x1 0x2 no yes,0x1 no yes pass 0x3 0x1 0x2
0x1 0x2 no yes,0x2 no yes drop no no
0x1 0x2 yes yes,0x1 no yes pass 0x3 0x2
0x1 0x2 yes yes,0x2 no yes drop no no
0x1 0x2 no no yes yes pass 0x3 0x1 0x2
0x1 0x2 yes no yes yes pass 0x3 0x1
0x1 0x2 no yes,0x1 yes yes drop no no
0x1 0x2 no yes,0x2 yes yes pass 0x3 0x1 0x2
0x1 0x2 yes yes,0x1 yes yes drop no no
0x1 0x2 yes yes,0x2 yes yes pass 0x3 0x1

Due to the kernel enables Qinq and cannot be closed, the DPDK only add extend on to make the VLAN filter work normally. Therefore, if the i40e firmware >= 8.4 the synthetic test according to the following table. In addition, filter inner vlan when firmware <= 8.3, filter outer vlan when firmware >= 8.4.

Configure setting Result
Outer vlan Inner vlan Vlan strip Vlan filter Vlan extend Vlan insert Pass/ Drop Outer vlan Inner vlan
0x1 0x2 no no no no pass 0x1 0x2
0x1 0x2 yes no no no pass no 0x2
0x1 0x2 no yes,0x1 no no pass 0x1 0x2
0x1 0x2 no yes,0x2 no no pass 0x1 0x2
0x1 0x2 yes yes,0x1 no no pass no 0x2
0x1 0x2 yes yes,0x2 no no pass no 0x2
0x1 0x2 no no yes no pass 0x1 0x2
0x1 0x2 yes no yes no pass no 0x1
0x1 0x2 no yes,0x1 yes no pass 0x1 0x2
0x1 0x2 no yes,0x2 yes no drop no no
0x1 0x2 yes yes,0x1 yes no pass no 0x1
0x1 0x2 yes yes,0x2 yes no drop no no
0x1 0x2 no no no yes pass 0x3 0x1 0x2
0x1 0x2 yes no no yes pass 0x3 0x2
0x1 0x2 no yes,0x1 no yes pass 0x3 0x1 0x2
0x1 0x2 no yes,0x2 no yes pass 0x3 0x1 0x2
0x1 0x2 yes yes,0x1 no yes pass 0x3 0x2
0x1 0x2 yes yes,0x2 no yes drop no no
0x1 0x2 no no yes yes pass 0x3 0x1 0x2
0x1 0x2 yes no yes yes pass 0x3 0x1
0x1 0x2 no yes,0x1 yes yes pass 0x3 0x1 0x2
0x1 0x2 no yes,0x2 yes yes pass 0x3 0x1 0x2
0x1 0x2 yes yes,0x1 yes yes pass 0x3 0x1
0x1 0x2 yes yes,0x2 yes yes drop no no

57.9. Test Case: Strip/Filter/Extend/Insert enable/disable random test

Choose the above table’s item randomly 30 times and verify that the result is right.

At last, stop packet forwarding and quit the application::
testpmd> stop testpmd> quit

57.10. Test Case: dual vlan priority rx/tx test

  1. blind port to vfio-pci:

    ./usertools/dpdk-devbind.py -b vfio-pci {pf0_pci} {pf1_pci}
    
  2. launch testpmd with NICs:

    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0xf -a {pf0_pci} -a {pf1_pci} -n 4 -- -i
    
  3. set testpmd:

    testpmd> set verbose 1
    testpmd> set fwd mac
    testpmd> start
    
  4. start tcpdump with tester rx port:

    tcpdump -ei {rx_iface}
    
  5. send dual vlan packet with tester tx port:

    sendp(Ether(dst="FE:EF:65:4C:2C:D0",type=0x8100)/Dot1Q(vlan=1,type=0x8100,prio=1)/Dot1Q(vlan=2,type=0x0800,prio=2)/IP(src="196.222.232.221")/("X"*480),iface="{tx_iface}",count=1,inter=0,verbose=False)
    
  6. check the pkts can be received:

    testpmd> port 0/queue 0: received 1 packets
    src=00:00:00:00:00:00 - dst=FE:EF:65:4C:2C:D0 - type=0x8100 - length=522 - nb_segs=1 - hw ptype: L2_ETHER  - sw ptype: L2_ETHER_VLAN INNER_L2_ETHER_VLAN  - l2_len=18 - inner_l2_len=4 - Receive queue=0x0
    ol_flags: PKT_RX_L4_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD PKT_RX_OUTER_L4_CKSUM_UNKNOWN
    
  7. check the tcpdump packet:

    check the pkts can be received by PF and fwd to tester with inner and outer correct vlan ID and priority value.
    16:50:38.807217 FE:EF:65:4C:2C:D0 > 02:00:00:00:00:00, ethertype 802.1Q (0x8100), length 522: vlan 1, p 1, ethertype 802.1Q, vlan 2, p 2, ethertype 0x0800,