<div dir="ltr">Recheck-request: <span style="color:rgb(51,51,51);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px">iol-unit-arm64-testing</span></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Fri, Oct 23, 2026 at 5:04 PM Koushik Bhargav Nimoji <<a href="mailto:knimoji@iol.unh.edu">knimoji@iol.unh.edu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Previously, users were unable to run both functional and performance<br>
test suites in a single DTS run due to driver binding conflicts.<br>
This patch separates traffic generator setup by test suite, in<br>
order to allow running functional and performance test suites in<br>
the same DTS run.<br>
<br>
Signed-off-by: Koushik Bhargav Nimoji <<a href="mailto:knimoji@iol.unh.edu" target="_blank">knimoji@iol.unh.edu</a>><br>
---<br>
v2:<br>
     *Added TRex TG teardown to re-bind ports<br>
      to kernel driver<br>
v3:<br>
     *Added topology-based port binding upon<br>
      TRex setup to preserve internal port<br>
      config state, removed all manual bindings<br>
---<br>
 dts/api/test_suite.py                         | 40 +++++++++++++++++++<br>
 dts/framework/test_run.py                     | 24 ++++++++---<br>
 dts/framework/testbed_model/linux_session.py  |  6 ++-<br>
 .../testbed_model/traffic_generator/trex.py   |  1 +<br>
 dts/tests/TestSuite_blocklist.py              |  3 +-<br>
 dts/tests/TestSuite_buffer_scatter.py         |  3 +-<br>
 dts/tests/TestSuite_checksum_offload.py       |  3 +-<br>
 dts/tests/TestSuite_cryptodev_latency.py      |  3 +-<br>
 dts/tests/TestSuite_cryptodev_throughput.py   |  3 +-<br>
 dts/tests/TestSuite_dual_vlan.py              |  3 +-<br>
 dts/tests/TestSuite_dynamic_config.py         |  3 +-<br>
 dts/tests/TestSuite_dynamic_queue_conf.py     |  3 +-<br>
 dts/tests/TestSuite_flow_offload.py           |  3 +-<br>
 dts/tests/TestSuite_hello_world.py            |  3 +-<br>
 dts/tests/TestSuite_l2fwd.py                  |  3 +-<br>
 dts/tests/TestSuite_mac_filter.py             |  3 +-<br>
 dts/tests/TestSuite_mtu.py                    |  3 +-<br>
 dts/tests/TestSuite_packet_capture.py         |  3 +-<br>
 dts/tests/TestSuite_port_control.py           |  3 +-<br>
 ...stSuite_port_restart_config_persistency.py |  3 +-<br>
 dts/tests/TestSuite_port_stats.py             |  3 +-<br>
 dts/tests/TestSuite_promisc_support.py        |  3 +-<br>
 dts/tests/TestSuite_qinq.py                   |  3 +-<br>
 dts/tests/TestSuite_queue_toggle.py           |  3 +-<br>
 dts/tests/TestSuite_rss.py                    |  3 +-<br>
 dts/tests/TestSuite_rx_split.py               |  3 +-<br>
 dts/tests/TestSuite_rx_tx_offload.py          |  3 +-<br>
 .../TestSuite_single_core_forward_perf.py     |  3 +-<br>
 dts/tests/TestSuite_smoke_tests.py            |  3 +-<br>
 dts/tests/TestSuite_softnic.py                |  3 +-<br>
 dts/tests/TestSuite_speed_capabilities.py     |  3 +-<br>
 dts/tests/TestSuite_unified_packet.py         |  3 +-<br>
 dts/tests/TestSuite_virtio_forward.py         |  3 +-<br>
 dts/tests/TestSuite_vlan.py                   |  3 +-<br>
 34 files changed, 123 insertions(+), 38 deletions(-)<br>
<br>
diff --git a/dts/api/test_suite.py b/dts/api/test_suite.py<br>
index c30d447135..11027344d0 100644<br>
--- a/dts/api/test_suite.py<br>
+++ b/dts/api/test_suite.py<br>
@@ -44,6 +44,17 @@ class BaseConfig(FrozenModel):<br>
     """Base for a custom test suite configuration."""<br>
