<div dir="ltr">Recheck-request: iol-mellanox-Performance</div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Tue, Aug 11, 2026 at 2:55 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>
 dts/framework/test_result.py                  |  1 +<br>
 dts/framework/test_run.py                     | 29 +++++++++++---<br>
 dts/framework/test_suite.py                   | 40 +++++++++++++++++++<br>
 dts/framework/testbed_model/linux_session.py  |  6 ++-<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, 128 insertions(+), 38 deletions(-)<br>
<br>
diff --git a/dts/framework/test_result.py b/dts/framework/test_result.py<br>
index 21faa55dc1..13ed8f671c 100644<br>
--- a/dts/framework/test_result.py<br>
+++ b/dts/framework/test_result.py<br>
@@ -117,6 +117,7 @@ class ResultNode(BaseModel):<br>
     label: str<br>
     children: list[Union["ResultNode", ResultLeaf]] = Field(default_factory=list)<br>
     parent: Union["ResultNode", None] = None<br>
+    ports: list[dict[str, str]] | None = None<br>
<br>
     def add_child(self, label: str) -> "ResultNode":<br>
         """Creates and append a child node to the model.<br>
diff --git a/dts/framework/test_run.py b/dts/framework/test_run.py<br>
index c20a0fa885..b23930b953 100644<br>
--- a/dts/framework/test_run.py<br>
+++ b/dts/framework/test_run.py<br>
@@ -115,7 +115,7 @@<br>
 from framework.remote_session.dpdk import DPDKBuildEnvironment, DPDKRuntimeEnvironment<br>
 from framework.settings import SETTINGS<br>
 from framework.test_result import Result, ResultNode, TestRunResult<br>
-from framework.test_suite import BaseConfig, TestCase, TestCaseType, TestSuite<br>
+from framework.test_suite import BaseConfig, TestCase, TestCaseType, TestSuite, TestSuiteType<br>
 from framework.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>
@@ -506,12 +501,34 @@ class TestSuiteSetup(TestSuiteState):<br>
     """Test suite setup."""<br>
<br>
     logger_name: ClassVar[str] = "test_suite_setup"<br>
+    test_run: TestRun<br>
<br>
     def before(self) -> None:<br>
         """Hook before the state is processed."""<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>
+        testsuite_type = self.test_suite.testsuite_type<br>
+        if (<br>
+            ctx.topology.type is not LinkTopology.NO_LINK<br>
+            and testsuite_type is not TestSuiteType.CRYPTO<br>
+        ):<br>
+            if testsuite_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 testsuite_type == TestSuiteType.FUNC and ctx.tg_node:<br>
+                    for port in ctx.topology.tg_ports:<br>
+                        ctx.tg_node.main_session.bind_ports_to_driver([port], port.config.os_driver)<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/test_suite.py b/dts/framework/test_suite.py<br>
index 69ce26040a..554fe3a475 100644<br>
--- a/dts/framework/test_suite.py<br>
+++ b/dts/framework/test_suite.py<br>
@@ -45,6 +45,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>
@@ -85,6 +96,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>
+    testsuite_type: ClassVar[TestSuiteType]<br>
+<br>
+    @classmethod<br>
+    def make_decorator(<br>
+        cls, testsuite_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>
+            testsuite_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(testsuite_cls: TestSuiteClassType) -> TestSuiteClassType:<br>
+            testsuite_cls.testsuite_type = testsuite_type<br>
+            return testsuite_cls<br>
+<br>
+        return _decorator<br>
<br>
     def __init__(self, config: BaseConfig) -> None:<br>
         """Initialize the test suite testbed information and basic configuration.<br>
@@ -270,6 +305,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/testbed_model/linux_session.py b/dts/framework/testbed_model/linux_session.py<br>
index c118f803b6..861b09e413 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/tests/TestSuite_blocklist.py b/dts/tests/TestSuite_blocklist.py<br>
index c57231de22..46c5ff57cb 100644<br>
--- a/dts/tests/TestSuite_blocklist.py<br>
+++ b/dts/tests/TestSuite_blocklist.py<br>
@@ -12,10 +12,11 @@<br>
 )<br>
 from api.test import verify<br>
 from api.testpmd import TestPmd<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<br>
 from framework.testbed_model.port import Port<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 539082f2e4..b9064e8022 100644<br>
