diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2006-06-14 01:33:04 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-06-18 00:30:53 -0400 |
commit | 35089bb203f44e33b6bbb6c4de0b0708f9a48921 (patch) | |
tree | 3e9ca3dbc12a063121c3ecba2558400307d4acd5 | |
parent | 9e1881dec9e3e8f8408551cddfda489857a7ec99 (diff) |
[TCP]: Add tcp_slow_start_after_idle sysctl.
A lot of people have asked for a way to disable tcp_cwnd_restart(),
and it seems reasonable to add a sysctl to do that.
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | Documentation/networking/ip-sysctl.txt | 7 | ||||
-rw-r--r-- | include/linux/sysctl.h | 1 | ||||
-rw-r--r-- | include/net/tcp.h | 1 | ||||
-rw-r--r-- | net/ipv4/sysctl_net_ipv4.c | 8 | ||||
-rw-r--r-- | net/ipv4/tcp_output.c | 6 |
5 files changed, 22 insertions, 1 deletions
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index f12007b80a46..d46338af6002 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt | |||
@@ -362,6 +362,13 @@ tcp_workaround_signed_windows - BOOLEAN | |||
362 | not receive a window scaling option from them. | 362 | not receive a window scaling option from them. |
363 | Default: 0 | 363 | Default: 0 |
364 | 364 | ||
365 | tcp_slow_start_after_idle - BOOLEAN | ||
366 | If set, provide RFC2861 behavior and time out the congestion | ||
367 | window after an idle period. An idle period is defined at | ||
368 | the current RTO. If unset, the congestion window will not | ||
369 | be timed out after an idle period. | ||
370 | Default: 1 | ||
371 | |||
365 | IP Variables: | 372 | IP Variables: |
366 | 373 | ||
367 | ip_local_port_range - 2 INTEGERS | 374 | ip_local_port_range - 2 INTEGERS |
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 98338ed2c0b6..cee944dbdcd4 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h | |||
@@ -405,6 +405,7 @@ enum | |||
405 | NET_TCP_BASE_MSS=114, | 405 | NET_TCP_BASE_MSS=114, |
406 | NET_IPV4_TCP_WORKAROUND_SIGNED_WINDOWS=115, | 406 | NET_IPV4_TCP_WORKAROUND_SIGNED_WINDOWS=115, |
407 | NET_TCP_DMA_COPYBREAK=116, | 407 | NET_TCP_DMA_COPYBREAK=116, |
408 | NET_TCP_SLOW_START_AFTER_IDLE=117, | ||
408 | }; | 409 | }; |
409 | 410 | ||
410 | enum { | 411 | enum { |
diff --git a/include/net/tcp.h b/include/net/tcp.h index de88c5472bfc..bfc71f954bbe 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -227,6 +227,7 @@ extern int sysctl_tcp_abc; | |||
227 | extern int sysctl_tcp_mtu_probing; | 227 | extern int sysctl_tcp_mtu_probing; |
228 | extern int sysctl_tcp_base_mss; | 228 | extern int sysctl_tcp_base_mss; |
229 | extern int sysctl_tcp_workaround_signed_windows; | 229 | extern int sysctl_tcp_workaround_signed_windows; |
230 | extern int sysctl_tcp_slow_start_after_idle; | ||
230 | 231 | ||
231 | extern atomic_t tcp_memory_allocated; | 232 | extern atomic_t tcp_memory_allocated; |
232 | extern atomic_t tcp_sockets_allocated; | 233 | extern atomic_t tcp_sockets_allocated; |
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index e7fb665873c6..ce4cd5f35511 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c | |||
@@ -690,6 +690,14 @@ ctl_table ipv4_table[] = { | |||
690 | .proc_handler = &proc_dointvec | 690 | .proc_handler = &proc_dointvec |
691 | }, | 691 | }, |
692 | #endif | 692 | #endif |
693 | { | ||
694 | .ctl_name = NET_TCP_SLOW_START_AFTER_IDLE, | ||
695 | .procname = "tcp_slow_start_after_idle", | ||
696 | .data = &sysctl_tcp_slow_start_after_idle, | ||
697 | .maxlen = sizeof(int), | ||
698 | .mode = 0644, | ||
699 | .proc_handler = &proc_dointvec | ||
700 | }, | ||
693 | { .ctl_name = 0 } | 701 | { .ctl_name = 0 } |
694 | }; | 702 | }; |
695 | 703 | ||
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index f33c9dddaa12..07bb5a2b375e 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -59,6 +59,9 @@ int sysctl_tcp_tso_win_divisor = 3; | |||
59 | int sysctl_tcp_mtu_probing = 0; | 59 | int sysctl_tcp_mtu_probing = 0; |
60 | int sysctl_tcp_base_mss = 512; | 60 | int sysctl_tcp_base_mss = 512; |
61 | 61 | ||
62 | /* By default, RFC2861 behavior. */ | ||
63 | int sysctl_tcp_slow_start_after_idle = 1; | ||
64 | |||
62 | static void update_send_head(struct sock *sk, struct tcp_sock *tp, | 65 | static void update_send_head(struct sock *sk, struct tcp_sock *tp, |
63 | struct sk_buff *skb) | 66 | struct sk_buff *skb) |
64 | { | 67 | { |
@@ -138,7 +141,8 @@ static void tcp_event_data_sent(struct tcp_sock *tp, | |||
138 | struct inet_connection_sock *icsk = inet_csk(sk); | 141 | struct inet_connection_sock *icsk = inet_csk(sk); |
139 | const u32 now = tcp_time_stamp; | 142 | const u32 now = tcp_time_stamp; |
140 | 143 | ||
141 | if (!tp->packets_out && (s32)(now - tp->lsndtime) > icsk->icsk_rto) | 144 | if (sysctl_tcp_slow_start_after_idle && |
145 | (!tp->packets_out && (s32)(now - tp->lsndtime) > icsk->icsk_rto)) | ||
142 | tcp_cwnd_restart(sk, __sk_dst_get(sk)); | 146 | tcp_cwnd_restart(sk, __sk_dst_get(sk)); |
143 | 147 | ||
144 | tp->lsndtime = now; | 148 | tp->lsndtime = now; |