test suite reviews and discussions
 help / color / mirror / Atom feed
* Re: [dts] [PATCH V2 2/2] tests/cvl_dcf_switch_filter_gtpu: add dcf_switch_filter_gtpu test case
  2021-06-02 18:50 ` [dts] [PATCH V2 2/2] tests/cvl_dcf_switch_filter_gtpu: add dcf_switch_filter_gtpu test case Zhimin Huang
@ 2021-06-02 10:30   ` Huang, ZhiminX
  2021-06-10  6:59   ` Lin, Xueqin
  1 sibling, 0 replies; 7+ messages in thread
From: Huang, ZhiminX @ 2021-06-02 10:30 UTC (permalink / raw)
  To: dts; +Cc: Lin, Xueqin

[-- Attachment #1: Type: text/plain, Size: 396 bytes --]

> -----Original Message-----
> From: Huang, ZhiminX <zhiminx.huang@intel.com>
> Sent: Thursday, June 3, 2021 2:51 AM
> To: dts@dpdk.org
> Cc: Lin, Xueqin <xueqin.lin@intel.com>; Huang, ZhiminX
> <zhiminx.huang@intel.com>
> Subject: [dts] [PATCH V2 2/2] tests/cvl_dcf_switch_filter_gtpu: add
> dcf_switch_filter_gtpu test case
> 

Tested-by: Zhimin Huang <zhiminx.huang@intel.com >



[-- Attachment #2: CVLDCFSwitchFilterGTPUTest.log --]
[-- Type: application/octet-stream, Size: 1906916 bytes --]

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

* [dts] [PATCH V2 0/2] add dcf switch gtpu test case and test plan
@ 2021-06-02 18:50 Zhimin Huang
  2021-06-02 18:50 ` [dts] [PATCH V2 1/2] test_plans/dcf_switch_gtpu: add dcf_switch_filter_gtpu " Zhimin Huang
  2021-06-02 18:50 ` [dts] [PATCH V2 2/2] tests/cvl_dcf_switch_filter_gtpu: add dcf_switch_filter_gtpu test case Zhimin Huang
  0 siblings, 2 replies; 7+ messages in thread
From: Zhimin Huang @ 2021-06-02 18:50 UTC (permalink / raw)
  To: dts; +Cc: xueqin.lin, Zhimin Huang

*.add 26 test cases and testplan

Zhimin Huang (2):
  test_plans/dcf_switch_gtpu: add dcf_switch_filter_gtpu test plan
  tests/cvl_dcf_switch_filter_gtpu: add dcf_switch_filter_gtpu test case

 .../cvl_dcf_switch_filter_gtpu_test_plan.rst  | 1424 +++++++++++
 tests/TestSuite_cvl_dcf_switch_filter_gtpu.py | 2250 +++++++++++++++++
 2 files changed, 3674 insertions(+)
 create mode 100644 test_plans/cvl_dcf_switch_filter_gtpu_test_plan.rst
 create mode 100644 tests/TestSuite_cvl_dcf_switch_filter_gtpu.py

-- 
2.17.1


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

* [dts] [PATCH V2 1/2] test_plans/dcf_switch_gtpu: add dcf_switch_filter_gtpu test plan
  2021-06-02 18:50 [dts] [PATCH V2 0/2] add dcf switch gtpu test case and test plan Zhimin Huang
@ 2021-06-02 18:50 ` Zhimin Huang
  2021-06-10  6:54   ` Lin, Xueqin
  2021-06-18  5:56   ` Tu, Lijuan
  2021-06-02 18:50 ` [dts] [PATCH V2 2/2] tests/cvl_dcf_switch_filter_gtpu: add dcf_switch_filter_gtpu test case Zhimin Huang
  1 sibling, 2 replies; 7+ messages in thread
From: Zhimin Huang @ 2021-06-02 18:50 UTC (permalink / raw)
  To: dts; +Cc: xueqin.lin, Zhimin Huang

*.add cvl_dcf_switch_filter_gtpu testplan

Signed-off-by: Zhimin Huang <zhiminx.huang@intel.com>
---
 .../cvl_dcf_switch_filter_gtpu_test_plan.rst  | 1424 +++++++++++++++++
 1 file changed, 1424 insertions(+)
 create mode 100644 test_plans/cvl_dcf_switch_filter_gtpu_test_plan.rst

diff --git a/test_plans/cvl_dcf_switch_filter_gtpu_test_plan.rst b/test_plans/cvl_dcf_switch_filter_gtpu_test_plan.rst
new file mode 100644
index 00000000..4991e0e6
--- /dev/null
+++ b/test_plans/cvl_dcf_switch_filter_gtpu_test_plan.rst
@@ -0,0 +1,1424 @@
+.. Copyright (c) <2021>, Intel Corporation
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+
+   - Neither the name of Intel Corporation nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+   COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+   OF THE POSSIBILITY OF SUCH DAMAGE.
+
+================================
+CVL DCF Switch Filter GTPU Tests
+================================
+
+Description
+===========
+
+This document provides the plan for testing DCF switch filter of CVL
+
+Pattern and input set
+---------------------
+
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |    Packet Types     |           Pattern             |                Input Set                             |
+  +=====================+===============================+======================================================+
+  |                     |  MAC_IPV4_GTPU                |   [TEID], outer: l3[dst] [src]                       |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV6_GTPU                |   [TEID], outer: l3dst] [src]                        |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV4_GTPU_IPV4           |   [TEID], inner: l3[dst] [src]                       |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV4_GTPU_IPV4_TCP       |   [TEID], inner: l3[dst] [src] l4[dst] [src]         |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV4_GTPU_IPV4_UDP       |   [TEID], inner: l3[dst] [src] l4[dst] [src]         |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV4_GTPU_IPV6           |   [TEID], inner: l3[dst] [src]                       |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV4_GTPU_IPV6_TCP       |   [TEID], inner: l3[dst] [src] l4[dst] [src]         |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV4_GTPU_IPV6_UDP       |   [TEID], inner: l3[dst] [src] l4[dst] [src]         |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV6_GTPU_IPV4           |   [TEID], inner: l3[dst] [src]                       |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV6_GTPU_IPV4_TCP       |   [TEID], inner: l3[dst] [src] l4[dst] [src]         |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV6_GTPU_IPV4_UDP       |   [TEID], inner: l3[dst] [src] l4[dst] [src]         |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV6_GTPU_IPV6           |   [TEID], inner: l3[dst] [src]                       |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV6_GTPU_IPV6_TCP       |   [TEID], inner: l3[dst] [src] l4[dst] [src]         |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV6_GTPU_IPV6_UDP       |   [TEID], inner: l3[dst] [src] l4[dst] [src]         |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV4_GTPU_EH_IPV4        |   [QFI] [TEID], inner: l3[dst] [src]                 |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV4_GTPU_EH_IPV4_TCP    |   [QFI] [TEID], inner: l3[dst] [src] l4[dst] [src]   |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV4_GTPU_EH_IPV4_UDP    |   [QFI] [TEID], inner: l3[dst] [src] l4[dst] [src]   |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV4_GTPU_EH_IPV6        |   [QFI] [TEID], inner: l3[dst] [src]                 |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV4_GTPU_EH_IPV6_TCP    |   [QFI] [TEID], inner: l3[dst] [src] l4[dst] [src]   |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV4_GTPU_EH_IPV6_UDP    |   [QFI] [TEID], inner: l3[dst] [src] l4[dst] [src]   |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV6_GTPU_EH_IPV4        |   [QFI] [TEID], inner: l3[dst] [src]                 |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV6_GTPU_EH_IPV4_TCP    |   [QFI] [TEID], inner: l3[dst] [src] l4[dst] [src]   |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV6_GTPU_EH_IPV4_UDP    |   [QFI] [TEID], inner: l3[dst] [src] l4[dst] [src]   |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV6_GTPU_EH_IPV6        |   [QFI] [TEID], inner: l3[dst] [src]                 |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV6_GTPU_EH_IPV6_TCP    |   [QFI] [TEID], inner: l3[dst] [src] l4[dst] [src]   |
+  +---------------------+-------------------------------+------------------------------------------------------+
+  |                     |  MAC_IPV6_GTPU_EH_IPV6_UDP    |   [QFI] [TEID], inner: l3[dst] [src] l4[dst] [src]   |
+  +---------------------+-------------------------------+------------------------------------------------------+
+
+.. note::
+
+   1. The maximum input set length of a switch rule is 32 bytes, and src ipv6,
+      dst ipv6 account for 32 bytes. Therefore, for ipv6 cases, if need to test
+      fields other than src, dst ip, we create rule by removing src or dst ip in
+      the test plan.
+
+
+Supported action type
+---------------------
+
+* To vf/vsi
+
+
+Prerequisites
+=============
+
+1. Hardware:
+   columbiaville_25g/columbiaville_100g
+
+2. Software::
+
+      dpdk: http://dpdk.org/git/dpdk
+      scapy: http://www.secdev.org/projects/scapy/
+
+3. Copy specific ice package to /lib/firmware/updates/intel/ice/ddp/ice.pkg,
+   then load driver::
+
+     rmmod ice
+     insmod ice.ko
+
+4. Compile DPDK::
+
+     make -j install T=x86_64-native-linuxapp-gcc
+
+5. Get the pci device id of DUT, for example::
+
+     ./usertools/dpdk-devbind.py -s
+
+     0000:18:00.0 'Device 1593' if=enp24s0f0 drv=ice unused=vfio-pci
+     0000:18:00.1 'Device 1593' if=enp24s0f1 drv=ice unused=vfio-pci
+
+6. Generate 2 VFs on PF0::
+
+     echo 2 > /sys/bus/pci/devices/0000:18:00.0/sriov_numvfs
+
+     ./usertools/dpdk-devbind.py -s
+     0000:18:01.0 'Ethernet Adaptive Virtual Function 1889' if=enp24s1 drv=iavf unused=vfio-pci
+     0000:18:01.1 'Ethernet Adaptive Virtual Function 1889' if=enp24s1f1 drv=iavf unused=vfio-pci
+
+7. Set VF0 as trust::
+
+     ip link set enp24s0f0 vf 0 trust on
+
+8. Bind VFs to dpdk driver::
+
+     modprobe vfio-pci
+     ./usertools/dpdk-devbind.py -b vfio-pci 0000:18:01.0 0000:18:01.1
+
+9. Launch dpdk on VF0 and VF1, and VF0 request DCF mode::
+
+     ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0xf -n 4 -a 0000:18:01.0,cap=dcf -a 0000:18:01.1 -- -i
+     testpmd> set portlist 1
+     testpmd> set fwd rxonly
+     testpmd> set verbose 1
+     testpmd> start
+     testpmd> show port info all
+
+   check the VF0 driver is net_ice_dcf.
+
+Test step:
+==========
+
+* validate rule
+* create rule
+* send matched pkts and mismatched pkts
+* destroy rule
+* send matched pkts
+* flush rule
+
+
+take 'MAC_IPV4_GTPU_TEID_with_mask' for example:
+
+1.validate and create rule::
+
+   flow validate 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / end actions vf id 1 / end
+   Flow rule validated
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / end actions vf id 1 / end
+   Flow rule #0 created
+
+2.send 2 matched pkts and check port 1 received 2 pkts::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345688)/Raw("x" *20)
+
+   ---------------------- Forward statistics for port 1  ----------------------
+   RX-packets: 2              RX-dropped: 0             RX-total: 2
+   TX-packets: 0              TX-dropped: 0             TX-total: 0
+   ----------------------------------------------------------------------------
+
+   +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
+   RX-packets: 2              RX-dropped: 0             RX-total: 2
+   TX-packets: 0              TX-dropped: 0             TX-total: 0
+   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+3.send 1 mismatched pkts and check port 1 not received pkts::
+
+   p = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345677)/Raw("x" *20)
+
+   ---------------------- Forward statistics for port 1  ----------------------
+   RX-packets: 0              RX-dropped: 0             RX-total: 0
+   TX-packets: 0              TX-dropped: 0             TX-total: 0
+   ----------------------------------------------------------------------------
+
+   +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
+   RX-packets: 0              RX-dropped: 0             RX-total: 0
+   TX-packets: 0              TX-dropped: 0             TX-total: 0
+   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+4.destory rule and re-send step 2 matched pkts check port 1 not received pkts::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345688)/Raw("x" *20)
+
+   ---------------------- Forward statistics for port 1  ----------------------
+   RX-packets: 0              RX-dropped: 0             RX-total: 0
+   TX-packets: 0              TX-dropped: 0             TX-total: 0
+   ----------------------------------------------------------------------------
+
+   +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
+   RX-packets: 0              RX-dropped: 0             RX-total: 0
+   TX-packets: 0              TX-dropped: 0             TX-total: 0
+   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+
+Pattern: MAC_IPV4_GTPU
+----------------------
+
+Test case: MAC_IPV4_GTPU
+>>>>>>>>>>>>>>>>>>>>>>>>
+
+subcase 1: MAC_IPV4_GTPU_TEID_with_mask
+:::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345688)/Raw("x" *20)
+
+mismatched packets::
+
+   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345677)/Raw("x" *20)
+
+subcase 2: MAC_IPV4_GTPU_TEID_without_mask
+::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345688)/Raw("x" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345677)/Raw("x" *20)
+
+subcase 3: MAC_IPV4_GTPU_dst
+::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 dst is 192.168.1.2 / udp / gtpu / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.1.2")/UDP()/GTP_U_Header()/Raw("x" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.1.22")/UDP()/GTP_U_Header()/Raw("x" *20)
+
+subcase 4: MAC_IPV4_GTPU_src
+::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 src is 192.168.1.1 / udp / gtpu / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.1")/UDP()/GTP_U_Header()/Raw("x" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11")/UDP()/GTP_U_Header()/Raw("x" *20)
+
+subcase 5: MAC_IPV4_GTPU_src_dst
+::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp / gtpu / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.1", dst="192.168.1.2")/UDP()/GTP_U_Header()/Raw("x" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11", dst="192.168.1.2")/UDP()/GTP_U_Header()/Raw("x" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.1", dst="192.168.1.22")/UDP()/GTP_U_Header()/Raw("x" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/GTP_U_Header()/Raw("x" *20)
+
+subcase 6: MAC_IPV4_GTPU_teid_dst
+:::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 dst is 192.168.1.2 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.1.2")/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.1.22")/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.1.2")/UDP()/GTP_U_Header(teid=0x12345677)/Raw("x" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.1.22")/UDP()/GTP_U_Header(teid=0x12345677)/Raw("x" *20)
+
+subcase 7: MAC_IPV4_GTPU_teid_src
+:::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 src is 192.168.1.1 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.1")/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11")/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.1")/UDP()/GTP_U_Header(teid=0x12345677)/Raw("x" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11")/UDP()/GTP_U_Header(teid=0x12345677)/Raw("x" *20)
+
+
+subcase 8: MAC_IPV4_GTPU_ALL
+::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.1", dst="192.168.1.2")/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11", dst="192.168.1.2")/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.1", dst="192.168.1.22")/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
+   p5 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/GTP_U_Header(teid=0x12345677)/Raw("x" *20)
+
+Pattern: MAC_IPV6_GTPU
+----------------------
+reconfig all the cases of "Test case: MAC_IPV4_GTPU"
+
+    rule:
+        change ipv4 to ipv6, ipv4 address to ipv6 address.
+    packets:
+        change the packet's L3 layer from IP to IPv6;
+        change the ipv4 address to ipv6 address.
+
+Test case: MAC_IPV6_GTPU
+>>>>>>>>>>>>>>>>>>>>>>>>
+
+subcase 1: MAC_IPV6_GTPU_TEID_with_mask
+:::::::::::::::::::::::::::::::::::::::
+
+subcase 2: MAC_IPV6_GTPU_TEID_without_mask
+::::::::::::::::::::::::::::::::::::::::::
+
+subcase 3: MAC_IPV6_GTPU_dst
+::::::::::::::::::::::::::::
+
+subcase 4: MAC_IPV6_GTPU_src
+::::::::::::::::::::::::::::
+
+subcase 5: MAC_IPV6_GTPU_src_dst
+::::::::::::::::::::::::::::::::
+
+subcase 6: MAC_IPV6_GTPU_teid_dst
+:::::::::::::::::::::::::::::::::
+
+subcase 7: MAC_IPV6_GTPU_teid_src
+:::::::::::::::::::::::::::::::::
+
+subcase 8: MAC_IPV4_GTPU_ALL
+::::::::::::::::::::::::::::
+
+Pattern: outer ipv4 + inner ipv4
+--------------------------------
+
+Test case: MAC_IPV4_GTPU_EH_IPV4
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+basic pkts:
+
+ipv4-nonfrag packet::
+
+   Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP()/("X" *20)
+
+ipv4-frag packet::
+
+    Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(frag=6)/("X" *20)
+
+subcase 1: MAC_IPV4_GTPU_EH_IPV4_TEID_with_mask
+:::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc / ipv4 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1: send basic pkts with GTP_U_Header(gtp_type=255, teid=0x12345678)
+   pkts_set2: send pkts_set1 with teid 0x12345688
+
+mismatched packets::
+
+   pkts_set3: send pkts_set1 with teid 0x12345677
+
+subcase 2: MAC_IPV4_GTPU_EH_IPV4_TEID_without_mask
+::::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc / ipv4 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with GTP_U_Header(gtp_type=255, teid=0x12345678)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with teid 0x12345677
+   pkts_set3: send pkts_set1 with teid 0x12345688
+
+subcase 3: MAC_IPV4_GTPU_EH_IPV4_QFI
+::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1: send basic pkts with GTPPDUSessionContainer(QFI=0x34)
+
+mismatched packets::
+
+   pkts_set2: send basic pkts with qfi 0x33
+
+subcase 4: MAC_IPV4_GTPU_EH_IPV4_L3DST
+::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 dst is 192.168.1.2 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1: send basic pkts with inner l3dst, take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(dst="192.168.1.2")/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3dst, take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(dst="192.168.1.22")/("X" *20)
+
+subcase 5: MAC_IPV4_GTPU_EH_IPV4_L3SRC
+::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1: send basic pkts with inner l3src, take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.1")/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3src, take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.11")/("X" *20)
+
+subcase 6: MAC_IPV4_GTPU_EH_IPV4_L3SRC_L3DST
+::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1: send basic pkts with inner l3src l3dst, take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3src l3dst, take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.2")/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.22")/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")/("X" *20)
+
+subcase 7: MAC_IPV4_GTPU_EH_IPV4_TEID_L3SRC_L3DST
+:::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu  teid is 0x12345678 teid mask 0x00000001 / gtp_psc / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1: send basic pkts with inner l3src l3dst, take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3src l3dst, take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.21")/("X" *20)
+
+subcase 8: MAC_IPV4_GTPU_EH_IPV4_QFI_L3SRC_L3DST
+::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1: send basic pkts with inner l3src l3dst, take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3src l3dst, take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.11", dst="192.168.1.22")/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.1", dst="192.168.1.2")/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.11", dst="192.168.1.22")/("X" *20)
+
+
+subcase 9: MAC_IPV4_GTPU_EH_IPV4_ALL
+::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu  teid is 0x12345678 teid mask 0x00000001 / gtp_psc qfi is 0x34 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1: take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.11", dst="192.168.1.22")/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.1", dst="192.168.1.2")/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.11", dst="192.168.1.22")/("X" *20)
+
+Test case: MAC_IPV4_GTPU_EH_IPV4_UDP
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+basic pkts::
+
+   Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP()/UDP()/("X" *20)
+
+subcase 1: MAC_IPV4_GTPU_EH_IPV4_UDP_TEID_with_mask
+:::::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc / ipv4 / udp / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer()/IP()/UDP()/("X" *20)
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345688)/GTPPDUSessionContainer()/IP()/UDP()/("X" *20)
+
+mismatched packets::
+
+   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/GTPPDUSessionContainer()/IP()/UDP()/("X" *20)
+
+subcase 2: MAC_IPV4_GTPU_EH_IPV4_UDP_TEID_without_mask
+::::::::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc / ipv4 / udp / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer()/IP()/UDP()/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345688)/GTPPDUSessionContainer()/IP()/UDP()/("X" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/GTPPDUSessionContainer()/IP()/UDP()/("X" *20)
+
+subcase 3: MAC_IPV4_GTPU_EH_IPV4_UDP_QFI
+::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4 / udp / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer(QFI=0x34)/IP()/UDP()/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer(QFI=0x33)/IP()/UDP()/("X" *20)
+
+subcase 4: MAC_IPV4_GTPU_EH_IPV4_UDP_L3DST
+::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 dst is 192.168.1.2 / udp / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(dst="192.168.1.2")/UDP()/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(dst="192.168.1.22")/UDP()/("X" *20)
+
+subcase 5: MAC_IPV4_GTPU_EH_IPV4_UDP_L3SRC
+::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 / udp / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.1")/UDP()/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.11")/UDP()/("X" *20)
+
+subcase 6: MAC_IPV4_GTPU_EH_IPV4_UDP_L3SRC_L3DST
+::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP()/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.2")/UDP()/("X" *20)
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.22")/UDP()/("X" *20)
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/("X" *20)
+
+subcase 7: MAC_IPV4_GTPU_EH_IPV4_UDP_L3SRC_L4DST
+::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 / udp dst is 23 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.1")/UDP(dport=23)/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.11")/UDP(dport=23)/("X" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.1")/UDP(dport=13)/("X" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.11")/UDP(dport=13)/("X" *20)
+
+subcase 8: MAC_IPV4_GTPU_EH_IPV4_UDP_L3SRC_L4SRC
+::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 / udp src is 22 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.1")/UDP(sport=22)/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.11")/UDP(sport=22)/("X" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.1")/UDP(sport=12)/("X" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.11")/UDP(sport=12)/("X" *20)
+
+
+subcase 9: MAC_IPV4_GTPU_EH_IPV4_UDP_L3DST_L4SRC
+::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 dst is 192.168.1.2 / udp src is 22 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(dst="192.168.1.2")/UDP(sport=22)/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(dst="192.168.1.22")/UDP(sport=22)/("X" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(dst="192.168.1.2")/UDP(sport=12)/("X" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(dst="192.168.1.22")/UDP(sport=12)/("X" *20)
+
+subcase 10: MAC_IPV4_GTPU_EH_IPV4_UDP_L3DST_L4DST
+:::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 dst is 192.168.1.2 / udp dst is 23 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(dst="192.168.1.2")/UDP(dport=23)/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(dst="192.168.1.22")/UDP(dport=23)/("X" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(dst="192.168.1.2")/UDP(dport=13)/("X" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(dst="192.168.1.22")/UDP(dport=13)/("X" *20)
+
+subcase 11: MAC_IPV4_GTPU_EH_IPV4_UDP_L4DST
+:::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 / udp dst is 23 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP()/UDP(dport=23)/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP()/UDP(dport=13)/("X" *20)
+
+subcase 12: MAC_IPV4_GTPU_EH_IPV4_UDP_L4SRC
+:::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 / udp src is 22 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP()/UDP(sport=22)/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP()/UDP(sport=12)/("X" *20)
+
+subcase 13: MAC_IPV4_GTPU_EH_IPV4_UDP_L4SRC_L4DST
+:::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 / udp src is 22 dst is 23 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP()/UDP(sport=22, dport=23)/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP()/UDP(sport=12, dport=23)/("X" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP()/UDP(sport=22, dport=13)/("X" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP()/UDP(sport=12, dport=13)/("X" *20)
+
+subcase 14: MAC_IPV4_GTPU_EH_IPV4_UDP_TEID_L3SRC_L3DST
+::::::::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP()/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/("X" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP()/("X" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/("X" *20)
+
+subcase 15: MAC_IPV4_GTPU_EH_IPV4_UDP_QFI_L3SRC_L3DST
+:::::::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")/UDP()/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/("X" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.1", dst="192.168.1.2")/UDP()/("X" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/("X" *20)
+
+subcase 16: MAC_IPV4_GTPU_EH_IPV4_UDP_TEID_L4SRC_L4DST
+::::::::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc / ipv4 / udp src is 22 dst is 23 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer()/IP()/UDP(sport=22, dport=23)/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer()/IP()/UDP(sport=12, dport=13)/("X" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/GTPPDUSessionContainer()/IP()/UDP(sport=22, dport=23)/("X" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/GTPPDUSessionContainer()/IP()/UDP(sport=12, dport=13)/("X" *20)
+
+subcase 17: MAC_IPV4_GTPU_EH_IPV4_UDP_QFI_L4SRC_L4DST
+:::::::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4 / udp src is 22 dst is 23 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer(QFI=0x34)/IP()/UDP(sport=22, dport=23)/("X" *20)
+
+mismatched packets::
+
+   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer(QFI=0x34)/IP()/UDP(sport=12, dport=13)/("X" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer(QFI=0x33)/IP()/UDP(sport=22, dport=23)/("X" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer(QFI=0x33)/IP()/UDP(sport=12, dport=13)/("X" *20)
+
+subcase 18: MAC_IPV4_GTPU_EH_IPV4_UDP_L3_l4
+:::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp src is 22 dst is 23 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=22, dport=23)/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=12, dport=23)/("X" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=22, dport=13)/("X" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=12, dport=13)/("X" *20)
+   p5 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.2")/UDP(sport=22, dport=23)/("X" *20)
+   p6 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.22")/UDP(sport=22, dport=23)/("X" *20)
+   p7 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=22, dport=23)/("X" *20)
+   p8 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=12, dport=13)/("X" *20)
+
+subcase 19: MAC_IPV4_GTPU_EH_IPV4_UDP_ALL
+:::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc qfi is 0x34 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp src is 22 dst is 23 / end actions vf id 1 / end
+
+matched packets::
+
+   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")/udp(sport=22, dport=23)/("X" *20)
+
+mismatched packets::
+
+   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")/udp(sport=22, dport=23)/("X" *20)
+   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.1", dst="192.168.1.2")/udp(sport=22, dport=23)/("X" *20)
+   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.11", dst="192.168.1.22")/udp(sport=22, dport=23)/("X" *20)
+   p5 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")/udp(sport=12, dport=13)/("X" *20)
+   p6 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.11", dst="192.168.1.22")/udp(sport=12, dport=13)/("X" *20)
+
+Test case: MAC_IPV4_GTPU_EH_IPV4_TCP
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+reconfig all case of 'Test case: MAC_IPV4_GTPU_EH_IPV4_UDP':
+   rule and pkts:
+      change inner 'udp' to 'tcp'
+
+subcase 1: MAC_IPV4_GTPU_EH_IPV4_TCP_TEID_with_mask
+:::::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 2: MAC_IPV4_GTPU_EH_IPV4_TCP_TEID_without_mask
+::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 3: MAC_IPV4_GTPU_EH_IPV4_TCP_QFI
+::::::::::::::::::::::::::::::::::::::::
+
+subcase 4: MAC_IPV4_GTPU_EH_IPV4_TCP_L3DST
+::::::::::::::::::::::::::::::::::::::::::
+
+subcase 5: MAC_IPV4_GTPU_EH_IPV4_TCP_L3SRC
+::::::::::::::::::::::::::::::::::::::::::
+
+subcase 6: MAC_IPV4_GTPU_EH_IPV4_TCP_L3SRC_L3DST
+::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 7: MAC_IPV4_GTPU_EH_IPV4_TCP_L3SRC_L4DST
+::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 8: MAC_IPV4_GTPU_EH_IPV4_TCP_L3SRC_L4SRC
+::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 9: MAC_IPV4_GTPU_EH_IPV4_TCP_L3DST_L4SRC
+::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 10: MAC_IPV4_GTPU_EH_IPV4_TCP_L3DST_L4DST
+:::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 11: MAC_IPV4_GTPU_EH_IPV4_TCP_L4DST
+:::::::::::::::::::::::::::::::::::::::::::
+
+subcase 12: MAC_IPV4_GTPU_EH_IPV4_TCP_L4SRC
+:::::::::::::::::::::::::::::::::::::::::::
+
+subcase 13: MAC_IPV4_GTPU_EH_IPV4_TCP_L4SRC_L4DST
+:::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 14: MAC_IPV4_GTPU_EH_IPV4_TCP_TEID_L3SRC_L3DST
+::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 15: MAC_IPV4_GTPU_EH_IPV4_TCP_QFI_L3SRC_L3DST
+:::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 16: MAC_IPV4_GTPU_EH_IPV4_TCP_TEID_L4SRC_L4DST
+::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 17: MAC_IPV4_GTPU_EH_IPV4_TCP_QFI_L4SRC_L4DST
+:::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 18: MAC_IPV4_GTPU_EH_IPV4_TCP_L3_l4
+:::::::::::::::::::::::::::::::::::::::::::
+
+subcase 19: MAC_IPV4_GTPU_EH_IPV4_TCP_ALL
+:::::::::::::::::::::::::::::::::::::::::
+
+Test case: MAC_IPV4_GTPU_IPV4
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+basic pkts:
+ipv4-nonfrag packet::
+
+   Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/("X" *20)
+
+ipv4-frag packet::
+
+    Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(frag=6)/("X" *20)
+
+subcase 1: MAC_IPV4_GTPU_IPV4_TEID_with_mask
+::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with GTP_U_Header(gtp_type=255, teid=0x12345678)
+
+   pkts_set2:send basic pkts with GTP_U_Header(gtp_type=255, teid=0x12345688)
+
+mismatched packets::
+
+   pkts_set3:send basic pkts with GTP_U_Header(gtp_type=255, teid=0x12345677)
+
+subcase 2: MAC_IPV4_GTPU_IPV4_TEID_without_mask
+:::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / ipv4 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with GTP_U_Header(gtp_type=255, teid=0x12345678)
+
+mismatched packets::
+
+   pkts_set2:send basic pkts with GTP_U_Header(gtp_type=255, teid=0x12345688)
+
+   pkts_set3:send basic pkts with GTP_U_Header(gtp_type=255, teid=0x12345677)
+
+subcase 3: MAC_IPV4_GTPU_IPV4_L3DST
+:::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 dst is 192.168.1.2 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l3dst, take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.2")/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3dst:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.22")/("X" *20)
+
+subcase 4: MAC_IPV4_GTPU_IPV4_L3SRC
+:::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l3src, take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1")/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3src:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.11")/("X" *20)
+
+subcase 4: MAC_IPV4_GTPU_IPV4_L3SRC_L3DST
+:::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l3src l4dst, take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1" dst="192.168.1.2")/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3src l4dst:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.2")/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1", dst="192.168.1.22")/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.22")/("X" *20)
+
+subcase 5: MAC_IPV4_GTPU_IPV4_ALL
+:::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l3src l4dst, take 'ipv4-nonfrag' for example:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.1.1" dst="192.168.1.2")/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3src:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.1.11", dst="192.168.1.22")/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/IP(src="192.168.1.11", dst="192.168.1.22")/("X" *20)
+
+Test case: MAC_IPV4_GTPU_IPV4_UDP
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+basic pkts::
+
+    Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP()/("X" *20)
+
+subcase 1: MAC_IPV4_GTPU_IPV4_UDP_TEID_with_mask
+::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 / udp / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with GTP_U_Header(gtp_type=255, teid=0x12345678)
+
+   pkts_set2:send basic pkts with GTP_U_Header(gtp_type=255, teid=0x12345688)
+
+mismatched packets::
+
+   pkts_set3:send basic pkts with GTP_U_Header(gtp_type=255, teid=0x12345677)
+
+subcase 2: MAC_IPV4_GTPU_IPV4_UDP_TEID_without_mask
+:::::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / ipv4 / udp / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with GTP_U_Header(gtp_type=255, teid=0x12345678)
+
+mismatched packets::
+
+   pkts_set2:send basic pkts with GTP_U_Header(gtp_type=255, teid=0x12345688)
+
+   pkts_set3:send basic pkts with GTP_U_Header(gtp_type=255, teid=0x12345677)
+
+
+subcase 3: MAC_IPV4_GTPU_IPV4_UDP_L3DST
+:::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 dst is 192.168.1.2 / udp / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l3dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.2")/UDP()/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3dst:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.22")/UDP()/("X" *20)
+
+subcase 4: MAC_IPV4_GTPU_IPV4_UDP_L3SRC
+:::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 / udp / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l3src
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1")/UDP()/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3src:
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.11")/UDP()/("X" *20)
+
+subcase 5: MAC_IPV4_GTPU_IPV4_UDP_L3SRC_L3DST
+:::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l3src l3dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1" dst="192.168.1.2")/UDP()/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3src l3dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.2")/UDP()/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1", dst="192.168.1.22")/UDP()/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/("X" *20)
+
+subcase 6: MAC_IPV4_GTPU_IPV4_UDP_L3SRC_L4DST
+:::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 / udp dst is 23 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l3src l4dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1")/UDP(dport=23)/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3src l4dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.11")/UDP(dport=23)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1")/UDP(dport=13)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.11")/UDP(dport=13)/("X" *20)
+
+subcase 7: MAC_IPV4_GTPU_IPV4_UDP_L3SRC_L4SRC
+:::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 / udp src is 22 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l3src l4src
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1")/UDP(sport=22)/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3src l4src
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.11")/UDP(sport=22)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1")/UDP(sport=12)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.11")/UDP(sport=12)/("X" *20)
+
+subcase 8: MAC_IPV4_GTPU_IPV4_UDP_L3DST_L4SRC
+:::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 dst is 192.168.1.2 / udp src is 22 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l3dst l4src
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.2")/UDP(sport=22)/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3dst l4src
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.12")/UDP(sport=22)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.2")/UDP(sport=12)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.12")/UDP(sport=12)/("X" *20)
+
+subcase 9: MAC_IPV4_GTPU_IPV4_UDP_L3DST_L4DST
+:::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 dst is 192.168.1.2 / udp dst is 23 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l3dst l4dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.2")/UDP(dport=23)/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3dst l4dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.12")/UDP(dport=23)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.2")/UDP(dport=13)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.12")/UDP(dport=13)/("X" *20)
+
+subcase 10: MAC_IPV4_GTPU_IPV4_UDP_L4DST
+::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 / udp dst is 23 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l4dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(dport=23)/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l4dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(dport=13)/("X" *20)
+
+subcase 11: MAC_IPV4_GTPU_IPV4_UDP_L4SRC
+::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 / udp src is 22 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l4src
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(sport=22)/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l4src
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(sport=12)/("X" *20)
+
+subcase 12: MAC_IPV4_GTPU_IPV4_UDP_L4SRC_L4DST
+::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 / udp src is 22 dst is 23 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l4src l4dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(sport=22, dport=23)/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l4src l4dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(sport=22, dport=13)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(sport=12, dport=23)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(sport=12, dport=13)/("X" *20)
+
+subcase 13: MAC_IPV4_GTPU_IPV4_UDP_TIED_L3SRC_L3DST
+:::::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l3src l3dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.1.1" dst="192.168.1.2")/UDP()/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3src l3dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/IP(src="192.168.1.1", dst="192.168.1.2")/UDP()/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/("X" *20)
+
+
+subcase 14: MAC_IPV4_GTPU_IPV4_UDP_TEID_L4SRC_L4DST
+:::::::::::::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 / udp src is 22 dst is 23 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l4src l4dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP()/UDP(sport=22, dport=23)/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l4src l4dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP()/UDP(sport=12, dport=13)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/IP()/UDP(sport=22, dport=23)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/IP()/UDP(sport=12, dport=13)/("X" *20)
+
+
+subcase 15: MAC_IPV4_GTPU_IPV4_UDP_L3_L4
+::::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp src is 22 dst is 23 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l3src l3dst l4src l4dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=22, dport=23)/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3src l3dst l4src l4dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=22, dport=23)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=12, dport=13)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=12, dport=13)/("X" *20)
+
+subcase 16: MAC_IPV4_GTPU_IPV4_UDP_ALL
+::::::::::::::::::::::::::::::::::::::
+rule::
+
+   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp src is 22 dst is 23 / end actions vf id 1 / end
+
+matched packets::
+
+   pkts_set1:send basic pkts with inner l3src l3dst l4src l4dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=22, dport=23)/("X" *20)
+
+mismatched packets::
+
+   pkts_set2: send pkts_set1 with different inner l3src l3dst l4src l4dst
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=22, dport=23)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=12, dport=13)/("X" *20)
+      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255, teid=0x12345677)/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=12, dport=13)/("X" *20)
+
+
+Test case: MAC_IPV4_GTPU_IPV4_TCP
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+reconfig all case of 'Test case: MAC_IPV4_GTPU_IPV4_UDP':
+   rule and pkts:
+      change inner 'udp' to 'tcp'
+
+subcase 1: MAC_IPV4_GTPU_IPV4_TCP_TEID_with_mask
+::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 2: MAC_IPV4_GTPU_IPV4_TCP_TEID_without_mask
+:::::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 3: MAC_IPV4_GTPU_IPV4_TCP_L3DST
+:::::::::::::::::::::::::::::::::::::::
+
+subcase 4: MAC_IPV4_GTPU_IPV4_TCP_L3SRC
+:::::::::::::::::::::::::::::::::::::::
+
+subcase 5: MAC_IPV4_GTPU_IPV4_TCP_L3SRC_L3DST
+:::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 6: MAC_IPV4_GTPU_IPV4_TCP_L3SRC_L4DST
+:::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 7: MAC_IPV4_GTPU_IPV4_TCP_L3SRC_L4SRC
+:::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 8: MAC_IPV4_GTPU_IPV4_TCP_L3DST_L4SRC
+:::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 9: MAC_IPV4_GTPU_IPV4_TCP_L3DST_L4DST
+:::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 10: MAC_IPV4_GTPU_IPV4_TCP_L4DST
+::::::::::::::::::::::::::::::::::::::::
+
+subcase 11: MAC_IPV4_GTPU_IPV4_TCP_L4SRC
+::::::::::::::::::::::::::::::::::::::::
+
+subcase 12: MAC_IPV4_GTPU_IPV4_TCP_L4SRC_L4DST
+::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 13: MAC_IPV4_GTPU_IPV4_TCP_TIED_L3SRC_L3DST
+:::::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 14: MAC_IPV4_GTPU_IPV4_TCP_TEID_L4SRC_L4DST
+:::::::::::::::::::::::::::::::::::::::::::::::::::
+
+subcase 15: MAC_IPV4_GTPU_IPV4_TCP_L3_L4
+::::::::::::::::::::::::::::::::::::::::
+
+subcase 16: MAC_IPV4_GTPU_IPV4_TCP_ALL
+::::::::::::::::::::::::::::::::::::::
+
+Pattern: outer ipv4 + inner ipv6
+--------------------------------
+
+reconfig all the cases of "Pattern: outer ipv4 + inner ipv4"
+
+    rule:
+        change inner ipv4 to ipv6
+    packets:
+        change the packet's inner L3 layer from IP to IPv6;
+        change the ipv4 address to ipv6 address.
+
+Pattern: outer ipv6 + inner ipv4
+--------------------------------
+
+reconfig all the cases of "Pattern: outer ipv4 + inner ipv4"
+
+    rule:
+        change outer ipv4 to ipv6.
+    packets:
+        change the packet's outer L3 layer from IP to IPv6;
+
+Pattern: outer ipv6 + inner ipv6
+--------------------------------
+
+reconfig all the cases of "Pattern: outer ipv4 + inner ipv4"
+
+    rule:
+        change outer ipv4 to ipv6.
+        change inner ipv4 to ipv6.
+    packets:
+        change the packet's outer L3 layer from IP to IPv6;
+        change the packet's inner L3 layer from IP to IPv6;
+        change the ipv4 address to ipv6 address.
-- 
2.17.1


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

* [dts] [PATCH V2 2/2] tests/cvl_dcf_switch_filter_gtpu: add dcf_switch_filter_gtpu test case
  2021-06-02 18:50 [dts] [PATCH V2 0/2] add dcf switch gtpu test case and test plan Zhimin Huang
  2021-06-02 18:50 ` [dts] [PATCH V2 1/2] test_plans/dcf_switch_gtpu: add dcf_switch_filter_gtpu " Zhimin Huang
