vxlan: allow L4 GRO passthrough
authorPaolo Abeni <pabeni@redhat.com>
Tue, 30 Mar 2021 10:28:53 +0000 (12:28 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 31 Mar 2021 00:06:49 +0000 (17:06 -0700)
When passing up an UDP GSO packet with L4 aggregation, there is
no need to segment it at the vxlan level. We can propagate the
packet untouched and let it be segmented later, if needed.

Introduce an helper to allow let the UDP socket to accept any
L4 aggregation and use it in the vxlan driver.

v1 -> v2:
 - updated to use the newly introduced UDP socket 'accept*' fields

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vxlan.c
include/linux/udp.h

index 7665817f3cb61fd047f6b80567b3761b7090818d..39ee1300cdd9d73197058ff166adda13cdbd5ab1 100644 (file)
@@ -3484,6 +3484,7 @@ static struct socket *vxlan_create_sock(struct net *net, bool ipv6,
        if (err < 0)
                return ERR_PTR(err);
 
+       udp_allow_gso(sock->sk);
        return sock;
 }
 
index ae58ff3b6b5b8eb04cca4daabd76b7786d836347..ae66dadd8543423e96ab8b7f7f4cc500153a6562 100644 (file)
@@ -145,6 +145,12 @@ static inline bool udp_unexpected_gso(struct sock *sk, struct sk_buff *skb)
        return false;
 }
 
+static inline void udp_allow_gso(struct sock *sk)
+{
+       udp_sk(sk)->accept_udp_l4 = 1;
+       udp_sk(sk)->accept_udp_fraglist = 1;
+}
+
 #define udp_portaddr_for_each_entry(__sk, list) \
        hlist_for_each_entry(__sk, list, __sk_common.skc_portaddr_node)