tcp: reduce cwnd if retransmit is lost in CA_Loss
authorYuchung Cheng <ycheng@google.com>
Wed, 1 Jul 2015 21:11:14 +0000 (14:11 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 8 Jul 2015 20:29:45 +0000 (13:29 -0700)
commit291a00d1a70f96b393da9ac90c58a82bc7949fc8
tree4eaad0b287c5dbdc785f602a77ff49e6fd0b8438
parentfda8b18c515a5e2caf821887ceafb42c35094eaf
tcp: reduce cwnd if retransmit is lost in CA_Loss

If the retransmission in CA_Loss is lost again, we should not
continue to slow start or raise cwnd in congestion avoidance mode.
Instead we should enter fast recovery and use PRR to reduce cwnd,
following the principle in RFC5681:

"... or the loss of a retransmission, should be taken as two
 indications of congestion and, therefore, cwnd (and ssthresh) MUST
 be lowered twice in this case."

This is especially important to reduce loss when the CA_Loss
state was caused by a traffic policer dropping the entire inflight.
The CA_Loss state has a problem where a loss of L packets causes the
sender to send a burst of L packets. So a policer that's dropping
most packets in a given RTT can cause a huge retransmit storm. By
contrast, PRR includes logic to bound the number of outbound packets
that result from a given ACK. So switching to CA_Recovery on lost
retransmits in CA_Loss avoids this retransmit storm problem when
in CA_Loss.

Signed-off-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: Nandita Dukkipati <nanditad@google.com>
Signed-off-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp_input.c