@ 2021-06-02 18:50 ` Zhimin Huang
  2021-06-02 10:30   ` Huang, ZhiminX
  2021-06-10  6:59   ` Lin, Xueqin
  1 sibling, 2 replies; 7+ messages in thread
From: Zhimin Huang @ 2021-06-02 18:50 UTC (permalink / raw)
  To: dts; +Cc: xueqin.lin, Zhimin Huang

*.add 26 test cases to cvl_dcf_switch_filter_gtpu suite

Signed-off-by: Zhimin Huang <zhiminx.huang@intel.com>
---
 tests/TestSuite_cvl_dcf_switch_filter_gtpu.py | 2250 +++++++++++++++++
 1 file changed, 2250 insertions(+)
 create mode 100644 tests/TestSuite_cvl_dcf_switch_filter_gtpu.py

diff --git a/tests/TestSuite_cvl_dcf_switch_filter_gtpu.py b/tests/TestSuite_cvl_dcf_switch_filter_gtpu.py
new file mode 100644
index 00000000..25cf28fd
--- /dev/null
+++ b/tests/TestSuite_cvl_dcf_switch_filter_gtpu.py
@@ -0,0 +1,2250 @@
+# BSD LICENSE
+#
+# Copyright(c) 2020 Intel Corporation. All rights reserved.
+# 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.
+
+import json
+import time
+import re
+import copy
+
+from test_case import TestCase, skip_unsupported_pkg, check_supported_nic
+from pmd_output import PmdOutput
+from packet import Packet
+from utils import BLUE, RED, GREEN
+import rte_flow_common as rfc
+
+import os
+
+mac_ipv4_gtpu_basic = {
+    'ipv4_gtpu': 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/Raw("x" *20)',
+    'ipv4_gtpu_eh_ipv4_nonfrag': 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP()/("X" *20)',
+    'ipv4_gtpu_eh_ipv4_frag': 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP(frag=6)/("X" *20)',
+    'ipv4_gtpu_eh_ipv4_udp': 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP()/UDP()/("X" *20)',
+    'ipv4_gtpu_eh_ipv4_tcp': 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionContainer()/IP()/TCP()/("X" *20)',
+    'ipv4_gtpu_ipv4_nonfrag': 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/("X" *20)',
+    'ipv4_gtpu_ipv4_frag': 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(frag=6)/("X" *20)',
+    'ipv4_gtpu_ipv4_udp': 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP()/("X" *20)',
+    'ipv4_gtpu_ipv4_tcp': 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/TCP()/("X" *20)',
+}
+
+tv_mac_ipv4_gtpu_teid_with_mask = {
+    "name": "tv_mac_ipv4_gtpu_teid_with_mask",
+    "rte_flow_pattern": "flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / end actions vf id 1 / end",
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345678)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345688)')],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345677)')],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_teid_without_mask = {
+    "name": "tv_mac_ipv4_gtpu_teid_without_mask",
+    "rte_flow_pattern": "flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / end actions vf id 1 / end",
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345678)')],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345688)')],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_dst = {
+    "name": "tv_mac_ipv4_gtpu_dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 dst is 192.168.1.2 / udp / gtpu / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(dst="192.168.1.2")')],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(dst="192.168.1.22")')],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_src = {
+    "name": "tv_mac_ipv4_gtpu_src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 src is 192.168.1.1 / udp / gtpu / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(src="192.168.1.1")')],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(src="192.168.1.11")')],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_src_dst = {
+    "name": "tv_mac_ipv4_gtpu_src_dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp / gtpu / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(src="192.168.1.1", dst="192.168.1.2")')],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(src="192.168.1.11", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(src="192.168.1.1", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(src="192.168.1.11", dst="192.168.1.22")')],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_teid_dst = {
+    "name": "tv_mac_ipv4_gtpu_teid_dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 dst is 192.168.1.2 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(dst="192.168.1.2")').replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345678)')],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(dst="192.168.1.22")').replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(dst="192.168.1.2")').replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(dst="192.168.1.22")').replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345677)')],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_teid_src = {
+    "name": "tv_mac_ipv4_gtpu_teid_src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 src is 192.168.1.1 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(src="192.168.1.1")').replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345678)')],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(src="192.168.1.11")').replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(src="192.168.1.1")').replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(src="192.168.1.11")').replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345678)')],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_all = {
+    "name": "tv_mac_ipv4_gtpu_all",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(src="192.168.1.1", dst="192.168.1.2")').replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345678)')],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(src="192.168.1.11", dst="192.168.1.2")').replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(src="192.168.1.1", dst="192.168.1.22")').replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(src="192.168.1.11", dst="192.168.1.22")').replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu'].replace('IP()', 'IP(src="192.168.1.11", dst="192.168.1.22")').replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345677)')],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+sv_mac_ipv4_gtpu = [
+    tv_mac_ipv4_gtpu_teid_with_mask,
+    tv_mac_ipv4_gtpu_teid_without_mask,
+    tv_mac_ipv4_gtpu_dst,
+    tv_mac_ipv4_gtpu_src,
+    tv_mac_ipv4_gtpu_teid_dst,
+    tv_mac_ipv4_gtpu_teid_src,
+    tv_mac_ipv4_gtpu_all,
+]
+
+# the maximum input set is 32bytes, ipv6 src + ipv4 dst = 32bytes
+sv_mac_ipv6_gtpu = [eval(str(sv).replace('tv_mac_ipv4', 'tv_mac_ipv6')
+                    .replace('ipv4', 'ipv6')
+                    .replace('IP(', 'IPv6(')
+                    .replace('192.168.1.1', '2001::1')
+                    .replace('192.168.1.11', '2001::11')
+                    .replace('192.168.1.2', '2001::2')
+                    .replace('192.168.1.22', '2001::22'))
+                    for sv in sv_mac_ipv4_gtpu[0:-1]]
+
+
+tv_mac_ipv4_gtpu_eh_ipv4_teid_with_mask = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_teid_with_mask",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc / ipv4 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345678)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345678)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345688)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345688)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 4}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345677)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_teid_without_mask = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_teid_without_mask",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc / ipv4 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345678)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345678)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345688)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('GTP_U_Header()', 'GTP_U_Header(teid=0x12345688)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_qfi = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_qfi",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()', 'GTPPDUSessionContainer(QFI=0x34)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('GTPPDUSessionContainer()', 'GTPPDUSessionContainer(QFI=0x34)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer(QFI=0x34)', 'GTPPDUSessionContainer(QFI=0x33)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('GTPPDUSessionContainer(QFI=0x34)', 'GTPPDUSessionContainer(QFI=0x33)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 dst is 192.168.1.2 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.2")'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_l3src = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_l3src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1")'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.1")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.11")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_l3src_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_l3src_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.1", dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.11", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.1", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.11", dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_teid_l3src_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_teid_l3src_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")')
+                                                                              .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.1", dst="192.168.1.2")')
+                                                                           .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")')
+                                                                                 .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")')
+                                                                                 .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")')
+                                                                                 .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.11", dst="192.168.1.22")')
+                                                                              .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.1", dst="192.168.1.2")')
+                                                                              .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.11", dst="192.168.1.22")')
+                                                                              .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_qfi_l3src_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_qfi_l3src_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")')
+                                                                              .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.1", dst="192.168.1.2")')
+                                                                           .replace('GTPPDUSessionContainer()', 'GTPPDUSessionContainer(QFI=0x34)')
+                                                                           .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.11", dst="192.168.1.22")')
+                                                                              .replace('GTPPDUSessionContainer()', 'GTPPDUSessionContainer(QFI=0x34)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.1", dst="192.168.1.2")')
+                                                                              .replace('GTPPDUSessionContainer()', 'GTPPDUSessionContainer(QFI=0x33)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.11", dst="192.168.1.22")')
+                                                                              .replace('GTPPDUSessionContainer()', 'GTPPDUSessionContainer(QFI=0x33)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_all = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_all",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc qfi is 0x34 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")')
+                                                                              .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.1", dst="192.168.1.2")')
+                                                                           .replace('GTPPDUSessionContainer()', 'GTPPDUSessionContainer(QFI=0x34)')
+                                                                           .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.11", dst="192.168.1.22")')
+                                                                                 .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")')
+                                                                                 .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.1", dst="192.168.1.2")')
+                                                                                 .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_nonfrag'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.11", dst="192.168.1.11")')
+                                                                                 .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.11", dst="192.168.1.22")')
+                                                                              .replace('GTPPDUSessionContainer()', 'GTPPDUSessionContainer(QFI=0x34)')
+                                                                              .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.1", dst="192.168.1.2")')
+                                                                              .replace('GTPPDUSessionContainer()', 'GTPPDUSessionContainer(QFI=0x33)')
+                                                                              .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.1", dst="192.168.1.2")')
+                                                                              .replace('GTPPDUSessionContainer()', 'GTPPDUSessionContainer(QFI=0x33)')
+                                                                              .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.11", dst="192.168.1.22")')
+                                                                              .replace('GTPPDUSessionContainer()', 'GTPPDUSessionContainer(QFI=0x33)')
+                                                                              .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+sv_mac_ipv4_gtpu_eh_ipv4 = [
+    tv_mac_ipv4_gtpu_eh_ipv4_teid_with_mask,
+    tv_mac_ipv4_gtpu_eh_ipv4_teid_without_mask,
+    tv_mac_ipv4_gtpu_eh_ipv4_qfi,
+    tv_mac_ipv4_gtpu_eh_ipv4_l3dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_l3src,
+    tv_mac_ipv4_gtpu_eh_ipv4_l3src_l3dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_teid_l3src_l3dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_qfi_l3src_l3dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_all,
+]
+
+sv_mac_ipv4_gtpu_eh_ipv6 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_eh_ipv4', 'tv_mac_ipv4_gtpu_eh_ipv6')
+                    .replace(' ipv4 ', ' ipv61 ')
+                    .replace('eth / ipv61 ', 'eth / ipv4 ')
+                    .replace(' ipv61 ', ' ipv6 ')
+                    .replace('IP(', 'IPv61(')
+                    .replace(':55")/IPv61(', ':55")/IP(')
+                    .replace('IPv61', 'IPv6')
+                    .replace('IPv6(frag=6', 'IPv6(nh=6')
+                    .replace('192.168.1.1', '2001::1')
+                    .replace('192.168.1.11', '2001::11')
+                    .replace('192.168.1.2', '2001::2')
+                    .replace('192.168.1.22', '2001::22'))
+                    for sv in sv_mac_ipv4_gtpu_eh_ipv4[0:-3]]
+
+sv_mac_ipv6_gtpu_eh_ipv4 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_eh_ipv4', 'tv_mac_ipv6_gtpu_eh_ipv4')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_eh_ipv4]
+
+sv_mac_ipv6_gtpu_eh_ipv6 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_eh_ipv6', 'tv_mac_ipv6_gtpu_eh_ipv6')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_eh_ipv6]
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_teid_with_mask = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_teid_with_mask",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc / ipv4 / udp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345688)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_teid_without_mask = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_teid_without_mask",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc / ipv4 / udp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345688)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_qfi = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_qfi",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4 / udp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()', 'GTPPDUSessionContainer(QFI=0x34)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()', 'GTPPDUSessionContainer(QFI=0x33)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 dst is 192.168.1.2 / udp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_l3src = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_l3src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 / udp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_l3src_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_l3src_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_l3src_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_l3src_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 / udp dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1")/UDP(dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11")/UDP(dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1")/UDP(dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11")/UDP(dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_l3src_l4src = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_l3src_l4src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 / udp src is 22 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1")/UDP(sport=22)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11")/UDP(sport=22)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1")/UDP(sport=12)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11")/UDP(sport=12)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_l3dst_l4src = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_l3dst_l4src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 dst is 192.168.1.2 / udp src is 22 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.2")/UDP(sport=22)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.22")/UDP(sport=22)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.2")/UDP(sport=12)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.22")/UDP(sport=12)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_l3dst_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_l3dst_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 dst is 192.168.1.2 / udp dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.2")/UDP(dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.22")/UDP(dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.2")/UDP(dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.22")/UDP(dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 / udp dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP()/UDP(dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP()/UDP(dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_l4src = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_l4src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 / udp src is 22 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP()/UDP(sport=22)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP()/UDP(sport=12)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_l4src_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_l4src_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 / udp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP()/UDP(sport=22, dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP()/UDP(sport=22, dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP()/UDP(sport=12, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP()/UDP(sport=12, dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_teid_l3src_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_teid_l3src_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")')
+                                                                          .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_qfi_l3src_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_qfi_l3src_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_teid_l4src_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_teid_l4src_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc / ipv4 / udp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP()/UDP(sport=22, dport=23)')
+                                                                          .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP()/UDP(sport=12, dport=13)')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP()/UDP(sport=22, dport=23)')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP()/UDP(sport=12, dport=13)')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_qfi_l4src_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_qfi_l4src_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4 / udp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer(QFI=0x34)/IP()/UDP(sport=22, dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer(QFI=0x34)/IP()/UDP(sport=12, dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer(QFI=0x33)/IP()/UDP(sport=22, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer(QFI=0x33)/IP()/UDP(sport=12, dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_l3_l4 = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_l3_l4",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=22, dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.22")/UDP(sport=22, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.2")/UDP(sport=22, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=22, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=12, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=22, dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=12, dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=12, dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_udp_all = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_udp_all",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc qfi is 0x34 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=22, dport=23)')
+                                                                          .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=22, dport=23)')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=22, dport=23)')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=12, dport=13)')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_udp'].replace('GTPPDUSessionContainer()/IP()/UDP()', 'GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=12, dport=13)')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+sv_mac_ipv4_gtpu_eh_ipv4_udp_1 = [
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_teid_with_mask,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_teid_without_mask,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_qfi,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_l3dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_l3src,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_l3src_l4dst,
+]
+
+sv_mac_ipv4_gtpu_eh_ipv4_udp_2 = [
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_l3dst_l4dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_l3src_l4src,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_l3dst_l4src,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_l4dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_l4src,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_l4src_l4dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_teid_l4src_l4dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_qfi_l4src_l4dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_l3src_l3dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_teid_l3src_l3dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_qfi_l3src_l3dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_l3_l4,
+    tv_mac_ipv4_gtpu_eh_ipv4_udp_all,
+]
+
+sv_mac_ipv4_gtpu_eh_ipv4_udp = [sv_mac_ipv4_gtpu_eh_ipv4_udp_1, sv_mac_ipv4_gtpu_eh_ipv4_udp_2]
+
+sv_mac_ipv4_gtpu_eh_ipv6_udp_1 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_eh_ipv4', 'tv_mac_ipv4_gtpu_eh_ipv6')
+                    .replace(' ipv4 ', ' ipv61 ')
+                    .replace('eth / ipv61 ', 'eth / ipv4 ')
+                    .replace(' ipv61 ', ' ipv6 ')
+                    .replace('IP(', 'IPv61(')
+                    .replace(':55")/IPv61(', ':55")/IP(')
+                    .replace('IPv61', 'IPv6')
+                    .replace('IPv6(frag=6', 'IPv6(nh=6')
+                    .replace('192.168.1.1', '2001::1')
+                    .replace('192.168.1.11', '2001::11')
+                    .replace('192.168.1.2', '2001::2')
+                    .replace('192.168.1.22', '2001::22'))
+                    for sv in sv_mac_ipv4_gtpu_eh_ipv4_udp_1]
+
+sv_mac_ipv4_gtpu_eh_ipv6_udp_2 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_eh_ipv4', 'tv_mac_ipv4_gtpu_eh_ipv6')
+                    .replace(' ipv4 ', ' ipv61 ')
+                    .replace('eth / ipv61 ', 'eth / ipv4 ')
+                    .replace(' ipv61 ', ' ipv6 ')
+                    .replace('IP(', 'IPv61(')
+                    .replace(':55")/IPv61(', ':55")/IP(')
+                    .replace('IPv61', 'IPv6')
+                    .replace('IPv6(frag=6', 'IPv6(nh=6')
+                    .replace('192.168.1.1', '2001::1')
+                    .replace('192.168.1.11', '2001::11')
+                    .replace('192.168.1.2', '2001::2')
+                    .replace('192.168.1.22', '2001::22'))
+                    for sv in sv_mac_ipv4_gtpu_eh_ipv4_udp_2[0:-6]]
+
+sv_mac_ipv4_gtpu_eh_ipv6_udp = [sv_mac_ipv4_gtpu_eh_ipv6_udp_1, sv_mac_ipv4_gtpu_eh_ipv6_udp_2]
+
+sv_mac_ipv6_gtpu_eh_ipv4_udp_1 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_eh_ipv4', 'tv_mac_ipv6_gtpu_eh_ipv4')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_eh_ipv4_udp_1]
+
+sv_mac_ipv6_gtpu_eh_ipv4_udp_2 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_eh_ipv4', 'tv_mac_ipv6_gtpu_eh_ipv4')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_eh_ipv4_udp_2]
+
+sv_mac_ipv6_gtpu_eh_ipv4_udp = [sv_mac_ipv6_gtpu_eh_ipv4_udp_1, sv_mac_ipv6_gtpu_eh_ipv4_udp_2]
+
+sv_mac_ipv6_gtpu_eh_ipv6_udp_1 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_eh_ipv6', 'tv_mac_ipv6_gtpu_eh_ipv6')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_eh_ipv6_udp_1]
+
+sv_mac_ipv6_gtpu_eh_ipv6_udp_2 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_eh_ipv6', 'tv_mac_ipv6_gtpu_eh_ipv6')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_eh_ipv6_udp_2]
+
+sv_mac_ipv6_gtpu_eh_ipv6_udp = [sv_mac_ipv6_gtpu_eh_ipv6_udp_1, sv_mac_ipv6_gtpu_eh_ipv6_udp_2]
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_teid_with_mask = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_teid_with_mask",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc / ipv4 / tcp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345688)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_teid_without_mask = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_teid_without_mask",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / gtp_psc / ipv4 / tcp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345688)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_qfi = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_qfi",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4 / tcp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()', 'GTPPDUSessionContainer(QFI=0x34)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()', 'GTPPDUSessionContainer(QFI=0x33)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 dst is 192.168.1.2 / tcp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3src = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 / tcp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3src_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3src_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / tcp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3src_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3src_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 / tcp dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1")/TCP(dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11")/TCP(dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1")/TCP(dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11")/TCP(dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3src_l4src = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3src_l4src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 / tcp src is 22 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1")/TCP(sport=22)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11")/TCP(sport=22)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1")/TCP(sport=12)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11")/TCP(sport=12)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3dst_l4src = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3dst_l4src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 dst is 192.168.1.2 / tcp src is 22 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.2")/TCP(sport=22)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.22")/TCP(sport=22)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.2")/TCP(sport=12)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.22")/TCP(sport=12)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3dst_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3dst_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 dst is 192.168.1.2 / tcp dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.2")/TCP(dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.22")/TCP(dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.2")/TCP(dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(dst="192.168.1.22")/TCP(dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 / tcp dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP()/TCP(dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP()/TCP(dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_l4src = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_l4src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 / tcp src is 22 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP()/TCP(sport=22)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP()/TCP(sport=12)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_l4src_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_l4src_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 / tcp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP()/TCP(sport=22, dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP()/TCP(sport=22, dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP()/TCP(sport=12, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP()/TCP(sport=12, dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_teid_l3src_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_teid_l3src_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / tcp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")')
+                                                                          .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_qfi_l3src_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_qfi_l3src_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / tcp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()', 'GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_teid_l4src_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_teid_l4src_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc / ipv4 / tcp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP()/TCP(sport=22, dport=23)')
+                                                                          .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP()/TCP(sport=12, dport=13)')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP()/TCP(sport=22, dport=23)')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP()/TCP(sport=12, dport=13)')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_qfi_l4src_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_qfi_l4src_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4 / tcp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer(QFI=0x34)/IP()/TCP(sport=22, dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer(QFI=0x34)/IP()/TCP(sport=12, dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer(QFI=0x33)/IP()/TCP(sport=22, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer(QFI=0x33)/IP()/TCP(sport=12, dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3_l4 = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3_l4",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / tcp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/TCP(sport=22, dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.22")/TCP(sport=22, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.2")/TCP(sport=22, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")/TCP(sport=22, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/TCP(sport=12, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/TCP(sport=22, dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.1", dst="192.168.1.2")/TCP(sport=12, dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer()/IP(src="192.168.1.11", dst="192.168.1.22")/TCP(sport=12, dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_eh_ipv4_tcp_all = {
+    "name": "tv_mac_ipv4_gtpu_eh_ipv4_tcp_all",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / gtp_psc qfi is 0x34 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / tcp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")/TCP(sport=22, dport=23)')
+                                                                          .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.1", dst="192.168.1.2")/TCP(sport=22, dport=23)')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")/TCP(sport=22, dport=23)')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.11", dst="192.168.1.22")/TCP(sport=12, dport=13)')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_eh_ipv4_tcp'].replace('GTPPDUSessionContainer()/IP()/TCP()', 'GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.11", dst="192.168.1.22")/TCP(sport=12, dport=13)')
+                                                                             .replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+sv_mac_ipv4_gtpu_eh_ipv4_tcp_1 = [
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_teid_with_mask,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_teid_without_mask,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_qfi,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3src,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3src_l4src,
+]
+
+sv_mac_ipv4_gtpu_eh_ipv4_tcp_2 = [
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3src_l4dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3dst_l4src,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3dst_l4dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_l4dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_l4src,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_l4src_l4dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_teid_l4src_l4dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_qfi_l4src_l4dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3src_l3dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_teid_l3src_l3dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_qfi_l3src_l3dst,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_l3_l4,
+    tv_mac_ipv4_gtpu_eh_ipv4_tcp_all,
+]
+
+sv_mac_ipv4_gtpu_eh_ipv4_tcp = [sv_mac_ipv4_gtpu_eh_ipv4_tcp_1, sv_mac_ipv4_gtpu_eh_ipv4_tcp_2]
+
+sv_mac_ipv4_gtpu_eh_ipv6_tcp_1 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_eh_ipv4', 'tv_mac_ipv4_gtpu_eh_ipv6')
+                    .replace(' ipv4 ', ' ipv61 ')
+                    .replace('eth / ipv61 ', 'eth / ipv4 ')
+                    .replace(' ipv61 ', ' ipv6 ')
+                    .replace('IP(', 'IPv61(')
+                    .replace(':55")/IPv61(', ':55")/IP(')
+                    .replace('IPv61', 'IPv6')
+                    .replace('IPv6(frag=6', 'IPv6(nh=6')
+                    .replace('192.168.1.1', '2001::1')
+                    .replace('192.168.1.11', '2001::11')
+                    .replace('192.168.1.2', '2001::2')
+                    .replace('192.168.1.22', '2001::22'))
+                    for sv in sv_mac_ipv4_gtpu_eh_ipv4_tcp_1]
+
+sv_mac_ipv4_gtpu_eh_ipv6_tcp_2 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_eh_ipv4', 'tv_mac_ipv4_gtpu_eh_ipv6')
+                    .replace(' ipv4 ', ' ipv61 ')
+                    .replace('eth / ipv61 ', 'eth / ipv4 ')
+                    .replace(' ipv61 ', ' ipv6 ')
+                    .replace('IP(', 'IPv61(')
+                    .replace(':55")/IPv61(', ':55")/IP(')
+                    .replace('IPv61', 'IPv6')
+                    .replace('IPv6(frag=6', 'IPv6(nh=6')
+                    .replace('192.168.1.1', '2001::1')
+                    .replace('192.168.1.11', '2001::11')
+                    .replace('192.168.1.2', '2001::2')
+                    .replace('192.168.1.22', '2001::22'))
+                    for sv in sv_mac_ipv4_gtpu_eh_ipv4_tcp_2[0:-5]]
+
+sv_mac_ipv4_gtpu_eh_ipv6_tcp = [sv_mac_ipv4_gtpu_eh_ipv6_tcp_1, sv_mac_ipv4_gtpu_eh_ipv6_tcp_2]
+
+sv_mac_ipv6_gtpu_eh_ipv4_tcp_1 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_eh_ipv4', 'tv_mac_ipv6_gtpu_eh_ipv4')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_eh_ipv4_tcp_1]
+
+sv_mac_ipv6_gtpu_eh_ipv4_tcp_2 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_eh_ipv4', 'tv_mac_ipv6_gtpu_eh_ipv4')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_eh_ipv4_tcp_2]
+
+sv_mac_ipv6_gtpu_eh_ipv4_tcp = [sv_mac_ipv6_gtpu_eh_ipv4_tcp_1, sv_mac_ipv6_gtpu_eh_ipv4_tcp_2]
+
+sv_mac_ipv6_gtpu_eh_ipv6_tcp_1 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_eh_ipv6', 'tv_mac_ipv6_gtpu_eh_ipv6')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_eh_ipv6_tcp_1]
+
+sv_mac_ipv6_gtpu_eh_ipv6_tcp_2 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_eh_ipv6', 'tv_mac_ipv6_gtpu_eh_ipv6')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_eh_ipv6_tcp_2]
+
+sv_mac_ipv6_gtpu_eh_ipv6_tcp = [sv_mac_ipv6_gtpu_eh_ipv6_tcp_1, sv_mac_ipv6_gtpu_eh_ipv6_tcp_2]
+
+tv_mac_ipv4_gtpu_ipv4_teid_with_mask = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_teid_with_mask",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345688)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345688)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 4}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_teid_without_mask = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_teid_without_mask",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / ipv4 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345688)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345688)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 dst is 192.168.1.2 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(dst="192.168.1.2")'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_l3src = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_l3src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.1")'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.1")'),
+                              ],
+              "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.11")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.11")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_l3src_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_l3src_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.1", dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.1", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.11", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.1", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('IP(frag=6)', 'IP(frag=6, src="192.168.1.11", dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_all = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_all",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()/IP()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('GTP_U_Header()/IP(frag=6)', 'GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(frag=6, src="192.168.1.1", dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()/IP()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()/IP()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_nonfrag'].replace('GTP_U_Header()/IP()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('GTP_U_Header()/IP(frag=6)', 'GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(frag=6, src="192.168.1.11", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('GTP_U_Header()/IP(frag=6)', 'GTP_U_Header(gtp_type=255, teid=0x12345677)/IP(frag=6, src="192.168.1.1", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_frag'].replace('GTP_U_Header()/IP(frag=6)', 'GTP_U_Header(gtp_type=255, teid=0x12345677)/IP(frag=6, src="192.168.1.11", dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+sv_mac_ipv4_gtpu_ipv4 = [
+    tv_mac_ipv4_gtpu_ipv4_teid_with_mask,
+    tv_mac_ipv4_gtpu_ipv4_teid_without_mask,
+    tv_mac_ipv4_gtpu_ipv4_l3dst,
+    tv_mac_ipv4_gtpu_ipv4_l3src,
+    tv_mac_ipv4_gtpu_ipv4_l3src_l3dst,
+    tv_mac_ipv4_gtpu_ipv4_all,
+]
+
+sv_mac_ipv4_gtpu_ipv6 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_ipv4', 'tv_mac_ipv4_gtpu_ipv6')
+                    .replace(' ipv4 ', ' ipv61 ')
+                    .replace('eth / ipv61 ', 'eth / ipv4 ')
+                    .replace(' ipv61 ', ' ipv6 ')
+                    .replace('IP(', 'IPv61(')
+                    .replace(':55")/IPv61(', ':55")/IP(')
+                    .replace('IPv61', 'IPv6')
+                    .replace('IPv6(frag=6', 'IPv6(nh=6')
+                    .replace('192.168.1.1', '2001::1')
+                    .replace('192.168.1.11', '2001::11')
+                    .replace('192.168.1.2', '2001::2')
+                    .replace('192.168.1.22', '2001::22'))
+                    for sv in sv_mac_ipv4_gtpu_ipv4[0:-2]]
+
+sv_mac_ipv6_gtpu_ipv4 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_ipv4', 'tv_mac_ipv6_gtpu_ipv4')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_ipv4]
+
+sv_mac_ipv6_gtpu_ipv6 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_ipv4', 'tv_mac_ipv4_gtpu_ipv6')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_ipv6]
+
+tv_mac_ipv4_gtpu_ipv4_udp_teid_with_mask = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_udp_teid_with_mask",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 / udp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345688)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_udp_teid_without_mask = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_udp_teid_without_mask",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / ipv4 / udp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345688)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_udp_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_udp_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 dst is 192.168.1.2 / udp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_udp_l3src = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_udp_l3src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 / udp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.1")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.11")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_udp_l3src_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_udp_l3src_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.1", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_udp_l3src_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_udp_l3src_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 / udp dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(src="192.168.1.1")/UDP(dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(src="192.168.1.11")/UDP(dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(src="192.168.1.1")/UDP(dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(src="192.168.1.11")/UDP(dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_udp_l3src_l4src = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_udp_l3src_l4src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 / udp src is 22 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(src="192.168.1.1")/UDP(sport=22)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(src="192.168.1.11")/UDP(sport=22)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(src="192.168.1.1")/UDP(sport=12)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(src="192.168.1.11")/UDP(sport=12)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_udp_l3dst_l4src = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_udp_l3dst_l4src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 dst is 192.168.1.2 / udp src is 22 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(dst="192.168.1.2")/UDP(sport=22)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(dst="192.168.1.22")/UDP(sport=22)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(dst="192.168.1.2")/UDP(sport=12)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(dst="192.168.1.22")/UDP(sport=12)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_udp_l3dst_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_udp_l3dst_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 dst is 192.168.1.2 / udp dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(dst="192.168.1.2")/UDP(dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(dst="192.168.1.22")/UDP(dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(dst="192.168.1.2")/UDP(dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(dst="192.168.1.22")/UDP(dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_udp_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_udp_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 / udp dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP()/UDP(dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP()/UDP(dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_udp_l4src = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_udp_l4src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 / udp src is 22 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP()/UDP(sport=22)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP()/UDP(sport=12)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_udp_l4src_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_udp_l4src_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 / udp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP()/UDP(sport=22, dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP()/UDP(sport=22, dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP()/UDP(sport=12, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP()/UDP(sport=12, dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_udp_teid_l3src_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_udp_teid_l3src_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_udp_teid_l4src_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_udp_teid_l4src_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 / udp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)/IP()/UDP(sport=22, dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)/IP()/UDP(sport=12, dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)/IP()/UDP(sport=22, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)/IP()/UDP(sport=12, dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+
+tv_mac_ipv4_gtpu_ipv4_udp_l3_l4 = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_udp_l3_l4",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=22, dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=12, dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=22, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/UDP()', 'GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=12, dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+sv_mac_ipv4_gtpu_ipv4_udp_1 = [
+    tv_mac_ipv4_gtpu_ipv4_udp_teid_with_mask,
+    tv_mac_ipv4_gtpu_ipv4_udp_teid_without_mask,
+    tv_mac_ipv4_gtpu_ipv4_udp_l3dst,
+    tv_mac_ipv4_gtpu_ipv4_udp_l3src,
+    tv_mac_ipv4_gtpu_ipv4_udp_l3src_l4dst,
+    tv_mac_ipv4_gtpu_ipv4_udp_l3src_l4src,
+]
+
+sv_mac_ipv4_gtpu_ipv4_udp_2 = [
+    tv_mac_ipv4_gtpu_ipv4_udp_l3dst_l4src,
+    tv_mac_ipv4_gtpu_ipv4_udp_l3dst_l4dst,
+    tv_mac_ipv4_gtpu_ipv4_udp_l4dst,
+    tv_mac_ipv4_gtpu_ipv4_udp_l4src,
+    tv_mac_ipv4_gtpu_ipv4_udp_l4src_l4dst,
+    tv_mac_ipv4_gtpu_ipv4_udp_teid_l4src_l4dst,
+    tv_mac_ipv4_gtpu_ipv4_udp_teid_l3src_l3dst,
+    tv_mac_ipv4_gtpu_ipv4_udp_l3src_l3dst,
+    tv_mac_ipv4_gtpu_ipv4_udp_l3_l4,
+]
+
+sv_mac_ipv4_gtpu_ipv4_udp = [sv_mac_ipv4_gtpu_ipv4_udp_1, sv_mac_ipv4_gtpu_ipv4_udp_2]
+
+sv_mac_ipv4_gtpu_ipv6_udp_1 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_ipv4', 'tv_mac_ipv4_gtpu_ipv6')
+                    .replace(' ipv4 ', ' ipv61 ')
+                    .replace('eth / ipv61 ', 'eth / ipv4 ')
+                    .replace(' ipv61 ', ' ipv6 ')
+                    .replace('IP(', 'IPv61(')
+                    .replace(':55")/IPv61(', ':55")/IP(')
+                    .replace('IPv61', 'IPv6')
+                    .replace('IPv6(frag=6', 'IPv6(nh=6')
+                    .replace('192.168.1.1', '2001::1')
+                    .replace('192.168.1.11', '2001::11')
+                    .replace('192.168.1.2', '2001::2')
+                    .replace('192.168.1.22', '2001::22'))
+                    for sv in sv_mac_ipv4_gtpu_ipv4_udp_1]
+
+sv_mac_ipv4_gtpu_ipv6_udp_2 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_ipv4', 'tv_mac_ipv4_gtpu_ipv6')
+                    .replace(' ipv4 ', ' ipv61 ')
+                    .replace('eth / ipv61 ', 'eth / ipv4 ')
+                    .replace(' ipv61 ', ' ipv6 ')
+                    .replace('IP(', 'IPv61(')
+                    .replace(':55")/IPv61(', ':55")/IP(')
+                    .replace('IPv61', 'IPv6')
+                    .replace('IPv6(frag=6', 'IPv6(nh=6')
+                    .replace('192.168.1.1', '2001::1')
+                    .replace('192.168.1.11', '2001::11')
+                    .replace('192.168.1.2', '2001::2')
+                    .replace('192.168.1.22', '2001::22'))
+                    for sv in sv_mac_ipv4_gtpu_ipv4_udp_2[0:-3]]
+
+sv_mac_ipv4_gtpu_ipv6_udp = [sv_mac_ipv4_gtpu_ipv6_udp_1, sv_mac_ipv4_gtpu_ipv6_udp_2]
+
+sv_mac_ipv6_gtpu_ipv4_udp_1 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_ipv4', 'tv_mac_ipv6_gtpu_ipv4')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_ipv4_udp_1]
+
+sv_mac_ipv6_gtpu_ipv4_udp_2 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_ipv4', 'tv_mac_ipv6_gtpu_ipv4')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_ipv4_udp_2]
+
+sv_mac_ipv6_gtpu_ipv4_udp = [sv_mac_ipv6_gtpu_ipv4_udp_1, sv_mac_ipv6_gtpu_ipv4_udp_2]
+
+sv_mac_ipv6_gtpu_ipv6_udp_1 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_ipv6', 'tv_mac_ipv6_gtpu_ipv6')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_ipv6_udp_1]
+
+sv_mac_ipv6_gtpu_ipv6_udp_2 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_ipv6', 'tv_mac_ipv6_gtpu_ipv6')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_ipv6_udp_2]
+
+sv_mac_ipv6_gtpu_ipv6_udp = [sv_mac_ipv6_gtpu_ipv6_udp_1, sv_mac_ipv6_gtpu_ipv6_udp_2]
+
+tv_mac_ipv4_gtpu_ipv4_tcp_teid_with_mask = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_tcp_teid_with_mask",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 / tcp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),
+                              mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345688)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 2}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_tcp_teid_without_mask = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_tcp_teid_without_mask",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / ipv4 / tcp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)'),],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()', 'GTP_U_Header(gtp_type=255, teid=0x12345688)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_tcp_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_tcp_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 dst is 192.168.1.2 / tcp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_tcp_l3src = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_tcp_l3src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 / tcp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.1")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.11")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_tcp_l3src_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_tcp_l3src_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / tcp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.1", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_tcp_l3src_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_tcp_l3src_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 / tcp dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(src="192.168.1.1")/TCP(dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(src="192.168.1.11")/TCP(dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(src="192.168.1.1")/TCP(dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(src="192.168.1.11")/TCP(dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_tcp_l3src_l4src = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_tcp_l3src_l4src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 / tcp src is 22 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(src="192.168.1.1")/TCP(sport=22)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(src="192.168.1.11")/TCP(sport=22)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(src="192.168.1.1")/TCP(sport=12)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(src="192.168.1.11")/TCP(sport=12)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_tcp_l3dst_l4src = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_tcp_l3dst_l4src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 dst is 192.168.1.2 / tcp src is 22 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(dst="192.168.1.2")/TCP(sport=22)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(dst="192.168.1.22")/TCP(sport=22)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(dst="192.168.1.2")/TCP(sport=12)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(dst="192.168.1.22")/TCP(sport=12)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_tcp_l3dst_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_tcp_l3dst_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 dst is 192.168.1.2 / tcp dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(dst="192.168.1.2")/TCP(dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(dst="192.168.1.22")/TCP(dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(dst="192.168.1.2")/TCP(dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(dst="192.168.1.22")/TCP(dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_tcp_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_tcp_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 / tcp dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP()/TCP(dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP()/TCP(dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_tcp_l4src = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_tcp_l4src",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 / tcp src is 22 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP()/TCP(sport=22)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP()/TCP(sport=12)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_tcp_l4src_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_tcp_l4src_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 / tcp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP()/TCP(sport=22, dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP()/TCP(sport=22, dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP()/TCP(sport=12, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP()/TCP(sport=12, dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_tcp_teid_l3src_l3dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_tcp_teid_l3src_l3dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / tcp / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)/IP(src="192.168.1.1", dst="192.168.1.2")'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)/IP(src="192.168.1.11", dst="192.168.1.22")'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_tcp_teid_l4src_l4dst = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_tcp_teid_l4src_l4dst",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 / tcp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)/IP()/TCP(sport=22, dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header(gtp_type=255, teid=0x12345678)/IP()/TCP(sport=12, dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)/IP()/TCP(sport=22, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_udp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header(gtp_type=255, teid=0x12345677)/IP()/TCP(sport=12, dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+tv_mac_ipv4_gtpu_ipv4_tcp_l3_l4 = {
+    "name": "tv_mac_ipv4_gtpu_ipv4_tcp_l3_l4",
+    "rte_flow_pattern": 'flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid mask 0x00000001 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / tcp src is 22 dst is 23 / end actions vf id 1 / end',
+    "matched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(src="192.168.1.1", dst="192.168.1.2")/TCP(sport=22, dport=23)'),
+                              ],
+               "param": {"expect_port": 1, "expect_queues": "null"},
+               "expect_results": {"expect_pkts": 1}},
+    "mismatched": {"scapy_str": [mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(src="192.168.1.1", dst="192.168.1.2")/TCP(sport=12, dport=13)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.22")/TCP(sport=22, dport=23)'),
+                                 mac_ipv4_gtpu_basic['ipv4_gtpu_ipv4_tcp'].replace('GTP_U_Header()/IP()/TCP()', 'GTP_U_Header()/IP(src="192.168.1.11", dst="192.168.1.22")/TCP(sport=12, dport=13)'),
+                                 ],
+                  "param": {"expect_port": 1, "expect_queues": "null"},
+                  "expect_results": {"expect_pkts": 0}}
+}
+
+sv_mac_ipv4_gtpu_ipv4_tcp_1 = [
+    tv_mac_ipv4_gtpu_ipv4_tcp_teid_with_mask,
+    tv_mac_ipv4_gtpu_ipv4_tcp_teid_without_mask,
+    tv_mac_ipv4_gtpu_ipv4_tcp_l3dst,
+    tv_mac_ipv4_gtpu_ipv4_tcp_l3src,
+    tv_mac_ipv4_gtpu_ipv4_tcp_l3src_l4dst,
+    tv_mac_ipv4_gtpu_ipv4_tcp_l3src_l4src,
+]
+
+sv_mac_ipv4_gtpu_ipv4_tcp_2 = [
+    tv_mac_ipv4_gtpu_ipv4_tcp_l3dst_l4src,
+    tv_mac_ipv4_gtpu_ipv4_tcp_l3dst_l4dst,
+    tv_mac_ipv4_gtpu_ipv4_tcp_l4dst,
+    tv_mac_ipv4_gtpu_ipv4_tcp_l4src,
+    tv_mac_ipv4_gtpu_ipv4_tcp_l4src_l4dst,
+    tv_mac_ipv4_gtpu_ipv4_tcp_teid_l4src_l4dst,
+    tv_mac_ipv4_gtpu_ipv4_tcp_teid_l3src_l3dst,
+    tv_mac_ipv4_gtpu_ipv4_tcp_l3src_l3dst,
+    tv_mac_ipv4_gtpu_ipv4_tcp_l3_l4,
+]
+
+sv_mac_ipv4_gtpu_ipv4_tcp = [sv_mac_ipv4_gtpu_ipv4_tcp_1, sv_mac_ipv4_gtpu_ipv4_tcp_2]
+
+sv_mac_ipv4_gtpu_ipv6_tcp_1 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_ipv4', 'tv_mac_ipv4_gtpu_ipv6')
+                    .replace(' ipv4 ', ' ipv61 ')
+                    .replace('eth / ipv61 ', 'eth / ipv4 ')
+                    .replace(' ipv61 ', ' ipv6 ')
+                    .replace('IP(', 'IPv61(')
+                    .replace(':55")/IPv61(', ':55")/IP(')
+                    .replace('IPv61', 'IPv6')
+                    .replace('IPv6(frag=6', 'IPv6(nh=6')
+                    .replace('192.168.1.1', '2001::1')
+                    .replace('192.168.1.11', '2001::11')
+                    .replace('192.168.1.2', '2001::2')
+                    .replace('192.168.1.22', '2001::22'))
+                    for sv in sv_mac_ipv4_gtpu_ipv4_tcp_1]
+
+sv_mac_ipv4_gtpu_ipv6_tcp_2 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_ipv4', 'tv_mac_ipv4_gtpu_ipv6')
+                    .replace(' ipv4 ', ' ipv61 ')
+                    .replace('eth / ipv61 ', 'eth / ipv4 ')
+                    .replace(' ipv61 ', ' ipv6 ')
+                    .replace('IP(', 'IPv61(')
+                    .replace(':55")/IPv61(', ':55")/IP(')
+                    .replace('IPv61', 'IPv6')
+                    .replace('IPv6(frag=6', 'IPv6(nh=6')
+                    .replace('192.168.1.1', '2001::1')
+                    .replace('192.168.1.11', '2001::11')
+                    .replace('192.168.1.2', '2001::2')
+                    .replace('192.168.1.22', '2001::22'))
+                    for sv in sv_mac_ipv4_gtpu_ipv4_tcp_2[0:-3]]
+
+sv_mac_ipv4_gtpu_ipv6_tcp = [sv_mac_ipv4_gtpu_ipv6_tcp_1, sv_mac_ipv4_gtpu_ipv6_tcp_2]
+
+sv_mac_ipv6_gtpu_ipv4_tcp_1 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_ipv4', 'tv_mac_ipv6_gtpu_ipv4')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_ipv4_tcp_1]
+
+sv_mac_ipv6_gtpu_ipv4_tcp_2 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_ipv4', 'tv_mac_ipv6_gtpu_ipv4')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_ipv4_tcp_2]
+
+sv_mac_ipv6_gtpu_ipv4_tcp = [sv_mac_ipv6_gtpu_ipv4_tcp_1, sv_mac_ipv6_gtpu_ipv4_tcp_2]
+
+sv_mac_ipv6_gtpu_ipv6_tcp_1 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_ipv6', 'tv_mac_ipv6_gtpu_ipv6')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_ipv6_tcp_1]
+
+sv_mac_ipv6_gtpu_ipv6_tcp_2 = [eval(str(sv).replace('tv_mac_ipv4_gtpu_ipv6', 'tv_mac_ipv6_gtpu_ipv6')
+                    .replace('eth / ipv4 ', 'eth / ipv6 ')
+                    .replace(':55")/IP()', ':55")/IPv6()'))
+                    for sv in sv_mac_ipv4_gtpu_ipv6_tcp_2]
+
+sv_mac_ipv6_gtpu_ipv6_tcp = [sv_mac_ipv6_gtpu_ipv6_tcp_1, sv_mac_ipv6_gtpu_ipv6_tcp_2]
+
+
+class CVLDCFSwitchFilterGTPUTest(TestCase):
+    supported_nic = ['columbiaville_100g', 'columbiaville_25g', 'columbiaville_25gx2']
+
+    @check_supported_nic(supported_nic)
+    @skip_unsupported_pkg(['os default', 'wireless'])
+    def set_up_all(self):
+        """
+        Run at the start of each test suite.
+        """
+        self.dut_ports = self.dut.get_ports(self.nic)
+        # Verify that enough ports are available
+        self.verify(len(self.dut_ports) >= 1, "Insufficient ports")
+        localPort = self.tester.get_local_port(self.dut_ports[0])
+        self.__tx_iface = self.tester.get_interface(localPort)
+        self.pkt = Packet()
+        self.testpmd_status = "close"
+        self.pass_flag = 'passed'
+        self.fail_flag = 'failed'
+        # bind pf to kernel
+        self.dut.bind_interfaces_linux('ice')
+
+        # set vf driver
+        self.vf_driver = 'vfio-pci'
+        self.dut.send_expect('modprobe vfio-pci', '#')
+        self.path = self.dut.apps_name['test-pmd']
+
+    def setup_1pf_vfs_env(self, pf_port=0, driver='default'):
+        """
+        create and set vfs
+
+        :param pf_port: pf port generate vfs
+        :param driver:  set vf driver
+        """
+        self.reload_ice()
+        self.used_dut_port_0 = self.dut_ports[pf_port]
+        # get PF interface name
+        self.pf0_intf = self.dut.ports_info[self.used_dut_port_0]['intf']
+        # generate 4 VFs on PF
+        self.dut.generate_sriov_vfs_by_port(self.used_dut_port_0, 2, driver=driver)
+        self.sriov_vfs_port_0 = self.dut.ports_info[self.used_dut_port_0]['vfs_port']
+        # set VF0 as trust
+        self.dut.send_expect('ip link set %s vf 0 trust on' % self.pf0_intf, '#')
+        # bind VFs to dpdk driver
+        for port in self.sriov_vfs_port_0:
+            port.bind_driver(self.vf_driver)
+        time.sleep(5)
+
+    def set_up(self):
+        """
+        Run before each test case.
+        """
+        self.setup_1pf_vfs_env()
+
+    def reload_ice(self):
+        """
+        dcf switch need reload driver to ensure create rule sucessful
+        """
+        self.dut.send_expect("rmmod ice", "# ", 15)
+        self.dut.send_expect("modprobe ice", "# ", 15)
+
+    def create_testpmd_command(self):
+        """
+        splice create testpmd command
+
+        :return: create testpmd command
+        """
+        #Prepare testpmd EAL and parameters
+        vf0_pci = self.sriov_vfs_port_0[0].pci
+        vf1_pci = self.sriov_vfs_port_0[1].pci
+        all_eal_param = self.dut.create_eal_parameters(cores='1S/4C/1T', ports=[vf0_pci, vf1_pci], port_options={vf0_pci:"cap=dcf"})
+        command = self.path + all_eal_param + " -- -i"
+        return command
+
+    def launch_testpmd(self):
+        """
+        launch testpmd with the command
+        """
+        command = self.create_testpmd_command()
+        self.dut.send_expect(command, "testpmd> ", 15)
+        self.testpmd_status = "running"
+        self.dut.send_expect("set portlist 1", "testpmd> ", 15)
+        self.dut.send_expect("set fwd rxonly", "testpmd> ", 15)
+        self.dut.send_expect("set verbose 1", "testpmd> ", 15)
+
+    def send_and_check_packets(self, dic, session_name="", tx_iface=""):
+        """
+        general packets processing workflow.
+
+        :param dic: scapy str dic
+        :param session_name: testpmd seesion
+        :param tx_iface: send pkts port
+        """
+        if session_name == "":
+            session_name = self.dut
+        if tx_iface == "":
+            tx_iface = self.__tx_iface
+        session_name.send_expect("start", "testpmd> ", 15)
+        time.sleep(2)
+        #send packets
+        self.pkt.update_pkt(dic["scapy_str"])
+        self.pkt.send_pkt(self.tester, tx_port=tx_iface, count=1, timeout=370)
+        time.sleep(3)
+        out = session_name.send_expect("stop", "testpmd> ", 15)
+        rfc.check_vf_rx_packets_number(out, dic["param"], dic["expect_results"])
+
+    def validate_switch_filter_rule(self, rte_flow_pattern, session_name="", check_stats=True):
+        """
+        validate switch rule
+
+        :param rte_flow_pattern: switch rule list or str
+        :param session_name: testpmd session
+        :param check_stats: check requirement validate rule true or false
+        """
+        if session_name == "":
+            session_name = self.dut
+        p = "Flow rule validated"
+        rule_list = []
+        if isinstance(rte_flow_pattern, list):
+            for rule in rte_flow_pattern:
+                length = len(rule)
+                rule_rep = rule[0:5] + "validate" + rule[11:length]
+                out = session_name.send_expect(rule_rep, "testpmd> ")  #validate a rule
+                if (p in out) and ("Failed" not in out):
+                    rule_list.append(True)
+                else:
+                    rule_list.append(False)
+        elif isinstance(rte_flow_pattern, str):
+            length = len(rte_flow_pattern)
+            rule_rep = rte_flow_pattern[0:5] + "validate" + rte_flow_pattern[11:length]
+            out = session_name.send_expect(rule_rep, "testpmd> ")  #validate a rule
+            if (p in out) and ("Failed" not in out):
+                rule_list.append(True)
+            else:
+                rule_list.append(False)
+        else:
+            raise Exception("unsupported rule type, only accept list or str")
+        if check_stats:
+            self.verify(all(rule_list), "some rules not validated successfully, result %s, rule %s" % (rule_list, rte_flow_pattern))
+        else:
+            self.verify(not any(rule_list), "all rules should not validate successfully, result %s, rule %s" % (rule_list, rte_flow_pattern))
+
+    def create_switch_filter_rule(self, rte_flow_pattern, session_name="", check_stats=True):
+        """
+        create switch rule
+
+        :param rte_flow_pattern: switch rule list or str
+        :param session_name: testpmd session
+        :param check_stats: check requirement create rule true or false
+        :return: return rule list for destroy rule test
+        """
+        if session_name == "":
+            session_name = self.dut
+        p = re.compile(r"Flow rule #(\d+) created")
+        rule_list = []
+        if isinstance(rte_flow_pattern, list):
+            for rule in rte_flow_pattern:
+                out = session_name.send_expect(rule, "testpmd> ")  #create a rule
+                m = p.search(out)
+                if m:
+                    rule_list.append(m.group(1))
+                else:
+                    rule_list.append(False)
+        else:
+            out = session_name.send_expect(rte_flow_pattern, "testpmd> ")  #create a rule
+            m = p.search(out)
+            if m:
+                rule_list.append(m.group(1))
+            else:
+                rule_list.append(False)
+        if check_stats:
+            self.verify(all(rule_list), "some rules not created successfully, result %s, rule %s" % (rule_list, rte_flow_pattern))
+        else:
+            self.verify(not any(rule_list), "all rules should create failed, result %s" % rule_list)
+        return rule_list
+
+    def check_switch_filter_rule_list(self, port_id, rule_list, session_name="", need_verify=True):
+        """
+        check the rules in list identical to ones in rule_list
+
+        :param port_id: create rule port
+        :param rule_list: create rule list
+        :param session_name: testpmd session
+        :param need_verify: check rule create status
+        :return: return not the same as expected rule list
+        """
+        if session_name == "":
+            session_name = self.dut
+        out = session_name.send_expect("flow list %d" % port_id, "testpmd> ", 15)
+        p = re.compile(r"ID\s+Group\s+Prio\s+Attr\s+Rule")
+        m = p.search(out)
+        if not m:
+            result = []
+        else:
+            p_spec = re.compile("^(\d+)\s")
+            out_lines = out.splitlines()
+            res = filter(bool, map(p_spec.match, out_lines))
+            result = [i.group(1) for i in res]
+        if need_verify:
+            self.verify(result == rule_list,
+                    "the rule list is not the same. expect %s, result %s" % (rule_list, result))
+        else:
+            return result
+
+    def destroy_switch_filter_rule(self, port_id, rule_list, session_name="", need_verify=True):
+        """
+        destroy the created switch rule
+
+        :param port_id: create rule port
+        :param rule_list: create rule list
+        :param session_name: testpmd session
+        :param need_verify: check rule destroy status
+        :return: return not the same as expected rule list
+        """
+        if session_name == "":
+            session_name = self.dut
+        p = re.compile(r"Flow rule #(\d+) destroyed")
+        destroy_list = []
+        if isinstance(rule_list, list):
+            for i in rule_list:
+                out = session_name.send_expect("flow destroy %s rule %s" % (port_id, i), "testpmd> ", 15)
+                m = p.search(out)
+                if m:
+                    destroy_list.append(m.group(1))
+                else:
+                    destroy_list.append(False)
+        else:
+            out = session_name.send_expect("flow destroy %s rule %s" % (port_id, rule_list), "testpmd> ", 15)
+            m = p.search(out)
+            if m:
+                destroy_list.append(m.group(1))
+            else:
+                destroy_list.append(False)
+            rule_list = [rule_list]
+        if need_verify:
+            self.verify(destroy_list == rule_list, "flow rule destroy failed, expect %s result %s" % (rule_list, destroy_list))
+        else:
+            return destroy_list
+
+    def destroy_testpmd_and_vf(self):
+        """
+        quit testpmd and destroy vf
+        """
+        if self.testpmd_status != "close":
+            # destroy all flow rules on DCF
+            self.dut.send_expect("flow flush 0", "testpmd> ", 15)
+            self.dut.send_expect("clear port stats all", "testpmd> ", 15)
+            self.dut.send_expect("quit", "#", 15)
+            #kill all DPDK application
+            self.dut.kill_all()
+            # destroy vfs
+            for port_id in self.dut_ports:
+                self.dut.destroy_sriov_vfs_by_port(port_id)
+        self.testpmd_status = "close"
+        if getattr(self, 'session_secondary', None):
+            self.dut.close_session(self.session_secondary)
+
+    def _rte_flow_validate_pattern(self, test_vector):
+        """
+        validate/create/check pkts status/result
+
+        :param test_vector: switch rule and pkts dic
+        """
+        test_results = dict()
+        for tvs in test_vector:
+            self.destroy_testpmd_and_vf()
+            self.setup_1pf_vfs_env()
+            self.launch_testpmd()
+            for tv in tvs:
+                try:
+                    self.logger.info('===================Test sub case: {}================'.format(tv["name"]))
+                    #validate a rule
+                    self.validate_switch_filter_rule(tv["rte_flow_pattern"])
+                    #create a rule
+                    rule_list = self.create_switch_filter_rule(tv["rte_flow_pattern"])
+                    self.check_switch_filter_rule_list(0, rule_list)
+                    #send matched packets and check
+                    matched_dic = tv["matched"]
+                    self.send_and_check_packets(matched_dic)
+                    #send mismatched packets and check
+                    mismatched_dic = tv["mismatched"]
+                    self.send_and_check_packets(mismatched_dic)
+                    #destroy rule and send matched packets
+                    self.destroy_switch_filter_rule(0, rule_list)
+                    self.check_switch_filter_rule_list(0, [])
+                    #send matched packets and check
+                    destroy_dict = copy.deepcopy(matched_dic)
+                    if isinstance(destroy_dict["expect_results"]["expect_pkts"], list):
+                        destroy_dict["expect_results"]["expect_pkts"] = [0]*len(destroy_dict["expect_results"]["expect_pkts"])
+                    else:
+                        destroy_dict["expect_results"]["expect_pkts"] = 0
+                    self.send_and_check_packets(destroy_dict)
+                    test_results[tv["name"]] = self.pass_flag
+                    self.logger.info('sub_case %s passed' % tv["name"])
+                except Exception as e:
+                    self.logger.warning('sub_case %s failed: %s' % (tv["name"], e))
+                    test_results[tv["name"]] = self.fail_flag
+                    self.dut.send_expect("flow flush 0", "testpmd> ", 15)
+        pass_rate = round(list(test_results.values()).count(self.pass_flag) / len(test_results), 4) * 100
+        self.logger.info(test_results)
+        self.logger.info('pass rate is: %s' % pass_rate)
+        self.verify(pass_rate == 100.00, 'some subcases failed')
+
+    def test_mac_ipv4_gtpu(self):
+        self._rte_flow_validate_pattern([sv_mac_ipv4_gtpu])
+
+    def test_mac_ipv6_gtpu(self):
+        self._rte_flow_validate_pattern([sv_mac_ipv6_gtpu])
+
+    def test_mac_ipv4_gtpu_ipv4(self):
+        self._rte_flow_validate_pattern([sv_mac_ipv4_gtpu_ipv4])
+
+    def test_mac_ipv4_gtpu_ipv6(self):
+        self._rte_flow_validate_pattern([sv_mac_ipv4_gtpu_ipv6])
+
+    def test_mac_ipv6_gtpu_ipv4(self):
+        self._rte_flow_validate_pattern([sv_mac_ipv6_gtpu_ipv4])
+
+    def test_mac_ipv6_gtpu_ipv6(self):
+        self._rte_flow_validate_pattern([sv_mac_ipv6_gtpu_ipv6])
+
+    def test_mac_ipv4_gtpu_ipv4_udp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv4_gtpu_ipv4_udp)
+
+    def test_mac_ipv4_gtpu_ipv6_udp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv4_gtpu_ipv6_udp)
+
+    def test_mac_ipv6_gtpu_ipv4_udp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv6_gtpu_ipv4_udp)
+
+    def test_mac_ipv6_gtpu_ipv6_udp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv6_gtpu_ipv6_udp)
+
+    def test_mac_ipv4_gtpu_ipv4_tcp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv4_gtpu_ipv4_tcp)
+
+    def test_mac_ipv4_gtpu_ipv6_tcp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv4_gtpu_ipv6_tcp)
+
+    def test_mac_ipv6_gtpu_ipv4_tcp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv6_gtpu_ipv4_tcp)
+
+    def test_mac_ipv6_gtpu_ipv6_tcp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv6_gtpu_ipv6_tcp)
+
+    def test_mac_ipv4_gtpu_eh_ipv4(self):
+        self._rte_flow_validate_pattern([sv_mac_ipv4_gtpu_eh_ipv4])
+
+    def test_mac_ipv4_gtpu_eh_ipv6(self):
+        self._rte_flow_validate_pattern([sv_mac_ipv4_gtpu_eh_ipv6])
+
+    def test_mac_ipv6_gtpu_eh_ipv4(self):
+        self._rte_flow_validate_pattern([sv_mac_ipv6_gtpu_eh_ipv4])
+
+    def test_mac_ipv6_gtpu_eh_ipv6(self):
+        self._rte_flow_validate_pattern([sv_mac_ipv6_gtpu_eh_ipv6])
+
+    def test_mac_ipv4_gtpu_eh_ipv4_udp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv4_gtpu_eh_ipv4_udp)
+
+    def test_mac_ipv4_gtpu_eh_ipv6_udp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv4_gtpu_eh_ipv6_udp)
+
+    def test_mac_ipv6_gtpu_eh_ipv4_udp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv6_gtpu_eh_ipv4_udp)
+
+    def test_mac_ipv6_gtpu_eh_ipv6_udp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv6_gtpu_eh_ipv6_udp)
+
+    def test_mac_ipv4_gtpu_eh_ipv4_tcp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv4_gtpu_eh_ipv4_tcp)
+
+    def test_mac_ipv4_gtpu_eh_ipv6_tcp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv4_gtpu_eh_ipv6_tcp)
+
+    def test_mac_ipv6_gtpu_eh_ipv4_tcp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv6_gtpu_eh_ipv4_tcp)
+
+    def test_mac_ipv6_gtpu_eh_ipv6_tcp(self):
+        self._rte_flow_validate_pattern(sv_mac_ipv6_gtpu_eh_ipv6_tcp)
+
+    def tear_down(self):
+        """
+        Run after each test case.
+        """
+        self.destroy_testpmd_and_vf()
+
+    def tear_down_all(self):
+        """
+        Run after each test suite.
+        """
+        self.dut.kill_all()
-- 
2.17.1


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

* Re: [dts] [PATCH V2 1/2] test_plans/dcf_switch_gtpu: add dcf_switch_filter_gtpu test plan
  2021-06-02 18:50 ` [dts] [PATCH V2 1/2] test_plans/dcf_switch_gtpu: add dcf_switch_filter_gtpu " Zhimin Huang