<br>
<br>
+class TestSuiteType(Enum):<br>
+    """Enum to specify test suite type."""<br>
+<br>
+    FUNC = auto()<br>
+    PERF = auto()<br>
+    CRYPTO = auto()<br>
+<br>
+<br>
+TestSuiteClassType = TypeVar("TestSuiteClassType", bound=type["TestSuite"])<br>
+<br>
+<br>
 class TestSuite(TestProtocol):<br>
     """The base class with building blocks needed by most test cases.<br>
<br>
@@ -84,6 +95,30 @@ class TestSuite(TestProtocol):<br>
     _sut_ip_address_egress: Union[IPv4Interface, IPv6Interface]<br>
     _tg_ip_address_ingress: Union[IPv4Interface, IPv6Interface]<br>
     _tg_ip_address_egress: Union[IPv4Interface, IPv6Interface]<br>
+    test_suite_type: ClassVar[TestSuiteType]<br>
+<br>
+    @classmethod<br>
+    def make_decorator(<br>
+        cls, test_suite_type: TestSuiteType<br>
+    ) -> Callable[[TestSuiteClassType], TestSuiteClassType]:<br>
+        """Creates a decorator for test suites.<br>
+<br>
+        The decorator casts the decorated function as :class:`TestSuite`,<br>
+        sets it as `testsuite_type` and initializes a variable to<br>
+        determine the type of test suite.<br>
+<br>
+        Args:<br>
+            test_suite_type: A functional, performance, or cryptodev test suite.<br>
+<br>
+        Returns:<br>
+            The decorator of a functional, performance, or cryptodev test suite.<br>
+        """<br>
+<br>
+        def _decorator(test_suite_cls: TestSuiteClassType) -> TestSuiteClassType:<br>
+            test_suite_cls.test_suite_type = test_suite_type<br>
+            return test_suite_cls<br>
+<br>
+        return _decorator<br>
<br>
     def __init__(self, config: BaseConfig) -> None:<br>
         """Initialize the test suite testbed information and basic configuration.<br>
@@ -269,6 +304,11 @@ def _adjust_addresses(self, packets: list[Packet], expected: bool = False) -> li<br>
         return ret_packets<br>
<br>
<br>
+#: Test suite type decorators<br>
+func_suite: Callable[[Any], type["TestSuite"]] = TestSuite.make_decorator(TestSuiteType.FUNC)<br>
+perf_suite: Callable[[Any], type["TestSuite"]] = TestSuite.make_decorator(TestSuiteType.PERF)<br>
+crypto_suite: Callable[[Any], type["TestSuite"]] = TestSuite.make_decorator(TestSuiteType.CRYPTO)<br>
+<br>
 #: The generic type for a method of an instance of TestSuite<br>
 TestSuiteMethodType = TypeVar("TestSuiteMethodType", bound=Callable[[TestSuite], None])<br>
<br>
diff --git a/dts/framework/test_run.py b/dts/framework/test_run.py<br>
index 210ff25af7..3890606512 100644<br>
--- a/dts/framework/test_run.py<br>
+++ b/dts/framework/test_run.py<br>
@@ -110,7 +110,7 @@<br>
 from api.capabilities import LinkTopology<br>
 from api.context import Context, init_ctx<br>
 from api.exception import InternalError, SkippedTestException, TestCaseVerifyError<br>
-from api.test_suite import BaseConfig, TestCase, TestCaseType, TestSuite<br>
+from api.test_suite import BaseConfig, TestCase, TestCaseType, TestSuite, TestSuiteType<br>
 from api.testbed_model.capability import (<br>
     Capability,<br>
     get_supported_capabilities,<br>
@@ -375,11 +375,6 @@ def next(self) -> State | None:<br>
             ctx.topology.bind_cryptodevs("dpdk")<br>
<br>
         ctx.topology.configure_ports("sut", "dpdk")<br>
-        if ctx.func_tg and ctx.topology.type is not LinkTopology.NO_LINK:<br>
-            ctx.func_tg.setup(ctx.topology)<br>
-        if ctx.perf_tg and ctx.topology.type is not LinkTopology.NO_LINK:<br>
-            ctx.perf_tg.setup(ctx.topology)<br>
-<br>
         self.result.ports = [<br>
             port.to_dict() for port in ctx.topology.sut_ports + ctx.topology.tg_ports<br>
         ]<br>
@@ -512,6 +507,23 @@ def before(self) -> None:<br>
         super().before()<br>
         self.logger.set_custom_log_file(<a href="http://self.test_suite.name" rel="noreferrer" target="_blank">self.test_suite.name</a>)<br>
<br>
+        ctx = self.test_run.ctx<br>
+        test_suite_type = self.test_suite.test_suite_type<br>
+        if (<br>
+            ctx.topology.type is not LinkTopology.NO_LINK<br>
+            and test_suite_type is not TestSuiteType.CRYPTO<br>
+        ):<br>
+            if test_suite_type == TestSuiteType.FUNC:<br>
+                required_tg, other_tg = ctx.func_tg, ctx.perf_tg<br>
+            else:<br>
+                required_tg, other_tg = ctx.perf_tg, ctx.func_tg<br>
+<br>
+            if other_tg and other_tg.is_setup:<br>
+                other_tg.teardown()<br>
+<br>
+            if required_tg and not required_tg.is_setup:<br>
+                required_tg.setup(ctx.topology)<br>
+<br>
     @property<br>
     def description(self) -> str:<br>
         """State description."""<br>
diff --git a/dts/framework/testbed_model/linux_session.py b/dts/framework/testbed_model/linux_session.py<br>
index 8cc0d09d01..fe3f1a8fc3 100644<br>
--- a/dts/framework/testbed_model/linux_session.py<br>
+++ b/dts/framework/testbed_model/linux_session.py<br>
@@ -278,7 +278,8 @@ def bind_ports_to_driver(self, ports: list[Port], driver_name: str) -> None:<br>
             verify=True,<br>
         )<br>
