From 45b4d17f7b38031afbb434c08ed46e4a26df9ba0 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Sat, 18 Jun 2011 15:50:08 +0100 Subject: [PATCH] rx: Exit fast restart on non-duplicate ACK The current code only exits fast restart when we receive an ACK packet that contains no missing chunks at all. On a network that is dropping a reasonable chunk of its packets, this means that we spend most of the call in fast recovery. (I originally found this by running with the intentionally drop packets feature set to 10%) TCP's fast retransmit behaviour is that we stay in fast recovery until we receive our first non-duplicate acknowledgement. In TCP that means an acknowledgement that moves the window. In RX, it is an acknowledgment that ACKs a new packet. Reviewed-on: http://gerrit.openafs.org/4869 Reviewed-by: Derrick Brashear Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman Tested-by: BuildBot (cherry picked from commit 6b833f575743d4a826750bb6913cd53232a8867f) Change-Id: I51b4de1146df032ff6e1273d8c832bded770e177 Reviewed-on: http://gerrit.openafs.org/4941 Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- src/rx/rx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rx/rx.c b/src/rx/rx.c index 66e86b171..d4777367a 100644 --- a/src/rx/rx.c +++ b/src/rx/rx.c @@ -4654,7 +4654,7 @@ rxi_ReceiveAckPacket(struct rx_call *call, struct rx_packet *np, rxi_rto_packet_acked(call, istack); if (call->flags & RX_CALL_FAST_RECOVER) { - if (nNacked) { + if (newAckCount == 0) { call->cwind = MIN((int)(call->cwind + 1), rx_maxSendWindow); } else { call->flags &= ~RX_CALL_FAST_RECOVER; -- 2.39.5