[lvc-project] [PATCH 4/4 5.10] rxrpc: Enable IPv6 checksums on transport socket
Alexander Ofitserov
oficerovas at altlinux.org
Wed Apr 10 14:27:46 MSK 2024
From: David Howells <dhowells ÎÁ redhat.com>
[ Upstream commit 39cb9faa5d46d0d0694f4b594ef905f517600c8e ]
AF_RXRPC doesn't currently enable IPv6 UDP Tx checksums on the transport
socket it opens and the checksums in the packets it generates end up 0.
It probably should also enable IPv6 UDP Rx checksums and IPv4 UDP
checksums. The latter only seem to be applied if the socket family is
AF_INET and don't seem to apply if it's AF_INET6. IPv4 packets from an
IPv6 socket seem to have checksums anyway.
What seems to have happened is that the inet_inv_convert_csum() call didn't
get converted to the appropriate udp_port_cfg parameters - and
udp_sock_create() disables checksums unless explicitly told not too.
Fix this by enabling the three udp_port_cfg checksum options.
Fixes: 1a9b86c9fd95 ("rxrpc: use udp tunnel APIs instead of open code in rxrpc_open_socket")
Reported-by: Marc Dionne <marc.dionne ÎÁ auristor.com>
Signed-off-by: David Howells <dhowells ÎÁ redhat.com>
Reviewed-by: Xin Long <lucien.xin ÎÁ gmail.com>
Reviewed-by: Marc Dionne <marc.dionne ÎÁ auristor.com>
cc: Vadim Fedorenko <vfedorenko ÎÁ novek.ru>
cc: David S. Miller <davem ÎÁ davemloft.net>
cc: linux-afs ÎÁ lists.infradead.org
Signed-off-by: David S. Miller <davem ÎÁ davemloft.net>
Signed-off-by: Alexander Ofitserov <oficerovas ÎÁ altlinux.org>
Cc: stable ÎÁ vger.kernel.org
---
net/rxrpc/local_object.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/net/rxrpc/local_object.c b/net/rxrpc/local_object.c
index 6215800db33333..790c270c067850 100644
--- a/net/rxrpc/local_object.c
+++ b/net/rxrpc/local_object.c
@@ -117,6 +117,7 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
local, srx->transport_type, srx->transport.family);
udp_conf.family = srx->transport.family;
+ udp_conf.use_udp_checksums = true;
if (udp_conf.family == AF_INET) {
udp_conf.local_ip = srx->transport.sin.sin_addr;
udp_conf.local_udp_port = srx->transport.sin.sin_port;
@@ -124,6 +125,8 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
} else {
udp_conf.local_ip6 = srx->transport.sin6.sin6_addr;
udp_conf.local_udp_port = srx->transport.sin6.sin6_port;
+ udp_conf.use_udp6_tx_checksums = true;
+ udp_conf.use_udp6_rx_checksums = true;
#endif
}
ret = udp_sock_create(net, &udp_conf, &local->socket);
--
2.42.1
More information about the lvc-project
mailing list