diff --git a/test_plans/checksum_offload_test_plan.rst b/test_plans/checksum_offload_test_plan.rst
index fab75857..57987b82 100644
--- a/test_plans/checksum_offload_test_plan.rst
+++ b/test_plans/checksum_offload_test_plan.rst
@@ -1,59 +1,71 @@
 .. SPDX-License-Identifier: BSD-3-Clause
-   Copyright(c) 2010-2017 Intel Corporation
+   Copyright(c) 2010-2023 Intel Corporation
    Copyright(c) 2018-2019 The University of New Hampshire
 
-============================
-RX/TX Checksum Offload Tests
-============================
+======================
+Checksum Offload Tests
+======================
 
-The support of RX/TX L3/L4 Checksum offload features by Poll Mode Drivers consists in:
+Description
+===========
+
+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 in transmitted packets.
-- IPv4/UDP checksum insertion by hardware in transmitted packets.
-- IPv4/TCP checksum insertion by hardware in transmitted packets.
-- IPv4/SCTP checksum insertion by hardware in transmitted packets (sctp
-  length in 4 bytes).
-- IPv6/UDP checksum insertion by hardware in transmitted packets.
-- IPv6/TCP checksum insertion by hardware in transmitted packets.
-- IPv6/SCTP checksum insertion by hardware in transmitted packets (sctp
-  length in 4 bytes).
-
-RX/TX side, the insertion of a L3/L4 checksum by hardware can be enabled with the
+- 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
+    set fwd csum
+    csum set ip|tcp|udp|sctp|outer-ip|outer-udp hw|sw port_id
 
 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. 
-
+configured ports.
 
 Prerequisites
 =============
 
-If using vfio the kernel must be >= 3.6+ and VT-d must be enabled in bios.When
+Topology
+--------
+
+    dut_port_0 <---> tester_port_0
+
+    dut_port_1 <---> tester_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
 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>
 
-Assuming that ports ``0`` and ``2`` are connected to a traffic generator,
-launch the ``testpmd`` with the following arguments::
+Based on the topology, launch the ``testpmd`` with the following arguments::
 
-  ./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
+  ./build/app/dpdk-testpmd -c <...> -n <...> -- -i <...> --enable-rx-cksum
 
 Set the verbose level to 1 to display information for each received packet::
 
@@ -65,944 +77,670 @@ Currently, our test scripts are based on not exchanging MAC addresses, mac-swap
 
   testpmd> csum mac-swap off 0
 
