• Jiri Benc's avatar
    vxlan: calculate correct header length for GPE · 94d166c5
    Jiri Benc authored
    VXLAN-GPE does not add an extra inner Ethernet header. Take that into
    account when calculating header length.
    
    This causes problems in skb_tunnel_check_pmtu, where incorrect PMTU is
    cached.
    
    In the collect_md mode (which is the only mode that VXLAN-GPE
    supports), there's no magic auto-setting of the tunnel interface MTU.
    It can't be, since the destination and thus the underlying interface
    may be different for each packet.
    
    So, the administrator is responsible for setting the correct tunnel
    interface MTU. Apparently, the administrators are capable enough to
    calculate that the maximum MTU for VXLAN-GPE is (their_lower_MTU - 36).
    They set the tunnel interface MTU to 1464. If you run a TCP stream over
    such interface, it's then segmented according to the MTU 1464, i.e.
    producing 1514 bytes frames. Which is okay, this still fits the lower
    MTU.
    
    However, skb_tunnel_check_pmtu (called from vxlan_xmit_one) uses 50 as
    the header size and thus incorrectly calculates the frame size to be
    1528. This leads to ICMP too big message being generated (locally),
    PMTU of 1450 to be cached and the TCP stream to be resegmented.
    
    The fix is to use the correct actual header size, especially for
    skb_tunnel_check_pmtu calculation.
    
    Fixes: e1e5314d ("vxlan: implement GPE")
    Signed-off-by: default avatarJiri Benc <jbenc@redhat.com>
    Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    94d166c5
vxlan_core.c 120 KB