• Daniel Borkmann's avatar
    bpf, vxlan, geneve, gre: fix usage of dst_cache on xmit · db3c6139
    Daniel Borkmann authored
    The assumptions from commit 0c1d70af ("net: use dst_cache for vxlan
    device"), 468dfffc ("geneve: add dst caching support") and 3c1cb4d2
    ("net/ipv4: add dst cache support for gre lwtunnels") on dst_cache usage
    when ip_tunnel_info is used is unfortunately not always valid as assumed.
    
    While it seems correct for ip_tunnel_info front-ends such as OVS, eBPF
    however can fill in ip_tunnel_info for consumers like vxlan, geneve or gre
    with different remote dsts, tos, etc, therefore they cannot be assumed as
    packet independent.
    
    Right now vxlan, geneve, gre would cache the dst for eBPF and every packet
    would reuse the same entry that was first created on the initial route
    lookup. eBPF doesn't store/cache the ip_tunnel_info, so each skb may have
    a different one.
    
    Fix it by adding a flag that checks the ip_tunnel_info. Also the !tos test
    in vxlan needs to be handeled differently in this context as it is currently
    inferred from ip_tunnel_info as well if present. ip_tunnel_dst_cache_usable()
    helper is added for the three tunnel cases, which checks if we can use dst
    cache.
    
    Fixes: 0c1d70af ("net: use dst_cache for vxlan device")
    Fixes: 468dfffc ("geneve: add dst caching support")
    Fixes: 3c1cb4d2 ("net/ipv4: add dst cache support for gre lwtunnels")
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarPaolo Abeni <pabeni@redhat.com>
    Acked-by: default avatarHannes Frederic Sowa <hannes@stressinduktion.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    db3c6139
geneve.c 39.5 KB