DPDK patches and discussions
 help / color / mirror / Atom feed
From: Dean Marx <dmarx@iol.unh.edu>
To: Honnappa.Nagarahalli@arm.com, juraj.linkes@pantheon.tech,
	probb@iol.unh.edu, paul.szczepanek@arm.com,
	yoan.picchi@foss.arm.com, jspewock@iol.unh.edu,
	bruce.richardson@intel.com, luca.vizzarro@arm.com
Cc: dev@dpdk.org, Dean Marx <dmarx@iol.unh.edu>
Subject: [PATCH v4 2/3] dts: updated testpmd shell class
Date: Tue, 18 Jun 2024 11:20:52 -0400	[thread overview]
Message-ID: <20240618152053.30723-2-dmarx@iol.unh.edu> (raw)
In-Reply-To: <20240618152053.30723-1-dmarx@iol.unh.edu>

Ported over the promisc and verbose mode functions from 
v2 of the queue start/stop suite to use for the VLAN suite. 
Tweaked some of the verification methods to be
more concise, changed some docstrings to be more specific.

Signed-off-by: Dean Marx <dmarx@iol.unh.edu>
---
 dts/framework/remote_session/testpmd_shell.py | 186 +++++++++++++-----
 1 file changed, 141 insertions(+), 45 deletions(-)

diff --git a/dts/framework/remote_session/testpmd_shell.py b/dts/framework/remote_session/testpmd_shell.py
index 5bbc7d3b1c..aad3a3a448 100644
--- a/dts/framework/remote_session/testpmd_shell.py
+++ b/dts/framework/remote_session/testpmd_shell.py
@@ -225,7 +225,7 @@ def set_forward_mode(self, mode: TestPmdForwardingModes, verify: bool = True):
                 f"Test pmd failed to set fwd mode to {mode.value}"
             )
 
-    def vlan_filter_set_on(self, port: int = 0, verify: bool = True):
+    def vlan_filter_set_on(self, port: int, verify: bool = True):
         """Set vlan filter on.
 
         Args:
@@ -240,11 +240,11 @@ def vlan_filter_set_on(self, port: int = 0, verify: bool = True):
         """
         filter_cmd_output = self.send_command(f"vlan set filter on {port}")
         if verify:
-            if "Invalid port" in filter_cmd_output:
-                self._logger.debug(f"Failed to enable vlan filter: \n{filter_cmd_output}")
-                raise InteractiveCommandExecutionError("Testpmd failed to enable vlan filter.")
+            if "Invalid port" in filter_cmd_output or "filter: on" not in self.send_command(f"show port info {port}"):
+                self._logger.debug(f"Failed to enable vlan filter on port {port}: \n{filter_cmd_output}")
+                raise InteractiveCommandExecutionError(f"Testpmd failed to enable vlan filter on port {port}.")
 
-    def vlan_filter_set_off(self, port: int = 0, verify: bool = True):
+    def vlan_filter_set_off(self, port: int, verify: bool = True):
         """Set vlan filter off.
 
         Args:
@@ -259,31 +259,31 @@ def vlan_filter_set_off(self, port: int = 0, verify: bool = True):
         """
         filter_cmd_output = self.send_command(f"vlan set filter off {port}")
         if verify:
-            if "Invalid port" in filter_cmd_output:
-                self._logger.debug(f"Failed to disable vlan filter: \n{filter_cmd_output}")
-                raise InteractiveCommandExecutionError("Testpmd failed to disable vlan filter.")
+            if "Invalid port" in filter_cmd_output or "filter: off" not in self.send_command(f"show port info {port}"):
+                self._logger.debug(f"Failed to disable vlan filter on port {port}: \n{filter_cmd_output}")
+                raise InteractiveCommandExecutionError(f"Testpmd failed to disable vlan filter on port {port}.")
 
