diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index d31a4f5d25e80b232a10cfbc4034d0e31a20ac0a..fbde146d07c14a613c583da2bf810e9a599cc110 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -2601,6 +2601,9 @@ int tcp_disconnect(struct sock *sk, int flags) tp->window_clamp = 0; tp->delivered = 0; tp->delivered_ce = 0; + if (icsk->icsk_ca_ops->release) + icsk->icsk_ca_ops->release(sk); + memset(icsk->icsk_ca_priv, 0, sizeof(icsk->icsk_ca_priv)); tcp_set_ca_state(sk, TCP_CA_Open); tp->is_sack_reneg = 0; tcp_clear_retrans(tp); diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index 48f79db446a02a57db9afc5a9e01fa1cd069316f..32c3162baf3e796b25198df0c2e17cf779d4fa77 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c @@ -196,7 +196,7 @@ static void tcp_reinit_congestion_control(struct sock *sk, icsk->icsk_ca_setsockopt = 1; memset(icsk->icsk_ca_priv, 0, sizeof(icsk->icsk_ca_priv)); - if (sk->sk_state != TCP_CLOSE) + if (!((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) tcp_init_congestion_control(sk); }