From patchwork Mon Dec 18 18:12:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeremy Spewock X-Patchwork-Id: 135295 X-Patchwork-Delegate: thomas@monjalon.net 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 C454D4373D; Mon, 18 Dec 2023 19:13:09 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0ECB540E64; Mon, 18 Dec 2023 19:13:04 +0100 (CET) Received: from mail-pl1-f227.google.com (mail-pl1-f227.google.com [209.85.214.227]) by mails.dpdk.org (Postfix) with ESMTP id 1FC734021D for ; Mon, 18 Dec 2023 19:13:01 +0100 (CET) Received: by mail-pl1-f227.google.com with SMTP id d9443c01a7336-1d3c394c1f4so6064245ad.2 for ; Mon, 18 Dec 2023 10:13:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iol.unh.edu; s=unh-iol; t=1702923180; x=1703527980; 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=ZrpsXqw4CfPCTx6qkffLUTqWDgvYcgSWQwbdsBsqAMBn3SkymRxdrq1Htp7gvcsEWo ClTXwt1CSCP/DcbeHaxSOjVZfDcZtk9FrniI8Cb1++Yn7bqRrjf5HBZictjV1ZqhAhod tk39U4lL/8NgcpCmjVtayi6RFjiCj91jUhM8E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702923180; x=1703527980; 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=YXxi68Blixy/Zzp9Q8YiwLrDCCE2PqhBRDwi5hBbI+uM66iVXxIzQi9ePZJ14lmgoS rrieius4PiVuSRAn45SE50cArqCDDvkNUMCXfAF62E5rqGRUqGYXb9FupcCbjhxM83RL TX/Fsvqzqk4LDd8LPAQY1B772VCguXiHmm++/GuNHBN+GdcBz+3wELyU88+y2xyxmqeE hWwC0rccYRFzlByF2ilg16FUg6Y1a7kPHDhB5EdougYceNpbv+bNwAWhrjjd4l0KmP0Q aK0RHHm8p0gFR9xIJVxJYD1OfN14EKeQZsCRwGUqRsQV1HYfQ3ANeO9g6+wNgBQ6fq6N K1eQ== X-Gm-Message-State: AOJu0YyAxeyPvWIaYNtFAEhVMvmUJTvSFfZ/o4QVHp58uc3+5PV6i/mL ygwUft2xGJBDQzjJW+4pE4Os1ZrFTANcEGOxek7+ojHP1fSzw+N6HFd5Q7TGj6xgwA== X-Google-Smtp-Source: AGHT+IGfVVTQQKRjTDsSbbK2Z1CB0oc9HcwvpVSFjjQUBANoJRa15HaMFM/QMCyhwQEdm5hmPSRLcA2UFzzZ X-Received: by 2002:a17:902:d58a:b0:1d3:917f:e12f with SMTP id k10-20020a170902d58a00b001d3917fe12fmr3840746plh.36.1702923180211; Mon, 18 Dec 2023 10:13:00 -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 bg1-20020a1709028e8100b001c74d16646asm1105380plb.28.2023.12.18.10.12.59 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 Dec 2023 10:13:00 -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 77FB2605C311; Mon, 18 Dec 2023 13:12:59 -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 13:12:15 -0500 Message-ID: <20231218181221.10057-2-jspewock@iol.unh.edu> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20231218181221.10057-1-jspewock@iol.unh.edu> References: <20231218181221.10057-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()