* [DTS][PATCH V4 0/5] add vf checksum offload and tso case for tunnel packets.
@ 2022-12-22 9:37 Ke Xu
2022-12-22 9:37 ` [DTS][PATCH V4 1/5] tests/vf_offload: fix 2 typos and a bug Ke Xu
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Ke Xu @ 2022-12-22 9:37 UTC (permalink / raw)
To: dts; +Cc: weiyuanx.li, qi.fu, lijuan.tu, Ke Xu
In DPDK 22.11, checksum offload for inner and outer checksum for tunnel packets
and tunnel tso is supported. This patch is to support validation these packets.
This patch also fix typos and bugs in previous cases.
Ke Xu, Weiyuan Li (5):
tests/vf_offload: fix 2 typos and a bug.
tests/vf_offload: add vf checksum hw offload case for tunneling
packets.
tests/vf_offload: add vf tso case for tunneling packets.
tests/vf_offload: dts adaptation DPDK checksum function changes
tests/vf_offload: add new method to anayse tunnel packets.
tests/TestSuite_vf_offload.py | 448 +++++++++++++++++++++++++++++++++-
1 file changed, 438 insertions(+), 10 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [DTS][PATCH V4 1/5] tests/vf_offload: fix 2 typos and a bug.
2022-12-22 9:37 [DTS][PATCH V4 0/5] add vf checksum offload and tso case for tunnel packets Ke Xu
@ 2022-12-22 9:37 ` Ke Xu
2022-12-22 9:37 ` [DTS][PATCH V4 2/5] tests/vf_offload: add vf checksum hw offload case for tunneling packets Ke Xu
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Ke Xu @ 2022-12-22 9:37 UTC (permalink / raw)
To: dts; +Cc: weiyuanx.li, qi.fu, lijuan.tu, Ke Xu
Checksum is wrongly spelled as checksup.
Finally is wrongly spelled as fially.
String formating is wrongly put out
side of the function call.
Signed-off-by: Ke Xu <ke1.xu@intel.com>
---
tests/TestSuite_vf_offload.py | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/tests/TestSuite_vf_offload.py b/tests/TestSuite_vf_offload.py
index 75c75f05..55d0ae85 100644
--- a/tests/TestSuite_vf_offload.py
+++ b/tests/TestSuite_vf_offload.py
@@ -265,7 +265,7 @@ class TestVfOffload(TestCase):
(
ip_checksum,
tcp_checksum,
- udp_checksup,
+ udp_checksum,
sctp_checksum,
) = packet_received.split(";")
print(
@@ -273,8 +273,8 @@ class TestVfOffload(TestCase):
ip_checksum,
"tcp_checksum:, ",
tcp_checksum,
- "udp_checksup: ",
- udp_checksup,
+ "udp_checksum: ",
+ udp_checksum,
"sctp_checksum: ",
sctp_checksum,
)
@@ -284,9 +284,9 @@ class TestVfOffload(TestCase):
if tcp_checksum != "??":
packet_type = "TCP"
l4_checksum = tcp_checksum
- elif udp_checksup != "??":
+ elif udp_checksum != "??":
packet_type = "UDP"
- l4_checksum = udp_checksup
+ l4_checksum = udp_checksum
elif sctp_checksum != "??":
packet_type = "SCTP"
l4_checksum = sctp_checksum
@@ -435,7 +435,7 @@ class TestVfOffload(TestCase):
command = ("tcpdump -w tcpdump_{0}.pcap -i {0} 2>tcpdump_{0}.out &").format(
iface
)
- self.tester.send_expect("rm -f tcpdump_{0}.pcap", "#").format(iface)
+ self.tester.send_expect("rm -f tcpdump_{0}.pcap".format(iface), "#")
self.tester.send_expect(command, "#")
def tcpdump_stop_sniff(self):
@@ -474,8 +474,8 @@ class TestVfOffload(TestCase):
Execute scanner to return results
"""
scanner_result = self.tester.send_expect(scanner, "#")
- fially_result = re.findall(r"length( \d+)", scanner_result)
- return list(fially_result)
+ finally_result = re.findall(r"length( \d+)", scanner_result)
+ return list(finally_result)
def number_of_bytes(self, iface):
"""
--
2.25.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [DTS][PATCH V4 2/5] tests/vf_offload: add vf checksum hw offload case for tunneling packets.
2022-12-22 9:37 [DTS][PATCH V4 0/5] add vf checksum offload and tso case for tunnel packets Ke Xu
2022-12-22 9:37 ` [DTS][PATCH V4 1/5] tests/vf_offload: fix 2 typos and a bug Ke Xu
@ 2022-12-22 9:37 ` Ke Xu
2022-12-22 9:37 ` [DTS][PATCH V4 3/5] tests/vf_offload: add vf tso " Ke Xu
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Ke Xu @ 2022-12-22 9:37 UTC (permalink / raw)
To: dts; +Cc: weiyuanx.li, qi.fu, lijuan.tu, Ke Xu
In DPDK 22.11, tunneling packets checksum offload for inner and outer checksum is supported.
This case supporting validation these packets.
Signed-off-by: Weiyuan Li <weiyuanx.li@intel.com>
Signed-off-by: Ke Xu <ke1.xu@intel.com>
---
tests/TestSuite_vf_offload.py | 214 +++++++++++++++++++++++++++++++++-
1 file changed, 212 insertions(+), 2 deletions(-)
diff --git a/tests/TestSuite_vf_offload.py b/tests/TestSuite_vf_offload.py
index 55d0ae85..a6d61e47 100644
--- a/tests/TestSuite_vf_offload.py
+++ b/tests/TestSuite_vf_offload.py
@@ -1,5 +1,5 @@
# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2020 Intel Corporation
+# Copyright(c) 2020-2022 Intel Corporation
#
import re
@@ -10,7 +10,7 @@ import framework.utils as utils
from framework.crb import Crb
from framework.pmd_output import PmdOutput
from framework.settings import DPDK_DCFMODE_SETTING, HEADER_SIZE, load_global_setting
-from framework.test_case import TestCase
+from framework.test_case import TestCase, check_supported_nic, skip_unsupported_pkg
from framework.utils import GREEN, RED
from framework.virt_common import VM
from nics.net_device import NetDevice
@@ -196,6 +196,18 @@ class TestVfOffload(TestCase):
dut.send_expect("csum set sctp hw %d" % port, "testpmd>")
dut.send_expect("port start all", "testpmd>")
+ def checksum_enablehw_tunnel(self, port, dut):
+ dut.send_expect("port stop %d" % port, "testpmd>")
+ dut.send_expect("csum set ip hw %d" % port, "testpmd>")
+ dut.send_expect("csum set udp hw %d" % port, "testpmd>")
+ dut.send_expect("csum set tcp hw %d" % port, "testpmd>")
+ dut.send_expect("csum set sctp hw %d" % port, "testpmd>")
+ dut.send_expect("csum set outer-ip hw %d" % port, "testpmd>")
+ dut.send_expect("csum set outer-udp hw %d" % port, "testpmd>")
+ dut.send_expect("csum parse-tunnel on %d" % port, "testpmd>")
+ dut.send_expect("rx_vxlan_port add 4789 %d" % port, "testpmd>")
+ dut.send_expect("port start %d" % port, "testpmd>")
+
def checksum_enablesw(self, port, dut):
dut.send_expect("port stop all", "testpmd>")
dut.send_expect("csum set ip sw %d" % port, "testpmd>")
@@ -365,6 +377,204 @@ class TestVfOffload(TestCase):
self.verify(len(result) == 0, ",".join(list(result.values())))
+ def checksum_validate_tunnel(self, packets_sent, packets_expected):
+ """
+ Validate the checksum.
+ """
+ tx_interface = self.tester.get_interface(
+ self.tester.get_local_port(self.dut_ports[0])
+ )
+ rx_interface = self.tester.get_interface(
+ self.tester.get_local_port(self.dut_ports[1])
+ )
+ sniff_src = self.vm0_testpmd.get_port_mac(0)
+ checksum_pattern = re.compile("chksum.*=.*(0x[0-9a-z]+)")
+ sniff_src = "52:00:00:00:00:00"
+ chksum = dict()
+ # self.tester.send_expect("scapy", ">>> ")
+
+ for packet_type in list(packets_expected.keys()):
+ self.tester.send_expect("scapy", ">>> ")
+ self.tester.send_expect("p = %s" % packets_expected[packet_type], ">>>")
+ out = self.tester.send_expect("p.show2()", ">>>")
+ chksums = checksum_pattern.findall(out)
+ expected_chksum = chksums
+ chksum[packet_type] = chksums
+ print(packet_type, ": ", chksums)
+
+ self.tester.send_expect("exit()", "#")
+
+ self.tester.scapy_background()
+ inst = self.tester.tcpdump_sniff_packets(
+ intf=rx_interface,
+ count=len(packets_sent),
+ filters=[{"layer": "ether", "config": {"src": sniff_src}}],
+ )
+
+ # Send packet.
+ self.tester.scapy_foreground()
+
+ self.tester.scapy_append(
+ 'sendp([%s], iface="%s")' % (packets_sent[packet_type], tx_interface)
+ )
+ self.tester.scapy_execute()
+ out = self.tester.scapy_get_result()
+ p = self.tester.load_tcpdump_sniff_packets(inst)
+ nr_packets = len(p)
+ print(p)
+ packets_received = [
+ p[i].sprintf(
+ "%IP.chksum%;%UDP.chksum%;%IP:2.chksum%;%UDP:2.chksum%;%TCP.chksum%;%SCTP.chksum%"
+ )
+ for i in range(nr_packets)
+ ]
+
+ packets_received = [
+ item
+ for item in packets_received[0].replace("??", "").split(";")
+ if item != ""
+ ]
+ self.logger.debug(f"packets_received=>{packets_received}")
+ self.logger.debug(f"expected_chksum=>{expected_chksum}")
+ self.verify(
+ len(expected_chksum) == len(packets_received),
+ f"The chksum type {packet_type} length of the actual result is inconsistent with the expected length!",
+ )
+ self.verify(
+ packets_received == expected_chksum,
+ f"The actually received chksum {packet_type} is inconsistent with the expectation",
+ )
+
+ @check_supported_nic(
+ ["ICE_100G-E810C_QSFP", "ICE_25G-E810C_SFP", "ICE_25G-E810_XXV_SFP"]
+ )
+ @skip_unsupported_pkg(["os default"])
+ def test_checksum_offload_tunnel_enable(self):
+ """
+ Enable HW checksum offload.
+ Send packet with inner and outer incorrect checksum,
+ can rx it and report the checksum error,
+ verify forwarded packets have correct checksum.
+ """
+ self.launch_testpmd(
+ dcf_flag=self.dcf_mode,
+ param="--portmask=%s " % (self.portMask) + "--enable-rx-cksum " + "",
+ )
+ self.vm0_testpmd.execute_cmd("set fwd csum")
+ self.vm0_testpmd.execute_cmd("set promisc 1 on")
+ self.vm0_testpmd.execute_cmd("set promisc 0 on")
+ self.vm0_testpmd.execute_cmd("csum mac-swap off 0", "testpmd>")
+ self.vm0_testpmd.execute_cmd("csum mac-swap off 1", "testpmd>")
+ time.sleep(2)
+ port_id_0 = 0
+ mac = self.vm0_testpmd.get_port_mac(0)
+ sndIP = "10.0.0.1"
+ sndIPv6 = "::1"
+ expIP = sndIP
+ expIPv6 = sndIPv6
+
+ pkts_outer = {
+ "IP/UDP/VXLAN-GPE": f'IP(src = "{sndIP}") / UDP(sport = 4790, dport = 4790, chksum = 0xff) / VXLAN()',
+ "IP/UDP/VXLAN-GPE/ETH": f'IP(src = "{sndIP}") / UDP(sport = 4790, dport = 4790, chksum = 0xff) / VXLAN() / Ether()',
+ "IPv6/UDP/VXLAN-GPE": f'IPv6(src = "{sndIPv6}") / UDP(sport = 4790, dport = 4790, chksum = 0xff) / VXLAN()',
+ "IPv6/UDP/VXLAN-GPE/ETH": f'IPv6(src = "{sndIPv6}") / UDP(sport = 4790, dport = 4790, chksum = 0xff) / VXLAN() / Ether()',
+ "IP/GRE": f'IP(src = "{sndIP}", proto = 47, chksum = 0xff) / GRE()',
+ "IP/GRE/ETH": f'IP(src = "{sndIP}", proto = 47, chksum = 0xff) / GRE() / Ether()',
+ "IP/NVGRE/ETH": f'IP(src = "{sndIP}", proto = 47, chksum = 0xff) / GRE(key_present=1, proto=0x6558, key=0x00000100) / Ether()',
+ "IPv6/GRE": f'IPv6(src = "{sndIPv6}", nh = 47) / GRE()',
+ "IPv6/GRE/ETH": f'IPv6(src = "{sndIPv6}", nh = 47) / GRE() / Ether()',
+ "IPv6/NVGRE/ETH": f'IPv6(src = "{sndIPv6}", nh = 47) / GRE(key_present=1, proto=0x6558, key=0x00000100) / Ether()',
+ "IP/UDP/GTPU": f'IP(src = "{sndIP}", chksum = 0xff) / UDP(dport = 2152, chksum = 0xff) / GTP_U_Header(gtp_type=255, teid=0x123456)',
+ "IPv6/UDP/GTPU": f'IPv6(src = "{sndIPv6}") / UDP(dport = 2152, chksum = 0xff) / GTP_U_Header(gtp_type=255, teid=0x123456)',
+ }
+ pkts_inner = {
+ "IP/UDP": f'IP(src = "{sndIP}", chksum = 0xff) / UDP(sport = 29999, dport = 30000, chksum = 0xff) / Raw("x" * 100)',
+ "IP/TCP": f'IP(src = "{sndIP}", chksum = 0xff) / TCP(sport = 29999, dport = 30000, chksum = 0xff) / Raw("x" * 100)',
+ "IP/SCTP": f'IP(src = "{sndIP}", chksum = 0xff) / SCTP(sport = 29999, dport = 30000, chksum = 0x0) / Raw("x" * 128)',
+ "IPv6/UDP": f'IPv6(src = "{sndIPv6}") / UDP(sport = 29999, dport = 30000, chksum = 0xff) / Raw("x" * 100)',
+ "IPv6/TCP": f'IPv6(src = "{sndIPv6}") / TCP(sport = 29999, dport = 30000, chksum = 0xff) / Raw("x" * 100)',
+ "IPv6/SCTP": f'IPv6(src = "{sndIPv6}") / SCTP(sport = 29999, dport = 30000, chksum = 0x0) / Raw("x" * 128)',
+ }
+
+ if self.dcf_mode == "enable":
+ pkts_outer[
+ "IP/UDP/VXLAN/ETH"
+ ] = f'IP(src = "{sndIP}") / UDP(sport = 4789, dport = 4789, chksum = 0xff) / VXLAN() / Ether()'
+ pkts_outer[
+ "IPv6/UDP/VXLAN/ETH"
+ ] = f'IPv6(src = "{sndIPv6}") / UDP(sport = 4789, dport = 4789, chksum = 0xff) / VXLAN() / Ether()'
+
+ pkts = {
+ key_outer
+ + "/"
+ + key_inner: f'Ether(dst="{mac}", src="52:00:00:00:00:00") / '
+ + p_outer
+ + " / "
+ + p_inner
+ for key_outer, p_outer in pkts_outer.items()
+ for key_inner, p_inner in pkts_inner.items()
+ }
+
+ pkts_outer_ref = {
+ "IP/UDP/VXLAN-GPE": f'IP(src = "{expIP}") / UDP(sport = 4790, dport = 4790) / VXLAN()',
+ "IP/UDP/VXLAN-GPE/ETH": f'IP(src = "{expIP}") / UDP(sport = 4790, dport = 4790) / VXLAN() / Ether()',
+ "IPv6/UDP/VXLAN-GPE": f'IPv6(src = "{expIPv6}") / UDP(sport = 4790, dport = 4790) / VXLAN()',
+ "IPv6/UDP/VXLAN-GPE/ETH": f'IPv6(src = "{expIPv6}") / UDP(sport = 4790, dport = 4790) / VXLAN() / Ether()',
+ "IP/GRE": f'IP(src = "{expIP}", proto = 47) / GRE()',
+ "IP/GRE/ETH": f'IP(src = "{expIP}", proto = 47) / GRE() / Ether()',
+ "IP/NVGRE/ETH": f'IP(src = "{expIP}", proto = 47) / GRE(key_present=1, proto=0x6558, key=0x00000100) / Ether()',
+ "IPv6/GRE": f'IPv6(src = "{expIPv6}", nh = 47) / GRE()',
+ "IPv6/GRE/ETH": f'IPv6(src = "{expIPv6}", nh = 47) / GRE() / Ether()',
+ "IPv6/NVGRE/ETH": f'IPv6(src = "{expIPv6}", nh = 47) / GRE(key_present=1, proto=0x6558, key=0x00000100) / Ether()',
+ "IP/UDP/GTPU": f'IP(src = "{expIP}") / UDP(dport = 2152) / GTP_U_Header(gtp_type=255, teid=0x123456)',
+ "IPv6/UDP/GTPU": f'IPv6(src = "{expIPv6}") / UDP(dport = 2152) / GTP_U_Header(gtp_type=255, teid=0x123456)',
+ }
+ pkts_inner_ref = {
+ "IP/UDP": f'IP(src = "{expIP}") / UDP(sport = 29999, dport = 30000) / Raw("x" * 100)',
+ "IP/TCP": f'IP(src = "{expIP}") / TCP(sport = 29999, dport = 30000) / Raw("x" * 100)',
+ "IP/SCTP": f'IP(src = "{expIP}") / SCTP(sport = 29999, dport = 30000) / Raw("x" * 128)',
+ "IPv6/UDP": f'IPv6(src = "{expIPv6}") / UDP(sport = 29999, dport = 30000) / Raw("x" * 100)',
+ "IPv6/TCP": f'IPv6(src = "{expIPv6}") / TCP(sport = 29999, dport = 30000) / Raw("x" * 100)',
+ "IPv6/SCTP": f'IPv6(src = "{expIPv6}") / SCTP(sport = 29999, dport = 30000) / Raw("x" * 128)',
+ }
+
+ if self.dcf_mode == "enable":
+ pkts_outer_ref[
+ "IP/UDP/VXLAN/ETH"
+ ] = f'IP(src = "{sndIP}") / UDP(sport = 4789, dport = 4789) / VXLAN() / Ether()'
+ pkts_outer_ref[
+ "IPv6/UDP/VXLAN/ETH"
+ ] = f'IPv6(src = "{sndIPv6}") / UDP(sport = 4789, dport = 4789) / VXLAN() / Ether()'
+
+ pkts_ref = {
+ key_outer
+ + "/"
+ + key_inner: f'Ether(dst="{mac}", src="52:00:00:00:00:00") / '
+ + p_outer
+ + " / "
+ + p_inner
+ for key_outer, p_outer in pkts_outer_ref.items()
+ for key_inner, p_inner in pkts_inner_ref.items()
+ }
+
+ self.checksum_enablehw_tunnel(0, self.vm_dut_0)
+ self.checksum_enablehw_tunnel(1, self.vm_dut_0)
+
+ self.vm0_testpmd.execute_cmd("start")
+ self.vm0_testpmd.wait_link_status_up(0)
+ self.vm0_testpmd.wait_link_status_up(1)
+ self.checksum_validate_tunnel(pkts, pkts_ref)
+ # Validate checksum on the receive packet
+ out = self.vm0_testpmd.execute_cmd("stop")
+ bad_outer_ipcsum = self.vm0_testpmd.get_pmd_value("Bad-outer-ipcsum:", out)
+ bad_outer_l4csum = self.vm0_testpmd.get_pmd_value("Bad-outer-l4csum:", out)
+ bad_inner_ipcsum = self.vm0_testpmd.get_pmd_value("Bad-ipcsum:", out)
+ bad_inner_l4csum = self.vm0_testpmd.get_pmd_value("Bad-l4csum:", out)
+ self.verify(bad_outer_ipcsum == 42, "Bad-outer-ipcsum check error")
+ self.verify(bad_outer_l4csum == 66, "Bad-outer-l4csum check error")
+ self.verify(bad_inner_ipcsum == 42, "Bad-ipcsum check error")
+ self.verify(bad_inner_l4csum == 84, "Bad-l4csum check error")
+
def test_checksum_offload_disable(self):
"""
Enable SW checksum offload.
--
2.25.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [DTS][PATCH V4 3/5] tests/vf_offload: add vf tso case for tunneling packets.
2022-12-22 9:37 [DTS][PATCH V4 0/5] add vf checksum offload and tso case for tunnel packets Ke Xu
2022-12-22 9:37 ` [DTS][PATCH V4 1/5] tests/vf_offload: fix 2 typos and a bug Ke Xu
2022-12-22 9:37 ` [DTS][PATCH V4 2/5] tests/vf_offload: add vf checksum hw offload case for tunneling packets Ke Xu
@ 2022-12-22 9:37 ` Ke Xu
2022-12-22 9:37 ` [DTS][PATCH V4 4/5] tests/vf_offload: dts adaptation DPDK checksum function changes Ke Xu
2022-12-22 9:37 ` [DTS][PATCH V4 5/5] tests/vf_offload: add new method to anayse tunnel packets Ke Xu
4 siblings, 0 replies; 6+ messages in thread
From: Ke Xu @ 2022-12-22 9:37 UTC (permalink / raw)
To: dts; +Cc: weiyuanx.li, qi.fu, lijuan.tu, Ke Xu
In DPDK 22.11, tunneling tso is supported.
This case supporting validation these packets.
Signed-off-by: Weiyuan Li <weiyuanx.li@intel.com>
Signed-off-by: Ke Xu <ke1.xu@intel.com>
---
tests/TestSuite_vf_offload.py | 186 ++++++++++++++++++++++++++++++++++
1 file changed, 186 insertions(+)
diff --git a/tests/TestSuite_vf_offload.py b/tests/TestSuite_vf_offload.py
index a6d61e47..8d7440a5 100644
--- a/tests/TestSuite_vf_offload.py
+++ b/tests/TestSuite_vf_offload.py
@@ -216,6 +216,32 @@ class TestVfOffload(TestCase):
dut.send_expect("csum set sctp sw %d" % port, "testpmd>")
dut.send_expect("port start all", "testpmd>")
+ def tso_enable(self, port, dut):
+ dut.send_expect("port stop %d" % port, "testpmd>")
+ dut.send_expect("csum set ip hw %d" % port, "testpmd>")
+ dut.send_expect("csum set udp hw %d" % port, "testpmd>")
+ dut.send_expect("csum set tcp hw %d" % port, "testpmd>")
+ dut.send_expect("csum set sctp hw %d" % port, "testpmd>")
+ dut.send_expect("csum set outer-ip hw %d" % port, "testpmd>")
+ dut.send_expect("csum set outer-udp hw %d" % port, "testpmd>")
+ dut.send_expect("csum parse-tunnel on %d" % port, "testpmd>")
+ dut.send_expect("tso set 800 %d" % port, "testpmd>")
+ dut.send_expect("port start %d" % port, "testpmd>")
+
+ def tso_enable_tunnel(self, port, dut):
+ dut.send_expect("port stop %d" % port, "testpmd>")
+ dut.send_expect("csum set ip hw %d" % port, "testpmd>")
+ dut.send_expect("csum set udp hw %d" % port, "testpmd>")
+ dut.send_expect("csum set tcp hw %d" % port, "testpmd>")
+ dut.send_expect("csum set sctp hw %d" % port, "testpmd>")
+ dut.send_expect("csum set outer-ip hw %d" % port, "testpmd>")
+ dut.send_expect("csum set outer-udp hw %d" % port, "testpmd>")
+ dut.send_expect("csum parse-tunnel on %d" % port, "testpmd>")
+ dut.send_expect("rx_vxlan_port add 4789 %d" % port, "testpmd>")
+ dut.send_expect("tso set 800 %d" % port, "testpmd>")
+ dut.send_expect("tunnel_tso set 800 %d" % port, "testpmd>")
+ dut.send_expect("port start %d" % port, "testpmd>")
+
def checksum_validate(self, packets_sent, packets_expected):
"""
Validate the checksum.
@@ -849,6 +875,166 @@ class TestVfOffload(TestCase):
"the packet segmentation incorrect, %s" % tx_outlist,
)
+ @check_supported_nic(
+ ["ICE_100G-E810C_QSFP", "ICE_25G-E810C_SFP", "ICE_25G-E810_XXV_SFP"]
+ )
+ @skip_unsupported_pkg(["os default"])
+ def test_tso_tunnel(self):
+ """
+ TSO tunneled IPv4 TCP, IPv6 TCP testing.
+ """
+ tx_interface = self.tester.get_interface(
+ self.tester.get_local_port(self.vm0_dut_ports[0])
+ )
+ rx_interface = self.tester.get_interface(
+ self.tester.get_local_port(self.vm0_dut_ports[1])
+ )
+
+ self.loading_sizes = [128, 800, 801, 1700, 2500]
+
+ self.tester.send_expect(
+ "ethtool -K %s rx off tx off tso off gso off gro off lro off"
+ % tx_interface,
+ "# ",
+ )
+ self.tester.send_expect("ip l set %s up" % tx_interface, "# ")
+ self.dut.send_expect(
+ "ifconfig %s mtu %s" % (self.dut.ports_info[0]["intf"], TSO_MTU), "# "
+ )
+ self.dut.send_expect(
+ "ifconfig %s mtu %s" % (self.dut.ports_info[1]["intf"], TSO_MTU), "# "
+ )
+
+ self.portMask = utils.create_mask([self.vm0_dut_ports[0]])
+ self.launch_testpmd(
+ dcf_flag=self.dcf_mode,
+ param="--portmask=0x3 "
+ + "--enable-rx-cksum "
+ + "--max-pkt-len=%s" % TSO_MTU,
+ )
+
+ mac = self.vm0_testpmd.get_port_mac(0)
+ self.vm0_testpmd.execute_cmd("set verbose 1", "testpmd> ", 120)
+ self.vm0_testpmd.execute_cmd("set fwd csum", "testpmd>", 120)
+ self.vm0_testpmd.execute_cmd("set promisc 0 on", "testpmd> ", 120)
+ self.vm0_testpmd.execute_cmd("set promisc 1 on", "testpmd> ", 120)
+ self.vm0_testpmd.execute_cmd("csum mac-swap off 0", "testpmd>")
+ self.vm0_testpmd.execute_cmd("csum mac-swap off 1", "testpmd>")
+ self.tso_enable_tunnel(self.vm0_dut_ports[0], self.vm_dut_0)
+ self.tso_enable_tunnel(self.vm0_dut_ports[1], self.vm_dut_0)
+ self.vm0_testpmd.execute_cmd("start")
+ self.vm0_testpmd.wait_link_status_up(self.vm0_dut_ports[0])
+ self.vm0_testpmd.wait_link_status_up(self.vm0_dut_ports[1])
+
+ pkts_outer = {
+ "IP/UDP/VXLAN/ETH": 'IP(src = "192.168.1.1", dst = "192.168.1.2") / UDP(sport = 4789, dport = 4789) / VXLAN() / Ether()',
+ "IP/UDP/VXLAN-GPE": 'IP(src = "192.168.1.1", dst = "192.168.1.2") / UDP(sport = 4790, dport = 4790) / VXLAN()',
+ "IP/UDP/VXLAN-GPE/ETH": 'IP(src = "192.168.1.1", dst = "192.168.1.2") / UDP(sport = 4790, dport = 4790) / VXLAN() / Ether()',
+ "IPv6/UDP/VXLAN/ETH": 'IPv6(src = "FE80:0:0:0:200:1FF:FE00:200", dst = "3555:5555:6666:6666:7777:7777:8888:8888") / UDP(sport = 4789, dport = 4789) / VXLAN() / Ether()',
+ "IPv6/UDP/VXLAN-GPE": 'IPv6(src = "FE80:0:0:0:200:1FF:FE00:200", dst = "3555:5555:6666:6666:7777:7777:8888:8888") / UDP(sport = 4790, dport = 4790) / VXLAN()',
+ "IPv6/UDP/VXLAN-GPE/ETH": 'IPv6(src = "FE80:0:0:0:200:1FF:FE00:200", dst = "3555:5555:6666:6666:7777:7777:8888:8888") / UDP(sport = 4790, dport = 4790) / VXLAN() / Ether()',
+ "IP/GRE": 'IP(src = "192.168.1.1", dst = "192.168.1.2", proto = 47) / GRE()',
+ "IP/GRE/ETH": 'IP(src = "192.168.1.1", dst = "192.168.1.2", proto = 47) / GRE() / Ether()',
+ "IP/NVGRE/ETH": 'IP(src = "192.168.1.1", dst = "192.168.1.2", proto = 47) / GRE(key_present=1, proto=0x6558, key=0x00000100) / Ether()',
+ "IPv6/GRE": 'IPv6(src = "FE80:0:0:0:200:1FF:FE00:200", dst = "3555:5555:6666:6666:7777:7777:8888:8888", nh = 47) / GRE()',
+ "IPv6/GRE/ETH": 'IPv6(src = "FE80:0:0:0:200:1FF:FE00:200", dst = "3555:5555:6666:6666:7777:7777:8888:8888", nh = 47) / GRE() / Ether()',
+ "IPv6/NVGRE/ETH": 'IPv6(src = "FE80:0:0:0:200:1FF:FE00:200", dst = "3555:5555:6666:6666:7777:7777:8888:8888", nh = 47) / GRE(key_present=1, proto=0x6558, key=0x00000100) / Ether()',
+ "IP/UDP/GTPU": 'IP(src = "192.168.1.1", dst = "192.168.1.2") / UDP(dport = 2152) / GTP_U_Header(gtp_type=255, teid=0x123456)',
+ "IPv6/UDP/GTPU": 'IPv6(src = "FE80:0:0:0:200:1FF:FE00:200", dst = "3555:5555:6666:6666:7777:7777:8888:8888") / UDP(dport = 2152) / GTP_U_Header(gtp_type=255, teid=0x123456)',
+ }
+
+ self.tester.scapy_foreground()
+ time.sleep(5)
+
+ for key_outer in pkts_outer:
+ for loading_size in self.loading_sizes:
+ # IPv4 tcp test
+ out = self.vm0_testpmd.execute_cmd(
+ "clear port info all", "testpmd> ", 120
+ )
+ self.tcpdump_start_sniffing([tx_interface, rx_interface])
+ if "GTPU" in key_outer:
+ self.tester.scapy_append(
+ "from scapy.contrib.gtp import GTP_U_Header"
+ )
+ self.tester.scapy_append(
+ (
+ 'sendp([Ether(dst="%s",src="52:00:00:00:00:00")/'
+ + pkts_outer[key_outer]
+ + '/IP(src="192.168.1.1",dst="192.168.1.2")/TCP(sport=1021,dport=1021)/("X"*%s)], iface="%s")'
+ )
+ % (mac, loading_size, tx_interface)
+ )
+ out = self.tester.scapy_execute()
+ out = self.vm0_testpmd.execute_cmd("show port stats all")
+ print(out)
+ self.tcpdump_stop_sniff()
+ rx_stats = self.number_of_packets(rx_interface)
+ tx_stats = self.number_of_packets(tx_interface)
+ tx_outlist = self.number_of_bytes(rx_interface)
+ self.logger.info(tx_outlist)
+ if loading_size <= 800:
+ self.verify(
+ rx_stats == tx_stats and int(tx_outlist[0]) == loading_size,
+ f"{key_outer} tunnel IPV4 RX or TX packet number not correct",
+ )
+ else:
+ num = loading_size // 800
+ for i in range(num):
+ self.verify(
+ int(tx_outlist[i]) == 800,
+ "the packet segmentation incorrect, %s" % tx_outlist,
+ )
+ if loading_size % 800 != 0:
+ self.verify(
+ int(tx_outlist[num]) == loading_size % 800,
+ "the packet segmentation incorrect, %s" % tx_outlist,
+ )
+
+ for loading_size in self.loading_sizes:
+ # IPv6 tcp test
+ out = self.vm0_testpmd.execute_cmd(
+ "clear port info all", "testpmd> ", 120
+ )
+ self.tcpdump_start_sniffing([tx_interface, rx_interface])
+ if "GTPU" in key_outer:
+ self.tester.scapy_append(
+ "from scapy.contrib.gtp import GTP_U_Header"
+ )
+ self.tester.scapy_append(
+ (
+ 'sendp([Ether(dst="%s", src="52:00:00:00:00:00")/'
+ + pkts_outer[key_outer]
+ + '/IPv6(src="FE80:0:0:0:200:1FF:FE00:200", dst="3555:5555:6666:6666:7777:7777:8888:8888")/TCP(sport=1021,dport=1021)/("X"*%s)], iface="%s")'
+ )
+ % (mac, loading_size, tx_interface)
+ )
+ out = self.tester.scapy_execute()
+ out = self.vm0_testpmd.execute_cmd("show port stats all")
+ print(out)
+ self.tcpdump_stop_sniff()
+ rx_stats = self.number_of_packets(rx_interface)
+ tx_stats = self.number_of_packets(tx_interface)
+ tx_outlist = self.number_of_bytes(rx_interface)
+ self.logger.info(tx_outlist)
+ if loading_size <= 800:
+ self.verify(
+ rx_stats == tx_stats and int(tx_outlist[0]) == loading_size,
+ f"{key_outer} tunnel IPV6 RX or TX packet number not correct",
+ )
+ else:
+ num = loading_size // 800
+ for i in range(num):
+ self.verify(
+ int(tx_outlist[i]) == 800,
+ "the packet segmentation incorrect, %s" % tx_outlist,
+ )
+ if loading_size % 800 != 0:
+ self.verify(
+ int(tx_outlist[num]) == loading_size % 800,
+ "the packet segmentation incorrect, %s" % tx_outlist,
+ )
+
def tear_down(self):
self.vm0_testpmd.execute_cmd("quit", "# ")
self.dut.send_expect(
--
2.25.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [DTS][PATCH V4 4/5] tests/vf_offload: dts adaptation DPDK checksum function changes
2022-12-22 9:37 [DTS][PATCH V4 0/5] add vf checksum offload and tso case for tunnel packets Ke Xu
` (2 preceding siblings ...)
2022-12-22 9:37 ` [DTS][PATCH V4 3/5] tests/vf_offload: add vf tso " Ke Xu
@ 2022-12-22 9:37 ` Ke Xu
2022-12-22 9:37 ` [DTS][PATCH V4 5/5] tests/vf_offload: add new method to anayse tunnel packets Ke Xu
4 siblings, 0 replies; 6+ messages in thread
From: Ke Xu @ 2022-12-22 9:37 UTC (permalink / raw)
To: dts; +Cc: weiyuanx.li, qi.fu, lijuan.tu, Ke Xu
DPDK22.11 236bc417e2da(app/testpmd: fix MAC header in checksum forward
engine) changes the checksum functions adds switches to control whether
to exchange MAC address.
Modify DTS code to adapt to this change.
Signed-off-by: Weiyuan Li <weiyuanx.li@intel.com>
Signed-off-by: Ke Xu <ke1.xu@intel.com>
---
tests/TestSuite_vf_offload.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/tests/TestSuite_vf_offload.py b/tests/TestSuite_vf_offload.py
index 8d7440a5..3d89729d 100644
--- a/tests/TestSuite_vf_offload.py
+++ b/tests/TestSuite_vf_offload.py
@@ -352,6 +352,8 @@ class TestVfOffload(TestCase):
param="--portmask=%s " % (self.portMask) + "--enable-rx-cksum " + "",
)
self.vm0_testpmd.execute_cmd("set fwd csum")
+ self.vm0_testpmd.execute_cmd("csum mac-swap off 0", "testpmd>")
+ self.vm0_testpmd.execute_cmd("csum mac-swap off 1", "testpmd>")
self.vm0_testpmd.execute_cmd("set promisc 1 on")
self.vm0_testpmd.execute_cmd("set promisc 0 on")
@@ -612,6 +614,8 @@ class TestVfOffload(TestCase):
param="--portmask=%s " % (self.portMask) + "--enable-rx-cksum " + "",
)
self.vm0_testpmd.execute_cmd("set fwd csum")
+ self.vm0_testpmd.execute_cmd("csum mac-swap off 0", "testpmd>")
+ self.vm0_testpmd.execute_cmd("csum mac-swap off 1", "testpmd>")
self.vm0_testpmd.execute_cmd("set promisc 1 on")
self.vm0_testpmd.execute_cmd("set promisc 0 on")
--
2.25.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [DTS][PATCH V4 5/5] tests/vf_offload: add new method to anayse tunnel packets.
2022-12-22 9:37 [DTS][PATCH V4 0/5] add vf checksum offload and tso case for tunnel packets Ke Xu
` (3 preceding siblings ...)
2022-12-22 9:37 ` [DTS][PATCH V4 4/5] tests/vf_offload: dts adaptation DPDK checksum function changes Ke Xu
@ 2022-12-22 9:37 ` Ke Xu
4 siblings, 0 replies; 6+ messages in thread
From: Ke Xu @ 2022-12-22 9:37 UTC (permalink / raw)
To: dts; +Cc: weiyuanx.li, qi.fu, lijuan.tu, Ke Xu
As tcpdump not supporting some of the packet
organizations we are to cover, a newly implemented
function is introduced to replace number_of_packets
and number_of_bytes in tunnel cases.
Signed-off-by: Ke Xu <ke1.xu@intel.com>
---
tests/TestSuite_vf_offload.py | 64 +++++++++++++++++++++++++----------
1 file changed, 46 insertions(+), 18 deletions(-)
diff --git a/tests/TestSuite_vf_offload.py b/tests/TestSuite_vf_offload.py
index 3d89729d..6765fcc5 100644
--- a/tests/TestSuite_vf_offload.py
+++ b/tests/TestSuite_vf_offload.py
@@ -6,8 +6,19 @@ import re
import string
import time
+from scapy.contrib.lldp import LLDPDU, LLDPDUManagementAddress
+from scapy.contrib.mpls import MPLS
+from scapy.contrib.nsh import NSH
+from scapy.layers.inet import ICMP, IP, TCP, UDP
+from scapy.layers.inet6 import IPv6, IPv6ExtHdrFragment, IPv6ExtHdrRouting
+from scapy.layers.l2 import ARP, GRE, Dot1Q, Ether
+from scapy.layers.sctp import SCTP
+from scapy.layers.vxlan import VXLAN
+from scapy.packet import Raw
+
import framework.utils as utils
from framework.crb import Crb
+from framework.packet import Packet
from framework.pmd_output import PmdOutput
from framework.settings import DPDK_DCFMODE_SETTING, HEADER_SIZE, load_global_setting
from framework.test_case import TestCase, check_supported_nic, skip_unsupported_pkg
@@ -687,6 +698,25 @@ class TestVfOffload(TestCase):
self.tester.send_expect('echo "Cleaning buffer"', "#")
time.sleep(1)
+ def tcpdump_analyse_sniff(self, iface):
+ """
+ Analyse the tcpdump captured packets. Returning the number of
+ packets and the bytes of packets payload.
+ """
+ packet = Packet()
+ pkts = packet.read_pcapfile("tcpdump_{0}.pcap".format(iface), self.tester)
+ pkts = [
+ p
+ for p in pkts
+ if len(p.layers()) >= 3
+ and p.layers()[1] in {IP, IPv6}
+ and p.layers()[2] in {IP, IPv6, UDP, TCP, SCTP, GRE, MPLS}
+ and Raw in p
+ ]
+ rx_packet_count = len(pkts)
+ rx_packet_size = [len(p[Raw]) for p in pkts]
+ return rx_packet_count, rx_packet_size
+
def tcpdump_command(self, command):
"""
Send a tcpdump related command and return an integer from the output.
@@ -973,26 +1003,25 @@ class TestVfOffload(TestCase):
out = self.vm0_testpmd.execute_cmd("show port stats all")
print(out)
self.tcpdump_stop_sniff()
- rx_stats = self.number_of_packets(rx_interface)
- tx_stats = self.number_of_packets(tx_interface)
- tx_outlist = self.number_of_bytes(rx_interface)
- self.logger.info(tx_outlist)
+ rx_stats, payload_size_list = self.tcpdump_analyse_sniff(rx_interface)
+ tx_stats, _ = self.tcpdump_analyse_sniff(tx_interface)
+ self.logger.info(payload_size_list)
if loading_size <= 800:
self.verify(
- rx_stats == tx_stats and int(tx_outlist[0]) == loading_size,
+ rx_stats == tx_stats and payload_size_list[0] == loading_size,
f"{key_outer} tunnel IPV4 RX or TX packet number not correct",
)
else:
num = loading_size // 800
for i in range(num):
self.verify(
- int(tx_outlist[i]) == 800,
- "the packet segmentation incorrect, %s" % tx_outlist,
+ payload_size_list[i] == 800,
+ "the packet segmentation incorrect, %s" % payload_size_list,
)
if loading_size % 800 != 0:
self.verify(
- int(tx_outlist[num]) == loading_size % 800,
- "the packet segmentation incorrect, %s" % tx_outlist,
+ payload_size_list[num] == loading_size % 800,
+ "the packet segmentation incorrect, %s" % payload_size_list,
)
for loading_size in self.loading_sizes:
@@ -1017,26 +1046,25 @@ class TestVfOffload(TestCase):
out = self.vm0_testpmd.execute_cmd("show port stats all")
print(out)
self.tcpdump_stop_sniff()
- rx_stats = self.number_of_packets(rx_interface)
- tx_stats = self.number_of_packets(tx_interface)
- tx_outlist = self.number_of_bytes(rx_interface)
- self.logger.info(tx_outlist)
+ rx_stats, payload_size_list = self.tcpdump_analyse_sniff(rx_interface)
+ tx_stats, _ = self.tcpdump_analyse_sniff(tx_interface)
+ self.logger.info(payload_size_list)
if loading_size <= 800:
self.verify(
- rx_stats == tx_stats and int(tx_outlist[0]) == loading_size,
+ rx_stats == tx_stats and payload_size_list[0] == loading_size,
f"{key_outer} tunnel IPV6 RX or TX packet number not correct",
)
else:
num = loading_size // 800
for i in range(num):
self.verify(
- int(tx_outlist[i]) == 800,
- "the packet segmentation incorrect, %s" % tx_outlist,
+ payload_size_list[i] == 800,
+ "the packet segmentation incorrect, %s" % payload_size_list,
)
if loading_size % 800 != 0:
self.verify(
- int(tx_outlist[num]) == loading_size % 800,
- "the packet segmentation incorrect, %s" % tx_outlist,
+ payload_size_list[num] == loading_size % 800,
+ "the packet segmentation incorrect, %s" % payload_size_list,
)
def tear_down(self):
--
2.25.1
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-12-22 9:39 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-12-22 9:37 [DTS][PATCH V4 0/5] add vf checksum offload and tso case for tunnel packets Ke Xu
2022-12-22 9:37 ` [DTS][PATCH V4 1/5] tests/vf_offload: fix 2 typos and a bug Ke Xu
2022-12-22 9:37 ` [DTS][PATCH V4 2/5] tests/vf_offload: add vf checksum hw offload case for tunneling packets Ke Xu
2022-12-22 9:37 ` [DTS][PATCH V4 3/5] tests/vf_offload: add vf tso " Ke Xu
2022-12-22 9:37 ` [DTS][PATCH V4 4/5] tests/vf_offload: dts adaptation DPDK checksum function changes Ke Xu
2022-12-22 9:37 ` [DTS][PATCH V4 5/5] tests/vf_offload: add new method to anayse tunnel packets Ke Xu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).