@ 2021-06-10  6:54   ` Lin, Xueqin
  2021-06-18  5:56   ` Tu, Lijuan
  1 sibling, 0 replies; 7+ messages in thread
From: Lin, Xueqin @ 2021-06-10  6:54 UTC (permalink / raw)
  To: Huang, ZhiminX, dts

> -----Original Message-----
> From: Huang, ZhiminX <zhiminx.huang@intel.com>
> Sent: Thursday, June 3, 2021 2:51 AM
> To: dts@dpdk.org
> Cc: Lin, Xueqin <xueqin.lin@intel.com>; Huang, ZhiminX
> <zhiminx.huang@intel.com>
> Subject: [dts] [PATCH V2 1/2] test_plans/dcf_switch_gtpu: add
> dcf_switch_filter_gtpu test plan
> 
> *.add cvl_dcf_switch_filter_gtpu testplan
> 
> Signed-off-by: Zhimin Huang <zhiminx.huang@intel.com>
Acked-by: Xueqin Lin <xueqin.lin@intel.com>

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

* Re: [dts] [PATCH V2 2/2] tests/cvl_dcf_switch_filter_gtpu: add dcf_switch_filter_gtpu test case
  2021-06-02 18:50 ` [dts] [PATCH V2 2/2] tests/cvl_dcf_switch_filter_gtpu: add dcf_switch_filter_gtpu test case Zhimin Huang
  2021-06-02 10:30   ` Huang, ZhiminX
