From: Julius Bairaktaris <julius@bairaktaris.de>
To: netdev@vger.kernel.org
Cc: davem@davemloft.net, edumazet@kernel.org, kuba@kernel.org,
pabeni@redhat.com, horms@kernel.org, andrew+netdev@lunn.ch,
dsahern@kernel.org, idosch@nvidia.com, ncardwell@google.com,
kuniyu@google.com, richardbgobert@gmail.com, willemb@google.com,
ecree.xilinx@gmail.com, linux-net-drivers@amd.com,
saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com,
leon@kernel.org, linux-rdma@vger.kernel.org,
alexei.starovoitov@gmail.com, ast@kernel.org,
daniel@iogearbox.net, john.fastabend@gmail.com, sdf@fomichev.me,
martin.lau@linux.dev, andrii@kernel.org, eddyz87@gmail.com,
memxor@gmail.com, song@kernel.org, yonghong.song@linux.dev,
jolsa@kernel.org, emil@etsalapatis.com, ihor.solodrai@linux.dev,
corbet@lwn.net, rdunlap@infradead.org, skhan@linuxfoundation.org,
shuah@kernel.org, bpf@vger.kernel.org, linux-doc@vger.kernel.org,
linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH net v2 0/2] net: keep the TCP fixed-ID flags on the header they describe
Date: Sat, 14 Nov 2026 19:27:43 +0100 [thread overview]
Message-ID: <cover.1794139176.git.julius@bairaktaris.de> (raw)
GRO sets SKB_GSO_TCP_FIXEDID for a TCP packet whose IPv4 IDs do not
change. Since commit 3271f19bf7b9 ("net: gso: restore ids of outer ip
headers correctly") the flag describes the outermost header and
SKB_GSO_TCP_FIXEDID_INNER the inner one, so every path that adds or
removes a header would have to move the flags. None does, and a TCP
stream that GRO merged and that crosses a tunnel boundary is segmented
with the fixed-ID state of the wrong header.
Patch 1 lets SKB_GSO_TCP_FIXEDID describe the innermost header again and
replaces the inner flag with SKB_GSO_TCP_FIXEDID_OUTER, as Alexei
suggested in review of v1. Patch 2 adds a selftest.
Tested in QEMU (KVM, KASAN and lockdep) with the selftest, 18 cases,
400 segments each:
- net (30c71476d842), 2 of 2 runs: 6 cases fail. Fixed inner IDs
increment after IPIP over IPv4 and IPv6 and after the ESP tunnel (390
of 400 segments carry an inner ID the sender did not use), the outer
IDs repeat after GRE and VXLAN over IPv4 (10 distinct outer IDs for 400
segments), and a VXLAN stream with fixed outer IDs keeps that state
after decapsulation into IPIP (10 distinct outer IDs).
- this series, 2 of 2 runs: 18 of 18 pass, no KASAN or lockdep report.
With a tunnel inside a tunnel, such as GRE traffic that GRO merged and
that is routed into an IPIP tunnel without decapsulation, two flags still
describe three IPv4 headers: the new outermost header takes
SKB_GSO_TCP_FIXEDID_OUTER of the header below it, as it takes
SKB_GSO_TCP_FIXEDID on net. This series does not change that case; it
gets a separate fix.
Changes in v2:
- Keep SKB_GSO_TCP_FIXEDID on the innermost header and describe the
outer header with SKB_GSO_TCP_FIXEDID_OUTER instead of moving the
flag on encapsulation and decapsulation (Alexei). Encapsulation then
needs no change, which also covers ESP tunnel mode with crypto
offload, missed in v1 (Alexei, Sashiko), the Geneve GRO hint path,
which sets skb->encapsulation again after iptunnel_pull_offloads()
(Sashiko), and BPF encapsulation followed by an L3-only decapsulation
(Sashiko). FOU, which pulls the offloads twice, clears the outer flag
twice.
- Keep the encap_level reset in gre_gso_segment() and
__skb_udp_tunnel_segment(): v1 undid commit 5197f3499c47 ("net: Reset
encap_level to avoid resetting features on inner IP headers"), which
with remote checksum offload masks NETIF_F_HW_CSUM out of the inner
features on devices without it in hw_enc_features (Alexei, Sashiko).
- Drop the segment routing changes: the outer header there is IPv6
(Alexei). This also drops the read of hdr->nexthdr after
iptunnel_pull_offloads() in ipv6_srh_rcv() that Sashiko reported as a
use-after-free; ipv6_srh_rcv() is unchanged.
- Convert mlx5 and sfc to the outer flag (Alexei).
- Selftest: add an ESP tunnel mode case offloaded to netdevsim; check
the inner ID values, not only how many distinct IDs arrive; skip the
decap cases when the IPIP device cannot be created; fail a case whose
receiver reports no result; keep IPv6 link-local traffic off the
tunnels, whose tx_packets decide the GRO skip; remove the temporary
file on exit; sort the Makefile entry; wrap lines at 80 columns
(Sashiko, NIPA).
- v1: https://lore.kernel.org/netdev/cover.1792857378.git.julius@bairaktaris.de/
I used Claude (Anthropic) to help write these patches.
Julius Bairaktaris (2):
net: keep the TCP fixed-ID flags on the header they describe
selftests: net: check TCP IP IDs across tunnels after GRO and GSO
.../networking/segmentation-offloads.rst | 4 +-
.../net/ethernet/mellanox/mlx5/core/en_rx.c | 8 +-
drivers/net/ethernet/sfc/ef100_tx.c | 12 +-
include/linux/netdevice.h | 2 +-
include/linux/skbuff.h | 4 +-
include/net/ip_tunnels.h | 1 +
net/core/filter.c | 1 +
net/ipv4/af_inet.c | 8 +-
net/ipv4/tcp_offload.c | 6 +-
tools/testing/selftests/net/.gitignore | 1 +
tools/testing/selftests/net/Makefile | 2 +
tools/testing/selftests/net/tcp_fixedid.c | 411 ++++++++++++++++++
tools/testing/selftests/net/tcp_fixedid.sh | 400 +++++++++++++++++
13 files changed, 836 insertions(+), 24 deletions(-)
create mode 100644 tools/testing/selftests/net/tcp_fixedid.c
create mode 100755 tools/testing/selftests/net/tcp_fixedid.sh
base-commit: 30c71476d842b094651bd7712f6c8ee8716147d0
--
2.53.0
next reply other threads:[~2026-11-14 18:27 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-14 18:27 Julius Bairaktaris [this message]
2026-11-14 18:27 ` [PATCH net v2 1/2] " Julius Bairaktaris
2026-11-14 18:27 ` [PATCH net v2 2/2] selftests: net: check TCP IP IDs across tunnels after GRO and GSO Julius Bairaktaris
2026-11-14 18:33 ` [PATCH net v2 0/2] net: keep the TCP fixed-ID flags on the header they describe netdev-bot+sinfo
2026-11-14 18:40 ` Alexei Starovoitov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cover.1794139176.git.julius@bairaktaris.de \
--to=julius@bairaktaris.de \
--cc=alexei.starovoitov@gmail.com \
--cc=andrew+netdev@lunn.ch \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=corbet@lwn.net \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=dsahern@kernel.org \
--cc=ecree.xilinx@gmail.com \
--cc=eddyz87@gmail.com \
--cc=edumazet@kernel.org \
--cc=emil@etsalapatis.com \
--cc=horms@kernel.org \
--cc=idosch@nvidia.com \
--cc=ihor.solodrai@linux.dev \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=kuba@kernel.org \
--cc=kuniyu@google.com \
--cc=leon@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-net-drivers@amd.com \
--cc=linux-rdma@vger.kernel.org \
--cc=martin.lau@linux.dev \
--cc=mbloch@nvidia.com \
--cc=memxor@gmail.com \
--cc=ncardwell@google.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=rdunlap@infradead.org \
--cc=richardbgobert@gmail.com \
--cc=saeedm@nvidia.com \
--cc=sdf@fomichev.me \
--cc=shuah@kernel.org \
--cc=skhan@linuxfoundation.org \
--cc=song@kernel.org \
--cc=tariqt@nvidia.com \
--cc=willemb@google.com \
--cc=yonghong.song@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®