Skip to content

Commit

Permalink
[tcp] Update window even if ACK does not acknowledge new data
Browse files Browse the repository at this point in the history
iPXE currently ignores ACKs which do not acknowledge any new data.
(In particular, it does not stop the retransmission timer; this is
done to prevent an immediate retransmission if a duplicate ACK is
received while the transmit queue is non-empty.)

If a peer provides a window size of zero and later sends a duplicate
ACK to update the window size, this update will therefore be ignored
and iPXE will never be able to transmit data.

Fix by updating the window size even for ACKs which do not acknowledge
new data.

Reported-by: Wissam Shoukair <wissams@mellanox.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Mar 7, 2014
1 parent f17a30d commit 859664e
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions src/net/tcp.c
Expand Up @@ -890,6 +890,9 @@ static int tcp_rx_ack ( struct tcp_connection *tcp, uint32_t ack,
}
}

/* Update window size */
tcp->snd_win = win;

/* Ignore ACKs that don't actually acknowledge any new data.
* (In particular, do not stop the retransmission timer; this
* avoids creating a sorceror's apprentice syndrome when a
Expand All @@ -911,10 +914,9 @@ static int tcp_rx_ack ( struct tcp_connection *tcp, uint32_t ack,
pending_put ( &tcp->pending_flags );
}

/* Update SEQ and sent counters, and window size */
/* Update SEQ and sent counters */
tcp->snd_seq = ack;
tcp->snd_sent = 0;
tcp->snd_win = win;

/* Remove any acknowledged data from transmit queue */
tcp_process_tx_queue ( tcp, len, NULL, 1 );
Expand Down

0 comments on commit 859664e

Please sign in to comment.