aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
authorEric Dumazet <eric.dumazet@gmail.com>2011-11-29 20:02:41 -0500
committerDavid S. Miller <davem@davemloft.net>2011-11-30 16:55:26 -0500
commitd8a6e65f8b6b6b0142ebab578472906d89d63657 (patch)
treea0231b1aa1c44252c79c9cb769bd0695e021f1b6 /net/ipv4
parentde565664041d954b60f87e3d576a784cf25672d0 (diff)
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')
-rw-r--r--net/ipv4/tcp_ipv4.c1
-rw-r--r--net/ipv4/tcp_minisocks.c4
2 files changed, 4 insertions, 1 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index a9db4b1a2215..c4b8b09db9f5 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1511,6 +1511,7 @@ exit:
1511 return NULL; 1511 return NULL;
1512put_and_exit: 1512put_and_exit:
1513 tcp_clear_xmit_timers(newsk); 1513 tcp_clear_xmit_timers(newsk);
1514 tcp_cleanup_congestion_control(newsk);
1514 bh_unlock_sock(newsk); 1515 bh_unlock_sock(newsk);
1515 sock_put(newsk); 1516 sock_put(newsk);
1516 goto exit; 1517 goto exit;
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,
495 newtp->frto_counter = 0; 495 newtp->frto_counter = 0;
496 newtp->frto_highmark = 0; 496 newtp->frto_highmark = 0;
497 497
498 newicsk->icsk_ca_ops = &tcp_init_congestion_ops; 498 if (newicsk->icsk_ca_ops != &tcp_init_congestion_ops &&
499 !try_module_get(newicsk->icsk_ca_ops->owner))
500 newicsk->icsk_ca_ops = &tcp_init_congestion_ops;
499 501
500 tcp_set_ca_state(newsk, TCP_CA_Open); 502 tcp_set_ca_state(newsk, TCP_CA_Open);
501 tcp_init_xmit_timers(newsk); 503 tcp_init_xmit_timers(newsk);