-    def rx_vlan_add(self, vlan: int = 0, port: int = 0, verify: bool = True):
+    def rx_vlan_add(self, vlan: int, port: int, verify: bool = True):
         """Add specified vlan tag to the filter list on a port.
 
         Args:
-            vlan: The vlan tag to add, should be within 1-4094.
+            vlan: The vlan tag to add, should be within 1-1005, 1-4094 extended.
             port: The port number to add the tag on, should be within 0-32.
             verify: If :data:`True`, the output of the command is scanned to verify that
                 the vlan tag was added to the filter list on the specified port. If not, it is
                 considered an error.
 
         Raises:
-            InteractiveCommandExecutionError: If `verify` is :data:`True` and the filter
-                fails to update.
+            InteractiveCommandExecutionError: If `verify` is :data:`True` and the tag
+            is not added.
         """
         vlan_add_output = self.send_command(f"rx_vlan add {vlan} {port}")
         if verify:
             if "VLAN-filtering disabled" in vlan_add_output or "Invalid vlan_id" in vlan_add_output:
-                self._logger.debug(f"Failed to add vlan tag: \n{vlan_add_output}")
-                raise InteractiveCommandExecutionError("Testpmd failed to add vlan tag.")
+                self._logger.debug(f"Failed to add vlan tag {vlan} on port {port}: \n{vlan_add_output}")
+                raise InteractiveCommandExecutionError(f"Testpmd failed to add vlan tag {vlan} on port {port}.")
 
-    def rx_vlan_rm(self, vlan: int = 0, port: int = 0, verify: bool = True):
+    def rx_vlan_rm(self, vlan: int, port: int, verify: bool = True):
         """Remove specified vlan tag from filter list on a port.
 
         Args:
@@ -294,16 +294,16 @@ def rx_vlan_rm(self, vlan: int = 0, port: int = 0, verify: bool = True):
                 considered an error.
 
         Raises:
-            InteractiveCommandExecutionError: If `verify` is :data:`True` and the filter
-                fails to update.
+            InteractiveCommandExecutionError: If `verify` is :data:`True` and the tag
+            is not removed.
         """
         vlan_rm_output = self.send_command(f"rx_vlan rm {vlan} {port}")
         if verify:
             if "VLAN-filtering disabled" in vlan_rm_output or "Invalid vlan_id" in vlan_rm_output:
-                self._logger.debug(f"Failed to add vlan tag: \n{vlan_rm_output}")
-                raise InteractiveCommandExecutionError("Testpmd failed to add vlan tag.")
+                self._logger.debug(f"Failed to remove vlan tag {vlan} on port {port}: \n{vlan_rm_output}")
+                raise InteractiveCommandExecutionError(f"Testpmd failed to remove vlan tag {vlan} on port {port}.")
 
-    def vlan_strip_set_on(self, port: int = 0, verify: bool = True):
+    def vlan_strip_set_on(self, port: int, verify: bool = True):
         """Enable vlan stripping on the specified port.
 
         Args:
@@ -313,16 +313,16 @@ def vlan_strip_set_on(self, port: int = 0, verify: bool = True):
                 considered an error.
 
         Raises:
-            InteractiveCommandExecutionError: If `verify` is :data:`True` and the filter
+            InteractiveCommandExecutionError: If `verify` is :data:`True` and stripping
                 fails to update.
         """
         vlan_strip_output = self.send_command(f"vlan set strip on {port}")
         if verify:
-            if "Invalid port" in vlan_strip_output:
-                self._logger.debug(f"Failed to add vlan tag: \n{vlan_strip_output}")
-                raise InteractiveCommandExecutionError("Testpmd failed to add vlan tag.")
+            if "strip on" not in self.send_command(f"show port info {port}"):
+                self._logger.debug(f"Failed to set vlan filter on for port {port}: \n{vlan_strip_output}")
+                raise InteractiveCommandExecutionError(f"Testpmd failed to set vlan filter on for port {port}.")
 
