[tcp] Improve robustness in the presence of duplicated received packets
authorMichael Brown <mcb30@etherboot.org>
Tue, 23 Jun 2009 00:29:43 +0000 (01:29 +0100)
committerMichael Brown <mcb30@etherboot.org>
Tue, 23 Jun 2009 08:40:26 +0000 (09:40 +0100)
commit558c1a45fe30ffe3d6c67b2321e0fc973f13e9b7
tree16153ed9464185891dabb5eaee235b318ff672bc
parent68973f1c491060cbe4c559467dd103866b04129d
[tcp] Improve robustness in the presence of duplicated received packets

gPXE responds to duplicated ACKs with an immediate retransmission,
which can lead to a sorceror's apprentice syndrome.  It also responds
to out-of-range (or old duplicate) ACKs with a RST, which can cause
valid connections to be dropped.

Fix the sorceror's apprentice syndrome by leaving the retransmission
timer running (and so inhibiting the immediate retransmission) when we
receive a potential duplicate ACK.  This seems to match the behaviour
of Linux observed via wireshark traces.

Fix the RST issue by sending RST only on out-of-range ACKs that occur
before the connection is fully established, as per RFC 793.

These problems were exposed during development of the 802.11 wireless
link layer; the 802.11 protocol has a failure mode that can easily
cause duplicated packets.  The fixes were tested in a controlled way
by faking large numbers of duplicated packets in the rtl8139 driver.

Originally-fixed-by: Joshua Oreman <oremanj@rwcr.net>
src/include/gpxe/tcp.h
src/net/tcp.c