@ 2021-06-10  6:59   ` Lin, Xueqin
  1 sibling, 0 replies; 7+ messages in thread
From: Lin, Xueqin @ 2021-06-10  6:59 UTC (permalink / raw)
  To: Huang, ZhiminX, dts

> -----Original Message-----
> From: Huang, ZhiminX <zhiminx.huang@intel.com>
> Sent: Thursday, June 3, 2021 2:51 AM
> To: dts@dpdk.org
> Cc: Lin, Xueqin <xueqin.lin@intel.com>; Huang, ZhiminX
> <zhiminx.huang@intel.com>
> Subject: [dts] [PATCH V2 2/2] tests/cvl_dcf_switch_filter_gtpu: add
> dcf_switch_filter_gtpu test case
> 
> *.add 26 test cases to cvl_dcf_switch_filter_gtpu suite
> 
> Signed-off-by: Zhimin Huang <zhiminx.huang@intel.com>
Acked-by: Xueqin Lin <xueqin.lin@intel.com>

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

* Re: [dts] [PATCH V2 1/2] test_plans/dcf_switch_gtpu: add dcf_switch_filter_gtpu test plan
  2021-06-02 18:50 ` [dts] [PATCH V2 1/2] test_plans/dcf_switch_gtpu: add dcf_switch_filter_gtpu " Zhimin Huang
  2021-06-10  6:54   ` Lin, Xueqin
@ 2021-06-18  5:56   ` Tu, Lijuan
  1 sibling, 0 replies; 7+ messages in thread
