From: Xin Long <lucien.xin@gmail.com> Date: 2021-02-03 08:55:31
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 in Patch 1/2, and improve rxrpc encap_enable by calling
udp_tunnel_encap_enable().
v1->v4:
- See patch 1/2.
v4->v5:
- See patch 2/2.
Xin Long (2):
udp: call udp_encap_enable for v6 sockets when enabling encap
rxrpc: call udp_tunnel_encap_enable in rxrpc_open_socket
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 +++-
net/rxrpc/local_object.c | 7 ++-----
6 files changed, 13 insertions(+), 14 deletions(-)
--
2.1.0
From: Xin Long <lucien.xin@gmail.com> Date: 2021-02-03 08:55:31
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.
v2->v3:
- add the change for rxrpc and bareudp into one patch, as Alex
suggested.
v3->v4:
- move rxrpc part to another patch.
Acked-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
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(-)
@@ -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-*sockettypeisv6anexplicitcalltoudp_encap_enableisneeded.-*/-if(sock->sk->sk_family==AF_INET6)-udp_encap_enable();-rcu_assign_pointer(bareudp->sock,sock);return0;}
From: Xin Long <lucien.xin@gmail.com> Date: 2021-02-03 08:55:35
When doing encap_enable/increasing encap_needed_key, up->encap_enabled
is not set in rxrpc_open_socket(), and it will cause encap_needed_key
not being decreased in udpv6_destroy_sock().
This patch is to improve it by just calling udp_tunnel_encap_enable()
where it increases both UDP and UDPv6 encap_needed_key and sets
up->encap_enabled.
v4->v5:
- add the missing '#include <net/udp_tunnel.h>', as David Howells
noticed.
Acked-and-tested-by: David Howells [off-list ref]
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
net/rxrpc/local_object.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
@@ -135,11 +136,7 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)udp_sk(usk)->gro_receive=NULL;udp_sk(usk)->gro_complete=NULL;-udp_encap_enable();-#if IS_ENABLED(CONFIG_AF_RXRPC_IPV6)-if(local->srx.transport.family==AF_INET6)-udpv6_encap_enable();-#endif+udp_tunnel_encap_enable(local->socket);usk->sk_error_report=rxrpc_error_report;/* if a local address was supplied then bind it */
From: David Howells <dhowells@redhat.com> Date: 2021-02-03 09:52:33
Xin Long [off-list ref] wrote:
When doing encap_enable/increasing encap_needed_key, up->encap_enabled
is not set in rxrpc_open_socket(), and it will cause encap_needed_key
not being decreased in udpv6_destroy_sock().
This patch is to improve it by just calling udp_tunnel_encap_enable()
where it increases both UDP and UDPv6 encap_needed_key and sets
up->encap_enabled.
v4->v5:
- add the missing '#include <net/udp_tunnel.h>', as David Howells
noticed.
Acked-and-tested-by: David Howells [off-list ref]
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Hello:
This series was applied to netdev/net-next.git (refs/heads/master):
On Wed, 3 Feb 2021 16:54:21 +0800 you wrote:
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 in Patch 1/2, and improve rxrpc encap_enable by calling
udp_tunnel_encap_enable().
[...]
On Tue, Mar 29, 2022 at 03:24:49PM +0200, Antonio Quartulli wrote:
Hi all,
On 03/02/2021 09:54, Xin Long wrote:
quoted
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().
This is a non-negligible issue that other users (in or out of tree) may hit
as well.
At OpenVPN we are developing a kernel device driver that has the same
problem as UDP GRO. So far the only workaround is to let users upgrade to
v5.12+.
I would like to propose to take this patch in stable releases.
Greg, is this an option?
Commit in the linux kernel is:
a4a600dd301ccde6ea239804ec1f19364a39d643
What stable tree(s) should this apply to, and where have you tested it?
thanks,
greg k-h
From: Antonio Quartulli <antonio@openvpn.net> Date: 2022-03-29 13:31:48
Hi all,
On 03/02/2021 09:54, Xin Long wrote:
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().
This is a non-negligible issue that other users (in or out of tree) may
hit as well.
At OpenVPN we are developing a kernel device driver that has the same
problem as UDP GRO. So far the only workaround is to let users upgrade
to v5.12+.
I would like to propose to take this patch in stable releases.
Greg, is this an option?
Commit in the linux kernel is:
a4a600dd301ccde6ea239804ec1f19364a39d643
Thanks a lot.
Best Regards,
quoted hunk
v1->v2:
- add udp_encap_disable() and export it.
v2->v3:
- add the change for rxrpc and bareudp into one patch, as Alex
suggested.
v3->v4:
- move rxrpc part to another patch.
Acked-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
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(-)
@@ -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-*sockettypeisv6anexplicitcalltoudp_encap_enableisneeded.-*/-if(sock->sk->sk_family==AF_INET6)-udp_encap_enable();-rcu_assign_pointer(bareudp->sock,sock);return0;}
From: Antonio Quartulli <antonio@openvpn.net> Date: 2022-03-31 13:05:40
Hi,
On 29/03/2022 15:30, Greg Kroah-Hartman wrote:
quoted
I would like to propose to take this patch in stable releases.
Greg, is this an option?
Commit in the linux kernel is:
a4a600dd301ccde6ea239804ec1f19364a39d643
What stable tree(s) should this apply to, and where have you tested it?
Sorry for the delay, Greg, but I wanted to run some extra tests on the
various longterm kernel releases.
This bug exists since "ever", therefore ideally it could/should be
applied to all stable trees.
However, this patch applies as-is only to v5.10 and v5.4 (you need to
ignore the hunk for 'drivers/net/bareudp.c' on the latter).
Older trees require a different code change.
My tests on v5.10 and v5.4 show that the patch works as expected.
Therefore, could it be backported to these 2 trees?
It can get my
Tested-by: Antonio Quartulli <antonio@openvpn.net>
Thanks a lot,
--
Antonio Quartulli
OpenVPN Inc.
On Thu, Mar 31, 2022 at 03:06:41PM +0200, Antonio Quartulli wrote:
Hi,
On 29/03/2022 15:30, Greg Kroah-Hartman wrote:
quoted
quoted
I would like to propose to take this patch in stable releases.
Greg, is this an option?
Commit in the linux kernel is:
a4a600dd301ccde6ea239804ec1f19364a39d643
What stable tree(s) should this apply to, and where have you tested it?
Sorry for the delay, Greg, but I wanted to run some extra tests on the
various longterm kernel releases.
This bug exists since "ever", therefore ideally it could/should be applied
to all stable trees.
However, this patch applies as-is only to v5.10 and v5.4 (you need to ignore
the hunk for 'drivers/net/bareudp.c' on the latter).
Older trees require a different code change.
My tests on v5.10 and v5.4 show that the patch works as expected.
Therefore, could it be backported to these 2 trees?
It can get my
Tested-by: Antonio Quartulli <antonio@openvpn.net>