• Tom Herbert's avatar
    net: Fix save software checksum complete · 46fb51eb
    Tom Herbert authored
    Geert reported issues regarding checksum complete and UDP.
    The logic introduced in commit 7e3cead5
    ("net: Save software checksum complete") is not correct.
    
    This patch:
    1) Restores code in __skb_checksum_complete_header except for setting
       CHECKSUM_UNNECESSARY. This function may be calculating checksum on
       something less than skb->len.
    2) Adds saving checksum to __skb_checksum_complete. The full packet
       checksum 0..skb->len is calculated without adding in pseudo header.
       This value is saved in skb->csum and then the pseudo header is added
       to that to derive the checksum for validation.
    3) In both __skb_checksum_complete_header and __skb_checksum_complete,
       set skb->csum_valid to whether checksum of zero was computed. This
       allows skb_csum_unnecessary to return true without changing to
       CHECKSUM_UNNECESSARY which was done previously.
    4) Copy new csum related bits in __copy_skb_header.
    Reported-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
    Signed-off-by: default avatarTom Herbert <therbert@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    46fb51eb
skbuff.c 98.3 KB