* [PATCH v1 1/2] dts: allow expected packets to come from the TG @ 2024-12-31 11:24 Paul Szczepanek 2024-12-31 11:24 ` [PATCH v1 2/2] dts: add softnic test Paul Szczepanek 2024-12-31 11:31 ` [PATCH v2 1/2] dts: allow expected packets to come from the TG Paul Szczepanek 0 siblings, 2 replies; 4+ messages in thread From: Paul Szczepanek @ 2024-12-31 11:24 UTC (permalink / raw) To: dev; +Cc: probb, Paul Szczepanek, Thomas Wilks Add sent_from_tg variable to get_expected_packets for when packets are sent from the TG. Signed-off-by: Thomas Wilks <thomas.wilks@arm.com> Signed-off-by: Paul Szczepanek <paul.szczepanek@arm.com> --- dts/framework/test_suite.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/dts/framework/test_suite.py b/dts/framework/test_suite.py index adee01f031..69b24fd126 100644 --- a/dts/framework/test_suite.py +++ b/dts/framework/test_suite.py @@ -274,31 +274,41 @@ def send_packets( packets = self._adjust_addresses(packets) self.tg_node.send_packets(packets, self._tg_port_egress) - def get_expected_packets(self, packets: list[Packet]) -> list[Packet]: + def get_expected_packets( + self, + packets: list[Packet], + sent_from_tg: bool = False, + ) -> list[Packet]: """Inject the proper L2/L3 addresses into `packets`. Inject the L2/L3 addresses expected at the receiving end of the traffic generator. Args: packets: The packets to modify. + sent_from_tg: True if packet was sent from the TG. Returns: `packets` with injected L2/L3 addresses. """ - return self._adjust_addresses(packets, expected=True) + return self._adjust_addresses(packets, not sent_from_tg) - def get_expected_packet(self, packet: Packet) -> Packet: + def get_expected_packet( + self, + packet: Packet, + sent_from_tg: bool = False, + ) -> Packet: """Inject the proper L2/L3 addresses into `packet`. Inject the L2/L3 addresses expected at the receiving end of the traffic generator. Args: packet: The packet to modify. + sent_from_tg: True if packet was sent from the TG. Returns: `packet` with injected L2/L3 addresses. """ - return self.get_expected_packets([packet])[0] + return self.get_expected_packets([packet], sent_from_tg)[0] def _adjust_addresses(self, packets: list[Packet], expected: bool = False) -> list[Packet]: """L2 and L3 address additions in both directions. -- 2.39.2 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v1 2/2] dts: add softnic test 2024-12-31 11:24 [PATCH v1 1/2] dts: allow expected packets to come from the TG Paul Szczepanek @ 2024-12-31 11:24 ` Paul Szczepanek 2024-12-31 11:31 ` [PATCH v2 1/2] dts: allow expected packets to come from the TG Paul Szczepanek 1 sibling, 0 replies; 4+ messages in thread From: Paul Szczepanek @ 2024-12-31 11:24 UTC (permalink / raw) To: dev; +Cc: probb, Paul Szczepanek, Thomas Wilks Add test that uses a softnic virtual device to froward packets. Signed-off-by: Thomas Wilks <thomas.wilks@arm.com> Signed-off-by: Paul Szczepanek <paul.szczepanek@arm.com> --- dts/tests/TestSuite_softnic.py | 119 +++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 dts/tests/TestSuite_softnic.py diff --git a/dts/tests/TestSuite_softnic.py b/dts/tests/TestSuite_softnic.py new file mode 100644 index 0000000000..7944b18029 --- /dev/null +++ b/dts/tests/TestSuite_softnic.py @@ -0,0 +1,119 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2024 Arm Limited + +"""Softnic test suite. + +Create a softnic virtual device and verify it successfully forwards packets. +""" +from pathlib import Path, PurePath + +from framework.params.testpmd import EthPeer +from framework.remote_session.testpmd_shell import TestPmdShell +from framework.test_suite import TestSuite, func_test +from framework.testbed_model.capability import requires +from framework.testbed_model.topology import TopologyType +from framework.testbed_model.virtual_device import VirtualDevice +from framework.utils import generate_random_packets + + +@requires(topology_type=TopologyType.two_links) +class TestSoftnic(TestSuite): + """Softnic test suite.""" + + #: The total number of packets to generate and send for forwarding. + NUMBER_OF_PACKETS_TO_SEND = 10 + #: The payload size to use for the generated packets in bytes. + PAYLOAD_SIZE = 100 + + def set_up_suite(self) -> None: + """Set up the test suite. + + Setup: + Generate the random packets that will be sent and create the softnic config files. + """ + self.packets = generate_random_packets(self.NUMBER_OF_PACKETS_TO_SEND, self.PAYLOAD_SIZE) + self.cli_file = self.prepare_softnic_files() + + def prepare_softnic_files(self) -> PurePath: + """Creates the config files that are required for the creation of the softnic. + + The config files are created at runtime to accommodate paths and device addresses. + """ + # paths of files needed by softnic + cli_file = Path("rx_tx.cli") + spec_file = Path("rx_tx.spec") + rx_tx_1_file = Path("rx_tx_1.io") + rx_tx_2_file = Path("rx_tx_2.io") + path_sut = self.sut_node.remote_dpdk_build_dir + cli_file_sut = self.sut_node.main_session.join_remote_path(path_sut, cli_file) + spec_file_sut = self.sut_node.main_session.join_remote_path(path_sut, spec_file) + rx_tx_1_file_sut = self.sut_node.main_session.join_remote_path(path_sut, rx_tx_1_file) + rx_tx_2_file_sut = self.sut_node.main_session.join_remote_path(path_sut, rx_tx_2_file) + firmware_c_file_sut = self.sut_node.main_session.join_remote_path(path_sut, "firmware.c") + firmware_so_file_sut = self.sut_node.main_session.join_remote_path(path_sut, "firmware.so") + + # write correct remote paths to local files + with open(cli_file, "w+") as fh: + fh.write(f"pipeline codegen {spec_file_sut} {firmware_c_file_sut}\n") + fh.write(f"pipeline libbuild {firmware_c_file_sut} {firmware_so_file_sut}\n") + fh.write(f"pipeline RX build lib {firmware_so_file_sut} io {rx_tx_1_file_sut} numa 0\n") + fh.write(f"pipeline TX build lib {firmware_so_file_sut} io {rx_tx_2_file_sut} numa 0\n") + fh.write("thread 2 pipeline RX enable\n") + fh.write("thread 2 pipeline TX enable\n") + with open(spec_file, "w+") as fh: + fh.write("struct metadata_t {{\n") + fh.write(" bit<32> port\n") + fh.write("}}\n") + fh.write("metadata instanceof metadata_t\n") + fh.write("apply {{\n") + fh.write(" rx m.port\n") + fh.write(" tx m.port\n") + fh.write("}}\n") + with open(rx_tx_1_file, "w+") as fh: + fh.write(f"port in 0 ethdev {self.sut_node.config.ports[0].pci} rxq 0 bsz 32\n") + fh.write("port out 0 ring RXQ0 bsz 32\n") + with open(rx_tx_2_file, "w+") as fh: + fh.write("port in 0 ring TXQ0 bsz 32\n") + fh.write(f"port out 1 ethdev {self.sut_node.config.ports[1].pci} txq 0 bsz 32\n") + + # copy files over to SUT + self.sut_node.main_session.copy_to(cli_file, cli_file_sut) + self.sut_node.main_session.copy_to(spec_file, spec_file_sut) + self.sut_node.main_session.copy_to(rx_tx_1_file, rx_tx_1_file_sut) + self.sut_node.main_session.copy_to(rx_tx_2_file, rx_tx_2_file_sut) + # and cleanup local files + cli_file.unlink() + spec_file.unlink() + rx_tx_1_file.unlink() + rx_tx_2_file.unlink() + + return cli_file_sut + + @func_test + def softnic(self) -> None: + """Softnic test. + + Steps: + Start Testpmd with a softnic vdev using the provided config files. + Testpmd forwarding is disabled, instead configure softnic to forward packets + from port 0 to port 1 of the physical device. + Send generated packets from the TG. + + Verify: + The packets that are received are the same as the packets sent. + + """ + with TestPmdShell( + self.sut_node, + vdevs=[VirtualDevice(f"net_softnic0,firmware={self.cli_file},cpu_id=1,conn_port=8086")], + eth_peer=[EthPeer(1, self.tg_node.ports[1].mac_address)], + port_topology=None, + disable_device_start=True, + ) as shell: + shell.start() + received_packets = self.send_packets_and_capture(self.packets) + # packets are being forwarded without addresses being amended so + # we get the address as it would be expected to come from TG + expected_packets = self.get_expected_packets(self.packets, sent_from_tg=True) + + self.match_all_packets(expected_packets, received_packets) -- 2.39.2 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 1/2] dts: allow expected packets to come from the TG 2024-12-31 11:24 [PATCH v1 1/2] dts: allow expected packets to come from the TG Paul Szczepanek 2024-12-31 11:24 ` [PATCH v1 2/2] dts: add softnic test Paul Szczepanek @ 2024-12-31 11:31 ` Paul Szczepanek 2024-12-31 11:31 ` [PATCH v2 2/2] dts: add softnic test Paul Szczepanek 1 sibling, 1 reply; 4+ messages in thread From: Paul Szczepanek @ 2024-12-31 11:31 UTC (permalink / raw) To: dev; +Cc: probb, Paul Szczepanek, Thomas Wilks Add sent_from_tg variable to get_expected_packets for when packets are sent from the TG. Signed-off-by: Thomas Wilks <thomas.wilks@arm.com> Signed-off-by: Paul Szczepanek <paul.szczepanek@arm.com> --- dts/framework/test_suite.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/dts/framework/test_suite.py b/dts/framework/test_suite.py index adee01f031..69b24fd126 100644 --- a/dts/framework/test_suite.py +++ b/dts/framework/test_suite.py @@ -274,31 +274,41 @@ def send_packets( packets = self._adjust_addresses(packets) self.tg_node.send_packets(packets, self._tg_port_egress) - def get_expected_packets(self, packets: list[Packet]) -> list[Packet]: + def get_expected_packets( + self, + packets: list[Packet], + sent_from_tg: bool = False, + ) -> list[Packet]: """Inject the proper L2/L3 addresses into `packets`. Inject the L2/L3 addresses expected at the receiving end of the traffic generator. Args: packets: The packets to modify. + sent_from_tg: True if packet was sent from the TG. Returns: `packets` with injected L2/L3 addresses. """ - return self._adjust_addresses(packets, expected=True) + return self._adjust_addresses(packets, not sent_from_tg) - def get_expected_packet(self, packet: Packet) -> Packet: + def get_expected_packet( + self, + packet: Packet, + sent_from_tg: bool = False, + ) -> Packet: """Inject the proper L2/L3 addresses into `packet`. Inject the L2/L3 addresses expected at the receiving end of the traffic generator. Args: packet: The packet to modify. + sent_from_tg: True if packet was sent from the TG. Returns: `packet` with injected L2/L3 addresses. """ - return self.get_expected_packets([packet])[0] + return self.get_expected_packets([packet], sent_from_tg)[0] def _adjust_addresses(self, packets: list[Packet], expected: bool = False) -> list[Packet]: """L2 and L3 address additions in both directions. -- 2.39.2 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 2/2] dts: add softnic test 2024-12-31 11:31 ` [PATCH v2 1/2] dts: allow expected packets to come from the TG Paul Szczepanek @ 2024-12-31 11:31 ` Paul Szczepanek 0 siblings, 0 replies; 4+ messages in thread From: Paul Szczepanek @ 2024-12-31 11:31 UTC (permalink / raw) To: dev; +Cc: probb, Paul Szczepanek, Thomas Wilks Add test that uses a softnic virtual device to forward packets. Signed-off-by: Thomas Wilks <thomas.wilks@arm.com> Signed-off-by: Paul Szczepanek <paul.szczepanek@arm.com> --- dts/tests/TestSuite_softnic.py | 119 +++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 dts/tests/TestSuite_softnic.py diff --git a/dts/tests/TestSuite_softnic.py b/dts/tests/TestSuite_softnic.py new file mode 100644 index 0000000000..7944b18029 --- /dev/null +++ b/dts/tests/TestSuite_softnic.py @@ -0,0 +1,119 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2024 Arm Limited + +"""Softnic test suite. + +Create a softnic virtual device and verify it successfully forwards packets. +""" +from pathlib import Path, PurePath + +from framework.params.testpmd import EthPeer +from framework.remote_session.testpmd_shell import TestPmdShell +from framework.test_suite import TestSuite, func_test +from framework.testbed_model.capability import requires +from framework.testbed_model.topology import TopologyType +from framework.testbed_model.virtual_device import VirtualDevice +from framework.utils import generate_random_packets + + +@requires(topology_type=TopologyType.two_links) +class TestSoftnic(TestSuite): + """Softnic test suite.""" + + #: The total number of packets to generate and send for forwarding. + NUMBER_OF_PACKETS_TO_SEND = 10 + #: The payload size to use for the generated packets in bytes. + PAYLOAD_SIZE = 100 + + def set_up_suite(self) -> None: + """Set up the test suite. + + Setup: + Generate the random packets that will be sent and create the softnic config files. + """ + self.packets = generate_random_packets(self.NUMBER_OF_PACKETS_TO_SEND, self.PAYLOAD_SIZE) + self.cli_file = self.prepare_softnic_files() + + def prepare_softnic_files(self) -> PurePath: + """Creates the config files that are required for the creation of the softnic. + + The config files are created at runtime to accommodate paths and device addresses. + """ + # paths of files needed by softnic + cli_file = Path("rx_tx.cli") + spec_file = Path("rx_tx.spec") + rx_tx_1_file = Path("rx_tx_1.io") + rx_tx_2_file = Path("rx_tx_2.io") + path_sut = self.sut_node.remote_dpdk_build_dir + cli_file_sut = self.sut_node.main_session.join_remote_path(path_sut, cli_file) + spec_file_sut = self.sut_node.main_session.join_remote_path(path_sut, spec_file) + rx_tx_1_file_sut = self.sut_node.main_session.join_remote_path(path_sut, rx_tx_1_file) + rx_tx_2_file_sut = self.sut_node.main_session.join_remote_path(path_sut, rx_tx_2_file) + firmware_c_file_sut = self.sut_node.main_session.join_remote_path(path_sut, "firmware.c") + firmware_so_file_sut = self.sut_node.main_session.join_remote_path(path_sut, "firmware.so") + + # write correct remote paths to local files + with open(cli_file, "w+") as fh: + fh.write(f"pipeline codegen {spec_file_sut} {firmware_c_file_sut}\n") + fh.write(f"pipeline libbuild {firmware_c_file_sut} {firmware_so_file_sut}\n") + fh.write(f"pipeline RX build lib {firmware_so_file_sut} io {rx_tx_1_file_sut} numa 0\n") + fh.write(f"pipeline TX build lib {firmware_so_file_sut} io {rx_tx_2_file_sut} numa 0\n") + fh.write("thread 2 pipeline RX enable\n") + fh.write("thread 2 pipeline TX enable\n") + with open(spec_file, "w+") as fh: + fh.write("struct metadata_t {{\n") + fh.write(" bit<32> port\n") + fh.write("}}\n") + fh.write("metadata instanceof metadata_t\n") + fh.write("apply {{\n") + fh.write(" rx m.port\n") + fh.write(" tx m.port\n") + fh.write("}}\n") + with open(rx_tx_1_file, "w+") as fh: + fh.write(f"port in 0 ethdev {self.sut_node.config.ports[0].pci} rxq 0 bsz 32\n") + fh.write("port out 0 ring RXQ0 bsz 32\n") + with open(rx_tx_2_file, "w+") as fh: + fh.write("port in 0 ring TXQ0 bsz 32\n") + fh.write(f"port out 1 ethdev {self.sut_node.config.ports[1].pci} txq 0 bsz 32\n") + + # copy files over to SUT + self.sut_node.main_session.copy_to(cli_file, cli_file_sut) + self.sut_node.main_session.copy_to(spec_file, spec_file_sut) + self.sut_node.main_session.copy_to(rx_tx_1_file, rx_tx_1_file_sut) + self.sut_node.main_session.copy_to(rx_tx_2_file, rx_tx_2_file_sut) + # and cleanup local files + cli_file.unlink() + spec_file.unlink() + rx_tx_1_file.unlink() + rx_tx_2_file.unlink() + + return cli_file_sut + + @func_test + def softnic(self) -> None: + """Softnic test. + + Steps: + Start Testpmd with a softnic vdev using the provided config files. + Testpmd forwarding is disabled, instead configure softnic to forward packets + from port 0 to port 1 of the physical device. + Send generated packets from the TG. + + Verify: + The packets that are received are the same as the packets sent. + + """ + with TestPmdShell( + self.sut_node, + vdevs=[VirtualDevice(f"net_softnic0,firmware={self.cli_file},cpu_id=1,conn_port=8086")], + eth_peer=[EthPeer(1, self.tg_node.ports[1].mac_address)], + port_topology=None, + disable_device_start=True, + ) as shell: + shell.start() + received_packets = self.send_packets_and_capture(self.packets) + # packets are being forwarded without addresses being amended so + # we get the address as it would be expected to come from TG + expected_packets = self.get_expected_packets(self.packets, sent_from_tg=True) + + self.match_all_packets(expected_packets, received_packets) -- 2.39.2 ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-12-31 11:31 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2024-12-31 11:24 [PATCH v1 1/2] dts: allow expected packets to come from the TG Paul Szczepanek 2024-12-31 11:24 ` [PATCH v1 2/2] dts: add softnic test Paul Szczepanek 2024-12-31 11:31 ` [PATCH v2 1/2] dts: allow expected packets to come from the TG Paul Szczepanek 2024-12-31 11:31 ` [PATCH v2 2/2] dts: add softnic test Paul Szczepanek
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).