DragonFly BSD
DragonFly bugs List (threaded) for 2005-07
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

Possible burst from TCP NewReno when a partial ACK is received


From: Noritoshi Demizu <demizu@xxxxxxxxxxxxxx>
Date: Mon, 04 Jul 2005 19:11:34 +0900 (JST)

I think TCP NewReno in DragonFlyBSD has a bug which may send
a burst of data when a partial ACK is received.

More precisely, when a partial ACK is received, if acked bytes is
larger than congestion window, new congestion window becomes awfully
huge value.

This bug is the same as the one reported in the following mail:
http://lists.freebsd.org/pipermail/freebsd-net/2005-June/007723.html

I think tcp_newreno_partial_ack() should be modified as below.
Through my experiences, I observed that in somecases (ocwnd > acked)
is false (I inserted printf() there for test).  Without the change
below, snd_cwnd would become awfully huge value.

Regards,
Noritoshi Demizu


Index: netinet/tcp_input.c
===================================================================
RCS file: /home/cvsup/DragonFlyBSD/dcvs/src/sys/netinet/tcp_input.c,v
retrieving revision 1.60
diff -u -r1.60 tcp_input.c
--- netinet/tcp_input.c	10 May 2005 15:48:10 -0000	1.60
+++ netinet/tcp_input.c	4 Jul 2005 10:02:57 -0000
@@ -3108,7 +3108,10 @@
 	if (SEQ_GT(old_snd_nxt, tp->snd_nxt))
 		tp->snd_nxt = old_snd_nxt;
 	/* partial window deflation */
-	tp->snd_cwnd = ocwnd - acked + tp->t_maxseg;
+	if (ocwnd > acked)
+		tp->snd_cwnd = ocwnd - acked + tp->t_maxseg;
+	else
+		tp->snd_cwnd = tp->t_maxseg;
 }
 
 /*



[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]