--- a/dts/tests/TestSuite_buffer_scatter.py<br>
+++ b/dts/tests/TestSuite_buffer_scatter.py<br>
@@ -30,11 +30,12 @@<br>
 from api.test import verify<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<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 90ca798e56..2a9d4ef631 100644<br>
--- a/dts/tests/TestSuite_checksum_offload.py<br>
+++ b/dts/tests/TestSuite_checksum_offload.py<br>
@@ -28,12 +28,13 @@<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
 from api.testpmd.types import ChecksumOffloadOptions, PacketOffloadFlag<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<br>
<br>
<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 4e7d814faa..e63c43a12b 100644<br>
--- a/dts/tests/TestSuite_cryptodev_latency.py<br>
+++ b/dts/tests/TestSuite_cryptodev_latency.py<br>
@@ -31,7 +31,7 @@<br>
 )<br>
 from api.test import skip, verify<br>
 from framework.context import get_ctx<br>
-from framework.test_suite import BaseConfig, TestSuite, crypto_test<br>
+from framework.test_suite import BaseConfig, TestSuite, crypto_suite, crypto_test<br>
 from framework.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 2fc0d8779a..93727d90d4 100644<br>
--- a/dts/tests/TestSuite_cryptodev_throughput.py<br>
+++ b/dts/tests/TestSuite_cryptodev_throughput.py<br>
@@ -32,7 +32,7 @@<br>
 from api.test import verify<br>
 from framework.context import get_ctx<br>
 from framework.exception import SkippedTestException<br>
-from framework.test_suite import BaseConfig, TestSuite, crypto_test<br>
+from framework.test_suite import BaseConfig, TestSuite, crypto_suite, crypto_test<br>
 from framework.testbed_model.virtual_device import VirtualDevice<br>
