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@kernel.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)