In the TCP Compound article used as a reference for the implementation, we read:
"If a retransmission timeout occurs, dwnd should be reset to zero and
the delay-based component is disabled." at page 5 of
ftp://ftp.research.microsoft.com/pub/tr/TR-2005-86.pdf
The attached patch implements this requirement.
Regards,
Angelo P. Castellani
diff -urd a/net/ipv4/tcp_compound.c b/net/ipv4/tcp_compound.c
--- a/net/ipv4/tcp_compound.c 2006-07-05 17:19:28.000000000 +0200
+++ b/net/ipv4/tcp_compound.c 2006-07-05 17:20:42.000000000 +0200
@@ -221,12 +221,9 @@
tcp_compound_init(sk);
}
-static void tcp_compound_cong_avoid(struct sock *sk, u32 ack,
- u32 seq_rtt, u32 in_flight, int flag)
-{
+static inline void tcp_compound_synch(struct sock *sk) {
struct tcp_sock *tp = tcp_sk(sk);
struct compound *vegas = inet_csk_ca(sk);
- u8 inc = 0;
if (vegas->cwnd + vegas->dwnd > tp->snd_cwnd) {
if (vegas->cwnd > tp->snd_cwnd || vegas->dwnd > tp->snd_cwnd) {
@@ -234,9 +231,19 @@
vegas->dwnd = 0;
} else
vegas->cwnd = tp->snd_cwnd - vegas->dwnd;
-
}
+}
+
+static void tcp_compound_cong_avoid(struct sock *sk, u32 ack,
+ u32 seq_rtt, u32 in_flight, int flag)
+{
+ struct tcp_sock *tp = tcp_sk(sk);
+ struct compound *vegas = inet_csk_ca(sk);
+ u8 inc = 0;
+
+ tcp_compound_synch(sk);
+
if (!tcp_is_cwnd_limited(sk, in_flight))
return;
@@ -415,9 +422,21 @@
}
}
+static u32 tcp_compound_ssthresh(struct sock *sk) {
+ struct tcp_sock *tp = tcp_sk(sk);
+ struct compound *vegas = inet_csk_ca(sk);
+
+ tcp_compound_synch(sk);
+
+ vegas->dwnd = 0;
+ tp->snd_cwnd = vegas->cwnd;
+
+ return tcp_reno_ssthresh(sk);
+}
+
static struct tcp_congestion_ops tcp_compound = {
.init = tcp_compound_init,
- .ssthresh = tcp_reno_ssthresh,
+ .ssthresh = tcp_compound_ssthresh,
.cong_avoid = tcp_compound_cong_avoid,
.min_cwnd = tcp_reno_min_cwnd,
.rtt_sample = tcp_compound_rtt_calc,