diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 18 | 
1 files changed, 10 insertions, 8 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index fd365de4d5ff..2dbdc26da86e 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -307,11 +307,12 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)  						  inet->inet_daddr,  						  inet->inet_sport,  						  usin->sin_port)); -		tp->tsoffset = secure_tcp_ts_off(net, inet->inet_saddr, -						 inet->inet_daddr); +		WRITE_ONCE(tp->tsoffset, +			   secure_tcp_ts_off(net, inet->inet_saddr, +					     inet->inet_daddr));  	} -	inet->inet_id = get_random_u16(); +	atomic_set(&inet->inet_id, get_random_u16());  	if (tcp_fastopen_defer_connect(sk, &err))  		return err; @@ -930,9 +931,9 @@ static void tcp_v4_send_ack(const struct sock *sk,  	ctl_sk = this_cpu_read(ipv4_tcp_sk);  	sock_net_set(ctl_sk, net);  	ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ? -			   inet_twsk(sk)->tw_mark : sk->sk_mark; +			   inet_twsk(sk)->tw_mark : READ_ONCE(sk->sk_mark);  	ctl_sk->sk_priority = (sk->sk_state == TCP_TIME_WAIT) ? -			   inet_twsk(sk)->tw_priority : sk->sk_priority; +			   inet_twsk(sk)->tw_priority : READ_ONCE(sk->sk_priority);  	transmit_time = tcp_transmit_time(sk);  	ip_send_unicast_reply(ctl_sk,  			      skb, &TCP_SKB_CB(skb)->header.h4.opt, @@ -988,11 +989,12 @@ static void tcp_v4_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb,  			tcp_rsk(req)->rcv_nxt,  			req->rsk_rcv_wnd >> inet_rsk(req)->rcv_wscale,  			tcp_time_stamp_raw() + tcp_rsk(req)->ts_off, -			req->ts_recent, +			READ_ONCE(req->ts_recent),  			0,  			tcp_md5_do_lookup(sk, l3index, addr, AF_INET),  			inet_rsk(req)->no_srccheck ? IP_REPLY_ARG_NOSRCCHECK : 0, -			ip_hdr(skb)->tos, tcp_rsk(req)->txhash); +			ip_hdr(skb)->tos, +			READ_ONCE(tcp_rsk(req)->txhash));  }  /* @@ -1594,7 +1596,7 @@ struct sock *tcp_v4_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,  	inet_csk(newsk)->icsk_ext_hdr_len = 0;  	if (inet_opt)  		inet_csk(newsk)->icsk_ext_hdr_len = inet_opt->opt.optlen; -	newinet->inet_id = get_random_u16(); +	atomic_set(&newinet->inet_id, get_random_u16());  	/* Set ToS of the new socket based upon the value of incoming SYN.  	 * ECT bits are set later in tcp_init_transfer().  | 