-    def vlan_strip_set_off(self, port: int = 0, verify: bool = True):
+    def vlan_strip_set_off(self, port: int, verify: bool = True):
         """Disable vlan stripping on the specified port.
 
         Args:
@@ -332,24 +332,71 @@ def vlan_strip_set_off(self, port: int = 0, verify: bool = True):
                 considered an error.
 
         Raises:
-            InteractiveCommandExecutionError: If `verify` is :data:`True` and the filter
+            InteractiveCommandExecutionError: If `verify` is :data:`True` and stripping
                 fails to update.
         """
         vlan_strip_output = self.send_command(f"vlan set strip off {port}")
         if verify:
-            if "Invalid port" in vlan_strip_output:
-                self._logger.debug(f"Failed to enable stripping: \n{vlan_strip_output}")
-                raise InteractiveCommandExecutionError(f"Testpmd failed to enable stripping on port {port}.")
+            if "strip off" not in self.send_command(f"show port info {port}"):
+                self._logger.debug(f"Failed to disable vlan stripping on port {port}: \n{vlan_strip_output}")
+                raise InteractiveCommandExecutionError(f"Testpmd failed to disable vlan stripping on port {port}.")
 
-    def port_stop_all(self):
-        """Stop all ports."""
-        self.send_command("port stop all")
+    def port_stop_all(self, verify: bool = True):
+        """Stop all ports.
 
-    def port_start_all(self):
-        """Start all ports."""
-        self.send_command("port start all")
+        Raises:
+            InteractiveCommandExecutionError: If `verify` is :data:`True` and all ports
+                fail to stop."""
+        port_output = self.send_command("port stop all")
+        if verify:
+            if "Done" not in port_output:
+                self._logger.debug(f"Failed to stop all ports: \n{port_output}")
+                raise InteractiveCommandExecutionError("Testpmd failed to stop all ports.")
+
+    def port_stop(self, port: int, verify: bool = True):
+        """Stop all ports.
 
-    def tx_vlan_set(self, port: int = 0, vlan: int = 0, verify: bool = True):
+        Args:
+            port: specifies the port number to use, must be between 0-32
+
+        Raises:
+            InteractiveCommandExecutionError: If `verify` is :data:`True` and the port
+                is not stopped."""
+        port_output = self.send_command(f"port stop {port}")
+        if verify:
+            if "Done" not in port_output:
+                self._logger.debug(f"Failed to stop port {port}: \n{port_output}")
+                raise InteractiveCommandExecutionError(f"Testpmd failed to stop port {port}.")
+
+    def port_start_all(self, verify: bool = True):
+        """Start all ports.
+
+        Raises:
+            InteractiveCommandExecutionError: If `verify` is :data:`True` and all ports
+            fail to start."""
+        port_output = self.send_command("port start all")
+        if verify:
+            if "Done" not in port_output:
+                self._logger.debug(f"Failed to start all ports: \n{port_output}")
+                raise InteractiveCommandExecutionError("Testpmd failed to start all ports.")
+
+    def port_start(self, port: int, verify: bool = True):
+        """Stop all ports.
+
+        Args:
+            port: specifies the port number to use, must be between 0-32
+
+        Raises:
+            InteractiveCommandExecutionError: If `verify` is :data:`True` and the port
+                is not started."""
+        port_output = self.send_command(f"port start {port}")
+        if verify:
+            if "Done" not in port_output:
+                self._logger.debug(f"Failed to start port {port}: \n{port_output}")
+                raise InteractiveCommandExecutionError(f"Testpmd failed to start port {port}.")
+
+
+    def tx_vlan_set(self, port: int, vlan: int, verify: bool = True):
         """Set hardware insertion of vlan tags in packets sent on a port.
 
         Args:
@@ -360,17 +407,17 @@ def tx_vlan_set(self, port: int = 0, vlan: int = 0, verify: bool = True):
                 considered an error.
 
         Raises:
-            InteractiveCommandExecutionError: If `verify` is :data:`True` and the filter
-                fails to update.
+            InteractiveCommandExecutionError: If `verify` is :data:`True` and the insertion
+            tag is not set.
         """
         vlan_insert_output = self.send_command(f"tx_vlan set {port} {vlan}")
         if verify:
             if ("Please stop port" in vlan_insert_output or "Invalid vlan_id" in vlan_insert_output
             or "Invalid port" in vlan_insert_output):
