rx: Exit fast restart on non-duplicate ACK
authorSimon Wilkinson <sxw@your-file-system.com>
Sat, 18 Jun 2011 14:50:08 +0000 (15:50 +0100)
committerDerrick Brashear <shadow@dementia.org>
Wed, 22 Jun 2011 01:59:24 +0000 (18:59 -0700)
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 <shadow@dementia.org>
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>
Tested-by: Jeffrey Altman <jaltman@openafs.org>
Tested-by: BuildBot <buildbot@rampaginggeek.com>

src/rx/rx.c

index 917abcc..5c7a685 100644 (file)
@@ -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;