diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 51 | 
1 files changed, 20 insertions, 31 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 9a89b8deafae..7482b5d11861 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -94,12 +94,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, u32 *tsoff) +static u32 tcp_v4_init_seq_and_tsoff(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, tsoff); +	return secure_tcp_seq_and_tsoff(ip_hdr(skb)->daddr, +					ip_hdr(skb)->saddr, +					tcp_hdr(skb)->dest, +					tcp_hdr(skb)->source, tsoff);  }  int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp) @@ -198,10 +198,6 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)  			tp->write_seq	   = 0;  	} -	if (tcp_death_row->sysctl_tw_recycle && -	    !tp->rx_opt.ts_recent_stamp && fl4->daddr == daddr) -		tcp_fetch_timewait_stamp(sk, &rt->dst); -  	inet->inet_dport = usin->sin_port;  	sk_daddr_set(sk, daddr); @@ -236,11 +232,11 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)  	rt = NULL;  	if (likely(!tp->repair)) { -		seq = secure_tcp_sequence_number(inet->inet_saddr, -						 inet->inet_daddr, -						 inet->inet_sport, -						 usin->sin_port, -						 &tp->tsoffset); +		seq = secure_tcp_seq_and_tsoff(inet->inet_saddr, +					       inet->inet_daddr, +					       inet->inet_sport, +					       usin->sin_port, +					       &tp->tsoffset);  		if (!tp->write_seq)  			tp->write_seq = seq;  	} @@ -279,10 +275,13 @@ EXPORT_SYMBOL(tcp_v4_connect);   */  void tcp_v4_mtu_reduced(struct sock *sk)  { -	struct dst_entry *dst;  	struct inet_sock *inet = inet_sk(sk); -	u32 mtu = tcp_sk(sk)->mtu_info; +	struct dst_entry *dst; +	u32 mtu; +	if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE)) +		return; +	mtu = tcp_sk(sk)->mtu_info;  	dst = inet_csk_update_pmtu(sk, mtu);  	if (!dst)  		return; @@ -428,7 +427,8 @@ void tcp_v4_err(struct sk_buff *icmp_skb, u32 info)  	switch (type) {  	case ICMP_REDIRECT: -		do_redirect(icmp_skb, sk); +		if (!sock_owned_by_user(sk)) +			do_redirect(icmp_skb, sk);  		goto out;  	case ICMP_SOURCE_QUENCH:  		/* Just silently ignore these. */ @@ -1213,19 +1213,9 @@ static void tcp_v4_init_req(struct request_sock *req,  static struct dst_entry *tcp_v4_route_req(const struct sock *sk,  					  struct flowi *fl, -					  const struct request_sock *req, -					  bool *strict) +					  const struct request_sock *req)  { -	struct dst_entry *dst = inet_csk_route_req(sk, &fl->u.ip4, req); - -	if (strict) { -		if (fl->u.ip4.daddr == inet_rsk(req)->ir_rmt_addr) -			*strict = true; -		else -			*strict = false; -	} - -	return dst; +	return inet_csk_route_req(sk, &fl->u.ip4, req);  }  struct request_sock_ops tcp_request_sock_ops __read_mostly = { @@ -1249,7 +1239,7 @@ static const struct tcp_request_sock_ops tcp_request_sock_ipv4_ops = {  	.cookie_init_seq =	cookie_v4_init_sequence,  #endif  	.route_req	=	tcp_v4_route_req, -	.init_seq	=	tcp_v4_init_sequence, +	.init_seq_tsoff	=	tcp_v4_init_seq_and_tsoff,  	.send_synack	=	tcp_v4_send_synack,  }; @@ -2462,7 +2452,6 @@ static int __net_init tcp_sk_init(struct net *net)  	net->ipv4.sysctl_tcp_tw_reuse = 0;  	cnt = tcp_hashinfo.ehash_mask + 1; -	net->ipv4.tcp_death_row.sysctl_tw_recycle = 0;  	net->ipv4.tcp_death_row.sysctl_max_tw_buckets = (cnt + 1) / 2;  	net->ipv4.tcp_death_row.hashinfo = &tcp_hashinfo;  | 