-Test Case: Insert IPv4/IPv6 UDP/TCP/SCTP checksum on the transmit packet
-========================================================================
-
-Setup the ``csum`` forwarding mode::
-
-  testpmd> set fwd csum
-  Set csum packet forwarding mode
-
-Start the packet forwarding::
-
-  testpmd> port stop all
-  testpmd> csum set ip hw 0
-  testpmd> csum set udp hw 0
-  testpmd> csum set tcp hw 0
-  testpmd> csum set sctp hw 0
-  testpmd> port start all
-  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
-
-Start a packet capture on the tester in the background::
-
-   tcpdump -i <iface> -s 65535 -w /tmp/tester/test_checksum_capture.pcap &
-
-Send the following multiple packets from tester for with scapy 
-combination: IPv4/UDP, IPv4/TCP, IPv4/SCTP, IPv6/UDP, IPv6/TCP::
-
-   sendp([Ether(dst="52:00:00:00:00:01", src="52:00:00:00:00:00")/IP(chksum=0x0)/UDP(chksum=0xf)/("X"*46),
-   Ether(dst="52:00:00:00:00:01", src="52:00:00:00:00:00")/IP(chksum=0x0)/TCP(chksum=0xf)/("X"*46),
-   Ether(dst="52:00:00:00:00:01", src="52:00:00:00:00:00")/IP(chksum=0x0)/SCTP(chksum=0x0)/("X"*48),
-   Ether(dst="52:00:00:00:00:01", src="52:00:00:00:00:00")/IPv6(src="::1")/UDP(chksum=0xf)/("X"*46),
-   Ether(dst="52:00:00:00:00:01", src="52:00:00:00:00:00")/IPv6(src="::1")/TCP(chksum=0xf)/("X"*46)],
-   iface="ens192f0",count=4,inter=0,verbose=False)
-
-Then verify that the same number of packet are correctly received on the tester. 
-
-Inspect the pcap file from the packet capture and verify the checksums.
-
-
-Test Case: Do not insert IPv4/IPv6 UDP/TCP checksum on the transmit packet
-==========================================================================
-
-Setup the ``csum`` forwarding mode::
-
-  testpmd> set fwd csum
-  Set csum packet forwarding mode
-
-Start the packet forwarding::
-
-  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
-
-Start a packet capture on the tester in the background::
-
-   tcpdump -i <iface> -s 65535 -w /tmp/tester/test_checksum_capture.pcap &
-
-Send the following multiple packets from tester for with scapy 
-combination: IPv4/UDP, IPv4/TCP, IPv6/UDP, IPv6/TCP::
-   
-   sendp([Ether(dst="52:00:00:00:00:01", src="52:00:00:00:00:00")/IP(src="10.0.0.1",chksum=0x0)/UDP(chksum=0xf)/("X"*46),
-   Ether(dst="52:00:00:00:00:01", src="52:00:00:00:00:00")/IP(src="10.0.0.1",chksum=0x0)/TCP(chksum=0xf)/("X"*46),
-   Ether(dst="52:00:00:00:00:01", src="52:00:00:00:00:00")/IPv6(src="::1")/UDP(chksum=0xf)/("X"*46),
-   Ether(dst="52:00:00:00:00:01", src="52:00:00:00:00:00")/IPv6(src="::1")/TCP(chksum=0xf)/("X"*46)],
-   iface="ens192f0",count=4,inter=0,verbose=False)
-
-Then verify that the same number of packet are correctly received on the tester.  
-
-Inspect the pcap file from the packet capture and verify the checksums.
-
-Test Case: Validate RX checksum valid flags on the receive packet
-=================================================================
-
-Setup the ``csum`` forwarding mode::
-
-  testpmd> set fwd csum
-  Set csum packet forwarding mode
-
-Start the packet forwarding::
-
-  testpmd> port stop all
-  testpmd> csum set ip hw 0
-  testpmd> csum set udp hw 0
-  testpmd> csum set tcp hw 0
-  testpmd> csum set sctp hw 0
-  testpmd> port start all
-  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 with the following
-combination: good/bad ip checksum + good/bad udp/tcp checksum.
-
-Send a packet ptypes is IP/UDP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP(chksum=int(0x7ca0))/UDP(chksum=int(0x1126))/('X'*50), iface=iface)
-
-   Check the Rx checksum flags consistent with expected flags.
-
-   port=0, mbuf=0x168d06200, pkt_len=88, nb_segs=1:
-   rx: l2_len=14 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=20 m->l4_len=8
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV4
-
-Send a packet ptypes is IP/TCP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP(chksum=int(0xf19f))/TCP(chksum=int(0x165f))/('X'*50), iface=iface)
-
-   Check the Rx checksum flags consistent with expected flags.
-
-   port=0, mbuf=0x168be5100, pkt_len=100, nb_segs=1:
-   rx: l2_len=14 ethertype=800 l3_len=20 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=20 m->l4_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV4
-
-Send a packet ptypes is IP/SCTP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP(chksum=int(0xf127))/SCTP(chksum=int(0x2566b731))/('X'*50), iface=iface)
-
-   Check the Rx checksum flags consistent with expected flags.
-
-   port=0, mbuf=0x168be7600, pkt_len=94, nb_segs=1:
-   rx: l2_len=14 ethertype=800 l3_len=20 l4_proto=132 l4_len=0 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=20 m->l4_len=0
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_SCTP_CKSUM RTE_MBUF_F_TX_IPV4
-
-Send a packet ptypes is IPV6/UDP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPv6(src="::1")/UDP(chksum=int(0xf27))/('X'*50), iface=iface)
-
-   Check the Rx checksum flags consistent with expected flags.
-
-   port=0, mbuf=0x168d058c0, pkt_len=108, nb_segs=1:
-   rx: l2_len=14 ethertype=86dd l3_len=40 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=40 m->l4_len=8
-   tx: flags=RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV6
-
-Send a packet ptypes is IPV6/TCP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPv6(src="::1")/TCP(chksum=int(0x9f5f))/('X'*50), iface=iface)
-
-   Check the Rx checksum flags consistent with expected flags.
-
-   port=0, mbuf=0x168d033c0, pkt_len=120, nb_segs=1:
-   rx: l2_len=14 ethertype=86dd l3_len=40 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=40 m->l4_len=20
-   tx: flags=RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV6
-
-Send a packet ptypes is IP/UDP with a bad IP/UDP checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP(chksum=0x0)/UDP(chksum=0xf)/('X'*50), iface=iface)
-
-   Check the Rx checksum flags consistent with expected flags.
-
-   port=0, mbuf=0x168d00ec0, pkt_len=88, nb_segs=1:
-   rx: l2_len=14 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_BAD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=20 m->l4_len=8
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV4
-
-Send a packet ptypes is IP/TCP with a bad IP/TCP checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP(chksum=0x0)/TCP(chksum=0xf)/('X'*50), iface=iface)
-
-   Check the Rx checksum flags consistent with expected flags.
-
-   port=0, mbuf=0x168cfe9c0, pkt_len=100, nb_segs=1:
-   rx: l2_len=14 ethertype=800 l3_len=20 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_BAD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=20 m->l4_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV4
-
-Send a packet ptypes is IP/SCTP with a bad IP/SCTP checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP(chksum=0x0)/SCTP(chksum=0xf)/('X'*50), iface=iface)
-
-   Check the Rx checksum flags consistent with expected flags.
-
-   port=0, mbuf=0x168cfc4c0, pkt_len=94, nb_segs=1:
-   rx: l2_len=14 ethertype=800 l3_len=20 l4_proto=132 l4_len=0 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_BAD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=20 m->l4_len=0
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_SCTP_CKSUM RTE_MBUF_F_TX_IPV4
-
-Send a packet ptypes is IPV6/UDP with a bad UDP checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPv6(src="::1")/UDP(chksum=0xf)/('X'*50), iface=iface)
-
-   Check the Rx checksum flags consistent with expected flags.
-
-   port=0, mbuf=0x168cf9fc0, pkt_len=108, nb_segs=1:
-   rx: l2_len=14 ethertype=86dd l3_len=40 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=40 m->l4_len=8
-   tx: flags=RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV6
-
-Send a packet ptypes is IPV6/TCP with a bad TCP checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPv6(src="::1")/TCP(chksum=0xf)/('X'*50), iface=iface)
-
-   Check the Rx checksum flags consistent with expected flags.
-
-   port=0, mbuf=0x168cf9fc0, pkt_len=108, nb_segs=1:
-   rx: l2_len=14 ethertype=86dd l3_len=40 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=40 m->l4_len=8
-   tx: flags=RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV6
-
-Test Case: Hardware Checksum Check L4 RX
-===========================================
-This test involves testing many different scenarios with a L4 checksum.
-A variety of tunneling protocols, L3 protocols and L4 protocols are combined
-to test as many scenarios as possible. Currently, UDP, TCP and SCTP are used
-as L4 protocols, with IP and IPv6 being used at level 3. The tested tunneling
-protocols are VXLAN and GRE.
-
-Setup the ``csum`` forwarding mode::
-
-  testpmd> set fwd csum
-  Set csum packet forwarding mode
-
-Start the packet forwarding::
-
-  testpmd> port stop all
-  testpmd> csum set ip hw 0
-  testpmd> csum set udp hw 0
-  testpmd> csum set tcp hw 0
-  testpmd> csum set sctp hw 0
-  testpmd> port start all
-  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
-
-Send a packet ptypes is IP/UDP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/UDP()/('X'*50), iface=iface)
-
-   check the packet received, the flag RTE_MBUF_F_RX_L4_CKSUM_GOOD in the packet received
-
-   port=0, mbuf=0x2269df8780, pkt_len=96, nb_segs=1:
-   rx: l2_len=18 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD  RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: flags=RTE_MBUF_F_TX_L4_NO_CKSUM RTE_MBUF_F_TX_IPV4
-
-Send a packet ptypes is IP/UDP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/UDP(chksum=0xf)/('X'*50), iface=iface)
-
-   check the packet received, the flag RTE_MBUF_F_RX_L4_CKSUM_BAD in the packet received
-
-   port=0, mbuf=0x2269df7e40, pkt_len=96, nb_segs=1:
-   rx: l2_len=18 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_BAD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: flags=RTE_MBUF_F_TX_L4_NO_CKSUM RTE_MBUF_F_TX_IPV4
-
-Send a packet ptypes is IP/TCP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/TCP()/('X'*50), iface=iface)
-
-   check the packet received, the flag RTE_MBUF_F_RX_L4_CKSUM_GOOD in the packet received
-
-   port=0, mbuf=0x2269df8780, pkt_len=96, nb_segs=1:
-   rx: l2_len=18 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD  RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: flags=RTE_MBUF_F_TX_L4_NO_CKSUM RTE_MBUF_F_TX_IPV4
-
-Send a packet ptypes is IP/TCP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/TCP(chksum=0xf)/('X'*50), iface=iface)
-
-   check the packet received, the flag RTE_MBUF_F_RX_L4_CKSUM_BAD in the packet received
-
-   port=0, mbuf=0x2269df7e40, pkt_len=96, nb_segs=1:
-   rx: l2_len=18 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_BAD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: flags=RTE_MBUF_F_TX_L4_NO_CKSUM RTE_MBUF_F_TX_IPV4
-
-Send a packet ptypes is IP/SCTP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/SCTP()/('X'*50), iface=iface)
-
-   check the packet received, the flag RTE_MBUF_F_RX_L4_CKSUM_GOOD in the packet received
-
-   port=0, mbuf=0x2269df8780, pkt_len=96, nb_segs=1:
-   rx: l2_len=18 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD  RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: flags=RTE_MBUF_F_TX_L4_NO_CKSUM RTE_MBUF_F_TX_IPV4
+Common test steps
+=================
+
+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(CSUM_PAYLOAD_SIZE))                                      |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | IP/TCP                    | IP(src="10.0.0.1") / TCP(sport=29999, dport=30000) / Raw(randstring(CSUM_PAYLOAD_SIZE))                                      |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | IP/SCTP                   | IP(src="10.0.0.1") / SCTP(sport=29999, dport=30000, chksum=0x0000) / Raw(randstring(CSUM_PAYLOAD_SIZE))                      |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | IPv6/UDP                  | IPv6(src="::1") / UDP(sport=29999, dport=30000) / Raw(randstring(CSUM_PAYLOAD_SIZE))                                         |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | IPv6/TCP                  | IPv6(src="::1") / TCP(sport=29999, dport=30000) / Raw(randstring(CSUM_PAYLOAD_SIZE))                                         |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+| Inner Parts      | IPv6/SCTP                 | IPv6(src="::1") / SCTP(sport=29999, dport=30000, chksum=0x0000) / Raw(randstring(CSUM_PAYLOAD_SIZE))                         |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | VLAN/IP/UDP               | Dot1Q(vlan=100) / IP(src="10.0.0.1") / UDP(sport=29999, dport=30000) / Raw(randstring(CSUM_PAYLOAD_SIZE))                    |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | VLAN/IP/TCP               | Dot1Q(vlan=100) / IP(src="10.0.0.1") / TCP(sport=29999, dport=30000) / Raw(randstring(CSUM_PAYLOAD_SIZE))                    |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | VLAN/IP/SCTP              | Dot1Q(vlan=100) / IP(src="10.0.0.1") / SCTP(sport=29999, dport=30000, chksum=0x0000) / Raw(randstring(CSUM_PAYLOAD_SIZE))    |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | VLAN/IPv6/UDP             | Dot1Q(vlan=100) / IPv6(src="::1") / UDP(sport=29999, dport=30000) / Raw(randstring(CSUM_PAYLOAD_SIZE))                       |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | VLAN/IPv6/TCP             | Dot1Q(vlan=100) / IPv6(src="::1") / TCP(sport=29999, dport=30000) / Raw(randstring(CSUM_PAYLOAD_SIZE))                       |
+|                  +---------------------------+------------------------------------------------------------------------------------------------------------------------------+
+|                  | VLAN/IPv6/SCTP            | Dot1Q(vlan=100) / IPv6(src="::1") / SCTP(sport=29999, dport=30000, chksum=0x0000) / Raw(randstring(CSUM_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                   |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/VXLAN                 |
+|                  | Outer parts      +----------------------------+
+|                  |                  | IP/NVGRE                   |
+|                  |                  +----------------------------+
+|                  |                  | IPv6/NVGRE                 |
+|                  +------------------+----------------------------+
+| CSUM TUNNEL      |                  | IP/UDP                     |
+| PACKETS          |                  +----------------------------+
+|                  |                  | 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          |                  +----------------------------+
+| for Commons DDP  |                  | 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              |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/VXLAN            |
+|                  | Outer parts      +----------------------------+
+|                  |                  | VLAN/IP/NVGRE              |
+|                  |                  +----------------------------+
+|                  |                  | VLAN/IPv6/NVGRE            |
+|                  +------------------+----------------------------+
+| CSUM TUNNEL      |                  | VLAN/IP/UDP                |
+| VLAN PACKETS     |                  +----------------------------+
+|                  |                  | 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     |                  +----------------------------+
+| for Commons DDP  |                  | 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             |
++------------------+------------------+----------------------------+
+
+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, refer to the following 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.
+
+
+Support of NICs
+===============
+
+Here we list the NICs for features supported introduced above. For NICs not listed we should use default test scopes.
+
++--------------------+------------------------------+--------------------+--------------------+------------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
+| NICs               | IPv4 or IPv6 / TCP or UDP RX | IPv4 / SCTP RX     | IPv6 / SCTP RX     | IPv4 or IPv6 / TCP or UDP TX | IPv4 / SCTP TX     | IPv6 / SCTP TX     | VLAN RX            | VLAN TX            | Tunneled RX        | Tunneled TX        |
++====================+==============================+====================+====================+==============================+====================+====================+====================+====================+====================+====================+
+| E810 series        | Yes                          | Yes                | Yes                | Yes                          | Partially          | Partially          | Yes                | Yes                | Partially          | Partially          |
+| DDP OS Default     |                              |                    |                    |                              |                    |                    |                    |                    |                    |                    |
++--------------------+------------------------------+--------------------+--------------------+------------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
+| E810 series        | Yes                          | Yes                | Yes                | Yes                          | Partially          | Partially          | Yes                | Yes                | Yes                | Yes                |
+| DDP Comms          |                              |                    |                    |                              |                    |                    |                    |                    |                    |                    |
++--------------------+------------------------------+--------------------+--------------------+------------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
+| E710 series        | Yes                          | Yes                | Yes                | Yes                          | Partially          | Partially          | Yes                | Yes                | Partially          | Partially          |
++--------------------+------------------------------+--------------------+--------------------+------------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
+| Lib SW             | N/A                          | N/A                | N/A                | Yes                          | Partially          | Partially          | N/A                | Yes                | N/A                | No                 |
++--------------------+------------------------------+--------------------+--------------------+------------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
+| Default            | Yes                          | Yes                | Yes                | Yes                          | Partially          | Partially          | Req Config         | Yes                | No                 | No                 |
++--------------------+------------------------------+--------------------+--------------------+------------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
+
+
+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::
 
-Send a packet ptypes is IP/SCTP with a bad checksum::
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/SCTP(chksum=0xf)/('X'*50), iface=iface)
 
-   check the packet received, the flag RTE_MBUF_F_RX_L4_CKSUM_BAD in the packet received
+Test case 2: HW UDP non-tunneling
+=================================
 
-   port=0, mbuf=0x2269df7e40, pkt_len=96, nb_segs=1:
-   rx: l2_len=18 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_BAD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: flags=RTE_MBUF_F_TX_L4_NO_CKSUM RTE_MBUF_F_TX_IPV4
+This test is used to test non-tunneling packets and will enable hw udp checksum offload.
+Configure the TX HW Offload::
 
-Verify flags are as expected.
+    csum set udp hw 1
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum::
 
-Test Case: Hardware Checksum Check L3 RX
-===========================================
-This test involves testing L3 checksum hardware offload.
-Due to the relative dominance of IPv4 and IPv6 as L3 protocols, and IPv6's
-lack of a checksum, only IPv4's checksum is tested.
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
 
-Setup the ``csum`` forwarding mode::
+Check for the correct checksum insertion at the correct place.
 
-  testpmd> set fwd csum
-  Set csum packet forwarding mode
 
-Start the packet forwarding::
+Test case 3: HW TCP non-tunneling
+=================================
 
-  testpmd> port stop all
-  testpmd> csum set ip hw 0
-  testpmd> csum set udp hw 0
-  testpmd> csum set tcp hw 0
-  testpmd> csum set sctp hw 0
-  testpmd> csum set 0xf 0
-  testpmd> port start all
-  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 tcp checksum offload.
+Configure the TX HW Offload::
 
-Send a packet ptypes is IP/UDP with a good checksum::
+    csum set tcp hw 1
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum::
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/UDP()/('X'*50), iface=iface)
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
 
