diff options
Diffstat (limited to 'net/ipv4/tcp_input.c')
| -rw-r--r-- | net/ipv4/tcp_input.c | 5 | 
1 files changed, 5 insertions, 0 deletions
| diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 454362e359da..e37488d3453f 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -238,9 +238,14 @@ static void tcp_measure_rcv_mss(struct sock *sk, const struct sk_buff *skb)  		 */  		if (unlikely(len != icsk->icsk_ack.rcv_mss)) {  			u64 val = (u64)skb->len << TCP_RMEM_TO_WIN_SCALE; +			u8 old_ratio = tcp_sk(sk)->scaling_ratio;  			do_div(val, skb->truesize);  			tcp_sk(sk)->scaling_ratio = val ? val : 1; + +			if (old_ratio != tcp_sk(sk)->scaling_ratio) +				WRITE_ONCE(tcp_sk(sk)->window_clamp, +					   tcp_win_from_space(sk, sk->sk_rcvbuf));  		}  		icsk->icsk_ack.rcv_mss = min_t(unsigned int, len,  					       tcp_sk(sk)->advmss); |