[v5,2/3] dts: initial queue start/stop suite implementation

Message ID 20240703180820.18723-2-dmarx@iol.unh.edu (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers
Series [v5,1/3] dts: add functions to testpmd shell |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Dean Marx July 3, 2024, 6:08 p.m. UTC
This suite tests the ability of the Poll Mode Driver to enable
and disable Rx/Tx queues on a port.

Signed-off-by: Dean Marx <dmarx@iol.unh.edu>
---
 dts/tests/TestSuite_queue_start_stop.py | 94 +++++++++++++++++++++++++
 1 file changed, 94 insertions(+)
 create mode 100644 dts/tests/TestSuite_queue_start_stop.py
  

Comments

Jeremy Spewock July 10, 2024, 3:36 p.m. UTC | #1
Hey Dean, everything looks good here to me, but I had one thought
about how we do the verification below.

On Wed, Jul 3, 2024 at 2:08 PM Dean Marx <dmarx@iol.unh.edu> wrote:
<snip>
> +
> +    def test_rx_queue_start_stop(self) -> None:
> +        """Verify packets are not received by port 0 when Rx queue is disabled.
> +
> +        Test:
> +            Create an interactive testpmd session, stop Rx queue on port 0, verify
> +            packets are not received.
> +        """
> +        testpmd = TestPmdShell(node=self.sut_node)
> +        testpmd.set_forward_mode(SimpleForwardingModes.mac)
> +        testpmd.stop_port_queue(0, 0, True)
> +
> +        testpmd.start()
> +        self.send_packet_and_verify(should_receive=False)
> +        stats = testpmd.show_port_stats(port_id=0)
> +        self.verify(
> +            stats.rx_packets == 0,
> +            "Packets were received on Rx queue when it should've been disabled",
> +        )

Thinking more about this verification step, I think it makes a lot of
sense why we can verify here using port stats even though we usually
can't. One thing I was thinking about with this however is I think
there is a (probably small) chance that before you get the chance to
stop the port after opening testpmd, a packet is sent to it. When I
tested this it seemed like this verification step worked with some
NICs (like one I ran with on the bnxt_en driver), but specifically
because when you stop the Rx queue it clears all of the Rx stats on
the port. I'm not sure if this is something PMD specific or not, but
it might be worth putting a small comment in here that explains that
disabling the queue will reset the stats and that we then don't expect
the stat to grow from that point on at all.

If handling this number is something PMD specific, another alternative
route we could take would be taking the statistics that are returned
from the "stop" command. I think this would work because the
statistics from the stop command are only aggregated while packet
forwarding is running, and we know that we stopped the queue before
starting forwarding so that number should truly always be 0.



> +        testpmd.close()
> +
> +    def test_tx_queue_start_stop(self) -> None:
> +        """Verify packets are not forwarded by port 1 when Tx queue is disabled.
> +
> +        Test:
> +            Create an interactive testpmd session, stop Tx queue on port 1, verify
> +            packets are not forwarded.
> +        """
> +        testpmd = TestPmdShell(node=self.sut_node)
> +        testpmd.set_forward_mode(SimpleForwardingModes.mac)
> +        testpmd.stop_port_queue(1, 0, False)
> +        testpmd.start()
> +        self.send_packet_and_verify(should_receive=False)
> +        stats = testpmd.show_port_stats(port_id=1)
> +        self.verify(
> +            stats.tx_packets == 0,
> +            "Packets were forwarded on Tx queue when it should've been disabled",
> +        )
> +        testpmd.close()
> --
> 2.44.0
>
  

Patch

diff --git a/dts/tests/TestSuite_queue_start_stop.py b/dts/tests/TestSuite_queue_start_stop.py
new file mode 100644
index 0000000000..644e2113fd
--- /dev/null
+++ b/dts/tests/TestSuite_queue_start_stop.py
@@ -0,0 +1,94 @@ 
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2024 University of New Hampshire
+
+"""Rx/Tx queue start and stop functionality suite.
+
+This suite tests the ability of the poll mode driver to start and
+stop either the Rx or Tx queue (depending on the port) during runtime,
+and verify that packets are not received when one is disabled.
+
+Given a paired port topology, the Rx queue will be disabled on port 0,
+and the Tx queue will be disabled on port 1.
+
+"""
+
+from scapy.layers.inet import IP  # type: ignore[import-untyped]
+from scapy.layers.l2 import Ether  # type: ignore[import-untyped]
+from scapy.packet import Raw  # type: ignore[import-untyped]
+
+from framework.remote_session.testpmd_shell import SimpleForwardingModes, TestPmdShell
+from framework.test_suite import TestSuite
+
+
+class TestQueueStartStop(TestSuite):
+    """DPDK Queue start/stop test suite.
+
+    Ensures Rx/Tx queue on a port can be disabled and enabled.
+    Verifies packets are not received when either queue is disabled.
+    The suite contains two test cases, Rx queue start/stop and
+    Tx queue start/stop, which each disable the corresponding
+    queue and verify that packets are not received/forwarded.
+    """
+
+    def set_up_suite(self) -> None:
+        """Set up the test suite.
+
+        Setup:
+            Verify that at least two ports are open for session.
+        """
+        self.verify(len(self._port_links) > 1, "Not enough ports")
+
+    def send_packet_and_verify(self, should_receive: bool = True):
+        """Generate a packet, send to the DUT, and verify it is forwarded back.
+
+        Args:
+            should_receive: Indicate whether the packet should be received.
+        """
+        packet = Ether() / IP() / Raw(load="xxxxx")
+        received = self.send_packet_and_capture(packet)
+        contains_packet = any(
+            packet.haslayer(Raw) and b"xxxxx" in packet.load for packet in received
+        )
+        self.verify(
+            should_receive == contains_packet,
+            f"Packet was {'dropped' if should_receive else 'received'}",
+        )
+
+    def test_rx_queue_start_stop(self) -> None:
+        """Verify packets are not received by port 0 when Rx queue is disabled.
+
+        Test:
+            Create an interactive testpmd session, stop Rx queue on port 0, verify
+            packets are not received.
+        """
+        testpmd = TestPmdShell(node=self.sut_node)
+        testpmd.set_forward_mode(SimpleForwardingModes.mac)
+        testpmd.stop_port_queue(0, 0, True)
+
+        testpmd.start()
+        self.send_packet_and_verify(should_receive=False)
+        stats = testpmd.show_port_stats(port_id=0)
+        self.verify(
+            stats.rx_packets == 0,
+            "Packets were received on Rx queue when it should've been disabled",
+        )
+        testpmd.close()
+
+    def test_tx_queue_start_stop(self) -> None:
+        """Verify packets are not forwarded by port 1 when Tx queue is disabled.
+
+        Test:
+            Create an interactive testpmd session, stop Tx queue on port 1, verify
+            packets are not forwarded.
+        """
+        testpmd = TestPmdShell(node=self.sut_node)
+        testpmd.set_forward_mode(SimpleForwardingModes.mac)
+        testpmd.stop_port_queue(1, 0, False)
+        testpmd.start()
+        self.send_packet_and_verify(should_receive=False)
+        stats = testpmd.show_port_stats(port_id=1)
+        self.verify(
+            stats.tx_packets == 0,
+            "Packets were forwarded on Tx queue when it should've been disabled",
+        )
+        testpmd.close()