<br>
-        del self._lshw_net_info<br>
+        if self._lshw_net_info:<br>
+            del self._lshw_net_info<br>
<br>
     def bring_up_link(self, ports: Iterable[Port]) -> None:<br>
         """Overrides :meth:`~.os_session.OSSession.bring_up_link`."""<br>
@@ -287,7 +288,8 @@ def bring_up_link(self, ports: Iterable[Port]) -> None:<br>
                 f"ip link set dev {port.logical_name} up", privileged=True, verify=True<br>
             )<br>
<br>
-        del self._lshw_net_info<br>
+        if self._lshw_net_info:<br>
+            del self._lshw_net_info<br>
<br>
     def set_interface_link_up(self, name: str) -> None:<br>
         """Overrides :meth:`~.os_session.OSSession.set_interface_link_up`."""<br>
diff --git a/dts/framework/testbed_model/traffic_generator/trex.py b/dts/framework/testbed_model/traffic_generator/trex.py<br>
index 7ce1d40d79..055c22e121 100644<br>
--- a/dts/framework/testbed_model/traffic_generator/trex.py<br>
+++ b/dts/framework/testbed_model/traffic_generator/trex.py<br>
@@ -110,6 +110,7 @@ def __init__(self, tg_node: Node, config: TrexTrafficGeneratorConfig) -> None:<br>
     def setup(self, topology: Topology):<br>
         """Initialize and start a TRex server process."""<br>
         super().setup(topology)<br>
+        topology.configure_ports("tg", "dpdk")<br>
         self._topology = topology<br>
<br>
         self._shell = PythonShell(self._tg_node, "TRex-client", privileged=True)<br>
diff --git a/dts/tests/TestSuite_blocklist.py b/dts/tests/TestSuite_blocklist.py<br>
index 31e69c0de9..e32f31b383 100644<br>
--- a/dts/tests/TestSuite_blocklist.py<br>
+++ b/dts/tests/TestSuite_blocklist.py<br>
@@ -11,11 +11,12 @@<br>
     requires_link_topology,<br>
 )<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testbed_model.port import Port<br>
 from api.testpmd import TestPmd<br>
<br>
<br>
+@func_suite<br>
 class TestBlocklist(TestSuite):<br>
     """DPDK device blocklisting test suite."""<br>
<br>
diff --git a/dts/tests/TestSuite_buffer_scatter.py b/dts/tests/TestSuite_buffer_scatter.py<br>
index cd1a52ad5e..adc8e41700 100644<br>
--- a/dts/tests/TestSuite_buffer_scatter.py<br>
+++ b/dts/tests/TestSuite_buffer_scatter.py<br>
@@ -28,13 +28,14 @@<br>
 )<br>
 from api.packet import send_packet_and_capture<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
<br>
<br>
 @requires_nic_capability(NicCapability.PHYSICAL_FUNCTION)<br>
 @requires_nic_capability(NicCapability.PORT_RX_OFFLOAD_SCATTER)<br>
+@func_suite<br>
 class TestBufferScatter(TestSuite):<br>
     """DPDK PMD packet scattering test suite.<br>
<br>
diff --git a/dts/tests/TestSuite_checksum_offload.py b/dts/tests/TestSuite_checksum_offload.py<br>
index a2ea13991b..8c16706f1b 100644<br>
--- a/dts/tests/TestSuite_checksum_offload.py<br>
+++ b/dts/tests/TestSuite_checksum_offload.py<br>
@@ -25,7 +25,7 @@<br>
 )<br>
 from api.packet import send_packet_and_capture<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
 from api.testpmd.types import ChecksumOffloadOptions, PacketOffloadFlag<br>
@@ -34,6 +34,7 @@<br>
 @requires_nic_capability(NicCapability.PORT_RX_OFFLOAD_IPV4_CKSUM)<br>
 @requires_nic_capability(NicCapability.PORT_RX_OFFLOAD_UDP_CKSUM)<br>
 @requires_nic_capability(NicCapability.PORT_RX_OFFLOAD_TCP_CKSUM)<br>
+@func_suite<br>
 class TestChecksumOffload(TestSuite):<br>
     """Checksum offload test suite.<br>
