[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <willemdebruijn.kernel.d636696e1da5@gmail.com>
Date: Mon, 17 Nov 2025 21:08:31 -0500
From: Willem de Bruijn <willemdebruijn.kernel@...il.com>
To: Jakub Kicinski <kuba@...nel.org>,
davem@...emloft.net
Cc: netdev@...r.kernel.org,
edumazet@...gle.com,
pabeni@...hat.com,
andrew+netdev@...n.ch,
horms@...nel.org,
willemdebruijn.kernel@...il.com,
shuah@...nel.org,
sdf@...ichev.me,
krakauer@...gle.com,
linux-kselftest@...r.kernel.org,
Jakub Kicinski <kuba@...nel.org>
Subject: Re: [PATCH net-next 09/12] selftests: drv-net: add a Python version
of the GRO test
Jakub Kicinski wrote:
> Rewrite the existing gro.sh test in Python. The conversion
> not exact, the changes are related to integrating the test
> with our "remote endpoint" paradigm. The test now reads
> the IP addresses from the user config. It resolves the MAC
> address (including running over Layer 3 networks).
>
> Signed-off-by: Jakub Kicinski <kuba@...nel.org>
> ---
> tools/testing/selftests/drivers/net/Makefile | 2 +-
> tools/testing/selftests/drivers/net/gro.c | 3 +
> tools/testing/selftests/drivers/net/gro.py | 161 +++++++++++++++++++
> tools/testing/selftests/drivers/net/gro.sh | 105 ------------
> 4 files changed, 165 insertions(+), 106 deletions(-)
> create mode 100755 tools/testing/selftests/drivers/net/gro.py
> delete mode 100755 tools/testing/selftests/drivers/net/gro.sh
>
> diff --git a/tools/testing/selftests/drivers/net/Makefile b/tools/testing/selftests/drivers/net/Makefile
> index 7083a8707c4e..f5c71d993750 100644
> --- a/tools/testing/selftests/drivers/net/Makefile
> +++ b/tools/testing/selftests/drivers/net/Makefile
> @@ -11,7 +11,7 @@ TEST_GEN_FILES := \
> # end of TEST_GEN_FILES
>
> TEST_PROGS := \
> - gro.sh \
> + gro.py \
> hds.py \
> napi_id.py \
> napi_threaded.py \
> diff --git a/tools/testing/selftests/drivers/net/gro.c b/tools/testing/selftests/drivers/net/gro.c
> index 9b9be0cf8f7f..995b492f5bcb 100644
> --- a/tools/testing/selftests/drivers/net/gro.c
> +++ b/tools/testing/selftests/drivers/net/gro.c
> @@ -58,6 +58,7 @@
> #include <unistd.h>
>
> #include "../../kselftest.h"
> +#include "../../net/lib/ksft.h"
>
> #define DPORT 8000
> #define SPORT 1500
> @@ -1127,6 +1128,8 @@ static void gro_receiver(void)
> set_timeout(rxfd);
> bind_packetsocket(rxfd);
>
> + ksft_ready();
> +
> memset(correct_payload, 0, sizeof(correct_payload));
>
> if (strcmp(testname, "data") == 0) {
> diff --git a/tools/testing/selftests/drivers/net/gro.py b/tools/testing/selftests/drivers/net/gro.py
> new file mode 100755
> index 000000000000..a27f8106eb63
> --- /dev/null
> +++ b/tools/testing/selftests/drivers/net/gro.py
> @@ -0,0 +1,161 @@
> +#!/usr/bin/env python3
> +# SPDX-License-Identifier: GPL-2.0
> +
> +"""
> +GRO (Generic Receive Offload) conformance tests.
> +
> +Validates that GRO coalescing works correctly by running the gro
> +binary in different configurations and checking for correct packet
> +coalescing behavior.
> +
> +Test cases:
> + - data: Data packets with same size/headers and correct seq numbers coalesce
> + - ack: Pure ACK packets do not coalesce
> + - flags: Packets with PSH, SYN, URG, RST flags do not coalesce
> + - tcp: Packets with incorrect checksum, non-consecutive seqno don't coalesce
> + - ip: Packets with different ECN, TTL, TOS, or IP options don't coalesce
> + - large: Packets larger than GRO_MAX_SIZE don't coalesce
> +"""
> +
> +import os
> +from lib.py import ksft_run, ksft_exit, ksft_pr
> +from lib.py import NetDrvEpEnv, KsftXfailEx
> +from lib.py import cmd, defer, bkg, ip
> +from lib.py import ksft_variants
> +
> +
> +def _resolve_dmac(cfg, ipver):
> + """
> + Find the destination MAC address remote host should use to send packets
> + towards the local host. I may be a router / gateway address.
I -> It
> + """
> +
> + attr = "dmac" + ipver
> + # Cache the response across test cases
> + if hasattr(cfg, attr):
> + return getattr(cfg, attr)
> +
> + route = ip(f"-{ipver} route get {cfg.addr_v[ipver]}",
> + json=True, host=cfg.remote)[0]
> + gw = route.get("gateway")
> + # Local L2 segment, address directly
> + if not gw:
> + setattr(cfg, attr, cfg.dev['address'])
> + return getattr(cfg, attr)
> +
> + # ping to make sure neighbor is resolved,
> + # bind to an interface, for v6 the GW is likely link local
> + cmd(f"ping -c1 -W0 -I{cfg.remote_ifname} {gw}", host=cfg.remote)
> +
> + neigh = ip(f"neigh get {gw} dev {cfg.remote_ifname}",
> + json=True, host=cfg.remote)[0]
> + setattr(cfg, attr, neigh['lladdr'])
> + return getattr(cfg, attr)
Powered by blists - more mailing lists