Skip to content

Commit

Permalink
[TCP]: Congestion control initialization.
Browse files Browse the repository at this point in the history
Change to defer congestion control initialization.

If setsockopt() was used to change TCP_CONGESTION before
connection is established, then protocols that use sequence numbers
to keep track of one RTT interval (vegas, illinois, ...) get confused.

Change the init hook to be called after handshake.

Signed-off-by: Stephen Hemminger <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Stephen Hemminger authored and davem330 committed Apr 24, 2007
1 parent c445a31 commit 4d4d3d1
Showing 1 changed file with 13 additions and 10 deletions.
23 changes: 13 additions & 10 deletions net/ipv4/tcp_cong.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,18 +77,19 @@ void tcp_init_congestion_control(struct sock *sk)
struct inet_connection_sock *icsk = inet_csk(sk);
struct tcp_congestion_ops *ca;

if (icsk->icsk_ca_ops != &tcp_init_congestion_ops)
return;
/* if no choice made yet assign the current value set as default */
if (icsk->icsk_ca_ops == &tcp_init_congestion_ops) {
rcu_read_lock();
list_for_each_entry_rcu(ca, &tcp_cong_list, list) {
if (try_module_get(ca->owner)) {
icsk->icsk_ca_ops = ca;
break;
}

rcu_read_lock();
list_for_each_entry_rcu(ca, &tcp_cong_list, list) {
if (try_module_get(ca->owner)) {
icsk->icsk_ca_ops = ca;
break;
/* fallback to next available */
}

rcu_read_unlock();
}
rcu_read_unlock();

if (icsk->icsk_ca_ops->init)
icsk->icsk_ca_ops->init(sk);
Expand Down Expand Up @@ -236,6 +237,7 @@ int tcp_set_congestion_control(struct sock *sk, const char *name)

rcu_read_lock();
ca = tcp_ca_find(name);

/* no change asking for existing value */
if (ca == icsk->icsk_ca_ops)
goto out;
Expand All @@ -261,7 +263,8 @@ int tcp_set_congestion_control(struct sock *sk, const char *name)
else {
tcp_cleanup_congestion_control(sk);
icsk->icsk_ca_ops = ca;
if (icsk->icsk_ca_ops->init)

if (sk->sk_state != TCP_CLOSE && icsk->icsk_ca_ops->init)
icsk->icsk_ca_ops->init(sk);
}
out:
Expand Down

0 comments on commit 4d4d3d1

Please sign in to comment.