Skip to content
  • Stefano Brivio's avatar
    vti6: Properly adjust vti6 MTU from MTU of lower device · c6741fbe
    Stefano Brivio authored
    If a lower device is found, we don't need to subtract
    LL_MAX_HEADER to calculate our MTU: just use its MTU, the link
    layer headers are already taken into account by it.
    
    If the lower device is not found, start from ETH_DATA_LEN
    instead, and only in this case subtract a worst-case
    LL_MAX_HEADER.
    
    We then need to subtract our additional IPv6 header from the
    calculation.
    
    While at it, note that vti6 doesn't have a hardware header, so
    it doesn't need to set dev->hard_header_len. And as
    vti6_link_config() now always sets the MTU, there's no need to
    set a default value in vti6_dev_setup().
    
    This makes the behaviour consistent with IPv4 vti, after
    commit a3245236 ("vti4: Don't count header length twice."),
    which was accidentally reverted by merge commit f895f0cf
    ("Merge branch 'master' of
    git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec").
    
    While commit 53c81e95 ("ip6_vti: adjust vti mtu according to
    mtu of lower device") improved on the original situation, this
    was still not ideal. As reported in that commit message itself,
    if we start from an underlying veth MTU of 9000, we end up with
    an MTU of 8832, that is, 9000 - LL_MAX_HEADER - sizeof(ipv6hdr).
    This should simply be 8880, or 9000 - sizeof(ipv6hdr) instead:
    we found the lower device (veth) and we know we don't have any
    additional link layer header, so there's no need to subtract an
    hypothetical worst-case number.
    
    Fixes: 53c81e95
    
     ("ip6_vti: adjust vti mtu according to mtu of lower device")
    Signed-off-by: default avatarStefano Brivio <sbrivio@redhat.com>
    Acked-by: default avatarSabrina Dubroca <sd@queasysnail.net>
    Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
    c6741fbe