]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
[PATCH] Fix BIC congestion avoidance algorithm error
authordavem@davemloft.net <davem@davemloft.net>
Thu, 7 Apr 2005 18:45:12 +0000 (11:45 -0700)
committerGreg KH <gregkh@suse.de>
Thu, 12 May 2005 17:00:20 +0000 (10:00 -0700)
Since BIC is the default congestion control algorithm
enabled in every 2.6.x kernel out there, fixing errors
in it becomes quite critical.

A flaw in the loss handling caused it to not perform
the binary search regimen of the BIC algorithm
properly.

The fix below from Stephen Hemminger has been heavily
verified.

[TCP]: BIC not binary searching correctly

While redoing BIC for the split up version, I discovered that the existing
2.6.11 code doesn't really do binary search. It ends up being just a slightly
modified version of Reno.  See attached graphs to see the effect over simulated
1mbit environment.

The problem is that BIC is supposed to reset the cwnd to the last loss value
rather than ssthresh when loss is detected.  The correct code (from the BIC
TCP code for Web100) is in this patch.

Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Chris Wright <chrisw@osdl.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
net/ipv4/tcp_input.c

index 8a71e824e17e10c8ac85dc8123b1e5b7d481edf0..4819cb60c5a455ebc896779a1f77723180852a0d 100644 (file)
@@ -1653,7 +1653,10 @@ static void DBGUNDO(struct sock *sk, struct tcp_sock *tp, const char *msg)
 static void tcp_undo_cwr(struct tcp_sock *tp, int undo)
 {
        if (tp->prior_ssthresh) {
-               tp->snd_cwnd = max(tp->snd_cwnd, tp->snd_ssthresh<<1);
+               if (tcp_is_bic(tp))
+                       tp->snd_cwnd = max(tp->snd_cwnd, tp->bictcp.last_max_cwnd);
+               else
+                       tp->snd_cwnd = max(tp->snd_cwnd, tp->snd_ssthresh<<1);
 
                if (undo && tp->prior_ssthresh > tp->snd_ssthresh) {
                        tp->snd_ssthresh = tp->prior_ssthresh;