-   check the packet received, the flag RTE_MBUF_F_RX_IP_CKSUM_GOOD in the packet received
+Check for the correct checksum insertion at the correct place.
 
-   port=0, mbuf=0x2269df8780, pkt_len=96, nb_segs=1:
-   rx: l2_len=18 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD  RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: flags=RTE_MBUF_F_TX_L4_NO_CKSUM RTE_MBUF_F_TX_IPV4
 
-Send a packet ptypes is IP/UDP with a bad checksum::
+Test case 4: HW SCTP non-tunneling
+==================================
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP(chksum=0xf)/UDP()/('X'*50), iface=iface)
+This test is used to test non-tunneling packets and will enable hw sctp checksum offload.
+Configure the TX HW Offload::
 
-   check the packet received, the flag RTE_MBUF_F_RX_IP_CKSUM_BAD in the packet received
+    csum set sctp hw 1
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum::
 
-   port=0, mbuf=0x2269df7e40, pkt_len=96, nb_segs=1:
-   rx: l2_len=18 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_BAD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: flags=RTE_MBUF_F_TX_L4_NO_CKSUM RTE_MBUF_F_TX_IPV4
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
 
-Send a packet ptypes is IP/TCP with a good checksum::
+Check for the correct checksum insertion at the correct place.
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/TCP()/('X'*50), iface=iface)
 
