Commit 6aa3960d authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

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: default avatarJakub Kicinski <kuba@kernel.org>
parents a045e406 a3a128f6
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -426,9 +426,6 @@ struct sock *dccp_v4_request_recv_sock(const struct sock *sk,

	newinet		   = inet_sk(newsk);
	ireq		   = inet_rsk(req);
	sk_daddr_set(newsk, ireq->ir_rmt_addr);
	sk_rcv_saddr_set(newsk, ireq->ir_loc_addr);
	newinet->inet_saddr	= ireq->ir_loc_addr;
	RCU_INIT_POINTER(newinet->inet_opt, rcu_dereference(ireq->ireq_opt));
	newinet->mc_index  = inet_iif(skb);
	newinet->mc_ttl	   = ip_hdr(skb)->ttl;
+3 −6
Original line number Diff line number Diff line
@@ -365,6 +365,9 @@ static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
	ireq = inet_rsk(req);
	ireq->ir_v6_rmt_addr = ipv6_hdr(skb)->saddr;
	ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr;
	ireq->ir_rmt_addr = LOOPBACK4_IPV6;
	ireq->ir_loc_addr = LOOPBACK4_IPV6;

	ireq->ireq_family = AF_INET6;
	ireq->ir_mark = inet_request_mark(sk, skb);

@@ -504,10 +507,7 @@ static struct sock *dccp_v6_request_recv_sock(const struct sock *sk,

	memcpy(newnp, np, sizeof(struct ipv6_pinfo));

	newsk->sk_v6_daddr	= ireq->ir_v6_rmt_addr;
	newnp->saddr		= ireq->ir_v6_loc_addr;
	newsk->sk_v6_rcv_saddr	= ireq->ir_v6_loc_addr;
	newsk->sk_bound_dev_if	= ireq->ir_iif;

	/* Now IPv6 options...

@@ -546,9 +546,6 @@ static struct sock *dccp_v6_request_recv_sock(const struct sock *sk,

	dccp_sync_mss(newsk, dst_mtu(dst));

	newinet->inet_daddr = newinet->inet_saddr = LOOPBACK4_IPV6;
	newinet->inet_rcv_saddr = LOOPBACK4_IPV6;

	if (__inet_inherit_port(sk, newsk) < 0) {
		inet_csk_prepare_forced_close(newsk);
		dccp_done(newsk);
+43 −23
Original line number Diff line number Diff line
@@ -1237,17 +1237,34 @@ struct sock *inet_csk_clone_lock(const struct sock *sk,
				 const gfp_t priority)
{
	struct sock *newsk = sk_clone_lock(sk, priority);
	struct inet_connection_sock *newicsk;
	struct inet_request_sock *ireq;
	struct inet_sock *newinet;

	if (newsk) {
		struct inet_connection_sock *newicsk = inet_csk(newsk);
	if (!newsk)
		return NULL;

	newicsk = inet_csk(newsk);
	newinet = inet_sk(newsk);
	ireq = inet_rsk(req);

		inet_sk_set_state(newsk, TCP_SYN_RECV);
	newicsk->icsk_bind_hash = NULL;
	newicsk->icsk_bind2_hash = NULL;

		inet_sk(newsk)->inet_dport = inet_rsk(req)->ir_rmt_port;
		inet_sk(newsk)->inet_num = inet_rsk(req)->ir_num;
		inet_sk(newsk)->inet_sport = htons(inet_rsk(req)->ir_num);
	newinet->inet_dport = ireq->ir_rmt_port;
	newinet->inet_num = ireq->ir_num;
	newinet->inet_sport = htons(ireq->ir_num);

	newsk->sk_bound_dev_if = ireq->ir_iif;

	newsk->sk_daddr = ireq->ir_rmt_addr;
	newsk->sk_rcv_saddr = ireq->ir_loc_addr;
	newinet->inet_saddr = ireq->ir_loc_addr;

#if IS_ENABLED(CONFIG_IPV6)
	newsk->sk_v6_daddr = ireq->ir_v6_rmt_addr;
	newsk->sk_v6_rcv_saddr = ireq->ir_v6_loc_addr;
#endif

	/* listeners have SOCK_RCU_FREE, not the children */
	sock_reset_flag(newsk, SOCK_RCU_FREE);
@@ -1264,12 +1281,15 @@ struct sock *inet_csk_clone_lock(const struct sock *sk,
	newicsk->icsk_probes_tstamp = 0;

	/* Deinitialize accept_queue to trap illegal accesses. */
		memset(&newicsk->icsk_accept_queue, 0, sizeof(newicsk->icsk_accept_queue));
	memset(&newicsk->icsk_accept_queue, 0,
	       sizeof(newicsk->icsk_accept_queue));

	inet_sk_set_state(newsk, TCP_SYN_RECV);

	inet_clone_ulp(req, newsk, priority);

	security_inet_csk_clone(newsk, req);
	}

	return newsk;
}
EXPORT_SYMBOL_GPL(inet_csk_clone_lock);
+0 −4
Original line number Diff line number Diff line
@@ -1768,10 +1768,6 @@ struct sock *tcp_v4_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,
	newtp		      = tcp_sk(newsk);
	newinet		      = inet_sk(newsk);
	ireq		      = inet_rsk(req);
	sk_daddr_set(newsk, ireq->ir_rmt_addr);
	sk_rcv_saddr_set(newsk, ireq->ir_loc_addr);
	newsk->sk_bound_dev_if = ireq->ir_iif;
	newinet->inet_saddr   = ireq->ir_loc_addr;
	inet_opt	      = rcu_dereference(ireq->ireq_opt);
	RCU_INIT_POINTER(newinet->inet_opt, inet_opt);
	newinet->mc_index     = inet_iif(skb);
+2 −6
Original line number Diff line number Diff line
@@ -798,6 +798,8 @@ static void tcp_v6_init_req(struct request_sock *req,

	ireq->ir_v6_rmt_addr = ipv6_hdr(skb)->saddr;
	ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr;
	ireq->ir_rmt_addr = LOOPBACK4_IPV6;
	ireq->ir_loc_addr = LOOPBACK4_IPV6;

	/* So that link locals have meaning */
	if ((!sk_listener->sk_bound_dev_if || l3_slave) &&
@@ -1451,10 +1453,7 @@ static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *

	ip6_dst_store(newsk, dst, NULL, NULL);

	newsk->sk_v6_daddr = ireq->ir_v6_rmt_addr;
	newnp->saddr = ireq->ir_v6_loc_addr;
	newsk->sk_v6_rcv_saddr = ireq->ir_v6_loc_addr;
	newsk->sk_bound_dev_if = ireq->ir_iif;

	/* Now IPv6 options...

@@ -1507,9 +1506,6 @@ static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *

	tcp_initialize_rcv_mss(newsk);

	newinet->inet_daddr = newinet->inet_saddr = LOOPBACK4_IPV6;
	newinet->inet_rcv_saddr = LOOPBACK4_IPV6;

#ifdef CONFIG_TCP_MD5SIG
	l3index = l3mdev_master_ifindex_by_index(sock_net(sk), ireq->ir_iif);