From patchwork Thu Dec 14 22:10:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeremy Spewock X-Patchwork-Id: 135211 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id E229B436F4; Thu, 14 Dec 2023 23:11:23 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id DBAD843361; Thu, 14 Dec 2023 23:11:20 +0100 (CET) Received: from mail-oo1-f97.google.com (mail-oo1-f97.google.com [209.85.161.97]) by mails.dpdk.org (Postfix) with ESMTP id ED07E43360 for ; Thu, 14 Dec 2023 23:11:19 +0100 (CET) Received: by mail-oo1-f97.google.com with SMTP id 006d021491bc7-591553d3835so46019eaf.3 for ; Thu, 14 Dec 2023 14:11:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iol.unh.edu; s=unh-iol; t=1702591879; x=1703196679; 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=I2d9kisWebtdB5ny1RyWDS9yBriKM/x9KtPfVpcXbXSaEhEXKaqV+EZQgqPf4i8OiI HxElwSSYRB6PHv/DY/pvHPXO+dpAYRevTgRTKELPyTK8XCMEajHtjhH4hDN/gcCvqDWZ 4M805QNJOXNO26RIl3y03MXcAzJWkQOjs0JZg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702591879; x=1703196679; 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=rVXL88E6bCgPbjqO8lnsfH7eCrhZ3c5uI/O4m3n+JyKCHnddI9wIw1YVB+sNCDxwCl MItUdnZr+WH+9ZzrVFCVXD2hUJkcMaU8Y2BwX4BPORfMEKS4+iIapJytnCcj2vERZE56 WFkEigP6zooe66Fozk1u7erKjNW9X4241PAJcVLPI8jo+HwurIqEHwkLPgsT5aLfLrO1 5DreaJrKbUr8QMUbNRQckuE1xAaTG5VPlDtnYv370HUuwdC91yh7mp2/JltkxyKo+PfW k++5NQcrL+fuUm9IE6GfWM/uwSI1L+eJsnWeLowyyKLbHlwbv7cXJCPIXIV475YkAhcM bdVQ== X-Gm-Message-State: AOJu0YwTmMnQH+uh+Jovmd/3Uhuzh/QPU5m6yg6OvSHzSC1It3xapOzA wDzZpnlfi4Cbf/8V7oE5EnHWAmpWXda6cEd61NTJH4KisBnklzXZVEP26CrJNAaLjQ== X-Google-Smtp-Source: AGHT+IFgWo3CtFvJQLuKv61Angp6shOtaLC3fEZHnWB3jrv6XxI4rHCTFz6UJ9o63wxL+uELWbHj4ZLbg0kC X-Received: by 2002:a05:6359:4598:b0:170:6ba9:9dac with SMTP id no24-20020a056359459800b001706ba99dacmr15015787rwb.61.1702591879169; Thu, 14 Dec 2023 14:11:19 -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 k10-20020a63d84a000000b005b25a04cf8csm1160262pgj.8.2023.12.14.14.11.17 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 14 Dec 2023 14:11:19 -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 E7E15605C311; Thu, 14 Dec 2023 17:11:16 -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: Thu, 14 Dec 2023 17:10:07 -0500 Message-ID: <20231214221012.9598-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 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()