net: enable udp v6 sockets receiving v4 packets with UDP GRO
Subsystems (3)
v2 cover net: enable udp v6 sockets receiving v4 packets with UDP GRO
Currently, udp v6 socket can not process v4 packets with UDP GRO, as udp_encap_needed_key is not increased when udp_tunnel_encap_enable() is called for v6 socket. This patchset is to increase it and remove the unnecessary code in bareudp.
v1->v2:
- see Patch 1/2.
Xin Long (2):
udp: call udp_encap_enable for v6 sockets when enabling encap Revert "bareudp: Fixed bareudp receive handling"
drivers/net/bareudp.c | 6 ------ include/net/udp.h | 1 + include/net/udp_tunnel.h | 3 +-- net/ipv4/udp.c | 6 ++++++ net/ipv6/udp.c | 4 +++- 5 files changed, 11 insertions(+), 9 deletions(-)
Signature · 1 line
2.1.0
PATCH v2 1/2 udp: call udp_encap_enable for v6 sockets when enabling encap
When enabling encap for a ipv6 socket without udp_encap_needed_key increased, UDP GRO won't work for v4 mapped v6 address packets as sk will be NULL in udp4_gro_receive().
This patch is to enable it by increasing udp_encap_needed_key for v6 sockets in udp_tunnel_encap_enable(), and correspondingly decrease udp_encap_needed_key in udpv6_destroy_sock().
v1->v2:
- add udp_encap_disable() and export it.
--- include/net/udp.h | 1 + include/net/udp_tunnel.h | 3 +-- net/ipv4/udp.c | 6 ++++++ net/ipv6/udp.c | 4 +++- 4 files changed, 11 insertions(+), 3 deletions(-)
include/net/udp.h +1 -0
@@ -467,6 +467,7 @@ void udp_init(void);DECLARE_STATIC_KEY_FALSE (udp_encap_needed_key);void udp_encap_enable (void ); +void udp_encap_disable (void );#if IS_ENABLED (CONFIG_IPV6 )DECLARE_STATIC_KEY_FALSE (udpv6_encap_needed_key);void udpv6_encap_enable (void );
include/net/udp_tunnel.h +1 -2
@@ -181,9 +181,8 @@ static inline void udp_tunnel_encap_enable(struct socket *sock)#if IS_ENABLED (CONFIG_IPV6 )if (sock->sk->sk_family ==PF_INET6 ) ipv6_stub->udpv6_encap_enable (); - else#endif -udp_encap_enable (); +udp_encap_enable (); }#define UDP_TUNNEL_NIC_MAX_TABLES 4
net/ipv4/udp.c +6 -0
@@ -596,6 +596,12 @@ void udp_encap_enable(void) }EXPORT_SYMBOL (udp_encap_enable); +void udp_encap_disable (void ) +{ +static_branch_dec (&udp_encap_needed_key); +} +EXPORT_SYMBOL (udp_encap_disable); +/* Handler for tunnels with arbitrary destination ports: no socket lookup, go * through error handlers in encapsulations looking for a match. */
net/ipv6/udp.c +3 -1
@@ -1608,8 +1608,10 @@ void udpv6_destroy_sock(struct sock *sk)if (encap_destroy)encap_destroy (sk); } -if (up->encap_enabled) +if (up->encap_enabled) {static_branch_dec (&udpv6_encap_needed_key); +udp_encap_disable (); + } }inet6_destroy_sock (sk);
Signature · 1 line
2.1.0
PATCH v2 2/2 Revert "bareudp: Fixed bareudp receive handling"
As udp_encap_enable() is already called in udp_tunnel_encap_enable() since the last patch, and we don't need it any more. So remove it by reverting commit 81f954a44567567c7d74a97b1db78fb43afc253d.
--- drivers/net/bareudp.c | 6 ------ 1 file changed, 6 deletions(-)
drivers/net/bareudp.c +0 -6
@@ -240,12 +240,6 @@ static int bareudp_socket_create(struct bareudp_dev *bareudp, __be16 port) tunnel_cfg.encap_destroy =NULL ;setup_udp_tunnel_sock (bareudp->net, sock, &tunnel_cfg); -/* As the setup_udp_tunnel_sock does not call udp_encap_enable if the -* socket type is v6 an explicit call to udp_encap_enable is needed. -*/ -if (sock->sk->sk_family ==AF_INET6 ) -udp_encap_enable (); -rcu_assign_pointer (bareudp->sock, sock);return 0 ; }
Signature · 1 line
2.1.0
Jakub Kicinski
maintainerRe: [PATCHv2 net-next 2/2] Revert "bareudp: Fixed bareudp receive handling"
Quoted 3 lines · On Fri, 15 Jan 2021 15:30:09 +0800 Xin Long wrote:
As
udp_encap_enable()is already called inudp_tunnel_encap_enable()since the last patch, and we don't need it any more. So remove it by reverting commit81f954a44567567c7d74a97b1db78fb43afc253d.
missing signoff on this one