From nobody Sun Jun 14 22:57:06 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 A2A75372B30 for ; Tue, 7 Apr 2026 02:45:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775529931; cv=none; b=KhEZuTfd9kdtNX2d/UkH2YlWy8P/Z26poNDFEQ8WP5CuDc1XBQ7qdi0wmm7W4NB5LisjJyskk6dh+g7ciFkZoBlKNi57d4iZtplekn/KyDVVIIrh0iaIZQPMSSHjZjQqioYx5clJQojcBZfOsSwWwbrabwKi2mAnYUKrZOc+7r0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775529931; c=relaxed/simple; bh=Ja+s+qesPzExVKKINDPzevrST5k6ihEc1TyUc3HpcdE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iHAA1UPDH7da8/ntkJlY0jEgjOQALmpBqveWIeb5+ZIvZUbWeLmeNa2kLLzJlO0jNNcXu4PPcYhr/NYwUFbe8E7gLTaRG0BiHEva9fIcLN5NlF/AbkcJizVGdxjPdMi0KjuVSmCN1M2c944TQNkPhTWP6diPfrEMhqqs6hRYgf4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=Y9QBuT2s; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="Y9QBuT2s" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1775529929; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=e+fBSYxsCHm/g97qqEX2hKEUxcvlEWL8dj5yDnsF1Z0=; b=Y9QBuT2sGmfA0rFsjxqZvr15JbLzLjga/YBdFcEKarYz+xe1FX+xwNfVlGQOGScFxQnqqA ky+fQYjNlOCF+aM1C3l9fIfqVb1eKO+PYu841ecAeorvzZH7hUxtQgJPp4zZAQZh3tDqVN v4qqmv6Oq2UlyoB1UB1fesOc+Mx0ksg= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-563-JmArAdLOOCahNa7o7-_fbw-1; Mon, 06 Apr 2026 22:45:24 -0400 X-MC-Unique: JmArAdLOOCahNa7o7-_fbw-1 X-Mimecast-MFC-AGG-ID: JmArAdLOOCahNa7o7-_fbw_1775529923 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2D1B7195608A; Tue, 7 Apr 2026 02:45:23 +0000 (UTC) Received: from xudu-thinkpadx1carbongen9.nay.com (unknown [10.72.116.131]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 4187F300019F; Tue, 7 Apr 2026 02:45:18 +0000 (UTC) From: Xu Du To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, shuah@kernel.org Cc: netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 1/4] selftests: drv-net: tso: retry connect on EHOSTUNREACH Date: Tue, 7 Apr 2026 10:45:08 +0800 Message-ID: In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 Content-Type: text/plain; charset="utf-8" The TSO test occasionally fails with "No route to host" (EHOSTUNREACH) when connecting to the remote socat listener. This can happen when the neighbor resolution has not yet completed by the time the test attempts to connect, particularly in tunnel setups where neighbor entries may take slightly longer to establish. Add a retry loop (up to 5 attempts with 0.5s delay) around the sock.connect() call to handle this transient condition gracefully. Signed-off-by: Xu Du --- tools/testing/selftests/drivers/net/hw/tso.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/drivers/net/hw/tso.py b/tools/testing/= selftests/drivers/net/hw/tso.py index bb675e3dac88..f792115adfb3 100755 --- a/tools/testing/selftests/drivers/net/hw/tso.py +++ b/tools/testing/selftests/drivers/net/hw/tso.py @@ -3,6 +3,7 @@ =20 """Run the tools/testing/selftests/net/csum testsuite.""" =20 +import errno import fcntl import socket import struct @@ -47,10 +48,20 @@ def run_one_stream(cfg, ipver, remote_v4, remote_v6, sh= ould_lso): =20 if ipver =3D=3D "4": sock =3D socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.connect((remote_v4, port)) + sockaddr =3D (remote_v4, port) else: sock =3D socket.socket(socket.AF_INET6, socket.SOCK_STREAM) - sock.connect((remote_v6, port)) + sockaddr =3D (remote_v6, port) + + for attempt in range(5): + try: + sock.connect(sockaddr) + break + except OSError as e: + if e.errno =3D=3D errno.EHOSTUNREACH and attempt < 4: + time.sleep(0.5) + else: + raise =20 # Small send to make sure the connection is working. sock.send("ping".encode()) --=20 2.53.0 From nobody Sun Jun 14 22:57:06 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 42060372EF0 for ; Tue, 7 Apr 2026 02:45:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775529934; cv=none; b=RuZVatAvIJm8dlY24cCT6B70R3UfVTaoBTshy53qv5GZmGIMhItw+zun1tMZA2CkukJYeqpX+n/zzl8Z+hahAKkLTiqzMxeTo4OJymhHxWQFMqXbMN/8cjVbVr1moywpW1dlHnb1Jo1fXMD1NHNkR8VEY+E5NEP3Xe89OmPUJbs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775529934; c=relaxed/simple; bh=2yY0YJWzFPzZvdGLlxAzyCCRCwa/GGM5y5gT2HuLzRQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NcxW9detPP0EcJmfrDcUg3G+RimXGNCrqqtvZFTkx5zSEZ6p8egMv3KnJee62fWFa/7WQ98+gW3sk2fxKpSSeRhAMr7uGBJfdfiKJh1//isvgw8aWb+s4ymoVw4PZPEhU2Pc2ihT7nPLIx6hz6kLKN7j+zf3zUOON7lvDvlCPfs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=XWDGUDll; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="XWDGUDll" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1775529932; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZB3tUtofrZMfh6izGqGZETNtfjj/IEd8MET151h1j3w=; b=XWDGUDllo6RfrrBiNqo1KtsncUwFxVfW/vYdFcRAiTcIe092AVqVfnvMWXegV29Av/9tTu 1APHQoWkUYPCXfjyLdUmBRc2ABAv3+9VzQ0QkQ9QOiJtEKLG56uU/dZndcuhpazp2LLWN3 WwAadftySd7TEhPPspiz7F+imRu0DM0= Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-222-lw89iQP0OOumc6P8M4UICQ-1; Mon, 06 Apr 2026 22:45:29 -0400 X-MC-Unique: lw89iQP0OOumc6P8M4UICQ-1 X-Mimecast-MFC-AGG-ID: lw89iQP0OOumc6P8M4UICQ_1775529927 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 9174B18005B2; Tue, 7 Apr 2026 02:45:27 +0000 (UTC) Received: from xudu-thinkpadx1carbongen9.nay.com (unknown [10.72.116.131]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id B8660300019F; Tue, 7 Apr 2026 02:45:23 +0000 (UTC) From: Xu Du To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, shuah@kernel.org Cc: netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 2/4] selftests: drv-net: tso: add helpers for double tunneling GSO Date: Tue, 7 Apr 2026 10:45:09 +0800 Message-ID: In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 Content-Type: text/plain; charset="utf-8" Add helper functions to support double tunneling GSO testing. Since certain tunnel-specific parameters (e.g., gro-hint) are not yet supported by the standard ip-link tool, this patch adds a new helper function utilizing the ynl-cli to handle these extended netlink attributes. As the YNL Python module cannot be invoked across different devices or environments directly in its current form, the helper abstracts the YNL CLI calls to ensure proper configuration of the tunneling device features. Signed-off-by: Xu Du --- .../drivers/net/hw/lib/py/__init__.py | 4 ++-- .../selftests/drivers/net/lib/py/__init__.py | 4 ++-- .../testing/selftests/net/lib/py/__init__.py | 4 ++-- tools/testing/selftests/net/lib/py/utils.py | 19 +++++++++++++++++-- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py b/to= ols/testing/selftests/drivers/net/hw/lib/py/__init__.py index df4da5078c48..34a06e1afcb5 100644 --- a/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py +++ b/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py @@ -24,7 +24,7 @@ try: from net.lib.py import CmdExitFailure from net.lib.py import bkg, cmd, bpftool, bpftrace, defer, ethtool, \ fd_read_timeout, ip, rand_port, rand_ports, wait_port_listen, \ - wait_file, tool + wait_file, tool, ynlcli from net.lib.py import bpf_map_set, bpf_map_dump, bpf_prog_map_ids from net.lib.py import KsftSkipEx, KsftFailEx, KsftXfailEx from net.lib.py import ksft_disruptive, ksft_exit, ksft_pr, ksft_run, \ @@ -40,7 +40,7 @@ try: "CmdExitFailure", "bkg", "cmd", "bpftool", "bpftrace", "defer", "ethtool", "fd_read_timeout", "ip", "rand_port", "rand_ports", - "wait_port_listen", "wait_file", "tool", + "wait_port_listen", "wait_file", "tool", "ynlcli", "bpf_map_set", "bpf_map_dump", "bpf_prog_map_ids", "KsftSkipEx", "KsftFailEx", "KsftXfailEx", "ksft_disruptive", "ksft_exit", "ksft_pr", "ksft_run", diff --git a/tools/testing/selftests/drivers/net/lib/py/__init__.py b/tools= /testing/selftests/drivers/net/lib/py/__init__.py index 2b5ec0505672..a9eb1a57fcc4 100644 --- a/tools/testing/selftests/drivers/net/lib/py/__init__.py +++ b/tools/testing/selftests/drivers/net/lib/py/__init__.py @@ -22,7 +22,7 @@ try: from net.lib.py import EthtoolFamily, NetdevFamily, NetshaperFamily, \ NlError, RtnlFamily, DevlinkFamily, PSPFamily, Netlink from net.lib.py import CmdExitFailure - from net.lib.py import bkg, cmd, bpftool, bpftrace, defer, ethtool, \ + from net.lib.py import bkg, cmd, bpftool, bpftrace, defer, ethtool, yn= lcli, \ fd_read_timeout, ip, rand_port, rand_ports, wait_port_listen, wait= _file from net.lib.py import bpf_map_set, bpf_map_dump, bpf_prog_map_ids from net.lib.py import KsftSkipEx, KsftFailEx, KsftXfailEx @@ -36,7 +36,7 @@ try: "NlError", "RtnlFamily", "DevlinkFamily", "PSPFamily", "Net= link", "CmdExitFailure", "bkg", "cmd", "bpftool", "bpftrace", "defer", "ethtool", - "fd_read_timeout", "ip", "rand_port", "rand_ports", + "fd_read_timeout", "ip", "rand_port", "rand_ports", "ynlcli= ", "wait_port_listen", "wait_file", "bpf_map_set", "bpf_map_dump", "bpf_prog_map_ids", "KsftSkipEx", "KsftFailEx", "KsftXfailEx", diff --git a/tools/testing/selftests/net/lib/py/__init__.py b/tools/testing= /selftests/net/lib/py/__init__.py index 7c81d86a7e97..a3337666a856 100644 --- a/tools/testing/selftests/net/lib/py/__init__.py +++ b/tools/testing/selftests/net/lib/py/__init__.py @@ -14,7 +14,7 @@ from .netns import NetNS, NetNSEnter from .nsim import NetdevSim, NetdevSimDev from .utils import CmdExitFailure, fd_read_timeout, cmd, bkg, defer, \ bpftool, ip, ethtool, bpftrace, rand_port, rand_ports, wait_port_liste= n, \ - wait_file, tool + wait_file, tool, ynlcli from .bpf import bpf_map_set, bpf_map_dump, bpf_prog_map_ids from .ynl import NlError, NlctrlFamily, YnlFamily, \ EthtoolFamily, NetdevFamily, RtnlFamily, RtnlAddrFamily @@ -29,7 +29,7 @@ __all__ =3D ["KSRC", "NetNS", "NetNSEnter", "CmdExitFailure", "fd_read_timeout", "cmd", "bkg", "defer", "bpftool", "ip", "ethtool", "bpftrace", "rand_port", "rand_port= s", - "wait_port_listen", "wait_file", "tool", + "wait_port_listen", "wait_file", "tool", "ynlcli", "bpf_map_set", "bpf_map_dump", "bpf_prog_map_ids", "NetdevSim", "NetdevSimDev", "NetshaperFamily", "DevlinkFamily", "PSPFamily", "NlError", diff --git a/tools/testing/selftests/net/lib/py/utils.py b/tools/testing/se= lftests/net/lib/py/utils.py index 6c44a3d2bbf7..a14a4b5dd592 100644 --- a/tools/testing/selftests/net/lib/py/utils.py +++ b/tools/testing/selftests/net/lib/py/utils.py @@ -8,6 +8,8 @@ import socket import subprocess import time =20 +from .consts import KSRC, KSFT_DIR + =20 class CmdInitFailure(Exception): """ Command failed to start. Only raised by bkg(). """ @@ -217,12 +219,12 @@ class defer: self.exec_only() =20 =20 -def tool(name, args, json=3DNone, ns=3DNone, host=3DNone): +def tool(name, args, json=3DNone, ns=3DNone, host=3DNone, shell=3DNone): cmd_str =3D name + ' ' if json: cmd_str +=3D '--json ' cmd_str +=3D args - cmd_obj =3D cmd(cmd_str, ns=3Dns, host=3Dhost) + cmd_obj =3D cmd(cmd_str, ns=3Dns, host=3Dhost, shell=3Dshell) if json: return _json.loads(cmd_obj.stdout) return cmd_obj @@ -242,6 +244,19 @@ def ethtool(args, json=3DNone, ns=3DNone, host=3DNone): return tool('ethtool', args, json=3Djson, ns=3Dns, host=3Dhost) =20 =20 +def ynlcli(family, args, json=3DNone, ns=3DNone, host=3DNone): + if (KSFT_DIR / "kselftest-list.txt").exists(): + cli =3D KSFT_DIR / "net/lib/ynl/pyynl/cli.py" + spec =3D KSFT_DIR / f"net/lib/specs/{family}.yaml" + else: + cli =3D KSRC / "tools/net/ynl/pyynl/cli.py" + spec =3D KSRC / f"Documentation/netlink/specs/{family}.yaml" + if not cli.exists(): + raise FileNotFoundError(f"cli not found at {cli}") + args =3D f"--spec {spec} --no-schema {args}" + return tool(cli.as_posix(), args, json=3Djson, ns=3Dns, host=3Dhost, s= hell=3DTrue) + + def bpftrace(expr, json=3DNone, ns=3DNone, host=3DNone, timeout=3DNone): """ Run bpftrace and return map data (if json=3DTrue). --=20 2.53.0 From nobody Sun Jun 14 22:57:06 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 B092836C5B4 for ; Tue, 7 Apr 2026 02:45:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775529953; cv=none; b=uQECOkuxNk6vRnsUzjK+7LA3hlDps6H4Sjw4xdeQECw9JX4rJhMuXks4JNCAa9dfv9JwZncYj1C8CipLJBrsIZODAaZ67P23Qy+FAJFfVYye7lkrMnHPkj2+sA1QBKHebMzOpTXx9NWuagSI6cJQ7bJkXHMbUvAaj9OeUYy3CoY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775529953; c=relaxed/simple; bh=SfgMN3y4jYNXbpizBMWePWbS3RAPpZZUcCKLotlKuCQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QohQkPYeqa9CG3AbQr2FNurgR7NUEvNbxCEIsaj8taP2FKApIQlKvkJhbPL+B3wKrYwYFHqmZT0Qwjj+rQoPZNsYT11zSOtEW2GM9SUWr/zLWZp0oRPQAIUA+5RC9uqk7wMKckQZ+sBJzLcHUrsB4HR+TdDFCDvCMATd3ETqkks= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=Fotlvk6g; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="Fotlvk6g" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1775529948; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=EXd4/voVLzjEmWeVtz1atqAJ9E1tZgC6UdSGMEkrm6A=; b=Fotlvk6gF0Vi2QTmeHPzmTcEQMkr94Jbrv/Osqx6z1fkZLWBhNsRJH/CFoghS0ZZ9WMR/R Q1nDntyurhj6qz5wWqouLx7EGYRSEK5i/sjvneAoapcmdKx4i3K8r8uGXhsDc7sT6Or49k PGBgVrhDNyz+ME/dcQ09hUnjda4SXJ0= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-435-n-g1HeEcMa29HzTyS5wW7g-1; Mon, 06 Apr 2026 22:45:39 -0400 X-MC-Unique: n-g1HeEcMa29HzTyS5wW7g-1 X-Mimecast-MFC-AGG-ID: n-g1HeEcMa29HzTyS5wW7g_1775529932 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 1084D195608A; Tue, 7 Apr 2026 02:45:32 +0000 (UTC) Received: from xudu-thinkpadx1carbongen9.nay.com (unknown [10.72.116.131]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 407D5300019F; Tue, 7 Apr 2026 02:45:27 +0000 (UTC) From: Xu Du To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, shuah@kernel.org Cc: netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 3/4] selftests: drv-net: tso: add Geneve double tunneling GSO test Date: Tue, 7 Apr 2026 10:45:10 +0800 Message-ID: <59ac21abe8a0d7431485ae1c9d158eecbb877b75.1775527362.git.xudu@redhat.com> In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 Content-Type: text/plain; charset="utf-8" Add a new test case to verify GSO behavior for double-encapsulated Geneve tunnels. This ensures that hardware drivers and the network stack correctly handle nested tunnel headers during segmentation. To maintain consistency and avoid complexity in hardware parser logic, the test case ensures that the IP versions for both the inner and outer headers remain the same. Signed-off-by: Xu Du --- tools/testing/selftests/drivers/net/hw/tso.py | 228 +++++++++++++++--- 1 file changed, 188 insertions(+), 40 deletions(-) diff --git a/tools/testing/selftests/drivers/net/hw/tso.py b/tools/testing/= selftests/drivers/net/hw/tso.py index f792115adfb3..6b4639ce6139 100755 --- a/tools/testing/selftests/drivers/net/hw/tso.py +++ b/tools/testing/selftests/drivers/net/hw/tso.py @@ -5,6 +5,7 @@ =20 import errno import fcntl +import json import socket import struct import termios @@ -13,7 +14,29 @@ import time from lib.py import ksft_pr, ksft_run, ksft_exit, KsftSkipEx, KsftXfailEx from lib.py import ksft_eq, ksft_ge, ksft_lt from lib.py import EthtoolFamily, NetdevFamily, NetDrvEpEnv -from lib.py import bkg, cmd, defer, ethtool, ip, rand_port, wait_port_list= en +from lib.py import bkg, ynlcli, defer, ethtool, ip, rand_port, wait_port_l= isten + + +def _convert_ip(key): + def _conv(val): + final_key =3D f"{key}6" if ":" in str(val) else key + return final_key, val + + return _conv + + +YNLLINK_PARAM_MAP =3D { + "geneve": { + "id": ("id", int), + "dstport": ("port", int), + "remote": ("", _convert_ip("remote")), + "udpcsum": ("udp-csum",), + "udp6zerocsumtx": ("udp-zero-csum6-tx",), + "udp6zerocsumrx": ("udp-zero-csum6-rx",), + "gro-hint": ("gro-hint",), + "innerprotoinherit": ("inner-proto-inherit",), + }, +} =20 =20 def sock_wait_drain(sock, max_wait=3D1000): @@ -107,29 +130,106 @@ def run_one_stream(cfg, ipver, remote_v4, remote_v6,= should_lso): 500, comment=3D"Number of LSO wire-packets with LS= O disabled") =20 =20 -def build_tunnel(cfg, outer_ipver, tun_info): - local_v4 =3D NetDrvEpEnv.nsim_v4_pfx + "1" - local_v6 =3D NetDrvEpEnv.nsim_v6_pfx + "1" - remote_v4 =3D NetDrvEpEnv.nsim_v4_pfx + "2" - remote_v6 =3D NetDrvEpEnv.nsim_v6_pfx + "2" - - local_addr =3D cfg.addr_v[outer_ipver] - remote_addr =3D cfg.remote_addr_v[outer_ipver] +def get_tun_ip_address(encap_tun): + pfx_v4 =3D NetDrvEpEnv.nsim_v4_pfx + pfx_v6 =3D NetDrvEpEnv.nsim_v6_pfx.rsplit("::", 1)[0] + ":" + v4_offset =3D 1 if encap_tun =3D=3D "outer" else 17 + v6_offset =3D "1" if encap_tun =3D=3D "outer" else "2" + local_v4 =3D f"{pfx_v4}{v4_offset}" + remote_v4 =3D f"{pfx_v4}{v4_offset + 1}" + local_v6 =3D f"{pfx_v6}{v6_offset}::1" + remote_v6 =3D f"{pfx_v6}{v6_offset}::2" + return local_v4, remote_v4, 28, local_v6, remote_v6, 80 + + +def parse_tun_args(tun_arg, tunnel_arg_dict): + data =3D {} + args =3D tun_arg.split() + i =3D 0 + while i < len(args): + negate =3D False + item =3D tunnel_arg_dict.get(args[i]) + if item is None and args[i].startswith("no"): + item =3D tunnel_arg_dict.get(args[i][2:]) + negate =3D True + if item and len(item) =3D=3D 2: + key, conv =3D item + val =3D conv(args[i + 1]) + if isinstance(val, tuple) and len(val) =3D=3D 2: + data[val[0]] =3D val[1] + else: + data[key] =3D val + i +=3D 2 + elif item: + data[item[0]] =3D 0 if negate else 1 + i +=3D 1 + else: + i +=3D 1 + return data + + +def create_tunnel(tun_type, tun_name, tun_arg, host=3DNone) -> None: + tunnel_arg_dict =3D YNLLINK_PARAM_MAP.get(tun_type) + if tunnel_arg_dict: + data =3D parse_tun_args(tun_arg, tunnel_arg_dict) + nl_msg =3D json.dumps({ + "ifname": tun_name, + "linkinfo": {"kind": tun_type, "data": data}, + }) + ynlcli("rt-link", + f"--create --excl --do newlink --json '{nl_msg}'", + host=3Dhost) + else: + ip(f"link add {tun_name} type {tun_type} {tun_arg}", host=3Dhost) + + +def build_tunnel(cfg, encap_ipver, encap_tun, tun_info): + if encap_tun =3D=3D "outer": + encap_addr =3D cfg.addr_v[encap_ipver] + decap_addr =3D cfg.remote_addr_v[encap_ipver] + else: + local_v4, remote_v4, _, local_v6, remote_v6, _ =3D get_tun_ip_addr= ess( + "outer") + encap_addr =3D local_v4 if encap_ipver =3D=3D "4" else local_v6 + decap_addr =3D remote_v4 if encap_ipver =3D=3D "4" else remote_v6 =20 tun_type =3D tun_info[0] - tun_arg =3D tun_info[1] - ip(f"link add {tun_type}-ksft type {tun_type} {tun_arg} local {local_a= ddr} remote {remote_addr} dev {cfg.ifname}") - defer(ip, f"link del {tun_type}-ksft") - ip(f"link set dev {tun_type}-ksft up") - ip(f"addr add {local_v4}/24 dev {tun_type}-ksft") - ip(f"addr add {local_v6}/64 dev {tun_type}-ksft") - - ip(f"link add {tun_type}-ksft type {tun_type} {tun_arg} local {remote_= addr} remote {local_addr} dev {cfg.remote_ifname}", - host=3Dcfg.remote) - defer(ip, f"link del {tun_type}-ksft", host=3Dcfg.remote) - ip(f"link set dev {tun_type}-ksft up", host=3Dcfg.remote) - ip(f"addr add {remote_v4}/24 dev {tun_type}-ksft", host=3Dcfg.remote) - ip(f"addr add {remote_v6}/64 dev {tun_type}-ksft", host=3Dcfg.remote) + tun_name =3D f"{tun_type}-ksft" if encap_tun =3D=3D "outer" else f"in-= {tun_type}-ksft" + local_v4, remote_v4, mask_v4, local_v6, remote_v6, mask_v6 =3D get_tun= _ip_address( + encap_tun + ) + tun_features =3D " ".join( + f + " on" for f in tun_info[2].split()) if tun_info[2] else "" + + tun_dev =3D cfg.ifname if encap_tun =3D=3D "outer" else f"{tun_type}-k= sft" + tun_arg =3D tun_info[1] + \ + f" local {encap_addr} remote {decap_addr} dev {tun_dev}" + + create_tunnel(tun_type, tun_name, tun_arg) + defer(ip, f"link del {tun_name}") + ip(f"link set dev {tun_name} up") + ip(f"addr add {local_v4}/{mask_v4} dev {tun_name}") + ip(f"addr add {local_v6}/{mask_v6} dev {tun_name}") + if tun_features: + ethtool(f"-K {tun_name} {tun_features}") + # pmtu can't be propagated to upper layer devices; need manual adjust + if encap_tun =3D=3D "inner": + tun_mtu =3D 1392 if encap_ipver =3D=3D "4" else 1352 + ip(f"link set dev {tun_name} mtu {tun_mtu}") + + tun_dev =3D cfg.remote_ifname if encap_tun =3D=3D "outer" else f"{tun_= type}-ksft" + tun_arg =3D tun_info[1] + \ + f" local {decap_addr} remote {encap_addr} dev {tun_dev}" + + create_tunnel(tun_type, tun_name, tun_arg, host=3Dcfg.remote) + defer(ip, f"link del {tun_name}", host=3Dcfg.remote) + ip(f"link set dev {tun_name} up", host=3Dcfg.remote) + ip(f"addr add {remote_v4}/{mask_v4} dev {tun_name}", host=3Dcfg.remote) + ip(f"addr add {remote_v6}/{mask_v6} dev {tun_name}", host=3Dcfg.remote) + if tun_features: + ethtool(f"-K {tun_name} {tun_features}", host=3Dcfg.remote) + if encap_tun =3D=3D "inner": + ip(f"link set dev {tun_name} mtu {tun_mtu}", host=3Dcfg.remote) =20 return remote_v4, remote_v6 =20 @@ -145,7 +245,10 @@ def restore_wanted_features(cfg): ksft_pr(f"WARNING: failure restoring wanted features: {e}") =20 =20 -def test_builder(name, cfg, outer_ipver, feature, tun=3DNone, inner_ipver= =3DNone): +def test_builder( + name, cfg, outer_ipver, feature, outer_tun=3DNone, + inner_tun=3DNone, inner_ipver=3DNone, +): """Construct specific tests from the common template.""" def f(cfg): cfg.require_ipver(outer_ipver) @@ -159,8 +262,12 @@ def test_builder(name, cfg, outer_ipver, feature, tun= =3DNone, inner_ipver=3DNone): raise KsftSkipEx(f"Device does not support {feature}") =20 ipver =3D outer_ipver - if tun: - remote_v4, remote_v6 =3D build_tunnel(cfg, ipver, tun) + if outer_tun and inner_tun: + build_tunnel(cfg, ipver, "outer", outer_tun) + remote_v4, remote_v6 =3D build_tunnel(cfg, ipver, "inner", inn= er_tun) + ipver =3D inner_ipver + elif outer_tun: + remote_v4, remote_v6 =3D build_tunnel(cfg, ipver, "outer", out= er_tun) ipver =3D inner_ipver else: remote_v4 =3D cfg.remote_addr_v["4"] @@ -182,7 +289,11 @@ def test_builder(name, cfg, outer_ipver, feature, tun= =3DNone, inner_ipver=3DNone): ethtool(f"-K {cfg.ifname} {feature} on") run_one_stream(cfg, ipver, remote_v4, remote_v6, should_lso=3DTrue) =20 - f.__name__ =3D name + ((outer_ipver + "_") if tun else "") + "ipv" + i= nner_ipver + outer_tun_name =3D f"{outer_tun[0]}{outer_ipver}_" if outer_tun else "" + inner_tun_name =3D f"{inner_tun[0]}{outer_ipver}_" if inner_tun else "" + f.__name__ =3D ( + name + "_" if name else "" + ) + f"{outer_tun_name}{inner_tun_name}ipv{inner_ipver}" return f =20 =20 @@ -242,14 +353,43 @@ def main() -> None: query_nic_features(cfg) =20 test_info =3D ( - # name, v4/v6 ethtool_feature tun:(type, = args, inner ip versions) - ("", "4", "tx-tcp-segmentation", None), - ("", "6", "tx-tcp6-segmentation", None), - ("vxlan", "4", "tx-udp_tnl-segmentation", ("vxlan", "= id 100 dstport 4789 noudpcsum", ("4", "6"))), - ("vxlan", "6", "tx-udp_tnl-segmentation", ("vxlan", "= id 100 dstport 4789 udp6zerocsumtx udp6zerocsumrx", ("4", "6"))), - ("vxlan_csum", "", "tx-udp_tnl-csum-segmentation", ("vxlan", "= id 100 dstport 4789 udpcsum", ("4", "6"))), - ("gre", "4", "tx-gre-segmentation", ("gre", "= ", ("4", "6"))), - ("gre", "6", "tx-gre-segmentation", ("ip6gre","= ", ("4", "6"))), + # name, v4/v6, ethtool_feature, + # outer_tun:(type, args, ethtool_feature, inner ip versions), + # inner_tun:(type, args, ethtool_feature, inner ip versions) + ("", "4", "tx-tcp-segmentation", (), ()), + ("", "6", "tx-tcp6-segmentation", (), ()), + ( + "vxlan", "4", "tx-udp_tnl-segmentation", + ("vxlan", "id 100 dstport 4789 noudpcsum", "", ("4", "6"))= , (), + ), + ( + "vxlan", "6", "tx-udp_tnl-segmentation", + ("vxlan", "id 100 dstport 4789 udp6zerocsumtx udp6zerocsum= rx", + "", ("4", "6")), + (), + ), + ( + "vxlan_csum", "", "tx-udp_tnl-csum-segmentation", + ("vxlan", "id 100 dstport 4789 udpcsum", "", ("4", "6")), + (), + ), + ( + "gre", "4", "tx-gre-segmentation", + ("gre", "", "", ("4", "6")), + (), + ), + ( + "gre", "6", "tx-gre-segmentation", + ("ip6gre", "", "", ("4", "6")), + (), + ), + ( + "geneve2", "4", "tx-udp_tnl-segmentation", + ("geneve", "id 100 dstport 6081 noudpcsum udp6zerocsumtx u= dp6zerocsumrx", + "tx-gso-partial tx-udp_tnl-segmentation tx-udp_tnl-csum-s= egmentation", (),), + ("geneve", "id 200 dstport 6082 noudpcsum udp6zerocsumtx u= dp6zerocsumrx", + "", ("4", "6"),), + ), ) =20 cases =3D [] @@ -259,13 +399,21 @@ def main() -> None: if info[1] and outer_ipver !=3D info[1]: continue =20 - if info[3]: - cases +=3D [ - test_builder(info[0], cfg, outer_ipver, info[2], i= nfo[3], inner_ipver) - for inner_ipver in info[3][2] - ] + outer_tun, inner_tun =3D info[3], info[4] + if outer_tun and inner_tun: + inner_ipvers =3D inner_tun[3] + cases +=3D [test_builder(info[0], cfg, outer_ipver, in= fo[2], + outer_tun, inner_tun, inner_ipv= er) + for inner_ipver in inner_ipvers] + elif outer_tun: + inner_ipvers =3D outer_tun[3] + cases +=3D [test_builder(info[0], cfg, outer_ipver, in= fo[2], + outer_tun, None, inner_ipver) + for inner_ipver in inner_ipvers] else: - cases.append(test_builder(info[0], cfg, outer_ipver, i= nfo[2], None, outer_ipver)) + cases.append( + test_builder(info[0], cfg, outer_ipver, info[2], + None, None, outer_ipver)) =20 ksft_run(cases=3Dcases, args=3D(cfg, )) ksft_exit() --=20 2.53.0 From nobody Sun Jun 14 22:57:06 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 0185C372B26 for ; Tue, 7 Apr 2026 02:45:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775529941; cv=none; b=OxJFBQeG7m3bfsU+VklZbNPMI7pusMYcW/18E8837/vmuSn6xQdDOcnbBGTZur5L1M/t2NJMxUyE6ZEZAJCiUWLmILitxxXB6flfpk5+1Vkj7KEPkNvnsfn7NbP1PjQI+DMercXjW6LYrF27tUy3HZuVbtQfIAHzcOP6ZEguMGk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775529941; c=relaxed/simple; bh=NA8XcEs7Rx23RPVBK4DgyYLEyZpuUgGoQ451Bpm7vcg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pJ+PurRSlVZAeLcbrCnr086qFzLQUO0ooNhQV5pRZCt+1l1dX6lBTtkxYPDwDK7yOCdTIwGBd6hKyM4Svx3a1fkj8gwjHnN97se0Yu3e6H9h5QS1Zuy00ErTKuecu4rEwpAynzPhNSh15cf1DU58eOLMWXaRl0E0ZqWXOugecBE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=Qx4Qj4sz; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="Qx4Qj4sz" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1775529939; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uBjjPwiqEnQlQJWcx1TjKWKQU5N6GjqGMfXPuwlgZhw=; b=Qx4Qj4sz2Idvj99z+mMXf2SQpXa1fr+wA3ugJymlWZMzxyVyEDAwjJvaVpIvYI7RhgsiJC gWCk2UAHi8jfHla3dJypm6dSXVe2awyscSJLedTUtz7RUHtZfgq6NiZIv+FIvG9s7XYnGn b0xp8xNtB6MoU0LPA1eoZla7WhgFk0I= Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-47-0e-91N8UPG2jQWWPUBiQkg-1; Mon, 06 Apr 2026 22:45:37 -0400 X-MC-Unique: 0e-91N8UPG2jQWWPUBiQkg-1 X-Mimecast-MFC-AGG-ID: 0e-91N8UPG2jQWWPUBiQkg_1775529936 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 83D97180035C; Tue, 7 Apr 2026 02:45:36 +0000 (UTC) Received: from xudu-thinkpadx1carbongen9.nay.com (unknown [10.72.116.131]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id B26B4300019F; Tue, 7 Apr 2026 02:45:32 +0000 (UTC) From: Xu Du To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, shuah@kernel.org Cc: netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC net-next 4/4] selftests: drv-net: tso: expand double tunnel GSO test coverage Date: Tue, 7 Apr 2026 10:45:11 +0800 Message-ID: In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 Content-Type: text/plain; charset="utf-8" Add Geneve test variants with GRO hint and TTL inherit options to exercise additional tunnel configuration paths. Also add double VXLAN tunnel test cases to complement the existing double Geneve coverage. Signed-off-by: Xu Du --- tools/testing/selftests/drivers/net/hw/tso.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tools/testing/selftests/drivers/net/hw/tso.py b/tools/testing/= selftests/drivers/net/hw/tso.py index 6b4639ce6139..6930eb3fde29 100755 --- a/tools/testing/selftests/drivers/net/hw/tso.py +++ b/tools/testing/selftests/drivers/net/hw/tso.py @@ -373,6 +373,12 @@ def main() -> None: ("vxlan", "id 100 dstport 4789 udpcsum", "", ("4", "6")), (), ), + ( + "vxlan2", "4", "tx-udp_tnl-csum-segmentation", + ("vxlan", "id 100 dstport 4789 udpcsum", + "tx-gso-partial tx-udp_tnl-segmentation tx-udp_tnl-csum-s= egmentation", (),), + ("vxlan", "id 200 dstport 5789 udpcsum", "", ("4", "6")), + ), ( "gre", "4", "tx-gre-segmentation", ("gre", "", "", ("4", "6")), @@ -390,6 +396,24 @@ def main() -> None: ("geneve", "id 200 dstport 6082 noudpcsum udp6zerocsumtx u= dp6zerocsumrx", "", ("4", "6"),), ), + ( + "geneve2_csum", "", "tx-udp_tnl-csum-segmentation", + ("geneve", "id 100 dstport 6081 udpcsum", + "tx-gso-partial tx-udp_tnl-segmentation tx-udp_tnl-csum-s= egmentation", (),), + ("geneve", "id 200 dstport 6082 noudpcsum", "", ("4", "6")= ), + ), + ( + "geneve2_grohint", "", "tx-udp_tnl-csum-segmentation", + ("geneve", "id 100 dstport 6081 udpcsum gro-hint", + "tx-gso-partial tx-udp_tnl-segmentation tx-udp_tnl-csum-s= egmentation", (),), + ("geneve", "id 200 dstport 6082 udpcsum", "", ("4", "6")), + ), + ( + "geneve2_inherit", "4", "tx-udp_tnl-csum-segmentation", + ("geneve", "id 100 dstport 6081 udpcsum gro-hint", + "tx-gso-partial tx-udp_tnl-segmentation tx-udp_tnl-csum-s= egmentation", (),), + ("geneve", "id 200 dstport 6082 udpcsum inner-proto-inheri= t", "", ("4", "6")), + ), ) =20 cases =3D [] --=20 2.53.0