Patch "seg6: fix skb checksum evaluation in SRH encapsulation/insertion" has been added to the 5.18-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    seg6: fix skb checksum evaluation in SRH encapsulation/insertion

to the 5.18-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     seg6-fix-skb-checksum-evaluation-in-srh-encapsulatio.patch
and it can be found in the queue-5.18 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 0eaf70a1d10a5291c4eb0c09f8bf1c4a4ecce16e
Author: Andrea Mayer <andrea.mayer@xxxxxxxxxxx>
Date:   Tue Jul 12 19:58:35 2022 +0200

    seg6: fix skb checksum evaluation in SRH encapsulation/insertion
    
    [ Upstream commit df8386d13ea280d55beee1b95f61a59234a3798b ]
    
    Support for SRH encapsulation and insertion was introduced with
    commit 6c8702c60b88 ("ipv6: sr: add support for SRH encapsulation and
    injection with lwtunnels"), through the seg6_do_srh_encap() and
    seg6_do_srh_inline() functions, respectively.
    The former encapsulates the packet in an outer IPv6 header along with
    the SRH, while the latter inserts the SRH between the IPv6 header and
    the payload. Then, the headers are initialized/updated according to the
    operating mode (i.e., encap/inline).
    Finally, the skb checksum is calculated to reflect the changes applied
    to the headers.
    
    The IPv6 payload length ('payload_len') is not initialized
    within seg6_do_srh_{inline,encap}() but is deferred in seg6_do_srh(), i.e.
    the caller of seg6_do_srh_{inline,encap}().
    However, this operation invalidates the skb checksum, since the
    'payload_len' is updated only after the checksum is evaluated.
    
    To solve this issue, the initialization of the IPv6 payload length is
    moved from seg6_do_srh() directly into the seg6_do_srh_{inline,encap}()
    functions and before the skb checksum update takes place.
    
    Fixes: 6c8702c60b88 ("ipv6: sr: add support for SRH encapsulation and injection with lwtunnels")
    Reported-by: Paolo Abeni <pabeni@xxxxxxxxxx>
    Link: https://lore.kernel.org/all/20220705190727.69d532417be7438b15404ee1@xxxxxxxxxxx
    Signed-off-by: Andrea Mayer <andrea.mayer@xxxxxxxxxxx>
    Signed-off-by: Paolo Abeni <pabeni@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/ipv6/seg6_iptunnel.c b/net/ipv6/seg6_iptunnel.c
index d64855010948..e756ba705fd9 100644
--- a/net/ipv6/seg6_iptunnel.c
+++ b/net/ipv6/seg6_iptunnel.c
@@ -189,6 +189,8 @@ int seg6_do_srh_encap(struct sk_buff *skb, struct ipv6_sr_hdr *osrh, int proto)
 	}
 #endif
 
+	hdr->payload_len = htons(skb->len - sizeof(struct ipv6hdr));
+
 	skb_postpush_rcsum(skb, hdr, tot_len);
 
 	return 0;
@@ -241,6 +243,8 @@ int seg6_do_srh_inline(struct sk_buff *skb, struct ipv6_sr_hdr *osrh)
 	}
 #endif
 
+	hdr->payload_len = htons(skb->len - sizeof(struct ipv6hdr));
+
 	skb_postpush_rcsum(skb, hdr, sizeof(struct ipv6hdr) + hdrlen);
 
 	return 0;
@@ -302,7 +306,6 @@ static int seg6_do_srh(struct sk_buff *skb)
 		break;
 	}
 
-	ipv6_hdr(skb)->payload_len = htons(skb->len - sizeof(struct ipv6hdr));
 	skb_set_transport_header(skb, sizeof(struct ipv6hdr));
 	nf_reset_ct(skb);
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux