test suite reviews and discussions
 help / color / mirror / Atom feed
* [dts] [PATCH V1] test_plans: add cvl_dcf_switch_filter_test_plan.rst
@ 2020-05-22 16:43 Nannan Lu
  2020-06-01  3:12 ` Tu, Lijuan
  0 siblings, 1 reply; 2+ messages in thread
From: Nannan Lu @ 2020-05-22 16:43 UTC (permalink / raw)
  To: dts; +Cc: Nannan Lu

Add cvl_dcf_switch_filter_test_plan.rst to test_plans

Signed-off-by: Nannan Lu <nannan.lu@intel.com>
---
 .../cvl_dcf_switch_filter_test_plan.rst       | 2495 +++++++++++++++++
 1 file changed, 2495 insertions(+)
 create mode 100644 test_plans/cvl_dcf_switch_filter_test_plan.rst

diff --git a/test_plans/cvl_dcf_switch_filter_test_plan.rst b/test_plans/cvl_dcf_switch_filter_test_plan.rst
new file mode 100644
index 0000000..e22f090
--- /dev/null
+++ b/test_plans/cvl_dcf_switch_filter_test_plan.rst
@@ -0,0 +1,2495 @@
+.. Copyright (c) <2020>, Intel Corporation
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+
+   - Neither the name of Intel Corporation nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+   COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+   OF THE POSSIBILITY OF SUCH DAMAGE.
+
+===========================
+CVL DCF Switch Filter Tests
+===========================
+
+Description
+===========
+
+This document provides the plan for testing DCF switch filter of CVL, including:
+
+* Enable DCF switch filter for IPv4/IPv6 + TCP/UDP/IGMP (comm #1 package)
+* Enable DCF switch filter for tunnel: NVGRE (comm #1 package)
+* Enable DCF switch filter for PPPOE (comm #1 package)
+* Enable DCF switch filter for PFCP (comm #1 package)
+* Enable DCF switch filter for IP/L2 multicast (comm #1 package)
+* Enable DCF switch filter for ethertype/UDP port/MAC VLAN/VLAN filter (comm #1 package)
+
+
+Pattern and input set
+---------------------
+
+  +---------------------+-------------------------------+-------------------------------------------+
+  |    Packet Types     |           Pattern             |                Input Set                  |
+  +=====================+===============================+===========================================+
+  |                     | MAC_PAY                       | [Source MAC], [Dest MAC], [Ether type]    |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV4_FRAG                 | [Dest MAC], [Source IP], [Dest IP],       |
+  |                     |                               | [TTL], [DSCP]                             |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV4_PAY                  | [Dest MAC], [Source IP], [Dest IP],       |
+  |                     |                               | [IP protocol], [TTL], [DSCP]              |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV4_UDP_PAY              | [Dest MAC], [Source IP], [Dest IP],       |
+  |                     |                               | [TTL], [DSCP], [Source Port], [Dest Port] |
+  |                     +-------------------------------+-------------------------------------------+
+  |    IPv4/IPv6 + 	| MAC_IPV4_TCP_PAY              | [Dest MAC], [Source IP], [Dest IP],       |
+  |    TCP/UDP/IGMP     |                               | [TTL], [DSCP], [Source Port], [Dest Port] |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV4_IGMP                 | [IP protocol]                             |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV6_FRAG_srcip_dstip     | [Source IP], [Dest IP]                    |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV6_FRAG_dstip_tc        | [Dest MAC], [Dest IP], [TC]               |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV6_PAY_srcip_dstip      | [Source IP], [Dest IP]                    |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV6_PAY_dstip_tc         | [Dest MAC], [Dest IP], [TC]               |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV6_UDP_PAY              | [Dest MAC], [Dest IP], [TC],              |
+  |                     |                               | [Source Port], [Dest Port]                |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV6_TCP                  | [Dest MAC], [Dest IP], [TC],              |
+  |                     |                               | [Source Port], [Dest Port]                |
+  +---------------------+-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV4_TUN_IPV4_FRAG        | [Out Dest IP], [VNI/GRE_KEY],             |
+  |                     |               	        | [Inner Source IP], [Inner Dest IP]        |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV4_TUN_IPV4_PAY         | [Out Dest IP], [VNI/GRE_KEY],             |
+  |                     |                               | [Inner Source IP], [Inner Dest IP]        |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV4_TUN_IPV4_UDP_PAY     | [Out Dest IP], [VNI/GRE_KEY],             |
+  |                     |                               | [Inner Source IP], [Inner Dest IP],       |
+  |                     |                               | [Inner Source Port], [Inner Dest Port]    |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV4_TUN_IPV4_TCP         | [Out Dest IP], [VNI/GRE_KEY],             |
+  |                     |                               | [Inner Source IP], [Inner Dest IP],       |
+  |                     |                               | [Inner Source Port], [Inner Dest Port]    |
+  |       tunnel:       +-------------------------------+-------------------------------------------+
+  |       NVGRE         | MAC_IPV4_TUN_MAC_IPV4_FRAG    | [Out Dest IP], [VNI/GRE_KEY],             |
+  |                     |                               | [Inner Dest MAC],                         |
+  |                     |                               | [Inner Source IP], [Inner Dest IP]        |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV4_TUN_MAC_IPV4_PAY     | [Out Dest IP], [VNI/GRE_KEY],             |
+  |                     |                               | [Inner Dest MAC],                         |
+  |                     |                               | [Inner Source IP], [Inner Dest IP]        |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV4_TUN_MAC_IPV4_UDP_PAY	| [Out Dest IP], [VNI/GRE_KEY],             |
+  |                     |                               | [Inner Dest MAC],                         |
+  |                     |                               | [Inner Source IP],[Inner Dest IP],        |
+  |                     |                               | [Inner Source Port], [Inner Dest Port]    |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV4_TUN_MAC_IPV4_TCP     | [Out Dest IP], [VNI/GRE_KEY],             |
+  |                     |                               | [Inner Dest MAC],                         |
+  |                     |                               | [Inner Source IP], [Inner Dest IP],       |
+  |                     |                               | [Inner Source Port], [Inner Dest Port]    |
+  +---------------------+-------------------------------+-------------------------------------------+
+  |                     | MAC_VLAN_PPPOE_IPV4_PAY       | [Dest MAC], [VLAN], [seid],               |
+  |                     |                               | [pppoe_proto_id]                          |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_VLAN_PPPOE_IPV6_PAY       | [Dest MAC], [VLAN], [seid],               |
+  |        PPPOE        |                               | [pppoe_proto_id]                          |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_PPPOE_IPV4_PAY            | [Dest MAC], [seid], [pppoe_proto_id]      |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_PPPOE_IPV6_PAY            | [Dest MAC], [seid], [pppoe_proto_id]      |
+  +---------------------+-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV4_PFCP_NODE            | [Dest Port], [S-field]                    |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV4_PFCP_SESSION         | [Dest Port], [S-field]                    |
+  |        PFCP         +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV6_PFCP_NODE            | [Dest Port], [S-field]                    |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | MAC_IPV6_PFCP_SESSION         | [Dest Port], [S-field]                    |
+  +---------------------+-------------------------------+-------------------------------------------+
+  |                     | IP multicast                  | [Dest IP]                                 |
+  |      multicast      +-------------------------------+-------------------------------------------+
+  |                     | L2 multicast                  | [Dest MAC]                                |
+  +---------------------+-------------------------------+-------------------------------------------+
+  |                     | ethertype filter_PPPOD        | [Ether type]                              |
+  |                     +-------------------------------+-------------------------------------------+
+  |   ethertype filter  | ethertype filter_PPPOE        | [Ether type]                              |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | ethertype filter_IPV6         | [Ether type]                              |
+  +---------------------+-------------------------------+-------------------------------------------+
+  |                     | UDP port filter_DHCP discovery| [Source Port], [Dest Port]                |
+  |                     +-------------------------------+-------------------------------------------+
+  |   UDP port filter   | UDP port filter_DHCP offer    | [Source Port], [Dest Port]                |
+  |                     +-------------------------------+-------------------------------------------+
+  |                     | UDP port filter_VXLAN         | [Dest Port]                               |
+  +---------------------+-------------------------------+-------------------------------------------+
+  |   MAC VLAN filter   | MAC_VLAN filter               | [Dest MAC], [VLAN]                        |
+  +---------------------+-------------------------------+-------------------------------------------+
+  |    VLAN filter      | VLAN filter                   | [VLAN]                                    |
+  +---------------------+-------------------------------+-------------------------------------------+
+
+
+Supported function type
+-----------------------
+
+* create
+* validate
+* destroy
+* flush
+
+
+Supported action type
+---------------------
+
+* To vf/vsi
+
+
+Prerequisites
+=============
+
+1. Hardware:
+   columbiaville_25g/columbiaville_100g
+
+2. Software:
+   dpdk: http://dpdk.org/git/dpdk
+   scapy: http://www.secdev.org/projects/scapy/
+
+3. Copy specific ice package to /lib/firmware/updates/intel/ice/ddp/ice.pkg,
+   then load driver::
+
+     rmmod ice
+     insmod ice.ko
+
+4. Compile DPDK::
+
+     make -j install T=x86_64-native-linuxapp-gcc
+
+5. Get the pci device id of DUT, for example::
+
+     ./usertools/dpdk-devbind.py -s
+
+     0000:18:00.0 'Device 1593' if=enp24s0f0 drv=ice unused=vfio-pci
+     0000:18:00.1 'Device 1593' if=enp24s0f1 drv=ice unused=vfio-pci
+
+6. Generate 4 VFs on PF0::
+
+     echo 4 > /sys/bus/pci/devices/0000:18:00.0/sriov_numvfs
+
+     ./usertools/dpdk-devbind.py -s
+     0000:18:01.0 'Ethernet Adaptive Virtual Function 1889' if=enp24s1 drv=iavf unused=vfio-pci
+     0000:18:01.1 'Ethernet Adaptive Virtual Function 1889' if=enp24s1f1 drv=iavf unused=vfio-pci
+     0000:18:01.2 'Ethernet Adaptive Virtual Function 1889' if=enp24s1f2 drv=iavf unused=vfio-pci
+     0000:18:01.3 'Ethernet Adaptive Virtual Function 1889' if=enp24s1f3 drv=iavf unused=vfio-pci
+
+7. Set VF0 as trust::
+
+     ip link set enp24s0f0 vf 0 trust on
+
+8. Bind VFs to dpdk driver::
+
+     modprobe vfio-pci
+     ./usertools/dpdk-devbind.py -b vfio-pci 0000:18:01.0 0000:18:01.1 0000:18:01.2 0000:18:01.3
+
+9. Launch dpdk on VF0 and VF1, and VF0 request DCF mode::
+
+     ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0000:18:01.0,cap=dcf -w 0000:18:01.1 -- -i
+     testpmd> set portlist 1
+     testpmd> set fwd rxonly
+     testpmd> set verbose 1
+     testpmd> start
+     testpmd> show port info all
+
+   check the VF0 driver is net_ice_dcf.
+
+10. on tester side, copy the layer python file to /root::
+
+      cp pfcp.py to /root
+
+    then import layers when start scapy::
+
+      >>> import sys
+      >>> sys.path.append('/root')
+      >>> from pfcp import PFCP
+      >>> from scapy.contrib.igmp import *
+
+
+Test case: MAC_PAY
+==================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth src is 00:00:00:00:00:01 dst is 00:11:22:33:44:55 type is 0x0800 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(src="00:00:00:00:00:01",dst="00:11:22:33:44:55")/IP()/Raw("x" *80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packet.
+   send mismatched packets::
+
+     sendp([Ether(src="00:00:00:00:00:02",dst="00:11:22:33:44:55")/IP()/Raw("x" *80)],iface="enp27s0f0",count=1)
+     sendp([Ether(src="00:00:00:00:00:01",dst="00:11:22:33:44:54")/IP()/Raw("x" *80)],iface="enp27s0f0",count=1)
+     sendp([Ether(src="00:00:00:00:00:01",dst="00:11:22:33:44:55")/IPv6()/Raw("x" *80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_FRAG
+========================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 2 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=2,frag=5)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packet.
+   send mismatched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a3")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=2,frag=5)/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.4",dst="192.168.0.2",tos=4,ttl=2,frag=5)/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.5",tos=4,ttl=2,frag=5)/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=5,ttl=2,frag=5)/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=3,frag=5)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_PAY
+=======================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 dst is 192.168.0.2 proto is 6 tos is 4 ttl is 2 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=2)/TCP()/("X"*480)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packet.
+   send mismatched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a3")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=2)/TCP()/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.4",dst="192.168.0.2",tos=4,ttl=2)/TCP()/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.5",tos=4,ttl=2)/TCP()/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=5,ttl=2)/TCP()/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=3)/TCP()/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=2)/UDP()/("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_UDP_PAY
+===========================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=3)/UDP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packet.
+   send mismatched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=3)/UDP(sport=30,dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=3)/UDP(sport=25,dport=19)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_TCP_PAY
+===========================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / tcp src is 25 dst is 23 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=3)/TCP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packet.
+   send mismatched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=3)/TCP(sport=30,dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=3)/TCP(sport=25,dport=19)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_IGMP
+========================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 proto is 0x02 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/IP()/IGMP()/Raw("X"*480)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packet.
+   send mismatched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/IP()/TCP()/Raw("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="00:11:22:33:44:55")/IP()/UDP()/Raw("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV6_FRAG_srcip_dstip
+====================================
+
+Description: The maximum input set length of a switch rule is 32 bytes.
+Therefore, if a rule carries src ipv6, dst ipv6, it can not take any other fields.
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv6 src is CDCD:910A:2222:5498:8475:1111:3900:1536 dst is CDCD:910A:2222:5498:8475:1111:3900:2022 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/IPv6ExtHdrFragment()/("X"*480)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packet.
+   send mismatched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1537", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/IPv6ExtHdrFragment()/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2023")/IPv6ExtHdrFragment()/("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV6_FRAG_dstip_tc
+=================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 tc is 3 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/IPv6ExtHdrFragment()/("X"*480)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packet.
+   send mismatched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a3")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/IPv6ExtHdrFragment()/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2023",tc=3)/IPv6ExtHdrFragment()/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=4)/IPv6ExtHdrFragment()/("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV6_PAY_srcip_dstip
+===================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv6 src is CDCD:910A:2222:5498:8475:1111:3900:1536 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/("X"*480)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packet.
+   send mismatched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1537", dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1536", dst="CDCD:910A:2222:5498:8475:1111:3900:2023")/("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV6_PAY_dstip_tc
+================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 tc is 3 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packet.
+   send mismatched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a3")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2023",tc=3)/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=4)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV6_UDP_PAY
+===========================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 tc is 3 / udp src is 25 dst is 23 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/UDP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0",count=1)
+
+   check port 1 receive the packet.
+   send mismatched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/UDP(sport=30,dport=23)/("X"*480)], iface="enp27s0f0",count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/UDP(sport=25,dport=19)/("X"*480)], iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV6_TCP
+=======================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 tc is 3 / tcp src is 25 dst is 23 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/TCP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packet.
+   send mismatched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/TCP(sport=30,dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/TCP(sport=25,dport=19)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_VXLAN_IPV4_FRAG (not support in 20.05)
+==========================================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp / vxlan vni is 2 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3",frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3",frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.2")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3",frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=3)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3",frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.4", dst="192.168.0.3",frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.2", dst="192.168.0.5",frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_VXLAN_IPV4_PAY (not support in 20.05)
+=========================================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp / vxlan vni is 2 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.2")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=3)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.4", dst="192.168.0.3")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.2", dst="192.168.0.5")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_VXLAN_IPV4_UDP_PAY (not support in 20.05)
+=============================================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp / vxlan vni is 2 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / udp src is 50 dst is 23 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/UDP(sport=50,dport=23) /Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/UDP(sport=20,dport=23) /Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/UDP(sport=50,dport=19) /Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_VXLAN_IPV4_TCP (not support in 20.05)
+=========================================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp / vxlan vni is 2 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / tcp src is 50 dst is 23 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/TCP(sport=50,dport=23)/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/TCP(sport=29,dport=23)/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/TCP(sport=50,dport=100)/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_VXLAN_MAC_IPV4_FRAG (not support in 20.05)
+==============================================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp / vxlan vni is 2 / eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3" ,frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.2")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=3)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a9")/IP(src="192.168.0.2", dst="192.168.0.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.4", dst="192.168.0.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.5" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_VXLAN_MAC_IPV4_PAY (not support in 20.05)
+=============================================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp / vxlan vni is 2 / eth dst is 68:05:ca:8d:ed:a8  / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3") /TCP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3")/Raw("x" * 80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.2")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3") /TCP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=3)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3") /TCP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a9")/IP(src="192.168.0.2", dst="192.168.0.3") /TCP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.4", dst="192.168.0.3") /TCP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.5") /TCP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_VXLAN_MAC_IPV4_UDP_PAY (not support in 20.05)
+=================================================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp / vxlan vni is 2 / eth dst is 68:05:ca:8d:ed:a8  / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / udp src is 50 dst is 23 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3")/UDP(sport=50,dport=23)/Raw("x" * 80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3")/UDP(sport=20,dport=23)/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3")/UDP(sport=50,dport=29)/Raw("x" * 80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_VXLAN_MAC_IPV4_TCP (not support in 20.05)
+=============================================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp / vxlan vni is 2 / eth dst is 68:05:ca:8d:ed:a8  / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / tcp src is 25 dst is 23 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3")/TCP(sport=25,dport=23)/Raw("x" * 80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3")/TCP(sport=20,dport=23)/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3")/TCP(sport=25,dport=19)/Raw("x" * 80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_NVGRE_IPV4_FRAG
+===================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / nvgre tni is 2 / eth / ipv4 src is 192.168.1.2 dst is 192.168.1.3 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.1.2", dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.1.2", dst="192.168.1.3" ,frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.2")/NVGRE(TNI=2)/Ether()/IP(src="192.168.1.2", dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=3)/Ether()/IP(src="192.168.1.2", dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.1.4", dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.1.2", dst="192.168.1.5" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_NVGRE_IPV4_PAY
+==================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / nvgre tni is 2 / eth / ipv4 src is 192.168.1.2 dst is 192.168.1.3 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.1.2", dst="192.168.1.3")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.1.2", dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.2")/NVGRE(TNI=2)/Ether()/IP(src="192.168.1.2", dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=3)/Ether()/IP(src="192.168.1.2", dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.1.4", dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.1.2", dst="192.168.1.5")/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+Test case: MAC_IPV4_NVGRE_IPV4_UDP_PAY
+======================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / nvgre tni is 0x8 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / udp src is 50 dst is 23 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=0x8)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/UDP(sport=50,dport=23)/Raw("x"*80)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=0x8)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/UDP(sport=20,dport=23)/Raw("x"*80)], iface="enp27s0f0", count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=0x8)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/UDP(sport=50,dport=19)/Raw("x"*80)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+Test case: MAC_IPV4_NVGRE_IPV4_TCP
+==================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / nvgre tni is 2 / eth / ipv4 src is 192.168.1.2 dst is 192.168.1.3 / tcp src is 25 dst is 23 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.1.2", dst="192.168.1.3")/TCP(sport=25,dport=23)/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.1.2", dst="192.168.1.3")/TCP(sport=20,dport=23)/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.1.2", dst="192.168.1.3")/TCP(sport=25,dport=39)/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_NVGRE_MAC_IPV4_FRAG
+=======================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / nvgre tni is 2 / eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.1.2 dst is 192.168.1.3 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.3" ,frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.2")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=3)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:ed:a9")/IP(src="192.168.1.2", dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.4", dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.5" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_NVGRE_MAC_IPV4_PAY
+======================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / nvgre tni is 2 / eth dst is 68:05:ca:8d:ed:a8  / ipv4 src is 192.168.1.2 dst is 192.168.1.3 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.3")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.2")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=3)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:ed:a9")/IP(src="192.168.1.2", dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.4", dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.5")/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_NVGRE_MAC_IPV4_UDP_PAY
+==========================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / nvgre tni is 0x8 /  eth dst is 68:05:ca:8d:ed:a8  / ipv4 src is 192.168.1.2 dst is 192.168.1.3 / udp src is 25 dst is 23 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=0x8)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.3")/UDP(sport=25,dport=23)/Raw("x"*80)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=0x8)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.3")/UDP(sport=2,dport=23)/Raw("x"*80)], iface="enp27s0f0", count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=0x8)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.3")/UDP(sport=25,dport=20)/Raw("x"*80)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+Test case: MAC_IPV4_NVGRE_MAC_IPV4_TCP
+======================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / nvgre tni is 2 / eth dst is 68:05:ca:8d:ed:a8  / ipv4 src is 192.168.1.2 dst is 192.168.1.3 / tcp src is 25 dst is 23 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.3")/TCP(sport=25,dport=23)/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.3")/TCP(sport=1,dport=23)/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.1.2", dst="192.168.1.3")/TCP(sport=25,dport=20)/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_VLAN_PPPOE_IPV4_PAY
+==================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan tci is 1 / pppoes seid is 3 / pppoe_proto_id is 0x0021 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:54",type=0x8100)/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=4)/PPP(proto=0x0021)/IP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_VLAN_PPPOE_IPV6_PAY
+==================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan tci is 1 / pppoes seid is 3 / pppoe_proto_id is 0x0057 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:54",type=0x8100)/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=4)/PPP(proto=0x0057)/IPv6()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_PPPOE_IPV4_PAY
+=============================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / pppoes seid is 3 / pppoe_proto_id is 0x0021 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:54",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8864)/PPPoE(sessionid=4)/PPP(proto=0x0021)/IP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_PPPOE_IPV6_PAY
+=============================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / pppoes seid is 3 / pppoe_proto_id is 0x0057 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:54",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8864)/PPPoE(sessionid=4)/PPP(proto=0x0057)/IPv6()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_PFCP_NODE
+=============================
+
+1. DUT create switch filter rules for MAC_IPV4_PFCP_NODE to VF1::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions vf id 1 / end
+
+   check the rule exists in the list.
+
+    testpmd> flow list 0
+    ID      Group   Prio    Attr    Rule
+    0       0       0       i--     ETH IPV4 UDP PFCP => VF
+
+2. send matched packets::
+
+    sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+
+   check port 1 receive the packet.
+   send mismatched packets::
+
+    sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_IPV4_PFCP_SESSION
+================================
+
+1. DUT create switch filter rules for MAC_IPV4_PFCP_SESSION to VF2::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 / end actions vf id 2 / end
+
+   check the rule exists in the list.
+
+    testpmd> flow list 0
+    ID      Group   Prio    Attr    Rule
+    0       0       0       i--     ETH IPV4 UDP PFCP => VF
+
+2. send matched packets::
+
+    sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+
+   check port 2 receive the packet.
+   send mismatched packets::
+
+    sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+
+   check the packets are not to port 2.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 2.
+
+
+Test case: MAC_IPV6_PFCP_NODE
+=============================
+
+1. DUT create switch filter rules for MAC_IPV6_PFCP_NODE to VF3::
+
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 0 / end actions vf id 3 / end
+
+   check the rule exists in the list.
+
+    testpmd> flow list 0
+    ID      Group   Prio    Attr    Rule
+    0       0       0       i--     ETH IPV6 UDP PFCP => VF
+
+2. send matched packets::
+
+    sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+
+   check port 3 receive the packet.
+   send mismatched packets::
+
+    sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+
+   check the packets are not to port 3.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 3.
+
+
+Test case: MAC_IPV6_PFCP_SESSION
+================================
+
+1. DUT create switch filter rules for MAC_IPV6_PFCP_SESSION to VF1::
+
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 1 / end actions vf id 1 / end
+
+   check the rule exists in the list.
+
+    testpmd> flow list 0
+    ID      Group   Prio    Attr    Rule
+    0       0       0       i--     ETH IPV6 UDP PFCP => VF
+
+2. send matched packets::
+
+    sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+
+   check port 1 receive the packet.
+   send mismatched packets::
+
+    sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: QinQ (not supported in 20.05)
+========================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / vlan tci is 1 / vlan tci is 2 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8100,vlan=1)/Dot1Q(type=0x0800,vlan=2)/IP(src="192.168.0.1",dst="192.168.0.2")/Raw("X"*480)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8100,vlan=3)/Dot1Q(type=0x0800, vlan=2)/IP(src="192.168.0.1",dst="192.168.0.2")/Raw("X"*480)],iface="enp27s0f0",count=1)
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8100,vlan=1)/Dot1Q(type=0x0800, vlan=5)/IP(src="192.168.0.1",dst="192.168.0.2")/Raw("X"*480)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+Test case: IP multicast
+=======================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst spec 224.0.0.0 dst mask 240.0.0.0 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="239.0.0.0")/TCP()/Raw("x"*80)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="128.0.0.0")/TCP()/Raw("x"*80)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: L2 multicast
+=======================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth dst spec 01:00:5e:00:00:00 dst mask ff:ff:ff:80:00:00 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="01:00:5e:7f:00:00")/IP()/TCP()/Raw("x"*80)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether(dst="01:00:5e:ff:00:00")/IP()/TCP()/Raw("x"*80)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: ethertype filter_PPPOD
+=================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth type is 0x8863 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/PPPoED()/PPP()/IP()/Raw("x" *80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/PPPoE()/PPP()/IP()/Raw("x" *80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: ethertype filter_PPPOE
+=================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth type is 0x8864 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/PPPoE()/PPP()/IP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/PPPoED()/PPP()/IP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: ethertype filter_IPV6
+=================================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth type is 0x86dd / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", tc=3)/TCP(dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", tc=3)/TCP(dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/IP()/TCP(dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+Test case: UDP port filter_DHCP discovery
+=========================================
+
+Description: The udp port used by DHCP server is 67, and 68 by DHCP client.
+Therefore, for DHCP discovery packets, the udp srcport is 68 and the dstport is 67.
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 / udp src is 68 dst is 67 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=68,dport=67)/BOOTP(chaddr="3c:fd:fe:b2:43:90")/DHCP(options=[("message-type","discover"),"end"])/Raw("X"*480)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=63,dport=67)/BOOTP(chaddr="3c:fd:fe:b2:43:90")/DHCP(options=[("message-type","discover"),"end"])/Raw("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=68,dport=69)/BOOTP(chaddr="3c:fd:fe:b2:43:90")/DHCP(options=[("message-type","discover"),"end"])/Raw("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: UDP port filter_DHCP offer
+=====================================
+
+Description: For DHCP offer packets, the udp srcport is 67 and the dstport is 68.
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 / udp src is 67 dst is 68 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=67,dport=68)/BOOTP(chaddr="3c:fd:fe:b2:43:90",yiaddr="192.168.1.0")/DHCP(options=[("message-type","offer"),"end"])/Raw("X"*480)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=63,dport=68)/BOOTP(chaddr="3c:fd:fe:b2:43:90",yiaddr="192.168.1.0")/DHCP(options=[("message-type","offer"),"end"])/Raw("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=67,dport=63)/BOOTP(chaddr="3c:fd:fe:b2:43:90",yiaddr="192.168.1.0")/DHCP(options=[("message-type","offer"),"end"])/Raw("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: UDP port filter_VXLAN
+================================
+
+Description: The UDP dst port number used by VXLAN is 4789.
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 / udp dst is 4789 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3",frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.1.2", dst="192.168.1.3")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: MAC_VLAN filter
+==========================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan tci is 1 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1)/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=2)/TCP()/Raw("X"*480)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:54",type=0x8100)/Dot1Q(vlan=1)/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=2)/TCP()/Raw("X"*480)],iface="enp27s0f0",count=1)
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2)/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=2)/TCP()/Raw("X"*480)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: VLAN filter
+======================
+
+1. create a rule::
+
+     testpmd> flow create 0 ingress pattern eth / vlan tci is 1 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1)/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=2)/TCP()/Raw("X"*480)],iface="enp27s0f0",count=1)
+
+   check port 1 receive the packets.
+   send mismatched packets::
+
+     sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2)/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=2)/TCP()/Raw("X"*480)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: negative cases
+=========================
+
+Subcase 1: actions vf id 0
+--------------------------
+
+1. action to vf 0, the rule can be created, but not take effect::
+
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / tcp src is 25 dst is 23 / end actions vf id 0 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packet::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=3)/TCP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packet not to port 0, the rule doesn't take effect.
+
+Subcase 2: can not create rule on vf 1
+--------------------------------------
+
+1. create rule on vf 1::
+
+     testpmd> flow create 1 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23 / end actions vf id 1 / end
+     iavf_flow_create(): Failed to create flow
+     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)): Failed to create parser engine.: Invalid argument
+
+   check the rule can not be created successfully.
+
+2. list the rule::
+
+     testpmd> flow list 1
+
+   there is no rule listed.
+
+Subcase 3: unsupported pattern in comms
+---------------------------------------
+
+1. create an SCTP rule which is not supported in comms::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3  / sctp src is 25 dst is 23 / end actions vf id 1 / end
+
+2. check the rule can not be created successfully,
+   and testpmd provide a friendly output, showing::
+
+     ice_flow_create(): Failed to create flow
+     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)): Invalid input pattern: Invalid argument
+
+3. check the rule list::
+
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+
+Subcase 4: unsupported pattern in os default, but supported in comms
+--------------------------------------------------------------------
+
+1. load os default package and launch testpmd as step 3-8 in Prerequisites.
+
+2. create a pppoe rule which is not supported in os default ::
+
+     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / pppoes seid is 3 / pppoe_proto_id is 0x0021 / end actions vf id 1 / end
+
+3. check the rule can not be created successfully, and
+   testpmd should provide a friendly output, showing::
+
+     ice_flow_create(): Failed to create flow
+     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)): Invalid input pattern: Invalid argument
+
+4. check the rule list::
+
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+
+5. repeat step 2-5 with also not supported pattern MAC_IPV4_PFCP_NODE, get the same result.
+
+Subcase 5: unsupported input set
+--------------------------------
+
+1. create an nvgre rule with unsupported input set field [inner tos]::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / nvgre tni is 2 / eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.1.2 dst is 192.168.1.3 tos is 4 / end actions vf id 1 / end
+
+2. check the rule can not be created successfully, and
+   testpmd should provide a friendly output, showing::
+
+     ice_flow_create(): Failed to create flow
+     port_flow_complain(): Caught PMD error type 10 (item specification): cause: 0x7ffcccb26a68, Invalid input set: Invalid argument
+
+3. check the rule list::
+
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+
+Subcase 6: invalid vf id
+------------------------
+
+1. create a rule with invalid vf id 5::
+
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / tcp src is 25 dst is 23 / end actions vf id 5 / end
+
+2. check the rule can not be created successfully, and
+   testpmd provide a friendly output, showing::
+
+     ice_flow_create(): Failed to create flow
+     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)): switch filter create flow fail: Invalid argument
+
+3. check the rule list::
+
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+
+Subcase 7: delete a non-existing rule
+-------------------------------------
+
+1. check the rule list::
+
+     testpmd> flow list 0
+
+   check no rule exists in the list.
+
+2. destroy the rule 0::
+
+     testpmd> flow destroy 0 rule 0
+
+   check no error reports.
+
+3. flush rules::
+
+     testpmd> flow flush 0
+
+   check no error reports.
+
+Subcase 8: add long switch rule
+-------------------------------
+
+Description: A recipe has 5 words, one of which is reserved for switch ID,
+so a recipe can use 4 words, and a maximum of 5 recipes can be chained,
+one of which is reserved. Therefore, a rule can use up to 4*4*2 = 32 bytes.
+This case is used to test that a rule whose input set is longer than 32
+bytes can not be created successfully, and will not affect the creation of
+other rules.
+
+1. create a rule with input set length longer than 32 bytes::
+
+     testpmd> flow create 0 ingress pattern eth / ipv6 src is CDCD:910A:2222:5498:8475:1111:3900:1536 dst is CDCD:910A:2222:5498:8475:1111:3900:2022 tc is 3 / end actions vf id 1 / end
+
+2. check the rule can not be created successfully, and
+   testpmd provide a friendly output, showing::
+
+     ice_flow_create(): Failed to create flow
+     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)): switch filter create flow fail: Invalid argument
+
+3. check the rule list::
+
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+
+4. create a MAC_IPV6_UDP_PAY rule::
+
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 tc is 3 / udp src is 25 dst is 23 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+5. send matched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/UDP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0",count=1)
+
+   check port 1 receive the packet.
+   send mismatched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/UDP(sport=30,dport=23)/("X"*480)], iface="enp27s0f0",count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1518", dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/UDP(sport=25,dport=19)/("X"*480)], iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+6. verify rules can be destroyed::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test Case: multirules test
+==========================
+
+Subcase 1: add existing rules but with different vfs (not support in 20.05)
+---------------------------------------------------------------------------
+
+1. Launch dpdk on VF0, VF1 and VF2, and VF0 request DCF mode::
+
+     ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0000:18:01.0,cap=dcf -w 0000:18:01.1 -w 0000:18:01.2 -- -i
+     testpmd> set portlist 1,2
+     testpmd> set fwd rxonly
+     testpmd> set verbose 1
+     testpmd> start
+
+2. create rules with same pattern items but to different vfs::
+
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23 / end actions vf id 1 / end
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23 / end actions vf id 2 / end
+     testpmd> flow list 0
+
+   check both rules exist in the list.
+
+3. send matched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=3)/UDP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check both port 1 and 2 receive the packet.
+
+4. destroy the rule 0, and send the matched packets::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check only rule 1 exists in the list.
+   send the same matched packets, check only port 2 receives the packets.
+
+5. destroy rule 1, send the matched packets::
+
+     testpmd> flow destroy 0 rule 1
+     testpmd> flow list 0
+
+   check no rule exists in the list
+   send the same matched packets, check the packets are not to port 1 and 2.
+
+Subcase 2: add existing rules with the same vfs
+-----------------------------------------------
+
+1. create two indentical rules::
+
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23 / end actions vf id 1 / end
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23 / end actions vf id 1 / end
+
+2. check the first rule is created successfully, and
+   the second one can not be created successfully,
+   and testpmd provide a friendly output, showing::
+
+     ice_flow_create(): Failed to create flow
+     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)): switch filter create flow fail: Invalid argument
+
+3. check the rule list::
+
+     testpmd> flow list 0
+
+   check only the first rule exists in the list.
+
+Subcase 3: add two rules with one rule's input set included in the other
+-------------------------------------------------------------------------
+
+1. Launch dpdk on VF0, VF1 and VF2, and VF0 request DCF mode::
+
+     ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0000:18:01.0,cap=dcf -w 0000:18:01.1 -w 0000:18:01.2 -- -i
+     testpmd> set portlist 1,2
+     testpmd> set fwd rxonly
+     testpmd> set verbose 1
+     testpmd> start
+
+2. create rules with one rule's input set included in the other::
+
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 / end actions vf id 1 / end
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 dst is 192.168.0.2 / end actions vf id 2 / end
+     testpmd> flow list 0
+
+   check both rules exist in the list.
+
+3. send a packet p0 that matches both rules::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2")/("X"*480)], iface="enp27s0f0", count=1)
+
+   check both port 1 and 2 receive the packet.
+   send a packet that only matches the rule 0 but not rule 1::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.3")/("X"*480)], iface="enp27s0f0", count=1)
+
+   check only port 1 receives the packet.
+
+4. destroy the rule 0, and send the packet p0::
+
+     testpmd> flow destroy 0 rule 0
+     testpmd> flow list 0
+
+   check only rule 1 exists in the list.
+   send the matched packet p0, check only port 2 receives the packet.
+
+5. destroy rule 1, send the packet p0::
+
+     testpmd> flow destroy 0 rule 1
+     testpmd> flow list 0
+
+   check no rule exists in the list.
+   send the matched packet p0, check the packet are not to port 1 and 2.
+
+Subcase 4: different input set, same vf id
+------------------------------------------
+
+1. DUT create switch filter rules for MAC_IPV4_PFCP_SESSION and MAC_IPV4_PFCP_NODE to VF1::
+
+    testpmd> flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions vf id 1 / end
+    Flow rule #0 created
+    testpmd> flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 / end actions vf id 1 / end
+    Flow rule #1 created
+
+   check the rule exists in the list.
+
+    testpmd> flow list 0
+    ID      Group   Prio    Attr    Rule
+    0       0       0       i--     ETH IPV4 UDP PFCP => VF
+    1       0       0       i--     ETH IPV4 UDP PFCP => VF
+
+2. send matched packets::
+
+    sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+
+   check port 1 receive the two packets.
+   send mismatched packets::
+
+    sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+
+   check the packets are not to port 1.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow flush 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1.
+
+Subcase 5: different input set, different vf id
+-----------------------------------------------
+
+1. DUT create switch filter rules for MAC_IPV4_PFCP_SESSION and MAC_IPV4_PFCP_NODE to VF1::
+
+    testpmd> flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions vf id 1 / end
+    Flow rule #0 created
+    testpmd> flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 / end actions vf id 2 / end
+    Flow rule #1 created
+
+   check the rule exists in the list.
+
+    testpmd> flow list 0
+    ID      Group   Prio    Attr    Rule
+    0       0       0       i--     ETH IPV4 UDP PFCP => VF
+    1       0       0       i--     ETH IPV4 UDP PFCP => VF
+
+2. send matched packets::
+
+    sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+
+   check port 1 receive the first packet, port 2 receive the second packet.
+   send mismatched packets::
+
+    sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+
+   check the packets are not to port 1 or port 2.
+
+3. verify rules can be destroyed::
+
+     testpmd> flow flush 0
+     testpmd> flow list 0
+
+   check the rule not exists in the list.
+   send matched packets, check the packets are not to port 1 or port 2.
+
+
+Test case: test forwarding with single vf
+=========================================
+
+Description: This case is used to test the packets that match switch filter rules can be
+received and forwarded when there is one vf for forwarding, and no packets are dropped.
+
+1. set the forwarding mode to mac::
+
+     testpmd> set fwd mac
+
+2. create a rule with input set [Source IP], [Dest IP]::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.1 dst is 192.168.0.2 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list
+
+3. send matched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2")/("X"*480)], iface="enp27s0f0", count=1)
+
+4. check port 1 receives the packet and forward it, and no packets are dropped::
+
+     testpmd> stop
+     ---------------------- Forward statistics for port 1  ----------------------
+     RX-packets: 1              RX-dropped: 0             RX-total: 1
+     TX-packets: 1              TX-dropped: 0             TX-total: 1
+    ----------------------------------------------------------------------------
+
+    +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
+    RX-packets: 1              RX-dropped: 0             RX-total: 1
+    TX-packets: 1              TX-dropped: 0             TX-total: 1
+    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+   check the RX-packets and TX-packets of port 1 are both 1, and the TX-dropped in
+   "Accumulated forward statistics for all ports" is 0.
+
+
+Test case: test forwarding with multi vfs
+=========================================
+
+Description: This case is used to test the packets that match switch filter rules
+can be received and forwarded when there are multi vfs for forwarding, and no packets
+are dropped.
+
+1. Launch dpdk on VF0, VF1 and VF2, and VF0 request DCF mode::
+
+     ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0000:18:01.0,cap=dcf -w 0000:18:01.1 -w 0000:18:01.2 -- -i
+     testpmd> set portlist 1,2
+     testpmd> set fwd mac
+     testpmd> set verbose 1
+     testpmd> start
+
+2. create a rule with input set [Source IP], [Dest IP]::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.1 dst is 192.168.0.2 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list
+
+3. send matched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2")/("X"*480)], iface="enp27s0f0", count=1)
+
+4. check port 1 receives the packet, and forward it to port 2, and no packets are dropped::
+
+     testpmd> stop
+     ---------------------- Forward statistics for port 1  ----------------------
+     RX-packets: 1         RX-dropped: 0             RX-total: 1
+     TX-packets: 0         TX-dropped: 0             TX-total: 0
+     ----------------------------------------------------------------------------
+
+     ---------------------- Forward statistics for port 2  ----------------------
+     RX-packets: 0              RX-dropped: 0             RX-total: 0
+     TX-packets: 1              TX-dropped: 0             TX-total: 1
+     ----------------------------------------------------------------------------
+
+     +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
+     RX-packets: 1              RX-dropped: 0             RX-total: 1
+     TX-packets: 1              TX-dropped: 0             TX-total: 1
+     ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+
+   check the RX-packets of port 1 is 1, the TX-packets of port 2 is 1, and the TX-dropped in
+   "Accumulated forward statistics for all ports" is 0.
+
+
+Test case: Max vfs
+==================
+
+Description: 256 VFs can be created on a CVL nic, if 2*100G card, each PF
+can create 128 VFs, else if 4*25G card, each PF can create 64 VFs. This
+case is used to test when all VFs on a PF are used, switch filter rules can work.
+
+design case with 4*25G card.
+
+1. generate 64 VFs on PF::
+
+     echo 64 > /sys/bus/pci/devices/0000:18:00.0/sriov_numvfs
+
+2. Get the interface name of the VFs, for example::
+
+     ./usertools/dpdk-devbind.py -s
+
+     0000:18:01.1 'Ethernet Adaptive Virtual Function 1889' if=enp24s1f1 drv=iavf unused=igb_uio
+
+3. Start the 64 VFs in the kernel, for example::
+
+     ifconfig enp24s1f1 up
+
+4. Set VF0 as trust::
+
+     ip link set enp24s0f0 vf 0 trust on
+
+5. bind VF0 to dpdk driver::
+
+     ./usertools/dpdk-devbind.py -b vfio-pci 0000:18:01.0
+
+6. launch dpdk on VF0, and request DCF mode::
+
+     ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0000:18:01.0,cap=dcf -- -i
+
+7. set a switch rule to each VF from DCF, totally 63 rules::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.1 / tcp / end actions vf id 1 / end
+     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.2 / tcp / end actions vf id 2 / end
+     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.3 / tcp / end actions vf id 3 / end
+     ......
+     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.63 / tcp / end actions vf id 63 / end
+     testpmd> flow list 0
+
+   check the rules exist in the list.
+
+8. send matched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1")/TCP()/Raw("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2")/TCP()/Raw("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.3")/TCP()/Raw("X"*480)], iface="enp27s0f0", count=1)
+     ......
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.63")/TCP()/Raw("X"*480)], iface="enp27s0f0", count=1)
+
+   check the VF 1-63 each receives a packet in kernel, for example::
+
+     ifconfig
+     enp24s1f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
+             inet6 fe80::fc5e:4aff:fe55:824b  prefixlen 64  scopeid 0x20<link>
+             ether fe:5e:4a:55:82:4b  txqueuelen 1000  (Ethernet)
+             RX packets 1  bytes 538 (538.0 B)
+             RX errors 0  dropped 0  overruns 0  frame 0
+             TX packets 7  bytes 490 (490.0 B)
+             TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+
+     the "RX packets" number is 1.
+
+   send mismatched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.64")/TCP()/Raw("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packets are not to any VF.
+
+9. verify rules can be destroyed::
+
+     testpmd> flow flush 0
+     testpmd> flow list 0
+
+   check the rules not exist in the list.
+   send matched packets, check the packets are not to any VF.
+
+
+Test case: max field vectors
+============================
+
+Description: 48 field vectors can be used on a CVL nic. This case is used
+to test when field vectors are run out of, then creating a rule, testpmd
+will not hang and provide a friendly output.
+
+1. create the following nvgre rules::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / nvgre tni is 0x8 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / udp src is 50 dst is 23 / end actions vf id 1 / end
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.2 / nvgre tni is 0x8 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / udp src is 50 / end actions vf id 1 / end
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.3 / nvgre tni is 0x8 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / udp dst is 23 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rules exist in the list.
+
+2. the three rules have run out of field vectors, and
+   continue to create the following rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.10 / nvgre tni is 0x8 /  eth dst is 68:05:ca:8d:ed:a1  / ipv4 src is 192.168.1.2 dst is 192.168.1.3 / udp src is 25 dst is 23 / end actions vf id 1 / end
+
+   check the rule can not be created successfully, and testpmd
+   provide a friendly output, showing::
+
+     ice_flow_create(): Failed to create flow
+     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)): switch filter create flow fail: Invalid argument
+
+3. check the rule list::
+
+     testpmd> flow list 0
+
+   check the rule in step 2 not exists in the list.
+
+4. send 3 matched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=0x8)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/UDP(sport=50,dport=23)/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.2")/NVGRE(TNI=0x8)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/UDP(sport=50,dport=23)/Raw("x"*80)],iface="enp27s0f0",count=1)
+     sendp([Ether()/IP(dst="192.168.0.3")/NVGRE(TNI=0x8)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/UDP(sport=50,dport=23)/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check port 1 receives the packets
+   send mismatched packets::
+
+     sendp([Ether()/IP(dst="192.168.0.5")/NVGRE(TNI=0x8)/Ether()/IP(src="192.168.0.2", dst="192.168.0.3")/UDP(sport=50,dport=23)/Raw("x"*80)],iface="enp27s0f0",count=1)
+
+   check the packets are not to port 1.
+
+5. verify rules can be destroyed::
+
+     testpmd> flow flush 0
+     testpmd> flow list 0
+
+   check the rules not exist in the list.
+   send matched packets, check the packets are not to port 1.
+
+
+Test case: max rule number
+==========================
+
+Description: 32k switch filter rules can be created on a CVL card,
+and all PFs and VFs share the 32k rules. But the system will first create
+some MAC_VLAN rules in switch table, and as the number of rules increased,
+the hash conflicts in the switch filter table are increased, so we can
+create a total of 32563 switch filter rules on a DCF.
+
+1. create 32563 rules with the same pattern, but different input set::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.0 / end actions vf id 1 / end
+     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.1 / end actions vf id 1 / end
+     ......
+     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.127.177 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rules exist in the list.
+
+2. create one more rule::
+
+     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.127.178 / end actions vf id 1 / end
+
+   check the rule can not be created successfully, and
+   testpmd provide a friendly output, showing::
+
+     ice_flow_create(): Failed to create flow
+     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)): switch filter create flow fail: Invalid argument
+
+3. check the rule list
+
+     testpmd> flow list 0
+
+   check the rule in step 2 not exists in the list.
+
+4. send 32563 matched packets for rule 0-32562::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.0")/TCP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1")/TCP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+     ......
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.127.177")/TCP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the 32563 packets.
+   send 1 mismatched packet::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.167.0.1")/TCP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check the packet are not to port 1.
+
+5. verify rules can be destroyed::
+
+     testpmd> flow flush 0
+     testpmd> flow list 0
+
+   check the rules not exist in the list.
+   send 32563 matched packets, check the packets are not to port 1.
+
+
+Test case: flow validation
+==========================
+
+1. validate MAC_IPV4_UDP_PAY::
+
+     testpmd> flow validate 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23 / end actions vf id 1 / end
+
+   get the message::
+
+     Flow rule validated
+
+2. repeat step 1 with MAC_IPV4_PFCP_NODE::
+
+     testpmd> flow validate 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions vf id 1 / end
+
+   get the same result
+
+3. validate unsupported pattern MAC_IPV4_SCTP_PAY::
+
+     testpmd> flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3  / sctp src is 25 dst is 23 / end actions vf id 1 / end
+
+   get the message::
+
+     Invalid input pattern: Invalid argument
+
+4. check the flow list::
+
+     testpmd> flow list 0
+
+   there is no rule listed.
+
+5. validate a rule on invalid vf::
+
+     testpmd> flow validate 1 ingress pattern eth / ipv6 / udp / pfcp s_field is 1 / end actions vf id 1 / end
+
+   get the message::
+
+     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)): Failed to create parser engine.: Invalid argument
+
+6. check the flow list::
+
+     testpmd> flow list 1
+
+   there is no rule listed.
+
+
+Test case: Stress test
+======================
+
+Subcase 1: DCF stop/DCF start
+-----------------------------
+
+1. create MAC_IPV4_UDP_PAY rule::
+
+     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23 / end actions vf id 1 / end
+     testpmd> flow list 0
+
+   check the rule exists in the list.
+
+2. send matched packets::
+
+     sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.2",tos=4,ttl=3)/UDP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0", count=1)
+
+   check port 1 receive the packet.
+
+3. stop the DCF, then start the DCF::
+
+     tetspmd> port stop 0
+     testpmd> port start 0
+
+4. check the rule list::
+
+     testpmd> flow list 0
+
+   check the rule is still there.
+
+5. send matched packets, port 1 can still receive the packets.
-- 
2.17.1


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [dts] [PATCH V1] test_plans: add cvl_dcf_switch_filter_test_plan.rst
  2020-05-22 16:43 [dts] [PATCH V1] test_plans: add cvl_dcf_switch_filter_test_plan.rst Nannan Lu
@ 2020-06-01  3:12 ` Tu, Lijuan
  0 siblings, 0 replies; 2+ messages in thread