-   check the packet received, the flag RTE_MBUF_F_RX_IP_CKSUM_GOOD in the packet received
-
-   port=0, mbuf=0x2269df8780, pkt_len=96, nb_segs=1:
-   rx: l2_len=18 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD  RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: flags=RTE_MBUF_F_TX_L4_NO_CKSUM RTE_MBUF_F_TX_IPV4
-
-Send a packet ptypes is IP/TCP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP(chksum=0xf)/TCP()/('X'*50), iface=iface)
-
-   check the packet received, the flag RTE_MBUF_F_RX_IP_CKSUM_BAD in the packet received
-
-   port=0, mbuf=0x2269df7e40, pkt_len=96, nb_segs=1:
-   rx: l2_len=18 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_BAD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: flags=RTE_MBUF_F_TX_L4_NO_CKSUM RTE_MBUF_F_TX_IPV4
-
-Send a packet ptypes is IP/SCTP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/SCTP()/('X'*50), iface=iface)
-
-   check the packet received, the flag RTE_MBUF_F_RX_IP_CKSUM_GOOD in the packet received
-
-   port=0, mbuf=0x2269df8780, pkt_len=96, nb_segs=1:
-   rx: l2_len=18 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD  RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: flags=RTE_MBUF_F_TX_L4_NO_CKSUM RTE_MBUF_F_TX_IPV4
-
-Send a packet ptypes is IP/SCTP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP(chksum=0xf)/SCTP()/('X'*50), iface=iface)
-
-   check the packet received, the flag RTE_MBUF_F_RX_IP_CKSUM_BAD in the packet received
-
-   port=0, mbuf=0x2269df7e40, pkt_len=96, nb_segs=1:
-   rx: l2_len=18 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_BAD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: flags=RTE_MBUF_F_TX_L4_NO_CKSUM RTE_MBUF_F_TX_IPV4
-
-Verify flags are as expected.
-
-Test Case: Hardware Checksum Check L4 TX
-===========================================
-This test involves testing many different scenarios with a L4 checksum.
-A variety of tunneling protocols, L3 protocols and L4 protocols are combined
-to test as many scenarios as possible. Currently, UDP and TCP are used
-as L4 protocols, with IP and IPv6 being used at level 3. The tested tunneling
-protocols are VXLAN and GRE. This test is used to determine whether the
-hardware offloading of checksums works properly.
-
-Setup the ``csum`` forwarding mode::
-
-  testpmd> set fwd csum
-  Set csum packet forwarding mode
-
-Start the packet forwarding::
-
-  testpmd> port stop all
-  testpmd> csum set ip hw 0
-  testpmd> csum set udp hw 0
-  testpmd> csum set tcp hw 0
-  testpmd> csum set sctp hw 0
-  testpmd> port start all
-  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
-
-
-Start a packet capture on the tester in the background::
-
-   # tcpdump -i <iface> -s 65535 -w /tmp/tester/test_hardware_checksum_check_l4_tx_capture.pcap &
-
-Send a packet ptypes is IP/UDP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/UDP(chksum=0xb161)/Raw(load=b'x'), iface=iface)
-
-   port=0, mbuf=0x168d06200, pkt_len=90, nb_segs=1:
-   rx: l2_len=14 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=20 m->l4_len=8
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV4
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IP/UDP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/UDP(chksum=0xf)/Raw(load=b'x'), iface=iface)
-
-   port=0, mbuf=0x168d06b40, pkt_len=90, nb_segs=1:
-   rx: l2_len=14 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=20 m->l4_len=8
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV4
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IP/TCP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/TCP(chksum=0x4904)/Raw(load=b'x'), iface=iface)
-
-   port=0, mbuf=0x168d07480, pkt_len=102, nb_segs=1:
-   rx: l2_len=14 ethertype=800 l3_len=20 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=20 m->l4_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV4
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IP/TCP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/TCP(chksum=0xf)/Raw(load=b'x'), iface=iface)
-
-   port=0, mbuf=0x168be47c0, pkt_len=102, nb_segs=1:
-   rx: l2_len=14 ethertype=800 l3_len=20 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=20 m->l4_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV4
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IPV6/UDP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPv6()/UDP(chksum=0xaf62)/Raw(load=b'x'), iface=iface)
-
-   port=0, mbuf=0x168be5100, pkt_len=110, nb_segs=1:
-   rx: l2_len=14 ethertype=86dd l3_len=40 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=40 m->l4_len=8
-   tx: flags=RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV6
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IPV6/UDP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPv6()/UDP(chksum=0xf)/Raw(load=b'x'), iface=iface)
-
-   port=0, mbuf=0x168be5a40, pkt_len=110, nb_segs=1:
-   rx: l2_len=14 ethertype=86dd l3_len=40 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=40 m->l4_len=8
-   tx: flags=RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV6
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IPV6/TCP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPv6()/TCP(chksum=0x4705)/Raw(load=b'x'), iface=iface)
-
-   port=0, mbuf=0x168be6380, pkt_len=122, nb_segs=1:
-   rx: l2_len=14 ethertype=86dd l3_len=40 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=40 m->l4_len=20
-   tx: flags=RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV6
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IPV6/TCP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPv6()/TCP(chksum=0xf)/Raw(load=b'x'), iface=iface)
-
-   port=0, mbuf=0x168be6cc0, pkt_len=122, nb_segs=1:
-   rx: l2_len=14 ethertype=86dd l3_len=40 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=40 m->l4_len=20
-   tx: flags=RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV6
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IP/UDP/VXLAN/IP/UDP inner UDP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/UDP()/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IP()/UDP(chksum=0x9949)/Raw(load=b'Y'), iface=iface)
-
-   port=0, mbuf=0x168be7600, pkt_len=140, nb_segs=1:
-   rx: l2_len=30 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=30 m->l3_len=20 m->l4_len=8
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IP/UDP/VXLAN/IP/UDP inner UDP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/UDP()/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IP()/UDP(chksum=0xf)/Raw(load=b'Y'), iface=iface)
-
-   port=0, mbuf=0x168be7600, pkt_len=140, nb_segs=1:
-   rx: l2_len=30 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=30 m->l3_len=20 m->l4_len=8
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IP/UDP/VXLAN/IP/UDP outer UDP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/UDP(chksum=0xf)/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IP()/UDP()/Raw(load=b'Y'), iface=iface)
-
-   port=0, mbuf=0x168be7600, pkt_len=140, nb_segs=1:
-   rx: l2_len=30 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=30 m->l3_len=20 m->l4_len=8
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IP/UDP/VXLAN/IP/UDP inter UDP and outer UDP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/UDP(chksum=0xf)/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IP()/UDP(chksum=0xf)/Raw(load=b'Y'), iface=iface)
-
-   port=0, mbuf=0x168be7600, pkt_len=140, nb_segs=1:
-   rx: l2_len=30 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=30 m->l3_len=20 m->l4_len=8
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IP/UDP/VXLAN/IP/TCP inner TCP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/UDP()/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IP()/TCP(chksum=0x30ec)/Raw(load=b'Y'), iface=iface)
-
-   port=0, mbuf=0x168d058c0, pkt_len=152, nb_segs=1:
-   rx: l2_len=30 ethertype=800 l3_len=20 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=30 m->l3_len=20 m->l4_len=20
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IP/UDP/VXLAN/IP/TCP inner TCP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/UDP()/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IP()/TCP(chksum=0xf)/Raw(load=b'Y'), iface=iface)
-
-   port=0, mbuf=0x168d04f80, pkt_len=152, nb_segs=1:
-   rx: l2_len=30 ethertype=800 l3_len=20 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=30 m->l3_len=20 m->l4_len=20
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IP/UDP/VXLAN/IP/TCP outer UDP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/UDP(chksum=0xf)/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IP()/TCP()/Raw(load=b'Y'), iface=iface)
-
-   port=0, mbuf=0x168d04640, pkt_len=152, nb_segs=1:
-   rx: l2_len=30 ethertype=800 l3_len=20 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=30 m->l3_len=20 m->l4_len=20
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IP/UDP/VXLAN/IP/TCP outer UDP and inner TCP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/UDP(chksum=0xf)/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IP()/TCP(chksum=0xf)/Raw(load=b'Y'), iface=iface)
-
-   port=0, mbuf=0x168d03d00, pkt_len=152, nb_segs=1:
-   rx: l2_len=30 ethertype=800 l3_len=20 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=30 m->l3_len=20 m->l4_len=20
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IPV6/UDP/VXLAN/IPV6/UDP inner UDP with a good checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPV6()/UDP()/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IPV6()/UDP(chksum=0x9949)/Raw(load=b'Y'), iface=iface)
-
-   port=0, mbuf=0x168d033c0, pkt_len=180, nb_segs=1:
-   rx: l2_len=30 ethertype=86dd l3_len=40 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=86dd outer_l3_len=40
-   tx: m->l2_len=30 m->l3_len=40 m->l4_len=8
-   tx: m->outer_l2_len=14 m->outer_l3_len=40
-   tx: flags=RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV6 RTE_MBUF_F_TX_OUTER_IPV6 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IPV6/UDP/VXLAN/IPV6/UDP inner UDP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPV6()/UDP()/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IPV6()/UDP(chksum=0xf)/Raw(load=b'Y'), iface=iface)
-
-   port=0, mbuf=0x168d02a80, pkt_len=180, nb_segs=1:
-   rx: l2_len=30 ethertype=86dd l3_len=40 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=86dd outer_l3_len=40
-   tx: m->l2_len=30 m->l3_len=40 m->l4_len=8
-   tx: m->outer_l2_len=14 m->outer_l3_len=40
-   tx: flags=RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV6 RTE_MBUF_F_TX_OUTER_IPV6 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IPV6/UDP/VXLAN/IPV6/UDP outer UDP with a bad checksum::
-
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPV6()/UDP(chksum=0xf)/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IPV6()/UDP()/Raw(load=b'Y'), iface=iface)
-
-   port=0, mbuf=0x168d02140, pkt_len=180, nb_segs=1:
-   rx: l2_len=30 ethertype=86dd l3_len=40 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=86dd outer_l3_len=40
-   tx: m->l2_len=30 m->l3_len=40 m->l4_len=8
-   tx: m->outer_l2_len=14 m->outer_l3_len=40
-   tx: flags=RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV6 RTE_MBUF_F_TX_OUTER_IPV6 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
-
-   Inspect the pcap file from the packet capture and verify the checksums.
-
-Send a packet ptypes is IPV6/UDP/VXLAN/IPV6/UDP inter UDP and outer UDP with a bad checksum::
+Test case 5: HW IP + L4 non-tunneling
+=====================================
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPV6()/UDP(chksum=0xf)/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IPV6()/UDP(chksum=0xf)/Raw(load=b'Y'), iface=iface)
+This test is used to test non-tunneling packets and will enable IP and all L4 hw checksum offload.
+Configure the TX HW Offload::
 
