]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfrm: Set transport header to fix UDP GRO handling
authorTobias Brunner <tobias@strongswan.org>
Tue, 24 Jun 2025 12:47:20 +0000 (14:47 +0200)
committerSteffen Klassert <steffen.klassert@secunet.com>
Wed, 2 Jul 2025 07:19:56 +0000 (09:19 +0200)
The referenced commit replaced a call to __xfrm4|6_udp_encap_rcv() with
a custom check for non-ESP markers.  But what the called function also
did was setting the transport header to the ESP header.  The function
that follows, esp4|6_gro_receive(), relies on that being set when it calls
xfrm_parse_spi().  We have to set the full offset as the skb's head was
not moved yet so adding just the UDP header length won't work.

Fixes: e3fd05777685 ("xfrm: Fix UDP GRO handling for some corner cases")
Signed-off-by: Tobias Brunner <tobias@strongswan.org>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
net/ipv4/xfrm4_input.c
net/ipv6/xfrm6_input.c

index 0d31a8c108d4f69050b8988fa43520ea88838bad..f28cfd88eaf5934734105fe520e4a76c86723529 100644 (file)
@@ -202,6 +202,9 @@ struct sk_buff *xfrm4_gro_udp_encap_rcv(struct sock *sk, struct list_head *head,
        if (len <= sizeof(struct ip_esp_hdr) || udpdata32[0] == 0)
                goto out;
 
+       /* set the transport header to ESP */
+       skb_set_transport_header(skb, offset);
+
        NAPI_GRO_CB(skb)->proto = IPPROTO_UDP;
 
        pp = call_gro_receive(ops->callbacks.gro_receive, head, skb);
index 841c81abaaf4ff06dfab7eabac7996361b1c49c9..9005fc156a20e67b65220f42cce981ae395e2293 100644 (file)
@@ -202,6 +202,9 @@ struct sk_buff *xfrm6_gro_udp_encap_rcv(struct sock *sk, struct list_head *head,
        if (len <= sizeof(struct ip_esp_hdr) || udpdata32[0] == 0)
                goto out;
 
+       /* set the transport header to ESP */
+       skb_set_transport_header(skb, offset);
+
        NAPI_GRO_CB(skb)->proto = IPPROTO_UDP;
 
        pp = call_gro_receive(ops->callbacks.gro_receive, head, skb);