<br>
diff --git a/dts/tests/TestSuite_cryptodev_latency.py b/dts/tests/TestSuite_cryptodev_latency.py<br>
index 444a5b282c..bf3b9b5761 100644<br>
--- a/dts/tests/TestSuite_cryptodev_latency.py<br>
+++ b/dts/tests/TestSuite_cryptodev_latency.py<br>
@@ -31,7 +31,7 @@<br>
     CryptodevResults,<br>
 )<br>
 from api.test import skip, verify<br>
-from api.test_suite import BaseConfig, TestSuite, crypto_test<br>
+from api.test_suite import BaseConfig, TestSuite, crypto_suite, crypto_test<br>
 from api.testbed_model.virtual_device import VirtualDevice<br>
<br>
 config_list: list[dict[str, int | float | str]] = [<br>
@@ -73,6 +73,7 @@ class Config(BaseConfig):<br>
<br>
<br>
 @requires_link_topology(LinkTopology.NO_LINK)<br>
+@crypto_suite<br>
 class TestCryptodevLatency(TestSuite):<br>
     """DPDK Crypto Device Testing Suite."""<br>
<br>
diff --git a/dts/tests/TestSuite_cryptodev_throughput.py b/dts/tests/TestSuite_cryptodev_throughput.py<br>
index 59f64f2cd7..7a364a1dc4 100644<br>
--- a/dts/tests/TestSuite_cryptodev_throughput.py<br>
+++ b/dts/tests/TestSuite_cryptodev_throughput.py<br>
@@ -31,7 +31,7 @@<br>
     CryptodevResults,<br>
 )<br>
 from api.test import skip, verify<br>
-from api.test_suite import BaseConfig, TestSuite, crypto_test<br>
+from api.test_suite import BaseConfig, TestSuite, crypto_suite, crypto_test<br>
 from api.testbed_model.virtual_device import VirtualDevice<br>