-   port=0, mbuf=0x168d01800, pkt_len=180, nb_segs=1:
-   rx: l2_len=30 ethertype=86dd l3_len=40 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=86dd outer_l3_len=40
-   tx: m->l2_len=30 m->l3_len=40 m->l4_len=8
-   tx: m->outer_l2_len=14 m->outer_l3_len=40
-   tx: flags=RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV6 RTE_MBUF_F_TX_OUTER_IPV6 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
+    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::
 
-   Inspect the pcap file from the packet capture and verify the checksums.
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
 
-Send a packet ptypes is IPV6/UDP/VXLAN/IPV6/TCP inner TCP with a good checksum::
+Check for the correct checksum insertion at the correct place.
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPV6()/UDP()/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IPV6()/TCP(chksum=0x30ec)/Raw(load=b'Y'), iface=iface)
+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
 
-   port=0, mbuf=0x168d00ec0, pkt_len=192, nb_segs=1:
-   rx: l2_len=30 ethertype=86dd l3_len=40 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=86dd outer_l3_len=40
-   tx: m->l2_len=30 m->l3_len=40 m->l4_len=20
-   tx: m->outer_l2_len=14 m->outer_l3_len=40
-   tx: flags=RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV6 RTE_MBUF_F_TX_OUTER_IPV6 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum::
 
