From: Simon Wilkinson Date: Sat, 18 Jun 2011 14:50:08 +0000 (+0100) Subject: rx: Exit fast restart on non-duplicate ACK X-Git-Tag: upstream/1.8.0_pre1^2~3613 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=6b833f575743d4a826750bb6913cd53232a8867f;p=packages%2Fo%2Fopenafs.git 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. Change-Id: If8e461dd91315be845397dd1bf42771c9223d156 Reviewed-on: http://gerrit.openafs.org/4869 Reviewed-by: Derrick Brashear Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman Tested-by: BuildBot --- diff --git a/src/rx/rx.c b/src/rx/rx.c index 917abcc32..5c7a68567 100644 --- a/src/rx/rx.c +++ b/src/rx/rx.c @@ -4630,7 +4630,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;