summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorYuchung Cheng <ycheng@google.com>2014-07-02 12:07:16 -0700
committerDavid S. Miller <davem@davemloft.net>2014-07-07 21:40:48 -0700
commit6e08d5e3c8236e7484229e46fdf92006e1dd4c49 (patch)
tree0cef9beb502c504b884cccc127e34a50974d0f07 /drivers
parente326f2f13b209d56782609e833b87cb497e64b3b (diff)
tcp: fix false undo corner cases
The undo code assumes that, upon entering loss recovery, TCP 1) always retransmit something 2) the retransmission never fails locally (e.g., qdisc drop) so undo_marker is set in tcp_enter_recovery() and undo_retrans is incremented only when tcp_retransmit_skb() is successful. When the assumption is broken because TCP's cwnd is too small to retransmit or the retransmit fails locally. The next (DUP)ACK would incorrectly revert the cwnd and the congestion state in tcp_try_undo_dsack() or tcp_may_undo(). Subsequent (DUP)ACKs may enter the recovery state. The sender repeatedly enter and (incorrectly) exit recovery states if the retransmits continue to fail locally while receiving (DUP)ACKs. The fix is to initialize undo_retrans to -1 and start counting on the first retransmission. Always increment undo_retrans even if the retransmissions fail locally because they couldn't cause DSACKs to undo the cwnd reduction. Signed-off-by: Yuchung Cheng <ycheng@google.com> Signed-off-by: Neal Cardwell <ncardwell@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
0 files changed, 0 insertions, 0 deletions