-   Inspect the pcap file from the packet capture and verify the checksums.
+    CSUM NON-TUNNEL VLAN PACKETS
 
-Send a packet ptypes is IPV6/UDP/VXLAN/IPV6/TCP inner TCP with a bad checksum::
+Check for the correct checksum insertion at the correct place.
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPV6()/UDP()/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IPV6()/TCP(chksum=0xf)/Raw(load=b'Y'), iface=iface)
 
-   port=0, mbuf=0x168d00580, pkt_len=192, nb_segs=1:
-   rx: l2_len=30 ethertype=86dd l3_len=40 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=86dd outer_l3_len=40
-   tx: m->l2_len=30 m->l3_len=40 m->l4_len=20
-   tx: m->outer_l2_len=14 m->outer_l3_len=40
-   tx: flags=RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV6 RTE_MBUF_F_TX_OUTER_IPV6 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
+Test case 6: HW Outer-IP tunneling
+==================================
 
-   Inspect the pcap file from the packet capture and verify the checksums.
+This test is used to test tunneling scenario and will enable Outer-IP checksum offload.
+Configure the TX HW Offload::
 
-Send a packet ptypes is IPV6/UDP/VXLAN/IPV6/TCP outer UDP with a bad checksum::
+    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
+    rx_vxlan_port add 4789 0
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum::
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPV6()/UDP(chksum=0xf)/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IPV6()/TCP()/Raw(load=b'Y'), iface=iface)
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
 
-   port=0, mbuf=0x168cffc40, pkt_len=192, nb_segs=1:
-   rx: l2_len=30 ethertype=86dd l3_len=40 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=86dd outer_l3_len=40
-   tx: m->l2_len=30 m->l3_len=40 m->l4_len=20
-   tx: m->outer_l2_len=14 m->outer_l3_len=40
-   tx: flags=RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV6 RTE_MBUF_F_TX_OUTER_IPV6 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
+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::
 
-   Inspect the pcap file from the packet capture and verify the checksums.
+    CSUM TUNNEL PACKETS (common packets for common DDP)
+    CSUM TUNNEL VLAN PACKETS (for i40e and ice, common packets for common DDP)
 
-Send a packet ptypes is IPV6/UDP/VXLAN/IPV6/TCP outer UDP and inner TCP with a bad checksum::
+Check for the correct checksum insertion at the correct place.
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPV6()/UDP(chksum=0xf)/VXLAN()/
-   Ether(dst='ff:ff:ff:ff:ff:ff', src='00:00:00:00:00:00')/IPV6()/TCP(chksum=0xf)/Raw(load=b'Y'), iface=iface)
 
-   port=0, mbuf=0x168cff300, pkt_len=192, nb_segs=1:
-   rx: l2_len=30 ethertype=86dd l3_len=40 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=86dd outer_l3_len=40
-   tx: m->l2_len=30 m->l3_len=40 m->l4_len=20
-   tx: m->outer_l2_len=14 m->outer_l3_len=40
-   tx: flags=RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV6 RTE_MBUF_F_TX_OUTER_IPV6 RTE_MBUF_F_TX_TUNNEL_VXLAN RTE_MBUF_F_TX_OUTER_UDP_CKSUM
+Test case 7: HW Outer-UDP tunneling
+===================================
 
-   Inspect the pcap file from the packet capture and verify the checksums.
+This test is used to test tunneling scenario and will enable Outer-UDP checksum offload.
+Configure the TX HW Offload::
 
