]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
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 917abcc327b14ca2a3cb57dbf6024c2f68b54512..5c7a685679da77c2eace02ee1e4c3343ebbc3667 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;