[TCP]: Add tcp_slow_start_after_idle sysctl.
authorDavid S. Miller <davem@sunset.davemloft.net>
Wed, 14 Jun 2006 05:33:04 +0000 (22:33 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Sun, 18 Jun 2006 04:30:53 +0000 (21:30 -0700)
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>
Documentation/networking/ip-sysctl.txt
include/linux/sysctl.h
include/net/tcp.h
net/ipv4/sysctl_net_ipv4.c
net/ipv4/tcp_output.c

index f12007b80a466e33fad7efb03dfe7e4f20913462..d46338af6002997b0593d4875a6aee825c77126f 100644 (file)
@@ -362,6 +362,13 @@ tcp_workaround_signed_windows - BOOLEAN
        not receive a window scaling option from them.
        Default: 0
 
+tcp_slow_start_after_idle - BOOLEAN
+       If set, provide RFC2861 behavior and time out the congestion
+       window after an idle period.  An idle period is defined at
+       the current RTO.  If unset, the congestion window will not
+       be timed out after an idle period.
+       Default: 1
+
 IP Variables:
 
 ip_local_port_range - 2 INTEGERS
index 98338ed2c0b64912847e3d265117589eda9e1d37..cee944dbdcd42539d0af3e322e769882f6da56ad 100644 (file)
@@ -405,6 +405,7 @@ enum
        NET_TCP_BASE_MSS=114,
        NET_IPV4_TCP_WORKAROUND_SIGNED_WINDOWS=115,
        NET_TCP_DMA_COPYBREAK=116,
+       NET_TCP_SLOW_START_AFTER_IDLE=117,
 };
 
 enum {
index de88c5472bfc4271fbd22018581d20e255d2d21c..bfc71f954bbe6ecbf8f81659fd60da38a9759558 100644 (file)
@@ -227,6 +227,7 @@ extern int sysctl_tcp_abc;
 extern int sysctl_tcp_mtu_probing;
 extern int sysctl_tcp_base_mss;
 extern int sysctl_tcp_workaround_signed_windows;
+extern int sysctl_tcp_slow_start_after_idle;
 
 extern atomic_t tcp_memory_allocated;
 extern atomic_t tcp_sockets_allocated;
index e7fb665873c68526686b18fca76ba25db3271993..ce4cd5f355116e2d0d30e96aff51a2f6f2c0e90f 100644 (file)
@@ -690,6 +690,14 @@ ctl_table ipv4_table[] = {
                .proc_handler   = &proc_dointvec
        },
 #endif
+       {
+               .ctl_name       = NET_TCP_SLOW_START_AFTER_IDLE,
+               .procname       = "tcp_slow_start_after_idle",
+               .data           = &sysctl_tcp_slow_start_after_idle,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec
+       },
        { .ctl_name = 0 }
 };
 
index f33c9dddaa125b44a17291018867cd622838e3c8..07bb5a2b375ec0b02e1be3774a474fbeae24a808 100644 (file)
@@ -59,6 +59,9 @@ int sysctl_tcp_tso_win_divisor = 3;
 int sysctl_tcp_mtu_probing = 0;
 int sysctl_tcp_base_mss = 512;
 
+/* By default, RFC2861 behavior.  */
+int sysctl_tcp_slow_start_after_idle = 1;
+
 static void update_send_head(struct sock *sk, struct tcp_sock *tp,
                             struct sk_buff *skb)
 {
@@ -138,7 +141,8 @@ static void tcp_event_data_sent(struct tcp_sock *tp,
        struct inet_connection_sock *icsk = inet_csk(sk);
        const u32 now = tcp_time_stamp;
 
-       if (!tp->packets_out && (s32)(now - tp->lsndtime) > icsk->icsk_rto)
+       if (sysctl_tcp_slow_start_after_idle &&
+           (!tp->packets_out && (s32)(now - tp->lsndtime) > icsk->icsk_rto))
                tcp_cwnd_restart(sk, __sk_dst_get(sk));
 
        tp->lsndtime = now;