diff options
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 14 | ||||
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 7 | 
2 files changed, 14 insertions, 7 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 4a8ec457310..d09203c6326 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -274,13 +274,6 @@ static void tcp_v4_mtu_reduced(struct sock *sk)  	struct inet_sock *inet = inet_sk(sk);  	u32 mtu = tcp_sk(sk)->mtu_info; -	/* We are not interested in TCP_LISTEN and open_requests (SYN-ACKs -	 * send out by Linux are always <576bytes so they should go through -	 * unfragmented). -	 */ -	if (sk->sk_state == TCP_LISTEN) -		return; -  	dst = inet_csk_update_pmtu(sk, mtu);  	if (!dst)  		return; @@ -408,6 +401,13 @@ void tcp_v4_err(struct sk_buff *icmp_skb, u32 info)  			goto out;  		if (code == ICMP_FRAG_NEEDED) { /* PMTU discovery (RFC1191) */ +			/* We are not interested in TCP_LISTEN and open_requests +			 * (SYN-ACKs send out by Linux are always <576bytes so +			 * they should go through unfragmented). +			 */ +			if (sk->sk_state == TCP_LISTEN) +				goto out; +  			tp->mtu_info = info;  			if (!sock_owned_by_user(sk)) {  				tcp_v4_mtu_reduced(sk); diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 9b6460055df..f6d629fd6ae 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -389,6 +389,13 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,  	}  	if (type == ICMPV6_PKT_TOOBIG) { +		/* We are not interested in TCP_LISTEN and open_requests +		 * (SYN-ACKs send out by Linux are always <576bytes so +		 * they should go through unfragmented). +		 */ +		if (sk->sk_state == TCP_LISTEN) +			goto out; +  		tp->mtu_info = ntohl(info);  		if (!sock_owned_by_user(sk))  			tcp_v6_mtu_reduced(sk);  |