• Xin Long's avatar
    ip6_gre: update dst pmtu if dev mtu has been updated by toobig in __gre6_xmit · 8aec4959
    Xin Long authored
    When receiving a Toobig icmpv6 packet, ip6gre_err would just set
    tunnel dev's mtu, that's not enough. For skb_dst(skb)'s pmtu may
    still be using the old value, it has no chance to be updated with
    tunnel dev's mtu.
    
    Jianlin found this issue by reducing route's mtu while running
    netperf, the performance went to 0.
    
    ip6ip6 and ip4ip6 tunnel can work well with this, as they lookup
    the upper dst and update_pmtu it's pmtu or icmpv6_send a Toobig
    to upper socket after setting tunnel dev's mtu.
    
    We couldn't do that for ip6_gre, as gre's inner packet could be
    any protocol, it's difficult to handle them (like lookup upper
    dst) in a good way.
    
    So this patch is to fix it by updating skb_dst(skb)'s pmtu when
    dev->mtu < skb_dst(skb)'s pmtu in tx path. It's safe to do this
    update there, as usually dev->mtu <= skb_dst(skb)'s pmtu and no
    performance regression can be caused by this.
    
    Fixes: c12b395a ("gre: Support GRE over IPv6")
    Reported-by: default avatarJianlin Shi <jishi@redhat.com>
    Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    8aec4959
ip6_gre.c 39.3 KB