From: chrisw@osdl.org Date: Wed, 23 Mar 2005 19:26:21 +0000 (-0800) Subject: [PATCH] add tcp-bic-congestion-avoidance-algo.patch X-Git-Tag: v2.6.11.9~30 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=20602e559db95aec1cb667244e293c33eb4bd075;p=thirdparty%2Fkernel%2Fstable-queue.git [PATCH] add tcp-bic-congestion-avoidance-algo.patch --- diff --git a/queue/tcp-bic-congestion-avoidance-algo.patch b/queue/tcp-bic-congestion-avoidance-algo.patch new file mode 100644 index 00000000000..ed1ccd842af --- /dev/null +++ b/queue/tcp-bic-congestion-avoidance-algo.patch @@ -0,0 +1,48 @@ +From stable-bounces@linux.kernel.org Wed Mar 23 10:50:18 2005 +Date: Wed, 23 Mar 2005 10:48:24 -0800 +From: "David S. Miller" +To: stable@kernel.org +Subject: [PATCH][TCP] Fix BIC congestion avoidance algorithm error + +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 +Signed-off-by: David S. Miller +Signed-off-by: Chris Wright + +===== net/ipv4/tcp_input.c 1.92 vs edited ===== +--- 1.92/net/ipv4/tcp_input.c 2005-02-22 10:45:31 -08:00 ++++ edited/net/ipv4/tcp_input.c 2005-03-23 10:55:18 -08:00 +@@ -1653,7 +1653,10 @@ + 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; +