On Wed, Jul 2, 2025 at 12:23 PM Dean Marx <dm...@iol.unh.edu> wrote:

> Add a physical function NIC capability that checks
> if the test run is using PFs. Add PF capability
> requirement to all suites/cases that do not
> run without error on virtual functions.
>
> Signed-off-by: Dean Marx <dm...@iol.unh.edu>
> ---
>  dts/framework/remote_session/testpmd_shell.py | 22 +++++++++++++++++++
>  dts/tests/TestSuite_dynamic_config.py         |  3 ++-
>  dts/tests/TestSuite_dynamic_queue_conf.py     |  1 +
>  dts/tests/TestSuite_l2fwd.py                  |  3 ++-
>  dts/tests/TestSuite_mac_filter.py             |  1 +
>  dts/tests/TestSuite_mtu.py                    |  4 +++-
>  dts/tests/TestSuite_pmd_buffer_scatter.py     |  1 +
>  dts/tests/TestSuite_port_control.py           |  3 ++-
>  dts/tests/TestSuite_port_stats.py             |  2 ++
>  dts/tests/TestSuite_promisc_support.py        |  4 +++-
>  dts/tests/TestSuite_rte_flow.py               |  1 +
>  dts/tests/TestSuite_softnic.py                |  3 ++-
>  dts/tests/TestSuite_uni_pkt.py                |  2 ++
>  13 files changed, 44 insertions(+), 6 deletions(-)
>
> diff --git a/dts/framework/remote_session/testpmd_shell.py
> b/dts/framework/remote_session/testpmd_shell.py
> index 6d75f89969..ad8cb273dc 100644
> --- a/dts/framework/remote_session/testpmd_shell.py
> +++ b/dts/framework/remote_session/testpmd_shell.py
> @@ -2655,6 +2655,23 @@ def get_capabilities_flow_ctrl(
>          else:
>              unsupported_capabilities.add(NicCapability.FLOW_CTRL)
>
> +    def get_capabilities_physical_function(
> +        self,
> +        supported_capabilities: MutableSet["NicCapability"],
> +        unsupported_capabilities: MutableSet["NicCapability"],
> +    ) -> None:
> +        """Store capability representing a physical function test run.
> +
> +        Args:
> +            supported_capabilities: Supported capabilities will be added
> to this set.
> +            unsupported_capabilities: Unsupported capabilities will be
> added to this set.
> +        """
> +        ctx = get_ctx()
> +        if ctx.topology.vf_ports == []:
> +            supported_capabilities.add(NicCapability.PHYSICAL_FUNCTION)
> +        else:
> +            unsupported_capabilities.add(NicCapability.PHYSICAL_FUNCTION)
> +
>

Another option would be to read directly from
config.virtual_functions_testrun. But, it's the same thing at the end of
the day.


>
>  class NicCapability(NoAliasEnum):
>      """A mapping between capability names and the associated
> :class:`TestPmdShell` methods.
> @@ -2803,6 +2820,11 @@ class NicCapability(NoAliasEnum):
>      )
>      #: Device supports flow ctrl.
>      FLOW_CTRL: TestPmdShellNicCapability =
> (TestPmdShell.get_capabilities_flow_ctrl, None)
> +    #: Device is running on a physical function.
> +    PHYSICAL_FUNCTION: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_physical_function,
> +        None,
> +    )
>
>      def __call__(
>          self,
> diff --git a/dts/tests/TestSuite_dynamic_config.py
> b/dts/tests/TestSuite_dynamic_config.py
> index 1fce31a0b5..49f295a39a 100644
> --- a/dts/tests/TestSuite_dynamic_config.py
> +++ b/dts/tests/TestSuite_dynamic_config.py
> @@ -20,11 +20,12 @@
>  from scapy.packet import Raw
>
>  from framework.params.testpmd import SimpleForwardingModes
> -from framework.remote_session.testpmd_shell import TestPmdShell
> +from framework.remote_session.testpmd_shell import NicCapability,
> TestPmdShell
>  from framework.test_suite import TestSuite, func_test
>  from framework.testbed_model.capability import TopologyType, requires
>
>
> +@requires(NicCapability.PHYSICAL_FUNCTION)
>  @requires(topology_type=TopologyType.two_links)
>  class TestDynamicConfig(TestSuite):
>      """Dynamic config suite.
> diff --git a/dts/tests/TestSuite_dynamic_queue_conf.py
> b/dts/tests/TestSuite_dynamic_queue_conf.py
> index 344dd540eb..f8c7dbfb71 100644
> --- a/dts/tests/TestSuite_dynamic_queue_conf.py
> +++ b/dts/tests/TestSuite_dynamic_queue_conf.py
> @@ -117,6 +117,7 @@ def wrap(self: "TestDynamicQueueConf", is_rx_testing:
> bool) -> None:
>      return wrap
>
>
> +@requires(NicCapability.PHYSICAL_FUNCTION)
>  class TestDynamicQueueConf(TestSuite):
>      """DPDK dynamic queue configuration test suite.
>
> diff --git a/dts/tests/TestSuite_l2fwd.py b/dts/tests/TestSuite_l2fwd.py
> index 0555d75ed8..5ffa2dcd19 100644
> --- a/dts/tests/TestSuite_l2fwd.py
> +++ b/dts/tests/TestSuite_l2fwd.py
> @@ -9,7 +9,7 @@
>
>  from framework.context import filter_cores
>  from framework.params.testpmd import EthPeer, SimpleForwardingModes
> -from framework.remote_session.testpmd_shell import TestPmdShell
> +from framework.remote_session.testpmd_shell import NicCapability,
> TestPmdShell
>  from framework.test_suite import TestSuite, func_test
>  from framework.testbed_model.capability import requires
>  from framework.testbed_model.cpu import LogicalCoreCount
> @@ -17,6 +17,7 @@
>  from framework.utils import generate_random_packets
>
>
> +@requires(NicCapability.PHYSICAL_FUNCTION)
>  @requires(topology_type=TopologyType.two_links)
>  class TestL2fwd(TestSuite):
>      """L2 forwarding test suite."""
> diff --git a/dts/tests/TestSuite_mac_filter.py
> b/dts/tests/TestSuite_mac_filter.py
> index 9dbfec5da2..2387fdfac2 100644
> --- a/dts/tests/TestSuite_mac_filter.py
> +++ b/dts/tests/TestSuite_mac_filter.py
> @@ -25,6 +25,7 @@
>  from framework.testbed_model.capability import requires
>
>
> +@requires(NicCapability.PHYSICAL_FUNCTION)
>  class TestMacFilter(TestSuite):
>      """Mac address allowlist filtering test suite.
>
> diff --git a/dts/tests/TestSuite_mtu.py b/dts/tests/TestSuite_mtu.py
> index af6ab88501..d5b3fe02af 100644
> --- a/dts/tests/TestSuite_mtu.py
> +++ b/dts/tests/TestSuite_mtu.py
> @@ -17,8 +17,9 @@
>  from scapy.layers.l2 import Ether
>  from scapy.packet import Raw
>
> -from framework.remote_session.testpmd_shell import TestPmdShell
> +from framework.remote_session.testpmd_shell import NicCapability,
> TestPmdShell
>  from framework.test_suite import TestSuite, func_test
> +from framework.testbed_model.capability import requires
>
>  STANDARD_FRAME = 1518  # --max-pkt-len will subtract l2 information at a
> minimum of 18 bytes.
>  JUMBO_FRAME = 9018
> @@ -30,6 +31,7 @@
>  VENDOR_AGNOSTIC_PADDING = 9  # Used as a work around for varying MTU
> definitions between vendors.
>
>
> +@requires(NicCapability.PHYSICAL_FUNCTION)
>  class TestMtu(TestSuite):
>      """DPDK PMD jumbo frames and MTU update test suite.
>
> diff --git a/dts/tests/TestSuite_pmd_buffer_scatter.py
> b/dts/tests/TestSuite_pmd_buffer_scatter.py
> index 5e23f28bc6..015163dd11 100644
> --- a/dts/tests/TestSuite_pmd_buffer_scatter.py
> +++ b/dts/tests/TestSuite_pmd_buffer_scatter.py
> @@ -28,6 +28,7 @@
>  from framework.testbed_model.capability import NicCapability, requires
>
>
> +@requires(NicCapability.PHYSICAL_FUNCTION)
>  @requires(NicCapability.RX_OFFLOAD_SCATTER)
>  class TestPmdBufferScatter(TestSuite):
>      """DPDK PMD packet scattering test suite.
> diff --git a/dts/tests/TestSuite_port_control.py
> b/dts/tests/TestSuite_port_control.py
> index ad5a09c58e..58783f1d18 100644
> --- a/dts/tests/TestSuite_port_control.py
> +++ b/dts/tests/TestSuite_port_control.py
> @@ -13,11 +13,12 @@
>  from scapy.packet import Packet, Raw
>
>  from framework.params.testpmd import SimpleForwardingModes
> -from framework.remote_session.testpmd_shell import TestPmdShell
> +from framework.remote_session.testpmd_shell import NicCapability,
> TestPmdShell
>  from framework.test_suite import TestSuite, func_test
>  from framework.testbed_model.capability import TopologyType, requires
>
>
> +@requires(NicCapability.PHYSICAL_FUNCTION)
>  @requires(topology_type=TopologyType.two_links)
>  class TestPortControl(TestSuite):
>      """DPDK Port Control Testing Suite."""
> diff --git a/dts/tests/TestSuite_port_stats.py
> b/dts/tests/TestSuite_port_stats.py
> index 2bb8747399..ddd28623b3 100644
> --- a/dts/tests/TestSuite_port_stats.py
> +++ b/dts/tests/TestSuite_port_stats.py
> @@ -19,6 +19,7 @@
>
>  from framework.params.testpmd import SimpleForwardingModes
>  from framework.remote_session.testpmd_shell import (
> +    NicCapability,
>      RtePTypes,
>      TestPmdShell,
>      TestPmdVerbosePacket,
> @@ -27,6 +28,7 @@
>  from framework.testbed_model.capability import TopologyType, requires
>
>
> +@requires(NicCapability.PHYSICAL_FUNCTION)
>  @requires(topology_type=TopologyType.two_links)
>  class TestPortStats(TestSuite):
>      """DPDK Port statistics testing suite.
> diff --git a/dts/tests/TestSuite_promisc_support.py
> b/dts/tests/TestSuite_promisc_support.py
> index 445f6e1d69..8a7a7efb57 100644
> --- a/dts/tests/TestSuite_promisc_support.py
> +++ b/dts/tests/TestSuite_promisc_support.py
> @@ -11,10 +11,12 @@
>  from scapy.layers.l2 import Ether
>  from scapy.packet import Raw
>
> -from framework.remote_session.testpmd_shell import TestPmdShell
> +from framework.remote_session.testpmd_shell import NicCapability,
> TestPmdShell
>  from framework.test_suite import TestSuite, func_test
> +from framework.testbed_model.capability import requires
>
>
> +@requires(NicCapability.PHYSICAL_FUNCTION)
>  class TestPromiscSupport(TestSuite):
>      """Promiscuous mode support test suite."""
>
> diff --git a/dts/tests/TestSuite_rte_flow.py
> b/dts/tests/TestSuite_rte_flow.py
> index e70f7ea8d1..4855e4261d 100644
> --- a/dts/tests/TestSuite_rte_flow.py
> +++ b/dts/tests/TestSuite_rte_flow.py
> @@ -316,6 +316,7 @@ def test_queue_action_IP(self) -> None:
>              test_queue=2,
>          )
>
> +    @requires(NicCapability.PHYSICAL_FUNCTION)
>      @func_test
>      def test_queue_action_L4(self) -> None:
>          """Validate flow rules with queue actions and TCP/UDP patterns.
> diff --git a/dts/tests/TestSuite_softnic.py
> b/dts/tests/TestSuite_softnic.py
> index c1873dca4c..27754c08e7 100644
> --- a/dts/tests/TestSuite_softnic.py
> +++ b/dts/tests/TestSuite_softnic.py
> @@ -9,7 +9,7 @@
>  from pathlib import Path, PurePath
>
>  from framework.params.testpmd import EthPeer
> -from framework.remote_session.testpmd_shell import TestPmdShell
> +from framework.remote_session.testpmd_shell import NicCapability,
> TestPmdShell
>  from framework.test_suite import TestSuite, func_test
>  from framework.testbed_model.capability import requires
>  from framework.testbed_model.topology import TopologyType
> @@ -17,6 +17,7 @@
>  from framework.utils import generate_random_packets
>
>
> +@requires(NicCapability.PHYSICAL_FUNCTION)
>  @requires(topology_type=TopologyType.two_links)
>  class TestSoftnic(TestSuite):
>      """Softnic test suite."""
> diff --git a/dts/tests/TestSuite_uni_pkt.py
> b/dts/tests/TestSuite_uni_pkt.py
> index fdb9c29059..690c5d4fd1 100644
> --- a/dts/tests/TestSuite_uni_pkt.py
> +++ b/dts/tests/TestSuite_uni_pkt.py
> @@ -20,6 +20,7 @@
>  from scapy.packet import Packet, Raw
>
>  from framework.remote_session.testpmd_shell import (
> +    NicCapability,
>      RtePTypes,
>      SimpleForwardingModes,
>      TestPmdShell,
> @@ -258,6 +259,7 @@ def test_nsh_packet_detect(self) -> None:
>          with TestPmdShell() as testpmd:
>              self.setup_session(testpmd=testpmd, expected_flags=flag_list,
> packet_list=packet_list)
>
> +    @requires(NicCapability.PHYSICAL_FUNCTION)
>      @func_test
>      def test_vxlan_tunnel_packet_detect(self) -> None:
>          """Ensure the correct flags are shown in the verbose output when
> sending VXLAN packets.
> --
> 2.49.0
>
>
In principle some of the functions performed in these testsuites should be
possible via VFs.

As a follow up task in 25.11 we should assess this and see if the total
list of VF compatible testsuites can be extended.

Reviewed-by: Patrick Robb <pr...@iol.unh.edu>
Tested-by: Patrick Robb <pr...@iol.unh.edu>

Reply via email to