From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9840345484; Mon, 17 Jun 2024 21:48:13 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8246740DD6; Mon, 17 Jun 2024 21:48:13 +0200 (CEST) Received: from mail-oi1-f173.google.com (mail-oi1-f173.google.com [209.85.167.173]) by mails.dpdk.org (Postfix) with ESMTP id 88A5D40A84 for ; Mon, 17 Jun 2024 21:48:11 +0200 (CEST) Received: by mail-oi1-f173.google.com with SMTP id 5614622812f47-3d22802674cso2674159b6e.2 for ; Mon, 17 Jun 2024 12:48:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iol.unh.edu; s=unh-iol; t=1718653691; x=1719258491; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kSvEdRjnwB+xleGaxlWkDJnmVMn+e4I5z262tY8iOJI=; b=cZupCtdYuVclL6bYbSflvSBCEtflXcfgGvdwEc13kL/GYz3Nv6Y7PuWPWDM2flLFkZ Is4q3Tj7ZOkymhA6GNNQrHNOLx+aNLztqqvbMBJgEyn/mdtCHpS44bLqWbz/SIbzIMJr iO3zH7QpHeJRTlrAmsvgK/qBttvX0fdeFb4is= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718653691; x=1719258491; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kSvEdRjnwB+xleGaxlWkDJnmVMn+e4I5z262tY8iOJI=; b=kjYLiiR6Wj2SLuylGxkfjRt1Pzfa7sA2m/Y9AWVaqA/XQciBTM3Ygiu5e6gYTVxOz3 VsKaTzWEUjFujzPYx2y50uMqvnaiombqLJAAL0Alv0+/ISkog9tPVYs/ikYnlIo3Pgms ThGSkB0GZW4dAXtMf9xY369yEEeBlC1Kv87HmHWl92xXkvkNQ1S1KqZGtvjU+Dx+XejA 6rO9wWELeSVZjO0jZw7g+w2ioFsWzzdC6FPAKk4Ue3lpoQuWme+TS7F/Q8O6r9iWa4nw dOB5OkpNW9BB8p3QJg8k1Y+KGnSypnq1VBlsJ9NcdZmuO99dW9nNwbuEldcQamG8jXtX r6Fg== X-Gm-Message-State: AOJu0Yz3HO3fxhxwMa4XWT0ud1Q4jm0OgWhNcbls02XZO7dTxkjzZZK0 3ipzOgrk06bRRhf6nFkrOEm0RcrHD/FnNWObwgSB9k2ePXs/Iag2WUHjdnw2g4Q= X-Google-Smtp-Source: AGHT+IEs3LACn4o7isK80Gf9E4iUVc/UIGsznrAf5kGbRrbnyaF8tq8zFrH5drQWtWJKq8JZ9WOr4A== X-Received: by 2002:a05:6808:f0f:b0:3d2:2495:6ff with SMTP id 5614622812f47-3d24e8e123amr13462745b6e.19.1718653690526; Mon, 17 Jun 2024 12:48:10 -0700 (PDT) Received: from dean-laptop.iol.unh.edu ([2606:4100:3880:1210:52ef:3eaf:5f1e:6f6a]) by smtp.gmail.com with ESMTPSA id af79cd13be357-798aacae6eesm459167185a.16.2024.06.17.12.48.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Jun 2024 12:48:10 -0700 (PDT) From: Dean Marx 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 Subject: [PATCH v2 2/3] dts: added promisc/verbose func to testpmd shell Date: Mon, 17 Jun 2024 15:46:40 -0400 Message-ID: <20240617194638.12926-6-dmarx@iol.unh.edu> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240617194638.12926-2-dmarx@iol.unh.edu> References: <20240617194638.12926-2-dmarx@iol.unh.edu> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Setting the verbose mode and promiscuous mode is a common command in test suites, these additions will allow the dev to set both modes from the testpmd shell module. Signed-off-by: Dean Marx --- dts/framework/remote_session/testpmd_shell.py | 179 +++++++++++++++++- 1 file changed, 178 insertions(+), 1 deletion(-) diff --git a/dts/framework/remote_session/testpmd_shell.py b/dts/framework/remote_session/testpmd_shell.py index cb2ab6bd00..425f3ec220 100644 --- a/dts/framework/remote_session/testpmd_shell.py +++ b/dts/framework/remote_session/testpmd_shell.py @@ -147,7 +147,7 @@ def start(self, verify: bool = True) -> None: "Not all ports came up after starting packet forwarding in testpmd." ) - def stop(self, verify: bool = True) -> None: + def stop(self, verify: bool = True) -> str: """Stop packet forwarding. Args: @@ -155,6 +155,9 @@ def stop(self, verify: bool = True) -> None: forwarding was stopped successfully or not started. If neither is found, it is considered an error. + Returns: + Output gathered from sending the stop command. + Raises: InteractiveCommandExecutionError: If `verify` is :data:`True` and the command to stop forwarding results in an error. @@ -167,6 +170,7 @@ def stop(self, verify: bool = True) -> None: ): self._logger.debug(f"Failed to stop packet forwarding: \n{stop_cmd_output}") raise InteractiveCommandExecutionError("Testpmd failed to stop packet forwarding.") + return stop_cmd_output def get_devices(self) -> list[TestPmdDevice]: """Get a list of device names that are known to testpmd. @@ -225,6 +229,179 @@ def set_forward_mode(self, mode: TestPmdForwardingModes, verify: bool = True): f"Test pmd failed to set fwd mode to {mode.value}" ) + def stop_port_queue( + self, + port_id: int, + queue_id: int, + is_rx_queue: bool, + verify: bool = True + ) -> None: + """Stops a given queue on a port. + + Args: + port_id: ID of the port that the queue belongs to. + queue_id: ID of the queue to stop. + is_rx_queue: Type of queue to stop. If :data:`True` an RX queue will be stopped, + otherwise a TX queue will be stopped. + verify: If :data:`True` an additional command will be sent to verify the queue stopped. + Defaults to :data:`True`. + + Raises: + InteractiveCommandExecutionError: If `verify` is :data:`True` and the queue fails + to stop. + """ + port_type = "rxq" if is_rx_queue else "txq" + stop_cmd_output = self.send_command(f"port {port_id} {port_type} {queue_id} stop") + if verify: + if ( + # Rx/Tx queue state: ... + f"{port_type.capitalize()[:-1]} queue state: stopped" not in + self.send_command(f"show {port_type} info {port_id} {queue_id}") + ): + self._logger.debug( + f"Failed to stop {port_type} {queue_id} on port {port_id}:\n{stop_cmd_output}" + ) + raise InteractiveCommandExecutionError( + f"Test pmd failed to stop {port_type} {queue_id} on port {port_id}" + ) + + def start_port_queue( + self, + port_id: int, + queue_id: int, + is_rx_queue: bool, + verify: bool = True + ) -> None: + """Starts a given RX queue on a port. + + Args: + port_id: ID of the port that the queue belongs to. + queue_id: ID of the queue to start. + is_rx_queue: Type of queue to start. If :data:`True` an RX queue will be started, + otherwise a TX queue will be started. + verify: if :data:`True` an additional command will be sent to verify that the queue was + started. Defaults to :data:`True`. + + Raises: + InteractiveCommandExecutionError: If `verify` is :data:`True` and the queue fails to + start. + """ + port_type = "rxq" if is_rx_queue else "txq" + self.setup_port_queue(port_id, queue_id, port_type) + start_cmd_output = self.send_command(f"port {port_id} {port_type} {queue_id} start") + if verify: + if ( + # Rx/Tx queue state: ... + f"{port_type.capitalize()[:-1]} queue state: started" not in + self.send_command(f"show {port_type} info {port_id} {queue_id}") + ): + self._logger.debug( + f"Failed to start {port_type} {queue_id} on port {port_id}:\n{start_cmd_output}" + ) + raise InteractiveCommandExecutionError( + f"Test pmd failed to start {port_type} {queue_id} on port {port_id}" + ) + + def setup_port_queue(self, port_id: int, queue_id: int, is_rx_queue: bool) -> None: + """Setup a given queue on a port. + + This functionality cannot be verified because the setup action only takes effect when the + queue is started. + + Args: + port_id: ID of the port where the queue resides. + queue_id: ID of the queue to setup. + is_rx_queue: Type of queue to setup. If :data:`True` an RX queue will be setup, + otherwise a TX queue will be setup. + """ + self.send_command(f"port {port_id} {'rxq' if is_rx_queue else 'txq'} {queue_id} setup") + + def change_queue_ring_size( + self, + port_id: int, + queue_id: int, + size: int, + is_rx_queue: bool, + verify: bool = True, + ) -> None: + """Update the ring size of an RX/TX queue on a given port. + + Args: + port_id: The port that the queue resides on. + queue_id: The ID of the queue on the port. + size: The size to update the ring size to. + is_rx_queue: Whether to modify an RX or TX queue. If :data:`True` an RX queue will be + updated, otherwise a TX queue will be updated. + verify: If :data:`True` an additional command will be sent to check the ring size of + the queue in an attempt to validate that the size was changes properly. + + Raises: + InteractiveCommandExecutionError: If `verify` is :data:`True` and there is a failure + when updating ring size. + """ + queue_type = "rxq" if is_rx_queue else "txq" + self.send_command(f"port config {port_id} {queue_type} {queue_id} ring_size {size}") + self.setup_port_queue(port_id, queue_id, is_rx_queue) + if verify: + queue_info = self.send_command(f"show {queue_type} info {port_id} {queue_id}") + if f"Number of RXDs: {size}" not in queue_info: + self._logger.debug( + f"Failed up update ring size of queue {queue_id} on port {port_id}:" + f"\n{queue_info}" + ) + raise InteractiveCommandExecutionError( + f"Failed to update ring size of queue {queue_id} on port {port_id}" + ) + + def set_promisc_on(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`.""" self.send_command("quit", "") -- 2.44.0