-                self._logger.debug(f"Failed to set vlan insertion tag: \n{vlan_insert_output}")
-                raise InteractiveCommandExecutionError("Testpmd failed to set vlan insertion tag.")
+                self._logger.debug(f"Failed to set vlan insertion tag {vlan} on port {port}: \n{vlan_insert_output}")
+                raise InteractiveCommandExecutionError(f"Testpmd failed to set vlan insertion tag {vlan} on port {port}.")
 
-    def tx_vlan_reset(self, port: int = 0, verify: bool = True):
+    def tx_vlan_reset(self, port: int, verify: bool = True):
         """Disable hardware insertion of vlan tags in packets sent on a port.
 
         Args:
@@ -380,14 +427,63 @@ def tx_vlan_reset(self, port: int = 0, verify: bool = True):
                 considered an error.
 
         Raises:
-            InteractiveCommandExecutionError: If `verify` is :data:`True` and the filter
-                fails to update.
+            InteractiveCommandExecutionError: If `verify` is :data:`True` and the insertion
+                tag is not reset.
         """
         vlan_insert_output = self.send_command(f"tx_vlan set {port}")
         if verify:
             if "Please stop port" in vlan_insert_output or "Invalid port" in vlan_insert_output:
-                self._logger.debug(f"Failed to reset vlan insertion: \n{vlan_insert_output}")
-                raise InteractiveCommandExecutionError("Testpmd failed to reset vlan insertion.")
+                self._logger.debug(f"Failed to reset vlan insertion on port {port}: \n{vlan_insert_output}")
+                raise InteractiveCommandExecutionError(f"Testpmd failed to reset vlan insertion on port {port}.")
+
+    def set_promisc(self, port: int, on: bool, verify: bool = True):
+        """Turns promiscuous mode on/off for the specified port
+
+        Args:
+            port: port number to use, should be within 0-32.
+            on: if :data:`True`, turn promisc mode on, otherwise turn off.
+            verify: if :data:`True` an additional command will be sent to verify that promisc mode
+                is properly set. Defaults to :data:`True`.
+
+        Raises:
+            InteractiveCommandExecutionError: If `verify` is :data:`True` and promisc mode
+            is not correctly set.
+        """
+        if on:
+            promisc_output = self.send_command(f"set promisc {port} on")
+        else:
+            promisc_output = self.send_command(f"set promisc {port} off")
+        if verify:
+            if (on and "Promiscuous mode: enabled" not in
+            self.send_command(f"show port info {port}")):
+                self._logger.debug(f"Failed to set promisc mode on port {port}: \n{promisc_output}")
+                raise InteractiveCommandExecutionError(f"Testpmd failed to set promisc mode on port {port}.")
+            elif (not on and "Promiscuous mode: disabled" not in
+            self.send_command(f"show port info {port}")):
+                self._logger.debug(f"Failed to set promisc mode on port {port}: \n{promisc_output}")
+                raise InteractiveCommandExecutionError(f"Testpmd failed to set promisc mode on port {port}.")
+
+
+    def set_verbose(self, level: int, verify: bool = True):
+        """Set debug verbosity level.
+
+        Args:
+            level: 0 - silent except for error
+            1 - fully verbose except for Tx packets
+            2 - fully verbose except for Rx packets
+            >2 - fully verbose
+            verify: if :data:`True` an additional command will be sent to verify that verbose level
+                is properly set. Defaults to :data:`True`.
+
+        Raises:
+            InteractiveCommandExecutionError: If `verify` is :data:`True` and verbose level
+            is not correctly set.
+        """
+        verbose_output = self.send_command(f"set verbose {level}")
+        if verify:
+            if "Change verbose level" not in verbose_output:
+                self._logger.debug(f"Failed to set verbose level to {level}: \n{verbose_output}")
+                raise InteractiveCommandExecutionError(f"Testpmd failed to set verbose level to {level}.")
 
     def close(self) -> None:
         """Overrides :meth:`~.interactive_shell.close`."""
