diff --git a/test_plans/vf_offload_test_plan.rst b/test_plans/vf_offload_test_plan.rst
index 1c929371..daf9e7c0 100644
--- a/test_plans/vf_offload_test_plan.rst
+++ b/test_plans/vf_offload_test_plan.rst
@@ -1,13 +1,78 @@
 .. SPDX-License-Identifier: BSD-3-Clause
-   Copyright(c) 2015-2017 Intel Corporation
+   Copyright(c) 2015-2023 Intel Corporation
 
 ==========
 VF Offload
 ==========
 
+Description
+===========
 
-Prerequisites for checksum offload
-==================================
+The support of RX/TX L3/L4 checksum offload features by Poll Mode Drivers consists in:
+
+On the RX side:
+
+- Verify IPv4 checksum by hardware for received packets.
+- Verify UDP/TCP/SCTP checksum by hardware for received packets.
+- Verify tunneled outer IPv4 checksum by hardware for recieved packets.
+- Verify tunneled outer UDP checksum by hardware for recieved packets.
+
+On the TX side:
+
+- IPv4 checksum insertion by hardware/software in transmitted packets.
+- UDP/TCP/SCTP checksum insertion by hardware/software in transmitted packets (sctp length in 4 bytes).
+- Tunneled outer IPv4 checksum insertion by hardware/software in transmitted packets.
+- Tunneled outer UDP checksum insertion by hardware/software in transmitted packets.
+
+RX/TX side, the insertion of a L3/L4 or tunneled outer L3/L4 checksum by hardware can be enabled with the
+following command of the ``testpmd`` application and running in a dedicated
+tx checksum mode::
+
+    set fwd csum
+    csum set ip|tcp|udp|sctp|outer-ip|outer-udp hw|sw port_id
+
+The support of TX TSO features by Poll Mode Drivers consists in:
+
+On the TX side:
+
+- TCP/UDP segmentation.
+- Tunneled inner TCP/UDP segmentation.
+
+RX/TX side, the TSO can be enabled with the following command of the ``testpmd`` application and running in tx
+checksum mode with enabled checksum support::
+
+    set fwd csum
+    csum set ...
+    tso set <segment_length> <port_id>
+    tunnel_tso set <segment_length> <port_id>
+
+Please notice here that in DPDK TSO refers to both TCP Segmentation Offload (TSO)
+and UDP Fragmentation Offload (UFO). DPDK TSO is also different from Generic Segmentation
+Offload (GSO) for there is a GSO lib implemented elsewhere in DPDK. We will use TSO and UFO
+to descripe packets and test steps, but only TSO configurations on ``testpmd`` are involved.
+
+The transmission of packet is done with the ``start`` command of the ``testpmd``
+application that will receive packets and then transmit the packet out on all
+configured ports.
+
+Prerequisites
+=============
+
+Topology
+--------
+
+    dut_port_0 <---> tester_vm_port_0
+
+    dut_port_1 <---> tester_vm_port_1
+
+Software
+--------
+
+    - dpdk: http://dpdk.org/git/dpdk
+    - scapy: http://www.secdev.org/projects/scapy/
+
+Configuration and Setup
+-----------------------
 
 If using vfio the kernel must be >= 3.6+ and VT-d must be enabled in bios. When
 using vfio, use the following commands to load the vfio driver and bind it
@@ -15,32 +80,27 @@ to the device under test::
 
    modprobe vfio
    modprobe vfio-pci
-   usertools/dpdk-devbind.py --bind=vfio-pci device_bus_id
+   usertools/dpdk-devbind.py --bind=vfio-pci <device_bus_id>
 
 IP link set VF trust on and spoofchk off on DUT::
 
    ip link set $PF_INTF vf 0 trust on
    ip link set $PF_INTF vf 0 spoofchk off
 
-Assuming that ports ``0`` and ``1`` are connected to a traffic generator,
-enable hardware rx checksum offload with "--enable-rx-cksum",
-launch the ``testpmd`` with the following arguments:
+If running TSO, on tester, all offload feature should be disabled on tx port, and start rx port capture::
 
