• Yuchung Cheng's avatar
    tcp: only undo on partial ACKs in CA_Loss · da34ac76
    Yuchung Cheng authored
    Undo based on TCP timestamps should only happen on ACKs that advance
    SND_UNA, according to the Eifel algorithm in RFC 3522:
    
    Section 3.2:
    
      (4) If the value of the Timestamp Echo Reply field of the
          acceptable ACK's Timestamps option is smaller than the
          value of RetransmitTS, then proceed to step (5),
    
    Section Terminology:
       We use the term 'acceptable ACK' as defined in [RFC793].  That is an
       ACK that acknowledges previously unacknowledged data.
    
    This is because upon receiving an out-of-order packet, the receiver
    returns the last timestamp that advances RCV_NXT, not the current
    timestamp of the packet in the DUPACK. Without checking the flag,
    the DUPACK will cause tcp_packet_delayed() to return true and
    tcp_try_undo_loss() will revert cwnd reduction.
    
    Note that we check the condition in CA_Recovery already by only
    calling tcp_try_undo_partial() if FLAG_SND_UNA_ADVANCED is set or
    tcp_try_undo_recovery() if snd_una crosses high_seq.
    Signed-off-by: default avatarYuchung Cheng <ycheng@google.com>
    Signed-off-by: default avatarNeal Cardwell <ncardwell@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    da34ac76
tcp_input.c 176 KB