<br>
 config_list: list[dict[str, int | float | str]] = [<br>
@@ -74,6 +74,7 @@ class Config(BaseConfig):<br>
<br>
<br>
 @requires_link_topology(LinkTopology.NO_LINK)<br>
+@crypto_suite<br>
 class TestCryptodevThroughput(TestSuite):<br>
     """DPDK Crypto Device Testing Suite."""<br>
<br>
diff --git a/dts/tests/TestSuite_dual_vlan.py b/dts/tests/TestSuite_dual_vlan.py<br>
index f3347a6d52..6038899c5c 100644<br>
--- a/dts/tests/TestSuite_dual_vlan.py<br>
+++ b/dts/tests/TestSuite_dual_vlan.py<br>
@@ -21,11 +21,12 @@<br>
 from api.capabilities import LinkTopology, requires_link_topology<br>
 from api.packet import send_packet_and_capture<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
<br>
<br>
+@func_suite<br>
 class TestDualVlan(TestSuite):<br>
     """DPDK Dual VLAN test suite.<br>
<br>
diff --git a/dts/tests/TestSuite_dynamic_config.py b/dts/tests/TestSuite_dynamic_config.py<br>
index b9e2c30da1..e071e63a6d 100644<br>
--- a/dts/tests/TestSuite_dynamic_config.py<br>
+++ b/dts/tests/TestSuite_dynamic_config.py<br>
@@ -27,13 +27,14 @@<br>
 )<br>
 from api.packet import send_packet_and_capture<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
<br>
<br>
 @requires_nic_capability(NicCapability.PHYSICAL_FUNCTION)<br>
 @requires_link_topology(LinkTopology.TWO_LINKS)<br>
+@func_suite<br>
 class TestDynamicConfig(TestSuite):<br>
     """Dynamic config suite.<br>
<br>
diff --git a/dts/tests/TestSuite_dynamic_queue_conf.py b/dts/tests/TestSuite_dynamic_queue_conf.py<br>
index 24584c7d60..bc11d1ce1f 100644<br>
--- a/dts/tests/TestSuite_dynamic_queue_conf.py<br>
+++ b/dts/tests/TestSuite_dynamic_queue_conf.py<br>
@@ -38,7 +38,7 @@<br>
 from api.exception import InteractiveCommandExecutionError<br>
 from api.packet import send_packets<br>
 from api.test import fail, verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import PortTopology, SimpleForwardingModes<br>
<br>
@@ -121,6 +121,7 @@ def _wrap(self: "TestDynamicQueueConf", is_rx_testing: bool) -> None:<br>
<br>
<br>
 @requires_nic_capability(NicCapability.PHYSICAL_FUNCTION)<br>
+@func_suite<br>
 class TestDynamicQueueConf(TestSuite):<br>
     """DPDK dynamic queue configuration test suite.<br>
<br>
diff --git a/dts/tests/TestSuite_flow_offload.py b/dts/tests/TestSuite_flow_offload.py<br>
index 09384b1983..624ff93b17 100644<br>
--- a/dts/tests/TestSuite_flow_offload.py<br>
+++ b/dts/tests/TestSuite_flow_offload.py<br>
@@ -28,7 +28,7 @@<br>
 )<br>
 from api.packet import send_packet_and_capture<br>
 from api.test import fail, log, verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.types import FlowRule<br>
<br>
@@ -402,6 +402,7 @@ def generate(<br>
<br>
<br>
 @requires_nic_capability(NicCapability.FLOW_CTRL)<br>
+@func_suite<br>
 class TestFlowOffload(TestSuite):<br>
     """Flow offload test suite.<br>
<br>
diff --git a/dts/tests/TestSuite_hello_world.py b/dts/tests/TestSuite_hello_world.py<br>
index cd62eb8f3e..9bc555aa08 100644<br>
--- a/dts/tests/TestSuite_hello_world.py<br>
+++ b/dts/tests/TestSuite_hello_world.py<br>
@@ -9,7 +9,7 @@<br>
 """<br>
<br>
 from api.test import log<br>
-from api.test_suite import BaseConfig, TestSuite, func_test<br>
+from api.test_suite import BaseConfig, TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
<br>
<br>
@@ -20,6 +20,7 @@ class Config(BaseConfig):<br>
     msg: str = "Hello World!"<br>
<br>
<br>
+@func_suite<br>
 class TestHelloWorld(TestSuite):<br>
     """Hello World test suite. One test case, which starts and stops a testpmd session."""<br>
<br>
diff --git a/dts/tests/TestSuite_l2fwd.py b/dts/tests/TestSuite_l2fwd.py<br>
index f237821a04..b987efbebf 100644<br>
--- a/dts/tests/TestSuite_l2fwd.py<br>
+++ b/dts/tests/TestSuite_l2fwd.py<br>
@@ -19,7 +19,7 @@<br>
     match_all_packets,<br>
     send_packets_and_capture,<br>
 )<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testbed_model.cpu import LogicalCoreCount<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import EthPeer, SimpleForwardingModes<br>
@@ -28,6 +28,7 @@<br>
<br>
 @requires_nic_capability(NicCapability.PHYSICAL_FUNCTION)<br>
 @requires_link_topology(LinkTopology.TWO_LINKS)<br>
+@func_suite<br>
 class TestL2fwd(TestSuite):<br>
     """L2 forwarding test suite."""<br>
<br>
diff --git a/dts/tests/TestSuite_mac_filter.py b/dts/tests/TestSuite_mac_filter.py<br>
index eb1413f336..f244203593 100644<br>
--- a/dts/tests/TestSuite_mac_filter.py<br>
+++ b/dts/tests/TestSuite_mac_filter.py<br>
@@ -26,11 +26,12 @@<br>
 from api.exception import InteractiveCommandExecutionError<br>
 from api.packet import send_packet_and_capture<br>
 from api.test import fail, verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
<br>
<br>
 @requires_nic_capability(NicCapability.PHYSICAL_FUNCTION)<br>
+@func_suite<br>
 class TestMacFilter(TestSuite):<br>
     """Mac address allowlist filtering test suite.<br>
<br>
diff --git a/dts/tests/TestSuite_mtu.py b/dts/tests/TestSuite_mtu.py<br>
index c264db299e..f834be1818 100644<br>
--- a/dts/tests/TestSuite_mtu.py<br>
+++ b/dts/tests/TestSuite_mtu.py<br>
@@ -23,7 +23,7 @@<br>
 )<br>
 from api.packet import send_packet_and_capture<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
<br>
 STANDARD_FRAME = 1518  # --max-pkt-len will subtract l2 information at a minimum of 18 bytes.<br>
@@ -37,6 +37,7 @@<br>
<br>
<br>
 @requires_nic_capability(NicCapability.PHYSICAL_FUNCTION)<br>
+@func_suite<br>
 class TestMtu(TestSuite):<br>
     """DPDK PMD jumbo frames and MTU update test suite.<br>
<br>
diff --git a/dts/tests/TestSuite_packet_capture.py b/dts/tests/TestSuite_packet_capture.py<br>
index 07bfabb30b..f319d99ede 100644<br>
--- a/dts/tests/TestSuite_packet_capture.py<br>
+++ b/dts/tests/TestSuite_packet_capture.py<br>
@@ -37,7 +37,7 @@<br>
 )<br>
 from api.params import Params<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testbed_model.cpu import LogicalCoreList<br>
 from api.testbed_model.traffic_generator.capturing_traffic_generator import PacketFilteringConfig<br>
 from api.testpmd import TestPmd<br>
@@ -65,6 +65,7 @@ class DumpcapParams(Params):<br>
<br>
<br>
 @requires_link_topology(LinkTopology.TWO_LINKS)<br>
+@func_suite<br>
 class TestPacketCapture(TestSuite):<br>
     """Packet Capture TestSuite.<br>