<br>
 config_list: list[dict[str, int | float | str]] = [<br>
@@ -75,6 +75,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 1b77dd2b47..8676a65c80 100644<br>
--- a/dts/tests/TestSuite_dual_vlan.py<br>
+++ b/dts/tests/TestSuite_dual_vlan.py<br>
@@ -23,9 +23,10 @@<br>
 from api.test import verify<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<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 7204ec4f73..94554a735e 100644<br>
--- a/dts/tests/TestSuite_dynamic_config.py<br>
+++ b/dts/tests/TestSuite_dynamic_config.py<br>
@@ -29,11 +29,12 @@<br>
 from api.test import verify<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<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 5ac85bee7d..c92edc7306 100644<br>
--- a/dts/tests/TestSuite_dynamic_queue_conf.py<br>
+++ b/dts/tests/TestSuite_dynamic_queue_conf.py<br>
@@ -40,7 +40,7 @@<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import PortTopology, SimpleForwardingModes<br>
 from framework.exception import InteractiveCommandExecutionError<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<br>
<br>
<br>
 def setup_and_teardown_test(<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 be11d09875..d955eb7d7d 100644<br>
--- a/dts/tests/TestSuite_flow_offload.py<br>
+++ b/dts/tests/TestSuite_flow_offload.py<br>
@@ -30,7 +30,7 @@<br>
     SkippedTestException,<br>
     TestCaseVerifyError,<br>
 )<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<br>
<br>
<br>
 @dataclass<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 bf1a93c782..0beb144644 100644<br>
--- a/dts/tests/TestSuite_hello_world.py<br>
+++ b/dts/tests/TestSuite_hello_world.py<br>
@@ -10,7 +10,7 @@<br>
<br>
 from api.test import log<br>
 from api.testpmd import TestPmd<br>
-from framework.test_suite import BaseConfig, TestSuite, func_test<br>
+from framework.test_suite import BaseConfig, TestSuite, func_suite, func_test<br>
<br>
<br>
 class Config(BaseConfig):<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 596b892730..3f9f1dd12d 100644<br>
--- a/dts/tests/TestSuite_l2fwd.py<br>
+++ b/dts/tests/TestSuite_l2fwd.py<br>
@@ -21,13 +21,14 @@<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import EthPeer, SimpleForwardingModes<br>
 from framework.context import filter_cores<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<br>
 from framework.testbed_model.cpu import LogicalCoreCount<br>
 from framework.utils import generate_random_packets<br>
<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 a7e24b37d5..def0b97856 100644<br>
--- a/dts/tests/TestSuite_mac_filter.py<br>
+++ b/dts/tests/TestSuite_mac_filter.py<br>
@@ -27,10 +27,11 @@<br>
 from api.test import fail, verify<br>
 from api.testpmd import TestPmd<br>
 from framework.exception import InteractiveCommandExecutionError<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<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 8355495d33..06de6c9c1a 100644<br>
--- a/dts/tests/TestSuite_mtu.py<br>
+++ b/dts/tests/TestSuite_mtu.py<br>
@@ -24,7 +24,7 @@<br>
 from api.packet import send_packet_and_capture<br>
 from api.test import verify<br>
 from api.testpmd import TestPmd<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<br>
<br>
 STANDARD_FRAME = 1518  # --max-pkt-len will subtract l2 information at a minimum of 18 bytes.<br>
 JUMBO_FRAME = 9018<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 4bd15e2401..f26b03f46f 100644<br>
--- a/dts/tests/TestSuite_packet_capture.py<br>
+++ b/dts/tests/TestSuite_packet_capture.py<br>
@@ -40,7 +40,7 @@<br>
 from framework.params import Params<br>
 from framework.remote_session.blocking_app import BlockingApp<br>
 from framework.remote_session.dpdk_shell import compute_eal_params<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<br>
 from framework.testbed_model.cpu import LogicalCoreList<br>
 from framework.testbed_model.traffic_generator.capturing_traffic_generator import (<br>
     PacketFilteringConfig,<br>
@@ -67,6 +67,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 b51fdc2959..858ab3af8b 100644<br>
--- a/dts/tests/TestSuite_port_control.py<br>
+++ b/dts/tests/TestSuite_port_control.py<br>
@@ -20,10 +20,11 @@<br>
 from api.test import verify<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<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 4ea22b6d70..646e80651b 100644<br>
--- a/dts/tests/TestSuite_port_restart_config_persistency.py<br>
+++ b/dts/tests/TestSuite_port_restart_config_persistency.py<br>
@@ -16,13 +16,14 @@<br>
 from api.test import verify<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.types import TestPmdPortFlowCtrl<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<br>
<br>
 ALTERNATIVE_MTU: int = 800<br>
 STANDARD_MTU: int = 1500<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 3dc045f847..a737c17fb0 100644<br>
--- a/dts/tests/TestSuite_port_stats.py<br>
+++ b/dts/tests/TestSuite_port_stats.py<br>
@@ -28,11 +28,12 @@<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
 from api.testpmd.types import RtePTypes, TestPmdVerbosePacket<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<br>
<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 a0c65dc662..1907e779f8 100644<br>
--- a/dts/tests/TestSuite_promisc_support.py<br>
+++ b/dts/tests/TestSuite_promisc_support.py<br>
@@ -22,10 +22,11 @@<br>
 )<br>
 from api.test import verify<br>
 from api.testpmd import TestPmd<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<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 505d71dbc8..8fa4db2ab6 100644<br>
--- a/dts/tests/TestSuite_qinq.py<br>
+++ b/dts/tests/TestSuite_qinq.py<br>
@@ -19,9 +19,10 @@<br>
 from api.packet import send_packet_and_capture<br>
 from api.test import log, verify<br>
 from api.testpmd import TestPmd<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<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 e4edc89123..97e80965d8 100644<br>
--- a/dts/tests/TestSuite_queue_toggle.py<br>
+++ b/dts/tests/TestSuite_queue_toggle.py<br>
@@ -26,12 +26,13 @@<br>
 from api.test import verify<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<br>
<br>
<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 2747c8a36c..062b2d8891 100644<br>
--- a/dts/tests/TestSuite_rss.py<br>
+++ b/dts/tests/TestSuite_rss.py<br>
@@ -30,7 +30,7 @@<br>
     TestPmdVerbosePacket,<br>
 )<br>
 from framework.exception import InteractiveCommandExecutionError<br>
-from framework.test_suite import BaseConfig, TestSuite, func_test<br>
+from framework.test_suite import BaseConfig, TestSuite, func_suite, func_test<br>
 from framework.utils import StrEnum<br>
