diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2011-11-30 01:02:41 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-11-30 16:55:26 -0500 |
commit | d8a6e65f8b6b6b0142ebab578472906d89d63657 (patch) | |
tree | a0231b1aa1c44252c79c9cb769bd0695e021f1b6 /net/ipv4/tcp_minisocks.c | |
parent | de565664041d954b60f87e3d576a784cf25672d0 (diff) | |
download | linux-stable-d8a6e65f8b6b6b0142ebab578472906d89d63657.tar.gz linux-stable-d8a6e65f8b6b6b0142ebab578472906d89d63657.tar.bz2 linux-stable-d8a6e65f8b6b6b0142ebab578472906d89d63657.zip |
tcp: inherit listener congestion control for passive cnx
Rick Jones reported that TCP_CONGESTION sockopt performed on a listener
was ignored for its children sockets : right after accept() the
congestion control for new socket is the system default one.
This seems an oversight of the initial design (quoted from Stephen)
Based on prior investigation and patch from Rick.
Reported-by: Rick Jones <rick.jones2@hp.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Stephen Hemminger <shemminger@vyatta.com>
CC: Yuchung Cheng <ycheng@google.com>
Tested-by: Rick Jones <rick.jones2@hp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_minisocks.c')
-rw-r--r-- | net/ipv4/tcp_minisocks.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index 945efffdd929..9dc146e5ed65 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c @@ -495,7 +495,9 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req, newtp->frto_counter = 0; newtp->frto_highmark = 0; - newicsk->icsk_ca_ops = &tcp_init_congestion_ops; + if (newicsk->icsk_ca_ops != &tcp_init_congestion_ops && + !try_module_get(newicsk->icsk_ca_ops->owner)) + newicsk->icsk_ca_ops = &tcp_init_congestion_ops; tcp_set_ca_state(newsk, TCP_CA_Open); tcp_init_xmit_timers(newsk); |