-Send a packet ptypes is IP/GRE/IP/UDP inner UDP with a good checksum::
+    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
+    rx_vxlan_port add 4789 0
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum::
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/GRE()/IP()/UDP(chksum=0x8131)/Raw(load=b'Z'), iface=iface)
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
 
-   port=0, mbuf=0x168cfe9c0, pkt_len=114, nb_segs=1:
-   rx: l2_len=4 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=4 m->l3_len=20 m->l4_len=8
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_GRE
+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::
 
-   Inspect the pcap file from the packet capture and verify the checksums.
+    CSUM TUNNEL PACKETS (common packets for common DDP)
+    CSUM TUNNEL VLAN PACKETS (for i40e and ice, common packets for common DDP)
 
-Send a packet ptypes is IP/GRE/IP/UDP inner UDP with a bad checksum::
+Check for the correct checksum insertion at the correct place.
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/GRE()/IP()/UDP(chksum=0xf)/Raw(load=b'Z'), iface=iface)
 
-   port=0, mbuf=0x168cfe080, pkt_len=114, nb_segs=1:
-   rx: l2_len=4 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=4 m->l3_len=20 m->l4_len=8
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_GRE
+Test case 8: HW Outer-IP + Outer-UDP tunneling with SW Inner (w/o VLAN)
+=======================================================================
 
-   Inspect the pcap file from the packet capture and verify the checksums.
+This test is used to test tunneling scenario and will enable Outer-IP and Outer-UDP checksum offload.
+Configure the TX HW Offload::
 
-Send a packet ptypes is IP/GRE/IP/TCP inner TCP with a good checksum::
+    csum set outer-ip hw 1
+    csum set outer-udp hw 1
+    csum parse-tunnel on 1
+    rx_vxlan_port add 4789 0
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum::
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/GRE()/IP()/TCP(chksum=0x18d4)/Raw(load=b'Z'), iface=iface)
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
 
-   port=0, mbuf=0x168cfd740, pkt_len=126, nb_segs=1:
-   rx: l2_len=4 ethertype=800 l3_len=20 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=4 m->l3_len=20 m->l4_len=20
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_GRE
+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::
 
-   Inspect the pcap file from the packet capture and verify the checksums.
+    CSUM TUNNEL PACKETS (common packets for common DDP)
+    CSUM TUNNEL VLAN PACKETS (for i40e and ice, common packets for common DDP)
 
-Send a packet ptypes is IP/GRE/IP/TCP inner TCP with a bad checksum::
+Check for the correct checksum insertion at the correct place.
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP()/GRE()/IP()/TCP(chksum=0xf)/Raw(load=b'Z'), iface=iface)
+For PMD not supporting VLAN defaultly, we run an extra case::
+    
+    csum set outer-ip hw 1
+    csum set outer-udp hw 1
+    csum parse-tunnel on 1
+    vlan set filter on 0
+    rx_vlan add 100 0
 
-   port=0, mbuf=0x168cfce00, pkt_len=126, nb_segs=1:
-   rx: l2_len=4 ethertype=800 l3_len=20 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=4 m->l3_len=20 m->l4_len=20
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_GRE
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum::
 
-   Inspect the pcap file from the packet capture and verify the checksums.
+    CSUM NON-TUNNEL VLAN PACKETS
 
-Send a packet ptypes is IPV6/GRE/IPV6/UDP inner UDP with a good checksum::
+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::
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPV6()/GRE()/IPV6()/UDP(chksum=0x8131)/Raw(load=b'Z'), iface=iface)
+    CSUM TUNNEL VLAN PACKETS
 
-   port=0, mbuf=0x168cfe9c0, pkt_len=114, nb_segs=1:
-   rx: l2_len=4 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=4 m->l3_len=20 m->l4_len=8
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_GRE
+Check for the correct checksum insertion at the correct place.
 
-   Inspect the pcap file from the packet capture and verify the checksums.
 
-Send a packet ptypes is IPV6/GRE/IPV6/UDP inner UDP with a bad checksum::
+Test case 9: HW Outer-IP + Outer-UDP tunneling with HW Inner (w/o VLAN, w/o AVX512)
+===================================================================================
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPV6()/GRE()/IPV6()/UDP(chksum=0xf)/Raw(load=b'Z'), iface=iface)
+Test for both default path and for AVX512 path by adding EAL Parameter '--force-max-simd-bitwidth=512'.
 
-   port=0, mbuf=0x168cfe080, pkt_len=114, nb_segs=1:
-   rx: l2_len=4 ethertype=800 l3_len=20 l4_proto=17 l4_len=8 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=4 m->l3_len=20 m->l4_len=8
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_UDP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_GRE
+This test is used to test tunneling scenario and will enable Outer-IP and Outer-UDP checksum offload.
+Configure the TX HW Offload::
 
-   Inspect the pcap file from the packet capture and verify the checksums.
+    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
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum::
 
-Send a packet ptypes is IPV6/GRE/IPV6/TCP inner TCP with a good checksum::
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPV6()/GRE()/IPV6()/TCP(chksum=0x18d4)/Raw(load=b'Z'), iface=iface)
+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::
 
-   port=0, mbuf=0x168cfd740, pkt_len=126, nb_segs=1:
-   rx: l2_len=4 ethertype=800 l3_len=20 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=4 m->l3_len=20 m->l4_len=20
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_GRE
+    CSUM TUNNEL PACKETS (common packets for common DDP)
+    CSUM TUNNEL VLAN PACKETS (for i40e and ice, common packets for common DDP)
 
-   Inspect the pcap file from the packet capture and verify the checksums.
+Check for the correct checksum insertion at the correct place.
 
-Send a packet ptypes is IPV6/GRE/IPV6/TCP inner TCP with a bad checksum::
+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
+    csum set outer-ip hw 1
+    csum set outer-udp hw 1
+    csum parse-tunnel on 1
+    vlan set filter on 0
+    rx_vlan add 100 0
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IPV6()/GRE()/IPV6()/TCP(chksum=0xf)/Raw(load=b'Z'), iface=iface)
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum::
 
-   port=0, mbuf=0x168cfce00, pkt_len=126, nb_segs=1:
-   rx: l2_len=4 ethertype=800 l3_len=20 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_BAD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   rx: outer_l2_len=14 outer_ethertype=800 outer_l3_len=20
-   tx: m->l2_len=4 m->l3_len=20 m->l4_len=20
-   tx: m->outer_l2_len=14 m->outer_l3_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV4 RTE_MBUF_F_TX_OUTER_IP_CKSUM RTE_MBUF_F_TX_OUTER_IPV4 RTE_MBUF_F_TX_TUNNEL_GRE
+    CSUM NON-TUNNEL VLAN PACKETS
 
