<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>