[tcp] Ignore duplicate ACKs in TCP ESTABLISHED state
[people/oremanj/gpxe.git] / src / net / tcp.c
index 1de2abf..1f20454 100644 (file)
@@ -704,7 +704,17 @@ static int tcp_rx_ack ( struct tcp_connection *tcp, uint32_t ack,
        size_t len;
        unsigned int acked_flags;
 
-       /* Ignore duplicate or out-of-range ACK */
+       /* Ignore duplicate ACK, reset upon out-of-range ACK */
+       if ( tcp->tcp_state == TCP_ESTABLISHED && ack <= tcp->snd_seq ) {
+               /* In unsynchronized states, an ACK below our initial
+                * sequence number indicates a stale connection and will
+                * be properly RST by the next block (since ack_len is
+                * unsigned).
+                */
+               DBGC ( tcp, "TCP %p received duplicate ACK for %08x\n",
+                      tcp, tcp->snd_seq );
+               return 0;
+       }
        if ( ack_len > tcp->snd_sent ) {
                DBGC ( tcp, "TCP %p received ACK for [%08x,%08zx), "
                       "sent only [%08x,%08x)\n", tcp, tcp->snd_seq,