• Andrea Mayer's avatar
    seg6: fix skb checksum evaluation in SRH encapsulation/insertion · df8386d1
    Andrea Mayer authored
    Support for SRH encapsulation and insertion was introduced with
    commit 6c8702c6 ("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: 6c8702c6 ("ipv6: sr: add support for SRH encapsulation and injection with lwtunnels")
    Reported-by: default avatarPaolo Abeni <pabeni@redhat.com>
    Link: https://lore.kernel.org/all/20220705190727.69d532417be7438b15404ee1@uniroma2.itSigned-off-by: default avatarAndrea Mayer <andrea.mayer@uniroma2.it>
    Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    df8386d1
seg6_iptunnel.c 14 KB