net: enable udp v6 sockets receiving v4 packets with UDP GRO
Subsystems (3)
v3 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.v2->v3:
- see Patch 2/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 v3 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 v3 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.
v1->v2:
- no change.v2->v3:
- add the missing signoff.
--- 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
Re: [PATCHv3 net-next 2/2] Revert "bareudp: Fixed bareudp receive handling"
Quoted 11 lines · Xin Long
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.
v1->v2:
- no change.v2->v3:
- add the missing signoff.Signed-off-by Xin Long <[email protected]>
It might make more sense to just roll this into the first patch since what this is effectively doing is removing a spot that was invoking the enable without adding the disable.
Quoted 24 lines
--- drivers/net/bareudp.c | 6 ------ 1 file changed, 6 deletions(-)drivers/net/bareudp.c +0
-7@@ -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 ; } --2.1.0
Re: [PATCHv3 net-next 1/2] udp: call udp_encap_enable for v6 sockets when enabling encap
In reply to Xin LongQuoted 54 lines · Xin Long
When enabling encap for a ipv6 socket without
udp_encap_needed_keyincreased, UDP GRO won't work for v4 mapped v6 address packets as sk will be NULL inudp4_gro_receive().This patch is to enable it by increasing
udp_encap_needed_keyfor v6 sockets inudp_tunnel_encap_enable(), and correspondingly decreaseudp_encap_needed_keyinudpv6_destroy_sock().
v1->v2:
- addudp_encap_disable()and export it.Signed-off-by Xin Long <[email protected]>--- 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 4net/ipv4/udp.c +0
-0@@ -596,6 +596,12 @@ void udp_encap_enable(void) }EXPORT_SYMBOL (udp_encap_enable);
net/ipv4/udp.c void udp_encap_enable(void) · line 607
Quoted 10 lines
net/ipv4/udp.c +6
-0+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. */
So this seems unbalanced to me. We are adding/modifying one spot where we are calling the enable function, but the other callers don't call the disable function? Specifically I am curious about how to deal with the rxrpc_open_socket usage.
If we don't balance out all the callers I am not sure adding the udp_encap_disable makes much sense.
Quoted 19 lines
net/ipv6/udp.c +3
-2@@ -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); --2.1.0
Re: [PATCHv3 net-next 1/2] udp: call udp_encap_enable for v6 sockets when enabling encap
Quoted 57 lines · Alexander Duyck
Quoted 55 lines · Xin Long
When enabling encap for a ipv6 socket without
udp_encap_needed_keyincreased, UDP GRO won't work for v4 mapped v6 address packets as sk will be NULL inudp4_gro_receive().This patch is to enable it by increasing
udp_encap_needed_keyfor v6 sockets inudp_tunnel_encap_enable(), and correspondingly decreaseudp_encap_needed_keyinudpv6_destroy_sock().
v1->v2:
- addudp_encap_disable()and export it.Signed-off-by Xin Long <[email protected]>--- 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 4net/ipv4/udp.c +0
-0@@ -596,6 +596,12 @@ void udp_encap_enable(void) }EXPORT_SYMBOL (udp_encap_enable);
Quoted 14 lines
net/ipv4/udp.c void udp_encap_enable(void) · line 607
Quoted 9 lines
net/ipv4/udp.c +6
-0+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. */ So this seems unbalanced to me. We are adding/modifying one spot where we are calling the enable function, but the other callers don't call the disable function? Specifically I am curious about how to deal with the
rxrpc_open_socketusage.
as long as it's a UDP sock, when it's being destroyed, udp(v6)_destroy_sock will be called, where the key(s) get decreased.
Sorry, I missed there's a call to udp_encap_enable() in rxrpc, the issue is the similar to the one in bareudp, it should be:
- udp_encap_enable();
#if IS_ENABLED(CONFIG_AF_RXRPC_IPV6)
if (local->srx.transport.family == AF_INET6)
udpv6_encap_enable();+ else
#endif
+ udp_encap_enable();
+
I will get all these into one patch and repost.
Interesting it doesn't use udp_tunnel APIs here, I will check.
Thanks.
Quoted 23 lines
If we don't balance out all the callers I am not sure adding the
udp_encap_disablemakes much sense.Quoted 19 lines
net/ipv6/udp.c +3
-2@@ -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); --2.1.0