Forgot the patch..
Angelo P. Castellani ha scritto:
From: Angelo P. Castellani <[EMAIL PROTECTED]>
RFC3742: limited slow start
See http://www.ietf.org/rfc/rfc3742.txt
Signed-off-by: Angelo P. Castellani <[EMAIL PROTECTED]>
---
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.