From nobody Sun Dec 14 06:20:55 2025 Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8E687313E04; Mon, 1 Sep 2025 11:38:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756726736; cv=none; b=MGYYr+6+rxFYR7kBOSpphWGw3I6A4mLSSN0Ixq2BgByGyXRX7u64MqrI4+wrp8+dpmSbld1dc9/csgUFtajWOH0ZXGUZlYUUaUulHhIZL4b499N8yLwcjfwF2bdgEm/4YdFs2sznWtxkR+6QHS2vJSFxxrZLNgxMH8ovlka3ZjA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756726736; c=relaxed/simple; bh=nXqfRaXa7TPT5UlTkSC5YunATJ2MtyWJw1kq/wkuG7o=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=jxEcBLo97vHk8lutyMjj/GQpYjnAdUJVxnU8XIjzX5SOLgazIB1Nw2pLMVVLSTxJC/jks2J3ZNxXXvk2B7+fGuBzX7UOr0m1myyiE76ImxNhX/xOzl/du7utHR32ysuzwxW4AkioTH3ZZEylII+TYG25prIirv3EWf5wlFwXvBA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=FFC0AusM; arc=none smtp.client-ip=209.85.221.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="FFC0AusM" Received: by mail-wr1-f51.google.com with SMTP id ffacd0b85a97d-3cbb3ff70a0so2609575f8f.2; Mon, 01 Sep 2025 04:38:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756726732; x=1757331532; darn=vger.kernel.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=JaBM4hbswP3CKidxpCKke/FjAwFtviAVkjfvWCq4DYs=; b=FFC0AusMvlAjGR6J7waQtl6xtL/8gVGWgy90eRyws5USIJgwill2ljow6rjwEY9OTz PzpuBEi5S246XgjCjySN7KJoB74ris2iDeHqsYwXpiu4He8uWRN4ISEoxKaPQxVokS1A e7EatzIF0mOlDtGvZ0wEcJ6lz2XHImJVmoPImrfpAA2lvHXfEshE8bz5YmSpJWJrew6B W9zk4J4aO0zghToMX9Ej9O6fpOLuR65fW+bbndOEDO2IjyqjvUG9CYrHY1lxJJJwr040 n/4gzgBGBsVm+Hw0/5pOOBrSnkGPlkPy6CiwyEOjNw0oNP2qplnCM734JdtapMZG0AnF 6grw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756726732; x=1757331532; 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=JaBM4hbswP3CKidxpCKke/FjAwFtviAVkjfvWCq4DYs=; b=MX7NWlAPl84V235Yg/52UIM3/0aB2k5Pzds/kNUEeNOfqudEc9smQmjob9eOVc64TJ vj6OZt/cE7No0+TTc5xhsGJ3BlVeAez/3/GoEBKKmBNfeSt59W1d1Mpk6QlKRTWNj6I5 KmzyL5S4FdiFM8+poOZMUZw1f8a89iFc+wrqRBO7H0o4MYKz0+vDtbFDqHgq6sCD9o// LkuOJJjcG+S3ZgjhYSJXCAm1/KBqywSDWxGc+gQuXNWz/bL3lvZ6xl+Bzslnrk/a1ZB1 NAAYzOXP8n1halMNPS3+KoiDNpoPerKuUeiBJFzlKyGVJKY0mWWeoKGheWJtKKb19Ksr H8Ng== X-Forwarded-Encrypted: i=1; AJvYcCWLTMSpJ5XX5lrL+TdHVj3WHQgRyfURMC4M7z3YDhFmyZji6zLHpPasALioOrUyVm1ZaSkgyHx5VOUrOgA=@vger.kernel.org X-Gm-Message-State: AOJu0YyY20oznIYVX5bWpAzAuI6zle3hMWuCJpG7eVhNL1OLsyLRR+bL XA1wtsFDUgKgjNY0iAjPaB83qneGGDnNV3p1D6Tl9OBfMNoui3WwNRXgCx5NxMNTVoY= X-Gm-Gg: ASbGnct1Q+hdPMyt5pcIUqujcGXkMOpk/PT7xrLQxB8r37oJN3otuGfwoJbv5jqX4wO Rm8J3cvT8XYyPajVfaWVt0VJln2P55BsSJ+U/dnfEmDcoCcdkddLOP9lykRkiLWreUiCplFJFix ht//7Fa034PHkP9YT7m81fzvQQFcRPQ83j9xCO2BQiTg0Sye1u71yXAYePAC+eiVgR+lpI/vhhY 0pV6gu5DBMTHq15q30SV3BWwFAQuV1UcBD4r0/XCK9pa63AjF59jyiCDVekdNILygKcQvoWVQ2L 61x5mambP96NNAHqOQjTnQe+yI0/0544TBJujA8eRnQ4NS3ebHB6QNYza8kJr/qwKmoOglO5185 uokDgwX4UrpHQoIzZLVmGsFsbvfOTj2XCGWPC0c5nKkLNDQYH X-Google-Smtp-Source: AGHT+IHeCGle5U4kgIZqlZ2Zfvsulxwq0GMBsnnbpzlqqgBwNeaOPUE2o5+0tHUyjLy64neOGeQYuQ== X-Received: by 2002:a05:6000:2a02:b0:3d4:a64:6725 with SMTP id ffacd0b85a97d-3d40a646ab1mr3199253f8f.10.1756726731581; Mon, 01 Sep 2025 04:38:51 -0700 (PDT) Received: from localhost ([45.10.155.17]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3d690f2edf1sm4253409f8f.16.2025.09.01.04.38.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 04:38:51 -0700 (PDT) From: Richard Gobert To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, leon@kernel.org, ecree.xilinx@gmail.com, dsahern@kernel.org, ncardwell@google.com, kuniyu@google.com, shuah@kernel.org, sdf@fomichev.me, aleksander.lobakin@intel.com, florian.fainelli@broadcom.com, willemdebruijn.kernel@gmail.com, alexander.duyck@gmail.com, linux-kernel@vger.kernel.org, linux-net-drivers@amd.com, Richard Gobert Subject: [PATCH net-next v4 1/5] net: gro: remove is_ipv6 from napi_gro_cb Date: Mon, 1 Sep 2025 13:38:22 +0200 Message-Id: <20250901113826.6508-2-richardbgobert@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250901113826.6508-1-richardbgobert@gmail.com> References: <20250901113826.6508-1-richardbgobert@gmail.com> 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 Content-Type: text/plain; charset="utf-8" Remove is_ipv6 from napi_gro_cb and use sk->sk_family instead. This frees up space for another ip_fixedid bit that will be added in the next commit. udp_sock_create always creates either a AP_INET or a AF_INET6 socket, so using sk->sk_family is reliable. In IPv6-FOU, cfg-ipv6_v6only is always enabled. Signed-off-by: Richard Gobert --- include/net/gro.h | 3 --- net/ipv4/fou_core.c | 32 ++++++++++++++------------------ net/ipv4/udp_offload.c | 2 -- net/ipv6/udp_offload.c | 2 -- 4 files changed, 14 insertions(+), 25 deletions(-) diff --git a/include/net/gro.h b/include/net/gro.h index a0fca7ac6e7e..87c68007f949 100644 --- a/include/net/gro.h +++ b/include/net/gro.h @@ -71,9 +71,6 @@ struct napi_gro_cb { /* Free the skb? */ u8 free:2; =20 - /* Used in foo-over-udp, set in udp[46]_gro_receive */ - u8 is_ipv6:1; - /* Used in GRE, set in fou/gue_gro_receive */ u8 is_fou:1; =20 diff --git a/net/ipv4/fou_core.c b/net/ipv4/fou_core.c index 3e30745e2c09..a654a06ae7fd 100644 --- a/net/ipv4/fou_core.c +++ b/net/ipv4/fou_core.c @@ -228,21 +228,27 @@ static int gue_udp_recv(struct sock *sk, struct sk_bu= ff *skb) return 0; } =20 +static inline const struct net_offload *fou_gro_ops(const struct sock *sk, + int proto) +{ + const struct net_offload __rcu **offloads; + + /* FOU doesn't allow IPv4 on IPv6 sockets. */ + offloads =3D sk->sk_family =3D=3D AF_INET6 ? inet6_offloads : inet_offloa= ds; + return rcu_dereference(offloads[proto]); +} + static struct sk_buff *fou_gro_receive(struct sock *sk, struct list_head *head, struct sk_buff *skb) { - const struct net_offload __rcu **offloads; struct fou *fou =3D fou_from_sock(sk); const struct net_offload *ops; struct sk_buff *pp =3D NULL; - u8 proto; =20 if (!fou) goto out; =20 - proto =3D fou->protocol; - /* We can clear the encap_mark for FOU as we are essentially doing * one of two possible things. We are either adding an L4 tunnel * header to the outer L3 tunnel header, or we are simply @@ -254,8 +260,7 @@ static struct sk_buff *fou_gro_receive(struct sock *sk, /* Flag this frame as already having an outer encap header */ NAPI_GRO_CB(skb)->is_fou =3D 1; =20 - offloads =3D NAPI_GRO_CB(skb)->is_ipv6 ? inet6_offloads : inet_offloads; - ops =3D rcu_dereference(offloads[proto]); + ops =3D fou_gro_ops(sk, fou->protocol); if (!ops || !ops->callbacks.gro_receive) goto out; =20 @@ -268,10 +273,8 @@ static struct sk_buff *fou_gro_receive(struct sock *sk, static int fou_gro_complete(struct sock *sk, struct sk_buff *skb, int nhoff) { - const struct net_offload __rcu **offloads; struct fou *fou =3D fou_from_sock(sk); const struct net_offload *ops; - u8 proto; int err; =20 if (!fou) { @@ -279,10 +282,7 @@ static int fou_gro_complete(struct sock *sk, struct sk= _buff *skb, goto out; } =20 - proto =3D fou->protocol; - - offloads =3D NAPI_GRO_CB(skb)->is_ipv6 ? inet6_offloads : inet_offloads; - ops =3D rcu_dereference(offloads[proto]); + ops =3D fou_gro_ops(sk, fou->protocol); if (WARN_ON(!ops || !ops->callbacks.gro_complete)) { err =3D -ENOSYS; goto out; @@ -323,7 +323,6 @@ static struct sk_buff *gue_gro_receive(struct sock *sk, struct list_head *head, struct sk_buff *skb) { - const struct net_offload __rcu **offloads; const struct net_offload *ops; struct sk_buff *pp =3D NULL; struct sk_buff *p; @@ -450,8 +449,7 @@ static struct sk_buff *gue_gro_receive(struct sock *sk, /* Flag this frame as already having an outer encap header */ NAPI_GRO_CB(skb)->is_fou =3D 1; =20 - offloads =3D NAPI_GRO_CB(skb)->is_ipv6 ? inet6_offloads : inet_offloads; - ops =3D rcu_dereference(offloads[proto]); + ops =3D fou_gro_ops(sk, proto); if (!ops || !ops->callbacks.gro_receive) goto out; =20 @@ -467,7 +465,6 @@ static struct sk_buff *gue_gro_receive(struct sock *sk, static int gue_gro_complete(struct sock *sk, struct sk_buff *skb, int nhof= f) { struct guehdr *guehdr =3D (struct guehdr *)(skb->data + nhoff); - const struct net_offload __rcu **offloads; const struct net_offload *ops; unsigned int guehlen =3D 0; u8 proto; @@ -494,8 +491,7 @@ static int gue_gro_complete(struct sock *sk, struct sk_= buff *skb, int nhoff) return err; } =20 - offloads =3D NAPI_GRO_CB(skb)->is_ipv6 ? inet6_offloads : inet_offloads; - ops =3D rcu_dereference(offloads[proto]); + ops =3D fou_gro_ops(sk, proto); if (WARN_ON(!ops || !ops->callbacks.gro_complete)) goto out; =20 diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c index b1f3fd302e9d..19d0b5b09ffa 100644 --- a/net/ipv4/udp_offload.c +++ b/net/ipv4/udp_offload.c @@ -891,8 +891,6 @@ struct sk_buff *udp4_gro_receive(struct list_head *head= , struct sk_buff *skb) skb_gro_checksum_try_convert(skb, IPPROTO_UDP, inet_gro_compute_pseudo); skip: - NAPI_GRO_CB(skb)->is_ipv6 =3D 0; - if (static_branch_unlikely(&udp_encap_needed_key)) sk =3D udp4_gro_lookup_skb(skb, uh->source, uh->dest); =20 diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c index d8445ac1b2e4..046f13b1d77a 100644 --- a/net/ipv6/udp_offload.c +++ b/net/ipv6/udp_offload.c @@ -154,8 +154,6 @@ struct sk_buff *udp6_gro_receive(struct list_head *head= , struct sk_buff *skb) ip6_gro_compute_pseudo); =20 skip: - NAPI_GRO_CB(skb)->is_ipv6 =3D 1; - if (static_branch_unlikely(&udpv6_encap_needed_key)) sk =3D udp6_gro_lookup_skb(skb, uh->source, uh->dest); =20 --=20 2.36.1 From nobody Sun Dec 14 06:20:55 2025 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6E36C31E10E; Mon, 1 Sep 2025 11:38:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756726741; cv=none; b=qlvAeK5zXoiULi4T/wIC0v3gaMtTPKXwdsdXoss8+l4Gie0R0k90Ah+Vi/QnaEKmT+wdxNL04C/FLuveTkd7lCA42ta88YGDuI/NztgnQ4Ip+6tIa2+WRQcVUReMNcpihhieC/Gdf4O7rqtjZe4FR1wuvtpCJ3bkoPIMeCSTv3A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756726741; c=relaxed/simple; bh=9qI/jNzmR0M56MPtZTnHdaMUPhBDm7DOfjKta+ZJLpU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=EfOQoFH3705LKEF6C2YMqdxELcGgKB0WTi1xIBNfJxbpcSVg3lqAnaF4NR2uGUo+412kreFHe1rUg2EfDKZZyWl08IzOtIjeEoPphwBTP1qIh0A8QwaDEWPNey0VyvHl1SYOVojHJwGOVK3kg/hnzZXS6lx9MSThL66WYAqSr78= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=e4ZZux3V; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="e4ZZux3V" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-45b8b1a104cso10107125e9.2; Mon, 01 Sep 2025 04:38:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756726738; x=1757331538; darn=vger.kernel.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=IsJrHVffa43loKUZ4WEfyub4VECQsCXi/R/aIc5vbIE=; b=e4ZZux3VI/JRVDqUpYNdsU7MKI3484I57vFPPe4t4MA0B6ZLExyGHCwAu/dy0ZtLe7 FBaZm4TIugwR7qcBArXxogveqoYgtOSE5k0tz2x9eDVHfHExfeX8vkNTadMrdlV76Z2W wW0KNVMxhvxyolHEvT6dqABir/dUrYOYOywV0tNBXAm8nfirlBz1qEPrUvdeMm+CadsM d0hw42SaAyro5hL6Nj9LjFe5R2z6w2t4QjI8BsBmf5Y3qB+FihWbkwcArOc8U1Im3p69 J2LhOxjd3cN/QdpIFZ1yaUd1l3q1D1LZbYTo2Zb1vi+ZfvJQ8RZMfXBHung4oDAfkwvI FlbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756726738; x=1757331538; 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=IsJrHVffa43loKUZ4WEfyub4VECQsCXi/R/aIc5vbIE=; b=WKxrz3EngkaqYudmJeduG1WmtUV92sT+CvdvZq6ieuI7Lu06szwnzOqAw5GubD5mOC AchL60BR735LZ0yfoARtj2WunCk1BsoDXkIjYg5QWYTS/iw4uOY83DnnKVwlm6ghrDNO AIOOr4Kb+tR6s/C1dsx7+0XtNX3SC9ItPEv4qq5qZAzsYd9cVZWgaGEerBfInc5V1Pdg +oGHAZB30SiQDz3N6wfXPuO8WPKVJ1NpGB9kYpMWJVaKcxP8fk5g3aUvBPsoKHY+EYlC jtY5pBLn6ESoOJ1EVeQ+ncXggo/D1gYp1DC+ZJxPp0GQ5K9BO6GCKwazz5JUxHfvrDHj mJ4Q== X-Forwarded-Encrypted: i=1; AJvYcCU702p68i5BRW2Ms/xvFiZ44i942h14qNr+wpjaDzC4AjVrVPdyTt8RmX2C2DKednL1klzuluWJ9nPgojw=@vger.kernel.org X-Gm-Message-State: AOJu0Yy9siPqD68J1c7x0PJOhPTR5NgdszAewsRsI0423mc7cdoYREYU mtCU3Uc3r62QIJGq8v2PlU3RfHcmu+wQbnqEnZuUVlcZw5AG/75HVOfpNCbOgP9SaUU= X-Gm-Gg: ASbGnctcqqVzVGA528/X/tFQNvR+ycncb6pYIjgBvyh/3SK1WLiRSdK11kCMFMgZJT5 CRmQJjoyegKOGNX+n9EEKMwOCA/X42yVv3C+rooPzFsHMDq6b4W0Be+l1ObnapOCkR3itAnL7qk 88mCuxIR2lBFMJJtHbmLRSc+qxBS0ITotzXLmhTlr14jJtnI3OZr1IEEO0PgVKfHnrrFN0SfNLO blHtw+hRcJLI428vLS3bEDOaSiCTUDAurAfC7XyZ2DvLkCgFTy/XwciRInDgEea8cmRKtmanXgt CLX7GYNmrSgAh1jz3/ROieG7LXbZ0U2IL2Vo0dtEKQE7BpR+eUeMjvc7NKBNabSyUPdncVoQfgM s8Xbe5wDLy/DTXku77xgCEVYW3uh9hgOkH0JbSg== X-Google-Smtp-Source: AGHT+IFz891wS8J1A33VMWK5f8JYhTeHrwpv+22qogo1WZnnwwfkKuKR0dqE4aHanIOoRseAhrfbRg== X-Received: by 2002:a05:600c:3545:b0:45b:7a93:f108 with SMTP id 5b1f17b1804b1-45b855261f1mr62257385e9.3.1756726737536; Mon, 01 Sep 2025 04:38:57 -0700 (PDT) Received: from localhost ([45.10.155.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7e8876c9sm154403975e9.11.2025.09.01.04.38.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 04:38:57 -0700 (PDT) From: Richard Gobert To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, leon@kernel.org, ecree.xilinx@gmail.com, dsahern@kernel.org, ncardwell@google.com, kuniyu@google.com, shuah@kernel.org, sdf@fomichev.me, aleksander.lobakin@intel.com, florian.fainelli@broadcom.com, willemdebruijn.kernel@gmail.com, alexander.duyck@gmail.com, linux-kernel@vger.kernel.org, linux-net-drivers@amd.com, Richard Gobert Subject: [PATCH net-next v4 2/5] net: gro: only merge packets with incrementing or fixed outer ids Date: Mon, 1 Sep 2025 13:38:23 +0200 Message-Id: <20250901113826.6508-3-richardbgobert@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250901113826.6508-1-richardbgobert@gmail.com> References: <20250901113826.6508-1-richardbgobert@gmail.com> 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 Content-Type: text/plain; charset="utf-8" Only merge encapsulated packets if their outer IDs are either incrementing or fixed, just like for inner IDs and IDs of non-encapsulated packets. Add another ip_fixedid bit for a total of two bits: one for outer IDs (and for unencapsulated packets) and one for inner IDs. This commit preserves the current behavior of GSO where only the IDs of the inner-most headers are restored correctly. Signed-off-by: Richard Gobert --- include/net/gro.h | 30 +++++++++++++++--------------- net/ipv4/tcp_offload.c | 5 ++++- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/include/net/gro.h b/include/net/gro.h index 87c68007f949..322c5517f508 100644 --- a/include/net/gro.h +++ b/include/net/gro.h @@ -75,7 +75,7 @@ struct napi_gro_cb { u8 is_fou:1; =20 /* Used to determine if ipid_offset can be ignored */ - u8 ip_fixedid:1; + u8 ip_fixedid:2; =20 /* Number of gro_receive callbacks this packet already went through */ u8 recursion_counter:4; @@ -442,29 +442,26 @@ static inline __wsum ip6_gro_compute_pseudo(const str= uct sk_buff *skb, } =20 static inline int inet_gro_flush(const struct iphdr *iph, const struct iph= dr *iph2, - struct sk_buff *p, bool outer) + struct sk_buff *p, bool inner) { const u32 id =3D ntohl(*(__be32 *)&iph->id); const u32 id2 =3D ntohl(*(__be32 *)&iph2->id); const u16 ipid_offset =3D (id >> 16) - (id2 >> 16); const u16 count =3D NAPI_GRO_CB(p)->count; const u32 df =3D id & IP_DF; - int flush; =20 /* All fields must match except length and checksum. */ - flush =3D (iph->ttl ^ iph2->ttl) | (iph->tos ^ iph2->tos) | (df ^ (id2 & = IP_DF)); - - if (flush | (outer && df)) - return flush; + if ((iph->ttl ^ iph2->ttl) | (iph->tos ^ iph2->tos) | (df ^ (id2 & IP_DF)= )) + return true; =20 /* When we receive our second frame we can make a decision on if we * continue this flow as an atomic flow with a fixed ID or if we use * an incrementing ID. */ if (count =3D=3D 1 && df && !ipid_offset) - NAPI_GRO_CB(p)->ip_fixedid =3D true; + NAPI_GRO_CB(p)->ip_fixedid |=3D 1 << inner; =20 - return ipid_offset ^ (count * !NAPI_GRO_CB(p)->ip_fixedid); + return ipid_offset ^ (count * !(NAPI_GRO_CB(p)->ip_fixedid & (1 << inner)= )); } =20 static inline int ipv6_gro_flush(const struct ipv6hdr *iph, const struct i= pv6hdr *iph2) @@ -479,7 +476,7 @@ static inline int ipv6_gro_flush(const struct ipv6hdr *= iph, const struct ipv6hdr =20 static inline int __gro_receive_network_flush(const void *th, const void *= th2, struct sk_buff *p, const u16 diff, - bool outer) + bool inner) { const void *nh =3D th - diff; const void *nh2 =3D th2 - diff; @@ -487,19 +484,22 @@ static inline int __gro_receive_network_flush(const v= oid *th, const void *th2, if (((struct iphdr *)nh)->version =3D=3D 6) return ipv6_gro_flush(nh, nh2); else - return inet_gro_flush(nh, nh2, p, outer); + return inet_gro_flush(nh, nh2, p, inner); } =20 static inline int gro_receive_network_flush(const void *th, const void *th= 2, struct sk_buff *p) { - const bool encap_mark =3D NAPI_GRO_CB(p)->encap_mark; int off =3D skb_transport_offset(p); int flush; + int diff; =20 - flush =3D __gro_receive_network_flush(th, th2, p, off - NAPI_GRO_CB(p)->n= etwork_offset, encap_mark); - if (encap_mark) - flush |=3D __gro_receive_network_flush(th, th2, p, off - NAPI_GRO_CB(p)-= >inner_network_offset, false); + diff =3D off - NAPI_GRO_CB(p)->network_offset; + flush =3D __gro_receive_network_flush(th, th2, p, diff, false); + if (NAPI_GRO_CB(p)->encap_mark) { + diff =3D off - NAPI_GRO_CB(p)->inner_network_offset; + flush |=3D __gro_receive_network_flush(th, th2, p, diff, true); + } =20 return flush; } diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c index e6612bd84d09..1949eede9ec9 100644 --- a/net/ipv4/tcp_offload.c +++ b/net/ipv4/tcp_offload.c @@ -471,6 +471,7 @@ INDIRECT_CALLABLE_SCOPE int tcp4_gro_complete(struct sk= _buff *skb, int thoff) const u16 offset =3D NAPI_GRO_CB(skb)->network_offsets[skb->encapsulation= ]; const struct iphdr *iph =3D (struct iphdr *)(skb->data + offset); struct tcphdr *th =3D tcp_hdr(skb); + bool is_fixedid; =20 if (unlikely(NAPI_GRO_CB(skb)->is_flist)) { skb_shinfo(skb)->gso_type |=3D SKB_GSO_FRAGLIST | SKB_GSO_TCPV4; @@ -484,8 +485,10 @@ INDIRECT_CALLABLE_SCOPE int tcp4_gro_complete(struct s= k_buff *skb, int thoff) th->check =3D ~tcp_v4_check(skb->len - thoff, iph->saddr, iph->daddr, 0); =20 + is_fixedid =3D (NAPI_GRO_CB(skb)->ip_fixedid >> skb->encapsulation) & 1; + skb_shinfo(skb)->gso_type |=3D SKB_GSO_TCPV4 | - (NAPI_GRO_CB(skb)->ip_fixedid * SKB_GSO_TCP_FIXEDID); + (is_fixedid * SKB_GSO_TCP_FIXEDID); =20 tcp_gro_complete(skb); return 0; --=20 2.36.1 From nobody Sun Dec 14 06:20:55 2025 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 904FB31A563; Mon, 1 Sep 2025 11:39:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756726747; cv=none; b=euaMQluFVbFNViAaizFil84Lo60NQBN5f51EiMNJ5FvtYIoFqWla6VYb2UTcVFe6C4tGM2WmFI7wSUgFii9upEBp3d1/HfU0YRMdR3SrnVbi2yOxmsKHwsWm9FOm3T0DIBNgbHeWZSmzUuVv2XAIpocIBfZ3GBZEv8NW2rmWtDo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756726747; c=relaxed/simple; bh=3LZWn+oJa1XrmamB3nxjIOuGYR+wiH/4YPR43qRbO1o=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=bVmStXp0rPbhc6LGkHIhKp5Dj8Do4OYBtRuwrEH+KaGluQYwruHhS+iKl2nbGvxZwqqSCh7n5TrtCbCs7PYsTxZShDWc/4m6c3SEA7l7/fgc/QosL9qSvVkirSyRDgqrYyIDYUciPC3Pdo5trlfBAAX+FECjou6thmO6kUo2ujI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=iRQyZeg7; arc=none smtp.client-ip=209.85.128.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="iRQyZeg7" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-45b84c9775cso10211785e9.0; Mon, 01 Sep 2025 04:39:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756726744; x=1757331544; darn=vger.kernel.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=1Vz2uLP5sgW+Jf4jqufs4uxX+PC38XDpQssaRr5A8bo=; b=iRQyZeg7eC96cYfpFtTDxa44yuYJxtV3k69B0DtG+QluGqJrbpgBaFlkTAdXloomX6 OcGOb3nD5w4sxDshD4H3OEfz6mrtEH4BCY59Gy+YkST0gBjcL9wrYwHmQCqsqR5vLHMB Akt4lsmCFfEyaVrm8mR12S6FXHDMh/qUuIPTD4WhlI4DZuH65KXvJ51wYkihlsYLYtTJ qyuowSCEE+AjMVEtJTHfDRWO5UNgyeigkr2YP9QYN0rAYe9ofogTB/qADTPT5tofuIt1 CmmglSa/JG0hKSSpUfJr2MTlQQBzYBGH++LhwOjlFf3664PQCx1y9qxeLHgU2J2UfV+r MspQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756726744; x=1757331544; 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=1Vz2uLP5sgW+Jf4jqufs4uxX+PC38XDpQssaRr5A8bo=; b=aUJfh+KjAeJ2a8UR9HkTY3BpEjurudSudLa76/xsURZnDEAjpzI35ngXEELhJYauCD qHSgktsP2MO3lKsIajnekWScLpOXGz8ucdVqn2mGRuYf8pgBplguK88c8ywnsTzs0+M3 p/hHVEHMtlc+HNzv7c+0T0BRVWzo58ExOoogAXWU5rf33eHKuyFcNUfO0Daxa2h2BE0/ YEAllqCbRWiIZFFqwQOP8R84yMwfr5/5LVAJ24NHajOaFXOgmwNJAq5fAl48FRP2HMFS ruSje/3QiXczgNW4c73EsqdHAfSCgaiWlp7dQRKSmgym2ksBsnayxwIjBxinSjYPENfH scgw== X-Forwarded-Encrypted: i=1; AJvYcCWUQJfC74TvzH2tOrEpJa2+vfvLVRX7hTcLbcU5YcQdURHel92MwtUkHzmEuQLuh9fLFv5UPbwXbx1T6NE=@vger.kernel.org X-Gm-Message-State: AOJu0YxN4RoJJ2NPcruGRxY5E3zk42620QN90/VWRvO4674gcjHLaJij 4tZI0/wxoCKX9odBlKoGVXQFRR586CB21yT11Et1xykz5Jxu2QYvRIrWNiBAtXsIgZU= X-Gm-Gg: ASbGncuWk380Zqc+PLRisZm55ay6lOJWdzQytD25zEtWwwc850Gg27x6kxxxabILwaR NePR4Rd9bpM7c3cBd1ci2B4+3nmxCFxGTdcfqIf5hJfvvBL2rC+m91JQ28lnrfXEx20BhPmxBfT I3f2as+bz4vvR+nml0r8cKYSAY+ONCwucYNNs4CMWi3vsMrjLudYmuUYoVFsWkYxUmCV/wU2slB Fv0RQ+iZxjsWBcpA+TrwhWnUT9hdje+TEJixYkz10N9p0WtQxNjxFiM7vj3Uof2tHXj8pMklZdo rNIkXQF16bHkBcbD4/G2GB6Z697fziDiw9jXXX3oubnlaW077USpf+JIJ3WLplccdMS16ZCGJwX NUSHLsU15pKVA/HjpjHimSSzAlNM1Ipj9MRN85bm+g2OXVW2b X-Google-Smtp-Source: AGHT+IGQFwjKS/+f2kTv8gb0Vfi6+Uy1yW8hq0IOEoski1ECqODHSLpZo6NUdu7XjiYjQ3MeUxgWLQ== X-Received: by 2002:a05:600c:1389:b0:45b:47e1:ef71 with SMTP id 5b1f17b1804b1-45b85599151mr53173445e9.36.1756726743718; Mon, 01 Sep 2025 04:39:03 -0700 (PDT) Received: from localhost ([45.10.155.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7c461edasm96830885e9.9.2025.09.01.04.39.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 04:39:03 -0700 (PDT) From: Richard Gobert To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, leon@kernel.org, ecree.xilinx@gmail.com, dsahern@kernel.org, ncardwell@google.com, kuniyu@google.com, shuah@kernel.org, sdf@fomichev.me, aleksander.lobakin@intel.com, florian.fainelli@broadcom.com, willemdebruijn.kernel@gmail.com, alexander.duyck@gmail.com, linux-kernel@vger.kernel.org, linux-net-drivers@amd.com, Richard Gobert Subject: [PATCH net-next v4 3/5] net: gso: restore ids of outer ip headers correctly Date: Mon, 1 Sep 2025 13:38:24 +0200 Message-Id: <20250901113826.6508-4-richardbgobert@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250901113826.6508-1-richardbgobert@gmail.com> References: <20250901113826.6508-1-richardbgobert@gmail.com> 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 Content-Type: text/plain; charset="utf-8" Currently, NETIF_F_TSO_MANGLEID indicates that the inner-most ID can be mangled. Outer IDs can always be mangled. Make GSO preserve outer IDs by default, with NETIF_F_TSO_MANGLEID allowing both inner and outer IDs to be mangled. This commit also modifies a few drivers that use SKB_GSO_FIXEDID directly. Signed-off-by: Richard Gobert --- .../networking/segmentation-offloads.rst | 9 ++++----- drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | 8 ++++++-- drivers/net/ethernet/sfc/ef100_tx.c | 17 +++++++++++++---- include/linux/netdevice.h | 9 +++++++-- include/linux/skbuff.h | 6 +++++- net/core/dev.c | 4 +++- net/ipv4/af_inet.c | 13 ++++++------- net/ipv4/tcp_offload.c | 5 +---- 8 files changed, 45 insertions(+), 26 deletions(-) diff --git a/Documentation/networking/segmentation-offloads.rst b/Documenta= tion/networking/segmentation-offloads.rst index 085e8fab03fd..d5dccfc6b82b 100644 --- a/Documentation/networking/segmentation-offloads.rst +++ b/Documentation/networking/segmentation-offloads.rst @@ -46,7 +46,9 @@ GSO type SKB_GSO_TCP_FIXEDID is specified then we will no= t increment the IP ID and all segments will use the same IP ID. If a device has NETIF_F_TSO_MANGLEID set then the IP ID can be ignored when performing TSO and we will either increment the IP ID for all frames, or leave it at a -static value based on driver preference. +static value based on driver preference. For outer headers of encapsulated +packets, the device drivers must guarantee that the IPv4 ID field is +incremented in the case that a given header does not have the DF bit set. =20 =20 UDP Fragmentation Offload @@ -124,10 +126,7 @@ Generic Receive Offload Generic receive offload is the complement to GSO. Ideally any frame assembled by GRO should be segmented to create an identical sequence of frames using GSO, and any sequence of frames segmented by GSO should be -able to be reassembled back to the original by GRO. The only exception to -this is IPv4 ID in the case that the DF bit is set for a given IP header. -If the value of the IPv4 ID is not sequentially incrementing it will be -altered so that it is when a frame assembled via GRO is segmented via GSO. +able to be reassembled back to the original by GRO. =20 =20 Partial Generic Segmentation Offload diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/= ethernet/mellanox/mlx5/core/en_rx.c index b8c609d91d11..505c4ce7cef8 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c @@ -1289,8 +1289,12 @@ static void mlx5e_shampo_update_ipv4_tcp_hdr(struct = mlx5e_rq *rq, struct iphdr * tcp->check =3D ~tcp_v4_check(skb->len - tcp_off, ipv4->saddr, ipv4->daddr, 0); skb_shinfo(skb)->gso_type |=3D SKB_GSO_TCPV4; - if (ntohs(ipv4->id) =3D=3D rq->hw_gro_data->second_ip_id) - skb_shinfo(skb)->gso_type |=3D SKB_GSO_TCP_FIXEDID; + if (ntohs(ipv4->id) =3D=3D rq->hw_gro_data->second_ip_id) { + bool encap =3D rq->hw_gro_data->fk.control.flags & FLOW_DIS_ENCAPSULATIO= N; + + skb_shinfo(skb)->gso_type |=3D encap ? + SKB_GSO_TCP_FIXEDID_INNER : SKB_GSO_TCP_FIXEDID; + } =20 skb->csum_start =3D (unsigned char *)tcp - skb->head; skb->csum_offset =3D offsetof(struct tcphdr, check); diff --git a/drivers/net/ethernet/sfc/ef100_tx.c b/drivers/net/ethernet/sfc= /ef100_tx.c index e6b6be549581..24971346df00 100644 --- a/drivers/net/ethernet/sfc/ef100_tx.c +++ b/drivers/net/ethernet/sfc/ef100_tx.c @@ -190,6 +190,7 @@ static void ef100_make_tso_desc(struct efx_nic *efx, bool gso_partial =3D skb_shinfo(skb)->gso_type & SKB_GSO_PARTIAL; unsigned int len, ip_offset, tcp_offset, payload_segs; u32 mangleid =3D ESE_GZ_TX_DESC_IP4_ID_INC_MOD16; + u32 mangleid_outer =3D ESE_GZ_TX_DESC_IP4_ID_INC_MOD16; unsigned int outer_ip_offset, outer_l4_offset; u16 vlan_tci =3D skb_vlan_tag_get(skb); u32 mss =3D skb_shinfo(skb)->gso_size; @@ -200,8 +201,17 @@ static void ef100_make_tso_desc(struct efx_nic *efx, bool outer_csum; u32 paylen; =20 - if (skb_shinfo(skb)->gso_type & SKB_GSO_TCP_FIXEDID) - mangleid =3D ESE_GZ_TX_DESC_IP4_ID_NO_OP; + if (encap) { + if (skb_shinfo(skb)->gso_type & SKB_GSO_TCP_FIXEDID_INNER) + mangleid =3D ESE_GZ_TX_DESC_IP4_ID_NO_OP; + if (skb_shinfo(skb)->gso_type & SKB_GSO_TCP_FIXEDID) + mangleid_outer =3D ESE_GZ_TX_DESC_IP4_ID_NO_OP; + } else { + if (skb_shinfo(skb)->gso_type & SKB_GSO_TCP_FIXEDID) + mangleid =3D ESE_GZ_TX_DESC_IP4_ID_NO_OP; + mangleid_outer =3D ESE_GZ_TX_DESC_IP4_ID_NO_OP; + } + if (efx->net_dev->features & NETIF_F_HW_VLAN_CTAG_TX) vlan_enable =3D skb_vlan_tag_present(skb); =20 @@ -245,8 +255,7 @@ static void ef100_make_tso_desc(struct efx_nic *efx, ESF_GZ_TX_TSO_OUTER_L4_OFF_W, outer_l4_offset >> 1, ESF_GZ_TX_TSO_ED_OUTER_UDP_LEN, udp_encap && !gso_partial, ESF_GZ_TX_TSO_ED_OUTER_IP_LEN, encap && !gso_partial, - ESF_GZ_TX_TSO_ED_OUTER_IP4_ID, encap ? mangleid : - ESE_GZ_TX_DESC_IP4_ID_NO_OP, + ESF_GZ_TX_TSO_ED_OUTER_IP4_ID, mangleid_outer, ESF_GZ_TX_TSO_VLAN_INSERT_EN, vlan_enable, ESF_GZ_TX_TSO_VLAN_INSERT_TCI, vlan_tci ); diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index f3a3b761abfb..3d19c888b839 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -5290,13 +5290,18 @@ void skb_warn_bad_offload(const struct sk_buff *skb= ); =20 static inline bool net_gso_ok(netdev_features_t features, int gso_type) { - netdev_features_t feature =3D (netdev_features_t)gso_type << NETIF_F_GSO_= SHIFT; + netdev_features_t feature; + + if (gso_type & (SKB_GSO_TCP_FIXEDID | SKB_GSO_TCP_FIXEDID_INNER)) + gso_type |=3D __SKB_GSO_TCP_FIXEDID; + + feature =3D ((netdev_features_t)gso_type << NETIF_F_GSO_SHIFT) & NETIF_F_= GSO_MASK; =20 /* check flags correspondence */ BUILD_BUG_ON(SKB_GSO_TCPV4 !=3D (NETIF_F_TSO >> NETIF_F_GSO_SHIFT)); BUILD_BUG_ON(SKB_GSO_DODGY !=3D (NETIF_F_GSO_ROBUST >> NETIF_F_GSO_SHIF= T)); BUILD_BUG_ON(SKB_GSO_TCP_ECN !=3D (NETIF_F_TSO_ECN >> NETIF_F_GSO_SHIFT)); - BUILD_BUG_ON(SKB_GSO_TCP_FIXEDID !=3D (NETIF_F_TSO_MANGLEID >> NETIF_F_GS= O_SHIFT)); + BUILD_BUG_ON(__SKB_GSO_TCP_FIXEDID !=3D (NETIF_F_TSO_MANGLEID >> NETIF_F_= GSO_SHIFT)); BUILD_BUG_ON(SKB_GSO_TCPV6 !=3D (NETIF_F_TSO6 >> NETIF_F_GSO_SHIFT)); BUILD_BUG_ON(SKB_GSO_FCOE !=3D (NETIF_F_FSO >> NETIF_F_GSO_SHIFT)); BUILD_BUG_ON(SKB_GSO_GRE !=3D (NETIF_F_GSO_GRE >> NETIF_F_GSO_SHIFT)); diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index ca8be45dd8be..cf95b325f9b4 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -674,7 +674,7 @@ enum { /* This indicates the tcp segment has CWR set. */ SKB_GSO_TCP_ECN =3D 1 << 2, =20 - SKB_GSO_TCP_FIXEDID =3D 1 << 3, + __SKB_GSO_TCP_FIXEDID =3D 1 << 3, =20 SKB_GSO_TCPV6 =3D 1 << 4, =20 @@ -707,6 +707,10 @@ enum { SKB_GSO_FRAGLIST =3D 1 << 18, =20 SKB_GSO_TCP_ACCECN =3D 1 << 19, + + /* These don't correspond with netdev features. */ + SKB_GSO_TCP_FIXEDID =3D 1 << 30, + SKB_GSO_TCP_FIXEDID_INNER =3D 1 << 31, }; =20 #if BITS_PER_LONG > 32 diff --git a/net/core/dev.c b/net/core/dev.c index 93a25d87b86b..f57c8dbf307f 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3769,7 +3769,9 @@ static netdev_features_t gso_features_check(const str= uct sk_buff *skb, features &=3D ~dev->gso_partial_features; =20 /* Make sure to clear the IPv4 ID mangling feature if the - * IPv4 header has the potential to be fragmented. + * IPv4 header has the potential to be fragmented. For + * encapsulated packets, the outer headers are guaranteed to + * have incrementing IDs if DF is not set. */ if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4) { struct iphdr *iph =3D skb->encapsulation ? diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 76e38092cd8a..fc7a6955fa0a 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -1393,14 +1393,13 @@ struct sk_buff *inet_gso_segment(struct sk_buff *sk= b, =20 segs =3D ERR_PTR(-EPROTONOSUPPORT); =20 - if (!skb->encapsulation || encap) { - udpfrag =3D !!(skb_shinfo(skb)->gso_type & SKB_GSO_UDP); - fixedid =3D !!(skb_shinfo(skb)->gso_type & SKB_GSO_TCP_FIXEDID); + /* fixed ID is invalid if DF bit is not set */ + fixedid =3D !!(skb_shinfo(skb)->gso_type & (SKB_GSO_TCP_FIXEDID << encap)= ); + if (fixedid && !(ip_hdr(skb)->frag_off & htons(IP_DF))) + goto out; =20 - /* fixed ID is invalid if DF bit is not set */ - if (fixedid && !(ip_hdr(skb)->frag_off & htons(IP_DF))) - goto out; - } + if (!skb->encapsulation || encap) + udpfrag =3D !!(skb_shinfo(skb)->gso_type & SKB_GSO_UDP); =20 ops =3D rcu_dereference(inet_offloads[proto]); if (likely(ops && ops->callbacks.gso_segment)) { diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c index 1949eede9ec9..e6612bd84d09 100644 --- a/net/ipv4/tcp_offload.c +++ b/net/ipv4/tcp_offload.c @@ -471,7 +471,6 @@ INDIRECT_CALLABLE_SCOPE int tcp4_gro_complete(struct sk= _buff *skb, int thoff) const u16 offset =3D NAPI_GRO_CB(skb)->network_offsets[skb->encapsulation= ]; const struct iphdr *iph =3D (struct iphdr *)(skb->data + offset); struct tcphdr *th =3D tcp_hdr(skb); - bool is_fixedid; =20 if (unlikely(NAPI_GRO_CB(skb)->is_flist)) { skb_shinfo(skb)->gso_type |=3D SKB_GSO_FRAGLIST | SKB_GSO_TCPV4; @@ -485,10 +484,8 @@ INDIRECT_CALLABLE_SCOPE int tcp4_gro_complete(struct s= k_buff *skb, int thoff) th->check =3D ~tcp_v4_check(skb->len - thoff, iph->saddr, iph->daddr, 0); =20 - is_fixedid =3D (NAPI_GRO_CB(skb)->ip_fixedid >> skb->encapsulation) & 1; - skb_shinfo(skb)->gso_type |=3D SKB_GSO_TCPV4 | - (is_fixedid * SKB_GSO_TCP_FIXEDID); + (NAPI_GRO_CB(skb)->ip_fixedid * SKB_GSO_TCP_FIXEDID); =20 tcp_gro_complete(skb); return 0; --=20 2.36.1 From nobody Sun Dec 14 06:20:55 2025 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 563733218DC; Mon, 1 Sep 2025 11:39:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756726754; cv=none; b=WV+FR6t3PWS2mHac1h4N2pX4aYyyI9VxPPGgygO5M+zJ6DX+6MSjJQwyRnAcFw9FU6Fol33f9jAXJT1ORHeBxM9G064DMmcs4l8DOsY5rlMIZMPj0nQZ8Lsi5c17X2dIjwEguLFxkZdefhs0qmmXhhn58vVGRkSNBEm0b0kWBmQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756726754; c=relaxed/simple; bh=Fg70UMDI0A/Ha4v15Rxc5kAR7mQw/d6wmMqZHv7HOes=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ZSt3ZiZI7V6c7TAsBdAW/EPSBVTuKWYpQhrC3MAVr8pF1cfIIFW2XbsvWW1QcsaihaILScBwAi2bwp0KDI0dAeJ1NRSeUP6zmcren63EZUQkdvkzW5sOD5IkBQSEFI8B/ioRuoYkC+xCsjDWFmjeYPNvi/PTGEWLi/Y7d1XfXBg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=QAyZxc2u; arc=none smtp.client-ip=209.85.128.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="QAyZxc2u" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-45b8b25296fso7966145e9.2; Mon, 01 Sep 2025 04:39:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756726750; x=1757331550; darn=vger.kernel.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=3AkeP/a1LY5B+ki1hcSlOOd//K3g6cXkwwIDhvsso44=; b=QAyZxc2upUNodC8VLefkowRMNYK2XV9JgR0HEKYV1hNHGFsa43nwU4nomr5r+l45WO PZgt+bSeHBN3+dlchVXm9KRS58/v2LXsN1BPQ1JnXdsdPHwIXq5Umr5IbkUlL6tKLXxm EjfbsGIXJbyPty01Tke9ttWmYOtf42++0WHFB7d8lmZPCWwjQUjRmbRsKDvHAmOsZi5S UZISPxaMLZwbN5DQK9utL1n6RhmL7DAdZqmwdJnxtqdBXUm846T0JwfhCLOpnD1xefIf 9wZE5GFDkKxyG/4Y17BUy7KLZYTyrCmkOp/pRnXMWdv+cWbcbNpBlseGG/U6PfwG2bw+ HnMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756726750; x=1757331550; 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=3AkeP/a1LY5B+ki1hcSlOOd//K3g6cXkwwIDhvsso44=; b=tU37gS+5D13rVKva6ADTTqHgFGRVgZG3AzaM2enb1jawox684kIxE9rgMEX9oHHpOa yz0Ra7g2hxKkKFbk4T7DulSf3RROD+77nzMDGWBv5nF1FTRQzcGAYX0D0nP96x7Mcq1l SDeCfxKitZm8tTQEvtVQd1Pze2n6sWIeUsEl+SyEn9QvplUgsUrfBGWJv2N7/zGcOb3W woLL+qgePo2GQxmSFwlihKzRy3DsISZWZdu4CEW9+qTRpEr+FpkCTEkPlp4VlqQrQan4 Z4KkeRwwObz/oe3TcXW/ci536TVdnRzJc314a+QkM/6NEkjXK7M0THD+XZiOvpB+9tzq L/GQ== X-Forwarded-Encrypted: i=1; AJvYcCVDrjkLlYOCICnnVpKSE9CYhZmb+gthrNjnwc/k+sKOyWmvdGw8S9IHhBcAfh0dQAIo5wCCBIdfeeOlzxI=@vger.kernel.org X-Gm-Message-State: AOJu0YyKj8/bNv+XVcSf/7QhU2E5dYoYipPO7D2xoxLdwGuVh3V+8Vk6 /MrjeQM5scPzumqpL/eX5V1ktpRVP6/qupcxhxGtsyFjc6C5ftSQGprr/MOBw+3Ew/g= X-Gm-Gg: ASbGncsJ/yXRUMlIo0GKgIBCP15POVaX2VumTl0GOYj+hhU2ZB3mvhOTcXOnYGXtI6I M3HrA0jHqNe4QRPW3U3+LMxhXBMOyn+2OuHarMNZ2xULMuWMlYyGSQ7az/WuvZjHS+a2XvpAHR+ 0BHIgFK5Ttfd5skxBck5IGl3e02B9OZir02LVEMV/zzPGncaDsEnMY2pPjL2NSc7XWpU3K59gbk kVlx/r8gio5lFviFLM9zz51Tdfd//PZ14o/ph64TyOtA5D4jqEuCK2UJSunn0JqkFPPABS4dvLm eSuVmPjDv5pYqqOgSIEqucAs14+Vh/+0SfS7lHgRuVy4q+leDe1yREvGLzvMTnYZ4ltg3r5sPhq h3H5TdhmvgwTSrUfMFuUf3ulR44Ql6FG8RaMLHIP0sKfnkAx+ X-Google-Smtp-Source: AGHT+IFE8sE+12+BNRGOI9HmHzVnPVmTuEDICSBYnOdb2XNXHV5J2h3HrPsv7ZJevV5VPhBuHDiWMA== X-Received: by 2002:a05:600c:46c6:b0:45b:84b1:b409 with SMTP id 5b1f17b1804b1-45b855ad0b0mr78570585e9.30.1756726750221; Mon, 01 Sep 2025 04:39:10 -0700 (PDT) Received: from localhost ([45.10.155.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7e7d23b7sm152888205e9.1.2025.09.01.04.39.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 04:39:10 -0700 (PDT) From: Richard Gobert To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, leon@kernel.org, ecree.xilinx@gmail.com, dsahern@kernel.org, ncardwell@google.com, kuniyu@google.com, shuah@kernel.org, sdf@fomichev.me, aleksander.lobakin@intel.com, florian.fainelli@broadcom.com, willemdebruijn.kernel@gmail.com, alexander.duyck@gmail.com, linux-kernel@vger.kernel.org, linux-net-drivers@amd.com, Richard Gobert Subject: [PATCH net-next v4 4/5] net: gro: remove unnecessary df checks Date: Mon, 1 Sep 2025 13:38:25 +0200 Message-Id: <20250901113826.6508-5-richardbgobert@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250901113826.6508-1-richardbgobert@gmail.com> References: <20250901113826.6508-1-richardbgobert@gmail.com> 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 Content-Type: text/plain; charset="utf-8" Currently, packets with fixed IDs will be merged only if their don't-fragment bit is set. Merged packets are re-split into segments before being fragmented, so the result is the same as if the packets weren't merged to begin with. Remove unnecessary don't-fragment checks. Signed-off-by: Richard Gobert --- include/net/gro.h | 5 ++--- net/ipv4/af_inet.c | 3 --- tools/testing/selftests/net/gro.c | 9 ++++----- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/include/net/gro.h b/include/net/gro.h index 322c5517f508..691f267b3969 100644 --- a/include/net/gro.h +++ b/include/net/gro.h @@ -448,17 +448,16 @@ static inline int inet_gro_flush(const struct iphdr *= iph, const struct iphdr *ip const u32 id2 =3D ntohl(*(__be32 *)&iph2->id); const u16 ipid_offset =3D (id >> 16) - (id2 >> 16); const u16 count =3D NAPI_GRO_CB(p)->count; - const u32 df =3D id & IP_DF; =20 /* All fields must match except length and checksum. */ - if ((iph->ttl ^ iph2->ttl) | (iph->tos ^ iph2->tos) | (df ^ (id2 & IP_DF)= )) + if ((iph->ttl ^ iph2->ttl) | (iph->tos ^ iph2->tos) | ((id ^ id2) & IP_DF= )) return true; =20 /* When we receive our second frame we can make a decision on if we * continue this flow as an atomic flow with a fixed ID or if we use * an incrementing ID. */ - if (count =3D=3D 1 && df && !ipid_offset) + if (count =3D=3D 1 && !ipid_offset) NAPI_GRO_CB(p)->ip_fixedid |=3D 1 << inner; =20 return ipid_offset ^ (count * !(NAPI_GRO_CB(p)->ip_fixedid & (1 << inner)= )); diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index fc7a6955fa0a..c0542d9187e2 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -1393,10 +1393,7 @@ struct sk_buff *inet_gso_segment(struct sk_buff *skb, =20 segs =3D ERR_PTR(-EPROTONOSUPPORT); =20 - /* fixed ID is invalid if DF bit is not set */ fixedid =3D !!(skb_shinfo(skb)->gso_type & (SKB_GSO_TCP_FIXEDID << encap)= ); - if (fixedid && !(ip_hdr(skb)->frag_off & htons(IP_DF))) - goto out; =20 if (!skb->encapsulation || encap) udpfrag =3D !!(skb_shinfo(skb)->gso_type & SKB_GSO_UDP); diff --git a/tools/testing/selftests/net/gro.c b/tools/testing/selftests/ne= t/gro.c index d5824eadea10..3d4a82a2607c 100644 --- a/tools/testing/selftests/net/gro.c +++ b/tools/testing/selftests/net/gro.c @@ -670,7 +670,7 @@ static void send_flush_id_case(int fd, struct sockaddr_= ll *daddr, int tcase) iph2->id =3D htons(9); break; =20 - case 3: /* DF=3D0, Fixed - should not coalesce */ + case 3: /* DF=3D0, Fixed - should coalesce */ iph1->frag_off &=3D ~htons(IP_DF); iph1->id =3D htons(8); =20 @@ -1188,10 +1188,9 @@ static void gro_receiver(void) correct_payload[0] =3D PAYLOAD_LEN * 2; check_recv_pkts(rxfd, correct_payload, 1); =20 - printf("DF=3D0, Fixed - should not coalesce: "); - correct_payload[0] =3D PAYLOAD_LEN; - correct_payload[1] =3D PAYLOAD_LEN; - check_recv_pkts(rxfd, correct_payload, 2); + printf("DF=3D0, Fixed - should coalesce: "); + correct_payload[0] =3D PAYLOAD_LEN * 2; + check_recv_pkts(rxfd, correct_payload, 1); =20 printf("DF=3D1, 2 Incrementing and one fixed - should coalesce only fir= st 2 packets: "); correct_payload[0] =3D PAYLOAD_LEN * 2; --=20 2.36.1 From nobody Sun Dec 14 06:20:55 2025 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4520E3218DC; Mon, 1 Sep 2025 11:39:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756726760; cv=none; b=qtJ1SIzeNWTEGKNPYcKl+KZBD1ovOAZTmTlm/TUPNcJVUr5r66VcAFKwnGC9IBzj/kYNmMl/3TnEs1oIqplzwMAMikUXhY89Hxl5kr5104P3pHKtZzEt3aJJ0Lh8MMF3zkW7+l96dD03yW0uiXVW4JDLm+fKXPnEvJeT+Uj/+3s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756726760; c=relaxed/simple; bh=Bmup3zTtr8ZOHU7szSWCp6L/22E8IeBocLNjAmRD/tg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=A0PxSbs32LbJf87lJzzIiaiQB24bpGnK+/k7F4+NpJMvI5C0P2Zi1Rcr+kzMkUaLug1bZDQ9yq1+gdStWVxMBpY+IvX8TTlYsSA3QdGhCmCxYl3vJKPJ1ZaTYtO3wkosgUB5OhbmuXt1WL+Nce/cSbDRVAUNRlsUxXXQpsYOsms= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=fFmtM/NK; arc=none smtp.client-ip=209.85.128.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="fFmtM/NK" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-45a1b065d59so28786055e9.1; Mon, 01 Sep 2025 04:39:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756726757; x=1757331557; darn=vger.kernel.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=j3AY6EOb7TA3Vk/44dz1/Kzv3q8Ug/SBekAw+P0yOWU=; b=fFmtM/NK4EtOzl/Ur1OoeGS4VKPQLi9QpR4WO63UrZv4XQt/IVAibyIYJbCVEizz7D s+tGGqZExQanj4aADn2vp7cJnUzOF+RjXCUUpTbF6roPiNDdbAIpFQQkeJvwjkiCbN3e /AJ3GyweKdmNc4Pna8jBpApqbfX0qu9zXvomLLzEYpCNt8JPgSTkP3hh5czGIy/G8IgD aYU0VMzaePjfuHLqsElm1F9DpbfnqrzAXVuZUjc59lxrKHUNWGR2Iv2ZUoya/4FSUFSo gXDrvuWyJI1Ya87lm2F7faB6z21lrpD8qsYQmhakAOfisFXnRhFBhJNrGEPlVxBSJXoa jWcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756726757; x=1757331557; 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=j3AY6EOb7TA3Vk/44dz1/Kzv3q8Ug/SBekAw+P0yOWU=; b=UK3+vV2jFPgYJjYltrgieeI6C9KSDlEz8Pl2Jy4F/vexbkWpAxRfKXCcNi6oISxE41 Z44ly1D5njMjJ0ADznlDz2jdvIxEW7jyMT2fxOwSAseHkW7Vui4f+Rt7PUDzB7H2rCIj R3LKYcS0OAX54o9XyxenNJZzExj9w7NSvri0vuYyM/9dPUPRKvqfQFdWZvQ6aROtKPQv om4dIhEgKfP5xDKS0T3SZaHmzxgBFhMrkzkeYw+BiuYZmkZOtsZKLtW8mxBxFSS/PdtG SA3ImhHSLWepS197uC+y2zUNlcZhSSw/Zjmtj7xhfeay5jaEPfWEtNY2Sp6aqEjli0+a qbaQ== X-Forwarded-Encrypted: i=1; AJvYcCWhY15AP235b2nVcFIpXP4p6uY0ppp8J5dhGbNnQMXRyVeMu2hen1KaD7oRw8M+G3brCcO3XtMCoYHuMp8=@vger.kernel.org X-Gm-Message-State: AOJu0YxlL34tC58pXibvOI5s1kPBvxcgX8LX4kLGMhLcPjezWwASx5X7 eW+yVKRGIFFMJtgNl8Niomm4tE4puoa6ePwRWTRYokgovyITxCPCHIsp5ub8oW4sxlo= X-Gm-Gg: ASbGncuuXPMEK4YtKAscMuAEY2ixhmdzIQKVLYVGRldseyruJgN4VIcih7mEd11nCrB 1EJFNfIdZxPTDxAx0rF+uyp1+jSwtb1XJwZB1OLUpO84uFbKuP0J10KCb6D5WX1KBf8QizoI814 GJ1A/Qn9aiRDcnqyyvSWBgmvhZHQPEcorzvDPb2+p5Q2r+GLWyObZA49jtK2WJFR5a9DHFar5kJ yDvOFGFMVpTfTknPGea7GBQ4tyOeg6AWP1x193SpixLIuY6dJh2eOIy8OrSheQTGqPXJsKvVTwE 185oKVVGC94jQ3asQuo5wZKwmoLJdlIIYbcTDK6OeZE6WmElM3sbxznhT1xVw2r8pfyzmzfPtzf dTDPBPjbmTpFlgZt0ALU2JtCC+apckjiNA86LJQ== X-Google-Smtp-Source: AGHT+IFNFy8OfnP+aTXE7Dm63eF75/jXRPRAPzdJrWiA7gGNQ+veQvq+fFuoOhMZVe0TzguZi9H7EA== X-Received: by 2002:a05:600c:8b22:b0:45b:4a98:91cf with SMTP id 5b1f17b1804b1-45b8554fa14mr74094365e9.15.1756726756493; Mon, 01 Sep 2025 04:39:16 -0700 (PDT) Received: from localhost ([45.10.155.17]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45b7e7d1319sm163021765e9.5.2025.09.01.04.39.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Sep 2025 04:39:16 -0700 (PDT) From: Richard Gobert To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, leon@kernel.org, ecree.xilinx@gmail.com, dsahern@kernel.org, ncardwell@google.com, kuniyu@google.com, shuah@kernel.org, sdf@fomichev.me, aleksander.lobakin@intel.com, florian.fainelli@broadcom.com, willemdebruijn.kernel@gmail.com, alexander.duyck@gmail.com, linux-kernel@vger.kernel.org, linux-net-drivers@amd.com, Richard Gobert Subject: [PATCH net-next v4 5/5] selftests/net: test ipip packets in gro.sh Date: Mon, 1 Sep 2025 13:38:26 +0200 Message-Id: <20250901113826.6508-6-richardbgobert@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250901113826.6508-1-richardbgobert@gmail.com> References: <20250901113826.6508-1-richardbgobert@gmail.com> 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 Content-Type: text/plain; charset="utf-8" Add IPIP test-cases to the GRO selftest. This selftest already contains IP ID test-cases. They are now also tested for encapsulated packets. This commit also fixes ipip packet generation in the test. Signed-off-by: Richard Gobert --- tools/testing/selftests/net/gro.c | 49 ++++++++++++++++++++++++------ tools/testing/selftests/net/gro.sh | 5 +-- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/tools/testing/selftests/net/gro.c b/tools/testing/selftests/ne= t/gro.c index 3d4a82a2607c..451dc1c1eac5 100644 --- a/tools/testing/selftests/net/gro.c +++ b/tools/testing/selftests/net/gro.c @@ -93,6 +93,7 @@ static bool tx_socket =3D true; static int tcp_offset =3D -1; static int total_hdr_len =3D -1; static int ethhdr_proto =3D -1; +static bool ipip; static const int num_flush_id_cases =3D 6; =20 static void vlog(const char *fmt, ...) @@ -114,7 +115,9 @@ static void setup_sock_filter(int fd) int ipproto_off, opt_ipproto_off; int next_off; =20 - if (proto =3D=3D PF_INET) + if (ipip) + next_off =3D sizeof(struct iphdr) + offsetof(struct iphdr, protocol); + else if (proto =3D=3D PF_INET) next_off =3D offsetof(struct iphdr, protocol); else next_off =3D offsetof(struct ipv6hdr, nexthdr); @@ -244,7 +247,7 @@ static void fill_datalinklayer(void *buf) eth->h_proto =3D ethhdr_proto; } =20 -static void fill_networklayer(void *buf, int payload_len) +static void fill_networklayer(void *buf, int payload_len, int protocol) { struct ipv6hdr *ip6h =3D buf; struct iphdr *iph =3D buf; @@ -254,7 +257,7 @@ static void fill_networklayer(void *buf, int payload_le= n) =20 ip6h->version =3D 6; ip6h->payload_len =3D htons(sizeof(struct tcphdr) + payload_len); - ip6h->nexthdr =3D IPPROTO_TCP; + ip6h->nexthdr =3D protocol; ip6h->hop_limit =3D 8; if (inet_pton(AF_INET6, addr6_src, &ip6h->saddr) !=3D 1) error(1, errno, "inet_pton source ip6"); @@ -266,7 +269,7 @@ static void fill_networklayer(void *buf, int payload_le= n) iph->version =3D 4; iph->ihl =3D 5; iph->ttl =3D 8; - iph->protocol =3D IPPROTO_TCP; + iph->protocol =3D protocol; iph->tot_len =3D htons(sizeof(struct tcphdr) + payload_len + sizeof(struct iphdr)); iph->frag_off =3D htons(0x4000); /* DF =3D 1, MF =3D 0 */ @@ -313,9 +316,19 @@ static void create_packet(void *buf, int seq_offset, i= nt ack_offset, { memset(buf, 0, total_hdr_len); memset(buf + total_hdr_len, 'a', payload_len); + fill_transportlayer(buf + tcp_offset, seq_offset, ack_offset, payload_len, fin); - fill_networklayer(buf + ETH_HLEN, payload_len); + + if (ipip) { + fill_networklayer(buf + ETH_HLEN + sizeof(struct iphdr), + payload_len, IPPROTO_TCP); + fill_networklayer(buf + ETH_HLEN, payload_len + sizeof(struct iphdr), + IPPROTO_IPIP); + } else { + fill_networklayer(buf + ETH_HLEN, payload_len, IPPROTO_TCP); + } + fill_datalinklayer(buf); } =20 @@ -416,6 +429,13 @@ static void recompute_packet(char *buf, char *no_ext, = int extlen) iph->tot_len =3D htons(ntohs(iph->tot_len) + extlen); iph->check =3D 0; iph->check =3D checksum_fold(iph, sizeof(struct iphdr), 0); + + if (ipip) { + iph +=3D 1; + iph->tot_len =3D htons(ntohs(iph->tot_len) + extlen); + iph->check =3D 0; + iph->check =3D checksum_fold(iph, sizeof(struct iphdr), 0); + } } else { ip6h->payload_len =3D htons(ntohs(ip6h->payload_len) + extlen); } @@ -777,7 +797,7 @@ static void send_fragment4(int fd, struct sockaddr_ll *= daddr) */ memset(buf + total_hdr_len, 'a', PAYLOAD_LEN * 2); fill_transportlayer(buf + tcp_offset, PAYLOAD_LEN, 0, PAYLOAD_LEN * 2, 0); - fill_networklayer(buf + ETH_HLEN, PAYLOAD_LEN); + fill_networklayer(buf + ETH_HLEN, PAYLOAD_LEN, IPPROTO_TCP); fill_datalinklayer(buf); =20 iph->frag_off =3D htons(0x6000); // DF =3D 1, MF =3D 1 @@ -1071,7 +1091,7 @@ static void gro_sender(void) * and min ipv6hdr size. Like MAX_HDR_SIZE, * MAX_PAYLOAD is defined with the larger header of the two. */ - int offset =3D proto =3D=3D PF_INET ? 20 : 0; + int offset =3D (proto =3D=3D PF_INET && !ipip) ? 20 : 0; int remainder =3D (MAX_PAYLOAD + offset) % MSS; =20 send_large(txfd, &daddr, remainder); @@ -1221,7 +1241,7 @@ static void gro_receiver(void) check_recv_pkts(rxfd, correct_payload, 2); } } else if (strcmp(testname, "large") =3D=3D 0) { - int offset =3D proto =3D=3D PF_INET ? 20 : 0; + int offset =3D (proto =3D=3D PF_INET && !ipip) ? 20 : 0; int remainder =3D (MAX_PAYLOAD + offset) % MSS; =20 correct_payload[0] =3D (MAX_PAYLOAD + offset); @@ -1250,6 +1270,7 @@ static void parse_args(int argc, char **argv) { "iface", required_argument, NULL, 'i' }, { "ipv4", no_argument, NULL, '4' }, { "ipv6", no_argument, NULL, '6' }, + { "ipip", no_argument, NULL, 'e' }, { "rx", no_argument, NULL, 'r' }, { "saddr", required_argument, NULL, 's' }, { "smac", required_argument, NULL, 'S' }, @@ -1259,7 +1280,7 @@ static void parse_args(int argc, char **argv) }; int c; =20 - while ((c =3D getopt_long(argc, argv, "46d:D:i:rs:S:t:v", opts, NULL)) != =3D -1) { + while ((c =3D getopt_long(argc, argv, "46d:D:ei:rs:S:t:v", opts, NULL)) != =3D -1) { switch (c) { case '4': proto =3D PF_INET; @@ -1269,6 +1290,11 @@ static void parse_args(int argc, char **argv) proto =3D PF_INET6; ethhdr_proto =3D htons(ETH_P_IPV6); break; + case 'e': + ipip =3D true; + proto =3D PF_INET; + ethhdr_proto =3D htons(ETH_P_IP); + break; case 'd': addr4_dst =3D addr6_dst =3D optarg; break; @@ -1304,7 +1330,10 @@ int main(int argc, char **argv) { parse_args(argc, argv); =20 - if (proto =3D=3D PF_INET) { + if (ipip) { + tcp_offset =3D ETH_HLEN + sizeof(struct iphdr) * 2; + total_hdr_len =3D tcp_offset + sizeof(struct tcphdr); + } else if (proto =3D=3D PF_INET) { tcp_offset =3D ETH_HLEN + sizeof(struct iphdr); total_hdr_len =3D tcp_offset + sizeof(struct tcphdr); } else if (proto =3D=3D PF_INET6) { diff --git a/tools/testing/selftests/net/gro.sh b/tools/testing/selftests/n= et/gro.sh index 9e3f186bc2a1..d16ec365b3cf 100755 --- a/tools/testing/selftests/net/gro.sh +++ b/tools/testing/selftests/net/gro.sh @@ -4,7 +4,7 @@ readonly SERVER_MAC=3D"aa:00:00:00:00:02" readonly CLIENT_MAC=3D"aa:00:00:00:00:01" readonly TESTS=3D("data" "ack" "flags" "tcp" "ip" "large") -readonly PROTOS=3D("ipv4" "ipv6") +readonly PROTOS=3D("ipv4" "ipv6" "ipip") dev=3D"" test=3D"all" proto=3D"ipv4" @@ -31,7 +31,8 @@ run_test() { 1>>log.txt wait "${server_pid}" exit_code=3D$? - if [[ ${test} =3D=3D "large" && -n "${KSFT_MACHINE_SLOW}" && \ + if [[ ( ${test} =3D=3D "large" || ${protocol} =3D=3D "ipip" ) && \ + -n "${KSFT_MACHINE_SLOW}" && \ ${exit_code} -ne 0 ]]; then echo "Ignoring errors due to slow environment" 1>&2 exit_code=3D0 --=20 2.36.1