From: Tu, Lijuan @ 2021-06-18  5:56 UTC (permalink / raw)
  To: Huang, ZhiminX, dts; +Cc: Lin, Xueqin, Huang, ZhiminX



> -----Original Message-----
> From: dts <dts-bounces@dpdk.org> On Behalf Of Zhimin Huang
> Sent: 2021年6月3日 2:51
> To: dts@dpdk.org
> Cc: Lin, Xueqin <xueqin.lin@intel.com>; Huang, ZhiminX
> <zhiminx.huang@intel.com>
> Subject: [dts] [PATCH V2 1/2] test_plans/dcf_switch_gtpu: add
> dcf_switch_filter_gtpu test plan
> 
> *.add cvl_dcf_switch_filter_gtpu testplan
> 
> Signed-off-by: Zhimin Huang <zhiminx.huang@intel.com>
> ---
>  .../cvl_dcf_switch_filter_gtpu_test_plan.rst  | 1424 +++++++++++++++++
>  1 file changed, 1424 insertions(+)
>  create mode 100644 test_plans/cvl_dcf_switch_filter_gtpu_test_plan.rst
> 
> diff --git a/test_plans/cvl_dcf_switch_filter_gtpu_test_plan.rst
> b/test_plans/cvl_dcf_switch_filter_gtpu_test_plan.rst
> new file mode 100644
> index 00000000..4991e0e6
> --- /dev/null
> +++ b/test_plans/cvl_dcf_switch_filter_gtpu_test_plan.rst
> @@ -0,0 +1,1424 @@
> +.. Copyright (c) <2021>, Intel Corporation
> +   All rights reserved.
> +
> +   Redistribution and use in source and binary forms, with or without
> +   modification, are permitted provided that the following conditions
> +   are met:
> +
> +   - Redistributions of source code must retain the above copyright
> +     notice, this list of conditions and the following disclaimer.
> +
> +   - Redistributions in binary form must reproduce the above copyright
> +     notice, this list of conditions and the following disclaimer in
> +     the documentation and/or other materials provided with the
> +     distribution.
> +
> +   - Neither the name of Intel Corporation nor the names of its
> +     contributors may be used to endorse or promote products derived
> +     from this software without specific prior written permission.
> +
> +   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> CONTRIBUTORS
> +   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> +   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
> +   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> +   COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
> INDIRECT,
> +   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
> +   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> OR
> +   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> +   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> CONTRACT,
> +   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> +   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
> +   OF THE POSSIBILITY OF SUCH DAMAGE.
> +
> +================================
> +CVL DCF Switch Filter GTPU Tests
> +================================
> +
> +Description
> +===========
> +
> +This document provides the plan for testing DCF switch filter of CVL