-   Inspect the pcap file from the packet capture and verify the checksums.
+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::
 
-Test Case: Hardware Checksum Check L3 TX
-===========================================
-This test involves testing L3 checksum hardware offload.
-Due to the relative dominance of IPv4 and IPv6 as L3 protocols, and IPv6's
-lack of a checksum, only IPv4's checksum is tested.
+    CSUM TUNNEL VLAN PACKETS
 
-Setup the ``csum`` forwarding mode::
+Check for the correct checksum insertion at the correct place.
 
-  testpmd> set fwd csum
-  Set csum packet forwarding mode
 
-Start the packet forwarding::
+Test case 10: SW non-tunneling (w/o VLAN)
+=========================================
 
-  testpmd> port stop all
-  testpmd> csum set ip hw 0
-  testpmd> csum set udp hw 0
-  testpmd> csum set tcp hw 0
-  testpmd> csum set sctp hw 0
-  testpmd> port start all
-  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 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::
 
-Start a packet capture on the tester in the background::
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
 
-   # tcpdump -i <iface> -s 65535 -w /tmp/tester/test_hardware_checksum_check_l3_tx_capture.pcap &
+Check for the correct checksum insertion at the correct place.
 
-Send a packet ptypes is IP/TCP with a good checksum with a 1 in it's payload::
+For PMD not supporting VLAN defaultly, we run an extra case::
+    
+    vlan set filter on 0
+    rx_vlan add 100 0
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP(chksum=0x7ccc)/TCP()/Raw(load=b'1'), iface=iface)
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum::
 
-   port=0, mbuf=0x168d06200, pkt_len=60, nb_segs=1:
-   rx: l2_len=14 ethertype=800 l3_len=20 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_GOOD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=20 m->l4_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV4
+    CSUM NON-TUNNEL VLAN PACKETS
 
-   Inspect the pcap file from the packet capture and verify the checksums.
+Check for the correct checksum insertion at the correct place.
 
-Send a packet ptypes is IP/TCP with a bad checksum with a 0 in it's payload::
 
-   sendp(Ether(dst='23:00:00:00:00:00', src='52:00:00:00:00:00')/IP(chksum=0xf)/TCP()/Raw(load=b'1'), iface=iface)
+Test case 11: SW tunneling (w/o VLAN, w/o AVX512)
+=================================================
 
-   port=0, mbuf=0x168d06b40, pkt_len=60, nb_segs=1:
-   rx: l2_len=14 ethertype=800 l3_len=20 l4_proto=6 l4_len=20 flags=RTE_MBUF_F_RX_L4_CKSUM_GOOD RTE_MBUF_F_RX_IP_CKSUM_BAD RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN
-   tx: m->l2_len=14 m->l3_len=20 m->l4_len=20
-   tx: flags=RTE_MBUF_F_TX_IP_CKSUM RTE_MBUF_F_TX_TCP_CKSUM RTE_MBUF_F_TX_IPV4
+Test for both default path and for AVX512 path by adding EAL Parameter '--force-max-simd-bitwidth=512'.
 
-   Inspect the pcap file from the packet capture and verify the checksums.
+This test is used to test tunneling scenario and will enable no checksum offload.
+Configure the TX HW Offload::
 
-Test Case: checksum offload with vlan
-=====================================
+    csum parse-tunnel on 1
+    rx_vxlan_port add 4789 0
+    
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum::
 
-Setup the ``csum`` forwarding mode::
+    CSUM NON-TUNNEL PACKETS
+    CSUM NON-TUNNEL VLAN PACKETS (for i40e and ice)
 
-  testpmd> set fwd csum
-  Set csum packet forwarding mode
+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::
 
-Enable the IPv4/UDP/TCP/SCTP checksum offload on port 0::
+    CSUM TUNNEL PACKETS (common packets for common DDP)
+    CSUM TUNNEL VLAN PACKETS (for i40e and ice, common packets for common DDP)
 
-  testpmd> port stop all
-  testpmd> csum set ip hw 0
-  testpmd> csum set udp hw 0
-  testpmd> csum set tcp hw 0
-  testpmd> csum set sctp hw 0
-  testpmd> port start all
-  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
+Check for the correct checksum insertion at the correct place.
 
-Start a packet capture on the tester in the background::
+For PMD not supporting VLAN defaultly, we run an extra case::
+    
+    csum parse-tunnel on 1
+    vlan set filter on 0
+    rx_vlan add 100 0
 
-   tcpdump -i <iface> -s 65535 -w /tmp/tester/test_checksum_capture.pcap &
+Send packets of below with bad IP checksum, bad L4 checksum, bad all checksum, good all checksum::
 
-Send the following multiple packets from tester for with scapy 
-combination: IPv4/UDP, IPv4/TCP, IPv6/UDP, IPv6/TCP::
+    CSUM NON-TUNNEL VLAN PACKETS
 
-   sendp([Ether(dst="52:00:00:00:00:01", src="52:00:00:00:00:00")/Dot1Q(vlan=1)/IP(chksum=0x0)/UDP(chksum=0xf)/("X"*46),
-   Ether(dst="52:00:00:00:00:01", src="52:00:00:00:00:00")/Dot1Q(vlan=1)/IP(chksum=0x0)/TCP(chksum=0xf)/("X"*46),
-   Ether(dst="52:00:00:00:00:01", src="52:00:00:00:00:00")/Dot1Q(vlan=1)/IP(chksum=0x0)/SCTP(chksum=0x0)/("X"*48),
-   Ether(dst="52:00:00:00:00:01", src="52:00:00:00:00:00")/Dot1Q(vlan=1)/IPv6(src="::1")/UDP(chksum=0xf)/("X"*46),
-   Ether(dst="52:00:00:00:00:01", src="52:00:00:00:00:00")/Dot1Q(vlan=1)/IPv6(src="::1")/TCP(chksum=0xf)/("X"*46)],
-   iface="ens192f0",count=4,inter=0,verbose=False)
+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::
 
-Then verify that the same number of packet are correctly received on the tester. 
+    CSUM TUNNEL VLAN PACKETS
 
-Inspect the pcap file from the packet capture and verify the checksums.
+Check for the correct checksum insertion at the correct place.
