Two GRO fixes for paths using remote checksum offload (VXLAN, GUE)
and for NAPI_GRO_CB(skb)->frag0 after a pull.
Patch 1 skips skb_gro_remcsum_cleanup() once the skb was merged,
as grc->offset can no longer be trusted, except for fraglist members,
whose inner checksum is restored.
Patch 2 invalidates frag0 before a pull, which commit bd56a29c7a4e
("net: gro: change skb_gro_network_header()") stopped doing.
v3:
- Patch 1: restore the inner checksum of fraglist members instead of
keeping the adjusted value, which was wrong for forwarded packets
and for GUE. Only restore it when it is part of the headers
pulled by skb_gro_receive_list(), as start and offset come from the
packet. Mention FOU_F_REMCSUM_NOPARTIAL (Sashiko).
- Patch 2: only use frag0 in gro_try_pull_from_frag0() while frag0_len
is not zero, to not corrupt headers after a failed pull (Sashiko).
- Explain how the issues were found (netdev bot).
v2: https://lore.kernel.org/netdev/20261030125955.3107383-1-edumazet@kernel.org/ (local)
- Patch 1: reword the comment and changelog: skb->data is not always
moved (frag/head steal).
- Patch 2: invalidate frag0 before the pull, as __pskb_pull_tail()
can fail after pskb_expand_head() freed the old head (Sashiko).
- Patch 2: add a Fixes: tag for UDP fraglist GRO, which pulls
directly since before bd56a29c7a4e (Sashiko).
- CC Tom Herbert and stable.
v1: https://lore.kernel.org/netdev/20261028141325.2103814-1-edumazet@kernel.org/ (local)
Eric Dumazet (2):
net: gro: do not undo remote checksum offload on merged packets
net: gro: invalidate frag0 after a pull
include/net/gro.h | 27 +++++++++++++++++++++++++++
net/core/gro.c | 9 ++++++++-
net/ipv4/esp4_offload.c | 1 +
net/ipv4/udp_offload.c | 1 +
net/ipv6/esp6_offload.c | 1 +
5 files changed, 38 insertions(+), 1 deletion(-)
--
2.53.0