-- 
2.44.0


  reply	other threads:[~2024-06-18 15:21 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-11 16:15 [PATCH v2 0/2] VLAN test suite Dean Marx
2024-06-11 16:15 ` [PATCH v2 1/2] Initial implementation for " Dean Marx
2024-06-11 16:15 ` [PATCH v2 2/2] conf schema Dean Marx
2024-06-14 15:02 ` [PATCH v3 0/3] VLAN Test Suite Dean Marx
2024-06-14 15:02   ` [PATCH v3 1/3] Added VLAN commands to testpmd_shell class Dean Marx
2024-06-14 15:59     ` Patrick Robb
2024-06-14 20:29       ` Jeremy Spewock
2024-06-14 21:24         ` Patrick Robb
2024-06-17 14:37     ` Jeremy Spewock
2024-06-14 15:02   ` [PATCH v3 2/3] Initial implementation for VLAN test suite Dean Marx
2024-06-14 16:19     ` Patrick Robb
2024-06-17 14:56     ` Jeremy Spewock
2024-06-14 15:02   ` [PATCH v3 3/3] Config schema Dean Marx
2024-06-17 14:59     ` Jeremy Spewock
2024-06-17 14:35   ` [PATCH v3 0/3] VLAN Test Suite Jeremy Spewock
2024-06-17 17:50   ` Patrick Robb
2024-06-18 15:20   ` [PATCH v4 1/3] dts: refactored VLAN test suite Dean Marx
2024-06-18 15:20     ` Dean Marx [this message]
2024-06-18 15:20     ` [PATCH v4 3/3] dts: config schema Dean Marx
2024-06-18 16:29   ` [PATCH v5 1/3] dts: updated testpmd shell class Dean Marx
2024-06-18 16:29     ` [PATCH v5 2/3] dts: refactored VLAN test suite Dean Marx
2024-06-21 20:53       ` Jeremy Spewock
2024-06-18 16:29     ` [PATCH v5 3/3] dts: config schema Dean Marx
2024-06-21 20:53       ` Jeremy Spewock
2024-06-21 20:50     ` [PATCH v5 1/3] dts: updated testpmd shell class Jeremy Spewock
2024-06-24 18:17   ` [PATCH v6 " Dean Marx
2024-06-24 18:17     ` [PATCH v6 2/3] dts: refactored VLAN test suite Dean Marx
2024-06-24 18:17     ` [PATCH v6 3/3] dts: config schema Dean Marx
2024-06-25 15:33   ` [PATCH v7 1/3] dts: VLAN test suite implementation Dean Marx
2024-06-25 15:33     ` [PATCH v7 2/3] dts: add VLAN methods to testpmd shell Dean Marx
2024-06-26 18:22       ` Jeremy Spewock
2024-06-25 15:33     ` [PATCH v7 3/3] dts: config schema Dean Marx
2024-06-26 18:23       ` Jeremy Spewock
2024-06-26 18:21     ` [PATCH v7 1/3] dts: VLAN test suite implementation Jeremy Spewock
2024-06-28 14:00   ` [PATCH v8 1/3] dts: add VLAN methods to testpmd shell Dean Marx
2024-06-28 14:00     ` [PATCH v8 2/3] dts: VLAN test suite implementation Dean Marx
2024-07-01 19:52       ` Jeremy Spewock
2024-06-28 14:00     ` [PATCH v8 3/3] dts: config schema Dean Marx
2024-07-01 19:48     ` [PATCH v8 1/3] dts: add VLAN methods to testpmd shell Jeremy Spewock
2024-07-03 16:47   ` [PATCH v9 1/3] dts: config schema Dean Marx
2024-07-03 16:47     ` [PATCH v9 2/3] dts: VLAN test suite implementation Dean Marx
2024-07-03 16:47     ` [PATCH v9 3/3] dts: add VLAN methods to testpmd shell Dean Marx
2024-07-09 21:22       ` Jeremy Spewock
2024-07-03 16:50   ` [PATCH v10 1/3] " Dean Marx
2024-07-03 16:50     ` [PATCH v10 2/3] dts: VLAN test suite implementation Dean Marx
2024-07-09 21:22       ` Jeremy Spewock
2024-07-03 16:50     ` [PATCH v10 3/3] dts: config schema Dean Marx
2024-07-05 15:55       ` Patrick Robb
2024-07-10 15:38       ` Jeremy Spewock
2024-07-17 20:31   ` [PATCH v11 1/3] dts: add VLAN methods to testpmd shell Dean Marx
2024-07-17 20:31     ` [PATCH v11 2/3] dts: VLAN test suite implementation Dean Marx
2024-07-19 15:35       ` Jeremy Spewock
2024-07-17 20:31     ` [PATCH v11 3/3] dts: config schema Dean Marx
2024-07-19 15:35       ` Jeremy Spewock
2024-07-19 15:35     ` [PATCH v11 1/3] dts: add VLAN methods to testpmd shell Jeremy Spewock
2024-07-24 16:30 ` [PATCH v12 0/3] dts: refactored VLAN test suite Dean Marx
2024-07-24 16:30   ` [PATCH v12 1/3] dts: add VLAN methods to testpmd shell Dean Marx
2024-07-24 16:30   ` [PATCH v12 2/3] dts: VLAN test suite implementation Dean Marx
2024-07-24 16:30   ` [PATCH v12 3/3] dts: config schema Dean Marx
2024-08-07 19:43   ` [PATCH v13 0/2] dts: refactored VLAN test suite Dean Marx
2024-08-07 19:43     ` [PATCH v13 1/2] dts: add VLAN methods to testpmd shell Dean Marx
2024-08-09 17:23       ` Jeremy Spewock
2024-08-07 19:43     ` [PATCH v13 2/2] dts: VLAN test suite implementation Dean Marx
2024-08-09 17:23       ` Jeremy Spewock
2024-08-23 21:16     ` [PATCH v14 0/2] dts: port over VLAN test suite Dean Marx
2024-08-23 21:16       ` [PATCH v14 1/2] dts: add VLAN methods to testpmd shell Dean Marx
2024-09-04 19:49         ` Jeremy Spewock
2024-08-23 21:16       ` [PATCH v14 2/2] dts: VLAN test suite implementation Dean Marx
2024-09-04 19:49         ` Jeremy Spewock
2024-09-11 17:43     ` [PATCH v14 0/1] dts: port over VLAN test suite Dean Marx
2024-09-11 17:43       ` [PATCH v14 1/1] dts: VLAN test suite implementation Dean Marx
2024-09-18 20:38       ` [PATCH v15 0/1] dts: port over VLAN test suite Dean Marx
2024-09-18 20:38         ` [PATCH v15 1/1] dts: VLAN test suite implementation Dean Marx
2024-09-18 20:49       ` [PATCH v15 0/1] dts: port over VLAN test suite Dean Marx
2024-09-18 20:49         ` [PATCH v15] dts: VLAN test suite implementation Dean Marx

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240618152053.30723-2-dmarx@iol.unh.edu \
    --to=dmarx@iol.unh.edu \
    --cc=Honnappa.Nagarahalli@arm.com \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=jspewock@iol.unh.edu \
    --cc=juraj.linkes@pantheon.tech \
    --cc=luca.vizzarro@arm.com \
    --cc=paul.szczepanek@arm.com \
    --cc=probb@iol.unh.edu \
    --cc=yoan.picchi@foss.arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).