diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 26 | 
1 files changed, 15 insertions, 11 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 2259114c7242..30d81f533ada 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -95,12 +95,12 @@ static int tcp_v4_md5_hash_hdr(char *md5_hash, const struct tcp_md5sig_key *key,  struct inet_hashinfo tcp_hashinfo;  EXPORT_SYMBOL(tcp_hashinfo); -static  __u32 tcp_v4_init_sequence(const struct sk_buff *skb) +static u32 tcp_v4_init_sequence(const struct sk_buff *skb, u32 *tsoff)  {  	return secure_tcp_sequence_number(ip_hdr(skb)->daddr,  					  ip_hdr(skb)->saddr,  					  tcp_hdr(skb)->dest, -					  tcp_hdr(skb)->source); +					  tcp_hdr(skb)->source, tsoff);  }  int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp) @@ -237,7 +237,8 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)  		tp->write_seq = secure_tcp_sequence_number(inet->inet_saddr,  							   inet->inet_daddr,  							   inet->inet_sport, -							   usin->sin_port); +							   usin->sin_port, +							   &tp->tsoffset);  	inet->inet_id = tp->write_seq ^ jiffies; @@ -442,7 +443,7 @@ void tcp_v4_err(struct sk_buff *icmp_skb, u32 info)  			if (!sock_owned_by_user(sk)) {  				tcp_v4_mtu_reduced(sk);  			} else { -				if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED, &tp->tsq_flags)) +				if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED, &sk->sk_tsq_flags))  					sock_hold(sk);  			}  			goto out; @@ -691,6 +692,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)  		     offsetof(struct inet_timewait_sock, tw_bound_dev_if));  	arg.tos = ip_hdr(skb)->tos; +	arg.uid = sock_net_uid(net, sk && sk_fullsock(sk) ? sk : NULL);  	local_bh_disable();  	ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk),  			      skb, &TCP_SKB_CB(skb)->header.h4.opt, @@ -711,7 +713,7 @@ out:     outside socket context is ugly, certainly. What can I do?   */ -static void tcp_v4_send_ack(struct net *net, +static void tcp_v4_send_ack(const struct sock *sk,  			    struct sk_buff *skb, u32 seq, u32 ack,  			    u32 win, u32 tsval, u32 tsecr, int oif,  			    struct tcp_md5sig_key *key, @@ -726,6 +728,7 @@ static void tcp_v4_send_ack(struct net *net,  #endif  			];  	} rep; +	struct net *net = sock_net(sk);  	struct ip_reply_arg arg;  	memset(&rep.th, 0, sizeof(struct tcphdr)); @@ -775,6 +778,7 @@ static void tcp_v4_send_ack(struct net *net,  	if (oif)  		arg.bound_dev_if = oif;  	arg.tos = tos; +	arg.uid = sock_net_uid(net, sk_fullsock(sk) ? sk : NULL);  	local_bh_disable();  	ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk),  			      skb, &TCP_SKB_CB(skb)->header.h4.opt, @@ -790,7 +794,7 @@ static void tcp_v4_timewait_ack(struct sock *sk, struct sk_buff *skb)  	struct inet_timewait_sock *tw = inet_twsk(sk);  	struct tcp_timewait_sock *tcptw = tcp_twsk(sk); -	tcp_v4_send_ack(sock_net(sk), skb, +	tcp_v4_send_ack(sk, skb,  			tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,  			tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,  			tcp_time_stamp + tcptw->tw_ts_offset, @@ -818,10 +822,10 @@ static void tcp_v4_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb,  	 * exception of <SYN> segments, MUST be right-shifted by  	 * Rcv.Wind.Shift bits:  	 */ -	tcp_v4_send_ack(sock_net(sk), skb, seq, +	tcp_v4_send_ack(sk, skb, seq,  			tcp_rsk(req)->rcv_nxt,  			req->rsk_rcv_wnd >> inet_rsk(req)->rcv_wscale, -			tcp_time_stamp, +			tcp_time_stamp + tcp_rsk(req)->ts_off,  			req->ts_recent,  			0,  			tcp_md5_do_lookup(sk, (union tcp_md5_addr *)&ip_hdr(skb)->daddr, @@ -1908,7 +1912,7 @@ static void *listening_get_next(struct seq_file *seq, void *cur)  	if (!sk) {  get_head:  		ilb = &tcp_hashinfo.listening_hash[st->bucket]; -		spin_lock_bh(&ilb->lock); +		spin_lock(&ilb->lock);  		sk = sk_head(&ilb->head);  		st->offset = 0;  		goto get_sk; @@ -1925,7 +1929,7 @@ get_sk:  		if (sk->sk_family == st->family)  			return sk;  	} -	spin_unlock_bh(&ilb->lock); +	spin_unlock(&ilb->lock);  	st->offset = 0;  	if (++st->bucket < INET_LHTABLE_SIZE)  		goto get_head; @@ -2133,7 +2137,7 @@ static void tcp_seq_stop(struct seq_file *seq, void *v)  	switch (st->state) {  	case TCP_SEQ_STATE_LISTENING:  		if (v != SEQ_START_TOKEN) -			spin_unlock_bh(&tcp_hashinfo.listening_hash[st->bucket].lock); +			spin_unlock(&tcp_hashinfo.listening_hash[st->bucket].lock);  		break;  	case TCP_SEQ_STATE_ESTABLISHED:  		if (v)  |