Thread (4 messages) flat view 4 messages, 2 authors, 3h ago
HOTtoday

[PATCH net-next v1 2/2] ipv6: make IPV6_TRANSPARENT setsockopt lockless

From: Xuanqiang Luo <hidden>
Date: 2026-09-11 10:24:47
Also in: lkml
Subsystem: networking [general], networking [ipv4/ipv6], the rest · Maintainers: "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, David Ahern, Ido Schimmel, Linus Torvalds

From: Xuanqiang Luo <redacted>

IPV6_TRANSPARENT still takes the socket lock despite using
inet_assign_bit() to update the flag shared with IP_TRANSPARENT.
IPv6 TCP and UDP sockets can already update this flag without the
lock through SOL_IP/IP_TRANSPARENT.

Move IPV6_TRANSPARENT to the lockless setsockopt path.

Signed-off-by: Xuanqiang Luo <redacted>
---
 net/ipv6/ipv6_sockglue.c | 22 +++++++++-------------
 1 file changed, 9 insertions(+), 13 deletions(-)
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c
index 4124084c3cd79..4b3536571c980 100644
--- a/net/ipv6/ipv6_sockglue.c
+++ b/net/ipv6/ipv6_sockglue.c
@@ -404,6 +404,15 @@ int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
 		/* Shared with IP_FREEBIND. */
 		inet_assign_bit(FREEBIND, sk, valbool);
 		return 0;
+	case IPV6_TRANSPARENT:
+		if (valbool && !sockopt_ns_capable(net->user_ns, CAP_NET_RAW) &&
+		    !sockopt_ns_capable(net->user_ns, CAP_NET_ADMIN))
+			return -EPERM;
+		if (optlen < sizeof(int))
+			return -EINVAL;
+		/* Shared with IP_TRANSPARENT. */
+		inet_assign_bit(TRANSPARENT, sk, valbool);
+		return 0;
 	case IPV6_UNICAST_HOPS:
 		if (optlen < sizeof(int))
 			return -EINVAL;
@@ -672,19 +681,6 @@ int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
 		retv = 0;
 		break;
 
-	case IPV6_TRANSPARENT:
-		if (valbool && !sockopt_ns_capable(net->user_ns, CAP_NET_RAW) &&
-		    !sockopt_ns_capable(net->user_ns, CAP_NET_ADMIN)) {
-			retv = -EPERM;
-			break;
-		}
-		if (optlen < sizeof(int))
-			goto e_inval;
-		/* we don't have a separate transparent bit for IPV6 we use the one in the IPv4 socket */
-		inet_assign_bit(TRANSPARENT, sk, valbool);
-		retv = 0;
-		break;
-
 	case IPV6_RECVORIGDSTADDR:
 		if (optlen < sizeof(int))
 			goto e_inval;
-- 
2.43.0
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help