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 7DF444373D; Mon, 18 Dec 2023 18:23:45 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B693E42DB0; Mon, 18 Dec 2023 18:23:37 +0100 (CET) Received: from mail-pf1-f225.google.com (mail-pf1-f225.google.com [209.85.210.225]) by mails.dpdk.org (Postfix) with ESMTP id 66C3D42DA3 for ; Mon, 18 Dec 2023 18:23:35 +0100 (CET) Received: by mail-pf1-f225.google.com with SMTP id d2e1a72fcca58-6d84b68a866so564890b3a.0 for ; Mon, 18 Dec 2023 09:23:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iol.unh.edu; s=unh-iol; t=1702920214; x=1703525014; 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=88XdtApir5U8j5YeQD5l7pC22oM/mR+hQkO3JnGHsXY=; b=FKgGLzqQT28rW3ScMpQ5KlanzoMPPS4HDLK0saHwm6C98wib/y5XcoyME+juI7LpvP GQXEjzEKTWOR508k63m983Z92dYvFaGUrwonH6CT8oECY4LvDEh+g4woJcvKJoBKZesq pPxOoTvtTEnOOky74OiI/EBNxxe28Jk07qniA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702920214; x=1703525014; 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=88XdtApir5U8j5YeQD5l7pC22oM/mR+hQkO3JnGHsXY=; b=Cs7MXgAYoVqkN2igsEe3DTWMNT0chiuu6nLcHi4qWgCM/GFM6Y+/vINftBOLyHzF+6 j6l4lVSZG2lvMwrLJ46SmMY3IlIr5rwICw/uN6X//Ox3lw3KGlKn1oHhlQ7/Y717FrnA K/7qtfmVzwKDl8QFR5pYCg2C8BPCNw9vMCLjZDIbnkG9i09vMvklMFeX3paL4gdkJZnG 3Jo8x2krV3ZEQwysGKs71cPX2PLp/JHdRwCYaObKhWBC2RrfAPaip+ETCvevbTCJ9Ilo EHuhIXrkrpiPm0pkSUEJkC1hXo5m4C2Str9z9hddHGGacc2IvA4pZlBmlE+dJikBMHXO Eo+w== X-Gm-Message-State: AOJu0YzSh7MD9NDuehkyZAgnflnugW+BpTg0WNMxEUMQzH1dsbBUP/ut pu8492iTyNVQz608gkzeQvRxYLphaarmFqtRIB3j+pJ9dS/2tziFdMh7S70BolBjYw== X-Google-Smtp-Source: AGHT+IGCM+BLZ8UuKXMT+DZZMbjoSLznDwcW/k1V0LeEY1zsgih+L91FKzFXW5mbj/OP3/BPXdOy1feBqXGB X-Received: by 2002:aa7:8dda:0:b0:6d8:174b:97f2 with SMTP id j26-20020aa78dda000000b006d8174b97f2mr714449pfr.9.1702920214368; Mon, 18 Dec 2023 09:23:34 -0800 (PST) Received: from postal.iol.unh.edu (postal.iol.unh.edu. [2606:4100:3880:1234::84]) by smtp-relay.gmail.com with ESMTPS id g12-20020a056a000b8c00b006d267460a98sm584238pfj.17.2023.12.18.09.23.33 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 Dec 2023 09:23:34 -0800 (PST) X-Relaying-Domain: iol.unh.edu Received: from iol.unh.edu (unknown [IPv6:2606:4100:3880:1271:90f9:1b64:f6e6:867f]) by postal.iol.unh.edu (Postfix) with ESMTP id C321E605C311; Mon, 18 Dec 2023 12:23:32 -0500 (EST) From: jspewock@iol.unh.edu To: Honnappa.Nagarahalli@arm.com, juraj.linkes@pantheon.tech, thomas@monjalon.net, wathsala.vithanage@arm.com, probb@iol.unh.edu, paul.szczepanek@arm.com, yoan.picchi@foss.arm.com, ferruh.yigit@amd.com, andrew.rybchenko@oktetlabs.ru Cc: dev@dpdk.org, Jeremy Spewock Subject: [PATCH v4 1/7] dts: add required methods to testpmd_shell Date: Mon, 18 Dec 2023 12:22:01 -0500 Message-ID: <20231218172206.8488-3-jspewock@iol.unh.edu> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20231113202833.12900-1-jspewock@iol.unh.edu> References: <20231113202833.12900-1-jspewock@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 From: Jeremy Spewock Added a method within the testpmd interactive shell that polls the status of ports and verifies that the link status on a given port is "up." Polling will continue until either the link comes up, or the timeout is reached. Also added methods for starting and stopping packet forwarding in testpmd and a method for setting the forwarding mode on testpmd. The method for starting packet forwarding will also attempt to verify that forwarding did indeed start by default. Signed-off-by: Jeremy Spewock --- dts/framework/exception.py | 4 + .../remote_session/remote/testpmd_shell.py | 92 +++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/dts/framework/exception.py b/dts/framework/exception.py index b362e42924..e36db20e32 100644 --- a/dts/framework/exception.py +++ b/dts/framework/exception.py @@ -119,6 +119,10 @@ def __str__(self) -> str: return f"Command {self.command} returned a non-zero exit code: {self.command_return_code}" +class InteractiveCommandExecutionError(DTSError): + severity: ClassVar[ErrorSeverity] = ErrorSeverity.REMOTE_CMD_EXEC_ERR + + class RemoteDirectoryExistsError(DTSError): """ Raised when a remote directory to be created already exists. diff --git a/dts/framework/remote_session/remote/testpmd_shell.py b/dts/framework/remote_session/remote/testpmd_shell.py index 08ac311016..b5e4cba9b3 100644 --- a/dts/framework/remote_session/remote/testpmd_shell.py +++ b/dts/framework/remote_session/remote/testpmd_shell.py @@ -1,9 +1,15 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright(c) 2023 University of New Hampshire +import time +from enum import auto from pathlib import PurePath from typing import Callable +from framework.exception import InteractiveCommandExecutionError +from framework.settings import SETTINGS +from framework.utils import StrEnum + from .interactive_shell import InteractiveShell @@ -17,6 +23,37 @@ def __str__(self) -> str: return self.pci_address +class TestPmdForwardingModes(StrEnum): + r"""The supported packet forwarding modes for :class:`~TestPmdShell`\s""" + + #: + io = auto() + #: + mac = auto() + #: + macswap = auto() + #: + flowgen = auto() + #: + rxonly = auto() + #: + txonly = auto() + #: + csum = auto() + #: + icmpecho = auto() + #: + ieee1588 = auto() + #: + noisy = auto() + #: + fivetswap = "5tswap" + #: + shared_rxq = "shared-rxq" + #: + recycle_mbufs = auto() + + class TestPmdShell(InteractiveShell): path: PurePath = PurePath("app", "dpdk-testpmd") dpdk_app: bool = True @@ -28,6 +65,27 @@ def _start_application(self, get_privileged_command: Callable[[str], str] | None self._app_args += " -- -i" super()._start_application(get_privileged_command) + def start(self, verify: bool = True) -> None: + """Start packet forwarding with the current configuration. + + Args: + verify: If :data:`True` , a second start command will be sent in an attempt to verify + packet forwarding started as expected. + + Raises: + InteractiveCommandExecutionError: If `verify` is :data:`True` and forwarding fails to + start. + """ + self.send_command("start") + if verify: + # If forwarding was already started, sending "start" again should tell us + if "Packet forwarding already started" not in self.send_command("start"): + raise InteractiveCommandExecutionError("Testpmd failed to start packet forwarding.") + + def stop(self) -> None: + """Stop packet forwarding.""" + self.send_command("stop") + def get_devices(self) -> list[TestPmdDevice]: """Get a list of device names that are known to testpmd @@ -43,3 +101,37 @@ def get_devices(self) -> list[TestPmdDevice]: if "device name:" in line.lower(): dev_list.append(TestPmdDevice(line)) return dev_list + + def wait_link_status_up(self, port_id: int, timeout=SETTINGS.timeout) -> bool: + """Wait until the link status on the given port is "up". + + Arguments: + port_id: Port to check the link status on. + timeout: Time to wait for the link to come up. The default value for this + argument is set using the :option:`-t, --timeout` command-line argument + or the :envvar:`DTS_TIMEOUT` environment variable. + + Returns: + If the link came up in time or not. + """ + time_to_stop = time.time() + timeout + while time.time() < time_to_stop: + port_info = self.send_command(f"show port info {port_id}") + if "Link status: up" in port_info: + break + time.sleep(0.5) + else: + self._logger.error(f"The link for port {port_id} did not come up in the given timeout.") + return "Link status: up" in port_info + + def set_forward_mode(self, mode: TestPmdForwardingModes): + """Set packet forwarding mode. + + Args: + mode: The forwarding mode to use. + """ + self.send_command(f"set fwd {mode.value}") + + def close(self) -> None: + self.send_command("exit", "") + return super().close() -- 2.43.0