- if test IAVF, start up VF port::
-
-  ./build/app/dpdk-testpmd -cffffff -n 1 -- -i --burst=1 --txpt`=32 \
-  --txht=8 --txwt=0 --txfreet=0 --rxfreet=64 --mbcache=250 --portmask=0x5
-  --enable-rx-cksum
+  ifconfig <tx port> mtu 9000
+  ethtool -K <tx port> rx off tx off tso off gso off gro off lro off
+  ip l set <tx port> up
+  tcpdump -n -e -i <rx port> -s 0 -w /tmp/cap
 
- if test DCF, set VF port to dcf and start up::
+Based on the topology, launch the ``testpmd`` with the following arguments::
 
-   Enable kernel trust mode:
+  ./build/app/dpdk-testpmd -c <...> -n <...> -- -i <...> --enable-rx-cksum
 
-       ip link set $PF_INTF vf 0 trust on
+For DCF mode::
 
-   dpdk-testpmd -c 0x0f -n 4 -a 00:04.0,cap=dcf -a 00:05.0,cap=dcf -- -i --burst=1 --txpt=32 \
-   --txht=8 --txwt=0 --txfreet=0 --rxfreet=64 --mbcache=250 --portmask=0x5
-   --enable-rx-cksum
+  ./build/app/dpdk-testpmd -c <...> -n <...> -a <...>,cap=dcf -a <...>,cap=dcf -- -i <...> --enable-rx-cksum
 
 .. note::
 
@@ -50,621 +110,793 @@ Set the verbose level to 1 to display information for each received packet::
 
   testpmd> set verbose 1
 
-Setup the ``csum`` forwarding mode::
+Due to DPDK 236bc417e2da(app/testpmd: fix MAC header in checksum forward engine) changes the checksum 
+functions adds switches to control whether to exchange MAC address.
+Currently, our test scripts are based on not exchanging MAC addresses, mac-swap needs to be disabled:
 
-  testpmd> set fwd csum
-  Set csum packet forwarding mode
+  testpmd> csum mac-swap off 0
 
-Start the packet forwarding::
+Common test steps
+=================
+
+This test uses ``Scapy`` to send out packages. The dut forwards packages with checksum offload enabled on
+rx/tx port and TSO enabled on tx port. After packages send out by tx port, the tester receives packages
+and verify them along with the verbose and stats.
+
+1. launch test-pmd to enable RX Checksum offload and for some NIC it enables a general set of RX Offloads::
+
+    ./dpdk/x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c <...> -n <...> -a <...> -- -i --enable-rx-cksum
+
+2. config testpmd::
+
+    set csum fwd mode and stop all port::
+
+        testpmd> set fwd csum
+        testpmd> port stop all
+
+    Modify the following commands to configure checksum offload according to the test scenario of each case:
+
+        testpmd> csum set ip|tcp|udp|sctp|outer-ip|outer-udp hw|sw port_id
+
+    start all ports and fwd:
+
+        testpmd> port start all
+        testpmd> set verbose 1
+        testpmd> start
+
+3. start to capture packets on tester::
+
+    tester: tcpdump -i <iface> -Q in -e ether src 52:00:00:00:00:00 -w /tmp/ens10.pcap
+
+4. send packets with scapy::
+
+    Configure the packet generator to send multiple combinations of inner and outer packet parts
+    according to the test scenario of each case, refer to the following table:
+
++------------------+---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+| Packet Types     | Packet Names              |                                                    Packet organizations                                                      |
++==================+===========================+==============================================================================================================================+
+|                  | IP/UDP                    | IP(src="10.0.0.1") / UDP(sport=29999, dport=30000) / Raw(randstring(PAYLOAD_SIZE))                                           |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | IP/TCP                    | IP(src="10.0.0.1") / TCP(sport=29999, dport=30000) / Raw(randstring(PAYLOAD_SIZE))                                           |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | IP/SCTP                   | IP(src="10.0.0.1") / SCTP(sport=29999, dport=30000, chksum=0x0000) / Raw(randstring(PAYLOAD_SIZE))                           |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | IPv6/UDP                  | IPv6(src="::1") / UDP(sport=29999, dport=30000) / Raw(randstring(PAYLOAD_SIZE))                                              |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | IPv6/TCP                  | IPv6(src="::1") / TCP(sport=29999, dport=30000) / Raw(randstring(PAYLOAD_SIZE))                                              |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+| Inner Parts      | IPv6/SCTP                 | IPv6(src="::1") / SCTP(sport=29999, dport=30000, chksum=0x0000) / Raw(randstring(PAYLOAD_SIZE))                              |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | VLAN/IP/UDP               | Dot1Q(vlan=100) / IP(src="10.0.0.1") / UDP(sport=29999, dport=30000) / Raw(randstring(PAYLOAD_SIZE))                         |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | VLAN/IP/TCP               | Dot1Q(vlan=100) / IP(src="10.0.0.1") / TCP(sport=29999, dport=30000) / Raw(randstring(PAYLOAD_SIZE))                         |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | VLAN/IP/SCTP              | Dot1Q(vlan=100) / IP(src="10.0.0.1") / SCTP(sport=29999, dport=30000, chksum=0x0000) / Raw(randstring(PAYLOAD_SIZE))         |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | VLAN/IPv6/UDP             | Dot1Q(vlan=100) / IPv6(src="::1") / UDP(sport=29999, dport=30000) / Raw(randstring(PAYLOAD_SIZE))                            |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | VLAN/IPv6/TCP             | Dot1Q(vlan=100) / IPv6(src="::1") / TCP(sport=29999, dport=30000) / Raw(randstring(PAYLOAD_SIZE))                            |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | VLAN/IPv6/SCTP            | Dot1Q(vlan=100) / IPv6(src="::1") / SCTP(sport=29999, dport=30000, chksum=0x0000) / Raw(randstring(PAYLOAD_SIZE))            |
++------------------+---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IP/VXLAN                   | IP(src="10.0.0.1") / UDP(dport=4789) / VXLAN() / Ether()                                                                     |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IPv6/VXLAN                 | IPv6() / UDP(dport=4789) / VXLAN() / Ether()                                                                                 |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IP/VXLAN-GPE               | IP(src="10.0.0.1") / UDP(sport=4790, dport=4790) / VXLAN()                                                                   |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IPv6/VXLAN-GPE             | IPv6() / UDP(sport=4790, dport=4790) / VXLAN()                                                                               |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IP/VXLAN-GPE/Ether         | IP(src="10.0.0.1") / UDP(sport=4790, dport=4790) / VXLAN() / Ether()                                                         |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IPv6/VXLAN-GPE/Ether       | IPv6() / UDP(sport=4790, dport=4790) / VXLAN() / Ether()                                                                     |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IP/GRE                     | IP(src="10.0.0.1", proto=47) / GRE()                                                                                         |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IPv6/GRE                   | IPv6(nh=47) / GRE()                                                                                                          |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IP/GRE/Ether               | IP(src="10.0.0.1", proto=47) / GRE() / Ether()                                                                               |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IPv6/GRE/Ether             | IPv6(nh=47) / GRE() / Ether()                                                                                                |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IP/NVGRE                   | IP(src="10.0.0.1", proto=47) / GRE(key_present=1, proto=0x6558, key=0x00000100) / Ether()                                    |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IPv6/NVGRE                 | IPv6(nh=47) / GRE(key_present=1, proto=0x6558, key=0x00000100) / Ether()                                                     |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IP/GTPU                    | IP(src="10.0.0.1") / UDP(dport=2152) / GTP_U_Header(gtp_type=255, teid=0x123456)                                             |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IPv6/GTPU                  | IPv6() / UDP(dport=2152) / GTP_U_Header(gtp_type=255, teid=0x123456)                                                         |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IP/GENEVE                  | IP(src="10.0.0.1") / UDP(dport=6081, sport=29999) / GENEVE()                                                                 |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IPv6/GENEVE                | IPv6() / UDP(dport=6081, sport=29999) / GENEVE()                                                                             |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |IP                         | IP(src="10.0.0.1")                                                                                                           |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+| Outer Parts      |IPv6                       | IPv6()                                                                                                                       |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IP/VXLAN              | Dot1Q(vlan=100) / IP(src="10.0.0.1") / UDP(dport=4789) / VXLAN() / Ether()                                                   |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IPv6/VXLAN            | Dot1Q(vlan=100) / IPv6() / UDP(dport=4789) / VXLAN() / Ether()                                                               |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IP/VXLAN-GPE          | Dot1Q(vlan=100) / IP(src="10.0.0.1") / UDP(sport=4790, dport=4790) / VXLAN()                                                 |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IPv6/VXLAN-GPE        | Dot1Q(vlan=100) / IPv6() / UDP(sport=4790, dport=4790) / VXLAN()                                                             |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IP/VXLAN-GPE/Ether    | Dot1Q(vlan=100) / IP(src="10.0.0.1") / UDP(sport=4790, dport=4790) / VXLAN() / Ether()                                       |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IPv6/VXLAN-GPE/Ether  | Dot1Q(vlan=100) / IPv6() / UDP(sport=4790, dport=4790) / VXLAN() / Ether()                                                   |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IP/GRE                | Dot1Q(vlan=100) / IP(src="10.0.0.1", proto=47) / GRE()                                                                       |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IPv6/GRE              | Dot1Q(vlan=100) / IPv6(nh=47) / GRE()                                                                                        |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IP/GRE/Ether          | Dot1Q(vlan=100) / IP(src="10.0.0.1", proto=47) / GRE() / Ether()                                                             |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IPv6/GRE/Ether        | Dot1Q(vlan=100) / IPv6(nh=47) / GRE() / Ether()                                                                              |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IP/NVGRE              | Dot1Q(vlan=100) / IP(src="10.0.0.1", proto=47) / GRE(key_present=1, proto=0x6558, key=0x00000100) / Ether()                  |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IPv6/NVGRE            | Dot1Q(vlan=100) / IPv6(nh=47) / GRE(key_present=1, proto=0x6558, key=0x00000100) / Ether()                                   |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IP/GTPU               | Dot1Q(vlan=100) / IP(src="10.0.0.1") / UDP(dport=2152) / GTP_U_Header(gtp_type=255, teid=0x123456)                           |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IPv6/GTPU             | Dot1Q(vlan=100) / IPv6() / UDP(dport=2152) / GTP_U_Header(gtp_type=255, teid=0x123456)                                       |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IP/GENEVE             | Dot1Q(vlan=100) / IP(src="10.0.0.1") / UDP(dport=6081, sport=29999) / GENEVE()                                               |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IPv6/GENEVE           | Dot1Q(vlan=100) / IPv6() / UDP(dport=6081, sport=29999) / GENEVE()                                                           |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IP                    | Dot1Q(vlan=100) / IP(src="10.0.0.1")                                                                                         |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  |VLAN/IPv6                  | Dot1Q(vlan=100) / IPv6()                                                                                                     |
++------------------+---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+
++------------------+------------------+----------------------------+
+| Scenarios        | Packet Types     | Packet Names               |
++==================+==================+============================+
+|                  |                  | IP/UDP                     |
+|                  |                  +----------------------------+
+|                  |                  | IP/TCP                     |
+|                  |                  +----------------------------+
+| CSUM NON-TUNNEL  | Inner parts      | IP/SCTP                    |
+| PACKETS          |                  +----------------------------+
+|                  |                  | IPv6/UDP                   |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/TCP                   |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/SCTP                  |
++------------------+------------------+----------------------------+
+|                  |                  | IP/VXLAN                   |
+|                  | Outer parts      +----------------------------+
+|                  |                  | IPv6/VXLAN                 |
+|                  +------------------+----------------------------+
+| CSUM TUNNEL      |                  | IP/UDP                     |
+| PACKETS          |                  +----------------------------+
+| OF VXLAN         |                  | IP/TCP                     |
+|                  |                  +----------------------------+
+|                  | Inner parts      | IP/SCTP                    |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/UDP                   |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/TCP                   |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/SCTP                  |
++------------------+------------------+----------------------------+
+|                  |                  | IP/VXLAN                   |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/VXLAN                 |
+|                  |                  +----------------------------+
+|                  |                  | IP/VXLAN-GPE               |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/VXLAN-GPE             |
+|                  |                  +----------------------------+
+|                  |                  | IP/VXLAN-GPE/Ether         |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/VXLAN-GPE/Ether       |
+|                  |                  +----------------------------+
+|                  |                  | IP/GRE                     |
+|                  |                  +----------------------------+
+| CSUM TUNNEL      | Outer parts      | IPv6/GRE                   |
+| PACKETS          |                  +----------------------------+
+|                  |                  | IP/GRE/Ether               |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/GRE/Ether             |
+|                  |                  +----------------------------+
+|                  |                  | IP/NVGRE                   |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/NVGRE                 |
+|                  |                  +----------------------------+
+|                  |                  | IP/GTPU                    |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/GTPU                  |
+|                  +------------------+----------------------------+
+|                  |                  | IP/UDP                     |
+|                  |                  +----------------------------+
+|                  |                  | IP/TCP                     |
+|                  |                  +----------------------------+
+|                  | Inner parts      | IP/SCTP                    |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/UDP                   |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/TCP                   |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/SCTP                  |
++------------------+------------------+----------------------------+
+|                  |                  | VLAN/IP/UDP                |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IP/TCP                |
+|                  |                  +----------------------------+
+| CSUM NON-TUNNEL  | Inner parts      | VLAN/IP/SCTP               |
+| VLAN PACKETS     |                  +----------------------------+
+|                  |                  | VLAN/IPv6/UDP              |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/TCP              |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/SCTP             |
++------------------+------------------+----------------------------+
+|                  |                  | VLAN/IP/VXLAN              |
+|                  | Outer parts      +----------------------------+
+|                  |                  | VLAN/IPv6/VXLAN            |
+|                  +------------------+----------------------------+
+| CSUM TUNNEL      |                  | VLAN/IP/UDP                |
+| VLAN PACKETS     |                  +----------------------------+
+| OF VXLAN         |                  | VLAN/IP/TCP                |
+|                  |                  +----------------------------+
+|                  | Inner parts      | VLAN/IP/SCTP               |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/UDP              |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/TCP              |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/SCTP             |
++------------------+------------------+----------------------------+
+|                  |                  | VLAN/IP/VXLAN              |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/VXLAN            |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IP/VXLAN-GPE          |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/VXLAN-GPE        |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IP/VXLAN-GPE/Ether    |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/VXLAN-GPE/Ether  |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IP/GRE                |
+|                  |                  +----------------------------+
+| CSUM TUNNEL      | Outer parts      | VLAN/IPv6/GRE              |
+| VLAN PACKETS     |                  +----------------------------+
+|                  |                  | VLAN/IP/GRE/Ether          |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/GRE/Ether        |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IP/NVGRE              |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/NVGRE            |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IP/GTPU               |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/GTPU             |
+|                  +------------------+----------------------------+
+|                  |                  | VLAN/IP/UDP                |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IP/TCP                |
+|                  |                  +----------------------------+
+|                  | Inner parts      | VLAN/IP/SCTP               |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/UDP              |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/TCP              |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/SCTP             |
++------------------+------------------+----------------------------+
+| TSO NON-TUNNEL   |                  | IP/TCP                     |
+| PACKETS          | Inner parts      +----------------------------+
+|                  |                  | IPv6/TCP                   |
++------------------+------------------+----------------------------+
+|                  |                  | IP/VXLAN-GPE               |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/VXLAN-GPE             |
+|                  |                  +----------------------------+
+|                  |                  | IP/VXLAN-GPE/Ether         |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/VXLAN-GPE/Ether       |
+|                  |                  +----------------------------+
+|                  |                  | IP/GRE                     |
+|                  |                  +----------------------------+
+| TSO TUNNEL       | Outer parts      | IPv6/GRE                   |
+| PACKETS          |                  +----------------------------+
+|                  |                  | IP/GRE/Ether               |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/GRE/Ether             |
+|                  |                  +----------------------------+
+|                  |                  | IP/NVGRE                   |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/NVGRE                 |
+|                  |                  +----------------------------+
+|                  |                  | IP/GTPU                    |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/GTPU                  |
+|                  +------------------+----------------------------+
+|                  |                  | IP/TCP                     |
+|                  | Inner parts      +----------------------------+
+|                  |                  | IPv6/TCP                   |
++------------------+------------------+----------------------------+
+| UFO NON-TUNNEL   |                  | IP/UDP                     |
+| PACKETS          | Inner parts      +----------------------------+
+|                  |                  | IPv6/UDP                   |
++------------------+------------------+----------------------------+
+|                  |                  | IP/VXLAN-GPE               |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/VXLAN-GPE             |
+|                  |                  +----------------------------+
+|                  |                  | IP/VXLAN-GPE/Ether         |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/VXLAN-GPE/Ether       |
+|                  |                  +----------------------------+
+|                  |                  | IP/GRE                     |
+|                  |                  +----------------------------+
+| UFO TUNNEL       | Outer parts      | IPv6/GRE                   |
+| PACKETS          |                  +----------------------------+
+|                  |                  | IP/GRE/Ether               |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/GRE/Ether             |
+|                  |                  +----------------------------+
+|                  |                  | IP/NVGRE                   |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/NVGRE                 |
+|                  |                  +----------------------------+
+|                  |                  | IP/GTPU                    |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/GTPU                  |
+|                  +------------------+----------------------------+
+|                  |                  | IP/UDP                     |
+|                  | Inner parts      +----------------------------+
+|                  |                  | IPv6/UDP                   |
++------------------+------------------+----------------------------+
+
+5. stop capture packets and then stop fwd::
+
+    tester:     pkill tcpdump
+    dut:        testpmd> stop
+
+6. check rx and tx results::
+    
+    Check if ``ol_flag`` contains these fields based on the checksum values of L3 and L4 in the sent packets, refer to the following table.
+
++--------------+---------------------------------+--------------------------+
+| packet type  |         checksum value          |      check ol_flag       |
++==============+=================================+==========================+
+| Inner        | IPv4 (bad checksum)             | `RX_IP_CKSUM_BAD`        |
+|              +---------------------------------+--------------------------+
+|              | IPv4 (good checksum)            | `RX_IP_CKSUM GOOD`       |
+|              +---------------------------------+--------------------------+
+|              | TCP / UDP / SCTP (bad checksum) | `RX_L4_CKSUM_BAD`        |
+|              +---------------------------------+--------------------------+
+|              | TCP / UDP / SCTP (bad checksum) | `RX_L4_CKSUM_GOOD`       |
++--------------+---------------------------------+--------------------------+
+| Outer        | IPv4 (bad checksum)             | `RX_OUTER_IP_CKSUM_BAD`  |
+|              +---------------------------------+--------------------------+
+|              | IPv4 (good checksum)            | `RX_OUTER_IP_CKSUM GOOD` |
+|              +---------------------------------+--------------------------+
+|              | UDP (bad checksum)              | `RX_OUTER_L4_CKSUM_BAD`  |
+|              +---------------------------------+--------------------------+
+|              | UDP (good checksum)             | `RX_OUTER_L4_CKSUM_GOOD` |
++--------------+---------------------------------+--------------------------+
+
+
+    Check rx and tx statistics according to the checksum values of L3 and L4 in the sent packets.
+
++------------------+-------------------------------------------------------------------+
+|      entry       |                            checkpoint                             |
++==================+===================================================================+
+| RX-packets       | `RX-packets` =  Num of sent packets                               |
++------------------+-------------------------------------------------------------------+
+| RX-total         | `RX-total` = Num of sent packets                                  |
++------------------+-------------------------------------------------------------------+
+| Bad-ipcsum       | `Bad-ipcsum` = Sum of bad inner IP checksum in sent packets       |
++------------------+-------------------------------------------------------------------+
+| Bad-l4csum       | `Bad-l4csum` = Sum of bad inner L4 checksum in sent packets       |
++------------------+-------------------------------------------------------------------+
+| Bad-outer-ipcsum | `Bad-outer-ipcsum` = Sum of bad outer IP checksum in sent packets |
++------------------+-------------------------------------------------------------------+
+| Bad-outer-l4csum | `Bad-outer-l4csum` = Sum of bad outer L4 checksum in sent packets |
++------------------+-------------------------------------------------------------------+
+| TX-packets       | `TX-packets` =  `RX-packets`   (exclude tso cases)                |
++------------------+-------------------------------------------------------------------+
+| TX-total         | `TX-total` =  `RX-total`       (exclude tso cases)                |
++------------------+-------------------------------------------------------------------+
+
+    Read pcap files with scapy and check if configured checksum values to insert of tx_packets are all correct::
+
+        >>> tx_pkts = rdpcap("/tmp/ens10.pcap") # tx_packets is of list of all tx pkts
+        >>> tx_pkts[0].show2() # will print all info about the first packet, compare the checksum with the ref checksum.
+
+1. For TSO cases, we verify if the segmented payload matches the send payload::
+        
+        >>> tx_pkts[0].load == send_pkt.load[ : SEG_LENGTH ]
+        >>> tx_pkts[1].load == send_pkt.load[ SEG_LENGTH : 2*SEG_LENGTH ]
+        >>> ...
+
+Test case 1: HW IP non-tunneling
+================================
+
+This test is used to test non-tunneling packets and will enable hw ip checksum offload.
+Configure the TX HW Offload::
+
+    csum set ip hw 1
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum,
+each packet for multiple times, 10 times usually::
+
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
+
+
+Test case 2: HW UDP non-tunneling
+=================================
+
+This test is used to test non-tunneling packets and will enable hw udp checksum offload.
+Configure the TX HW Offload::
+
+    csum set udp hw 1
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum,
+each packet for multiple times, 10 times usually::
+
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
+
+Check for the correct checksum insertion at the correct place.
+
+
+Test case 3: HW TCP non-tunneling
+=================================
+
+This test is used to test non-tunneling packets and will enable hw tcp checksum offload.
+Configure the TX HW Offload::
+
+    csum set tcp hw 1
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum,
+each packet for multiple times, 10 times usually::
+
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
+
+Check for the correct checksum insertion at the correct place.
+
+
+Test case 4: HW SCTP non-tunneling
+==================================
 
-  testpmd> start
-    csum packet forwarding - CRC stripping disabled - packets/burst=32
-    nb forwarding cores=1 - nb forwarding ports=10
-    RX queues=1 - RX desc=128 - RX free threshold=64
-    RX threshold registers: pthresh=8 hthresh=8 wthresh=4
-    TX queues=1 - TX desc=512 - TX free threshold=0
-    TX threshold registers: pthresh=32 hthresh=8 wthresh=8
+This test is used to test non-tunneling packets and will enable hw sctp checksum offload.
+Configure the TX HW Offload::
 
-Verify that how many packets found with Bad-ipcsum or Bad-l4csum::
+    csum set sctp hw 1
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum,
+each packet for multiple times, 10 times usually::
 
-  testpmd> stop
-  ---------------------- Forward statistics for port 0  ----------------------
-  RX-packets: 0              RX-dropped: 0             RX-total: 0
-  Bad-ipcsum: 0              Bad-l4csum: 0
-  TX-packets: 0              TX-dropped: 0             TX-total: 0
-  ----------------------------------------------------------------------------
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
 
+Check for the correct checksum insertion at the correct place.
 
-Test Case: HW checksum offload check
-====================================
-Start testpmd and enable checksum offload on rx port.
 
-Setup the ``csum`` forwarding mode::
+Test case 5: HW IP + L4 non-tunneling (w/o VLAN)
+================================================
 
-  testpmd> set fwd csum
-  Set csum packet forwarding mode
+This test is used to test non-tunneling packets and will enable IP and all L4 hw checksum offload.
+Configure the TX HW Offload::
 
-Enable the IPv4/UDP/TCP/SCTP HW checksum offload on port 0::
+    csum set ip hw 1
+    csum set udp hw 1
+    csum set tcp hw 1
+    csum set sctp hw 1
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum,
+each packet for multiple times, 10 times usually::
 
-  testpmd> port stop all
-  testpmd> csum set ip hw 0
-  testpmd> csum set tcp hw 0
-  testpmd> csum set udp hw 0
-  testpmd> csum set sctp hw 0
-  testpmd> port start all
-  testpmd> set promisc 0 
-  
-  Due to DPDK 236bc417e2da(app/testpmd: fix MAC header in checksum forward engine) changes the checksum 
-  functions adds switches to control whether to exchange MAC address.
-  Currently, our test scripts are based on not exchanging MAC addresses, mac-swap needs to be disabled:
-  testpmd> csum mac-swap off 0
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
 
-  testpmd> start
-    csum packet forwarding - CRC stripping disabled - packets/burst=32
-    nb forwarding cores=1 - nb forwarding ports=10
-    RX queues=1 - RX desc=128 - RX free threshold=64
-    RX threshold registers: pthresh=8 hthresh=8 wthresh=4
-    TX queues=1 - TX desc=512 - TX free threshold=0
-    TX threshold registers: pthresh=32 hthresh=8 wthresh=8
-
-Configure the traffic generator to send the multiple packets for the following
-combination:
-
-  +----------------+----------------------------------------+
-  | packet type    | packet organization                    |
-  +================+========================================+
-  |                | Ether / IPv4 / UDP / payload           |
-  |                +----------------------------------------+
-  |                | Ether / IPv4 / TCP / payload           |
-  |                +----------------------------------------+
-  | packets        | Ether / IPv4 / SCTP / payload          |
-  | for checksum   +----------------------------------------+
-  | offload test   | Ether / IPv6 / UDP / payload           |
-  |                +----------------------------------------+
-  |                | Ether / IPv6 / TCP / payload           |
-  +----------------+----------------------------------------+
-
-Send packets with incorrect checksum,
-verify dpdk can rx it and report the checksum error,
-verify that the same number of packet are correctly received on the traffic
-generator side. And IPv4 checksum, TCP checksum, UDP checksum, SCTP checksum need
-be validated as pass by the tester.
-
-The IPv4 source address will not be changed by testpmd.
-
-
-Test Case: HW tunneling checksum offload check
-==============================================
-In DPDK 22.11 release, Intel® Ethernet 800 Series NIC with ICE supports HW
-checksum offload for tunneling packets for checking both inner and outer
-checksum. For the packets involved in this case, a ICE COMMON DDP Package
-is required.
-
-Start testpmd and enable checksum offload on rx port.
-
-Setup the ``csum`` forwarding mode::
-
-  testpmd> set fwd csum
-  Set csum packet forwarding mode
-
-Enable the IPv4/UDP/TCP/SCTP HW checksum offload on port 0::
-
-  testpmd> port stop all
-  testpmd> csum set ip hw 0
-  testpmd> csum set tcp hw 0
-  testpmd> csum set udp hw 0
-  testpmd> csum set sctp hw 0
-  testpmd> csum set outer-ip hw 0
-  testpmd> csum set outer-udp hw 0
-  testpmd> csum parse-tunnel on 0
-  testpmd> port start all
-  testpmd> set promisc 0 on
-  testpmd> start
-    csum packet forwarding - CRC stripping disabled - packets/burst=32
-    nb forwarding cores=1 - nb forwarding ports=10
-    RX queues=1 - RX desc=128 - RX free threshold=64
-    RX threshold registers: pthresh=8 hthresh=8 wthresh=4
-    TX queues=1 - TX desc=512 - TX free threshold=0
-    TX threshold registers: pthresh=32 hthresh=8 wthresh=8
-
-Configure the traffic generator to send the multiple packets for the following
-combination with inner package of:
-
-  +----------------+----------------------------------------+
-  | packet type    | packet organization                    |
-  +================+========================================+
-  |                | IPv4 / UDP / payload                   |
-  |                +----------------------------------------+
-  |                | IPv4 / TCP / payload                   |
-  |                +----------------------------------------+
-  | inner packets  | IPv4 / SCTP / payload                  |
-  | for checksum   +----------------------------------------+
-  | offload test   | IPv6 / UDP / payload                   |
-  |                +----------------------------------------+
-  |                | IPv6 / TCP / payload                   |
-  |                +----------------------------------------+
-  |                | IPv6 / SCTP / payload                  |
-  +----------------+----------------------------------------+
-
-And outer or tunneling package of :
-
-  +----------------+----------------------------------------+
-  | packet type    | packet organization                    |
-  +================+========================================+
-  |                | Ether / IPv4 / UDP / VXLAN / Ether     |
-  |                +----------------------------------------+
-  |                | Ether / IPv6 / UDP / VXLAN / Ether     |
-  |                +----------------------------------------+
-  |                | Ether / IPv4 / GRE                     |
-  | outer and      +----------------------------------------+
-  | tunneling      | Ether / IPv4 / GRE / Ether             |
-  | packets        +----------------------------------------+
-  | for checksum   | Ether / IPv6 / GRE                     |
-  | offload test   +----------------------------------------+
-  |                | Ether / IPv6 / GRE / Ether             |
-  |                +----------------------------------------+
-  |                | Ether / IPv4 / NVGRE                   |
-  |                +----------------------------------------+
-  |                | Ether / IPv4 / NVGRE / Ether           |
-  |                +----------------------------------------+
-  |                | Ether / IPv6 / NVGRE                   |
-  |                +----------------------------------------+
-  |                | Ether / IPv6 / NVGRE / Ether           |
-  |                +----------------------------------------+
-  |                | Ether / IPv4 / UDP / GTPU              |
-  |                +----------------------------------------+
-  |                | Ether / IPv6 / UDP / GTPU              |
-  +----------------+----------------------------------------+
-  
-Notice that VxLAN needs DCF to configure, so testing of VxLAN may need to perform
-on DCF.
-
-Send packets with incorrect checksum on outer IPv4, outer UDP (if exists), inner
-IP, inner L4, verify dpdk can rx it and report the checksum error,
-verify that the same number of packet are correctly received on the traffic
-generator side. And IPv4 checksum, TCP checksum, UDP checksum, SCTP checksum need
-be validated as pass by the tester.
-
-The IPv4 source address will not be changed by testpmd.
-
-
-Test Case: SW checksum offload check
-====================================
-
-Enable SW checksum offload, send same packet with incorrect checksum
-and verify checksum is valid.
-
-Setup the ``csum`` forwarding mode::
-
-  testpmd> set fwd csum
-  Set csum packet forwarding mode
-
-Enable the IPv4/UDP/TCP/SCTP SW checksum offload on port 0::
-
-  testpmd> port stop all
-  testpmd> csum set ip sw 0
-  testpmd> csum set tcp sw 0
-  testpmd> csum set udp sw 0
-  testpmd> csum set sctp sw 0
-  testpmd> port start all
-  testpmd> set promisc 0 on
-
-  Due to DPDK 236bc417e2da(app/testpmd: fix MAC header in checksum forward engine) changes the checksum 
-  functions adds switches to control whether to exchange MAC address.
-  Currently, our test scripts are based on not exchanging MAC addresses, mac-swap needs to be disabled:
-  testpmd> csum mac-swap off 0
+Check for the correct checksum insertion at the correct place.
 
-  testpmd> start
-    csum packet forwarding - CRC stripping disabled - packets/burst=32
-    nb forwarding cores=1 - nb forwarding ports=10
-    RX queues=1 - RX desc=128 - RX free threshold=64
-    RX threshold registers: pthresh=8 hthresh=8 wthresh=4
-    TX queues=1 - TX desc=512 - TX free threshold=0
-    TX threshold registers: pthresh=32 hthresh=8 wthresh=8
-
-Configure the traffic generator to send the multiple packets for the following
-combination:
-
-  +----------------+----------------------------------------+
-  | packet type    | packet organization                    |
-  +================+========================================+
-  |                | Ether / IPv4 / UDP / payload           |
-  |                +----------------------------------------+
-  | packets        | Ether / IPv4 / TCP / payload           |
-  | for checksum   +----------------------------------------+
-  | offload test   | Ether / IPv6 / UDP / payload           |
-  |                +----------------------------------------+
-  |                | Ether / IPv6 / TCP / payload           |
-  +----------------+----------------------------------------+
-
-Send packets with incorrect checksum,
-verify dpdk can rx it and report the checksum error,
-verify that the same number of packet are correctly received on the traffic
-generator side. And IPv4 checksum, TCP checksum, UDP checksum need
-be validated as pass by the tester.
-
-The first byte of source IPv4 address will be increased by testpmd. The checksum
-is indeed recalculated by software algorithms.
-
-
-Test Case: HW checksum offload check with vlan
-==============================================
-Start testpmd and enable checksum offload on rx port. Based on test steps of
-HW checksum offload check, configure the traffic generator to send the multiple
-packets for the following combination:
-
-  +----------------+----------------------------------------+
-  | packet type    | packet organization                    |
-  +================+========================================+
-  |                | Ether / VLAN / IPv4 / UDP / payload    |
-  |                +----------------------------------------+
-  |                | Ether / VLAN / IPv4 / TCP / payload    |
-  |                +----------------------------------------+
-  | packets        | Ether / VLAN / IPv4 / SCTP / payload   |
-  | for checksum   +----------------------------------------+
-  | offload test   | Ether / VLAN / IPv6 / UDP / payload    |
-  |                +----------------------------------------+
-  |                | Ether / VLAN / IPv6 / TCP / payload    |
-  +----------------+----------------------------------------+
-
-
-Test Case: HW tunneling checksum offload check with vlan
-========================================================
-Based on test steps of HW tunneling checksum offload check, configure the
-traffic generator to send the multiple packets combination with outer or
-tunneling package of:
-
-  +----------------+--------------------------------------------+
-  | packet type    | packet organization                        |
-  +================+============================================+
-  |                | Ether / VLAN / IPv4 / UDP / VXLAN / Ether  |
-  |                +--------------------------------------------+
-  |                | Ether / VLAN / IPv6 / UDP / VXLAN / Ether  |
-  |                +--------------------------------------------+
-  |                | Ether / VLAN / IPv4 / GRE                  |
-  | outer and      +--------------------------------------------+
-  | tunneling      | Ether / VLAN / IPv4 / GRE / Ether          |
-  | packets        +--------------------------------------------+
-  | for checksum   | Ether / VLAN / IPv6 / GRE                  |
-  | offload test   +--------------------------------------------+
-  |                | Ether / VLAN / IPv6 / GRE / Ether          |
-  |                +--------------------------------------------+
-  |                | Ether / VLAN / IPv4 / NVGRE                |
-  |                +--------------------------------------------+
-  |                | Ether / VLAN / IPv4 / NVGRE / Ether        |
-  |                +--------------------------------------------+
-  |                | Ether / VLAN / IPv6 / NVGRE                |
-  |                +--------------------------------------------+
-  |                | Ether / VLAN / IPv6 / NVGRE / Ether        |
-  |                +--------------------------------------------+
-  |                | Ether / VLAN / IPv4 / UDP / GTPU           |
-  |                +--------------------------------------------+
-  |                | Ether / VLAN / IPv6 / UDP / GTPU           |
-  +----------------+--------------------------------------------+
-
-
-Test Case: HW checksum offload check on scalar path
-===================================================
-These set of cases based on existing cases are designed for better case managment for
-regression test.
-
-Start testpmd with eal parameter --force-max-simd-bitwidth=64. Based on test steps of
-'HW checksum offload check'.
-
-Test Case: HW checksum offload check on sse path
-================================================
-Start testpmd with eal parameter --force-max-simd-bitwidth=128. Based on test steps of
-'HW checksum offload check'.
+For PMD not supporting VLAN defaultly, we run an extra case::
+    
+    csum set ip hw 1
+    csum set udp hw 1
+    csum set tcp hw 1
+    csum set sctp hw 1
+    vlan set filter on 0
+    rx_vlan add 100 0
 
-Test Case: HW checksum offload check on avx2 path
-=================================================
-Start testpmd with eal parameter --force-max-simd-bitwidth=256. Based on test steps of
-'HW checksum offload check'.
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum,
+each packet for multiple times, 10 times usually::
 
-Test Case: HW checksum offload check on avx512 path
-===================================================
-Start testpmd with eal parameter --force-max-simd-bitwidth=512. Based on test steps of
-'HW checksum offload check'.
+    CSUM NON-TUNNEL VLAN PACKETS
 
-Test Case: HW checksum offload check with vlan on scalar path
-=============================================================
+Check for the correct checksum insertion at the correct place.
 
-Test Case: HW checksum offload check with vlan on sse path
-=============================================================
 
-Test Case: HW checksum offload check with vlan on avx2 path
-=============================================================
+Test case 6: HW Outer-IP tunneling
+==================================
 
-Test Case: HW checksum offload check with vlan on avx512 path
-=============================================================
+After DPDK v22.11, Intel® Ethernet 800 Series NIC with ICE supports tunneling packets on VF.
+This test is used to test tunneling scenario and will enable Outer-IP checksum offload.
+Configure the TX HW Offload::
 
-Test Case: HW tunneling checksum offload check on scalar path
-=============================================================
+    csum set ip hw 1
+    csum set udp hw 1
+    csum set tcp hw 1
+    csum set sctp hw 1
+    csum set outer-ip hw 1
+    csum parse-tunnel on 1
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum,
+each packet for multiple times, 10 times usually::
 
-Test Case: HW tunneling checksum offload check on sse path
-==========================================================
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS
 
-Test Case: HW tunneling checksum offload check on avx2 path
-===========================================================
+Send packets of below with bad Outer-IP checksum, bad Outer-L4 checksum, bad IP checksum, bad L4
+checksum, bad all checksum, good all checksum, each packet for multiple times, 10 times usually::
 
-Test Case: HW tunneling checksum offload check on avx512 path
-=============================================================
+    CSUM TUNNEL PACKETS
+    CSUM TUNNEL VLAN PACKETS
 
-Test Case: HW tunneling checksum offload check with vlan on scalar path
-=======================================================================
+Check for the correct checksum insertion at the correct place.
 
-Test Case: HW tunneling checksum offload check with vlan on sse path
-====================================================================
 
-Test Case: HW tunneling checksum offload check with vlan on avx2 path
-=====================================================================
+Test case 7: HW Outer-UDP tunneling
+===================================
 
-Test Case: HW tunneling checksum offload check with vlan on avx512 path
-=======================================================================
+After DPDK v22.11, Intel® Ethernet 800 Series NIC with ICE supports tunneling packets on VF.
+This test is used to test tunneling scenario and will enable Outer-UDP checksum offload.
+Configure the TX HW Offload::
 
-Test Case: SW checksum offload check on scalar path
-===================================================
+    csum set ip hw 1
+    csum set udp hw 1
+    csum set tcp hw 1
+    csum set sctp hw 1
+    csum set outer-udp hw 1
+    csum parse-tunnel on 1
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum,
+each packet for multiple times, 10 times usually::
 
-Test Case: SW checksum offload check on sse path
-================================================
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS
 
-Test Case: SW checksum offload check on avx2 path
-=================================================
+Send packets of below with bad Outer-IP checksum, bad Outer-L4 checksum, bad IP checksum, bad L4
+checksum, bad all checksum, good all checksum, each packet for multiple times, 10 times usually::
 
-Test Case: SW checksum offload check on avx512 path
-===================================================
+    CSUM TUNNEL PACKETS
+    CSUM TUNNEL VLAN PACKETS
 
+Check for the correct checksum insertion at the correct place.
 
-Prerequisites for TSO
-=====================
 
-The DUT must take one of the Ethernet controller ports connected to a port on another
-device that is controlled by the Scapy packet generator.
+Test case 8: HW Outer-IP + Outer-UDP tunneling with SW Inner
+============================================================
 
-The Ethernet interface identifier of the port that Scapy will use must be known.
-On tester, all offload feature should be disabled on tx port, and start rx port capture::
+After DPDK v22.11, Intel® Ethernet 800 Series NIC with ICE supports tunneling packets on VF.
+This test is used to test tunneling scenario and will enable Outer-IP and Outer-UDP checksum offload.
+Configure the TX HW Offload::
 
-  ethtool -K <tx port> rx off tx off tso off gso off gro off lro off
-  ip l set <tx port> up
-  tcpdump -n -e -i <rx port> -s 0 -w /tmp/cap
+    csum set outer-ip hw 1
+    csum set outer-udp hw 1
+    csum parse-tunnel on 1
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum,
+each packet for multiple times, 10 times usually::
 
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS
 
-On DUT, run pmd with parameter "--enable-rx-cksum". Then enable TSO on tx port
-and checksum on rx port. The test commands is below::
-
-  # Enable hw checksum on rx port
-  testpmd> port stop all
-  testpmd> csum set ip hw 0
-  testpmd> csum set tcp hw 0
-  testpmd> csum set udp hw 0
-  testpmd> csum set sctp hw 0
-  testpmd> port start all
-  testpmd> set promisc 0 on
-  testpmd> set fwd csum
-
-  # Enable TSO on tx port
-  testpmd> tso set 800 1
-
-For tunneling cases on Intel® Ethernet 800 Series NIC with ICE, add tunneling support
-on csum and enable tunnel tso as below::
-
-  # Enable hw checksum for tunneling on rx port
-  testpmd> port stop all
-  testpmd> csum set outer-ip hw 0
-  testpmd> csum set outer-udp hw 0
-  testpmd> csum parse-tunnel on 0
-  testpmd> port start all
-  testpmd> tunnel_tso set 800 1
-
-Configure the traffic generator to send the multiple packets for the following
-combination, each combination for several times:
-
-  +----------------+----------------------------------------+---------------+
-  | packet type    | packet organization                    | packet count  |
-  +================+========================================+===============+
-  |                | Ether / IPv4 / TCP / payload len 128   | 10            |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv4 / TCP / payload len 800   | 10            |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv4 / TCP / payload len 801   | 10            |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv4 / TCP / payload len 1700  | 10            |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv4 / TCP / payload len 2500  | 10            |
-  | non-tunneling  +----------------------------------------+---------------+
-  | packets for    | Ether / IPv4 / TCP / payload len 8500  | 1000          |
-  | TSO test       +----------------------------------------+---------------+
-  |                | Ether / IPv6 / TCP / payload len 128   | 10            |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv6 / TCP / payload len 800   | 10            |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv6 / TCP / payload len 801   | 10            |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv6 / TCP / payload len 1700  | 10            |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv6 / TCP / payload len 2500  | 10            |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv6 / TCP / payload len 8500  | 1000          |
-  +----------------+----------------------------------------+---------------+
-  |                | Ether / IPv4 / UDP / VXLAN / Ether     | N/A           |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv6 / UDP / VXLAN / Ether     | N/A           |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv4 / GRE                     | N/A           |
-  | outer and      +----------------------------------------+---------------+
-  | tunneling      | Ether / IPv4 / GRE / Ether             | N/A           |
-  | packets        +----------------------------------------+---------------+
-  | for tso test   | Ether / IPv6 / GRE                     | N/A           |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv6 / GRE / Ether             | N/A           |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv4 / NVGRE                   | N/A           |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv4 / NVGRE / Ether           | N/A           |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv6 / NVGRE                   | N/A           |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv6 / NVGRE / Ether           | N/A           |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv4 / UDP / GTPU              | N/A           |
-  |                +----------------------------------------+---------------+
-  |                | Ether / IPv6 / UDP / GTPU              | N/A           |
-  +----------------+----------------------------------------+---------------+
-  |                | IPv4 / TCP / payload len 128           | 10            |
-  |                +----------------------------------------+---------------+
-  |                | IPv4 / TCP / payload len 800           | 10            |
-  |                +----------------------------------------+---------------+
-  |                | IPv4 / TCP / payload len 801           | 10            |
-  |                +----------------------------------------+---------------+
-  |                | IPv4 / TCP / payload len 1700          | 10            |
-  |                +----------------------------------------+---------------+
-  |                | IPv4 / TCP / payload len 2500          | 10            |
-  |                +----------------------------------------+---------------+
-  | inner packets  | IPv4 / TCP / payload len 8500          | 1000          |
-  | for TSO test   +----------------------------------------+---------------+
-  |                | IPv6 / TCP / payload len 128           | 10            |
-  |                +----------------------------------------+---------------+
-  |                | IPv6 / TCP / payload len 800           | 10            |
-  |                +----------------------------------------+---------------+
-  |                | IPv6 / TCP / payload len 801           | 10            |
-  |                +----------------------------------------+---------------+
-  |                | IPv6 / TCP / payload len 1700          | 10            |
-  |                +----------------------------------------+---------------+
-  |                | IPv6 / TCP / payload len 2500          | 10            |
-  |                +----------------------------------------+---------------+
-  |                | IPv6 / TCP / payload len 8500          | 1000          |
-  +----------------+----------------------------------------+---------------+
-  
-Notice that VxLAN needs DCF to configure, so testing of VxLAN may need to perform
-on DCF.
-
-
-Test case: csum fwd engine, use TSO
-===================================
+Send packets of below with bad Outer-IP checksum, bad Outer-L4 checksum, bad IP checksum, bad L4
+checksum, bad all checksum, good all checksum, each packet for multiple times, 10 times usually::
 
-This test uses ``Scapy`` to send out one large TCP package. The dut forwards package
-with TSO enable on tx port while rx port turns checksum on. After package send out
-by TSO on tx port, the tester receives multiple small TCP package.
+    CSUM TUNNEL PACKETS
+    CSUM TUNNEL VLAN PACKETS
 
-Turn off tx port by ethtool on tester::
+Check for the correct checksum insertion at the correct place.
 
-  ethtool -K <tx port> rx off tx off tso off gso off gro off lro off
-  ip l set <tx port> up
 
-Capture package rx port on tester::
+Test case 9: HW Outer-IP + Outer-UDP tunneling with HW Inner (w/o DCF, w/o AVX512)
+===================================================================================
 
-  tcpdump -n -e -i <rx port> -s 0 -w /tmp/cap
+Test for both default path and for AVX512 path by adding EAL Parameter '--force-max-simd-bitwidth=512'.
 
-Launch the userland ``testpmd`` application on DUT as follows::
+After DPDK v22.11, Intel® Ethernet 800 Series NIC with ICE supports tunneling packets on VF.
+This test is used to test tunneling scenario and will enable Outer-IP and Outer-UDP checksum offload.
+Configure the TX HW Offload::
 
-  testpmd> set verbose 1
-  # Enable hw checksum on rx port
-  testpmd> port stop all
-  testpmd> csum set ip hw 0
-  testpmd> csum set tcp hw 0
-  testpmd> csum set udp hw 0
-  testpmd> csum set sctp hw 0
-  testpmd> set promisc 0 on
-  testpmd> port start all
-
-  # Enable TSO on tx port
-  testpmd> tso set 800 1
-  # Set fwd engine and start
-
-  testpmd> set fwd csum
-
-  Due to DPDK 236bc417e2da(app/testpmd: fix MAC header in checksum forward engine) changes the checksum 
-  functions adds switches to control whether to exchange MAC address.
-  Currently, our test scripts are based on not exchanging MAC addresses, mac-swap needs to be disabled:
-  testpmd> csum mac-swap off 0
+    csum set ip hw 1
+    csum set udp hw 1
+    csum set tcp hw 1
+    csum set sctp hw 1
+    csum set outer-ip hw 1
+    csum set outer-udp hw 1
+    csum parse-tunnel on 1
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum,
+each packet for multiple times, 10 times usually::
 
-  testpmd> start
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS
 
-Test IPv4() in scapy::
+Send packets of below with bad Outer-IP checksum, bad Outer-L4 checksum, bad IP checksum, bad L4
+checksum, bad all checksum, good all checksum, each packet for multiple times, 10 times usually::
 
-    sendp([Ether(dst="%s", src="52:00:00:00:00:00")/IP(src="192.168.1.1",dst="192.168.1.2")/TCP(sport=1021,dport=1021)/Raw(load=RandString(size=%s))], iface="%s", count = %s)
+    CSUM TUNNEL PACKETS
+    CSUM TUNNEL VLAN PACKETS
 
-Test IPv6() in scapy::
+Check for the correct checksum insertion at the correct place.
 
-    sendp([Ether(dst="%s", src="52:00:00:00:00:00")/IPv6(src="FE80:0:0:0:200:1FF:FE00:200", dst="3555:5555:6666:6666:7777:7777:8888:8888")/TCP(sport=1021,dport=1021)/Raw(load=RandString(size=%s))], iface="%s", count = %s)
+For VXLAN packets, we run an extra case on DCF::
+    
+    csum set ip hw 1
+    csum set udp hw 1
+    csum set tcp hw 1
+    csum set sctp hw 1
+    csum set outer-ip hw 1
+    csum set outer-udp hw 1
+    csum parse-tunnel on 1
+    rx_vxlan_port add 4789 0
 
-Test case: csum fwd engine, use tunnel TSO
-==========================================
-In DPDK 22.11 release, Intel® Ethernet 800 Series NIC with ICE supports HW
-TSO for tunneling packets. For the packets involved in this case, a ICE COMMON
-DDP Package is required.
+Send packets of below with bad Outer-IP checksum, bad Outer-L4 checksum, bad IP checksum, bad L4
+checksum, bad all checksum, good all checksum, each packet for multiple times, 10 times usually::
 
-This test uses ``Scapy`` to send out one large tunneled TCP package. The dut
-forwards package with tunnel TSO enable on tx port while rx port turns checksum
-on. After package send out by TSO on tx port, the tester receives multiple small
-TCP package.
+    CSUM TUNNEL PACKETS OF VXLAN
+    CSUM TUNNEL VLAN PACKETS OF VXLAN
 
-Turn off tx port by ethtool on tester::
+Check for the correct checksum insertion at the correct place.
 
-  ethtool -K <tx port> rx off tx off tso off gso off gro off lro off
-  ip l set <tx port> up
 
-Capture package rx port on tester::
+Test case 10: SW non-tunneling (w/o VLAN)
+=========================================
 
-  tcpdump -n -e -i <rx port> -s 0 -w /tmp/cap
+This test is used to test tunneling scenario and will enable no checksum offload.
+Configured in default.
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum,
+each packet for multiple times, 10 times usually::
 
-Launch the userland ``testpmd`` application on DUT as follows::
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
 
-  testpmd> set verbose 1
-  # Enable hw checksum on rx port
-  testpmd> port stop all
-  testpmd> csum set ip hw 0
-  testpmd> csum set tcp hw 0
-  testpmd> csum set udp hw 0
-  testpmd> csum set sctp hw 0
-  testpmd> csum set outer-ip hw 0
-  testpmd> csum set outer-udp hw 0
-  testpmd> csum parse-tunnel on 0
-  testpmd> set promisc 0 on
-  testpmd> port start all
+Check for the correct checksum insertion at the correct place.
+
+For PMD not supporting VLAN defaultly, we run an extra case::
+    
+    vlan set filter on 0
+    rx_vlan add 100 0
 
-  # Enable TSO on tx port
-  testpmd> tunnel_tso set 800 1
-  # Set fwd engine and start
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum,
+each packet for multiple times, 10 times usually::
 
-  testpmd> set fwd csum
-  testpmd> start
+    CSUM NON-TUNNEL VLAN PACKETS
 
-Test IPv4() in scapy::
+Check for the correct checksum insertion at the correct place.
 
-  for one_outer_packet in outer_packet_list:
-    sendp([Ether(dst="%s", src="52:00:00:00:00:00")/one_outer_packet/IP(src="192.168.1.1",dst="192.168.1.2")/TCP(sport=1021,dport=1021)/Raw(load=RandString(size=%s))], iface="%s", count = %s)
 
-Test IPv6() in scapy::
+Test case 11: SW tunneling (w/o DCF, w/o AVX512)
+=================================================
 
-  for one_outer_packet in outer_packet_list:
-    sendp([Ether(dst="%s", src="52:00:00:00:00:00")/one_outer_packet/IPv6(src="FE80:0:0:0:200:1FF:FE00:200", dst="3555:5555:6666:6666:7777:7777:8888:8888")/TCP(sport=1021,dport=1021)/Raw(load=RandString(size=%s))], iface="%s", count = %s)
+Test for both default path and for AVX512 path by adding EAL Parameter '--force-max-simd-bitwidth=512'.
 
-Test case: csum fwd engine, use TSO, on scalar path
-===================================================
-These set of cases based on existing cases are designed for better case managment for
-regression test.
+After DPDK v22.11, Intel® Ethernet 800 Series NIC with ICE supports tunneling packets on VF.
+This test is used to test tunneling scenario and will enable no checksum offload.
+Configure the TX HW Offload::
 
-Start testpmd with eal parameter --force-max-simd-bitwidth=64. Based on test steps of
-'csum fwd engine, use TSO'.
+    csum parse-tunnel on 1
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum,
+each packet for multiple times, 10 times usually::
 
-Test case: csum fwd engine, use TSO, on sse path
-================================================
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
+
+Send packets of below with bad Outer-IP checksum, bad Outer-L4 checksum, bad IP checksum, bad L4
+checksum, bad all checksum, good all checksum, each packet for multiple times, 10 times usually::
+
+    CSUM TUNNEL PACKETS (common packets for common DDP)
+    CSUM TUNNEL VLAN PACKETS (for i40e and ice, common packets for common DDP)
+
+Check for the correct checksum insertion at the correct place.
+
+For VXLAN packets, we run an extra case on DCF::
+    
+    csum parse-tunnel on 1
+    rx_vxlan_port add 4789 0
 
-Test case: csum fwd engine, use TSO, on avx2 path
+Send packets of below with bad Outer-IP checksum, bad Outer-L4 checksum, bad IP checksum, bad L4
+checksum, bad all checksum, good all checksum, each packet for multiple times, 10 times usually::
+
+    CSUM TUNNEL PACKETS OF VXLAN
+    CSUM TUNNEL VLAN PACKETS OF VXLAN
+
+Check for the correct checksum insertion at the correct place.
+
+
+Test case 12: TSO (w/o VLAN, w/o DCF)
 =================================================
 
-Test case: csum fwd engine, use TSO, on avx512 path
-===================================================
+This test is used to test TSO and will enable all HW checksum offload with TSO.
+Configure the TX HW Offload::
 
-Test case: csum fwd engine, use tunnel TSO, on scalar path
-==========================================================
+    csum set ip hw 1
+    csum set udp hw 1
+    csum set tcp hw 1
+    csum set sctp hw 1
+    csum set outer-ip hw 1
+    csum set outer-udp hw 1
+    csum parse-tunnel on 1
+    tso set 800 1
+    
+Send packets of below with bad all checksum, good all checksum, payload size ranges
+in 128, 800, 801, 1700, 2500, 8500, each packet for multiple times, 10 times usually::
 
-Test case: csum fwd engine, use tunnel TSO, on sse path
-=======================================================
+    TSO NON-TUNNEL PACKETS
+    TSO TUNNEL PACKETS
+    UFO NON-TUNNEL PACKETS
+    UFO TUNNEL PACKETS
+
+Check for the correct checksum insertion at the correct place, check for the correct payload segmentation.
+
+
+Test case 13: TSO tunneling (w/o VLAN, w/o DCF)
+===========================================================
 
-Test case: csum fwd engine, use tunnel TSO, on avx2 path
-========================================================
+This test is used to test Tunnel TSO and will enable all HW checksum offload with Tunnel TSO.
+Configure the TX HW Offload::
+
+    csum set ip hw 1
+    csum set udp hw 1
+    csum set tcp hw 1
+    csum set sctp hw 1
+    csum set outer-ip hw 1
+    csum set outer-udp hw 1
+    csum parse-tunnel on 1
+    tunnel_tso set 800 1
+    
+Send packets of below with bad all checksum, good all checksum, payload size ranges
+in 128, 800, 801, 1700, 2500, 8500, each packet for multiple times, 10 times usually::
+
+    TSO NON-TUNNEL PACKETS
+    TSO TUNNEL PACKETS
+    UFO NON-TUNNEL PACKETS
+    UFO TUNNEL PACKETS
+
+Check for the correct checksum insertion at the correct place, check for the correct payload segmentation.
+
+
+Test case 14: TSO combine (w/o VLAN, w/o DCF, w/o AVX512)
+=========================================================
+
+This test is used to test TSO and Tunnel TSO, will enable all HW checksum offload with TSO and Tunnel TSO.
+Configure the TX HW Offload::
+
+    csum set ip hw 1
+    csum set udp hw 1
+    csum set tcp hw 1
+    csum set sctp hw 1
+    csum set outer-ip hw 1
+    csum set outer-udp hw 1
+    csum parse-tunnel on 1
+    tso set 800 1
+    tunnel_tso set 800 1
+    
+Send packets of below with bad all checksum, good all checksum, payload size ranges
+in 128, 800, 801, 1700, 2500, 8500, each packet for multiple times, 10 times usually::
+
+    TSO NON-TUNNEL PACKETS
+    TSO TUNNEL PACKETS
+    UFO NON-TUNNEL PACKETS
+    UFO TUNNEL PACKETS
+
+Check for the correct checksum insertion at the correct place, check for the correct payload segmentation.
 
-Test case: csum fwd engine, use tunnel TSO, on avx512 path
-==========================================================
