aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorBenoît Ganne <bganne@cisco.com>2024-07-05 14:09:35 +0200
committerDave Wallace <dwallacelf@gmail.com>2024-12-12 14:45:14 +0000
commit8fadde6f0154a735dce2624d56b36bf2276b6a7f (patch)
tree0ea12e83c4d2d546df9142ec0e65f03f5bf3e044 /test
parent504a7d1c93a2f73023d2552a49df0d6d43970830 (diff)
pg: misc improvements and fixes
1) pg can typically injects packets in ethernet-input, ip4-input or ip6-input. Make sure offload offsets are correctly set for ip4-input and ip6-input. 2) add hw-addr support for ethernet mode (only available through cli) 3) refactor pg creation code to improve the readability by using data structure pg_interface_args_t 4) fix the pg input and output traces to use headers according to pg interface mode 5) introduce pg interface flags i.e. checksum, gso, gro Type: improvement Change-Id: Iffed502e9c6357d7ef8e8a72217867e8297236aa Signed-off-by: Benoît Ganne <bganne@cisco.com> Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
Diffstat (limited to 'test')
-rw-r--r--test/test_pg_stream.py159
1 files changed, 153 insertions, 6 deletions
diff --git a/test/test_pg_stream.py b/test/test_pg_stream.py
index 6c01d3b7b16..471c85c43f0 100644
--- a/test/test_pg_stream.py
+++ b/test/test_pg_stream.py
@@ -1,6 +1,8 @@
#!/usr/bin/env python3
import unittest
+import time
+import re
from scapy.packet import Raw
from scapy.layers.l2 import Ether
@@ -50,16 +52,20 @@ class TestPgStream(VppTestCase):
count = str(count)
cmds = [
+ "clear trace",
+ "trace add pg-input 1000",
"packet-generator new {{\n"
- " name pg0-stream\n"
+ " name pg0-pg1-stream\n"
" limit {count}\n"
" node ethernet-input\n"
" source pg0\n"
" rate {rate}\n"
" size {packet_size}+{packet_size}\n"
+ " buffer-flags ip4 offload\n"
+ " buffer-offload-flags offload-ip-cksum offload-udp-cksum\n"
" data {{\n"
- " IP4: {src_mac} -> 00:02:03:04:05:06\n"
- " UDP: 192.168.20.20 -> 192.168.10.100\n"
+ " IP4: {src_mac} -> {dst_mac}\n"
+ " UDP: {src} -> {dst}\n"
" UDP: 1234 -> 4321\n"
" incrementing 100\n"
" }}\n"
@@ -67,11 +73,79 @@ class TestPgStream(VppTestCase):
count=count,
rate=rate,
packet_size=packet_size,
- src_mac=self.pg0.local_mac,
+ src_mac=self.pg0.remote_mac,
+ dst_mac=self.pg0.local_mac,
+ src=self.pg0.remote_ip4,
+ dst=self.pg1.remote_ip4,
+ ),
+ "packet-generator new {{\n"
+ " name pg0-pg2-stream\n"
+ " limit {count}\n"
+ " node ethernet-input\n"
+ " source pg0\n"
+ " rate {rate}\n"
+ " size {packet_size}+{packet_size}\n"
+ " buffer-flags ip6 offload\n"
+ " buffer-offload-flags offload-udp-cksum\n"
+ " data {{\n"
+ " IP6: {src_mac} -> {dst_mac}\n"
+ " UDP: {src} -> {dst}\n"
+ " UDP: 1234 -> 4321\n"
+ " incrementing 100\n"
+ " }}\n"
+ "}}\n".format(
+ count=count,
+ rate=rate,
+ packet_size=packet_size,
+ src_mac=self.pg0.remote_mac,
+ dst_mac=self.pg0.local_mac,
+ src=self.pg0.remote_ip6,
+ dst=self.pg2.remote_ip6,
+ ),
+ "packet-generator new {{\n"
+ " name pg1-pg0-stream\n"
+ " limit {count}\n"
+ " node ip4-input\n"
+ " source pg1\n"
+ " rate {rate}\n"
+ " size {packet_size}+{packet_size}\n"
+ " buffer-flags ip4 offload\n"
+ " buffer-offload-flags offload-ip-cksum offload-udp-cksum\n"
+ " data {{\n"
+ " UDP: {src} -> {dst}\n"
+ " UDP: 1234 -> 4321\n"
+ " incrementing 100\n"
+ " }}\n"
+ "}}\n".format(
+ count=count,
+ rate=rate,
+ packet_size=packet_size,
+ src=self.pg1.remote_ip4,
+ dst=self.pg0.remote_ip4,
+ ),
+ "packet-generator new {{\n"
+ " name pg2-pg0-stream\n"
+ " limit {count}\n"
+ " node ip6-input\n"
+ " source pg2\n"
+ " rate {rate}\n"
+ " size {packet_size}+{packet_size}\n"
+ " buffer-flags ip6 offload\n"
+ " buffer-offload-flags offload-udp-cksum\n"
+ " data {{\n"
+ " UDP: {src} -> {dst}\n"
+ " UDP: 1234 -> 4321\n"
+ " incrementing 100\n"
+ " }}\n"
+ "}}\n".format(
+ count=count,
+ rate=rate,
+ packet_size=packet_size,
+ src=self.pg2.remote_ip6,
+ dst=self.pg0.remote_ip6,
),
"packet-generator enable",
- "packet-generator disable",
- "packet-generator delete pg0-stream",
+ "show error",
]
for cmd in cmds:
@@ -81,6 +155,79 @@ class TestPgStream(VppTestCase):
self.logger.info(cmd + " FAIL reply " + r.reply)
else:
self.logger.info(cmd + " FAIL retval " + str(r.retval))
+ self.assertTrue(r.retval == 0)
+
+ deadline = time.time() + 30
+ while self.vapi.cli("show packet-generator").find("Yes") != -1:
+ self.sleep(0.01) # yield
+ if time.time() > deadline:
+ self.logger.error("Timeout waiting for pg to stop")
+ break
+
+ r = self.vapi.cli_return_response("show trace")
+ self.assertTrue(r.retval == 0)
+ self.assertTrue(hasattr(r, "reply"))
+ rv = r.reply
+ packets = rv.split("\nPacket ")
+ for packet in enumerate(packets, start=1):
+ match = re.search(r"stream\s+([\w-]+)", packet[1])
+ if match:
+ stream_name = match.group(1)
+ else:
+ continue
+ if stream_name == "pg0-pg1-stream":
+ look_here = packet[1].find("ethernet-input")
+ self.assertNotEqual(look_here, -1)
+ search_string = "ip4 offload-ip-cksum offload-udp-cksum l2-hdr-offset 0 l3-hdr-offset 14 l4-hdr-offset 34"
+ look_here = packet[1].find(search_string)
+ self.assertNotEqual(look_here, -1)
+ search_string = "ip4 l2-hdr-offset 0 l3-hdr-offset 14 l4-hdr-offset 34"
+ look_here = packet[1].find(search_string)
+ self.assertNotEqual(look_here, -1)
+ elif stream_name == "pg0-pg2-stream":
+ look_here = packet[1].find("ethernet-input")
+ self.assertNotEqual(look_here, -1)
+ search_string = "ip6 offload-udp-cksum l2-hdr-offset 0 l3-hdr-offset 14 l4-hdr-offset 54"
+ look_here = packet[1].find(search_string)
+ self.assertNotEqual(look_here, -1)
+ search_string = "ip6 l2-hdr-offset 0 l3-hdr-offset 14 l4-hdr-offset 54"
+ look_here = packet[1].find(search_string)
+ self.assertNotEqual(look_here, -1)
+ elif stream_name == "pg1-pg0-stream":
+ look_here = packet[1].find("ethernet-input")
+ self.assertEqual(look_here, -1)
+ look_here = packet[1].find("ip4-input")
+ self.assertNotEqual(look_here, -1)
+ search_string = "ip4 offload-ip-cksum offload-udp-cksum l2-hdr-offset 0 l3-hdr-offset 0 l4-hdr-offset 20"
+ look_here = packet[1].find(search_string)
+ self.assertNotEqual(look_here, -1)
+ search_string = "ip4 l2-hdr-offset 0 l3-hdr-offset 0 l4-hdr-offset 20"
+ look_here = packet[1].find(search_string)
+ self.assertNotEqual(look_here, -1)
+ elif stream_name == "pg2-pg0-stream":
+ look_here = packet[1].find("ethernet-input")
+ self.assertEqual(look_here, -1)
+ look_here = packet[1].find("ip6-input")
+ self.assertNotEqual(look_here, -1)
+ search_string = "ip6 offload-udp-cksum l2-hdr-offset 0 l3-hdr-offset 0 l4-hdr-offset 40"
+ look_here = packet[1].find(search_string)
+ self.assertNotEqual(look_here, -1)
+ search_string = "ip6 l2-hdr-offset 0 l3-hdr-offset 0 l4-hdr-offset 40"
+ look_here = packet[1].find(search_string)
+ self.assertNotEqual(look_here, -1)
+
+ self.logger.info(self.vapi.cli("packet-generator disable"))
+ self.logger.info(self.vapi.cli("packet-generator delete pg0-pg1-stream"))
+ self.logger.info(self.vapi.cli("packet-generator delete pg0-pg2-stream"))
+ self.logger.info(self.vapi.cli("packet-generator delete pg1-pg0-stream"))
+ self.logger.info(self.vapi.cli("packet-generator delete pg2-pg0-stream"))
+
+ r = self.vapi.cli_return_response("show buffers")
+ self.assertTrue(r.retval == 0)
+ self.assertTrue(hasattr(r, "reply"))
+ rv = r.reply
+ used = int(rv.strip().split("\n")[-1].split()[-1])
+ self.assertEqual(used, 0)
def test_pg_stream(self):
"""PG Stream testing"""