<br>
diff --git a/dts/tests/TestSuite_port_control.py b/dts/tests/TestSuite_port_control.py<br>
index c2f2de3493..2aa613bc25 100644<br>
--- a/dts/tests/TestSuite_port_control.py<br>
+++ b/dts/tests/TestSuite_port_control.py<br>
@@ -18,12 +18,13 @@<br>
 )<br>
 from api.packet import send_packets_and_capture<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
<br>
<br>
 @requires_nic_capability(NicCapability.PHYSICAL_FUNCTION)<br>
+@func_suite<br>
 class TestPortControl(TestSuite):<br>
     """DPDK Port Control Testing Suite."""<br>
<br>
diff --git a/dts/tests/TestSuite_port_restart_config_persistency.py b/dts/tests/TestSuite_port_restart_config_persistency.py<br>
index 88df35d33c..626baa2097 100644<br>
--- a/dts/tests/TestSuite_port_restart_config_persistency.py<br>
+++ b/dts/tests/TestSuite_port_restart_config_persistency.py<br>
@@ -14,7 +14,7 @@<br>
     requires_nic_capability,<br>
 )<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.types import TestPmdPortFlowCtrl<br>
<br>
@@ -23,6 +23,7 @@<br>
 ALTERNATIVE_MAC_ADDRESS: str = "42:A6:B7:9E:B4:81"<br>
<br>
<br>
+@func_suite<br>
 class TestPortRestartConfigPersistency(TestSuite):<br>
     """Port config persistency test suite."""<br>
<br>
diff --git a/dts/tests/TestSuite_port_stats.py b/dts/tests/TestSuite_port_stats.py<br>
index 0328c6718c..e2980d8d61 100644<br>
--- a/dts/tests/TestSuite_port_stats.py<br>
+++ b/dts/tests/TestSuite_port_stats.py<br>
@@ -25,7 +25,7 @@<br>
 )<br>
 from api.packet import send_packet_and_capture<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
 from api.testpmd.types import RtePTypes, TestPmdVerbosePacket<br>
@@ -33,6 +33,7 @@<br>
<br>
 @requires_nic_capability(NicCapability.PHYSICAL_FUNCTION)<br>
 @requires_link_topology(LinkTopology.TWO_LINKS)<br>
+@func_suite<br>
 class TestPortStats(TestSuite):<br>
     """DPDK Port statistics testing suite.<br>
<br>
diff --git a/dts/tests/TestSuite_promisc_support.py b/dts/tests/TestSuite_promisc_support.py<br>
index c59c8c6078..adbdf77631 100644<br>
--- a/dts/tests/TestSuite_promisc_support.py<br>
+++ b/dts/tests/TestSuite_promisc_support.py<br>
@@ -21,11 +21,12 @@<br>
     send_packets_and_capture,<br>
 )<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
<br>
<br>
 @requires_nic_capability(NicCapability.PHYSICAL_FUNCTION)<br>
+@func_suite<br>
 class TestPromiscSupport(TestSuite):<br>
     """Promiscuous mode support test suite."""<br>
<br>
diff --git a/dts/tests/TestSuite_qinq.py b/dts/tests/TestSuite_qinq.py<br>
index 5dde37d4db..67884a113c 100644<br>
--- a/dts/tests/TestSuite_qinq.py<br>
+++ b/dts/tests/TestSuite_qinq.py<br>
@@ -18,10 +18,11 @@<br>
 from api.capabilities import NicCapability, requires_nic_capability<br>
 from api.packet import send_packet_and_capture<br>
 from api.test import log, verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
<br>
<br>
+@func_suite<br>
 class TestQinq(TestSuite):<br>
     """QinQ test suite.<br>
<br>
diff --git a/dts/tests/TestSuite_queue_toggle.py b/dts/tests/TestSuite_queue_toggle.py<br>
index a9ea356b22..0ad362d233 100644<br>
--- a/dts/tests/TestSuite_queue_toggle.py<br>
+++ b/dts/tests/TestSuite_queue_toggle.py<br>
@@ -24,7 +24,7 @@<br>
 )<br>
 from api.packet import send_packet_and_capture<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