The description is not align with your subject and content.

And the file name is not align with existing test plan, e.g. 
test_plans/cvl_dcf_switch_filter_test_plan.rst 
test_plans/cvl_dcf_switch_filter_pppoe_test_plan.rst

> +
> +Pattern and input set
> +---------------------
> +
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |    Packet Types     |           Pattern             |                Input Set                             |
> +
> +=====================+===============================+==========
> ============================================+
> +  |                     |  MAC_IPV4_GTPU                |   [TEID], outer: l3[dst] [src]
> |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV6_GTPU                |   [TEID], outer: l3dst] [src]
> |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV4_GTPU_IPV4           |   [TEID], inner: l3[dst] [src]
> |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV4_GTPU_IPV4_TCP       |   [TEID], inner: l3[dst] [src]
> l4[dst] [src]         |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV4_GTPU_IPV4_UDP       |   [TEID], inner: l3[dst] [src]
> l4[dst] [src]         |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV4_GTPU_IPV6           |   [TEID], inner: l3[dst] [src]
> |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV4_GTPU_IPV6_TCP       |   [TEID], inner: l3[dst] [src]
> l4[dst] [src]         |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV4_GTPU_IPV6_UDP       |   [TEID], inner: l3[dst] [src]
> l4[dst] [src]         |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV6_GTPU_IPV4           |   [TEID], inner: l3[dst] [src]
> |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV6_GTPU_IPV4_TCP       |   [TEID], inner: l3[dst] [src]
> l4[dst] [src]         |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV6_GTPU_IPV4_UDP       |   [TEID], inner: l3[dst] [src]
> l4[dst] [src]         |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV6_GTPU_IPV6           |   [TEID], inner: l3[dst] [src]
> |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV6_GTPU_IPV6_TCP       |   [TEID], inner: l3[dst] [src]
> l4[dst] [src]         |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV6_GTPU_IPV6_UDP       |   [TEID], inner: l3[dst] [src]
> l4[dst] [src]         |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV4_GTPU_EH_IPV4        |   [QFI] [TEID], inner: l3[dst]
> [src]                 |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV4_GTPU_EH_IPV4_TCP    |   [QFI] [TEID], inner: l3[dst]
> [src] l4[dst] [src]   |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV4_GTPU_EH_IPV4_UDP    |   [QFI] [TEID], inner: l3[dst]
> [src] l4[dst] [src]   |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV4_GTPU_EH_IPV6        |   [QFI] [TEID], inner: l3[dst]
> [src]                 |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV4_GTPU_EH_IPV6_TCP    |   [QFI] [TEID], inner: l3[dst]
> [src] l4[dst] [src]   |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV4_GTPU_EH_IPV6_UDP    |   [QFI] [TEID], inner: l3[dst]
> [src] l4[dst] [src]   |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV6_GTPU_EH_IPV4        |   [QFI] [TEID], inner: l3[dst]
> [src]                 |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV6_GTPU_EH_IPV4_TCP    |   [QFI] [TEID], inner: l3[dst]
> [src] l4[dst] [src]   |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV6_GTPU_EH_IPV4_UDP    |   [QFI] [TEID], inner: l3[dst]
> [src] l4[dst] [src]   |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV6_GTPU_EH_IPV6        |   [QFI] [TEID], inner: l3[dst]
> [src]                 |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV6_GTPU_EH_IPV6_TCP    |   [QFI] [TEID], inner: l3[dst]
> [src] l4[dst] [src]   |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +  |                     |  MAC_IPV6_GTPU_EH_IPV6_UDP    |   [QFI] [TEID], inner: l3[dst]
> [src] l4[dst] [src]   |
> +  +---------------------+-------------------------------+--------------------------------------
> ----------------+
> +
> +.. note::
> +
> +   1. The maximum input set length of a switch rule is 32 bytes, and src ipv6,
> +      dst ipv6 account for 32 bytes. Therefore, for ipv6 cases, if need to test
> +      fields other than src, dst ip, we create rule by removing src or dst ip in
> +      the test plan.
> +
> +
> +Supported action type
> +---------------------
> +
> +* To vf/vsi
> +
> +
> +Prerequisites
> +=============
> +
> +1. Hardware:
> +   columbiaville_25g/columbiaville_100g
> +
> +2. Software::
> +
> +      dpdk: http://dpdk.org/git/dpdk
> +      scapy: http://www.secdev.org/projects/scapy/
> +
> +3. Copy specific ice package to /lib/firmware/updates/intel/ice/ddp/ice.pkg,
> +   then load driver::
> +
> +     rmmod ice
> +     insmod ice.ko
> +
> +4. Compile DPDK::
> +
> +     make -j install T=x86_64-native-linuxapp-gcc
> +
> +5. Get the pci device id of DUT, for example::
> +
> +     ./usertools/dpdk-devbind.py -s
> +
> +     0000:18:00.0 'Device 1593' if=enp24s0f0 drv=ice unused=vfio-pci
> +     0000:18:00.1 'Device 1593' if=enp24s0f1 drv=ice unused=vfio-pci
> +
> +6. Generate 2 VFs on PF0::
> +
> +     echo 2 > /sys/bus/pci/devices/0000:18:00.0/sriov_numvfs
> +
> +     ./usertools/dpdk-devbind.py -s
> +     0000:18:01.0 'Ethernet Adaptive Virtual Function 1889' if=enp24s1 drv=iavf
> unused=vfio-pci
> +     0000:18:01.1 'Ethernet Adaptive Virtual Function 1889' if=enp24s1f1
> drv=iavf unused=vfio-pci
> +
> +7. Set VF0 as trust::
> +
> +     ip link set enp24s0f0 vf 0 trust on
> +
> +8. Bind VFs to dpdk driver::
> +
> +     modprobe vfio-pci
> +     ./usertools/dpdk-devbind.py -b vfio-pci 0000:18:01.0 0000:18:01.1
> +
> +9. Launch dpdk on VF0 and VF1, and VF0 request DCF mode::
> +
> +     ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0xf -n 4 -a
> 0000:18:01.0,cap=dcf -a 0000:18:01.1 -- -i
> +     testpmd> set portlist 1
> +     testpmd> set fwd rxonly
> +     testpmd> set verbose 1
> +     testpmd> start
> +     testpmd> show port info all
> +
> +   check the VF0 driver is net_ice_dcf.
> +
> +Test step:
> +==========
> +
> +* validate rule
> +* create rule
> +* send matched pkts and mismatched pkts
> +* destroy rule
> +* send matched pkts
> +* flush rule
> +
> +
> +take 'MAC_IPV4_GTPU_TEID_with_mask' for example:
> +
> +1.validate and create rule::
> +
> +   flow validate 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid
> mask 0x00000001 / end actions vf id 1 / end
> +   Flow rule validated
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid
> mask 0x00000001 / end actions vf id 1 / end
> +   Flow rule #0 created
> +
> +2.send 2 matched pkts and check port 1 received 2 pkts::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345678)/Ra
> w("x" *20)
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345688)/Ra
> w("x" *20)
> +
> +   ---------------------- Forward statistics for port 1  ----------------------
> +   RX-packets: 2              RX-dropped: 0             RX-total: 2
> +   TX-packets: 0              TX-dropped: 0             TX-total: 0
> +   ----------------------------------------------------------------------------
> +
> +   +++++++++++++++ Accumulated forward statistics for all
> ports+++++++++++++++
> +   RX-packets: 2              RX-dropped: 0             RX-total: 2
> +   TX-packets: 0              TX-dropped: 0             TX-total: 0
> +
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> +++++++++++
> +
> +3.send 1 mismatched pkts and check port 1 not received pkts::
> +
> +   p =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345677)/Ra
> w("x" *20)
> +
> +   ---------------------- Forward statistics for port 1  ----------------------
> +   RX-packets: 0              RX-dropped: 0             RX-total: 0
> +   TX-packets: 0              TX-dropped: 0             TX-total: 0
> +   ----------------------------------------------------------------------------
> +
> +   +++++++++++++++ Accumulated forward statistics for all
> ports+++++++++++++++
> +   RX-packets: 0              RX-dropped: 0             RX-total: 0
> +   TX-packets: 0              TX-dropped: 0             TX-total: 0
> +
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> +++++++++++
> +
> +4.destory rule and re-send step 2 matched pkts check port 1 not received pkts::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345678)/Ra
> w("x" *20)
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345688)/Ra
> w("x" *20)
> +
> +   ---------------------- Forward statistics for port 1  ----------------------
> +   RX-packets: 0              RX-dropped: 0             RX-total: 0
> +   TX-packets: 0              TX-dropped: 0             TX-total: 0
> +   ----------------------------------------------------------------------------
> +
> +   +++++++++++++++ Accumulated forward statistics for all
> ports+++++++++++++++
> +   RX-packets: 0              RX-dropped: 0             RX-total: 0
> +   TX-packets: 0              TX-dropped: 0             TX-total: 0
> +
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> +++++++++++
> +
> +
> +Pattern: MAC_IPV4_GTPU
> +----------------------
> +
> +Test case: MAC_IPV4_GTPU
> +>>>>>>>>>>>>>>>>>>>>>>>>
> +
> +subcase 1: MAC_IPV4_GTPU_TEID_with_mask
> +:::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid
> mask 0x00000001 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345678)/Ra
> w("x" *20)
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345688)/Ra
> w("x" *20)
> +
> +mismatched packets::
> +
> +   p3 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345677)/Ra
> w("x" *20)
> +
> +subcase 2: MAC_IPV4_GTPU_TEID_without_mask
> +::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / end
> actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345678)/Ra
> w("x" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345688)/Ra
> w("x" *20)
> +   p3 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(teid=0x12345677)/Ra
> w("x" *20)
> +
> +subcase 3: MAC_IPV4_GTPU_dst
> +::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 dst is 192.168.1.2 / udp / gtpu / end
> actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.1.2")/UDP()/GTP_U_Header()/R
> aw("x" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.1.22")/UDP()/GTP_U_Header()/
> Raw("x" *20)
> +
> +subcase 4: MAC_IPV4_GTPU_src
> +::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 src is 192.168.1.1 / udp / gtpu / end
> actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.1")/UDP()/GTP_U_Header()/R
> aw("x" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11")/UDP()/GTP_U_Header()/
> Raw("x" *20)
> +
> +subcase 5: MAC_IPV4_GTPU_src_dst
> +::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 src is 192.168.1.1 dst is 192.168.1.2 /
> udp / gtpu / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.1",
> dst="192.168.1.2")/UDP()/GTP_U_Header()/Raw("x" *20)
> +
> +mismatched packets::
> +
> +   p2 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11",
> dst="192.168.1.2")/UDP()/GTP_U_Header()/Raw("x" *20)
> +   p3 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.1",
> dst="192.168.1.22")/UDP()/GTP_U_Header()/Raw("x" *20)
> +   p4 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11",
> dst="192.168.1.22")/UDP()/GTP_U_Header()/Raw("x" *20)
> +
> +subcase 6: MAC_IPV4_GTPU_teid_dst
> +:::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 dst is 192.168.1.2 / udp / gtpu teid is
> 0x12345678 teid mask 0x00000001 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.1.2")/UDP()/GTP_U_Header(tei
> d=0x12345678)/Raw("x" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.1.22")/UDP()/GTP_U_Header(te
> id=0x12345678)/Raw("x" *20)
> +   p3 =
> Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.1.2")/UDP()/GTP_U_Header(tei
> d=0x12345677)/Raw("x" *20)
> +   p4 =
> Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.1.22")/UDP()/GTP_U_Header(te
> id=0x12345677)/Raw("x" *20)
> +
> +subcase 7: MAC_IPV4_GTPU_teid_src
> +:::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 src is 192.168.1.1 / udp / gtpu teid is
> 0x12345678 teid mask 0x00000001 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.1")/UDP()/GTP_U_Header(tei
> d=0x12345678)/Raw("x" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11")/UDP()/GTP_U_Header(te
> id=0x12345678)/Raw("x" *20)
> +   p3 =
> Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.1")/UDP()/GTP_U_Header(tei
> d=0x12345677)/Raw("x" *20)
> +   p4 =
> Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11")/UDP()/GTP_U_Header(te
> id=0x12345677)/Raw("x" *20)
> +
> +
> +subcase 8: MAC_IPV4_GTPU_ALL
> +::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 src is 192.168.1.1 dst is 192.168.1.2 /
> udp / gtpu teid is 0x12345678 teid mask 0x00000001 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.1",
> dst="192.168.1.2")/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
> +
> +mismatched packets::
> +
> +   p2 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11",
> dst="192.168.1.2")/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
> +   p3 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.1",
> dst="192.168.1.22")/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
> +   p4 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11",
> dst="192.168.1.22")/UDP()/GTP_U_Header(teid=0x12345678)/Raw("x" *20)
> +   p5 = Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.11",
> dst="192.168.1.22")/UDP()/GTP_U_Header(teid=0x12345677)/Raw("x" *20)
> +
> +Pattern: MAC_IPV6_GTPU
> +----------------------
> +reconfig all the cases of "Test case: MAC_IPV4_GTPU"
> +
> +    rule:
> +        change ipv4 to ipv6, ipv4 address to ipv6 address.
> +    packets:
> +        change the packet's L3 layer from IP to IPv6;
> +        change the ipv4 address to ipv6 address.
> +
> +Test case: MAC_IPV6_GTPU
> +>>>>>>>>>>>>>>>>>>>>>>>>
> +
> +subcase 1: MAC_IPV6_GTPU_TEID_with_mask
> +:::::::::::::::::::::::::::::::::::::::
> +
> +subcase 2: MAC_IPV6_GTPU_TEID_without_mask
> +::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 3: MAC_IPV6_GTPU_dst
> +::::::::::::::::::::::::::::
> +
> +subcase 4: MAC_IPV6_GTPU_src
> +::::::::::::::::::::::::::::
> +
> +subcase 5: MAC_IPV6_GTPU_src_dst
> +::::::::::::::::::::::::::::::::
> +
> +subcase 6: MAC_IPV6_GTPU_teid_dst
> +:::::::::::::::::::::::::::::::::
> +
> +subcase 7: MAC_IPV6_GTPU_teid_src
> +:::::::::::::::::::::::::::::::::
> +
> +subcase 8: MAC_IPV4_GTPU_ALL
> +::::::::::::::::::::::::::::
> +
> +Pattern: outer ipv4 + inner ipv4
> +--------------------------------
> +
> +Test case: MAC_IPV4_GTPU_EH_IPV4
> +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> +
> +basic pkts:
> +
> +ipv4-nonfrag packet::
> +
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP()/("X" *20)
> +
> +ipv4-frag packet::
> +
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(frag=6)/("X" *20)
> +
> +subcase 1: MAC_IPV4_GTPU_EH_IPV4_TEID_with_mask
> +:::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid
> mask 0x00000001 / gtp_psc / ipv4 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1: send basic pkts with GTP_U_Header(gtp_type=255,
> teid=0x12345678)
> +   pkts_set2: send pkts_set1 with teid 0x12345688
> +
> +mismatched packets::
> +
> +   pkts_set3: send pkts_set1 with teid 0x12345677
> +
> +subcase 2: MAC_IPV4_GTPU_EH_IPV4_TEID_without_mask
> +::::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 /
> gtp_psc / ipv4 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with GTP_U_Header(gtp_type=255,
> teid=0x12345678)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with teid 0x12345677
> +   pkts_set3: send pkts_set1 with teid 0x12345688
> +
> +subcase 3: MAC_IPV4_GTPU_EH_IPV4_QFI
> +::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4
> / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1: send basic pkts with GTPPDUSessionContainer(QFI=0x34)
> +
> +mismatched packets::
> +
> +   pkts_set2: send basic pkts with qfi 0x33
> +
> +subcase 4: MAC_IPV4_GTPU_EH_IPV4_L3DST
> +::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 dst is
> 192.168.1.2 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1: send basic pkts with inner l3dst, take 'ipv4-nonfrag' for example:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(dst="192.168.1.2")/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3dst, take 'ipv4-nonfrag' for
> example:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(dst="192.168.1.22")/("X" *20)
> +
> +subcase 5: MAC_IPV4_GTPU_EH_IPV4_L3SRC
> +::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is
> 192.168.1.1 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1: send basic pkts with inner l3src, take 'ipv4-nonfrag' for example:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.1")/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3src, take 'ipv4-nonfrag' for
> example:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.11")/("X" *20)
> +
> +subcase 6: MAC_IPV4_GTPU_EH_IPV4_L3SRC_L3DST
> +::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is
> 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1: send basic pkts with inner l3src l3dst, take 'ipv4-nonfrag' for
> example:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.1", dst="192.168.1.2")/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3src l3dst, take 'ipv4-nonfrag'
> for example:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.11", dst="192.168.1.2")/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.1", dst="192.168.1.22")/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.11", dst="192.168.1.22")/("X" *20)
> +
> +subcase 7: MAC_IPV4_GTPU_EH_IPV4_TEID_L3SRC_L3DST
> +:::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu  teid is 0x12345678 teid
> mask 0x00000001 / gtp_psc / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end
> actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1: send basic pkts with inner l3src l3dst, take 'ipv4-nonfrag' for
> example:
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer()/IP(src="192.168.1.1",
> dst="192.168.1.2")/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3src l3dst, take 'ipv4-nonfrag'
> for example:
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer()/IP(src="192.168.1.11",
> dst="192.168.1.22")/("X" *20)
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/GTPPDUSessionContainer()/IP(src="192.168.1.1",
> dst="192.168.1.2")/("X" *20)
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/GTPPDUSessionContainer()/IP(src="192.168.1.11",
> dst="192.168.1.21")/("X" *20)
> +
> +subcase 8: MAC_IPV4_GTPU_EH_IPV4_QFI_L3SRC_L3DST
> +::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4
> src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1: send basic pkts with inner l3src l3dst, take 'ipv4-nonfrag' for
> example:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3src l3dst, take 'ipv4-nonfrag'
> for example:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer(QFI=0x34)/IP(src="192.168.1.11", dst="192.168.1.22")/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer(QFI=0x33)/IP(src="192.168.1.1", dst="192.168.1.2")/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer(QFI=0x33)/IP(src="192.168.1.11", dst="192.168.1.22")/("X" *20)
> +
> +
> +subcase 9: MAC_IPV4_GTPU_EH_IPV4_ALL
> +::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu  teid is 0x12345678 teid
> mask 0x00000001 / gtp_psc qfi is 0x34 / ipv4 src is 192.168.1.1 dst is 192.168.1.2
> / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1: take 'ipv4-nonfrag' for example:
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1",
> dst="192.168.1.2")/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: take 'ipv4-nonfrag' for example:
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.11",
> dst="192.168.1.22")/("X" *20)
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.1",
> dst="192.168.1.2")/("X" *20)
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1",
> dst="192.168.1.2")/("X" *20)
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.11",
> dst="192.168.1.22")/("X" *20)
> +
> +Test case: MAC_IPV4_GTPU_EH_IPV4_UDP
> +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> +
> +basic pkts::
> +
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP()/UDP()/("X" *20)
> +
> +subcase 1: MAC_IPV4_GTPU_EH_IPV4_UDP_TEID_with_mask
> +:::::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid
> mask 0x00000001 / gtp_psc / ipv4 / udp / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer()/IP()/UDP()/("X" *20)
> +   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345688)/GTPPDUSessionContainer()/IP()/UDP()/("X" *20)
> +
> +mismatched packets::
> +
> +   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/GTPPDUSessionContainer()/IP()/UDP()/("X" *20)
> +
> +subcase 2: MAC_IPV4_GTPU_EH_IPV4_UDP_TEID_without_mask
> +::::::::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 /
> gtp_psc / ipv4 / udp / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer()/IP()/UDP()/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345688)/GTPPDUSessionContainer()/IP()/UDP()/("X" *20)
> +   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/GTPPDUSessionContainer()/IP()/UDP()/("X" *20)
> +
> +subcase 3: MAC_IPV4_GTPU_EH_IPV4_UDP_QFI
> +::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4
> / udp / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer(QFI=0x34)/IP()/UDP()/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer(QFI=0x33)/IP()/UDP()/("X" *20)
> +
> +subcase 4: MAC_IPV4_GTPU_EH_IPV4_UDP_L3DST
> +::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 dst is
> 192.168.1.2 / udp / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(dst="192.168.1.2")/UDP()/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(dst="192.168.1.22")/UDP()/("X" *20)
> +
> +subcase 5: MAC_IPV4_GTPU_EH_IPV4_UDP_L3SRC
> +::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is
> 192.168.1.1 / udp / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.1")/UDP()/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.11")/UDP()/("X" *20)
> +
> +subcase 6: MAC_IPV4_GTPU_EH_IPV4_UDP_L3SRC_L3DST
> +::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is
> 192.168.1.1 dst is 192.168.1.2 / udp / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP()/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.11", dst="192.168.1.2")/UDP()/("X" *20)
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.1", dst="192.168.1.22")/UDP()/("X" *20)
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/("X" *20)
> +
> +subcase 7: MAC_IPV4_GTPU_EH_IPV4_UDP_L3SRC_L4DST
> +::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is
> 192.168.1.1 / udp dst is 23 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.1")/UDP(dport=23)/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.11")/UDP(dport=23)/("X" *20)
> +   p3 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.1")/UDP(dport=13)/("X" *20)
> +   p4 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.11")/UDP(dport=13)/("X" *20)
> +
> +subcase 8: MAC_IPV4_GTPU_EH_IPV4_UDP_L3SRC_L4SRC
> +::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is
> 192.168.1.1 / udp src is 22 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.1")/UDP(sport=22)/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.11")/UDP(sport=22)/("X" *20)
> +   p3 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.1")/UDP(sport=12)/("X" *20)
> +   p4 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.11")/UDP(sport=12)/("X" *20)
> +
> +
> +subcase 9: MAC_IPV4_GTPU_EH_IPV4_UDP_L3DST_L4SRC
> +::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 dst is
> 192.168.1.2 / udp src is 22 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(dst="192.168.1.2")/UDP(sport=22)/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(dst="192.168.1.22")/UDP(sport=22)/("X" *20)
> +   p3 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(dst="192.168.1.2")/UDP(sport=12)/("X" *20)
> +   p4 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(dst="192.168.1.22")/UDP(sport=12)/("X" *20)
> +
> +subcase 10: MAC_IPV4_GTPU_EH_IPV4_UDP_L3DST_L4DST
> +:::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 dst is
> 192.168.1.2 / udp dst is 23 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(dst="192.168.1.2")/UDP(dport=23)/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(dst="192.168.1.22")/UDP(dport=23)/("X" *20)
> +   p3 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(dst="192.168.1.2")/UDP(dport=13)/("X" *20)
> +   p4 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(dst="192.168.1.22")/UDP(dport=13)/("X" *20)
> +
> +subcase 11: MAC_IPV4_GTPU_EH_IPV4_UDP_L4DST
> +:::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 / udp dst
> is 23 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP()/UDP(dport=23)/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP()/UDP(dport=13)/("X" *20)
> +
> +subcase 12: MAC_IPV4_GTPU_EH_IPV4_UDP_L4SRC
> +:::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 / udp src
> is 22 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP()/UDP(sport=22)/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP()/UDP(sport=12)/("X" *20)
> +
> +subcase 13: MAC_IPV4_GTPU_EH_IPV4_UDP_L4SRC_L4DST
> +:::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 / udp src
> is 22 dst is 23 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP()/UDP(sport=22, dport=23)/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP()/UDP(sport=12, dport=23)/("X" *20)
> +   p3 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP()/UDP(sport=22, dport=13)/("X" *20)
> +   p4 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP()/UDP(sport=12, dport=13)/("X" *20)
> +
> +subcase 14: MAC_IPV4_GTPU_EH_IPV4_UDP_TEID_L3SRC_L3DST
> +::::::::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid
> mask 0x00000001 / gtp_psc / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp /
> end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer()/IP(src="192.168.1.1",
> dst="192.168.1.2")/UDP()/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer()/IP(src="192.168.1.11",
> dst="192.168.1.22")/UDP()/("X" *20)
> +   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/GTPPDUSessionContainer()/IP(src="192.168.1.1",
> dst="192.168.1.2")/UDP()/("X" *20)
> +   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer()/IP(src="192.168.1.11",
> dst="192.168.1.22")/UDP()/("X" *20)
> +
> +subcase 15: MAC_IPV4_GTPU_EH_IPV4_UDP_QFI_L3SRC_L3DST
> +:::::::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4
> src is 192.168.1.1 dst is 192.168.1.2 / udp / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer(QFI=0x34)/IP(src="192.168.1.1", dst="192.168.1.2")/UDP()/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer(QFI=0x34)/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/("X" *20)
> +   p3 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer(QFI=0x33)/IP(src="192.168.1.1", dst="192.168.1.2")/UDP()/("X" *20)
> +   p4 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer(QFI=0x33)/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/("X" *20)
> +
> +subcase 16: MAC_IPV4_GTPU_EH_IPV4_UDP_TEID_L4SRC_L4DST
> +::::::::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid
> mask 0x00000001 / gtp_psc / ipv4 / udp src is 22 dst is 23 / end actions vf id 1 /
> end
> +
> +matched packets::
> +
> +   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer()/IP()/UDP(sport=22,
> dport=23)/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer()/IP()/UDP(sport=12,
> dport=13)/("X" *20)
> +   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/GTPPDUSessionContainer()/IP()/UDP(sport=22,
> dport=23)/("X" *20)
> +   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/GTPPDUSessionContainer()/IP()/UDP(sport=12,
> dport=13)/("X" *20)
> +
> +subcase 17: MAC_IPV4_GTPU_EH_IPV4_UDP_QFI_L4SRC_L4DST
> +:::::::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc qfi is 0x34 / ipv4
> / udp src is 22 dst is 23 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer(QFI=0x34)/IP()/UDP(sport=22, dport=23)/("X" *20)
> +
> +mismatched packets::
> +
> +   p4 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer(QFI=0x34)/IP()/UDP(sport=12, dport=13)/("X" *20)
> +   p4 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer(QFI=0x33)/IP()/UDP(sport=22, dport=23)/("X" *20)
> +   p4 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer(QFI=0x33)/IP()/UDP(sport=12, dport=13)/("X" *20)
> +
> +subcase 18: MAC_IPV4_GTPU_EH_IPV4_UDP_L3_l4
> +:::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / gtp_psc / ipv4 src is
> 192.168.1.1 dst is 192.168.1.2 / udp src is 22 dst is 23 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=22, dport=23)/("X"
> *20)
> +
> +mismatched packets::
> +
> +   p2 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=12, dport=23)/("X"
> *20)
> +   p3 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=22, dport=13)/("X"
> *20)
> +   p4 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=12, dport=13)/("X"
> *20)
> +   p5 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.11", dst="192.168.1.2")/UDP(sport=22,
> dport=23)/("X" *20)
> +   p6 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.1", dst="192.168.1.22")/UDP(sport=22,
> dport=23)/("X" *20)
> +   p7 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=22,
> dport=23)/("X" *20)
> +   p8 =
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/GTPPDUSessionCon
> tainer()/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=12,
> dport=13)/("X" *20)
> +
> +subcase 19: MAC_IPV4_GTPU_EH_IPV4_UDP_ALL
> +:::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid
> mask 0x00000001 / gtp_psc qfi is 0x34 / ipv4 src is 192.168.1.1 dst is 192.168.1.2
> / udp src is 22 dst is 23 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   p1 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1",
> dst="192.168.1.2")/udp(sport=22, dport=23)/("X" *20)
> +
> +mismatched packets::
> +
> +   p2 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1",
> dst="192.168.1.2")/udp(sport=22, dport=23)/("X" *20)
> +   p3 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.1",
> dst="192.168.1.2")/udp(sport=22, dport=23)/("X" *20)
> +   p4 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.11",
> dst="192.168.1.22")/udp(sport=22, dport=23)/("X" *20)
> +   p5 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.1",
> dst="192.168.1.2")/udp(sport=12, dport=13)/("X" *20)
> +   p6 = Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/GTPPDUSessionContainer(QFI=0x33)/IP(src="192.168.1.11",
> dst="192.168.1.22")/udp(sport=12, dport=13)/("X" *20)
> +
> +Test case: MAC_IPV4_GTPU_EH_IPV4_TCP
> +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> +
> +reconfig all case of 'Test case: MAC_IPV4_GTPU_EH_IPV4_UDP':
> +   rule and pkts:
> +      change inner 'udp' to 'tcp'
> +
> +subcase 1: MAC_IPV4_GTPU_EH_IPV4_TCP_TEID_with_mask
> +:::::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 2: MAC_IPV4_GTPU_EH_IPV4_TCP_TEID_without_mask
> +::::::::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 3: MAC_IPV4_GTPU_EH_IPV4_TCP_QFI
> +::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 4: MAC_IPV4_GTPU_EH_IPV4_TCP_L3DST
> +::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 5: MAC_IPV4_GTPU_EH_IPV4_TCP_L3SRC
> +::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 6: MAC_IPV4_GTPU_EH_IPV4_TCP_L3SRC_L3DST
> +::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 7: MAC_IPV4_GTPU_EH_IPV4_TCP_L3SRC_L4DST
> +::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 8: MAC_IPV4_GTPU_EH_IPV4_TCP_L3SRC_L4SRC
> +::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 9: MAC_IPV4_GTPU_EH_IPV4_TCP_L3DST_L4SRC
> +::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 10: MAC_IPV4_GTPU_EH_IPV4_TCP_L3DST_L4DST
> +:::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 11: MAC_IPV4_GTPU_EH_IPV4_TCP_L4DST
> +:::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 12: MAC_IPV4_GTPU_EH_IPV4_TCP_L4SRC
> +:::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 13: MAC_IPV4_GTPU_EH_IPV4_TCP_L4SRC_L4DST
> +:::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 14: MAC_IPV4_GTPU_EH_IPV4_TCP_TEID_L3SRC_L3DST
> +::::::::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 15: MAC_IPV4_GTPU_EH_IPV4_TCP_QFI_L3SRC_L3DST
> +:::::::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 16: MAC_IPV4_GTPU_EH_IPV4_TCP_TEID_L4SRC_L4DST
> +::::::::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 17: MAC_IPV4_GTPU_EH_IPV4_TCP_QFI_L4SRC_L4DST
> +:::::::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 18: MAC_IPV4_GTPU_EH_IPV4_TCP_L3_l4
> +:::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 19: MAC_IPV4_GTPU_EH_IPV4_TCP_ALL
> +:::::::::::::::::::::::::::::::::::::::::
> +
> +Test case: MAC_IPV4_GTPU_IPV4
> +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> +
> +basic pkts:
> +ipv4-nonfrag packet::
> +
> +   Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/("X" *20)
> +
> +ipv4-frag packet::
> +
> +    Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(frag=6)/("X"
> *20)
> +
> +subcase 1: MAC_IPV4_GTPU_IPV4_TEID_with_mask
> +::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid
> mask 0x00000001 / ipv4 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with GTP_U_Header(gtp_type=255,
> teid=0x12345678)
> +
> +   pkts_set2:send basic pkts with GTP_U_Header(gtp_type=255,
> teid=0x12345688)
> +
> +mismatched packets::
> +
> +   pkts_set3:send basic pkts with GTP_U_Header(gtp_type=255,
> teid=0x12345677)
> +
> +subcase 2: MAC_IPV4_GTPU_IPV4_TEID_without_mask
> +:::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / ipv4
> / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with GTP_U_Header(gtp_type=255,
> teid=0x12345678)
> +
> +mismatched packets::
> +
> +   pkts_set2:send basic pkts with GTP_U_Header(gtp_type=255,
> teid=0x12345688)
> +
> +   pkts_set3:send basic pkts with GTP_U_Header(gtp_type=255,
> teid=0x12345677)
> +
> +subcase 3: MAC_IPV4_GTPU_IPV4_L3DST
> +:::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 dst is 192.168.1.2 /
> end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l3dst, take 'ipv4-nonfrag' for example:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.2
> ")/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3dst:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.2
> 2")/("X" *20)
> +
> +subcase 4: MAC_IPV4_GTPU_IPV4_L3SRC
> +:::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 /
> end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l3src, take 'ipv4-nonfrag' for example:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> ")/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3src:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> 1")/("X" *20)
> +
> +subcase 4: MAC_IPV4_GTPU_IPV4_L3SRC_L3DST
> +:::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1
> dst is 192.168.1.2 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l3src l4dst, take 'ipv4-nonfrag' for
> example:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> " dst="192.168.1.2")/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3src l4dst:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> 1", dst="192.168.1.2")/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> ", dst="192.168.1.22")/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> 1", dst="192.168.1.22")/("X" *20)
> +
> +subcase 5: MAC_IPV4_GTPU_IPV4_ALL
> +:::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid
> mask 0x00000001 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / end actions vf id 1
> / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l3src l4dst, take 'ipv4-nonfrag' for
> example:
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/IP(src="192.168.1.1" dst="192.168.1.2")/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3src:
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/IP(src="192.168.1.11", dst="192.168.1.22")/("X" *20)
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/IP(src="192.168.1.11", dst="192.168.1.22")/("X" *20)
> +
> +Test case: MAC_IPV4_GTPU_IPV4_UDP
> +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> +
> +basic pkts::
> +
> +    Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP()/("X"
> *20)
> +
> +subcase 1: MAC_IPV4_GTPU_IPV4_UDP_TEID_with_mask
> +::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid
> mask 0x00000001 / ipv4 / udp / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with GTP_U_Header(gtp_type=255,
> teid=0x12345678)
> +
> +   pkts_set2:send basic pkts with GTP_U_Header(gtp_type=255,
> teid=0x12345688)
> +
> +mismatched packets::
> +
> +   pkts_set3:send basic pkts with GTP_U_Header(gtp_type=255,
> teid=0x12345677)
> +
> +subcase 2: MAC_IPV4_GTPU_IPV4_UDP_TEID_without_mask
> +:::::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 / ipv4
> / udp / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with GTP_U_Header(gtp_type=255,
> teid=0x12345678)
> +
> +mismatched packets::
> +
> +   pkts_set2:send basic pkts with GTP_U_Header(gtp_type=255,
> teid=0x12345688)
> +
> +   pkts_set3:send basic pkts with GTP_U_Header(gtp_type=255,
> teid=0x12345677)
> +
> +
> +subcase 3: MAC_IPV4_GTPU_IPV4_UDP_L3DST
> +:::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 dst is 192.168.1.2 /
> udp / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l3dst
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.2
> ")/UDP()/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3dst:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.2
> 2")/UDP()/("X" *20)
> +
> +subcase 4: MAC_IPV4_GTPU_IPV4_UDP_L3SRC
> +:::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 /
> udp / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l3src
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> ")/UDP()/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3src:
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> 1")/UDP()/("X" *20)
> +
> +subcase 5: MAC_IPV4_GTPU_IPV4_UDP_L3SRC_L3DST
> +:::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1
> dst is 192.168.1.2 / udp / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l3src l3dst
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> " dst="192.168.1.2")/UDP()/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3src l3dst
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> 1", dst="192.168.1.2")/UDP()/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> ", dst="192.168.1.22")/UDP()/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> 1", dst="192.168.1.22")/UDP()/("X" *20)
> +
> +subcase 6: MAC_IPV4_GTPU_IPV4_UDP_L3SRC_L4DST
> +:::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 /
> udp dst is 23 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l3src l4dst
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> ")/UDP(dport=23)/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3src l4dst
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> 1")/UDP(dport=23)/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> ")/UDP(dport=13)/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> 1")/UDP(dport=13)/("X" *20)
> +
> +subcase 7: MAC_IPV4_GTPU_IPV4_UDP_L3SRC_L4SRC
> +:::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1 /
> udp src is 22 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l3src l4src
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> ")/UDP(sport=22)/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3src l4src
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> 1")/UDP(sport=22)/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> ")/UDP(sport=12)/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> 1")/UDP(sport=12)/("X" *20)
> +
> +subcase 8: MAC_IPV4_GTPU_IPV4_UDP_L3DST_L4SRC
> +:::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 dst is 192.168.1.2 /
> udp src is 22 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l3dst l4src
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.2
> ")/UDP(sport=22)/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3dst l4src
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.1
> 2")/UDP(sport=22)/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.2
> ")/UDP(sport=12)/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.1
> 2")/UDP(sport=12)/("X" *20)
> +
> +subcase 9: MAC_IPV4_GTPU_IPV4_UDP_L3DST_L4DST
> +:::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 dst is 192.168.1.2 /
> udp dst is 23 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l3dst l4dst
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.2
> ")/UDP(dport=23)/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3dst l4dst
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.1
> 2")/UDP(dport=23)/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.2
> ")/UDP(dport=13)/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(dst="192.168.1.1
> 2")/UDP(dport=13)/("X" *20)
> +
> +subcase 10: MAC_IPV4_GTPU_IPV4_UDP_L4DST
> +::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 / udp dst is 23 / end
> actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l4dst
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(dport=23)
> /("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l4dst
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(dport=13)
> /("X" *20)
> +
> +subcase 11: MAC_IPV4_GTPU_IPV4_UDP_L4SRC
> +::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 / udp src is 22 / end
> actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l4src
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(sport=22)/
> ("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l4src
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(sport=12)/
> ("X" *20)
> +
> +subcase 12: MAC_IPV4_GTPU_IPV4_UDP_L4SRC_L4DST
> +::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 / udp src is 22 dst is
> 23 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l4src l4dst
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(sport=22,
> dport=23)/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l4src l4dst
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(sport=22,
> dport=13)/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(sport=12,
> dport=23)/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP()/UDP(sport=12,
> dport=13)/("X" *20)
> +
> +subcase 13: MAC_IPV4_GTPU_IPV4_UDP_TIED_L3SRC_L3DST
> +:::::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid
> mask 0x00000001 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp / end actions
> vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l3src l3dst
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/IP(src="192.168.1.1" dst="192.168.1.2")/UDP()/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3src l3dst
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/("X" *20)
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/IP(src="192.168.1.1", dst="192.168.1.2")/UDP()/("X" *20)
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/IP(src="192.168.1.11", dst="192.168.1.22")/UDP()/("X" *20)
> +
> +
> +subcase 14: MAC_IPV4_GTPU_IPV4_UDP_TEID_L4SRC_L4DST
> +:::::::::::::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid
> mask 0x00000001 / ipv4 / udp src is 22 dst is 23 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l4src l4dst
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/IP()/UDP(sport=22, dport=23)/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l4src l4dst
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/IP()/UDP(sport=12, dport=13)/("X" *20)
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/IP()/UDP(sport=22, dport=23)/("X" *20)
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/IP()/UDP(sport=12, dport=13)/("X" *20)
> +
> +
> +subcase 15: MAC_IPV4_GTPU_IPV4_UDP_L3_L4
> +::::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu / ipv4 src is 192.168.1.1
> dst is 192.168.1.2 / udp src is 22 dst is 23 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l3src l3dst l4src l4dst
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> ", dst="192.168.1.2")/UDP(sport=22, dport=23)/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3src l3dst l4src l4dst
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> 1", dst="192.168.1.22")/UDP(sport=22, dport=23)/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> ", dst="192.168.1.2")/UDP(sport=12, dport=13)/("X" *20)
> +
> Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header()/IP(src="192.168.1.1
> 1", dst="192.168.1.22")/UDP(sport=12, dport=13)/("X" *20)
> +
> +subcase 16: MAC_IPV4_GTPU_IPV4_UDP_ALL
> +::::::::::::::::::::::::::::::::::::::
> +rule::
> +
> +   flow create 0 ingress pattern eth / ipv4 / udp / gtpu teid is 0x12345678 teid
> mask 0x00000001 / ipv4 src is 192.168.1.1 dst is 192.168.1.2 / udp src is 22 dst is
> 23 / end actions vf id 1 / end
> +
> +matched packets::
> +
> +   pkts_set1:send basic pkts with inner l3src l3dst l4src l4dst
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=22,
> dport=23)/("X" *20)
> +
> +mismatched packets::
> +
> +   pkts_set2: send pkts_set1 with different inner l3src l3dst l4src l4dst
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=22,
> dport=23)/("X" *20)
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345678)/IP(src="192.168.1.1", dst="192.168.1.2")/UDP(sport=12,
> dport=13)/("X" *20)
> +      Ether(dst="00:11:22:33:44:55")/IP()/UDP()/GTP_U_Header(gtp_type=255,
> teid=0x12345677)/IP(src="192.168.1.11", dst="192.168.1.22")/UDP(sport=12,
> dport=13)/("X" *20)
> +
> +
> +Test case: MAC_IPV4_GTPU_IPV4_TCP
> +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> +
> +reconfig all case of 'Test case: MAC_IPV4_GTPU_IPV4_UDP':
> +   rule and pkts:
> +      change inner 'udp' to 'tcp'
> +
> +subcase 1: MAC_IPV4_GTPU_IPV4_TCP_TEID_with_mask
> +::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 2: MAC_IPV4_GTPU_IPV4_TCP_TEID_without_mask
> +:::::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 3: MAC_IPV4_GTPU_IPV4_TCP_L3DST
> +:::::::::::::::::::::::::::::::::::::::
> +
> +subcase 4: MAC_IPV4_GTPU_IPV4_TCP_L3SRC
> +:::::::::::::::::::::::::::::::::::::::
> +
> +subcase 5: MAC_IPV4_GTPU_IPV4_TCP_L3SRC_L3DST
> +:::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 6: MAC_IPV4_GTPU_IPV4_TCP_L3SRC_L4DST
> +:::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 7: MAC_IPV4_GTPU_IPV4_TCP_L3SRC_L4SRC
> +:::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 8: MAC_IPV4_GTPU_IPV4_TCP_L3DST_L4SRC
> +:::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 9: MAC_IPV4_GTPU_IPV4_TCP_L3DST_L4DST
> +:::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 10: MAC_IPV4_GTPU_IPV4_TCP_L4DST
> +::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 11: MAC_IPV4_GTPU_IPV4_TCP_L4SRC
> +::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 12: MAC_IPV4_GTPU_IPV4_TCP_L4SRC_L4DST
> +::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 13: MAC_IPV4_GTPU_IPV4_TCP_TIED_L3SRC_L3DST
> +:::::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 14: MAC_IPV4_GTPU_IPV4_TCP_TEID_L4SRC_L4DST
> +:::::::::::::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 15: MAC_IPV4_GTPU_IPV4_TCP_L3_L4
> +::::::::::::::::::::::::::::::::::::::::
> +
> +subcase 16: MAC_IPV4_GTPU_IPV4_TCP_ALL
> +::::::::::::::::::::::::::::::::::::::
> +
> +Pattern: outer ipv4 + inner ipv6
> +--------------------------------
> +
> +reconfig all the cases of "Pattern: outer ipv4 + inner ipv4"
> +
> +    rule:
> +        change inner ipv4 to ipv6
> +    packets:
> +        change the packet's inner L3 layer from IP to IPv6;
> +        change the ipv4 address to ipv6 address.
> +
> +Pattern: outer ipv6 + inner ipv4
> +--------------------------------
> +
> +reconfig all the cases of "Pattern: outer ipv4 + inner ipv4"
> +
> +    rule:
> +        change outer ipv4 to ipv6.
> +    packets:
> +        change the packet's outer L3 layer from IP to IPv6;
> +
> +Pattern: outer ipv6 + inner ipv6
> +--------------------------------
> +
> +reconfig all the cases of "Pattern: outer ipv4 + inner ipv4"
> +
> +    rule:
> +        change outer ipv4 to ipv6.
> +        change inner ipv4 to ipv6.
> +    packets:
> +        change the packet's outer L3 layer from IP to IPv6;
> +        change the packet's inner L3 layer from IP to IPv6;
> +        change the ipv4 address to ipv6 address.
> --
> 2.17.1


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

end of thread, other threads:[~2021-06-18  5:56 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-02 18:50 [dts] [PATCH V2 0/2] add dcf switch gtpu test case and test plan Zhimin Huang
2021-06-02 18:50 ` [dts] [PATCH V2 1/2] test_plans/dcf_switch_gtpu: add dcf_switch_filter_gtpu " Zhimin Huang
2021-06-10  6:54   ` Lin, Xueqin
2021-06-18  5:56   ` Tu, Lijuan
2021-06-02 18:50 ` [dts] [PATCH V2 2/2] tests/cvl_dcf_switch_filter_gtpu: add dcf_switch_filter_gtpu test case Zhimin Huang
2021-06-02 10:30   ` Huang, ZhiminX
2021-06-10  6:59   ` Lin, Xueqin

test suite reviews and discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://inbox.dpdk.org/dts/0 dts/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dts dts/ https://inbox.dpdk.org/dts \
		dts@dpdk.org
	public-inbox-index dts

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.dts


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git