• Eric Dumazet's avatar
    ipv6: ip6_fragment() should check CHECKSUM_PARTIAL · 72e843bb
    Eric Dumazet authored
    Quoting Tore Anderson from :
    
    If the allfrag feature has been set on a host route (due to an ICMPv6
    Packet Too Big received indicating a MTU of less than 1280),
    TCP SYN/ACK packets to that destination appears to get an incorrect
    TCP checksum. This in turn means they are thrown away as invalid.
    
    In the case of an IPv4 client behind a link with a MTU of less than
    1260, accessing an IPv6 server through a stateless translator,
    this means that the client can only download a single large file
    from the server, because once it is in the server's routing cache
    with the allfrag feature set, new TCP connections can no longer
    be established.
    
    </endquote>
    
    It appears ip6_fragment() doesn't handle CHECKSUM_PARTIAL properly.
    
    As network drivers are not prepared to fetch correct transport header, a
    safe fix is to call skb_checksum_help() before fragmenting packet.
    Reported-by: default avatarTore Anderson <tore@fud.no>
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Tested-by: default avatarTore Anderson <tore@fud.no>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    72e843bb
ip6_output.c 41.1 KB