<br>
<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 5117a569e2..8b9cf38095 100644<br>
--- a/dts/tests/TestSuite_rx_split.py<br>
+++ b/dts/tests/TestSuite_rx_split.py<br>
@@ -24,7 +24,7 @@<br>
 from api.testpmd.config import SimpleForwardingModes<br>
 from api.testpmd.types import RxOffloadCapability, TxOffloadCapability<br>
 from framework.exception import InteractiveCommandExecutionError<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<br>
<br>
 PAYLOAD = bytes(range(256))<br>
 ETHER_HDR_LEN = len(Ether(dst="00:00:00:00:00:00"))<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 b0da627d3c..4a4607c685 100644<br>
--- a/dts/tests/TestSuite_rx_tx_offload.py<br>
+++ b/dts/tests/TestSuite_rx_tx_offload.py<br>
@@ -18,10 +18,11 @@<br>
     OffloadConfiguration,<br>
     RxTxLiteralSwitch,<br>
 )<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<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 57aecdf7a4..f30a5322a0 100644<br>
--- a/dts/tests/TestSuite_single_core_forward_perf.py<br>
+++ b/dts/tests/TestSuite_single_core_forward_perf.py<br>
@@ -25,7 +25,7 @@<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import RXRingParams, TXRingParams<br>
 from framework.params.types import TestPmdParamsDict<br>
-from framework.test_suite import BaseConfig, TestSuite, perf_test<br>
+from framework.test_suite import BaseConfig, TestSuite, perf_suite, perf_test<br>
<br>
<br>
 class Config(BaseConfig):<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 271ad4301c..368614e7ed 100644<br>
--- a/dts/tests/TestSuite_smoke_tests.py<br>
+++ b/dts/tests/TestSuite_smoke_tests.py<br>
@@ -22,12 +22,13 @@<br>
 from api.testpmd import TestPmd<br>
 from framework.config.node import PortConfig<br>
 from framework.settings import SETTINGS<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<br>
 from framework.testbed_model.linux_session import LinuxSession<br>
 from framework.utils import REGEX_FOR_PCI_ADDRESS<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 fa91f7ee2f..07da406a2d 100644<br>
--- a/dts/tests/TestSuite_softnic.py<br>
+++ b/dts/tests/TestSuite_softnic.py<br>
@@ -20,13 +20,14 @@<br>
 )<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import EthPeer<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<br>
 from framework.testbed_model.virtual_device import VirtualDevice<br>
 from framework.utils import generate_random_packets<br>
<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 9cbd6f1ef7..5fbe1fe5c3 100644<br>
--- a/dts/tests/TestSuite_speed_capabilities.py<br>
+++ b/dts/tests/TestSuite_speed_capabilities.py<br>
@@ -14,7 +14,7 @@<br>
 )<br>
 from api.test import verify<br>
 from api.testpmd import TestPmd<br>
-from framework.test_suite import BaseConfig, TestSuite, func_test<br>
+from framework.test_suite import BaseConfig, TestSuite, func_suite, func_test<br>
<br>
<br>
 class Config(BaseConfig):<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 fcc7f7fbbb..05f52d5690 100644<br>
--- a/dts/tests/TestSuite_unified_packet.py<br>
+++ b/dts/tests/TestSuite_unified_packet.py<br>
@@ -28,9 +28,10 @@<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
 from api.testpmd.types import RtePTypes, TestPmdVerbosePacket<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<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 6efaa4e156..c2a4a4612e 100644<br>
--- a/dts/tests/TestSuite_virtio_forward.py<br>
+++ b/dts/tests/TestSuite_virtio_forward.py<br>
@@ -14,12 +14,13 @@<br>
 from api.test import log, verify<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import PortTopology, SimpleForwardingModes<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<br>
 from framework.testbed_model.capability import requires<br>
 from framework.testbed_model.linux_session import LinuxSession<br>
 from framework.testbed_model.virtual_device import VirtualDevice<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 898673fc86..14011da087 100644<br>
--- a/dts/tests/TestSuite_vlan.py<br>
+++ b/dts/tests/TestSuite_vlan.py<br>
@@ -25,10 +25,11 @@<br>
 from api.test import verify<br>
 from api.testpmd import TestPmd<br>
 from api.testpmd.config import SimpleForwardingModes<br>
-from framework.test_suite import TestSuite, func_test<br>
+from framework.test_suite import TestSuite, func_suite, func_test<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.55.0<br>
<br>
</blockquote></div>