diff options
Diffstat (limited to 'net/ipv4/tcp_minisocks.c')
| -rw-r--r-- | net/ipv4/tcp_minisocks.c | 9 | 
1 files changed, 9 insertions, 0 deletions
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index ad3b56d9fa71..7e40322cc5ec 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c @@ -548,6 +548,8 @@ struct sock *tcp_create_openreq_child(const struct sock *sk,  	newtp->fastopen_req = NULL;  	RCU_INIT_POINTER(newtp->fastopen_rsk, NULL); +	tcp_bpf_clone(sk, newsk); +  	__TCP_INC_STATS(sock_net(sk), TCP_MIB_PASSIVEOPENS);  	return newsk; @@ -772,6 +774,12 @@ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,  	if (!child)  		goto listen_overflow; +	if (own_req && sk_is_mptcp(child) && mptcp_sk_is_subflow(child)) { +		reqsk_queue_removed(&inet_csk(sk)->icsk_accept_queue, req); +		inet_csk_reqsk_queue_drop_and_put(sk, req); +		return child; +	} +  	sock_rps_save_rxhash(child, skb);  	tcp_synack_rtt_meas(child, req);  	*req_stolen = !own_req; @@ -817,6 +825,7 @@ EXPORT_SYMBOL(tcp_check_req);  int tcp_child_process(struct sock *parent, struct sock *child,  		      struct sk_buff *skb) +	__releases(&((child)->sk_lock.slock))  {  	int ret = 0;  	int state = child->sk_state;  |