Message ID | 4B138C73.8040401@gmail.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Eric Dumazet <eric.dumazet@gmail.com> Date: Mon, 30 Nov 2009 10:12:19 +0100 > [PATCH] tcp: tcp_disconnect() should clear window_clamp > > NFS can reuse its TCP socket after calling tcp_disconnect(). > We noticed window scaling was not negotiated in SYN packet of next connection request. > > Fix is to clear tp->window_clamp in tcp_disconnect(). > > Reported-by: Krzysztof Oledzki <ole@ans.pl> > Tested-by: Krzysztof Oledzki <ole@ans.pl> > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Applied, thanks Eric. You voiced some concerns about window clamp route and socket settings and whatnot. But I think the route side should be OK. When a new connect() occurs, TCP will reinitialize the window clamp setting based upon the route metric and other values. The TCP_WINDOW_CLAMP socket option case is tedious however. If we want to preserve such settings across disconnect operations we'll need to store two pieces of state I believe. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index f1813bc..d7a884c 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -2059,6 +2059,7 @@ int tcp_disconnect(struct sock *sk, int flags) tp->snd_ssthresh = TCP_INFINITE_SSTHRESH; tp->snd_cwnd_cnt = 0; tp->bytes_acked = 0; + tp->window_clamp = 0; tcp_set_ca_state(sk, TCP_CA_Open); tcp_clear_retrans(tp); inet_csk_delack_init(sk)