I'd prefer to make it apply automatically across all congestion controls that do slow-start, and also make the max_ssthresh parameter controllable via sysctl. This patch (attached) should implement this. Note the default value for sysctl_tcp_max_ssthresh = 0, which disables limited slow-start. This should make ABC apply during LSS as well. Note the patch is compile-tested only! I can do some real testing if you'd like to apply this Dave. Thanks, -John Angelo P. Castellani wrote: > Forgot the patch.. > > Angelo P. Castellani ha scritto: >> From: Angelo P. Castellani >> >> RFC3742: limited slow start >> >> See http://www.ietf.org/rfc/rfc3742.txt >> >> Signed-off-by: Angelo P. Castellani >> --- >> >> To allow code reutilization I've added the limited slow start >> procedure as an exported symbol of linux tcp congestion control. >> >> On large BDP networks canonical slow start should be avoided because >> it requires large packet losses to converge, whereas at lower BDPs >> slow start and limited slow start are identical. Large BDP is defined >> through the max_ssthresh variable. >> >> I think limited slow start could safely replace the canonical slow >> start procedure in Linux. >> >> Regards, >> Angelo P. Castellani >> >> p.s.: in the attached patch is added an exported function currently >> used only by YeAH TCP >> >> include/net/tcp.h | 1 + >> net/ipv4/tcp_cong.c | 23 +++++++++++++++++++++++ >> 2 files changed, 24 insertions(+) >> >> > > > ------------------------------------------------------------------------ > > diff -uprN linux-2.6.20-a/include/net/tcp.h linux-2.6.20-c/include/net/tcp.h > --- linux-2.6.20-a/include/net/tcp.h 2007-02-04 19:44:54.000000000 +0100 > +++ linux-2.6.20-c/include/net/tcp.h 2007-02-19 10:54:10.000000000 +0100 > @@ -669,6 +669,7 @@ extern void tcp_get_allowed_congestion_c > extern int tcp_set_allowed_congestion_control(char *allowed); > extern int tcp_set_congestion_control(struct sock *sk, const char *name); > extern void tcp_slow_start(struct tcp_sock *tp); > +extern void tcp_limited_slow_start(struct tcp_sock *tp); > > extern struct tcp_congestion_ops tcp_init_congestion_ops; > extern u32 tcp_reno_ssthresh(struct sock *sk); > diff -uprN linux-2.6.20-a/net/ipv4/tcp_cong.c linux-2.6.20-c/net/ipv4/tcp_cong.c > --- linux-2.6.20-a/net/ipv4/tcp_cong.c 2007-02-04 19:44:54.000000000 +0100 > +++ linux-2.6.20-c/net/ipv4/tcp_cong.c 2007-02-19 10:54:10.000000000 +0100 > @@ -297,6 +297,29 @@ void tcp_slow_start(struct tcp_sock *tp) > } > EXPORT_SYMBOL_GPL(tcp_slow_start); > > +void tcp_limited_slow_start(struct tcp_sock *tp) > +{ > + /* RFC3742: limited slow start > + * the window is increased by 1/K MSS for each arriving ACK, > + * for K = int(cwnd/(0.5 max_ssthresh)) > + */ > + > + const int max_ssthresh = 100; > + > + if (max_ssthresh > 0 && tp->snd_cwnd > max_ssthresh) { > + u32 k = max(tp->snd_cwnd / (max_ssthresh >> 1), 1U); > + if (++tp->snd_cwnd_cnt >= k) { > + if (tp->snd_cwnd < tp->snd_cwnd_clamp) > + tp->snd_cwnd++; > + tp->snd_cwnd_cnt = 0; > + } > + } else { > + if (tp->snd_cwnd < tp->snd_cwnd_clamp) > + tp->snd_cwnd++; > + } > +} > +EXPORT_SYMBOL_GPL(tcp_limited_slow_start); > + > /* > * TCP Reno congestion control > * This is special case used for fallback as well.