test suite reviews and discussions
 help / color / mirror / Atom feed
From: Peng Yuan <yuan.peng@intel.com>
To: dts@dpdk.org
Cc: Peng Yuan <yuan.peng@intel.com>
Subject: [dts] [PATCH v1]test_plans: add iavf_fdir_test_plan.rst
Date: Thu, 28 May 2020 15:24:24 +0000	[thread overview]
Message-ID: <1590679464-13576-1-git-send-email-yuan.peng@intel.com> (raw)

Add iavf_fdir_test_plan.rst to test_plans

Signed-off-by: Peng Yuan <yuan.peng@intel.com>

diff --git a/test_plans/iavf_fdir_test_plan.rst b/test_plans/iavf_fdir_test_plan.rst
new file mode 100644
index 0000000..c1e9161
--- /dev/null
+++ b/test_plans/iavf_fdir_test_plan.rst
@@ -0,0 +1,2908 @@
+.. 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:advanced iavf with FDIR capability
+======================================
+
+Support flow director to steering packets to queue/queue group in iavf
+Enable fdir filter for IPv4/IPv6 + TCP/UDP/SCTP  (OS default package)
+Enable fdir filter for GTP (comm #1 package)
+Enable fdir filter for L2 Ethertype (comm #1 package)
+Enable fdir filter for PFCP (comm #1 package)
+
+Pattern and input set
+---------------------
+
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    |    Packet Type               |        Pattern             |            Input Set                                              |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    | IPv4/IPv6 + TCP/UDP/SCTP     |      MAC_IPV4_PAY          | [Source IP], [Dest IP], [IP protocol], [TTL], [DSCP]              |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    |                              |      MAC_IPV4_UDP          | [Source IP], [Dest IP], [TTL], [DSCP], [Source Port], [Dest Port] |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    |                              |      MAC_IPV4_TCP          | [Source IP], [Dest IP], [TTL], [DSCP], [Source Port], [Dest Port] |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    |                              |      MAC_IPV4_SCTP         | [Source IP], [Dest IP], [TTL], [DSCP], [Source Port], [Dest Port] |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    |                              |      MAC_IPV6_PAY          | [Source IP], [Dest IP], [IP protocol], [TTL], [TC]                |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    |                              |      MAC_IPV6_UDP          | [Source IP], [Dest IP], [TTL], [TC], [Source Port], [Dest Port]   |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    |                              |      MAC_IPV6_TCP          | [Source IP], [Dest IP], [TTL], [TC], [Source Port], [Dest Port]   |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    |                              |      MAC_IPV6_SCTP         | [Source IP], [Dest IP], [TTL], [TC], [Source Port], [Dest Port]   |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    | L2 Ethertype                 |      L2 Ethertype          | [Ethertype]                                                       |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    | PFCP                         |   MAC_IPV4_PFCP_NODE       | [Dest Port], [S-field]                                            |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    |                              |   MAC_IPV4_PFCP_SESSION    | [Dest Port], [S-field]                                            |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    |                              |   MAC_IPV6_PFCP_NODE       | [Dest Port], [S-field]                                            |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    |                              |   MAC_IPV6_PFCP_SESSION    | [Dest Port], [S-field]                                            |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    | GTP-U data packet types      |                            |                                                                   |
+    | IPv4 transport, IPv4 payload |      MAC_IPV4_GTPU         | [TEID]                                                            |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+    |                              |      MAC_IPV4_GTPU_EH      | [TEID], [QFI]                                                     |
+    +------------------------------+----------------------------+-------------------------------------------------------------------+
+
+
+Supported function type
+-----------------------
+
+    validate
+    create
+    destroy
+    flush
+    list
+
+Supported action type
+---------------------
+
+    queue index
+    drop
+    rss queues
+    passthru
+    mark
+    mark/rss
+
+
+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/intel/ice/ddp/ice.pkg
+   Then reboot server, and compile DPDK
+
+4. Generate 2 VFs on each PF and set mac address for each VF::
+
+    echo 2 > /sys/bus/pci/devices/0000:86:00.0/sriov_numvfs
+    echo 2 > /sys/bus/pci/devices/0000:86:00.1/sriov_numvfs
+    ip link set enp134s0f0 vf 0 mac 00:11:22:33:44:55
+    ip link set enp134s0f0 vf 1 mac 00:11:22:33:44:66
+    ip link set enp134s0f1 vf 0 mac 00:11:22:33:44:77
+    ip link set enp134s0f1 vf 1 mac 00:11:22:33:44:88
+
+   0000:86:00.0 generate 0000:86:01.0 and 0000:86:01.1
+   0000:86:00.1 generate 0000:86:11.0 and 0000:86:11.1
+   define 86:01.0 as vf00, 86:01.1 as vf01, 86:11.0 as vf10, 86:11.1 as vf11.
+   assign mac address of pf0 is 68:05:ca:a3:1a:60,
+   assign mac address of pf1 is 68:05:ca:a3:1a:61.
+
+5. Bind VFs to dpdk driver::
+
+    ./usertools/dpdk-devbind.py -b vfio-pci 86:01.0 86:01.1 86:11.0 86:11.1
+
+5. Launch the app ``testpmd`` with the following arguments::
+
+    ./testpmd -c 0xff -n 6 -w 86:01.0 -w 86:01.1 --file-prefix=vf -- -i --rxq=16 --txq=16
+    testpmd> set fwd rxonly
+    testpmd> set verbose 1
+
+6. 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.gtp import *
+
+
+Default parameters
+------------------
+
+   VF00 MAC::
+
+    [Dest MAC]: 00:11:22:33:44:55
+
+   VF01 MAC::
+
+    [Dest MAC]: 00:11:22:33:44:66
+
+   VF10 MAC::
+
+    [Dest MAC]: 00:11:22:33:44:77
+
+   VF11 MAC::
+
+    [Dest MAC]: 00:11:22:33:44:88
+
+   IPv4::
+
+    [Source IP]: 192.168.0.20
+    [Dest IP]: 192.168.0.21
+    [IP protocol]: 255
+    [TTL]: 2
+    [DSCP]: 4
+
+   IPv6::
+
+    [Source IPv6]: 2001::2
+    [Dest IPv6]: CDCD:910A:2222:5498:8475:1111:3900:2020
+    [IP protocol]: 0
+    [TTL]: 2
+    [TC]: 1
+
+   UDP/TCP/SCTP::
+
+    [Source Port]: 22
+    [Dest Port]: 23
+
+   GTP-U data packet::
+
+    [TEID]: 0x12345678
+    [QFI]: 0x34
+
+   L2 Ethertype::
+
+    [Ethertype]: 0x8863 0x8864 0x0806 0x8100 0x88f7
+
+   PFCP::
+
+    [Dest Port]: 8805
+    [S-field]: 0/1
+
+
+Send packets
+------------
+
+* MAC_IPV4_PAY
+
+   matched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", proto=255, ttl=2, tos=4) / Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", frag=1, proto=255, ttl=2, tos=4)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", proto=255, ttl=2, tos=4)/UDP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+
+   mismatched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.22",dst="192.168.0.21", proto=255, ttl=2, tos=4) / Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.1.21", proto=255, ttl=2, tos=4) / Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", proto=1, ttl=2, tos=4) / Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", proto=255, ttl=3, tos=4) / Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", proto=255, ttl=2, tos=9) / Raw('x' * 80)],iface="enp134s0f1")
+
+* MAC_IPV4_UDP
+
+   matched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=4) /UDP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+
+   mismatched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.20",dst="192.168.0.21", ttl=2, tos=4) /UDP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.22", ttl=2, tos=4) /UDP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=4) /UDP(sport=21,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=4) /UDP(sport=22,dport=24)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=64, tos=4) /UDP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=1) /UDP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=4) /TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+
+* MAC_IPV4_TCP
+
+   matched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=4) /TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+
+   mismatched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.20",dst="192.168.0.21", ttl=2, tos=4) /TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.22", ttl=2, tos=4) /TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=4) /TCP(sport=21,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=4) /TCP(sport=22,dport=24)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=64, tos=4) /TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=1) /TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=4) /UDP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+
+* MAC_IPV4_SCTP
+
+   matched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=4) /SCTP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+
+   mismatched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.20",dst="192.168.0.21", ttl=2, tos=4) /SCTP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.22", ttl=2, tos=4) /SCTP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=4) /SCTP(sport=21,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=4) /SCTP(sport=22,dport=24)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=64, tos=4) /SCTP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=1) /SCTP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=4)/Raw('x' * 80)],iface="enp134s0f1")
+
+* MAC_IPV6_PAY
+
+   matched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2", nh=0, tc=1, hlim=2)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2", nh=0, tc=1, hlim=2)/UDP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+
+   mismatched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2022", src="2001::2", nh=0, tc=1, hlim=2)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::1", nh=0, tc=1, hlim=2)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2", nh=2, tc=1, hlim=2)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2", nh=0, tc=2, hlim=2)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2", nh=0, tc=1, hlim=5)/("X"*480)], iface="enp134s0f1")
+
+* MAC_IPV6_UDP
+
+   matched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=2)/UDP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+
+   mismatched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2021", src="2001::2",tc=1, hlim=2)/UDP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2002::2",tc=1, hlim=2)/UDP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=3, hlim=2)/UDP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=1)/UDP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=2)/UDP(sport=21,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=2)/UDP(sport=22,dport=24)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=2)/TCP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+
+* MAC_IPV6_TCP
+
+   matched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=2)/TCP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+
+   mismatched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2021", src="2001::2",tc=1, hlim=2)/TCP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2002::2",tc=1, hlim=2)/TCP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=3, hlim=2)/TCP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=1)/TCP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=2)/TCP(sport=21,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=2)/TCP(sport=22,dport=24)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=2)/SCTP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+
+* MAC_IPV6_SCTP
+
+   matched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=2)/SCTP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+
+   mismatched packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2021", src="2001::2",tc=1, hlim=2)/SCTP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2002::2",tc=1, hlim=2)/SCTP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=3, hlim=2)/SCTP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=1)/SCTP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=2)/SCTP(sport=21,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=2)/SCTP(sport=22,dport=24)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=2)/UDP(sport=22,dport=23)/("X"*480)], iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2",tc=1, hlim=2)/("X"*480)], iface="enp134s0f1")
+
+* MAC_IPV4_GTPU_EH
+
+   matched packets::
+
+    p_gtpu1 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x34)/IP()/Raw('x'*20)
+    p_gtpu2 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x34)/IP(frag=1)/Raw('x'*20)
+    p_gtpu3 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x34)/IP()/UDP()/Raw('x'*20)
+    p_gtpu4 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x34)/IP()/TCP(sport=22,dport=23)/Raw('x'*20)
+    p_gtpu5 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x34)/IP()/ICMP()/Raw('x'*20)
+    p_gtpu6 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x34)/IPv6()/Raw('x'*20)
+    p_gtpu7 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x34)/IPv6(nh=44)/Raw('x'*20)
+    p_gtpu8 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x34)/IPv6()/UDP()/Raw('x'*20)
+    p_gtpu9 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x34)/IPv6()/TCP(sport=22,dport=23)/Raw('x'*20)
+    p_gtpu10 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x34)/IPv6()/ICMP()/Raw('x'*20)
+
+   mismatched packets::
+
+    p_gtpu11 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x34)/IP()/SCTP()/Raw('x'*20)
+    p_gtpu12 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x34)/IPv6()/SCTP()/Raw('x'*20)
+    p_gtpu13 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x1234567)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x34)/IP()/Raw('x'*20)
+    p_gtpu14 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x35)/IP()/Raw('x'*20)
+    p_gtpu15 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP()/Raw('x'*20)
+    p_gtpu16 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x34)/Raw('x'*20)
+
+* MAC_IPV4_GTPU
+
+   matched packets::
+
+    p_gtpu1 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP()/Raw('x'*20)
+    p_gtpu2 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(frag=1)/Raw('x'*20)
+    p_gtpu3 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP()/UDP()/Raw('x'*20)
+    p_gtpu4 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP()/TCP(sport=22, dport=23)/Raw('x'*20)
+    p_gtpu5 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP()/ICMP()/Raw('x'*20)
+    p_gtpu6 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6()/Raw('x'*20)
+    p_gtpu7 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(nh=44)/Raw('x'*20)
+    p_gtpu8 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6()/UDP()/Raw('x'*20)
+    p_gtpu9 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6()/TCP(sport=22, dport=23)/Raw('x'*20)
+    p_gtpu10 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6()/ICMP()/Raw('x'*20)
+    p_gtpu11 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x35)/IP()/Raw('x'*20)
+
+   mismatched packets::
+
+    p_gtpu12 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/Raw('x'*20)
+    p_gtpu13 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP()/SCTP()/Raw('x'*20)
+    p_gtpu14 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6()/SCTP()/Raw('x'*20)
+    p_gtpu15 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x1234567)/IP()/Raw('x'*20)
+
+* L2 Ethertype
+
+   PPPoED packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/PPPoED()/PPP()/IP()/Raw('x' *80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55", type=0x8863)/IP()/Raw('x' * 80)],iface="enp134s0f1")
+
+   PPPoE packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/PPPoE()/PPP(proto=0x0021)/IP()/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55", type=0x8864)/IP()/Raw('x' * 80)],iface="enp134s0f1")
+
+   ARP packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/ARP(pdst="192.168.1.1")],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55", type=0x0806)/Raw('x' *80)],iface="enp134s0f1")
+
+   EAPS packets::
+
+    sendp([Ether(dst="00:11:22:33:44:55",type=0x8100)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)],iface="enp134s0f1")
+
+   ieee1588 packet::
+
+    sendp([Ether(dst="00:11:22:33:44:55",type=0x88f7)/"\\x00\\x02"], iface="enp134s0f1")
+
+* PFCP
+
+   MAC_IPV4_PFCP_NODE::
+
+    sendp(Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=22, dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+
+   MAC_IPV4_PFCP_SESSION::
+
+    sendp(Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=22, dport=8805)/PFCP(Sfield=1, SEID=123),iface="enp134s0f1")
+
+   MAC_IPV6_PFCP_NODE::
+
+    sendp(Ether(dst="00:11:22:33:44:55")/IPv6()/UDP(sport=22, dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+
+   MAC_IPV6_PFCP_NODE::
+
+    sendp(Ether(dst="00:11:22:33:44:55")/IPv6()/UDP(sport=22, dport=8805)/PFCP(Sfield=1, SEID=256),iface="enp134s0f1")
+
+
+Test case: flow validation
+==========================
+
+1. validate MAC_IPV4_PAY with queue index action::
+
+    flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions queue index 1 / end
+
+   get the message without any error message::
+
+    Flow rule validated
+
+2. repeat step 1 with all patterns in pattern and input set table,
+   get the same result.
+
+3. repeat step 1-2 with action rss queues/drop/passthru/mark/mark+rss,
+   get the same result.
+
+4. repeate step 1-3 with combined use of actions::
+
+    flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / end actions queue index 1 / mark / end
+    flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / end actions rss queues 0 1 end / mark / end
+    flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / end actions passthru / mark / end
+    flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / end actions mark / rss / end
+
+   get the message without any error message::
+
+    Flow rule validated
+
+5. check the flow list::
+
+    testpmd> flow list 0
+
+   there is no rule listed.
+
+Test case: negative validation
+==============================
+Note: some of the error messages may be differernt.
+
+1. only count action::
+
+    flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions count / end
+
+   get the error message::
+
+    Invalid input action: Invalid argument
+
+2. void action::
+
+    flow validate 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc qfi is 0x34 / end actions end
+
+   Failed to create flow, report message::
+
+    Emtpy action: Invalid argument
+
+3. conflict action::
+
+    flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions rss queues 2 3 end / rss / end
+
+   get the message::
+
+    Unsupported action combination: Invalid argument
+
+4. invalid mark id::
+
+    flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions passthru / mark id 4294967296 / end
+
+   get the message::
+
+    Bad arguments
+
+5. invalid input set::
+
+    flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tc is 4 / end actions queue index 1 / end
+
+   get the message::
+
+    Bad arguments
+
+6. invalid queue index::
+
+    flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions queue index 16 / end
+
+   get the message::
+
+    Invalid input action: Invalid argument
+
+7. invalid rss queues parameter
+
+   Invalid number of queues::
+
+    flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions rss queues 1 2 3 end / end
+    flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions rss queues 0 end / end
+    flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions rss queues end / end
+
+   get the message::
+
+    Invalid input action: Invalid argument
+
+   Discontinuous queues::
+
+    flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions rss queues 1 2 3 5 end / end
+
+   get the message::
+
+    Discontinuous queue region: Invalid argument
+
+   invalid rss queues index::
+
+    flow validate 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions rss queues 15 16 end / end
+
+   get the message::
+
+    Invalid queue region indexes.: Invalid argument
+
+8. Invalid value of input set::
+
+    flow validate 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc qfi is 0x100 / end actions queue index 1 / end
+    flow validate 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x100000000 / gtp_psc qfi is 0x5 / end actions queue index 2 / end
+    flow validate 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x100000000 / end actions queue index 1 / end
+
+   get the message::
+
+    Bad arguments
+
+9. unsupported pattern,validate GTPU rule with OS default package::
+
+    flow validate 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc qfi is 0x34 / end actions drop / end
+
+   get the message::
+
+    Add filter rule failed.: Operation not permitted
+
+10. invalid port::
+
+    flow validate 1 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions queue index 1 / end
+
+   get the message::
+
+    No such device: No such device
+
+11. check the flow list::
+
+    testpmd> flow list 0
+
+   there is no rule listed.
+
+Test case: MAC_IPV4_PAY pattern
+===============================
+
+Subcase 1: MAC_IPV4_PAY queue index
+-----------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions queue index 1 / end
+
+2. send matched packets, check the packets are distributed to queue 1 without FDIR matched ID.
+   send mismatched packets, check the packets are not distributed to queue 1 without FDIR matched ID.
+
+3. verify rules can be listed and destroyed::
+
+    testpmd> flow list 0
+
+   check the rule listed.
+   destroy the rule::
+
+    testpmd> flow destroy 0 rule 0
+
+4. verify matched packets are not distributed to queue 1 without FDIR matched ID.
+   check there is no rule listed.
+
+Subcase 2: MAC_IPV4_PAY rss queues
+----------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions rss queues 2 3 end / end
+
+2. send matched packets, check the packets are distributed to queue 2 or 3 without without FDIR matched ID.
+   send mismatched packets, check the packets are not distributed to queue 2 or 3 without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are not distributed to queue 2 or 3 without FDIR matched ID.
+   check there is no rule listed.
+
+Subcase 3: MAC_IPV4_PAY passthru
+--------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions passthru / end
+
+2. send matched packets, check the packets are distributed by RSS without FDIR matched ID.
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are distributed to the same queue without FDIR matched ID=0x0.
+   check there is no rule listed.
+
+Subcase 4: MAC_IPV4_PAY drop
+----------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions drop / end
+
+2. send matched packets, check the packets are dropped
+   send mismatched packets, check the packets are not dropped.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are not dropped.
+   check there is no rule listed.
+
+Subcase 5: MAC_IPV4_PAY mark+rss
+--------------------------------
+Note: This combined action is mark with RSS which is without queues specified.
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions mark / rss / end
+
+2. send matched packets, check the packets are distributed by RSS with FDIR matched ID=0x0
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are distributed to the same queue without FDIR matched ID.
+   check there is no rule listed.
+
+Subcase 6: MAC_IPV4_PAY mark
+----------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions mark / end
+
+2. send matched packets, check the packets are distributed by RSS with FDIR matched ID=0x0.
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are distributed to the same queue without FDIR matched ID.
+   check there is no rule listed.
+
+Subcase 7: MAC_IPV4_PAY protocal
+--------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.21 proto is 1 / end actions queue index 1 / mark id 1 / end
+    flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.21 proto is 17 / end actions passthru / mark id 3 / end
+
+2. send matched packets::
+
+    pkt1 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", proto=1)/Raw('x' * 80)
+    pkt2 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", frag=1, proto=1)/Raw('x' * 80)
+    pkt3 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", ttl=2, tos=4)/UDP(sport=22,dport=23)/Raw('x' * 80)
+    pkt4 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", frag=1, ttl=2, tos=4)/UDP(sport=22,dport=23)/Raw('x' * 80)
+    pkt5 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", proto=17, ttl=2, tos=4)/Raw('x' * 80)
+    pkt6 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", frag=1, proto=17, ttl=2, tos=4)/Raw('x' * 80)
+
+   check the pkt1 and pkt2 are redirected to queue 1 with FDIR matched ID=0x1.
+   check the pkt3-pkt6 are distributed by RSS with FDIR matched ID=0x3.
+   send mismatched packets::
+
+    pkt7 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.22", proto=1)/Raw('x' * 80)
+    pkt8 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", proto=6)/UDP(sport=22,dport=23)/Raw('x' * 80)
+    pkt9 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)
+    pkt10 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", frag=1)/TCP(sport=22,dport=23)/Raw('x' * 80)
+
+   check the packets received have not FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets have not FDIR matched ID.
+   check there is no rule listed.
+
+
+Test case: MAC_IPV4_UDP pattern
+===============================
+
+Subcase 1: MAC_IPV4_UDP queue index
+-----------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / udp src is 22 dst is 23 / end actions queue index 1 / mark id 0 / end
+
+2. send matched packets, check the packets is distributed to queue 1 with FDIR matched ID=0x0.
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. verify rules can be listed and destroyed::
+
+    testpmd> flow list 0
+
+   check the rule listed.
+   destroy the rule::
+
+    testpmd> flow destroy 0 rule 0
+
+4. verify matched packet is distributed by RSS without FDIR matched ID.
+   check there is no rule listed.
+
+Subcase 2: MAC_IPV4_UDP rss queues
+----------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / udp src is 22 dst is 23 / end actions rss queues 0 1 2 3 end / mark id 4294967294 / end
+
+2. send matched packets, check the packets is distributed to queue 0-3 with FDIR matched ID=0xfffffffe.
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packet is distributed by RSS without FDIR matched ID.
+   check there is no rule listed.
+
+Subcase 3: MAC_IPV4_UDP passthru
+--------------------------------
+
+1. create filter rule with mark::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / udp src is 22 dst is 23 / end actions passthru / mark id 1 / end
+
+2. send matched packets, check the packets are distributed by RSS with FDIR matched ID=0x1.
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are distributed to the same queue without FDIR matched ID.
+   check there is no rule listed.
+
+Subcase 4: MAC_IPV4_UDP drop
+----------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / udp src is 22 dst is 23 / end actions drop / end
+
+2. send matched packet, check the packet is dropped.
+   send mismatched packets, check the packets are not dropped.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packet is dropped.
+   check there is no rule listed.
+
+Subcase 5: MAC_IPV4_UDP mark+rss
+--------------------------------
+Note: This combined action is mark with RSS which is without queues specified.
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / udp src is 22 dst is 23 / end actions mark id 2 / rss / end
+
+2. send matched packets, check the packets are distributed by RSS with FDIR matched ID=0x2
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are distributed to the same queue without FDIR matched ID.
+   check there is no rule listed.
+
+Subcase 6: MAC_IPV4_UDP mark
+----------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / udp src is 22 dst is 23 / end actions mark id 1 / end
+
+2. repeat the step 2-3 of in subcase 3,
+   get the same result.
+
+Test case: MAC_IPV4_TCP pattern
+===============================
+
+1. replace "udp" with "tcp" in all the subcases of MAC_IPV4_UDP pattern.
+2. Then repeat all the steps in all the subcases of MAC_IPV4_UDP pattern.
+3. get the same result.
+
+Test case: MAC_IPV4_SCTP pattern
+================================
+
+1. replace "udp" with "sctp" in all the subcases of MAC_IPV4_UDP pattern.
+2. Then repeat all the steps in all the subcases of MAC_IPV4_UDP pattern.
+3. get the same result.
+
+
+Test case: MAC_IPV6_PAY pattern
+===============================
+
+Subcase 1: MAC_IPV6_PAY queue index
+-----------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 proto is 0 hop is 2 tc is 1 / end actions queue index 15 / mark / end
+
+2. send matched packets, check the packets is distributed to queue 15 with FDIR matched ID=0x0.
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. verify rules can be listed and destroyed::
+
+    testpmd> flow list 0
+
+   check the rule listed.
+   destroy the rule::
+
+    testpmd> flow destroy 0 rule 0
+
+4. verify matched packet is distributed by RSS without FDIR matched ID.
+   check there is no rule listed.
+
+Subcase 2: MAC_IPV6_PAY rss queues
+----------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 proto is 0 hop is 2 tc is 1 / end actions rss queues 8 9 10 11 12 13 14 15 end / mark / end
+
+2. send matched packets, check the packets is distributed to queue 8-15 with FDIR matched ID=0x0.
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packet is distributed by RSS without FDIR matched ID.
+   check there is no rule listed.
+
+Subcase 3: MAC_IPV6_PAY passthru
+--------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 proto is 0 hop is 2 tc is 1 / end actions passthru / mark / end
+
+2. send matched packets, check the packets are distributed by RSS with FDIR matched ID=0x0.
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are destributed to the same queue without FDIR matched ID .
+   check there is no rule listed.
+
+Subcase 4: MAC_IPV6_PAY drop
+----------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 proto is 0 hop is 2 tc is 1 / end actions drop / end
+
+2. send matched packets, check the packets are dropped.
+   send mismatched packets, check the packets are not dropped.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packet is dropped.
+   check there is no rule listed.
+
+Subcase 5: MAC_IPV6_PAY mark+rss
+--------------------------------
+Note: This combined action is mark with RSS which is without queues specified.
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 proto is 0 hop is 2 tc is 1 / end actions mark / rss / end
+
+2. send matched packets, check the packets are distributed by RSS with FDIR matched ID=0x0
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are distributed to the same queue without FDIR matched ID.
+   check there is no rule listed.
+
+Subcase 6: MAC_IPV6_PAY mark
+----------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 proto is 0 hop is 2 tc is 1 / end actions mark / end
+
+2. repeat the steps of passthru with mark part in subcase 3,
+   get the same result.
+
+Subcase 7: MAC_IPV6_PAY protocal
+--------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 proto is 44 / end actions rss queues 5 6 end / mark id 0 / end
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 proto is 6 / end actions mark id 2 / rss / end
+
+2. send matched packets::
+
+    pkt1 = Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="2001::2", nh=44, tc=1, hlim=2)/("X"*480)
+    pkt2 = Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/IPv6ExtHdrFragment(100)/("X"*480)
+    pkt3 = Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", nh=44)/TCP(sport=22,dport=23)/("X"*480)
+    pkt4 = Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/IPv6ExtHdrFragment(100)/TCP(sport=22,dport=23)/("X"*480)
+    pkt5 = Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", nh=6)/("X"*480)
+    pkt6 = Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/TCP(sport=22,dport=23)/("X"*480)
+
+   check pkt1-pkt4 are redirected to queue 5 or queue 6 with FDIR matched ID=0x0.
+   check pkt5 and pkt6 are distributed by RSS with FDIR matched ID=0x2.
+   send mismatched packets::
+
+    pkt7 = Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2021", nh=44)/("X"*480)
+    pkt8 = Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020")/UDP(sport=22,dport=23)/("X"*480)
+    pkt9 = Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", nh=17)/TCP(sport=22,dport=23)/("X"*480)
+
+   check the packets are received without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are received without FDIR matched ID.
+   check there is no rule listed.
+
+Test case: MAC_IPV6_UDP pattern
+===============================
+
+Subcase 1: MAC_IPV6_UDP queue index
+-----------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 hop is 2 tc is 1 / udp src is 22 dst is 23 / end actions queue index 1 / mark / end
+
+2. send matched packets, check the packets is distributed to queue 1 with FDIR matched ID=0x0.
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. verify rules can be listed and destroyed::
+
+    testpmd> flow list 0
+
+   check the rule listed.
+   destroy the rule::
+
+    testpmd> flow destroy 0 rule 0
+
+4. verify matched packet is distributed by RSS without FDIR matched ID.
+   check there is no rule listed.
+
+Subcase 2: MAC_IPV6_UDP rss queues
+----------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 hop is 2 tc is 1 / udp src is 22 dst is 23 / end actions rss queues 2 3 end / mark / end
+
+2. send matched packets, check the packets is distributed to queue 2 or queue 3 with FDIR matched ID=0x0.
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packet is distributed by RSS without FDIR matched ID.
+   check there is no rule listed.
+
+Subcase 3: MAC_IPV6_UDP passthru
+--------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 hop is 2 tc is 1 / udp src is 22 dst is 23 / end actions passthru / mark / end
+
+2. send matched packets, check the packets are distributed by RSS with FDIR matched ID=0x0.
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are destributed to the same queue without FDIR matched ID .
+   check there is no rule listed.
+
+Subcase 4: MAC_IPV6_UDP drop
+----------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 hop is 2 tc is 1 / udp src is 22 dst is 23 / end actions drop / end
+
+2. send matched packets, check the packets are dropped.
+   send mismatched packets, check the packets are not dropped.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packet is dropped.
+   check there is no rule listed.
+
+Subcase 5: MAC_IPV6_UDP mark+rss
+--------------------------------
+Note: This combined action is mark with RSS which is without queues specified.
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 hop is 2 tc is 1 / udp src is 22 dst is 23 / end actions mark / rss / end
+
+2. send matched packets, check the packets are distributed by RSS with FDIR matched ID=0x0
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are distributed to the same queue without FDIR matched ID.
+   check there is no rule listed.
+
+Subcase 6: MAC_IPV6_UDP mark
+----------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 hop is 2 tc is 1 / udp src is 22 dst is 23 / end actions mark id 0 / end
+
+2. repeat the steps of passthru with mark part in subcase 3,
+   get the same result.
+
+
+Test case: MAC_IPV6_TCP pattern
+===============================
+
+1. replace "udp" with "tcp" in all the subcases of MAC_IPV6_UDP pattern.
+2. Then repeat all the steps in all the subcases of MAC_IPV6_UDP pattern.
+3. get the same result.
+
+Test case: MAC_IPV6_SCTP pattern
+================================
+
+1. replace "udp" with "sctp" in all the subcases of MAC_IPV6_UDP pattern.
+2. Then repeat all the steps in all the subcases of MAC_IPV6_UDP pattern.
+3. get the same result.
+
+
+Test case: MAC_IPV4_GTPU_EH pattern
+===================================
+IAVF doesn't support RSS for GTPU by default,
+so we need to set RSS rule for GTPU with extention header::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc pdu_t is 1 / ipv4 / end actions rss types l3-src-only end key_len 0 queues end / end
+
+Now, IAVF doesn't support RSS for GTPU without extention header
+
+Subcase 1: MAC_IPV4_GTPU_EH queue index
+---------------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc qfi is 0x34 / end actions queue index 1 / mark id 1 / end
+
+2. send matched packets, check the packets are distributed to queue 1 with FDIR matched ID=0x1.
+   send mismatched packets, check the packets are not distributed to queue 1 without FDIR matched ID.
+
+3. verify rules can be listed and destroyed::
+
+    testpmd> flow list 0
+
+   check the rule listed.
+   destroy the rule::
+
+    testpmd> flow destroy 0 rule 0
+
+4. verify matched packets are received without FDIR matched ID.
+   Then check there is no rule listed.
+
+Subcase 2: MAC_IPV4_GTPU_EH rss queues
+--------------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc qfi is 0x34 / end actions rss queues 2 3 end / mark id 1 / end
+
+2. send matched packets, check the packets are distributed to queue 2 or queue 3 with FDIR matched ID=0x1.
+   send mismatched packets, check the packets are received without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are received without FDIR matched ID.
+   Then check there is no rule listed.
+
+Subcase 3: MAC_IPV4_GTPU_EH passthru
+------------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc qfi is 0x34 / end actions passthru / mark id 1 / end
+
+2. send matched packets, check the packets are distributed by RSS with FDIR matched ID=0x1.
+   send mismatched packets, check the packets are received without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are received without FDIR matched ID.
+   Then check there is no rule listed.
+
+Subcase 4: MAC_IPV4_GTPU_EH drop
+--------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc qfi is 0x34 / end actions drop / end
+
+2. send matched packets, check the packets are dropped.
+   send mismatched packets, check the packets are not dropped.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are not dropped.
+   Then check there is no rule listed.
+
+Subcase 5: MAC_IPV4_GTPU_EH mark+rss
+------------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc qfi is 0x34 / end actions rss / mark / end
+
+2. send matched packets, check the packets are distributed by RSS with FDIR matched ID=0x0.
+   send mismatched packets, check the packets are received without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are received without FDIR matched ID.
+   Then check there is no rule listed.
+
+Subcase 6: MAC_IPV4_GTPU_EH mark
+--------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc qfi is 0x34 / end actions mark id 1 / end
+
+2. repeat the steps of passthru with mark part in subcase 3,
+   get the same result.
+
+Subcase 7: MAC_IPV4_GTPU_EH QFI queue index / mark
+--------------------------------------------------
+
+1. create filter rules on port 0::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / end actions queue index 1 / mark id 3 / end
+
+2. send matched packets, check the packet is redirected to queue 1 with FDIR matched ID=0x3::
+
+    p_gtpu1 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x34)/IP()/TCP()/Raw('x'*20)
+
+   send mismatched packets, check the packet received has not FDIR::
+
+    p_gtpu2 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255)/GTP_PDUSession_ExtensionHeader(pdu_type=1, qos_flow=0x35)/IP()/Raw('x'*20)
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packet received has not FDIR.
+   Then check there is no rule listed.
+
+Subcase 8: MAC_IPV4_GTPU_EH without QFI rss queues / mark
+---------------------------------------------------------
+
+1. create filter rules on port 0::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc / end actions rss queues 2 3 end / mark id 1 / end
+
+2. send matched packets, check the packet is distributed to queue 2 or queue 3 with FDIR matched ID=0x3::
+
+    p_gtpu1 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTP_PDUSession_ExtensionHeader(pdu_type=1)/IP()/TCP()/Raw('x'*20)
+
+   send mismatched packets, check the packet received has no FDIR::
+
+    p_gtpu2 = Ether(src="a4:bf:01:51:27:ca", dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x1234567)/GTP_PDUSession_ExtensionHeader(pdu_type=1)/IP()/TCP()/Raw('x'*20)
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packet are received without FDIR.
+   Then check there is no rule listed.
+
+
+Test case: MAC_IPV4_GTPU pattern
+================================
+
+Subcase 1: MAC_IPV4_GTPU queue index
+------------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / end actions queue index 1 / mark / end
+
+2. send matched packets, check the packets are distributed to queue 1 with FDIR matched ID=0x0.
+   send mismatched packets, check the packets are not distributed to queue 1 without FDIR matched ID.
+
+3. verify rules can be listed and destroyed::
+
+    testpmd> flow list 0
+
+   check the existing rule.
+   destroy the rule::
+
+    testpmd> flow destroy 0 rule 0
+
+4. verify matched packets are not distributed to queue 1 without FDIR matched ID.
+   Then check there is no rule listed.
+
+Subcase 2: MAC_IPV4_GTPU rss queues
+-----------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / end actions rss queues 2 3 end / mark / end
+
+2. send matched packets, check the packets are received with FDIR matched ID=0x0.
+   send mismatched packets, check the packets are received without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are received without FDIR matched ID.
+   Then check there is no rule listed.
+
+Subcase 3: MAC_IPV4_GTPU passthru
+---------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / end actions passthru / mark / end
+
+2. send matched packets, check the packets are received with FDIR matched ID=0x0.
+   send mismatched packets, check the packets are received without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are received without FDIR matched ID.
+   Then check there is no rule listed.
+
+Subcase 4: MAC_IPV4_GTPU drop
+-----------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / end actions drop / end
+
+2. send matched packets, check the packets are dropped.
+   send mismatched packets, check the packets are not dropped.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are not dropped.
+   Then check there is no rule listed.
+
+Subcase 5: MAC_IPV4_GTPU mark+rss
+---------------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / end actions mark id 1 / rss / end
+
+2. send matched packets, check the packets are received with FDIR matched ID=0x1.
+   send mismatched packets, check the packets are received without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are received without FDIR matched ID.
+   Then check there is no rule listed.
+
+Subcase 6: MAC_IPV4_GTPU mark
+-----------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / end actions mark / end
+
+2. repeat the steps of passthru with mark part in subcase 3,
+   get the same result.
+
+
+Test case: L2 Ethertype pattern
+===============================
+
+Subcase 1: L2 Ethertype queue index
+-----------------------------------
+
+1. create rule for PPPoED::
+
+    flow create 0 ingress pattern eth type is 0x8863 / end actions queue index 1 / mark id 1 / end
+
+   send PPPoED packet,
+   check the packets are distributed to expected queue with specific FDIR matched ID.
+
+2. create rule for PPPoE::
+
+    flow create 0 ingress pattern eth type is 0x8864 / end actions queue index 2 / mark id 2 / end
+
+   send PPPoE packet,
+   check the packets are distributed to expected queue with specific FDIR matched ID.
+
+3. create rule for ARP::
+
+    flow create 0 ingress pattern eth type is 0x0806 / end actions queue index 3 / mark id 3 / end
+
+   send ARP packet,
+   Check the packets are distributed to expected queue with specific FDIR matched ID.
+
+4. create rule for EAPS::
+
+    flow create 0 ingress pattern eth type is 0x8100 / end actions queue index 4 / mark id 4 / end
+
+   send EAPS packet,
+   check the packets are distributed to expected queue with specific FDIR matched ID.
+
+5. create rule for ieee1588::
+
+    flow create 0 ingress pattern eth type is 0x88f7 / end actions queue index 5 / mark id 5 / end
+
+   send ieee1588 packet,
+   check the packets are distributed to expected queue with specific FDIR matched ID.
+
+6. send a mismatched packet::
+
+    sendp([Ether(dst="00:11:22:33:44:55",type=0x8847)],iface="enp134s0f1")
+
+   check the packet received has not FDIR matched ID.
+
+7. verify rules can be listed and destroyed::
+
+    testpmd> flow list 0
+
+   check the 5 rules listed.
+   flush all the rules::
+
+    testpmd> flow flush 0
+
+8. verify matched packets are received without FDIR matched ID.
+   Then check there is no rule listed.
+
+Subcase 2: L2 Ethertype rss queues
+----------------------------------
+
+1. create rules for PPPoED with rss queues action::
+
+    flow create 0 ingress pattern eth type is 0x8863 / end actions rss queues 2 3 end / mark id 2 / end
+
+2. send matched packet,
+   check the packets received have FDIR matched ID=0x2,
+   the packets are directed to queue 0,
+   because L2 Ethertype are not supported by RSS.
+
+3. Repeat step 1-2 with PPPoE/ARP/EAPS/ieee1588,
+   get the same result.
+
+4. repeat step 6-7 of subcase 1.
+
+5. verify matched packets received have not FDIR matched ID.
+   Then check there is no rule listed.
+
+Subcase 3: L2 Ethertype passthru
+--------------------------------
+
+1. create rules for PPPoED with passthru action::
+
+    flow create 0 ingress pattern eth type is 0x8863 / end actions passthru / mark id 2 / end
+
+2. send matched packet,
+   check the packets received have FDIR matched ID=0x2,
+   the packets are directed to queue 0,
+   because L2 Ethertype are not supported by RSS.
+
+3. Repeat step 1-2 with PPPoE/ARP/EAPS/ieee1588,
+   get the same result.
+
+4. repeat step 6-7 of subcase 1.
+
+5. verify matched packets received have not FDIR matched ID.
+   Then check there is no rule listed.
+
+Subcase 4: L2 Ethertype drop
+----------------------------
+
+1. create rules for PPPoED with drop action::
+
+    flow create 0 ingress pattern eth type is 0x8863 / end actions drop / end
+
+2. send matched packet,
+   check the packets are dropped,
+
+3. Repeat step 1-2 with PPPoE/ARP/EAPS/ieee1588,
+   get the same result.
+
+4. repeat step 6-7 of subcase 1.
+
+5. verify matched packets are received.
+   Then check there is no rule listed.
+
+Subcase 5: L2 Ethertype mark+rss
+--------------------------------
+
+1. create rules for PPPoED with rss queues action::
+
+    flow create 0 ingress pattern eth type is 0x8863 / end actions mark id 1 / rss / end
+
+2. send matched packet,
+   check the packets received have FDIR matched ID=0x1,
+   the packets are directed to queue 0,
+   because L2 Ethertype are not supported by RSS.
+
+3. Repeat step 1-2 with PPPoE/ARP/EAPS/ieee1588,
+   get the same result.
+
+4. repeat step 6-7 of subcase 1.
+
+5. verify matched packets received have not FDIR matched ID.
+   Then check there is no rule listed.
+
+Subcase 6: L2 Ethertype mark
+----------------------------
+
+1. create rules for PPPoED with mark action::
+
+    flow create 0 ingress pattern eth type is 0x8863 / end actions mark / end
+
+2. send matched packet,
+   check the packets received have FDIR matched ID=0x0,
+
+3. Repeat step 1-2 with PPPoE/ARP/EAPS/ieee1588,
+   get the same result.
+
+4. repeat step 6-7 of subcase 1.
+
+5. verify matched packets received have not FDIR matched ID.
+   Then check there is no rule listed.
+
+
+Test case: PFCP pctype
+======================
+patterns:
+MAC_IPV4_PFCP_NODE
+MAC_IPV4_PFCP_SESSION
+MAC_IPV6_PFCP_NODE
+MAC_IPV6_PFCP_SESSION
+
+RSS for PFCP are not supported by default.
+so if it's not opened, the PFCP packet will be sent to queue 0 by RSS.
+
+Subcase 1: PFCP queue index
+---------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions queue index 1 / end
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 / end actions queue index 2 / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 0 / end actions queue index 3 / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 1 / end actions queue index 4 / end
+
+2. send matched packets, check the packets are redirected to expected queue.
+
+3. verify rules can be listed and destroyed::
+
+    testpmd> flow list 0
+
+   check the existing rules.
+   destroy the rules::
+
+    testpmd> flow flush 0
+
+4. verify matched packets are not redirected to expected queue.
+   Then check there is no rule listed.
+
+Subcase 2: PFCP rss queues
+--------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions rss queues 2 3 end / mark id 0 / end
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 / end actions rss queues 4 5 6 7 end / mark id 1 / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 0 / end actions rss queues 8 9 10 11 12 13 14 15 end / mark id 2 / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 1 / end actions rss queues 3 4 5 6 end / mark id 3 / end
+
+   open PFCP RSS function::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end
+
+2. send matched packets,
+   PFCP SESSION packets are redirected to expected queues with specified mark ID.
+   PFCP NODE packets are redirected to queue 0 with specified mark ID.
+   send a ipv4-udp packet, check the packet is distributed by RSS without FDIR matched ID.
+
+3. verify rules can be listed and destroyed::
+
+    testpmd> flow list 0
+    ID      Group   Prio    Attr    Rule
+    0       0       0       i--     ETH IPV4 UDP PFCP => RSS MARK
+    1       0       0       i--     ETH IPV4 UDP PFCP => RSS MARK
+    2       0       0       i--     ETH IPV6 UDP PFCP => RSS MARK
+    3       0       0       i--     ETH IPV6 UDP PFCP => RSS MARK
+    4       0       0       i--     ETH IPV4 UDP PFCP => RSS
+    5       0       0       i--     ETH IPV6 UDP PFCP => RSS
+
+   destroy the fdir rules::
+
+    flow destroy 0 rule 0
+    flow destroy 0 rule 1
+    flow destroy 0 rule 2
+    flow destroy 0 rule 3
+
+4. verify PFCP SESSION packets are distributed by RSS without FDIR matched ID.
+   PFCP NODE packets are redirecte to queue 0 without FDIR matched ID.
+
+5. disable PFCP RSS function::
+
+    flow destroy 0 rule 4
+    flow destroy 0 rule 5
+
+6. verify PFCP SESSION packets are distributed to queue 0 without FDIR matched ID.
+   PFCP NODE packets are distributed to queue 0 without FDIR matched ID.
+   Then check there is no rule listed.
+
+Subcase 3: PFCP passthru
+------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions passthru / mark id 0 / end
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 / end actions passthru / mark id 1 / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 0 / end actions passthru / mark id 2 / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 1 / end actions passthru / mark id 3 / end
+
+2. send matched packets, check the packets are distributed by RSS with expected FDIR matched ID.
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are distributed to the same queue by RSS without FDIR matched ID.
+   Then check there is no rule listed.
+
+Subcase 4: PFCP drop
+--------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions drop / end
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 / end actions drop / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 0 / end actions drop / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 1 / end actions drop / end
+
+2. send matched packets, check the packets are dropped.
+   send mismatched packets, check the packets are not dropped.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are not dropped.
+   Then check there is no rule listed.
+
+Subcase 5: PFCP mark+rss
+------------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions mark / rss / end
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 / end actions mark id 1 / rss / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 0 / end actions mark id 2 / rss / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 1 / end actions mark id 3 / rss / end
+
+2. send matched packets, check the packets are distributed by RSS with expected FDIR matched ID.
+   send mismatched packets, check the packets are distributed by RSS without FDIR matched ID.
+
+3. repeat step 3 of subcase 1.
+
+4. verify matched packets are distributed to the same queue by RSS without FDIR matched ID.
+   Then check there is no rule listed.
+
+Subcase 6: PFCP mark
+--------------------
+
+1. create filter rules::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions mark / end
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 / end actions mark id 1 / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 0 / end actions mark id 2 / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 1 / end actions mark id 4294967294 / end
+
+2. repeat the steps of passthru with mark part in subcase 3,
+   get the same result.
+
+
+Test case: negative cases
+=========================
+
+Subcase 1: invalid parameters of queue index
+--------------------------------------------
+
+1. Invalid parameters::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions queue index 16 / end
+
+   Failed to create flow, report message::
+
+    Invalid queue for FDIR.: Invalid argument
+
+2. check there is no rule listed.
+
+Subcase 2: invalid parameters of rss queues
+-------------------------------------------
+
+1. Invalid number of queues::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions rss queues 1 2 3 end / end
+
+   Failed to create flow, report message::
+
+    The region size should be any of the following values:1, 2, 4, 8, 16, 32, 64, 128 as long as the total number of queues do not exceed the VSI allocation.: Invalid argument
+
+   Invalid number of queues::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions rss queues 0 end / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions rss queues end / end
+
+   Failed to create flow, report message::
+
+    Queue region size can't be 0 or 1.: Invalid argument
+
+2. Discontinuous queues::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions rss queues 1 2 3 5 end / end
+
+   Failed to create flow, report message::
+
+    Discontinuous queue region: Invalid argument
+
+3. invalid queue index::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 proto is 255 ttl is 2 tos is 4 / end actions rss queues 15 16 end / end
+
+   Failed to create flow, report message::
+
+    Invalid queue region indexes.: Invalid argument
+
+4. "--rxq=7 --txq=7", set queue group 8 queues::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions rss queues 0 1 2 3 4 5 6 7 end / end
+
+   Failed to create flow, report message::
+
+    Invalid queue region indexes.: Invalid argument
+
+5. check there is no rule listed.
+
+Subcase 3: Invalid parameters of GTPU input set
+-----------------------------------------------
+
+1. Invalid value of teid and qfi::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc qfi is 0x100 / end actions queue index 1 / end
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x100000000 / gtp_psc qfi is 0x5 / end actions queue index 2 / end
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x100000000 / end actions queue index 1 / end
+
+   Failed to create flow, report message "Bad arguments"
+
+2. check there is no rule listed.
+
+Subcase 4: unsupported type of L2 ethertype
+-------------------------------------------
+
+1. create rules for IP/IPV6::
+
+    flow create 0 ingress pattern eth type is 0x0800 / end actions queue index 1 / end
+    flow create 0 ingress pattern eth type is 0x86dd / end actions queue index 1 / end
+
+   Failed to create flow, report the error message::
+
+    Unsupported ether_type.: Invalid argument
+
+2. check there is no rule listed.
+
+Subcase 5: Duplicated rules
+---------------------------
+
+1. Create a FDIR rule::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 1 / end
+
+   the rule is created successfully.
+
+2. Create the same rule again, Failed to create flow, report message::
+
+    Add filter rule failed.: Operation not permitted
+
+3. check there is only one rule listed.
+
+Subcase 6: conflicted rules
+---------------------------
+
+1. Create a FDIR rule::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 1 / end
+
+   the rule is created successfully.
+
+2. Create a rule with same input set but different action::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 2 / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions drop / end
+
+   Failed to create the two flows, report message::
+
+    Add filter rule failed.: Operation not permitted
+
+3. check there is only one rule listed.
+
+Subcase 7: conflicted actions
+-----------------------------
+
+1. Create a rule with two conflicted actions::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 1 / rss queues 2 3 end / end
+
+   Failed to create flow, report message::
+
+    Unsupported action combination: Invalid argument
+
+2. check there is no rule listed.
+
+Subcase 8: void action
+----------------------
+
+1. Create a rule with void action::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc qfi is 0x34 / end actions end
+
+   Failed to create flow, report message::
+
+    Emtpy action: Invalid argument
+
+2. check there is no rule listed.
+
+Subcase 9: delete a non-existent rule
+-------------------------------------
+
+1. show the rule list of port 0::
+
+    flow list 0
+
+   There is no rule listed.
+   show the rule list of port 1::
+
+    testpmd> flow list 1
+    Invalid port 1
+
+2. destroy rule 0 of port 0::
+
+    flow destroy 0 rule 0
+
+   There is no error message reported.
+   destroy rule 0 of port 1::
+
+    testpmd> flow destroy 1 rule 0
+    Invalid port 1
+
+3. flush rules of port 0::
+
+    flow flush 0
+
+   There is no error message reported.
+   flush rules of port 1::
+
+    testpmd> flow flush 1
+    port_flow_complain(): Caught PMD error type 1 (cause unspecified): No such device: No such device
+
+Subcase 10: unsupported input set field
+--------------------------------------
+
+1. Create a IPV4_PAY rule with TC input set::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 tc is 2 / end actions queue index 1 / end
+
+   Failed to create flow, report message::
+
+    Bad arguments
+
+2. check there is no rule listed.
+
+Subcase 11: void input set value
+--------------------------------
+
+1. Create a IPV4_PAY rule with void input set value::
+
+    flow create 0 ingress pattern eth / ipv4 / end actions queue index 1 / end
+
+   Failed to create flow, report message::
+
+    Invalid input set: Invalid argument
+
+2. check there is no rule listed.
+
+Subcase 12: unsupported pattern with OS package
+-----------------------------------------------
+
+1. Create a GTPU rule with OS default package::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc qfi is 0x34 / end actions drop / end
+
+   Failed to create flow, report error message::
+
+    Add filter rule failed.: Operation not permitted
+
+2. check there is no rule listed.
+
+Subcase 13: invalid port
+------------------------
+
+1. Create a rule with invalid port::
+
+    flow create 1 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 ttl is 2 tos is 4 / end actions queue index 1 / end
+
+   Failed to create flow, report message::
+
+    No such device: No such device
+
+2. check there is no rule listed on port 0,
+   check on port 1::
+
+    testpmd> flow list 1
+    Invalid port 1
+
+Test case: pf vf combination
+============================
+
+Subcase 1: same rules
+---------------------
+
+1. create the same rule on pf0 and pf1 successfully::
+
+    # ethtool -N enp134s0f0 flow-type tcp4 src-ip 192.168.0.20 dst-ip 192.168.0.21 src-port 22 dst-port 23 action 1
+    Added rule with ID 15359
+    # ethtool -N enp134s0f1 flow-type tcp4 src-ip 192.168.0.20 dst-ip 192.168.0.21 src-port 22 dst-port 23 action 1
+    Added rule with ID 15359
+
+2. show the rules::
+
+    # ethtool -n enp134s0f0
+    112 RX rings available
+    Total 1 rules
+
+    Filter: 15359
+            Rule Type: TCP over IPv4
+            Src IP addr: 192.168.0.20 mask: 0.0.0.0
+            Dest IP addr: 192.168.0.21 mask: 0.0.0.0
+            TOS: 0x0 mask: 0xff
+            Src port: 22 mask: 0x0
+            Dest port: 23 mask: 0x0
+            Action: Direct to VF 0 queue 1
+
+    # ethtool -n enp134s0f1
+    112 RX rings available
+    Total 1 rules
+
+    Filter: 15359
+            Rule Type: TCP over IPv4
+            Src IP addr: 192.168.0.20 mask: 0.0.0.0
+            Dest IP addr: 192.168.0.21 mask: 0.0.0.0
+            TOS: 0x0 mask: 0xff
+            Src port: 22 mask: 0x0
+            Dest port: 23 mask: 0x0
+            Action: Direct to VF 0 queue 1
+
+3. start testpmd on vf00 and vf01::
+
+    ./testpmd -c 0xff -n 6 -w 86:01.0 -w 86:01.1 --file-prefix=vf0 -- -i --rxq=16 --txq=16
+
+   create same rules with pf::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / tcp src is 22 dst is 23 / end actions queue index 1 / end
+    flow create 1 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / tcp src is 22 dst is 23 / end actions queue index 1 / end
+
+   list the rules::
+
+    testpmd> flow list 0
+    ID      Group   Prio    Attr    Rule
+    0       0       0       i--     ETH IPV4 TCP => QUEUE
+    testpmd> flow list 1
+    ID      Group   Prio    Attr    Rule
+    0       0       0       i--     ETH IPV4 TCP => QUEUE
+
+4. start testpmd on vf10 and vf11::
+
+    ./testpmd -c 0xff00 -n 6 -w 86:11.0 -w 86:11.1 --file-prefix=vf1 -- -i --rxq=16 --txq=16
+
+   create same rules with pf::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / tcp src is 22 dst is 23 / end actions queue index 1 / end
+    flow create 1 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / tcp src is 22 dst is 23 / end actions queue index 1 / end
+
+   list the rules::
+
+    testpmd> flow list 0
+    ID      Group   Prio    Attr    Rule
+    0       0       0       i--     ETH IPV4 TCP => QUEUE
+    testpmd> flow list 1
+    ID      Group   Prio    Attr    Rule
+    0       0       0       i--     ETH IPV4 TCP => QUEUE
+
+5. send matched packets to pf0 and pf1::
+
+    sendp([Ether(dst="68:05:ca:a3:1a:60")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="68:05:ca:a3:1a:61")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f0")
+
+   check the pf0 statistics::
+
+    ethtool -S enp134s0f0
+
+    rx_queue_1_packets: 1
+    rx_queue_1_bytes: 134
+
+   check the pf1 statistics::
+
+    ethtool -S enp134s0f1
+
+    rx_queue_1_packets: 1
+    rx_queue_1_bytes: 134
+
+   send mismatched packets to pf0 and pf1,
+   check the packets are redirected not to queue 1.
+
+6. send matched packets to vfs::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:66")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:77")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f0")
+    sendp([Ether(dst="00:11:22:33:44:88")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f0")
+
+   check the first packet is redirected to vf00 queue 1.
+   check the second packet is redirected to vf01 queue 1.
+   check the third packet is redirected to vf10 queue 1.
+   check the fourth packet is redirected to vf11 queue 1.
+
+7. send mismatched packets to vfs::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=24)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:66")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=24)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:77")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=24)/Raw('x' * 80)],iface="enp134s0f0")
+    sendp([Ether(dst="00:11:22:33:44:88")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=24)/Raw('x' * 80)],iface="enp134s0f0")
+
+   check the packets are redirected to same vf in order, but not queue 1.
+
+8. flush all the rules on vfs, and delete rules on pfs::
+
+    # ethtool -N enp134s0f0 delete 15359
+    # ethtool -N enp134s0f1 delete 15359
+    # ethtool -n enp134s0f0
+    112 RX rings available
+    Total 0 rules
+    # ethtool -n enp134s0f1
+    112 RX rings available
+    Total 0 rules
+
+9. send matched packets to pfs and vfs,
+   all the packets are not redirected to expected queue.
+
+Subcase 2: same input set, different actions
+--------------------------------------------
+
+1. create the same rule on pf0 and pf 1 successfully::
+
+    # ethtool -N enp134s0f0 flow-type tcp4 src-ip 192.168.0.20 dst-ip 192.168.0.21 src-port 22 dst-port 23 action 1
+    Added rule with ID 15359
+    # ethtool -N enp134s0f1 flow-type tcp4 src-ip 192.168.0.20 dst-ip 192.168.0.21 src-port 22 dst-port 23 action 2
+    Added rule with ID 15359
+
+2. start testpmd on vf00 and vf01::
+
+    ./testpmd -c 0xff -n 6 -w 86:01.0 -w 86:01.1 --file-prefix=vf0 -- -i --rxq=16 --txq=16
+
+   create same rules with pf::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / tcp src is 22 dst is 23 / end actions queue index 1 / mark id 1 / end
+    flow create 1 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / tcp src is 22 dst is 23 / end actions rss queues 3 4 end / mark / end
+
+3. start testpmd on vf10 and vf11::
+
+    ./testpmd -c 0xff00 -n 6 -w 86:11.0 -w 86:11.1 --file-prefix=vf1 -- -i --rxq=16 --txq=16
+
+   create same rules with pf::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / tcp src is 22 dst is 23 / end actions drop / end
+    flow create 1 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / tcp src is 22 dst is 23 / end actions passthru / mark id 1 / end
+
+4. send matched packets to vfs::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:66")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:77")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f0")
+    sendp([Ether(dst="00:11:22:33:44:88")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f0")
+
+   check pkt1 to queue 1 of vf00 with FDIR matched ID=0x1,
+   pkt2 to queue 3 or 4 of vf01 with FDIR matched ID=0x0,
+   pkt3 is dropped by vf10, pkt4 is received with FDIR matched ID=0x1
+
+5. send mismatched packets to vfs::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=24)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:66")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=24)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:77")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=24)/Raw('x' * 80)],iface="enp134s0f0")
+    sendp([Ether(dst="00:11:22:33:44:88")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=24)/Raw('x' * 80)],iface="enp134s0f0")
+
+   check the packets are received without FDIR matched ID.
+
+6. send matched packets to pf0 and pf1::
+
+    sendp([Ether(dst="68:05:ca:a3:1a:60")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="68:05:ca:a3:1a:61")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f0")
+
+   check packet 1 is redirected to queue 1 of pf0,
+   packet 2 is redirected to queue 2 of pf1.
+   send mismatched packets to pf0 and pf1,
+   check the packets are not redirected to expected queue.
+
+7. flush all the rules on pfs and vfs, send the matched packets,
+   check the packets send to vfs are received without FDIR matched ID.
+   check the packets send to pfs are received but not redirected to expected queue.
+
+Subcase 3: different patterns, different actions
+------------------------------------------------
+
+1. create the same rule on pf0 and pf 1 successfully::
+
+    # ethtool -N enp134s0f0 flow-type tcp4 src-ip 192.168.0.20 dst-ip 192.168.0.21 src-port 22 dst-port 23 action 1
+    Added rule with ID 15358
+    # ethtool -N enp134s0f1 flow-type udp4 src-ip 192.168.0.22 dst-ip 192.168.0.23 src-port 22 dst-port 23 action -1
+    Added rule with ID 15359
+
+2. start testpmd on vf00 and vf01::
+
+    ./testpmd -c 0xff -n 6 -w 86:01.0 -w 86:01.1 --file-prefix=vf0 -- -i --rxq=16 --txq=16
+
+   create same rules with pf::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / tcp src is 22 dst is 23 / end actions rss queues 2 3 end / end
+    flow create 1 ingress pattern eth / ipv4 src is 192.168.0.22 dst is 192.168.0.23 / udp src is 22 dst is 23 / end actions queue index 5 / mark / end
+
+3. start testpmd on vf10 and vf11::
+
+    ./testpmd -c 0xff00 -n 6 -w 86:11.0 -w 86:11.1 --file-prefix=vf1 -- -i --rxq=16 --txq=16
+
+   create same rules with pf::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.22 dst is 192.168.0.23 / udp src is 22 dst is 23 / end actions queue index 5 / mark id 1 / end
+    flow create 1 ingress pattern eth / ipv4 src is 192.168.0.22 dst is 192.168.0.23 tos is 4 / tcp src is 22 dst is 23 / end actions drop / end
+
+4. send matched packets to vfs::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:66")/IP(src="192.168.0.22",dst="192.168.0.23")/UDP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:77")/IP(src="192.168.0.22",dst="192.168.0.23")/UDP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f0")
+    sendp([Ether(dst="00:11:22:33:44:88")/IP(src="192.168.0.22",dst="192.168.0.23",tos=4)/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f0")
+
+   check pkt1 to queue 2 or 3 of vf00 without FDIR matched ID,
+   pkt2 to queue 5 of vf01 with FDIR matched ID=0x0,
+   pkt3 to queue 5 of vf10 with FDIR matched ID=0x1,
+   pkt4 is dropped by vf11.
+
+5. send mismatched packets to vfs::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=24)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:66")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=24)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:77")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=24)/Raw('x' * 80)],iface="enp134s0f0")
+    sendp([Ether(dst="00:11:22:33:44:88")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=24)/Raw('x' * 80)],iface="enp134s0f0")
+
+   check the packets are received without FDIR matched ID.
+
+6. send matched packets to pf0 and pf1::
+
+    sendp([Ether(dst="68:05:ca:a3:1a:60")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="68:05:ca:a3:1a:61")/IP(src="192.168.0.22",dst="192.168.0.23")/UDP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f0")
+
+   check packet 1 is redirected to queue 1 of pf0::
+
+    rx_queue_1_packets: 1
+    rx_queue_1_bytes: 134
+
+   packet 2 is dropped by pf1::
+
+    rx_dropped: 1
+
+   send mismatched packets to pf0 and pf1,
+   check the packets are received but not redirected to expected queue.
+
+7. flush all the rules on pfs and vfs, send the matched packets,
+   check the packets send to vfs are received without FDIR matched ID.
+   check the packets send to pfs are received but not redirected to expected queue.
+
+Test case: Max number
+=====================
+
+Subcase 1: 14336 rules on 1 vf
+------------------------------
+
+1. create 14336 rules on vf00::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.0 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.1 / end actions queue index 1 / mark / end
+    ......
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.55.255 / end actions queue index 1 / mark / end
+
+   all the rules are created successfully.
+
+2. create one more rule::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.56.0 / end actions queue index 1 / mark / end
+
+   the rule failed to create. return the error message.
+
+3. check the rule list, there are 14336 rules listed.
+
+4. send matched packets for rule 0 and rule 14335::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.0")/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.55.255")/Raw('x' * 80)],iface="enp134s0f1")
+
+   check all packets are redirected to expected queue with FDIR matched ID=0x0
+
+5. create a rule on vf01, it failed,
+   check the error message, the rule number has expired the max rule number.
+
+6. create a rule on vf10, it failed,
+   check the error message, the rule number has expired the max rule number.
+
+7. flush all the rules, check the rule list,
+   there is no rule listed.
+
+8. verify matched packets for rule 0  and rule 14335 received without FDIR matched ID.
+
+Subcase 2: 14336 rules on 2 vfs of 2pfs
+---------------------------------------
+
+1. start testpmd on vf00::
+
+    ./testpmd -c 0xf -n 6 -w 86:01.0 --file-prefix=vf00 -- -i --rxq=4 --txq=4
+
+   create 1 rule on vf00::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.0 / end actions queue index 1 / mark / end
+
+   created successfully, check the rule is listed.
+
+2. start testpmd on vf10::
+
+    ./testpmd -c 0xf0 -n 6 -w 86:0a.0 --file-prefix=vf10 -- -i --rxq=4 --txq=4
+
+   create 14336 rules on vf10::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.0 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.1 / end actions queue index 1 / mark / end
+    ......
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.55.255 / end actions queue index 1 / mark / end
+
+   all the rules except the last one are created successfully.
+   check the rule list, there listed 14335 rules.
+
+3. send matched packet to vf00 and matched packet for rule 14334 to vf10,
+   check all packets are redirected to expected queue with FDIR matched ID=0x0
+
+4. flush all the rules, check the rule list,
+   there is no rule listed.
+
+5. verify matched packet received without FDIR matched ID.
+
+Subcase 3: 15360 rules on 1pf and 2vfs
+--------------------------------------
+each pf can create 1024 rules at least in 2 ports card.
+there are 14k rules shared by pfs and vfs.
+so 1 pf and 2 vfs can create 15360 rules at most.
+
+1. create 1025 rules on pf0::
+
+    ethtool -N enp134s0f0 flow-type tcp4 src-ip 192.168.0.0 dst-ip 192.168.100.2 src-port 32 dst-port 33 action 8
+    ethtool -N enp134s0f0 flow-type tcp4 src-ip 192.168.0.1 dst-ip 192.168.100.2 src-port 32 dst-port 33 action 8
+    ......
+    ethtool -N enp134s0f0 flow-type tcp4 src-ip 192.168.3.255 dst-ip 192.168.100.2 src-port 32 dst-port 33 action 8
+    ethtool -N enp134s0f0 flow-type tcp4 src-ip 192.168.4.0 dst-ip 192.168.100.2 src-port 32 dst-port 33 action 8
+
+   all the rules can be created successfully::
+
+    Added rule with ID <Rule ID>
+
+   List the rules on pf0::
+
+    ethtool -n enp134s0f0
+
+2. start testpmd on vf00::
+
+    ./testpmd -c 0xf -n 6 -w 86:01.0 --file-prefix=vf00 -- -i --rxq=4 --txq=4
+
+   create 1 rule on vf00::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.0 / end actions queue index 1 / mark / end
+
+   created successfully, check the rule is listed.
+
+2. start testpmd on vf10::
+
+    ./testpmd -c 0xf0 -n 6 -w 86:0a.0 --file-prefix=vf10 -- -i --rxq=4 --txq=4
+
+   create 14335 rules on vf10::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.0 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.1 / end actions queue index 1 / mark / end
+    ......
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.55.254 / end actions queue index 1 / mark / end
+
+   all the rules except the last one are created successfully.
+   check the rule list, there listed 14334 rules.
+
+3. send matched packet to vf00 and matched packet for rule 14333 to vf10,
+   check all packets are redirected to expected queue with FDIR matched ID=0x0
+
+4. delete 1 rule on pf0::
+
+    ethtool -N enp134s0f0 delete <Rule ID>
+
+5. create one more rule on vf10::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.55.254 / end actions queue index 1 / mark / end
+
+   the rule can be created successfully.
+
+6. send matched packet to vf10, it can be redirected to queue 1 with FDIR matched ID=0x0.
+
+7. flush all the rules, check the rule list,
+   there is no rule listed.
+
+8. verify matched packet received without FDIR matched ID.
+
+Subcase 4: 128 profiles
+-----------------------
+
+1. create 16 vfs on pf0::
+
+    echo 16 > /sys/bus/pci/devices/0000:86:00.0/sriov_numvfs
+
+   bind them to dpdk driver::
+
+    ./usertools/dpdk-devbind.py -b vfio-pci 86:01.0 86:01.1 86:01.2 86:01.3 86:01.4 86:01.5 86:01.6 86:01.7
+    ./usertools/dpdk-devbind.py -b vfio-pci 86:02.0 86:02.1 86:02.2 86:02.3 86:02.4 86:02.5 86:02.6 86:02.7
+
+   then start testpmd::
+
+    ./testpmd -c 0xf -n 6 --file-prefix=vf -- -i --rxq=4 --txq=4
+
+2. create 10 rules with different patterns on each port::
+
+    flow create 0 ingress pattern eth / ipv4 proto is 255 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / udp src is 22 dst is 23 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / tcp src is 22 dst is 23 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / sctp src is 22 dst is 23 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth / ipv6 proto is 0 / end actions mark / rss / end
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 / udp src is 22 dst is 23 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 / tcp src is 22 dst is 23 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth / ipv6 dst is CDCD:910A:2222:5498:8475:1111:3900:2020 src is 2001::2 / sctp src is 22 dst is 23 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth type is 0x8863 / end actions queue index 1 / mark id 1 / end
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions queue index 2 / end
+
+   created successfully on port 0-10,
+   failed from rule on port 11::
+
+    testpmd> flow create 11 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / tcp src is 22 dst is 23 / end actions queue index 1 / mark / end
+    eth
+    iavf_execute_vf_cmd(): No response or return failure (-5) for cmd 47
+    iavf_fdir_add(): fail to execute command OP_ADD_FDIR_FILTER
+    iavf_flow_create(): Failed to create flow
+    port_flow_complain(): Caught PMD error type 2 (flow rule (handle)): Add filter rule failed.: Operation not permitted
+
+3. list the rules on port 0-10::
+
+    testpmd> flow list 10
+    ID      Group   Prio    Attr    Rule
+    0       0       0       i--     ETH IPV4 => QUEUE MARK
+    1       0       0       i--     ETH IPV4 UDP => QUEUE MARK
+    2       0       0       i--     ETH IPV4 TCP => QUEUE MARK
+    3       0       0       i--     ETH IPV4 SCTP => QUEUE MARK
+    4       0       0       i--     ETH IPV6 => MARK RSS MARK
+    5       0       0       i--     ETH IPV6 UDP => QUEUE MARK
+    6       0       0       i--     ETH IPV6 TCP => QUEUE MARK
+    7       0       0       i--     ETH IPV6 SCTP => QUEUE MARK
+    8       0       0       i--     ETH => QUEUE MARK
+    9       0       0       i--     ETH IPV4 UDP PFCP => QUEUE
+
+   list the rules on port 11-15, there is no rule listed.
+   110 rules can be created successfully, which applied 110 profiles.
+
+   Note: there are 128 profiles in total.
+   each pf apply for 8 profiles when kernel driver init,
+   4 for non-tunnel packet, 4 for tunnel packet.
+   profile 0 and profile 1 are default profile for specific packet.
+   we use 2*100G card, so only 110 profiles can be used for vf.
+
+4. send matched packets to port 10,
+   the packets are redirected to the expected queue.
+
+5. flush rules on port 10::
+
+    flow flush 10
+
+   there is no rule listed on port 10.
+   all the rule can be listed correctly in other ports.
+   send matched packets to port 10,
+   the packets are received without FDIR matched ID.
+
+6. create rule on port 11 again::
+
+    testpmd> flow create 11 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / tcp src is 22 dst is 23 / end actions queue index 1 / mark / end
+    eth
+    iavf_execute_vf_cmd(): No response or return failure (-5) for cmd 47
+    iavf_fdir_add(): fail to execute command OP_ADD_FDIR_FILTER
+    iavf_flow_create(): Failed to create flow
+    port_flow_complain(): Caught PMD error type 2 (flow rule (handle)): Add filter rule failed.: Operation not permitted
+
+   still failed.
+
+Test case: Stress test
+======================
+
+Subcase 1: port stop/port start
+-------------------------------
+
+1. create a rule::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / end actions queue index 1 / mark / end
+
+2. list the rule and send matched packet::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21") / Raw('x' * 80)],iface="enp134s0f1")
+
+   check the packet are redirected to queue 1 with FDIR matched ID=0x0
+
+3. stop the port, then start the port::
+
+    testpmd> port stop 0
+    testpmd> port start 0
+
+4. show the rule list, the rule is still there.
+
+5. verify matched packet can be still redirected to queue 1 with FDIR matched ID=0x0.
+
+Subcase 2: add/delete rules
+---------------------------
+
+1. create two rules::
+
+    flow create 0 ingress pattern eth / ipv4 proto is 255 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.21 / tcp src is 22 dst is 23 / end actions rss queues 2 3 end / mark id 1 / end
+
+   return the message::
+
+    Flow rule #0 created
+    Flow rule #1 created
+
+   list the rules::
+
+    testpmd> flow list 0
+    ID      Group   Prio    Attr    Rule
+    0       0       0       i--     ETH IPV4 => QUEUE MARK
+    1       0       0       i--     ETH IPV4 TCP => RSS MARK
+
+2. delete the rules::
+
+    testpmd> flow flush 0
+
+3. repeat the create and delete operations in step1-2 14336 times.
+
+4. create the two rules one more time, check the rules listed.
+
+5. send matched packet::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21", proto=255)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+
+   check packet 1 is redirected to queue 1 with FDIR matched ID=0x0
+   check packet 2 is redirected to queue 2 or queue 3 with FDIR matched ID=0x1
+
+Subcase 3: add/delete rules on two VFs
+--------------------------------------
+
+1. create a rule on each vf::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 5 / end
+    flow create 1 ingress pattern eth / ipv4 src is 192.168.0.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 5 / end
+
+   return the message::
+
+    Flow rule #0 created
+    Flow rule #0 created
+
+   list the rules::
+
+    testpmd> flow list 0
+    ID      Group   Prio    Attr    Rule
+    0       0       0       i--     ETH IPV4 TCP => QUEUE
+    testpmd> flow list 1
+    ID      Group   Prio    Attr    Rule
+    0       0       0       i--     ETH IPV4 TCP => QUEUE
+
+2. delete the rules::
+
+    flow destroy 0 rule 0
+    flow destroy 1 rule 0
+
+3. repeate the create and delete operations in step1-2 14336 times with different IP src address.
+
+4. create the rule on each vf one more time, check the rules listed::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.56.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 5 / end
+    flow create 1 ingress pattern eth / ipv4 src is 192.168.56.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 5 / end
+
+5. send matched packet::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.56.0",dst="192.1.0.0",tos=4)/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:66")/IP(src="192.168.56.0",dst="192.1.0.0",tos=4)/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+
+   check the packet is redirected to queue 5 of two vfs.
+
+Subcase 4: delete rules
+-----------------------
+
+1. create 3 rules and destory the first rule::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.56.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.56.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 24 / end actions queue index 2 / mark / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.56.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 25 / end actions queue index 3 / mark / end
+
+   there are rule 0/1/2 listed::
+
+    flow list 0
+
+   send packets match rule 0, rule 1 and rule 2,
+   Verify all packets can be redirected to expected queue and FDIR matched ID.
+   destory the first rule::
+
+    flow destroy 0 rule 0
+
+   list the rules, verify there are only rule 1 and rule 2 listed.
+   send packet matched rule 0, verify it is received without FDIR matched ID.
+   send packets matched rule 1 and rule 2, Verify all packets be redirected with FDIR matched ID.
+   flush rules::
+
+    flow flush 0
+
+   send packets match rule 0, rule 1 and rule 2, verify all packets received without FDIR matched ID.
+
+2. create 3 rules and destory the second rule::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.56.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.56.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 24 / end actions queue index 2 / mark / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.56.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 25 / end actions queue index 3 / mark / end
+
+   there are rule 0/1/2 listed::
+
+    flow list 0
+
+   send packets match rule 0, rule 1 and rule 2,
+   Verify all packets can be redirected to expected queue and FDIR matched ID.
+   destory the second rule::
+
+    flow destroy 0 rule 1
+
+   list the rules, verify there are only rule 0 and rule 2 listed.
+   send packet matched rule 1, verify it is received without FDIR matched ID.
+   send packets matched rule 0 and rule 2, Verify all packets be redirected with FDIR matched ID.
+   flush rules::
+
+    flow flush 0
+
+   send packets match rule 0, rule 1 and rule 2, verify all packets received without FDIR matched ID.
+
+3. create 3 rules and destory the third rule::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.56.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.56.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 24 / end actions queue index 2 / mark / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.56.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 25 / end actions queue index 3 / mark / end
+
+   there are rule 0/1/2 listed::
+
+    flow list 0
+
+   send packets match rule 0, rule 1 and rule 2,
+   Verify all packets can be redirected to expected queue with FDIR matched ID.
+   destory the last rule::
+
+    flow destroy 0 rule 2
+
+   list the rules, verify there are only rule 0 and rule 1 listed.
+   send packet matched rule 2, verify it is received without FDIR matched ID.
+   send packets matched rule 0 and rule 1, Verify all packets be redirected with FDIR matched ID.
+   flush rules::
+
+    flow flush 0
+
+   send packets match rule 0, rule 1 and rule 2, verify all packets are received without FDIR matched ID.
+
+Subcase 5: VF port reset and create a new rule
+----------------------------------------------
+
+1. create a rule on vf00 and vf01::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 5 / mark / end
+    flow create 1 ingress pattern eth / ipv4 src is 192.168.0.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 5 / mark / end
+
+2. send matched packet::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.0",dst="192.1.0.0", tos=4)/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:66")/IP(src="192.168.0.0",dst="192.1.0.0", tos=4)/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+
+   check the packet is redirected to queue 5 of port 0 and port 1 with FDIR matched ID=0x0.
+
+3. vf reset::
+
+    port stop 0
+    port reset 0
+    port start 0
+
+   the port can be stop/reset/start normally without error message.
+
+4. check the rule still be listed,
+   send matched packet to vf0, check the packet is redirected by RSS without FDIR matched ID.
+   send matched packet to vf1, check the packet is redirected to queue 5 with FDIR matched ID=0x0.
+
+5. create rule 0 on port 0 again, the rule can be created successfully.
+   send matched packet to port 0, the packet can be redirected to queue 5 with FDIR matched ID=0x0.
+
+6. quit and relaunch testpmd, create same rules successfully.
+
+7. send matched packets, check them redirected to expected queue with FDIR matched ID.
+
+Subcase 6: VF port reset and delete the rule
+--------------------------------------------
+
+1. create a rule on vf00 and vf01::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 5 / mark / end
+    flow create 1 ingress pattern eth / ipv4 src is 192.168.0.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 5 / mark / end
+
+2. send matched packet::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.0",dst="192.1.0.0", tos=4)/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:66")/IP(src="192.168.0.0",dst="192.1.0.0", tos=4)/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+
+   check the packet is redirected to queue 5 of port 0 and port 1 with FDIR matched ID=0x0.
+
+3. vf reset::
+
+    port stop 0
+    port reset 0
+    port start 0
+
+   the port can be stop/reset/start normally without error message.
+
+4. check the rule still be listed,
+   send matched packet to vf0, check the packet is redirected by RSS without FDIR matched ID.
+   send matched packet to vf1, check the packet is redirected to queue 5 with FDIR matched ID=0x0.
+
+5. destroy rule 0 of vf0, report error, but no core dump.
+   destroy rule 0 of vf1 successfully.
+   send matched packet to vf0, check the packet is redirected by RSS without FDIR matched ID.
+   send matched packet to vf1, check the packet is redirected by RSS without FDIR matched ID.
+
+6. quit and relaunch testpmd, create same rules successfully.
+
+7. send matched packets, check them redirected to expected queue with FDIR matched ID.
+
+Subcase 7: PF reset VF and create a new rule
+--------------------------------------------
+
+1. create a rule on vf00 and vf01::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 5 / mark / end
+    flow create 1 ingress pattern eth / ipv4 src is 192.168.0.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 5 / mark / end
+
+2. send matched packet::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.0",dst="192.1.0.0", tos=4)/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:66")/IP(src="192.168.0.0",dst="192.1.0.0", tos=4)/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+
+   check the packet is redirected to queue 5 with FDIR matched ID=0x0.
+
+3. pf trigger vf reset::
+
+    ip link set enp134s0f0 vf 0 mac 00:11:22:33:44:56
+
+4. testpmd shows::
+
+    Port 0: reset event
+
+   then vf reset::
+
+    port stop 0
+    port reset 0
+    port start 0
+
+   the port can be stop/reset/start normally without error message.
+
+5. check the rule of vf0 still be listed,
+   send matched packet to vf0 with new mac address, check the packet is redirected by RSS without FDIR matched ID.
+   send matched packet to vf1, check the packet is redirected to queue 5 with FDIR matched ID=0x0.
+
+6. create a new rule on port 0, the rule can be created successfully::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.0 dst is 192.1.0.1 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 6 / mark id 1 / end
+
+   send matched packet to port 0, the packet can be redirected to queue 6 with FDIR matched ID=0x1.
+
+7. quit and relaunch testpmd, then create same rules successfully.
+
+8. send matched packets, check them redirected to expected queue with FDIR matched ID.
+
+Subcase 8: PF reset VF and delete the rule
+------------------------------------------
+
+1. create a rule on vf00 and vf01::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 5 / mark / end
+    flow create 1 ingress pattern eth / ipv4 src is 192.168.0.0 dst is 192.1.0.0 tos is 4 / tcp src is 22 dst is 23 / end actions queue index 5 / mark / end
+
+2. send matched packet::
+
+    sendp([Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.0",dst="192.1.0.0", tos=4)/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+    sendp([Ether(dst="00:11:22:33:44:66")/IP(src="192.168.0.0",dst="192.1.0.0", tos=4)/TCP(sport=22,dport=23)/Raw('x' * 80)],iface="enp134s0f1")
+
+   check the packet is redirected to queue 5 with FDIR matched ID=0x0.
+
+3. pf trigger vf reset::
+
+    ip link set enp134s0f0 vf 0 mac 00:11:22:33:44:56
+
+4. testpmd shows::
+
+    Port 0: reset event
+
+   then vf reset::
+
+    port stop 0
+    port reset 0
+    port start 0
+
+   the port can be stop/reset/start normally without error message.
+
+5. destroy rule 0 of vf0, report error, but no core dump.
+   destroy rule 0 of vf1 successfully.
+   send matched packet to vf0, check the packet is redirected by RSS without FDIR matched ID.
+   send matched packet to vf1, check the packet is redirected by RSS without FDIR matched ID.
+
+6. create rule 0 on port 0 again, the rule can be created successfully.
+   send matched packet to port 0, the packet can be redirected to queue 5 with FDIR matched ID=0x0.
+
+7. quit and relaunch testpmd, then create same rules successfully.
+
+8. send matched packets, check them redirected to expected queue with FDIR matched ID.
+
+Subcase 9: create 2048 rules on VF00 and VF01 and VF10 and VF11 at meantime
+---------------------------------------------------------------------------
+
+1. start testpmd on vf00::
+
+    ./testpmd -c 0x3 -n 6 -w 86:01.0 --file-prefix=vf00 -- -i --rxq=4 --txq=4
+
+   start testpmd on vf01::
+
+    ./testpmd -c 0xc -n 6 -w 86:01.1 --file-prefix=vf01 -- -i --rxq=4 --txq=4
+
+   start testpmd on vf10::
+
+    ./testpmd -c 0x30 -n 6 -w 86:11.0 --file-prefix=vf10 -- -i --rxq=4 --txq=4
+
+   start testpmd on vf11::
+
+    ./testpmd -c 0xc0 -n 6 -w 86:11.1 --file-prefix=vf11 -- -i --rxq=4 --txq=4
+
+2. create 2048 rules on vf00::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.0 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.1 / end actions queue index 1 / mark / end
+    ......
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.7.255 / end actions queue index 1 / mark / end
+
+   created successfully, check 2048 rules are listed.
+   create 2048 rules on vf01/vf10/vf11 at meantime::
+
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.0 / end actions queue index 1 / mark / end
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.0.1 / end actions queue index 1 / mark / end
+    ......
+    flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 dst is 192.168.7.255 / end actions queue index 1 / mark / end
+
+   all the rules are created successfully.
+   check the rule list, there listed 2048 rules.
+   send packet to the four vfs, the packets can be redirected to expected queue with mark ID.
+
+3. flush all the rules on four VFs at meantime, there is no error reported.
+   send packet to the four vfs, the packets are distributed by RSS without mark ID.
+
+Test case: PFCP coverage test
+=============================
+Subcase 1: PFCP FDIR vlan strip on HW checksum offload check
+------------------------------------------------------------
+1. start testpmd on vf00::
+
+    ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xff -n 6 -w 86:01.0 --file-prefix=vf -- -i --rxq=16 --txq=16 --enable-rx-cksum --port-topology=loop
+
+2. Enable vlan filter and receipt of VLAN packets with VLAN Tag Identifier 1 on port 0.
+   Enable vlan strip on port 0::
+
+    testpmd> vlan set filter on 0
+    testpmd> rx_vlan add 1 0
+    testpmd> vlan set strip on 0
+
+3. enable hardware checksum::
+
+    testpmd> set fwd csum
+    Set csum packet forwarding mode
+    testpmd> port stop all
+    testpmd> csum set ip hw 0
+    testpmd> csum set udp hw 0
+    testpmd> port start all
+    testpmd> set verbose 1
+    testpmd> start
+
+4. DUT create fdir rules for MAC_IPV4_PFCP_NODE/MAC_IPV4_PFCP_SESSION/MAC_IPV6_PFCP_NODE/MAC_IPV6_PFCP_SESSION with queue index and mark::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions queue index 1 / mark id 1 / end
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 / end actions queue index 2 / mark id 2 / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 0 / end actions queue index 3 / mark id 3 / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 1 / end actions queue index 4 / mark id 4 / end
+
+   DUT check the packets are redirected to expected queue with mark id on port 0.
+
+5. Tester send matched packets with VLAN tag "1" and incorrect checksum::
+
+    sendp(Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)/IP(chksum=0xf)/UDP(sport=22, dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)/IP(chksum=0xf)/UDP(sport=22, dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)/IP()/UDP(sport=22, dport=8805, chksum=0xf)/PFCP(Sfield=0),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)/IP()/UDP(sport=22, dport=8805, chksum=0xf)/PFCP(Sfield=1),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)/IPv6()/UDP(sport=22, dport=8805, chksum=0xf)/PFCP(Sfield=0),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)/IPv6()/UDP(sport=22, dport=8805, chksum=0xf)/PFCP(Sfield=1),iface="enp134s0f1")
+
+6. DUT check the packets are redirected to expected queue with mark id on port 0 with "PKT_RX_VLAN_STRIPPED",
+   and report the checksum error::
+
+    PKT_RX_L4_CKSUM_BAD PKT_RX_IP_CKSUM_GOOD
+
+   or::
+
+    PKT_RX_L4_CKSUM_GOOD PKT_RX_IP_CKSUM_BAD
+
+   verify that the same number of packet are correctly received on the traffic generator side port A without VLAN tag "1".
+   And IPv4 checksum, UDP checksum need be validated as pass by the tester.
+   The IPv4 source address will not be changed by testpmd.
+
+7. DUT verify rule can be listed and destroyed::
+
+    testpmd> flow list 0
+
+   destroy the rules::
+
+    testpmd> flow flush 0
+
+8. Tester send matched packets with VLAN tag "1" and incorrect checksum.
+   DUT check all the packets are distributed to queue 0 without mark id.
+   all the received packets are with "PKT_RX_VLAN_STRIPPED", and report the checksum error,
+   verify that the same number of packet are correctly received on the traffic generator side port A without VLAN tag "1".
+   And IPv4 checksum, UDP checksum need be validated as pass by the tester.
+   The IPv4 source address will not be changed by testpmd.
+
+subcase 2: PFCP FDIR vlan strip off SW checksum offload check
+-------------------------------------------------------------
+1. start testpmd on vf00::
+
+    ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xff -n 6 -w 86:01.0 --file-prefix=vf -- -i --rxq=16 --txq=16 --enable-rx-cksum --port-topology=loop
+
+2. Enable vlan filter and receipt of VLAN packets with VLAN Tag Identifier 1 on port 0.
+   Disable vlan strip on port 0::
+
+    testpmd> vlan set filter on 0
+    testpmd> rx_vlan add 1 0
+    testpmd> vlan set strip off 0
+
+3. enable software checksum::
+
+    testpmd> set fwd csum
+    Set csum packet forwarding mode
+    testpmd> port stop all
+    testpmd> csum set ip sw 0
+    testpmd> csum set udp sw 0
+    testpmd> port start all
+    testpmd> set verbose 1
+    testpmd> start
+
+4. DUT create fdir rules for MAC_IPV4_PFCP_NODE/MAC_IPV4_PFCP_SESSION/MAC_IPV6_PFCP_NODE/MAC_IPV6_PFCP_SESSION with queue index and mark::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions queue index 1 / mark id 1 / end
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 / end actions queue index 2 / mark id 2 / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 0 / end actions queue index 3 / mark id 3 / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 1 / end actions queue index 4 / mark id 4 / end
+
+5. Tester send matched packets with VLAN tag "1" and incorrect checksum::
+
+    sendp(Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)/IP(chksum=0xf)/UDP(sport=22, dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)/IP(chksum=0xf)/UDP(sport=22, dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)/IP()/UDP(sport=22, dport=8805, chksum=0xf)/PFCP(Sfield=0),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)/IP()/UDP(sport=22, dport=8805, chksum=0xf)/PFCP(Sfield=1),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)/IPv6()/UDP(sport=22, dport=8805, chksum=0xf)/PFCP(Sfield=0),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:55")/Dot1Q(vlan=1)/IPv6()/UDP(sport=22, dport=8805, chksum=0xf)/PFCP(Sfield=1),iface="enp134s0f1")
+
+6. DUT check the packets are redirected to expected queue with mark id on port 0 without "PKT_RX_VLAN_STRIPPED",
+   and report the checksum error::
+
+    PKT_RX_L4_CKSUM_BAD PKT_RX_IP_CKSUM_GOOD
+
+   or::
+
+    PKT_RX_L4_CKSUM_GOOD PKT_RX_IP_CKSUM_BAD
+
+   verify that the same number of packet are correctly received on the traffic generator side port A with VLAN tag "1".
+   And UDP checksum need be validated as pass by the tester.
+   The checksum is indeed recalculated by software algorithms.
+
+7. DUT verify rule can be listed and destroyed::
+
+    testpmd> flow list 0
+
+   destroy the rule::
+
+    testpmd> flow flush 0
+
+8. Tester send matched packets with VLAN tag "1" and incorrect checksum.
+
+9. DUT check the packets are distributed to queue 0 without mark id without "PKT_RX_VLAN_STRIPPED", and report the checksum error.
+   verify that the same number of packet are correctly received on the traffic generator side port A with VLAN tag "1".
+   And UDP checksum need be validated as pass by the tester.
+   The checksum is indeed recalculated by software algorithms.
+
+subcase 3: PFCP FDIR vlan insert on
+-----------------------------------
+1. start testpmd on vf00::
+
+    ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xff -n 6 -w 86:01.0 --file-prefix=vf -- -i --rxq=16 --txq=16
+
+2. Enable vlan filter and insert VLAN Tag Identifier 1 to vlan packet sent from port 0::
+
+    testpmd> vlan set filter on 0
+    testpmd> rx_vlan add 1 0
+    testpmd> port stop all
+    testpmd> tx_vlan set 0 1
+    testpmd> port start all
+    testpmd> set fwd mac
+
+3. DUT create fdir rules for MAC_IPV4_PFCP_NODE/MAC_IPV4_PFCP_SESSION/MAC_IPV6_PFCP_NODE/MAC_IPV6_PFCP_SESSION with queue index and mark::
+
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions queue index 1 / mark id 1 / end
+    flow create 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 / end actions queue index 2 / mark id 2 / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 0 / end actions queue index 3 / mark id 3 / end
+    flow create 0 ingress pattern eth / ipv6 / udp / pfcp s_field is 1 / end actions queue index 4 / mark id 4 / end
+
+4. Tester send matched packets without VLAN tag::
+
+    sendp(Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=22, dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:55")/IP()/UDP(sport=22, dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:55")/IPv6()/UDP(sport=22, dport=8805)/PFCP(Sfield=0),iface="enp134s0f1")
+    sendp(Ether(dst="00:11:22:33:44:55")/IPv6()/UDP(sport=22, dport=8805)/PFCP(Sfield=1),iface="enp134s0f1")
+
+5. DUT check the packets are redirected to expected queue with mark id on port 0 without "PKT_RX_VLAN_STRIPPED",
+   verify that the same number of packet are correctly received on the traffic generator side port A with VLAN tag "1".
+
+6. DUT verify rule can be listed and destroyed::
+
+    testpmd> flow list 0
+
+   destroy the rule::
+
+    testpmd> flow destroy 0 rule 0
+    testpmd> flow destroy 0 rule 1
+    testpmd> flow destroy 0 rule 2
+    testpmd> flow destroy 0 rule 3
+
+7. Tester send matched packets without VLAN tag "1".
+
+8. DUT check the packets are not distributed to expected queue without mark id without "PKT_RX_VLAN_STRIPPED",
+   verify that the same number of packet are correctly received on the traffic generator side port A with VLAN tag "1".
+   And UDP checksum need be validated as pass by the tester.
-- 
2.7.4


             reply	other threads:[~2020-05-28  8:17 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-28 15:24 Peng Yuan [this message]
2020-06-01  3:24 ` Tu, Lijuan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1590679464-13576-1-git-send-email-yuan.peng@intel.com \
    --to=yuan.peng@intel.com \
    --cc=dts@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).