• Sean Tranchetti's avatar
    udp: Avoid post-GRO UDP checksum recalculation · f2696099
    Sean Tranchetti authored
    Currently, when resegmenting an unexpected UDP GRO packet, the full UDP
    checksum will be calculated for every new SKB created by skb_segment()
    because the netdev features passed in by udp_rcv_segment() lack any
    information about checksum offload capabilities.
    
    Usually, we have no need to perform this calculation again, as
      1) The GRO implementation guarantees that any packets making it to the
         udp_rcv_segment() function had correct checksums, and, more
         importantly,
      2) Upon the successful return of udp_rcv_segment(), we immediately pull
         the UDP header off and either queue the segment to the socket or
         hand it off to a new protocol handler.
    
    Unless userspace has set the IP_CHECKSUM sockopt to indicate that they
    want the final checksum values, we can pass the needed netdev feature
    flags to __skb_gso_segment() to avoid checksumming each segment in
    skb_segment().
    
    Fixes: cf329aa4 ("udp: cope with UDP GRO packet misdirection")
    Cc: Paolo Abeni <pabeni@redhat.com>
    Cc: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
    Signed-off-by: default avatarSean Tranchetti <stranche@codeaurora.org>
    Acked-by: default avatarPaolo Abeni <pabeni@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    f2696099
udp.h 14.3 KB