kernel: fix fraglist GRO on linux 6.12
Merged segments had a broken skb network header offset. Fixes: https://github.com/openwrt/openwrt/issues/19130 Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
f7fa414d3b
commit
604355e8c4
2 changed files with 36 additions and 1 deletions
|
@ -0,0 +1,35 @@
|
||||||
|
From: Felix Fietkau <nbd@nbd.name>
|
||||||
|
Date: Sat, 5 Jul 2025 13:44:10 +0200
|
||||||
|
Subject: [PATCH] net: fix TCP/UDP fraglist GRO
|
||||||
|
|
||||||
|
Since "net: gro: use cb instead of skb->network_header", the skb network
|
||||||
|
header is no longer set in the GRO path.
|
||||||
|
This breaks fraglist segmentation, which relies on ip_hdr()/tcp_hdr()
|
||||||
|
to check for address/port changes.
|
||||||
|
Fix this regression by selectively setting the network header for merged
|
||||||
|
segment skbs.
|
||||||
|
|
||||||
|
Fixes: 186b1ea73ad8 ("net: gro: use cb instead of skb->network_header")
|
||||||
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
|
---
|
||||||
|
|
||||||
|
--- a/net/ipv4/tcp_offload.c
|
||||||
|
+++ b/net/ipv4/tcp_offload.c
|
||||||
|
@@ -355,6 +355,7 @@ struct sk_buff *tcp_gro_receive(struct l
|
||||||
|
flush |= skb->ip_summed != p->ip_summed;
|
||||||
|
flush |= skb->csum_level != p->csum_level;
|
||||||
|
flush |= NAPI_GRO_CB(p)->count >= 64;
|
||||||
|
+ skb_set_network_header(skb, skb_gro_receive_network_offset(skb));
|
||||||
|
|
||||||
|
if (flush || skb_gro_receive_list(p, skb))
|
||||||
|
mss = 1;
|
||||||
|
--- a/net/ipv4/udp_offload.c
|
||||||
|
+++ b/net/ipv4/udp_offload.c
|
||||||
|
@@ -604,6 +604,7 @@ static struct sk_buff *udp_gro_receive_s
|
||||||
|
NAPI_GRO_CB(skb)->flush = 1;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
+ skb_set_network_header(skb, skb_gro_receive_network_offset(skb));
|
||||||
|
ret = skb_gro_receive_list(p, skb);
|
||||||
|
} else {
|
||||||
|
skb_gro_postpull_rcsum(skb, uh,
|
|
@ -22,5 +22,5 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
flush |= skb->csum_level != p->csum_level;
|
flush |= skb->csum_level != p->csum_level;
|
||||||
+ flush |= !pskb_may_pull(skb, skb_gro_offset(skb));
|
+ flush |= !pskb_may_pull(skb, skb_gro_offset(skb));
|
||||||
flush |= NAPI_GRO_CB(p)->count >= 64;
|
flush |= NAPI_GRO_CB(p)->count >= 64;
|
||||||
|
skb_set_network_header(skb, skb_gro_receive_network_offset(skb));
|
||||||
|
|
||||||
if (flush || skb_gro_receive_list(p, skb))
|
|
||||||
|
|
Loading…
Reference in a new issue