|
@@ -173,6 +173,10 @@ out:
|
|
*/
|
|
*/
|
|
if (ca->get_info)
|
|
if (ca->get_info)
|
|
memset(icsk->icsk_ca_priv, 0, sizeof(icsk->icsk_ca_priv));
|
|
memset(icsk->icsk_ca_priv, 0, sizeof(icsk->icsk_ca_priv));
|
|
|
|
+ if (ca->flags & TCP_CONG_NEEDS_ECN)
|
|
|
|
+ INET_ECN_xmit(sk);
|
|
|
|
+ else
|
|
|
|
+ INET_ECN_dontxmit(sk);
|
|
}
|
|
}
|
|
|
|
|
|
void tcp_init_congestion_control(struct sock *sk)
|
|
void tcp_init_congestion_control(struct sock *sk)
|
|
@@ -181,6 +185,10 @@ void tcp_init_congestion_control(struct sock *sk)
|
|
|
|
|
|
if (icsk->icsk_ca_ops->init)
|
|
if (icsk->icsk_ca_ops->init)
|
|
icsk->icsk_ca_ops->init(sk);
|
|
icsk->icsk_ca_ops->init(sk);
|
|
|
|
+ if (tcp_ca_needs_ecn(sk))
|
|
|
|
+ INET_ECN_xmit(sk);
|
|
|
|
+ else
|
|
|
|
+ INET_ECN_dontxmit(sk);
|
|
}
|
|
}
|
|
|
|
|
|
static void tcp_reinit_congestion_control(struct sock *sk,
|
|
static void tcp_reinit_congestion_control(struct sock *sk,
|
|
@@ -192,8 +200,8 @@ static void tcp_reinit_congestion_control(struct sock *sk,
|
|
icsk->icsk_ca_ops = ca;
|
|
icsk->icsk_ca_ops = ca;
|
|
icsk->icsk_ca_setsockopt = 1;
|
|
icsk->icsk_ca_setsockopt = 1;
|
|
|
|
|
|
- if (sk->sk_state != TCP_CLOSE && icsk->icsk_ca_ops->init)
|
|
|
|
- icsk->icsk_ca_ops->init(sk);
|
|
|
|
|
|
+ if (sk->sk_state != TCP_CLOSE)
|
|
|
|
+ tcp_init_congestion_control(sk);
|
|
}
|
|
}
|
|
|
|
|
|
/* Manage refcounts on socket close. */
|
|
/* Manage refcounts on socket close. */
|