From nobody Mon Dec 1 22:37:44 2025 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012004.outbound.protection.outlook.com [52.101.48.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 532BC27B340; Sun, 30 Nov 2025 09:21:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.4 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764494486; cv=fail; b=cJfXUqruwmrckk7tqKGggGU5lXWeBYFUKHHBTg8qTDFdGv7xVCYSXoW1ibzg9hr2d7w6pzfJzxtK4GzJEBM4ZFA+ixdTERTeDbD9uBbFEz8CFC6kXbx9rKTjD6QPzykXEWTk4femE3BAbVKib5GdPBrDL/a9IzJ8ZCpXTd+vHtU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764494486; c=relaxed/simple; bh=drT1rIru+T7/fNd1M/aw6ApSKOdseqZFQf53VY+hx5A=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=u07EbViPN0AVroVnfejdo1WeMAY6mL6xpCAQwERYU9GkuZKkKKuaoD5xSUC6+/F9vLBRGUhbc8Did8lnYqZqg42jcLbufAeydzJW+Hu9ehrD+16GDtliBDOORUT6vrJGMNnEEZXXd8TKzQhcNd7B090o6rnIlI+oRg8lQ633VaE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=WruGI782; arc=fail smtp.client-ip=52.101.48.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="WruGI782" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CyYrQWcASHTNAW3wDRG8HdN0KNYvhAMDGfUas0jTI25VBgPaBlAdowdaz0daOa2SrKvDUyhm7byy4WaougOrQDLJUTUTfV3ddy1b1UDqrUOFHrvPUYSzyTUdhlbGR5Hp+Yk1++Gw8Dap87rmQX6wNvxj3i6+oO0ScSL2PXJesRITamcI7f3l0PtMKJxylyiVarYWi37f+ZGkDGf+DezTxWXd6Rh2Y5iixzsBTJSyzGnxwRTnW0AmKLGZBJmbDZqLQrCdiKmvpYjwyIec7jMHvjtDbV71JFUaukkqwkh6S9/sAigNo+UUqPFJnHEPVu1/NvX6vLwxRCACfu+NF40wEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=JyiH2ugyRvz3ppOeMd6a8x/Ve8BkCuHcABvqxjVvZXs=; b=qETEGx8SGPE610Brgzg9HpkU11yrUZGAii3B/GkiUlfjZemtpAY8EilN+ZGH8zzbNguwn034g73Qq8nY0HvqogrV0fWp/uHa3l+899yjErqE1o6OmGR+li2m6z4N6lQMGktkVG3VkTVHG260jCdIwSfkBkhox2R3zrj/cvYlgHX9YZQsc6ltV5wQY4FEZFwLnr9Xns5hcd+vy8ZMGs4vtuizNyy9K1+l9Z5xS5N3u1x363RRQgGwFBJPBxcrx/mtttkE5mcsQDcfspW0rNy5BXyZ5ZGFE9WsXl61Llhdt3SCKFXm9g5T05TzqsFNUhRosAwZhAFTvbdvCPXYFZMJvg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.232) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=JyiH2ugyRvz3ppOeMd6a8x/Ve8BkCuHcABvqxjVvZXs=; b=WruGI782dvdqhKwE5BYfw4ShL/bMkYPkX2j6BEcXC5HsNKcxUAG45JgKCBr+HhPdR302idgm4wfbQAlRkU5QnDQfu2gsqLtJOOjY2hK3n6fV69JrGeQ3/l7hZxYLQmEMN6gEvswReGlsLbKLvtM99ZlFJRdb9Qw+PZUfpKZHQ93Cy75poA1MHnvkEY4OPCEMrOca808T8uZdtVPTMtPau+xRD1suVBYHb2gEAaMkPWo3xdJyaJICk28eigZRzk7Jl/41ka/5PAWfUk176rqohptG/VjgJfOLe3+ouWsmHfCnIpXDHEtr65K73C/Rm2rGbJf4HpX1jYTfogF+Mn8hCQ== Received: from SJ0PR05CA0095.namprd05.prod.outlook.com (2603:10b6:a03:334::10) by IA1PR12MB6114.namprd12.prod.outlook.com (2603:10b6:208:3ea::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Sun, 30 Nov 2025 09:21:21 +0000 Received: from SJ1PEPF00001CE5.namprd03.prod.outlook.com (2603:10b6:a03:334:cafe::15) by SJ0PR05CA0095.outlook.office365.com (2603:10b6:a03:334::10) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9388.8 via Frontend Transport; Sun, 30 Nov 2025 09:21:21 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.232) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.118.232 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.232; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.232) by SJ1PEPF00001CE5.mail.protection.outlook.com (10.167.242.21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9388.8 via Frontend Transport; Sun, 30 Nov 2025 09:21:21 +0000 Received: from drhqmail203.nvidia.com (10.126.190.182) by mail.nvidia.com (10.127.129.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Sun, 30 Nov 2025 01:21:14 -0800 Received: from drhqmail202.nvidia.com (10.126.190.181) by drhqmail203.nvidia.com (10.126.190.182) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Sun, 30 Nov 2025 01:21:13 -0800 Received: from fedora.mtl.labs.mlnx (10.127.8.11) by mail.nvidia.com (10.126.190.181) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Sun, 30 Nov 2025 01:21:09 -0800 From: Carolina Jubran To: Shuah Khan , Andrew Lunn , "David S . Miller" , Eric Dumazet , "Jakub Kicinski" , Paolo Abeni CC: Gal Pressman , Tariq Toukan , "Cosmin Ratiu" , Nimrod Oren , Mark Bloch , , , Subject: [PATCH net-next V3 3/6] selftests: drv-net: Use Iperf3Runner in devlink_rate_tc_bw.py Date: Sun, 30 Nov 2025 11:19:35 +0200 Message-ID: <20251130091938.4109055-4-cjubran@nvidia.com> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20251130091938.4109055-1-cjubran@nvidia.com> References: <20251130091938.4109055-1-cjubran@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF00001CE5:EE_|IA1PR12MB6114:EE_ X-MS-Office365-Filtering-Correlation-Id: 9314dc6e-e109-4a5a-0564-08de2ff1d338 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|82310400026|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?utf-8?B?RksxazBhMU5ZbjN5K2gwMEgxT2tYaExQK083ZlY5R1dYYWVDRHNzTWp6ZFdC?= =?utf-8?B?U3hYNVJCODZwQmhqMlZEV2tNamNvY2ZndldRU3dLM3pGb2I5WVdvWDhjVVI5?= =?utf-8?B?VVlaZEZrdWdFQk0vQ0puS0FQVnJkZjFxdmtRYkNiVkpvcXJvem4yaXhTRDh4?= =?utf-8?B?SjE3c0E2QUlJWDlrUUFaQkVwb0ZJektOWTZjOEZUQ2d3eEEvMnhiNHlhQnZQ?= =?utf-8?B?Qk1nQTY2Q1gwN0dtZTlzVi9qaThSUk1CWEVVTTBBWnU1RUpoRE1YVHNMWEtJ?= =?utf-8?B?WUNhNkN0RSt1bTVPdU5LYlB6L1E2YkFxN2UyZTl3Z0tBRk9xM1VtRFJ2ZEg5?= =?utf-8?B?cEFLNDcyd3JaTW4wTW1VY0s5U0s5TytFaXlFSytNQnRta2tzRFd3SG1uUHVo?= =?utf-8?B?cmx3dWh0aURYUzVxTFBuOUV2QVpvZDV4by9jV013aWhBTWd5TEtUMkdhVFMv?= =?utf-8?B?ZFRDNFJaTFBycEtWMWljQ2V6ZkpVV0ZiUHM0c2pkbnRBcUJJeXMrWHVMMXZK?= =?utf-8?B?Ym1iNHpzUGdDT0hvZnludEZ5WVF6clBjTGFtbnNNdEcyN1BubnlhejQ1RWNm?= =?utf-8?B?Q3JzZVFsSHFUNWpoS2tZSHVWMUZ3bE5tQXdGVklEM2s0Q0lKQXpYMHZnZEJ4?= =?utf-8?B?NldCOURsdEg2RTc3dlNqSTRkeWJ2L2REQm52TkJLRG9zUWd2UUVGZTluL3dw?= =?utf-8?B?SGUwY1drSm82dUxyTVdjU1FaSTJtckIwakdxRGplUzR2RFZQNjZ2SFc0U1Zm?= =?utf-8?B?ZkwvbEIrK1RBYTBRbXhwZWVrVDRDTXZ5YnFIQ0VadzFHWXN6T3lPQ0lzdHZh?= =?utf-8?B?YlUxSjd3UkxQN0hhbUo2MWE1S0ZCQkQ0Y3UwbHJCVE96ckNsL29IL0xGc1Q3?= =?utf-8?B?TFhXdWpBWXUwRVkxdnNOUGl2cHpzOEJWL1EyM2lPTElsTXJiK2E0enUvMWNt?= =?utf-8?B?Tm5nL1pweFRUM1pxeGFYdCsxb2NJTkVVaDZZdXdEZUdoZDl1VXFHdzJ2WElT?= =?utf-8?B?a3lmQm45TnJramp0ZWNwc1NodU1waDZYSUQwbXpPejEvWTVmZmNlK2VwbDJp?= =?utf-8?B?RlpvMDAzSkgzdDc4czc0ZXEvQ1UzMGhrZEFCTXB6cmNOR3J5SldsdkdDZXNP?= =?utf-8?B?Qkh1MysrZU84QXdPLytNTGJ5RjVvL3c5WE05TlVDWDJ6MmJVV1lYN0xIaFRE?= =?utf-8?B?V0hhVjk1Tmk4NFNSeFNnWGs1RXpvdDEvci9GQWZpRUVMUFkvZ3hSSlJtaG16?= =?utf-8?B?SW5jZlNQSE9LTXo0TjVtUmZIOVozckF6eTR2TW11ZERkdkxIKytETTlJbzMy?= =?utf-8?B?bWpkQko4WlNsTHQ5a1djUWh6UERwaWdGM3hFOTIwc2hkV1ZETDZrejloNUFD?= =?utf-8?B?WmVUQ3k4cml4b2thTm44QUdVTVRjUFFaUUt4d3NGNWVzbm4xWmJSeHZWeWhm?= =?utf-8?B?MUpvSmlBVS91cit3bFB3RUJZVVVabUk0ZkE4THFEc0hEZERJcWZIajhpNkZI?= =?utf-8?B?dy84ckphWWNxV0c2ZTVMNDNnNTU3cGRLRTE4L1dWNDNTYUZwOXN1S3dCMGVa?= =?utf-8?B?bm82UVlkcHQrRUZwVVlpRnJCM2hJOGcxMkJVejNGdWc3aXpMSE5FVWRNanlR?= =?utf-8?B?WERtMXc4a2dQWGQ1MlVLMDNhRlBwOGgzQ3RaWmxsNU04K1BRMjRqSjJLczYx?= =?utf-8?B?YW5sOW1JMWpwc1c0TVlHeWxhbURnT0NrL3htN2duZVdsQklMODN1WGpQTmNn?= =?utf-8?B?Kzl3czl0dWhQVW9PVWE1WS9OS2VyTTdRYTJRU0ovbWxsd2VxVVN3alVTbkhC?= =?utf-8?B?Nk0xZ1ZCUGtPUWNjNmlQNFRuNy9pVW5pZEpNNFp6L09SSzF2MUdDM2NXYjZC?= =?utf-8?B?SXhDbG1BcmFRTjJrMngxbEVXblJBNVZ6Uy81T2VnMVNOWFN4L0RkYi91Ky8x?= =?utf-8?B?T0sxZGZEdXNzeDRROVkzcFNmTzBUQ0tqK2o3T1dTam42ZGpRa3Rvakg3cVB3?= =?utf-8?B?aW9HanFXSlBuWU8zQWI5cnJFNUlWVEpnYlJEa1Nib3BpN3dCaE9GbGNtUHM0?= =?utf-8?B?bTBXLy8rVDFhWlNXeUU3RkxqS0ppRDZSRW43S3dERlZselNsRWEzRE9tR0hR?= =?utf-8?Q?lVls=3D?= X-Forefront-Antispam-Report: CIP:216.228.118.232;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc7edge1.nvidia.com;CAT:NONE;SFS:(13230040)(36860700013)(82310400026)(376014)(1800799024);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2025 09:21:21.0303 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9314dc6e-e109-4a5a-0564-08de2ff1d338 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.118.232];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF00001CE5.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB6114 Replace the inline iperf3 subprocess and JSON parsing with Iperf3Runner. Signed-off-by: Carolina Jubran Reviewed-by: Cosmin Ratiu Reviewed-by: Nimrod Oren --- .../drivers/net/hw/devlink_rate_tc_bw.py | 70 ++++++++----------- 1 file changed, 29 insertions(+), 41 deletions(-) diff --git a/tools/testing/selftests/drivers/net/hw/devlink_rate_tc_bw.py b= /tools/testing/selftests/drivers/net/hw/devlink_rate_tc_bw.py index ead6784d1910..16e5dda5bee1 100755 --- a/tools/testing/selftests/drivers/net/hw/devlink_rate_tc_bw.py +++ b/tools/testing/selftests/drivers/net/hw/devlink_rate_tc_bw.py @@ -64,6 +64,7 @@ from lib.py import KsftSkipEx, KsftFailEx, KsftXfailEx from lib.py import NetDrvEpEnv, DevlinkFamily from lib.py import NlError from lib.py import cmd, defer, ethtool, ip +from lib.py import Iperf3Runner =20 =20 class BandwidthValidator: @@ -139,8 +140,8 @@ def setup_vlans_on_vf(vf_ifc): Sets up two VLAN interfaces on the given VF, each mapped to a differen= t TC. """ vlan_configs =3D [ - {"vlan_id": 101, "tc": 3, "ip": "198.51.100.2"}, - {"vlan_id": 102, "tc": 4, "ip": "198.51.100.10"}, + {"vlan_id": 101, "tc": 3, "ip": "198.51.100.1"}, + {"vlan_id": 102, "tc": 4, "ip": "198.51.100.9"}, ] =20 for config in vlan_configs: @@ -224,13 +225,13 @@ def setup_devlink_rate(cfg): raise KsftFailEx(f"rate_set failed on VF port {port_index}") from = exc =20 =20 -def setup_remote_server(cfg): +def setup_remote_vlans(cfg): """ - Sets up VLAN interfaces and starts iperf3 servers on the remote side. + Sets up VLAN interfaces on the remote side. """ remote_dev =3D cfg.remote_ifname vlan_ids =3D [101, 102] - remote_ips =3D ["198.51.100.1", "198.51.100.9"] + remote_ips =3D ["198.51.100.2", "198.51.100.10"] =20 for vlan_id, ip_addr in zip(vlan_ids, remote_ips): vlan_dev =3D f"{remote_dev}.{vlan_id}" @@ -238,14 +239,13 @@ def setup_remote_server(cfg): f"type vlan id {vlan_id}", host=3Dcfg.remote) cmd(f"ip addr add {ip_addr}/29 dev {vlan_dev}", host=3Dcfg.remote) cmd(f"ip link set dev {vlan_dev} up", host=3Dcfg.remote) - cmd(f"iperf3 -s -1 -B {ip_addr}",background=3DTrue, host=3Dcfg.rem= ote) defer(cmd, f"ip link del {vlan_dev}", host=3Dcfg.remote) =20 =20 def setup_test_environment(cfg, set_tc_mapping=3DTrue): """ Sets up the complete test environment including VF creation, VLANs, - bridge configuration, devlink rate setup, and the remote server. + bridge configuration and devlink rate setup. """ vf_ifc =3D setup_vf(cfg, set_tc_mapping) ksft_pr(f"Created VF interface: {vf_ifc}") @@ -256,51 +256,39 @@ def setup_test_environment(cfg, set_tc_mapping=3DTrue= ): setup_bridge(cfg) =20 setup_devlink_rate(cfg) - setup_remote_server(cfg) - time.sleep(2) + setup_remote_vlans(cfg) =20 =20 -def run_iperf_client(server_ip, local_ip, barrier, min_expected_gbps=3D0.1= ): +def measure_bandwidth(cfg, server_ip, client_ip, barrier): """ - Runs a single iperf3 client instance, binding to the given local IP. - Waits on a barrier to synchronize with other threads. + Synchronizes with peers and runs an iperf3-based bandwidth measurement + between the given endpoints. Returns average Gbps. """ + runner =3D Iperf3Runner(cfg, server_ip=3Dserver_ip, client_ip=3Dclient= _ip) try: barrier.wait(timeout=3D10) except Exception as exc: raise KsftFailEx("iperf3 barrier wait timed") from exc =20 - iperf_cmd =3D ["iperf3", "-c", server_ip, "-B", local_ip, "-J"] - result =3D subprocess.run(iperf_cmd, capture_output=3DTrue, text=3DTru= e, - check=3DTrue) - try: - output =3D json.loads(result.stdout) - bits_per_second =3D output["end"]["sum_received"]["bits_per_second= "] - gbps =3D bits_per_second / 1e9 - if gbps < min_expected_gbps: - ksft_pr( - f"iperf3 bandwidth too low: {gbps:.2f} Gbps " - f"(expected =E2=89=A5 {min_expected_gbps} Gbps)" - ) - return None - return gbps - except json.JSONDecodeError as exc: - ksft_pr(f"Failed to parse iperf3 JSON output: {exc}") - return None + bw_gbps =3D runner.measure_bandwidth(reverse=3DTrue) + except Exception as exc: + raise KsftFailEx("iperf3 bandwidth measurement failed") from exc =20 + return bw_gbps =20 -def run_bandwidth_test(): + +def run_bandwidth_test(cfg): """ - Launches iperf3 client threads for each VLAN/TC pair and collects resu= lts. + Runs parallel bandwidth measurements for each VLAN/TC pair and collect= s results. """ - def _run_iperf_client_thread(server_ip, local_ip, results, barrier, tc= _ix): - results[tc_ix] =3D run_iperf_client(server_ip, local_ip, barrier) + def _run_measure_bandwidth_thread(local_ip, remote_ip, results, barrie= r, tc_ix): + results[tc_ix] =3D measure_bandwidth(cfg, local_ip, remote_ip, bar= rier) =20 vf_vlan_data =3D [ # (local_ip, remote_ip, TC) - ("198.51.100.2", "198.51.100.1", 3), - ("198.51.100.10", "198.51.100.9", 4), + ("198.51.100.1", "198.51.100.2", 3), + ("198.51.100.9", "198.51.100.10", 4), ] =20 results =3D {} @@ -309,8 +297,8 @@ def run_bandwidth_test(): =20 for local_ip, remote_ip, tc_ix in vf_vlan_data: thread =3D threading.Thread( - target=3D_run_iperf_client_thread, - args=3D(remote_ip, local_ip, results, start_barrier, tc_ix) + target=3D_run_measure_bandwidth_thread, + args=3D(local_ip, remote_ip, results, start_barrier, tc_ix) ) thread.start() threads.append(thread) @@ -320,10 +308,11 @@ def run_bandwidth_test(): =20 for tc_ix, tc_bw in results.items(): if tc_bw is None: - raise KsftFailEx("iperf3 client failed; cannot evaluate bandwi= dth") + raise KsftFailEx("iperf3 failed; cannot evaluate bandwidth") =20 return results =20 + def calculate_bandwidth_percentages(results): """ Calculates the percentage of total bandwidth received by TC3 and TC4. @@ -398,10 +387,10 @@ def check_bandwidth_distribution(bw_data, validator): =20 def run_bandwidth_distribution_test(cfg, set_tc_mapping): """ - Runs parallel iperf3 tests for both TCs and collects results. + Runs parallel bandwidth measurements for both TCs and collects results. """ setup_test_environment(cfg, set_tc_mapping) - bandwidths =3D run_bandwidth_test() + bandwidths =3D run_bandwidth_test(cfg) bw_data =3D calculate_bandwidth_percentages(bandwidths) test_name =3D "with TC mapping" if set_tc_mapping else "without TC map= ping" print_bandwidth_results(bw_data, test_name) @@ -451,7 +440,6 @@ def main() -> None: ) if not cfg.pci: raise KsftSkipEx("Could not get PCI address of the interface") - cfg.require_cmd("iperf3", local=3DTrue, remote=3DTrue) =20 cfg.bw_validator =3D BandwidthValidator() =20 --=20 2.38.1