diff options
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 10 | 
1 files changed, 3 insertions, 7 deletions
| diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 4c3605485b68..729faf8bd366 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -1272,15 +1272,10 @@ static void tcp_v6_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb,  	/* sk->sk_state == TCP_LISTEN -> for regular TCP_SYN_RECV  	 * sk->sk_state == TCP_SYN_RECV -> for Fast Open.  	 */ -	/* RFC 7323 2.3 -	 * The window field (SEG.WND) of every outgoing segment, with the -	 * exception of <SYN> segments, MUST be right-shifted by -	 * Rcv.Wind.Shift bits: -	 */  	tcp_v6_send_ack(sk, skb, (sk->sk_state == TCP_LISTEN) ?  			tcp_rsk(req)->snt_isn + 1 : tcp_sk(sk)->snd_nxt,  			tcp_rsk(req)->rcv_nxt, -			req->rsk_rcv_wnd >> inet_rsk(req)->rcv_wscale, +			tcp_synack_window(req) >> inet_rsk(req)->rcv_wscale,  			tcp_rsk_tsval(tcp_rsk(req)),  			READ_ONCE(req->ts_recent), sk->sk_bound_dev_if,  			&key, ipv6_get_dsfield(ipv6_hdr(skb)), 0, @@ -1444,7 +1439,6 @@ static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *  	 */  	newsk->sk_gso_type = SKB_GSO_TCPV6; -	ip6_dst_store(newsk, dst, NULL, NULL);  	inet6_sk_rx_dst_set(newsk, skb);  	inet_sk(newsk)->pinet6 = tcp_inet6_sk(newsk); @@ -1455,6 +1449,8 @@ static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *  	memcpy(newnp, np, sizeof(struct ipv6_pinfo)); +	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; |