Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'inet-better-inet_sock_set_state-for-passive-flows'

Eric Dumazet says:

====================
inet: better inet_sock_set_state() for passive flows

Small series to make inet_sock_set_state() more interesting for
LISTEN -> TCP_SYN_RECV changes : The 4-tuple parts are now correct.

First patch is a cleanup.
====================

Link: https://patch.msgid.link/20250212131328.1514243-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+48 -42
-3
net/dccp/ipv4.c
··· 426 426 427 427 newinet = inet_sk(newsk); 428 428 ireq = inet_rsk(req); 429 - sk_daddr_set(newsk, ireq->ir_rmt_addr); 430 - sk_rcv_saddr_set(newsk, ireq->ir_loc_addr); 431 - newinet->inet_saddr = ireq->ir_loc_addr; 432 429 RCU_INIT_POINTER(newinet->inet_opt, rcu_dereference(ireq->ireq_opt)); 433 430 newinet->mc_index = inet_iif(skb); 434 431 newinet->mc_ttl = ip_hdr(skb)->ttl;
+3 -6
net/dccp/ipv6.c
··· 365 365 ireq = inet_rsk(req); 366 366 ireq->ir_v6_rmt_addr = ipv6_hdr(skb)->saddr; 367 367 ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr; 368 + ireq->ir_rmt_addr = LOOPBACK4_IPV6; 369 + ireq->ir_loc_addr = LOOPBACK4_IPV6; 370 + 368 371 ireq->ireq_family = AF_INET6; 369 372 ireq->ir_mark = inet_request_mark(sk, skb); 370 373 ··· 507 504 508 505 memcpy(newnp, np, sizeof(struct ipv6_pinfo)); 509 506 510 - newsk->sk_v6_daddr = ireq->ir_v6_rmt_addr; 511 507 newnp->saddr = ireq->ir_v6_loc_addr; 512 - newsk->sk_v6_rcv_saddr = ireq->ir_v6_loc_addr; 513 - newsk->sk_bound_dev_if = ireq->ir_iif; 514 508 515 509 /* Now IPv6 options... 516 510 ··· 545 545 opt->opt_flen; 546 546 547 547 dccp_sync_mss(newsk, dst_mtu(dst)); 548 - 549 - newinet->inet_daddr = newinet->inet_saddr = LOOPBACK4_IPV6; 550 - newinet->inet_rcv_saddr = LOOPBACK4_IPV6; 551 548 552 549 if (__inet_inherit_port(sk, newsk) < 0) { 553 550 inet_csk_prepare_forced_close(newsk);
+43 -23
net/ipv4/inet_connection_sock.c
··· 1237 1237 const gfp_t priority) 1238 1238 { 1239 1239 struct sock *newsk = sk_clone_lock(sk, priority); 1240 + struct inet_connection_sock *newicsk; 1241 + struct inet_request_sock *ireq; 1242 + struct inet_sock *newinet; 1240 1243 1241 - if (newsk) { 1242 - struct inet_connection_sock *newicsk = inet_csk(newsk); 1244 + if (!newsk) 1245 + return NULL; 1243 1246 1244 - inet_sk_set_state(newsk, TCP_SYN_RECV); 1245 - newicsk->icsk_bind_hash = NULL; 1246 - newicsk->icsk_bind2_hash = NULL; 1247 + newicsk = inet_csk(newsk); 1248 + newinet = inet_sk(newsk); 1249 + ireq = inet_rsk(req); 1247 1250 1248 - inet_sk(newsk)->inet_dport = inet_rsk(req)->ir_rmt_port; 1249 - inet_sk(newsk)->inet_num = inet_rsk(req)->ir_num; 1250 - inet_sk(newsk)->inet_sport = htons(inet_rsk(req)->ir_num); 1251 + newicsk->icsk_bind_hash = NULL; 1252 + newicsk->icsk_bind2_hash = NULL; 1251 1253 1252 - /* listeners have SOCK_RCU_FREE, not the children */ 1253 - sock_reset_flag(newsk, SOCK_RCU_FREE); 1254 + newinet->inet_dport = ireq->ir_rmt_port; 1255 + newinet->inet_num = ireq->ir_num; 1256 + newinet->inet_sport = htons(ireq->ir_num); 1254 1257 1255 - inet_sk(newsk)->mc_list = NULL; 1258 + newsk->sk_bound_dev_if = ireq->ir_iif; 1256 1259 1257 - newsk->sk_mark = inet_rsk(req)->ir_mark; 1258 - atomic64_set(&newsk->sk_cookie, 1259 - atomic64_read(&inet_rsk(req)->ir_cookie)); 1260 + newsk->sk_daddr = ireq->ir_rmt_addr; 1261 + newsk->sk_rcv_saddr = ireq->ir_loc_addr; 1262 + newinet->inet_saddr = ireq->ir_loc_addr; 1260 1263 1261 - newicsk->icsk_retransmits = 0; 1262 - newicsk->icsk_backoff = 0; 1263 - newicsk->icsk_probes_out = 0; 1264 - newicsk->icsk_probes_tstamp = 0; 1264 + #if IS_ENABLED(CONFIG_IPV6) 1265 + newsk->sk_v6_daddr = ireq->ir_v6_rmt_addr; 1266 + newsk->sk_v6_rcv_saddr = ireq->ir_v6_loc_addr; 1267 + #endif 1265 1268 1266 - /* Deinitialize accept_queue to trap illegal accesses. */ 1267 - memset(&newicsk->icsk_accept_queue, 0, sizeof(newicsk->icsk_accept_queue)); 1269 + /* listeners have SOCK_RCU_FREE, not the children */ 1270 + sock_reset_flag(newsk, SOCK_RCU_FREE); 1268 1271 1269 - inet_clone_ulp(req, newsk, priority); 1272 + inet_sk(newsk)->mc_list = NULL; 1270 1273 1271 - security_inet_csk_clone(newsk, req); 1272 - } 1274 + newsk->sk_mark = inet_rsk(req)->ir_mark; 1275 + atomic64_set(&newsk->sk_cookie, 1276 + atomic64_read(&inet_rsk(req)->ir_cookie)); 1277 + 1278 + newicsk->icsk_retransmits = 0; 1279 + newicsk->icsk_backoff = 0; 1280 + newicsk->icsk_probes_out = 0; 1281 + newicsk->icsk_probes_tstamp = 0; 1282 + 1283 + /* Deinitialize accept_queue to trap illegal accesses. */ 1284 + memset(&newicsk->icsk_accept_queue, 0, 1285 + sizeof(newicsk->icsk_accept_queue)); 1286 + 1287 + inet_sk_set_state(newsk, TCP_SYN_RECV); 1288 + 1289 + inet_clone_ulp(req, newsk, priority); 1290 + 1291 + security_inet_csk_clone(newsk, req); 1292 + 1273 1293 return newsk; 1274 1294 } 1275 1295 EXPORT_SYMBOL_GPL(inet_csk_clone_lock);
-4
net/ipv4/tcp_ipv4.c
··· 1768 1768 newtp = tcp_sk(newsk); 1769 1769 newinet = inet_sk(newsk); 1770 1770 ireq = inet_rsk(req); 1771 - sk_daddr_set(newsk, ireq->ir_rmt_addr); 1772 - sk_rcv_saddr_set(newsk, ireq->ir_loc_addr); 1773 - newsk->sk_bound_dev_if = ireq->ir_iif; 1774 - newinet->inet_saddr = ireq->ir_loc_addr; 1775 1771 inet_opt = rcu_dereference(ireq->ireq_opt); 1776 1772 RCU_INIT_POINTER(newinet->inet_opt, inet_opt); 1777 1773 newinet->mc_index = inet_iif(skb);
+2 -6
net/ipv6/tcp_ipv6.c
··· 798 798 799 799 ireq->ir_v6_rmt_addr = ipv6_hdr(skb)->saddr; 800 800 ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr; 801 + ireq->ir_rmt_addr = LOOPBACK4_IPV6; 802 + ireq->ir_loc_addr = LOOPBACK4_IPV6; 801 803 802 804 /* So that link locals have meaning */ 803 805 if ((!sk_listener->sk_bound_dev_if || l3_slave) && ··· 1453 1451 1454 1452 ip6_dst_store(newsk, dst, NULL, NULL); 1455 1453 1456 - newsk->sk_v6_daddr = ireq->ir_v6_rmt_addr; 1457 1454 newnp->saddr = ireq->ir_v6_loc_addr; 1458 - newsk->sk_v6_rcv_saddr = ireq->ir_v6_loc_addr; 1459 - newsk->sk_bound_dev_if = ireq->ir_iif; 1460 1455 1461 1456 /* Now IPv6 options... 1462 1457 ··· 1505 1506 newtp->advmss = tcp_mss_clamp(tcp_sk(sk), dst_metric_advmss(dst)); 1506 1507 1507 1508 tcp_initialize_rcv_mss(newsk); 1508 - 1509 - newinet->inet_daddr = newinet->inet_saddr = LOOPBACK4_IPV6; 1510 - newinet->inet_rcv_saddr = LOOPBACK4_IPV6; 1511 1509 1512 1510 #ifdef CONFIG_TCP_MD5SIG 1513 1511 l3index = l3mdev_master_ifindex_by_index(sock_net(sk), ireq->ir_iif);