From: Tu, Lijuan @ 2020-06-01  3:12 UTC (permalink / raw)
  To: Lu, Nannan, dts; +Cc: Lu, Nannan

Applied, thanks

> -----Original Message-----
> From: dts [mailto:dts-bounces@dpdk.org] On Behalf Of Nannan Lu
> Sent: Saturday, May 23, 2020 12:44 AM
> To: dts@dpdk.org
> Cc: Lu, Nannan <nannan.lu@intel.com>
> Subject: [dts] [PATCH V1] test_plans: add cvl_dcf_switch_filter_test_plan.rst
> 
> Add cvl_dcf_switch_filter_test_plan.rst to test_plans
> 
> Signed-off-by: Nannan Lu <nannan.lu@intel.com>
> ---
>  .../cvl_dcf_switch_filter_test_plan.rst       | 2495 +++++++++++++++++
>  1 file changed, 2495 insertions(+)
>  create mode 100644 test_plans/cvl_dcf_switch_filter_test_plan.rst
> 
> diff --git a/test_plans/cvl_dcf_switch_filter_test_plan.rst
> b/test_plans/cvl_dcf_switch_filter_test_plan.rst
> new file mode 100644
> index 0000000..e22f090
> --- /dev/null
> +++ b/test_plans/cvl_dcf_switch_filter_test_plan.rst
> @@ -0,0 +1,2495 @@
> +.. Copyright (c) <2020>, Intel Corporation
> +   All rights reserved.
> +
> +   Redistribution and use in source and binary forms, with or without
> +   modification, are permitted provided that the following conditions
> +   are met:
> +
> +   - Redistributions of source code must retain the above copyright
> +     notice, this list of conditions and the following disclaimer.
> +
> +   - Redistributions in binary form must reproduce the above copyright
> +     notice, this list of conditions and the following disclaimer in
> +     the documentation and/or other materials provided with the
> +     distribution.
> +
> +   - Neither the name of Intel Corporation nor the names of its
> +     contributors may be used to endorse or promote products derived
> +     from this software without specific prior written permission.
> +
> +   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> CONTRIBUTORS
> +   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> +   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
> FITNESS
> +   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> +   COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
> INDIRECT,
> +   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
> +   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
> GOODS OR
> +   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> +   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> CONTRACT,
> +   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> +   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
> ADVISED
> +   OF THE POSSIBILITY OF SUCH DAMAGE.
> +
> +===========================
> +CVL DCF Switch Filter Tests
> +===========================
> +
> +Description
> +===========
> +
> +This document provides the plan for testing DCF switch filter of CVL,
> including:
> +
> +* Enable DCF switch filter for IPv4/IPv6 + TCP/UDP/IGMP (comm #1 package)
> +* Enable DCF switch filter for tunnel: NVGRE (comm #1 package)
> +* Enable DCF switch filter for PPPOE (comm #1 package)
> +* Enable DCF switch filter for PFCP (comm #1 package)
> +* Enable DCF switch filter for IP/L2 multicast (comm #1 package)
> +* Enable DCF switch filter for ethertype/UDP port/MAC VLAN/VLAN filter
> (comm #1 package)
> +
> +
> +Pattern and input set
> +---------------------
> +
> +  +---------------------+-------------------------------+-----------------------------------------
> --+
> +  |    Packet Types     |           Pattern             |                Input Set                  |
> +
> +=====================+===============================+=========
> ==================================+
> +  |                     | MAC_PAY                       | [Source MAC], [Dest MAC], [Ether
> type]    |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV4_FRAG                 | [Dest MAC], [Source IP], [Dest
> IP],       |
> +  |                     |                               | [TTL], [DSCP]                             |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV4_PAY                  | [Dest MAC], [Source IP], [Dest IP],
> |
> +  |                     |                               | [IP protocol], [TTL], [DSCP]              |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV4_UDP_PAY              | [Dest MAC], [Source IP], [Dest
> IP],       |
> +  |                     |                               | [TTL], [DSCP], [Source Port], [Dest Port] |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |    IPv4/IPv6 + 	| MAC_IPV4_TCP_PAY              | [Dest MAC], [Source
> IP], [Dest IP],       |
> +  |    TCP/UDP/IGMP     |                               | [TTL], [DSCP], [Source Port], [Dest
> Port] |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV4_IGMP                 | [IP protocol]                             |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV6_FRAG_srcip_dstip     | [Source IP], [Dest IP]
> |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV6_FRAG_dstip_tc        | [Dest MAC], [Dest IP], [TC]
> |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV6_PAY_srcip_dstip      | [Source IP], [Dest IP]
> |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV6_PAY_dstip_tc         | [Dest MAC], [Dest IP], [TC]
> |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV6_UDP_PAY              | [Dest MAC], [Dest IP], [TC],
> |
> +  |                     |                               | [Source Port], [Dest Port]                |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV6_TCP                  | [Dest MAC], [Dest IP], [TC],
> |
> +  |                     |                               | [Source Port], [Dest Port]                |
> +  +---------------------+-------------------------------+-----------------------------------------
> --+
> +  |                     | MAC_IPV4_TUN_IPV4_FRAG        | [Out Dest IP],
> [VNI/GRE_KEY],             |
> +  |                     |               	        | [Inner Source IP], [Inner Dest IP]        |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV4_TUN_IPV4_PAY         | [Out Dest IP],
> [VNI/GRE_KEY],             |
> +  |                     |                               | [Inner Source IP], [Inner Dest IP]        |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV4_TUN_IPV4_UDP_PAY     | [Out Dest IP],
> [VNI/GRE_KEY],             |
> +  |                     |                               | [Inner Source IP], [Inner Dest IP],       |
> +  |                     |                               | [Inner Source Port], [Inner Dest Port]    |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV4_TUN_IPV4_TCP         | [Out Dest IP],
> [VNI/GRE_KEY],             |
> +  |                     |                               | [Inner Source IP], [Inner Dest IP],       |
> +  |                     |                               | [Inner Source Port], [Inner Dest Port]    |
> +  |       tunnel:       +-------------------------------+------------------------------------------
> -+
> +  |       NVGRE         | MAC_IPV4_TUN_MAC_IPV4_FRAG    | [Out Dest IP],
> [VNI/GRE_KEY],             |
> +  |                     |                               | [Inner Dest MAC],                         |
> +  |                     |                               | [Inner Source IP], [Inner Dest IP]        |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV4_TUN_MAC_IPV4_PAY     | [Out Dest IP],
> [VNI/GRE_KEY],             |
> +  |                     |                               | [Inner Dest MAC],                         |
> +  |                     |                               | [Inner Source IP], [Inner Dest IP]        |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV4_TUN_MAC_IPV4_UDP_PAY	| [Out Dest IP],
> [VNI/GRE_KEY],             |
> +  |                     |                               | [Inner Dest MAC],                         |
> +  |                     |                               | [Inner Source IP],[Inner Dest IP],        |
> +  |                     |                               | [Inner Source Port], [Inner Dest Port]    |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV4_TUN_MAC_IPV4_TCP     | [Out Dest IP],
> [VNI/GRE_KEY],             |
> +  |                     |                               | [Inner Dest MAC],                         |
> +  |                     |                               | [Inner Source IP], [Inner Dest IP],       |
> +  |                     |                               | [Inner Source Port], [Inner Dest Port]    |
> +  +---------------------+-------------------------------+-----------------------------------------
> --+
> +  |                     | MAC_VLAN_PPPOE_IPV4_PAY       | [Dest MAC], [VLAN],
> [seid],               |
> +  |                     |                               | [pppoe_proto_id]                          |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_VLAN_PPPOE_IPV6_PAY       | [Dest MAC], [VLAN],
> [seid],               |
> +  |        PPPOE        |                               | [pppoe_proto_id]                          |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_PPPOE_IPV4_PAY            | [Dest MAC], [seid],
> [pppoe_proto_id]      |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_PPPOE_IPV6_PAY            | [Dest MAC], [seid],
> [pppoe_proto_id]      |
> +  +---------------------+-------------------------------+-----------------------------------------
> --+
> +  |                     | MAC_IPV4_PFCP_NODE            | [Dest Port], [S-field]
> |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV4_PFCP_SESSION         | [Dest Port], [S-field]
> |
> +  |        PFCP         +-------------------------------+-------------------------------------------
> +
> +  |                     | MAC_IPV6_PFCP_NODE            | [Dest Port], [S-field]
> |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | MAC_IPV6_PFCP_SESSION         | [Dest Port], [S-field]
> |
> +  +---------------------+-------------------------------+-----------------------------------------
> --+
> +  |                     | IP multicast                  | [Dest IP]                                 |
> +  |      multicast      +-------------------------------+-----------------------------------------
> --+
> +  |                     | L2 multicast                  | [Dest MAC]                                |
> +  +---------------------+-------------------------------+-----------------------------------------
> --+
> +  |                     | ethertype filter_PPPOD        | [Ether type]                              |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |   ethertype filter  | ethertype filter_PPPOE        | [Ether type]
> |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | ethertype filter_IPV6         | [Ether type]                              |
> +  +---------------------+-------------------------------+-----------------------------------------
> --+
> +  |                     | UDP port filter_DHCP discovery| [Source Port], [Dest Port]
> |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |   UDP port filter   | UDP port filter_DHCP offer    | [Source Port], [Dest
> Port]                |
> +  |                     +-------------------------------+-------------------------------------------+
> +  |                     | UDP port filter_VXLAN         | [Dest Port]                               |
> +  +---------------------+-------------------------------+-----------------------------------------
> --+
> +  |   MAC VLAN filter   | MAC_VLAN filter               | [Dest MAC], [VLAN]
> |
> +  +---------------------+-------------------------------+-----------------------------------------
> --+
> +  |    VLAN filter      | VLAN filter                   | [VLAN]                                    |
> +  +---------------------+-------------------------------+-----------------------------------------
> --+
> +
> +
> +Supported function type
> +-----------------------
> +
> +* create
> +* validate
> +* destroy
> +* flush
> +
> +
> +Supported action type
> +---------------------
> +
> +* To vf/vsi
> +
> +
> +Prerequisites
> +=============
> +
> +1. Hardware:
> +   columbiaville_25g/columbiaville_100g
> +
> +2. Software:
> +   dpdk: http://dpdk.org/git/dpdk
> +   scapy: http://www.secdev.org/projects/scapy/
> +
> +3. Copy specific ice package to /lib/firmware/updates/intel/ice/ddp/ice.pkg,
> +   then load driver::
> +
> +     rmmod ice
> +     insmod ice.ko
> +
> +4. Compile DPDK::
> +
> +     make -j install T=x86_64-native-linuxapp-gcc
> +
> +5. Get the pci device id of DUT, for example::
> +
> +     ./usertools/dpdk-devbind.py -s
> +
> +     0000:18:00.0 'Device 1593' if=enp24s0f0 drv=ice unused=vfio-pci
> +     0000:18:00.1 'Device 1593' if=enp24s0f1 drv=ice unused=vfio-pci
> +
> +6. Generate 4 VFs on PF0::
> +
> +     echo 4 > /sys/bus/pci/devices/0000:18:00.0/sriov_numvfs
> +
> +     ./usertools/dpdk-devbind.py -s
> +     0000:18:01.0 'Ethernet Adaptive Virtual Function 1889' if=enp24s1
> drv=iavf unused=vfio-pci
> +     0000:18:01.1 'Ethernet Adaptive Virtual Function 1889' if=enp24s1f1
> drv=iavf unused=vfio-pci
> +     0000:18:01.2 'Ethernet Adaptive Virtual Function 1889' if=enp24s1f2
> drv=iavf unused=vfio-pci
> +     0000:18:01.3 'Ethernet Adaptive Virtual Function 1889' if=enp24s1f3
> drv=iavf unused=vfio-pci
> +
> +7. Set VF0 as trust::
> +
> +     ip link set enp24s0f0 vf 0 trust on
> +
> +8. Bind VFs to dpdk driver::
> +
> +     modprobe vfio-pci
> +     ./usertools/dpdk-devbind.py -b vfio-pci 0000:18:01.0 0000:18:01.1
> 0000:18:01.2 0000:18:01.3
> +
> +9. Launch dpdk on VF0 and VF1, and VF0 request DCF mode::
> +
> +     ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w
> 0000:18:01.0,cap=dcf -w 0000:18:01.1 -- -i
> +     testpmd> set portlist 1
> +     testpmd> set fwd rxonly
> +     testpmd> set verbose 1
> +     testpmd> start
> +     testpmd> show port info all
> +
> +   check the VF0 driver is net_ice_dcf.
> +
> +10. on tester side, copy the layer python file to /root::
> +
> +      cp pfcp.py to /root
> +
> +    then import layers when start scapy::
> +
> +      >>> import sys
> +      >>> sys.path.append('/root')
> +      >>> from pfcp import PFCP
> +      >>> from scapy.contrib.igmp import *
> +
> +
> +Test case: MAC_PAY
> +==================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth src is 00:00:00:00:00:01 dst is
> 00:11:22:33:44:55 type is 0x0800 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(src="00:00:00:00:00:01",dst="00:11:22:33:44:55")/IP()/Raw("x"
> *80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp([Ether(src="00:00:00:00:00:02",dst="00:11:22:33:44:55")/IP()/Raw("x"
> *80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether(src="00:00:00:00:00:01",dst="00:11:22:33:44:54")/IP()/Raw("x"
> *80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether(src="00:00:00:00:00:01",dst="00:11:22:33:44:55")/IPv6()/Raw("
> x" *80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_FRAG
> +========================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4
> src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 2 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=2,frag=5)/("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a3")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=2,frag=5)/("X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.4",dst="192.168.0.
> 2",tos=4,ttl=2,frag=5)/("X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 5",tos=4,ttl=2,frag=5)/("X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=5,ttl=2,frag=5)/("X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=3,frag=5)/("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_PAY
> +=======================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4
> src is 192.168.0.1 dst is 192.168.0.2 proto is 6 tos is 4 ttl is 2 / end actions vf id
> 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=2)/TCP()/("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a3")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=2)/TCP()/("X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.4",dst="192.168.0.
> 2",tos=4,ttl=2)/TCP()/("X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 5",tos=4,ttl=2)/TCP()/("X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=5,ttl=2)/TCP()/("X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=3)/TCP()/("X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=2)/UDP()/("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_UDP_PAY
> +===========================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4
> src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23 /
> end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=3)/UDP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0",
> count=1)
> +
> +   check port 1 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=3)/UDP(sport=30,dport=23)/("X"*480)], iface="enp27s0f0",
> count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=3)/UDP(sport=25,dport=19)/("X"*480)], iface="enp27s0f0",
> count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_TCP_PAY
> +===========================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4
> src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / tcp src is 25 dst is 23 / end
> actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=3)/TCP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0",
> count=1)
> +
> +   check port 1 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=3)/TCP(sport=30,dport=23)/("X"*480)], iface="enp27s0f0",
> count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=3)/TCP(sport=25,dport=19)/("X"*480)], iface="enp27s0f0",
> count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_IGMP
> +========================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 proto is 0x02 / end
> actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +     sendp([Ether(dst="00:11:22:33:44:55")/IP()/IGMP()/Raw("X"*480)],
> iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the packet.
> +   send mismatched packets::
> +
> +     sendp([Ether(dst="00:11:22:33:44:55")/IP()/TCP()/Raw("X"*480)],
> iface="enp27s0f0", count=1)
> +     sendp([Ether(dst="00:11:22:33:44:55")/IP()/UDP()/Raw("X"*480)],
> iface="enp27s0f0", count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV6_FRAG_srcip_dstip
> +====================================
> +
> +Description: The maximum input set length of a switch rule is 32 bytes.
> +Therefore, if a rule carries src ipv6, dst ipv6, it can not take any other fields.
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv6 src is
> CDCD:910A:2222:5498:8475:1111:3900:1536 dst is
> CDCD:910A:2222:5498:8475:1111:3900:2022 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1536",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/IPv6ExtHdrFragment()/("
> X"*480)], iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1537",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/IPv6ExtHdrFragment()/("
> X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1536",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2023")/IPv6ExtHdrFragment()/("
> X"*480)], iface="enp27s0f0", count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV6_FRAG_dstip_tc
> +=================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv6
> dst is CDCD:910A:2222:5498:8475:1111:3900:2020 tc is 3 / end actions vf id 1
> / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/IPv6ExtHdrFragmen
> t()/("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a3")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/IPv6ExtHdrFragmen
> t()/("X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2023",tc=3)/IPv6ExtHdrFragmen
> t()/("X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=4)/IPv6ExtHdrFragmen
> t()/("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV6_PAY_srcip_dstip
> +===================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv6 src is
> CDCD:910A:2222:5498:8475:1111:3900:1536 dst is
> CDCD:910A:2222:5498:8475:1111:3900:2020 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1536",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/("X"*480)],
> iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1537",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/("X"*480)],
> iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1536",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2023")/("X"*480)],
> iface="enp27s0f0", count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV6_PAY_dstip_tc
> +================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv6
> dst is CDCD:910A:2222:5498:8475:1111:3900:2020 tc is 3 / end actions vf id 1
> / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/("X"*480)],
> iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a3")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/("X"*480)],
> iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2023",tc=3)/("X"*480)],
> iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=4)/("X"*480)],
> iface="enp27s0f0", count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV6_UDP_PAY
> +===========================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv6
> dst is CDCD:910A:2222:5498:8475:1111:3900:2020 tc is 3 / udp src is 25 dst is
> 23 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/UDP(sport=25,dport
> =23)/("X"*480)], iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/UDP(sport=30,dport
> =23)/("X"*480)], iface="enp27s0f0",count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/UDP(sport=25,dport
> =19)/("X"*480)], iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV6_TCP
> +=======================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv6
> dst is CDCD:910A:2222:5498:8475:1111:3900:2020 tc is 3 / tcp src is 25 dst is
> 23 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/TCP(sport=25,dport
> =23)/("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/TCP(sport=30,dport
> =23)/("X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/TCP(sport=25,dport
> =19)/("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_VXLAN_IPV4_FRAG (not support in 20.05)
> +==========================================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp
> / vxlan vni is 2 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf
> id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.2",
> dst="192.168.0.3",frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.2",
> dst="192.168.0.3",frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.2")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.2",
> dst="192.168.0.3",frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=3)/Ether()/IP(src="19
> 2.168.0.2",
> dst="192.168.0.3",frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.4",
> dst="192.168.0.3",frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.2",
> dst="192.168.0.5",frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_VXLAN_IPV4_PAY (not support in 20.05)
> +=========================================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp
> / vxlan vni is 2 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / end actions vf
> id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.2",
> dst="192.168.0.3")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.2", dst="192.168.0.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.2")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.2",
> dst="192.168.0.3")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=3)/Ether()/IP(src="19
> 2.168.0.2",
> dst="192.168.0.3")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.4",
> dst="192.168.0.3")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.2",
> dst="192.168.0.5")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_VXLAN_IPV4_UDP_PAY (not support in 20.05)
> +=============================================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp
> / vxlan vni is 2 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / udp src is 50
> dst is 23 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.2", dst="192.168.0.3")/UDP(sport=50,dport=23)
> /Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.2", dst="192.168.0.3")/UDP(sport=20,dport=23)
> /Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.2", dst="192.168.0.3")/UDP(sport=50,dport=19)
> /Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_VXLAN_IPV4_TCP (not support in 20.05)
> +=========================================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp
> / vxlan vni is 2 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / tcp src is 50
> dst is 23 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.2",
> dst="192.168.0.3")/TCP(sport=50,dport=23)/Raw("x"*80)],iface="enp27s0f0"
> ,count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.2",
> dst="192.168.0.3")/TCP(sport=29,dport=23)/Raw("x"*80)],iface="enp27s0f0"
> ,count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.2",
> dst="192.168.0.3")/TCP(sport=50,dport=100)/Raw("x"*80)],iface="enp27s0f0
> ",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_VXLAN_MAC_IPV4_FRAG (not support in 20.05)
> +==============================================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp
> / vxlan vni is 2 / eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.2 dst is
> 192.168.0.3 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2",
> dst="192.168.0.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2",
> dst="192.168.0.3" ,frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.2")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2",
> dst="192.168.0.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=3)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2",
> dst="192.168.0.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a9")/IP(src="192.168.0.2",
> dst="192.168.0.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.4",
> dst="192.168.0.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2",
> dst="192.168.0.5" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_VXLAN_MAC_IPV4_PAY (not support in 20.05)
> +=============================================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp
> / vxlan vni is 2 / eth dst is 68:05:ca:8d:ed:a8  / ipv4 src is 192.168.0.2 dst is
> 192.168.0.3 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3") /TCP()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3")/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.2")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3") /TCP()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=3)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.3") /TCP()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a9")/IP(src="192.168.0.2", dst="192.168.0.3") /TCP()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.4", dst="192.168.0.3") /TCP()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2", dst="192.168.0.5") /TCP()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_VXLAN_MAC_IPV4_UDP_PAY (not support in 20.05)
> +===============================================================
> ==
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp
> / vxlan vni is 2 / eth dst is 68:05:ca:8d:ed:a8  / ipv4 src is 192.168.0.2 dst is
> 192.168.0.3 / udp src is 50 dst is 23 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2",
> dst="192.168.0.3")/UDP(sport=50,dport=23)/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2",
> dst="192.168.0.3")/UDP(sport=20,dport=23)/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2",
> dst="192.168.0.3")/UDP(sport=50,dport=29)/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_VXLAN_MAC_IPV4_TCP (not support in 20.05)
> +=============================================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp
> / vxlan vni is 2 / eth dst is 68:05:ca:8d:ed:a8  / ipv4 src is 192.168.0.2 dst is
> 192.168.0.3 / tcp src is 25 dst is 23 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2",
> dst="192.168.0.3")/TCP(sport=25,dport=23)/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2",
> dst="192.168.0.3")/TCP(sport=20,dport=23)/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether(dst="68:05:
> ca:8d:ed:a8")/IP(src="192.168.0.2",
> dst="192.168.0.3")/TCP(sport=25,dport=19)/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_NVGRE_IPV4_FRAG
> +===================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 /
> nvgre tni is 2 / eth / ipv4 src is 192.168.1.2 dst is 192.168.1.3 / end actions vf
> id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.
> 1.2",
> dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.
> 1.2", dst="192.168.1.3" ,frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.2")/NVGRE(TNI=2)/Ether()/IP(src="192.168.
> 1.2",
> dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=3)/Ether()/IP(src="192.168.
> 1.2",
> dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.
> 1.4",
> dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.
> 1.2",
> dst="192.168.1.5" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_NVGRE_IPV4_PAY
> +==================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 /
> nvgre tni is 2 / eth / ipv4 src is 192.168.1.2 dst is 192.168.1.3 / end actions vf
> id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.
> 1.2", dst="192.168.1.3")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.
> 1.2", dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.2")/NVGRE(TNI=2)/Ether()/IP(src="192.168.
> 1.2", dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=3)/Ether()/IP(src="192.168.
> 1.2", dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.
> 1.4", dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.
> 1.2", dst="192.168.1.5")/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +Test case: MAC_IPV4_NVGRE_IPV4_UDP_PAY
> +======================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 /
> nvgre tni is 0x8 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / udp src is 50
> dst is 23 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=0x8)/Ether()/IP(src="192.1
> 68.0.2", dst="192.168.0.3")/UDP(sport=50,dport=23)/Raw("x"*80)],
> iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=0x8)/Ether()/IP(src="192.1
> 68.0.2", dst="192.168.0.3")/UDP(sport=20,dport=23)/Raw("x"*80)],
> iface="enp27s0f0", count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=0x8)/Ether()/IP(src="192.1
> 68.0.2", dst="192.168.0.3")/UDP(sport=50,dport=19)/Raw("x"*80)],
> iface="enp27s0f0", count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +Test case: MAC_IPV4_NVGRE_IPV4_TCP
> +==================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 /
> nvgre tni is 2 / eth / ipv4 src is 192.168.1.2 dst is 192.168.1.3 / tcp src is 25 dst
> is 23 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.
> 1.2",
> dst="192.168.1.3")/TCP(sport=25,dport=23)/Raw("x"*80)],iface="enp27s0f0"
> ,count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.
> 1.2",
> dst="192.168.1.3")/TCP(sport=20,dport=23)/Raw("x"*80)],iface="enp27s0f0"
> ,count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.
> 1.2",
> dst="192.168.1.3")/TCP(sport=25,dport=39)/Raw("x"*80)],iface="enp27s0f0"
> ,count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_NVGRE_MAC_IPV4_FRAG
> +=======================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 /
> nvgre tni is 2 / eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.1.2 dst is
> 192.168.1.3 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:
> ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:
> ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.3" ,frag=5)/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.2")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:
> ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=3)/Ether(dst="68:05:ca:8d:
> ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:
> ed:a9")/IP(src="192.168.1.2",
> dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:
> ed:a8")/IP(src="192.168.1.4",
> dst="192.168.1.3" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:
> ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.5" ,frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_NVGRE_MAC_IPV4_PAY
> +======================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 /
> nvgre tni is 2 / eth dst is 68:05:ca:8d:ed:a8  / ipv4 src is 192.168.1.2 dst is
> 192.168.1.3 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:
> ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.3")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:
> ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.2")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:
> ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=3)/Ether(dst="68:05:ca:8d:
> ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:
> ed:a9")/IP(src="192.168.1.2",
> dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:
> ed:a8")/IP(src="192.168.1.4",
> dst="192.168.1.3")/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:
> ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.5")/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_NVGRE_MAC_IPV4_UDP_PAY
> +==========================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 /
> nvgre tni is 0x8 /  eth dst is 68:05:ca:8d:ed:a8  / ipv4 src is 192.168.1.2 dst is
> 192.168.1.3 / udp src is 25 dst is 23 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=0x8)/Ether(dst="68:05:ca:8
> d:ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.3")/UDP(sport=25,dport=23)/Raw("x"*80)],
> iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=0x8)/Ether(dst="68:05:ca:8
> d:ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.3")/UDP(sport=2,dport=23)/Raw("x"*80)], iface="enp27s0f0",
> count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=0x8)/Ether(dst="68:05:ca:8
> d:ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.3")/UDP(sport=25,dport=20)/Raw("x"*80)],
> iface="enp27s0f0", count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +Test case: MAC_IPV4_NVGRE_MAC_IPV4_TCP
> +======================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 /
> nvgre tni is 2 / eth dst is 68:05:ca:8d:ed:a8  / ipv4 src is 192.168.1.2 dst is
> 192.168.1.3 / tcp src is 25 dst is 23 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:
> ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.3")/TCP(sport=25,dport=23)/Raw("x"*80)],iface="enp27s0f0"
> ,count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:
> ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.3")/TCP(sport=1,dport=23)/Raw("x"*80)],iface="enp27s0f0",c
> ount=1)
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether(dst="68:05:ca:8d:
> ed:a8")/IP(src="192.168.1.2",
> dst="192.168.1.3")/TCP(sport=25,dport=20)/Raw("x"*80)],iface="enp27s0f0"
> ,count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_VLAN_PPPOE_IPV4_PAY
> +==================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan
> tci is 1 / pppoes seid is 3 / pppoe_proto_id is 0x0021 / end actions vf id 1 /
> end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8
> 864)/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:54",type=0x8100)/Dot1Q(vlan=1,type=0x8
> 864)/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8
> 864)/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8
> 864)/PPPoE(sessionid=4)/PPP(proto=0x0021)/IP()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8
> 864)/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_VLAN_PPPOE_IPV6_PAY
> +==================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan
> tci is 1 / pppoes seid is 3 / pppoe_proto_id is 0x0057 / end actions vf id 1 /
> end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8
> 864)/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:54",type=0x8100)/Dot1Q(vlan=1,type=0x8
> 864)/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2,type=0x8
> 864)/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8
> 864)/PPPoE(sessionid=4)/PPP(proto=0x0057)/IPv6()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8
> 864)/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP()/Raw("x" *
> 80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_PPPOE_IPV4_PAY
> +=============================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 /
> pppoes seid is 3 / pppoe_proto_id is 0x0021 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8864)/PPPoE(sessionid=3)/PPP
> (proto=0x0021)/IP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:54",type=0x8864)/PPPoE(sessionid=3)/PPP
> (proto=0x0021)/IP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8864)/PPPoE(sessionid=4)/PPP
> (proto=0x0021)/IP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8864)/PPPoE(sessionid=3)/PPP
> (proto=0x0057)/IPv6()/Raw("x" * 80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_PPPOE_IPV6_PAY
> +=============================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 /
> pppoes seid is 3 / pppoe_proto_id is 0x0057 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8864)/PPPoE(sessionid=3)/PPP
> (proto=0x0057)/IPv6()/Raw("x" * 80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:54",type=0x8864)/PPPoE(sessionid=3)/PPP
> (proto=0x0057)/IPv6()/Raw("x" * 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8864)/PPPoE(sessionid=4)/PPP
> (proto=0x0057)/IPv6()/Raw("x" * 80)],iface="enp27s0f0",count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8864)/PPPoE(sessionid=3)/PPP
> (proto=0x0021)/IP()/Raw("x" * 80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_PFCP_NODE
> +=============================
> +
> +1. DUT create switch filter rules for MAC_IPV4_PFCP_NODE to VF1::
> +
> +    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end
> actions vf id 1 / end
> +
> +   check the rule exists in the list.
> +
> +    testpmd> flow list 0
> +    ID      Group   Prio    Attr    Rule
> +    0       0       0       i--     ETH IPV4 UDP PFCP => VF
> +
> +2. send matched packets::
> +
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=0),i
> face="enp134s0f1")
> +
> +   check port 1 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=1),i
> face="enp134s0f1")
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=
> 0),iface="enp134s0f1")
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=
> 1),iface="enp134s0f1")
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_IPV4_PFCP_SESSION
> +================================
> +
> +1. DUT create switch filter rules for MAC_IPV4_PFCP_SESSION to VF2::
> +
> +    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 / end
> actions vf id 2 / end
> +
> +   check the rule exists in the list.
> +
> +    testpmd> flow list 0
> +    ID      Group   Prio    Attr    Rule
> +    0       0       0       i--     ETH IPV4 UDP PFCP => VF
> +
> +2. send matched packets::
> +
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=1),i
> face="enp134s0f1")
> +
> +   check port 2 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=0),i
> face="enp134s0f1")
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=
> 0),iface="enp134s0f1")
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=
> 1),iface="enp134s0f1")
> +
> +   check the packets are not to port 2.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 2.
> +
> +
> +Test case: MAC_IPV6_PFCP_NODE
> +=============================
> +
> +1. DUT create switch filter rules for MAC_IPV6_PFCP_NODE to VF3::
> +
> +    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 0 / end
> actions vf id 3 / end
> +
> +   check the rule exists in the list.
> +
> +    testpmd> flow list 0
> +    ID      Group   Prio    Attr    Rule
> +    0       0       0       i--     ETH IPV6 UDP PFCP => VF
> +
> +2. send matched packets::
> +
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=
> 0),iface="enp134s0f1")
> +
> +   check port 3 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=0),i
> face="enp134s0f1")
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=1),i
> face="enp134s0f1")
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=
> 1),iface="enp134s0f1")
> +
> +   check the packets are not to port 3.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 3.
> +
> +
> +Test case: MAC_IPV6_PFCP_SESSION
> +================================
> +
> +1. DUT create switch filter rules for MAC_IPV6_PFCP_SESSION to VF1::
> +
> +    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 1 / end
> actions vf id 1 / end
> +
> +   check the rule exists in the list.
> +
> +    testpmd> flow list 0
> +    ID      Group   Prio    Attr    Rule
> +    0       0       0       i--     ETH IPV6 UDP PFCP => VF
> +
> +2. send matched packets::
> +
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=
> 1),iface="enp134s0f1")
> +
> +   check port 1 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=0),i
> face="enp134s0f1")
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=1),i
> face="enp134s0f1")
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=
> 0),iface="enp134s0f1")
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: QinQ (not supported in 20.05)
> +========================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / vlan tci is 1 / vlan tci is 2 /
> end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8100,vla
> n=1)/Dot1Q(type=0x0800,vlan=2)/IP(src="192.168.0.1",dst="192.168.0.2")/R
> aw("X"*480)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8100,vla
> n=3)/Dot1Q(type=0x0800,
> vlan=2)/IP(src="192.168.0.1",dst="192.168.0.2")/Raw("X"*480)],iface="enp27
> s0f0",count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(type=0x8100,vla
> n=1)/Dot1Q(type=0x0800,
> vlan=5)/IP(src="192.168.0.1",dst="192.168.0.2")/Raw("X"*480)],iface="enp27
> s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +Test case: IP multicast
> +=======================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst spec 224.0.0.0 dst
> mask 240.0.0.0 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +     sendp([Ether()/IP(dst="239.0.0.0")/TCP()/Raw("x"*80)],
> iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +     sendp([Ether()/IP(dst="128.0.0.0")/TCP()/Raw("x"*80)],
> iface="enp27s0f0", count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: L2 multicast
> +=======================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst spec 01:00:5e:00:00:00 dst
> mask ff:ff:ff:80:00:00 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +     sendp([Ether(dst="01:00:5e:7f:00:00")/IP()/TCP()/Raw("x"*80)],
> iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +     sendp([Ether(dst="01:00:5e:ff:00:00")/IP()/TCP()/Raw("x"*80)],
> iface="enp27s0f0", count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: ethertype filter_PPPOD
> +=================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth type is 0x8863 / end actions vf
> id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +     sendp([Ether(dst="00:11:22:33:44:55")/PPPoED()/PPP()/IP()/Raw("x"
> *80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +     sendp([Ether(dst="00:11:22:33:44:55")/PPPoE()/PPP()/IP()/Raw("x"
> *80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: ethertype filter_PPPOE
> +=================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth type is 0x8864 / end actions vf
> id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55")/PPPoE()/PPP()/IP()/Raw("x"*80)],ifac
> e="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55")/PPPoED()/PPP()/IP()/Raw("x"*80)],ifa
> ce="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: ethertype filter_IPV6
> +=================================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth type is 0x86dd / end actions vf
> id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:847
> 5:1111:3900:2020", tc=3)/TCP(dport=23)/("X"*480)], iface="enp27s0f0",
> count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1,type=0x8
> 6dd)/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020",
> tc=3)/TCP(dport=23)/("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +     sendp([Ether(dst="00:11:22:33:44:55")/IP()/TCP(dport=23)/("X"*480)],
> iface="enp27s0f0", count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +Test case: UDP port filter_DHCP discovery
> +=========================================
> +
> +Description: The udp port used by DHCP server is 67, and 68 by DHCP client.
> +Therefore, for DHCP discovery packets, the udp srcport is 68 and the
> dstport is 67.
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 / udp src is 68 dst is 67 /
> end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=68,dport=67)/BOOTP(
> chaddr="3c:fd:fe:b2:43:90")/DHCP(options=[("message-
> type","discover"),"end"])/Raw("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=63,dport=67)/BOOTP(
> chaddr="3c:fd:fe:b2:43:90")/DHCP(options=[("message-
> type","discover"),"end"])/Raw("X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=68,dport=69)/BOOTP(
> chaddr="3c:fd:fe:b2:43:90")/DHCP(options=[("message-
> type","discover"),"end"])/Raw("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: UDP port filter_DHCP offer
> +=====================================
> +
> +Description: For DHCP offer packets, the udp srcport is 67 and the dstport is
> 68.
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 / udp src is 67 dst is 68 /
> end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=67,dport=68)/BOOTP(
> chaddr="3c:fd:fe:b2:43:90",yiaddr="192.168.1.0")/DHCP(options=[("message
> -type","offer"),"end"])/Raw("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=63,dport=68)/BOOTP(
> chaddr="3c:fd:fe:b2:43:90",yiaddr="192.168.1.0")/DHCP(options=[("message
> -type","offer"),"end"])/Raw("X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=67,dport=63)/BOOTP(
> chaddr="3c:fd:fe:b2:43:90",yiaddr="192.168.1.0")/DHCP(options=[("message
> -type","offer"),"end"])/Raw("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: UDP port filter_VXLAN
> +================================
> +
> +Description: The UDP dst port number used by VXLAN is 4789.
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 / udp dst is 4789 / end
> actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/UDP()/VXLAN(vni=2)/Ether()/IP(src="19
> 2.168.0.2",
> dst="192.168.0.3",frag=5)/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=2)/Ether()/IP(src="192.168.
> 1.2", dst="192.168.1.3")/TCP()/Raw("x"*80)],iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: MAC_VLAN filter
> +==========================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / vlan
> tci is 1 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1)/IP(src="
> 192.168.0.1",dst="192.168.0.2",tos=4,ttl=2)/TCP()/Raw("X"*480)],iface="enp
> 27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:54",type=0x8100)/Dot1Q(vlan=1)/IP(src="
> 192.168.0.1",dst="192.168.0.2",tos=4,ttl=2)/TCP()/Raw("X"*480)],iface="enp
> 27s0f0",count=1)
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2)/IP(src="
> 192.168.0.1",dst="192.168.0.2",tos=4,ttl=2)/TCP()/Raw("X"*480)],iface="enp
> 27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: VLAN filter
> +======================
> +
> +1. create a rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / vlan tci is 1 / end actions vf
> id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=1)/IP(src="
> 192.168.0.1",dst="192.168.0.2",tos=4,ttl=2)/TCP()/Raw("X"*480)],iface="enp
> 27s0f0",count=1)
> +
> +   check port 1 receive the packets.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)/Dot1Q(vlan=2)/IP(src="
> 192.168.0.1",dst="192.168.0.2",tos=4,ttl=2)/TCP()/Raw("X"*480)],iface="enp
> 27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: negative cases
> +=========================
> +
> +Subcase 1: actions vf id 0
> +--------------------------
> +
> +1. action to vf 0, the rule can be created, but not take effect::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4
> src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / tcp src is 25 dst is 23 / end
> actions vf id 0 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packet::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=3)/TCP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0",
> count=1)
> +
> +   check the packet not to port 0, the rule doesn't take effect.
> +
> +Subcase 2: can not create rule on vf 1
> +--------------------------------------
> +
> +1. create rule on vf 1::
> +
> +     testpmd> flow create 1 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4
> src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23 /
> end actions vf id 1 / end
> +     iavf_flow_create(): Failed to create flow
> +     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)):
> Failed to create parser engine.: Invalid argument
> +
> +   check the rule can not be created successfully.
> +
> +2. list the rule::
> +
> +     testpmd> flow list 1
> +
> +   there is no rule listed.
> +
> +Subcase 3: unsupported pattern in comms
> +---------------------------------------
> +
> +1. create an SCTP rule which is not supported in comms::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst is
> 192.168.0.3  / sctp src is 25 dst is 23 / end actions vf id 1 / end
> +
> +2. check the rule can not be created successfully,
> +   and testpmd provide a friendly output, showing::
> +
> +     ice_flow_create(): Failed to create flow
> +     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)):
> Invalid input pattern: Invalid argument
> +
> +3. check the rule list::
> +
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +
> +Subcase 4: unsupported pattern in os default, but supported in comms
> +--------------------------------------------------------------------
> +
> +1. load os default package and launch testpmd as step 3-8 in Prerequisites.
> +
> +2. create a pppoe rule which is not supported in os default ::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 /
> pppoes seid is 3 / pppoe_proto_id is 0x0021 / end actions vf id 1 / end
> +
> +3. check the rule can not be created successfully, and
> +   testpmd should provide a friendly output, showing::
> +
> +     ice_flow_create(): Failed to create flow
> +     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)):
> Invalid input pattern: Invalid argument
> +
> +4. check the rule list::
> +
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +
> +5. repeat step 2-5 with also not supported pattern MAC_IPV4_PFCP_NODE,
> get the same result.
> +
> +Subcase 5: unsupported input set
> +--------------------------------
> +
> +1. create an nvgre rule with unsupported input set field [inner tos]::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 /
> nvgre tni is 2 / eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.1.2 dst is
> 192.168.1.3 tos is 4 / end actions vf id 1 / end
> +
> +2. check the rule can not be created successfully, and
> +   testpmd should provide a friendly output, showing::
> +
> +     ice_flow_create(): Failed to create flow
> +     port_flow_complain(): Caught PMD error type 10 (item specification):
> cause: 0x7ffcccb26a68, Invalid input set: Invalid argument
> +
> +3. check the rule list::
> +
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +
> +Subcase 6: invalid vf id
> +------------------------
> +
> +1. create a rule with invalid vf id 5::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4
> src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / tcp src is 25 dst is 23 / end
> actions vf id 5 / end
> +
> +2. check the rule can not be created successfully, and
> +   testpmd provide a friendly output, showing::
> +
> +     ice_flow_create(): Failed to create flow
> +     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)):
> switch filter create flow fail: Invalid argument
> +
> +3. check the rule list::
> +
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +
> +Subcase 7: delete a non-existing rule
> +-------------------------------------
> +
> +1. check the rule list::
> +
> +     testpmd> flow list 0
> +
> +   check no rule exists in the list.
> +
> +2. destroy the rule 0::
> +
> +     testpmd> flow destroy 0 rule 0
> +
> +   check no error reports.
> +
> +3. flush rules::
> +
> +     testpmd> flow flush 0
> +
> +   check no error reports.
> +
> +Subcase 8: add long switch rule
> +-------------------------------
> +
> +Description: A recipe has 5 words, one of which is reserved for switch ID,
> +so a recipe can use 4 words, and a maximum of 5 recipes can be chained,
> +one of which is reserved. Therefore, a rule can use up to 4*4*2 = 32 bytes.
> +This case is used to test that a rule whose input set is longer than 32
> +bytes can not be created successfully, and will not affect the creation of
> +other rules.
> +
> +1. create a rule with input set length longer than 32 bytes::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv6 src is
> CDCD:910A:2222:5498:8475:1111:3900:1536 dst is
> CDCD:910A:2222:5498:8475:1111:3900:2022 tc is 3 / end actions vf id 1 / end
> +
> +2. check the rule can not be created successfully, and
> +   testpmd provide a friendly output, showing::
> +
> +     ice_flow_create(): Failed to create flow
> +     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)):
> switch filter create flow fail: Invalid argument
> +
> +3. check the rule list::
> +
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +
> +4. create a MAC_IPV6_UDP_PAY rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv6
> dst is CDCD:910A:2222:5498:8475:1111:3900:2020 tc is 3 / udp src is 25 dst is
> 23 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +5. send matched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/UDP(sport=25,dport
> =23)/("X"*480)], iface="enp27s0f0",count=1)
> +
> +   check port 1 receive the packet.
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/UDP(sport=30,dport
> =23)/("X"*480)], iface="enp27s0f0",count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IPv6(src="CDCD:910A:2222:5498:847
> 5:1111:3900:1518",
> dst="CDCD:910A:2222:5498:8475:1111:3900:2020",tc=3)/UDP(sport=25,dport
> =19)/("X"*480)], iface="enp27s0f0",count=1)
> +
> +   check the packets are not to port 1.
> +
> +6. verify rules can be destroyed::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test Case: multirules test
> +==========================
> +
> +Subcase 1: add existing rules but with different vfs (not support in 20.05)
> +---------------------------------------------------------------------------
> +
> +1. Launch dpdk on VF0, VF1 and VF2, and VF0 request DCF mode::
> +
> +     ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w
> 0000:18:01.0,cap=dcf -w 0000:18:01.1 -w 0000:18:01.2 -- -i
> +     testpmd> set portlist 1,2
> +     testpmd> set fwd rxonly
> +     testpmd> set verbose 1
> +     testpmd> start
> +
> +2. create rules with same pattern items but to different vfs::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4
> src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23 /
> end actions vf id 1 / end
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4
> src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23 /
> end actions vf id 2 / end
> +     testpmd> flow list 0
> +
> +   check both rules exist in the list.
> +
> +3. send matched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=3)/UDP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0",
> count=1)
> +
> +   check both port 1 and 2 receive the packet.
> +
> +4. destroy the rule 0, and send the matched packets::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check only rule 1 exists in the list.
> +   send the same matched packets, check only port 2 receives the packets.
> +
> +5. destroy rule 1, send the matched packets::
> +
> +     testpmd> flow destroy 0 rule 1
> +     testpmd> flow list 0
> +
> +   check no rule exists in the list
> +   send the same matched packets, check the packets are not to port 1 and 2.
> +
> +Subcase 2: add existing rules with the same vfs
> +-----------------------------------------------
> +
> +1. create two indentical rules::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4
> src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23 /
> end actions vf id 1 / end
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4
> src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23 /
> end actions vf id 1 / end
> +
> +2. check the first rule is created successfully, and
> +   the second one can not be created successfully,
> +   and testpmd provide a friendly output, showing::
> +
> +     ice_flow_create(): Failed to create flow
> +     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)):
> switch filter create flow fail: Invalid argument
> +
> +3. check the rule list::
> +
> +     testpmd> flow list 0
> +
> +   check only the first rule exists in the list.
> +
> +Subcase 3: add two rules with one rule's input set included in the other
> +-------------------------------------------------------------------------
> +
> +1. Launch dpdk on VF0, VF1 and VF2, and VF0 request DCF mode::
> +
> +     ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w
> 0000:18:01.0,cap=dcf -w 0000:18:01.1 -w 0000:18:01.2 -- -i
> +     testpmd> set portlist 1,2
> +     testpmd> set fwd rxonly
> +     testpmd> set verbose 1
> +     testpmd> start
> +
> +2. create rules with one rule's input set included in the other::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4
> src is 192.168.0.1 / end actions vf id 1 / end
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4
> src is 192.168.0.1 dst is 192.168.0.2 / end actions vf id 2 / end
> +     testpmd> flow list 0
> +
> +   check both rules exist in the list.
> +
> +3. send a packet p0 that matches both rules::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2")/("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check both port 1 and 2 receive the packet.
> +   send a packet that only matches the rule 0 but not rule 1::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 3")/("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check only port 1 receives the packet.
> +
> +4. destroy the rule 0, and send the packet p0::
> +
> +     testpmd> flow destroy 0 rule 0
> +     testpmd> flow list 0
> +
> +   check only rule 1 exists in the list.
> +   send the matched packet p0, check only port 2 receives the packet.
> +
> +5. destroy rule 1, send the packet p0::
> +
> +     testpmd> flow destroy 0 rule 1
> +     testpmd> flow list 0
> +
> +   check no rule exists in the list.
> +   send the matched packet p0, check the packet are not to port 1 and 2.
> +
> +Subcase 4: different input set, same vf id
> +------------------------------------------
> +
> +1. DUT create switch filter rules for MAC_IPV4_PFCP_SESSION and
> MAC_IPV4_PFCP_NODE to VF1::
> +
> +    testpmd> flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 /
> end actions vf id 1 / end
> +    Flow rule #0 created
> +    testpmd> flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 /
> end actions vf id 1 / end
> +    Flow rule #1 created
> +
> +   check the rule exists in the list.
> +
> +    testpmd> flow list 0
> +    ID      Group   Prio    Attr    Rule
> +    0       0       0       i--     ETH IPV4 UDP PFCP => VF
> +    1       0       0       i--     ETH IPV4 UDP PFCP => VF
> +
> +2. send matched packets::
> +
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=0),i
> face="enp134s0f1")
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=1),i
> face="enp134s0f1")
> +
> +   check port 1 receive the two packets.
> +   send mismatched packets::
> +
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=
> 1),iface="enp134s0f1")
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=
> 0),iface="enp134s0f1")
> +
> +   check the packets are not to port 1.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow flush 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +Subcase 5: different input set, different vf id
> +-----------------------------------------------
> +
> +1. DUT create switch filter rules for MAC_IPV4_PFCP_SESSION and
> MAC_IPV4_PFCP_NODE to VF1::
> +
> +    testpmd> flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 /
> end actions vf id 1 / end
> +    Flow rule #0 created
> +    testpmd> flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 /
> end actions vf id 2 / end
> +    Flow rule #1 created
> +
> +   check the rule exists in the list.
> +
> +    testpmd> flow list 0
> +    ID      Group   Prio    Attr    Rule
> +    0       0       0       i--     ETH IPV4 UDP PFCP => VF
> +    1       0       0       i--     ETH IPV4 UDP PFCP => VF
> +
> +2. send matched packets::
> +
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=0),i
> face="enp134s0f1")
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IP()/UDP(dport=8805)/PFCP(Sfield=1),i
> face="enp134s0f1")
> +
> +   check port 1 receive the first packet, port 2 receive the second packet.
> +   send mismatched packets::
> +
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=
> 1),iface="enp134s0f1")
> +
> sendp(Ether(dst="00:11:22:33:44:11")/IPv6()/UDP(dport=8805)/PFCP(Sfield=
> 0),iface="enp134s0f1")
> +
> +   check the packets are not to port 1 or port 2.
> +
> +3. verify rules can be destroyed::
> +
> +     testpmd> flow flush 0
> +     testpmd> flow list 0
> +
> +   check the rule not exists in the list.
> +   send matched packets, check the packets are not to port 1 or port 2.
> +
> +
> +Test case: test forwarding with single vf
> +=========================================
> +
> +Description: This case is used to test the packets that match switch filter
> rules can be
> +received and forwarded when there is one vf for forwarding, and no
> packets are dropped.
> +
> +1. set the forwarding mode to mac::
> +
> +     testpmd> set fwd mac
> +
> +2. create a rule with input set [Source IP], [Dest IP]::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.1 dst is
> 192.168.0.2 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list
> +
> +3. send matched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2")/("X"*480)], iface="enp27s0f0", count=1)
> +
> +4. check port 1 receives the packet and forward it, and no packets are
> dropped::
> +
> +     testpmd> stop
> +     ---------------------- Forward statistics for port 1  ----------------------
> +     RX-packets: 1              RX-dropped: 0             RX-total: 1
> +     TX-packets: 1              TX-dropped: 0             TX-total: 1
> +    ----------------------------------------------------------------------------
> +
> +    +++++++++++++++ Accumulated forward statistics for all
> ports+++++++++++++++
> +    RX-packets: 1              RX-dropped: 0             RX-total: 1
> +    TX-packets: 1              TX-dropped: 0             TX-total: 1
> +
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++
> +
> +   check the RX-packets and TX-packets of port 1 are both 1, and the TX-
> dropped in
> +   "Accumulated forward statistics for all ports" is 0.
> +
> +
> +Test case: test forwarding with multi vfs
> +=========================================
> +
> +Description: This case is used to test the packets that match switch filter
> rules
> +can be received and forwarded when there are multi vfs for forwarding,
> and no packets
> +are dropped.
> +
> +1. Launch dpdk on VF0, VF1 and VF2, and VF0 request DCF mode::
> +
> +     ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w
> 0000:18:01.0,cap=dcf -w 0000:18:01.1 -w 0000:18:01.2 -- -i
> +     testpmd> set portlist 1,2
> +     testpmd> set fwd mac
> +     testpmd> set verbose 1
> +     testpmd> start
> +
> +2. create a rule with input set [Source IP], [Dest IP]::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.1 dst is
> 192.168.0.2 / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list
> +
> +3. send matched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2")/("X"*480)], iface="enp27s0f0", count=1)
> +
> +4. check port 1 receives the packet, and forward it to port 2, and no packets
> are dropped::
> +
> +     testpmd> stop
> +     ---------------------- Forward statistics for port 1  ----------------------
> +     RX-packets: 1         RX-dropped: 0             RX-total: 1
> +     TX-packets: 0         TX-dropped: 0             TX-total: 0
> +     ----------------------------------------------------------------------------
> +
> +     ---------------------- Forward statistics for port 2  ----------------------
> +     RX-packets: 0              RX-dropped: 0             RX-total: 0
> +     TX-packets: 1              TX-dropped: 0             TX-total: 1
> +     ----------------------------------------------------------------------------
> +
> +     +++++++++++++++ Accumulated forward statistics for all
> ports+++++++++++++++
> +     RX-packets: 1              RX-dropped: 0             RX-total: 1
> +     TX-packets: 1              TX-dropped: 0             TX-total: 1
> +
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++
> +
> +
> +   check the RX-packets of port 1 is 1, the TX-packets of port 2 is 1, and the
> TX-dropped in
> +   "Accumulated forward statistics for all ports" is 0.
> +
> +
> +Test case: Max vfs
> +==================
> +
> +Description: 256 VFs can be created on a CVL nic, if 2*100G card, each PF
> +can create 128 VFs, else if 4*25G card, each PF can create 64 VFs. This
> +case is used to test when all VFs on a PF are used, switch filter rules can
> work.
> +
> +design case with 4*25G card.
> +
> +1. generate 64 VFs on PF::
> +
> +     echo 64 > /sys/bus/pci/devices/0000:18:00.0/sriov_numvfs
> +
> +2. Get the interface name of the VFs, for example::
> +
> +     ./usertools/dpdk-devbind.py -s
> +
> +     0000:18:01.1 'Ethernet Adaptive Virtual Function 1889' if=enp24s1f1
> drv=iavf unused=igb_uio
> +
> +3. Start the 64 VFs in the kernel, for example::
> +
> +     ifconfig enp24s1f1 up
> +
> +4. Set VF0 as trust::
> +
> +     ip link set enp24s0f0 vf 0 trust on
> +
> +5. bind VF0 to dpdk driver::
> +
> +     ./usertools/dpdk-devbind.py -b vfio-pci 0000:18:01.0
> +
> +6. launch dpdk on VF0, and request DCF mode::
> +
> +     ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w
> 0000:18:01.0,cap=dcf -- -i
> +
> +7. set a switch rule to each VF from DCF, totally 63 rules::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.1 / tcp /
> end actions vf id 1 / end
> +     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.2 / tcp /
> end actions vf id 2 / end
> +     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.3 / tcp /
> end actions vf id 3 / end
> +     ......
> +     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.63 / tcp
> / end actions vf id 63 / end
> +     testpmd> flow list 0
> +
> +   check the rules exist in the list.
> +
> +8. send matched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1")/TCP()/Raw("X"*
> 480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.2")/TCP()/Raw("X"*
> 480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.3")/TCP()/Raw("X"*
> 480)], iface="enp27s0f0", count=1)
> +     ......
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.63")/TCP()/Raw("X"
> *480)], iface="enp27s0f0", count=1)
> +
> +   check the VF 1-63 each receives a packet in kernel, for example::
> +
> +     ifconfig
> +     enp24s1f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
> +             inet6 fe80::fc5e:4aff:fe55:824b  prefixlen 64  scopeid 0x20<link>
> +             ether fe:5e:4a:55:82:4b  txqueuelen 1000  (Ethernet)
> +             RX packets 1  bytes 538 (538.0 B)
> +             RX errors 0  dropped 0  overruns 0  frame 0
> +             TX packets 7  bytes 490 (490.0 B)
> +             TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
> +
> +     the "RX packets" number is 1.
> +
> +   send mismatched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.64")/TCP()/Raw("X"
> *480)], iface="enp27s0f0", count=1)
> +
> +   check the packets are not to any VF.
> +
> +9. verify rules can be destroyed::
> +
> +     testpmd> flow flush 0
> +     testpmd> flow list 0
> +
> +   check the rules not exist in the list.
> +   send matched packets, check the packets are not to any VF.
> +
> +
> +Test case: max field vectors
> +============================
> +
> +Description: 48 field vectors can be used on a CVL nic. This case is used
> +to test when field vectors are run out of, then creating a rule, testpmd
> +will not hang and provide a friendly output.
> +
> +1. create the following nvgre rules::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 /
> nvgre tni is 0x8 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / udp src is 50
> dst is 23 / end actions vf id 1 / end
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.2 /
> nvgre tni is 0x8 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / udp src is 50
> / end actions vf id 1 / end
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.3 /
> nvgre tni is 0x8 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / udp dst is 23
> / end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rules exist in the list.
> +
> +2. the three rules have run out of field vectors, and
> +   continue to create the following rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.10 /
> nvgre tni is 0x8 /  eth dst is 68:05:ca:8d:ed:a1  / ipv4 src is 192.168.1.2 dst is
> 192.168.1.3 / udp src is 25 dst is 23 / end actions vf id 1 / end
> +
> +   check the rule can not be created successfully, and testpmd
> +   provide a friendly output, showing::
> +
> +     ice_flow_create(): Failed to create flow
> +     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)):
> switch filter create flow fail: Invalid argument
> +
> +3. check the rule list::
> +
> +     testpmd> flow list 0
> +
> +   check the rule in step 2 not exists in the list.
> +
> +4. send 3 matched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.1")/NVGRE(TNI=0x8)/Ether()/IP(src="192.1
> 68.0.2",
> dst="192.168.0.3")/UDP(sport=50,dport=23)/Raw("x"*80)],iface="enp27s0f0
> ",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.2")/NVGRE(TNI=0x8)/Ether()/IP(src="192.1
> 68.0.2",
> dst="192.168.0.3")/UDP(sport=50,dport=23)/Raw("x"*80)],iface="enp27s0f0
> ",count=1)
> +
> sendp([Ether()/IP(dst="192.168.0.3")/NVGRE(TNI=0x8)/Ether()/IP(src="192.1
> 68.0.2",
> dst="192.168.0.3")/UDP(sport=50,dport=23)/Raw("x"*80)],iface="enp27s0f0
> ",count=1)
> +
> +   check port 1 receives the packets
> +   send mismatched packets::
> +
> +
> sendp([Ether()/IP(dst="192.168.0.5")/NVGRE(TNI=0x8)/Ether()/IP(src="192.1
> 68.0.2",
> dst="192.168.0.3")/UDP(sport=50,dport=23)/Raw("x"*80)],iface="enp27s0f0
> ",count=1)
> +
> +   check the packets are not to port 1.
> +
> +5. verify rules can be destroyed::
> +
> +     testpmd> flow flush 0
> +     testpmd> flow list 0
> +
> +   check the rules not exist in the list.
> +   send matched packets, check the packets are not to port 1.
> +
> +
> +Test case: max rule number
> +==========================
> +
> +Description: 32k switch filter rules can be created on a CVL card,
> +and all PFs and VFs share the 32k rules. But the system will first create
> +some MAC_VLAN rules in switch table, and as the number of rules
> increased,
> +the hash conflicts in the switch filter table are increased, so we can
> +create a total of 32563 switch filter rules on a DCF.
> +
> +1. create 32563 rules with the same pattern, but different input set::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.0 / end
> actions vf id 1 / end
> +     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.0.1 / end
> actions vf id 1 / end
> +     ......
> +     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.127.177 /
> end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rules exist in the list.
> +
> +2. create one more rule::
> +
> +     testpmd> flow create 0 ingress pattern eth / ipv4 src is 192.168.127.178 /
> end actions vf id 1 / end
> +
> +   check the rule can not be created successfully, and
> +   testpmd provide a friendly output, showing::
> +
> +     ice_flow_create(): Failed to create flow
> +     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)):
> switch filter create flow fail: Invalid argument
> +
> +3. check the rule list
> +
> +     testpmd> flow list 0
> +
> +   check the rule in step 2 not exists in the list.
> +
> +4. send 32563 matched packets for rule 0-32562::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.0")/TCP(sport=25,d
> port=23)/("X"*480)], iface="enp27s0f0", count=1)
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1")/TCP(sport=25,d
> port=23)/("X"*480)], iface="enp27s0f0", count=1)
> +     ......
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.127.177")/TCP(sport
> =25,dport=23)/("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check port 1 receive the 32563 packets.
> +   send 1 mismatched packet::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.167.0.1")/TCP(sport=25,d
> port=23)/("X"*480)], iface="enp27s0f0", count=1)
> +
> +   check the packet are not to port 1.
> +
> +5. verify rules can be destroyed::
> +
> +     testpmd> flow flush 0
> +     testpmd> flow list 0
> +
> +   check the rules not exist in the list.
> +   send 32563 matched packets, check the packets are not to port 1.
> +
> +
> +Test case: flow validation
> +==========================
> +
> +1. validate MAC_IPV4_UDP_PAY::
> +
> +     testpmd> flow validate 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 /
> ipv4 src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23
> / end actions vf id 1 / end
> +
> +   get the message::
> +
> +     Flow rule validated
> +
> +2. repeat step 1 with MAC_IPV4_PFCP_NODE::
> +
> +     testpmd> flow validate 0 ingress pattern eth / ipv4 / udp / pfcp s_field is
> 0 / end actions vf id 1 / end
> +
> +   get the same result
> +
> +3. validate unsupported pattern MAC_IPV4_SCTP_PAY::
> +
> +     testpmd> flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.2 dst
> is 192.168.0.3  / sctp src is 25 dst is 23 / end actions vf id 1 / end
> +
> +   get the message::
> +
> +     Invalid input pattern: Invalid argument
> +
> +4. check the flow list::
> +
> +     testpmd> flow list 0
> +
> +   there is no rule listed.
> +
> +5. validate a rule on invalid vf::
> +
> +     testpmd> flow validate 1 ingress pattern eth / ipv6 / udp / pfcp s_field is
> 1 / end actions vf id 1 / end
> +
> +   get the message::
> +
> +     port_flow_complain(): Caught PMD error type 2 (flow rule (handle)):
> Failed to create parser engine.: Invalid argument
> +
> +6. check the flow list::
> +
> +     testpmd> flow list 1
> +
> +   there is no rule listed.
> +
> +
> +Test case: Stress test
> +======================
> +
> +Subcase 1: DCF stop/DCF start
> +-----------------------------
> +
> +1. create MAC_IPV4_UDP_PAY rule::
> +
> +     testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4
> src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / udp src is 25 dst is 23 /
> end actions vf id 1 / end
> +     testpmd> flow list 0
> +
> +   check the rule exists in the list.
> +
> +2. send matched packets::
> +
> +
> sendp([Ether(dst="68:05:ca:8d:ed:a8")/IP(src="192.168.0.1",dst="192.168.0.
> 2",tos=4,ttl=3)/UDP(sport=25,dport=23)/("X"*480)], iface="enp27s0f0",
> count=1)
> +
> +   check port 1 receive the packet.
> +
> +3. stop the DCF, then start the DCF::
> +
> +     tetspmd> port stop 0
> +     testpmd> port start 0
> +
> +4. check the rule list::
> +
> +     testpmd> flow list 0
> +
> +   check the rule is still there.
> +
> +5. send matched packets, port 1 can still receive the packets.
> --
> 2.17.1


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-06-01  3:12 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-22 16:43 [dts] [PATCH V1] test_plans: add cvl_dcf_switch_filter_test_plan.rst Nannan Lu
2020-06-01  3:12 ` Tu, Lijuan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).