<br>
@@ -32,6 +32,7 @@<br>
 @requires_link_topology(LinkTopology.TWO_LINKS)<br>
 @requires_nic_capability(NicCapability.RUNTIME_RX_QUEUE_SETUP)<br>
 @requires_nic_capability(NicCapability.RUNTIME_TX_QUEUE_SETUP)<br>
+@func_suite<br>
 class TestQueueToggle(TestSuite):<br>
     """DPDK Queue start/stop test suite.<br>
<br>
diff --git a/dts/tests/TestSuite_rss.py b/dts/tests/TestSuite_rss.py<br>
index b538e93af9..289c69d225 100644<br>
--- a/dts/tests/TestSuite_rss.py<br>
+++ b/dts/tests/TestSuite_rss.py<br>
@@ -23,7 +23,7 @@<br>
 from api.exception import InteractiveCommandExecutionError<br>
 from api.packet import send_packets_and_capture<br>
 from api.test import verify<br>
-from api.test_suite import BaseConfig, TestSuite, func_test<br>
+from api.test_suite import BaseConfig, TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
 from api.testpmd.types import (<br>
@@ -55,6 +55,7 @@ class HashAlgorithm(StrEnum):<br>
<br>
 @requires_link_topology(LinkTopology.ONE_LINK)<br>
 @requires_nic_capability(NicCapability.PORT_RX_OFFLOAD_RSS_HASH)<br>
+@func_suite<br>
 class TestRss(TestSuite):<br>
     """RSS test suite."""<br>
<br>
diff --git a/dts/tests/TestSuite_rx_split.py b/dts/tests/TestSuite_rx_split.py<br>
index 3b3e4cd620..eac377e93e 100644<br>
--- a/dts/tests/TestSuite_rx_split.py<br>
+++ b/dts/tests/TestSuite_rx_split.py<br>
@@ -21,7 +21,7 @@<br>
 from api.exception import InteractiveCommandExecutionError<br>
 from api.packet import adjust_addresses, send_packet_and_capture<br>
 from api.test import fail, verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
 from api.testpmd.types import RxOffloadCapability, TxOffloadCapability<br>
@@ -35,6 +35,7 @@<br>
<br>
 @requires_nic_capability(NicCapability.PORT_RX_OFFLOAD_BUFFER_SPLIT)<br>
 @requires_nic_capability(NicCapability.SELECTIVE_RX)<br>
+@func_suite<br>
 class TestRxSplit(TestSuite):<br>
     """Rx split test suite.<br>
<br>
diff --git a/dts/tests/TestSuite_rx_tx_offload.py b/dts/tests/TestSuite_rx_tx_offload.py<br>
index c8d24baaae..cbf9a249b4 100644<br>
--- a/dts/tests/TestSuite_rx_tx_offload.py<br>
+++ b/dts/tests/TestSuite_rx_tx_offload.py<br>
@@ -13,7 +13,7 @@<br>
     requires_nic_capability,<br>
 )<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.types import (<br>
     OffloadConfiguration,<br>
@@ -22,6 +22,7 @@<br>
<br>
<br>
 @requires_link_topology(LinkTopology.ONE_LINK)<br>
+@func_suite<br>
 class TestRxTxOffload(TestSuite):<br>
     """RX/TX offload test suite."""<br>
<br>
diff --git a/dts/tests/TestSuite_single_core_forward_perf.py b/dts/tests/TestSuite_single_core_forward_perf.py<br>
index 4b22c5d091..c96411cf18 100644<br>
--- a/dts/tests/TestSuite_single_core_forward_perf.py<br>
+++ b/dts/tests/TestSuite_single_core_forward_perf.py<br>
@@ -23,7 +23,7 @@<br>
 from api.packet import assess_performance_by_packet<br>
 from api.params.types import TestPmdParamsDict<br>
 from api.test import verify, write_performance_json<br>
-from api.test_suite import BaseConfig, TestSuite, perf_test<br>
+from api.test_suite import BaseConfig, TestSuite, perf_suite, perf_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import RXRingParams, TXRingParams<br>
<br>
@@ -42,6 +42,7 @@ class Config(BaseConfig):<br>
     delta_tolerance: float = 0.05<br>
<br>
<br>
+@perf_suite<br>
 @requires_link_topology(LinkTopology.TWO_LINKS)<br>
 class TestSingleCoreForwardPerf(TestSuite):<br>
     """Single core forwarding performance test suite."""<br>
diff --git a/dts/tests/TestSuite_smoke_tests.py b/dts/tests/TestSuite_smoke_tests.py<br>
index b3eb325fc0..993620641c 100644<br>
--- a/dts/tests/TestSuite_smoke_tests.py<br>
+++ b/dts/tests/TestSuite_smoke_tests.py<br>
@@ -19,7 +19,7 @@<br>
     requires_link_topology,<br>
 )<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testbed_model.linux_session import LinuxSession<br>
 from api.testpmd import TestPmd<br>
 from api.utils import REGEX_FOR_PCI_ADDRESS<br>
