diff --git a/test_plans/cvl_qinq_test_plan.rst b/test_plans/cvl_qinq_test_plan.rst
index 4f44150b..7032d8f4 100644
--- a/test_plans/cvl_qinq_test_plan.rst
+++ b/test_plans/cvl_qinq_test_plan.rst
@@ -1533,4 +1533,504 @@ Test case 14: AVF CRC strip and Vlan strip co-exists
      10:29:19.995352 00:00:00:00:00:00 > 00:11:22:33:44:11, ethertype 802.1Q (0x8100), length 522: vlan 1, p 0, ethertype 802.1Q, vlan 2, p 0, ethertype IPv4, (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto Options (0), length 500)
      196.222.232.221 > 127.0.0.1:  ip-proto-0 480
      10:29:19.995424 00:11:22:33:44:11 > 02:00:00:00:00:00, ethertype 802.1Q (0x8100), length 522: vlan 1, p 0, ethertype 802.1Q, vlan 2, p 0, ethertype IPv4, (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto Options (0), length 500)
-     196.222.232.221 > 127.0.0.1:  ip-proto-0 480
\ No newline at end of file
+     196.222.232.221 > 127.0.0.1:  ip-proto-0 480
+
+====================================
+CVL DCF QINQ Switch Filter Test Plan
+====================================
+
+Description
+===========
+The test plan includes six test cases, such as MAC_QINQ_IPV4, MAC_QINQ_IPV6, MAC_QINQ_IPV4_UDP, MAC_QINQ_IPV4_TCP, MAC_QINQ_IPV6_UDP, MAC_QINQ_IPV6_TCP.
+* Enable QINQ switch filter for IPv4/IPv6, IPv4 + TCP/UDP in non-pipeline mode. 
+* Enable QINQ switch filter for IPv6 + TCP/UDP in pipeline mode. 
+CVL support l4 for QinQ switch filter in DCF driver is by dst MAC + outer VLAN id + inner VLAN id + dst IP + dst port, and port can support as eth / vlan / vlan / IP / tcp|udp.
+
+Prerequisites
+=============
+
+Hardware
+--------
+Supportted NICs: columbiaville_25g/columbiaville_100g
+
+Software
+--------
+dpdk: http://dpdk.org/git/dpdk
+scapy: http://www.secdev.org/projects/scapy/
+
+General Set Up
+--------------
+1. Copy specific ice package to /lib/firmware/updates/intel/ice/ddp/ice.pkg,
+   then load driver::
+
+    # cp ice_comms-1.3.31.0.pkg /lib/firmware/updates/intel/ice/ddp/ice.pkg
+    # rmmod ice
+    # insmod ice.ko
+
+2. Compile DPDK::
+
+    # CC=gcc meson --werror -Denable_kmods=True -Dlibdir=lib --default-library=static x86_64-native-linuxapp-gcc
+    # ninja -C x86_64-native-linuxapp-gcc -j 110
+
+3. Get the pci device id and interface of DUT and tester. 
+
+    # ./usertools/dpdk-devbind.py -s
+
+    0000:3b:00.0 'Ethernet Controller E810-C for SFP 1593' if=ens785f0 drv=ice unused=vfio-pci
+    0000:af:00.0 'Ethernet Controller XXV710 for 25GbE SFP28 158b' if=ens260f0 drv=i40e unused=vfio-pci
+
+4. Generate 2 VFs on PF0::
+
+    # echo 2 > /sys/bus/pci/devices/0000:3b:00.0/sriov_numvfs
+
+5. Get VF pci device id of DUT.
+
+    # ./usertools/dpdk-devbind.py -s
+
+     0000:3b:01.0 'Ethernet Adaptive Virtual Function 1889' if=ens785f0v0 drv=iavf unused=vfio-pci
+     0000:3b:01.1 'Ethernet Adaptive Virtual Function 1889' if=ens785f0v1 drv=iavf unused=vfio-pci
+
+6. Set VF0 as trust::
+
+    # ip link set ens785f0 vf 0 trust on
+
+7. Bind the VF ports of DUT to dpdk::
+
+    # ./usertools/dpdk-devbind.py -b vfio-pci 3b:01.0 3b:01.1
+
+Test case
+=========
+
+Common Steps
+------------
+1. Launch the userland ``testpmd`` application on DUT as follows::
+
+     # ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0xf -n 4 -a 3b:01.0,cap=dcf -a 3b:01.1 -- -i
+
+2. Set verbose::
+    
+     testpmd> set verbose 1
+    
+3. Set fwd engine and start::
+
+     testpmd> set fwd rxonly
+     testpmd> start
+
+4. Show port info::
+
+     testpmd> show port info all
+
+   Check the VF0 driver is net_ice_dcf.
+
+#Non-pipeline mode
+
+Test Case 1: MAC_QINQ_IPV4
+---------------------------
+The test case enable QINQ switch filter for IPv4 in non-pipeline mode, and port can support as dst MAC + outer VLAN id + inner VLAN id + IPv4.
+
+Test Steps
+~~~~~~~~~~
+1. Validate a rule::
+   
+     testpmd> flow validate 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan tci is 2 / vlan tci is 1 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end
+
+   Get the message::
+
+     Flow rule validated
+
+2. Create a rule and list rules::
+
+     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan tci is 2 / vlan tci is 1 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end
+     
+   Get the message::
+
+     Flow rule #0 created
+   
+   Check the flow list::
+
+     testpmd> flow list 0
+   
+   ID      Group   Prio    Attr    Rule
+   0       0       0       i--     ETH VLAN VLAN IPV4 => VF
+
+3. Send matched packet in scapy on tester, check the port 1 of DUT received this packet.
+
+Tester::
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x0800)/IP(src="192.168.1.1", dst="192.168.1.2")/("X"*80)],iface="ens260f0",count=1)
+
+DUT::
+
+    testpmd> port 1/queue 0: received 1 packets
+  src=A4:BF:01:4D:6F:32 - dst=00:11:22:33:44:55 - type=0x8100 - length=122 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_NONFRAG  - sw ptype: L2_ETHER_VLAN INNER_L2_ETHER_VLAN INNER_L3_IPV4  - l2_len=18 - inner_l2_len=4 - inner_l3_len=20 - Receive queue=0x0
+  ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+4. Send mismatched packet in scapy on tester, check the port 1 of DUT could not receive this packet.
+
+Tester::
+
+    >>> sendp([Ether(dst="00:11:22:33:44:33",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x0800)/IP(src="192.168.1.1", dst="192.168.1.2")/("X"*80)],iface="ens260f0",count=1)
+    
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8100)/Dot1Q(vlan=0x1,type=0x0800)/IP(src="192.168.1.1", dst="192.168.1.2")/("X"*80)],iface="ens260f0",count=1)
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x2,type=0x0800)/IP(src="192.168.1.1", dst="192.168.1.2")/("X"*80)],iface="ens260f0",count=1)
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x0800)/IP(src="192.168.1.3", dst="192.168.1.2")/("X"*80)],iface="ens260f0",count=1)
+
+5. Destroy a rule and list rules::
+
+     testpmd> flow destroy 0 rule 0
+  
+   Get the message::
+
+     Flow rule #0 destroyed
+
+   Check the flow list::
+
+     testpmd> flow list 0
+
+   Check the rule not exists in the list.
+   Send matched packets in step 3, check the packets are not to port 1.
+
+Test Case 2: MAC_QINQ_IPV6
+---------------------------
+The test case enable QINQ switch filter for IPv6 in non-pipeline mode, and port can support as dst MAC + outer VLAN id + inner VLAN id + IPv6.
+
+Test Steps
+~~~~~~~~~~
+1. Validate a rule::
+   
+     testpmd> flow validate 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan tci is 2 / vlan tci is 1 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 / end actions vf id 1 / end
+
+   Get the message::
+
+     Flow rule validated
+
+2. Create a rule and list rules::
+
+     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan tci is 2 / vlan tci is 1 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 / end actions vf id 1 / end
+
+   Get the message::
+
+     Flow rule #0 created
+   
+   Check the flow list::
+
+     testpmd> flow list 0
+
+   ID      Group   Prio    Attr    Rule
+   0       0       0       i--     ETH VLAN VLAN IPV6 => VF
+
+3. Send matched packet in scapy on tester, check the port 1 of DUT received this packet.
+
+Tester::
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x86DD)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/("X"*80)],iface="ens260f0",count=1)
+
+DUT::
+
+    testpmd> port 1/queue 0: received 1 packets
+  src=00:00:00:00:00:00 - dst=00:11:22:33:44:55 - type=0x8100 - length=142 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV6_EXT_UNKNOWN L4_NONFRAG  - sw ptype: L2_ETHER_VLAN INNER_L2_ETHER_VLAN INNER_L3_IPV6  - l2_len=18 - inner_l2_len=4 - inner_l3_len=40 - Receive queue=0x0
+  ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+4. Send mismatched packet in scapy on tester, check the port 1 of DUT could not receive this packet.
+
+Tester::
+
+    >>> sendp([Ether(dst="00:11:22:33:44:33",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x86DD)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/("X"*80)],iface="ens260f0",count=1)
+   
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8100)/Dot1Q(vlan=0x1,type=0x86DD)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/("X"*80)],iface="ens260f0",count=1)
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x2,type=0x86DD)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/("X"*80)],iface="ens260f0",count=1)
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x86DD)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2023")/("X"*80)],iface="ens260f0",count=1)
+
+5. Destroy a rule and list rules::
+
+     testpmd> flow destroy 0 rule 0
+  
+   Get the message::
+
+     Flow rule #0 destroyed
+
+   Check the flow list::
+
+     testpmd> flow list 0
+
+   Check the rule not exists in the list.
+   Send matched packets in step 3, check the packets are not to port 1.
+
+Test Case 3: MAC_QINQ_IPV4_UDP
+------------------------------
+The test case enable QINQ switch filter for IPv4 + UDP in non-pipeline mode, and port can support as dst MAC + outer VLAN id + inner VLAN id + IPv4 + UDP.
+
+Test steps
+~~~~~~~~~~
+1. Validate a rule::
+   
+     testpmd> flow validate 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan tci is 2 / vlan tci is 1 / ipv4 / udp src is 50 dst is 23 / end actions vf id 1 / end
+
+   Get the message::
+
+     Flow rule validated
+
+2. Create a rule and list rules::
+
+     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan tci is 2 / vlan tci is 1 / ipv4 / udp src is 50 dst is 23 / end actions vf id 1 / end
+
+   Get the message::
+
+     Flow rule #0 created
+   
+   Check the flow list::
+
+     testpmd> flow list 0
+
+   ID      Group   Prio    Attr    Rule
+   0       0       0       i--     ETH VLAN VLAN IPV4 UDP => VF
+
+3. Send matched packet in scapy on tester, check the port 1 of DUT received this packet.
+
+Tester::
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x0800)/IP()/UDP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+
+DUT::
+
+    testpmd> port 1/queue 0: received 1 packets
+  src=00:00:00:00:00:00 - dst=00:11:22:33:44:55 - type=0x8100 - length=130 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_UDP  - sw ptype: L2_ETHER_VLAN INNER_L2_ETHER_VLAN INNER_L3_IPV4 INNER_L4_UDP  - l2_len=18 - inner_l2_len=4 - inner_l3_len=20 - inner_l4_len=8 - Receive queue=0x0
+  ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+4. Send mismatched packet in scapy on tester, check the port 1 of DUT could not receive this packet.
+
+Tester::
+
+    >>> sendp([Ether(dst="00:11:22:33:44:33",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x0800)/IP()/UDP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+    
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8100)/Dot1Q(vlan=0x1,type=0x0800)/IP()/UDP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x2,type=0x0800)/IP()/UDP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x0800)/IP()/UDP(sport=50,dport=22)/("X"*80)],iface="ens260f0",count=1)
+
+5. Destroy a rule and list rules::
+
+     testpmd> flow destroy 0 rule 0
+  
+   Get the message::
+
+     Flow rule #0 destroyed
+
+   Check the flow list::
+
+     testpmd> flow list 0
+
+   Check the rule not exists in the list.
+   Send matched packets in step 3, check the packets are not to port 1.
+
+Test Case 4: MAC_QINQ_IPV4_TCP
+------------------------------
+The test case enable QINQ switch filter for IPv4 + TCP in non-pipeline mode, and port can support as dst MAC + outer VLAN id + inner VLAN id + IPv4 + TCP.
+
+Test Steps
+~~~~~~~~~~
+1. Validate a rule::
+   
+     testpmd> flow validate 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan tci is 2 / vlan tci is 1 / ipv4 / tcp src is 50 dst is 23 / end actions vf id 1 / end
+
+   Get the message::
+
+     Flow rule validated
+
+2. Create a rule and list rules::
+
+     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan tci is 2 / vlan tci is 1 / ipv4 / tcp src is 50 dst is 23 / end actions vf id 1 / end
+
+   Get the message::
+
+     Flow rule #0 created
+   
+   Check the flow list::
+
+     testpmd> flow list 0
+
+   ID      Group   Prio    Attr    Rule
+   0       0       0       i--     ETH VLAN VLAN IPV4 TCP => VF
+
+3. Send matched packet in scapy on tester, check the port 1 of DUT received this packet.
+
+Tester::
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x0800)/IP()/TCP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+
+DUT::
+
+    testpmd> port 1/queue 0: received 1 packets
+  src=00:00:00:00:00:00 - dst=00:11:22:33:44:55 - type=0x8100 - length=142 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV4_EXT_UNKNOWN L4_TCP  - sw ptype: L2_ETHER_VLAN INNER_L2_ETHER_VLAN INNER_L3_IPV4 INNER_L4_TCP  - l2_len=18 - inner_l2_len=4 - inner_l3_len=20 - inner_l4_len=20 - Receive queue=0x0
+  ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+4. Send mismatched packet in scapy on tester, check the port 1 of DUT could not receive this packet.
+
+Tester::
+
+    >>> sendp([Ether(dst="00:11:22:33:44:33",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x0800)/IP()/TCP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8100)/Dot1Q(vlan=0x1,type=0x0800)/IP()/TCP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x2,type=0x0800)/IP()/TCP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x0800)/IP()/TCP(sport=50,dport=22)/("X"*80)],iface="ens260f0",count=1)
+
+5. Destroy a rule and list rules::
+
+     testpmd> flow destroy 0 rule 0
+  
+   Get the message::
+
+     Flow rule #0 destroyed
+
+   Check the flow list::
+
+     testpmd> flow list 0
+
+   Check the rule not exists in the list.
+   Send matched packets in step 3, check the packets are not to port 1.
+
+#Pipeline mode
+
+Test Case 5: MAC_QINQ_IPV6_UDP
+------------------------------
+The test case enable QINQ switch filter for IPv6 + UDP in pipeline mode, and port can support as dst MAC + outer VLAN id + inner VLAN id + IPv6 + UDP.
+
+Test Steps
+~~~~~~~~~~
+1. Validate a rule::
+   
+     testpmd> flow validate 0 priority 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan tci is 2 / vlan tci is 1 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 / udp src is 50 dst is 23 / end actions vf id 1 / end
+
+   Get the message::
+
+     Flow rule validated
+
+2. Create a rule and list rules::
+
+     testpmd> flow create 0 priority 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan tci is 2 / vlan tci is 1 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 / udp src is 50 dst is 23 / end actions vf id 1 / end
+
+   Get the message::
+
+     Flow rule #0 created
+   
+   Check the flow list::
+
+     testpmd> flow list 0
+
+   ID      Group   Prio    Attr    Rule
+   0       0       0       i--     ETH VLAN VLAN IPV6 UDP => VF
+
+3. Send matched packet in scapy on tester, check the port 1 of DUT received this packet.
+
+Tester::
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x86DD)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/UDP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+
+DUT::
+
+    testpmd> port 1/queue 0: received 1 packets
+  src=00:00:00:00:00:00 - dst=00:11:22:33:44:55 - type=0x8100 - length=150 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV6_EXT_UNKNOWN L4_UDP  - sw ptype: L2_ETHER_VLAN INNER_L2_ETHER_VLAN INNER_L3_IPV6 INNER_L4_UDP  - l2_len=18 - inner_l2_len=4 - inner_l3_len=40 - inner_l4_len=8 - Receive queue=0x0
+  ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+4. Send mismatched packet in scapy on tester, check the port 1 of DUT could not receive this packet.
+
+Tester::
+
+    >>> sendp([Ether(dst="00:11:22:33:44:33",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x86DD)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/UDP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+    
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8100)/Dot1Q(vlan=0x1,type=0x86DD)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/UDP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x2,type=0x86DD)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/UDP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x86DD)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/UDP(sport=50,dport=22)/("X"*80)],iface="ens260f0",count=1)
+
+5. Destroy a rule and list rules::
+
+     testpmd> flow destroy 0 rule 0
+  
+   Get the message::
+
+     Flow rule #0 destroyed
+
+   Check the flow list::
+
+     testpmd> flow list 0
+
+   Check the rule not exists in the list.
+   Send matched packets in step 3, check the packets are not to port 1.
+
+Test case 6: MAC_QINQ_IPV6_TCP
+------------------------------
+The test case enable QINQ switch filter for IPv6 + TCP in pipeline mode, and port can support as dst MAC + outer VLAN id + inner VLAN id + IPv6 + TCP.
+
+Test steps
+~~~~~~~~~~
+1. Validate a rule::
+   
+     testpmd> flow validate 0 priority 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan tci is 2 / vlan tci is 1 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 / tcp src is 50 dst is 23 / end actions vf id 1 / end
+
+   Get the message::
+
+     Flow rule validated
+
+2. Create a rule and list rules::
+
+     testpmd> flow create 0 priority 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan tci is 2 / vlan tci is 1 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 / tcp src is 50 dst is 23 / end actions vf id 1 / end
+
+   Get the message::
+
+     Flow rule #0 created
+   
+   Check the flow list::
+
+     testpmd> flow list 0
+
+   ID      Group   Prio    Attr    Rule
+   0       0       0       i--     ETH VLAN VLAN IPV6 TCP => VF
+   
+3. Send matched packet in scapy on tester, check the port 1 of DUT received this packet.
+
+Tester::
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x86DD)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/TCP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+
+DUT::
+
+    testpmd> port 1/queue 0: received 1 packets
+  src=00:00:00:00:00:00 - dst=00:11:22:33:44:55 - type=0x8100 - length=162 - nb_segs=1 - hw ptype: L2_ETHER L3_IPV6_EXT_UNKNOWN L4_TCP  - sw ptype: L2_ETHER_VLAN INNER_L2_ETHER_VLAN INNER_L3_IPV6 INNER_L4_TCP  - l2_len=18 - inner_l2_len=4 - inner_l3_len=40 - inner_l4_len=20 - Receive queue=0x0
+  ol_flags: RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
+
+4. Send mismatched packet in scapy on tester, check the port 1 of DUT could not receive this packet.
+
+Tester::
+
+    >>> sendp([Ether(dst="00:11:22:33:44:33",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x86DD)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/TCP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+    
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8100)/Dot1Q(vlan=0x1,type=0x86DD)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/TCP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x2,type=0x86DD)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/TCP(sport=50,dport=23)/("X"*80)],iface="ens260f0",count=1)
+
+    >>> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8100)/Dot1Q(vlan=0x1,type=0x86DD)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/TCP(sport=50,dport=22)/("X"*80)],iface="ens260f0",count=1)
+
+5. Destroy a rule and list rules::
+
+     testpmd> flow destroy 0 rule 0
+  
+   Get the message::
+
+     Flow rule #0 destroyed
+
+   Check the flow list::
+
+     testpmd> flow list 0
+
+   Check the rule not exists in the list.
+   Send matched packets in step 3, check the packets are not to port 1.
+