@@ -28,6 +28,7 @@<br>
<br>
<br>
 @requires_link_topology(LinkTopology.NO_LINK)<br>
+@func_suite<br>
 class TestSmokeTests(TestSuite):<br>
     """DPDK and infrastructure smoke test suite.<br>
<br>
diff --git a/dts/tests/TestSuite_softnic.py b/dts/tests/TestSuite_softnic.py<br>
index 05a6d3aa18..f601130d56 100644<br>
--- a/dts/tests/TestSuite_softnic.py<br>
+++ b/dts/tests/TestSuite_softnic.py<br>
@@ -18,7 +18,7 @@<br>
     match_all_packets,<br>
     send_packets_and_capture,<br>
 )<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testbed_model.virtual_device import VirtualDevice<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import EthPeer<br>
@@ -27,6 +27,7 @@<br>
<br>
 @requires_nic_capability(NicCapability.PHYSICAL_FUNCTION)<br>
 @requires_link_topology(LinkTopology.TWO_LINKS)<br>
+@func_suite<br>
 class TestSoftnic(TestSuite):<br>
     """Softnic test suite."""<br>
<br>
diff --git a/dts/tests/TestSuite_speed_capabilities.py b/dts/tests/TestSuite_speed_capabilities.py<br>
index c9b0f74feb..56c0d0a51a 100644<br>
--- a/dts/tests/TestSuite_speed_capabilities.py<br>
+++ b/dts/tests/TestSuite_speed_capabilities.py<br>
@@ -13,7 +13,7 @@<br>
     requires_link_topology,<br>
 )<br>
 from api.test import verify<br>
-from api.test_suite import BaseConfig, TestSuite, func_test<br>
+from api.test_suite import BaseConfig, TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
<br>
<br>
@@ -39,6 +39,7 @@ class Config(BaseConfig):<br>
<br>
<br>
 @requires_link_topology(LinkTopology.ONE_LINK)<br>
+@func_suite<br>
 class TestSpeedCapabilities(TestSuite):<br>
     """Speed capabilities test suite."""<br>
<br>
diff --git a/dts/tests/TestSuite_unified_packet.py b/dts/tests/TestSuite_unified_packet.py<br>
index bf3654f0d7..006f124d19 100644<br>
--- a/dts/tests/TestSuite_unified_packet.py<br>
+++ b/dts/tests/TestSuite_unified_packet.py<br>
@@ -25,12 +25,13 @@<br>
 )<br>
 from api.packet import send_packet_and_capture<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
 from api.testpmd.types import RtePTypes, TestPmdVerbosePacket<br>
<br>
<br>
+@func_suite<br>
 class TestUnifiedPacket(TestSuite):<br>
     """DPDK Unified packet test suite.<br>
<br>
diff --git a/dts/tests/TestSuite_virtio_forward.py b/dts/tests/TestSuite_virtio_forward.py<br>
index a52c1a4402..52889a844b 100644<br>
--- a/dts/tests/TestSuite_virtio_forward.py<br>
+++ b/dts/tests/TestSuite_virtio_forward.py<br>
@@ -12,13 +12,14 @@<br>
 from api.capabilities import LinkTopology, requires_link_topology<br>
 from api.packet import send_packets_and_capture<br>
 from api.test import log, verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testbed_model.linux_session import LinuxSession<br>
 from api.testbed_model.virtual_device import VirtualDevice<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import PortTopology, SimpleForwardingModes<br>
<br>
<br>
+@func_suite<br>
 class TestVirtioForward(TestSuite):<br>
     """Virtio forwarding test suite."""<br>
<br>
diff --git a/dts/tests/TestSuite_vlan.py b/dts/tests/TestSuite_vlan.py<br>
index 975e87b128..edd93e3487 100644<br>
--- a/dts/tests/TestSuite_vlan.py<br>
+++ b/dts/tests/TestSuite_vlan.py<br>
@@ -23,12 +23,13 @@<br>
 )<br>
 from api.packet import send_packet_and_capture<br>
 from api.test import verify<br>
-from api.test_suite import TestSuite, func_test<br>
+from api.test_suite import TestSuite, func_suite, func_test<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
<br>
<br>
 @requires_nic_capability(NicCapability.PORT_RX_OFFLOAD_VLAN_FILTER)<br>
+@func_suite<br>
 class TestVlan(TestSuite):<br>
     """DPDK VLAN test suite.<br>
<br>
-- <br>
2.56.0<br>
<br>
</blockquote></div>