• Yuchung Cheng's avatar
    tcp: separate loss marking and state update on RTO · c77d62ff
    Yuchung Cheng authored
    Previously when TCP times out, it first updates cwnd and ssthresh,
    marks packets lost, and then updates congestion state again. This
    was fine because everything not yet delivered is marked lost,
    so the inflight is always 0 and cwnd can be safely set to 1 to
    retransmit one packet on timeout.
    
    But the inflight may not always be 0 on timeout if TCP changes to
    mark packets lost based on packet sent time. Therefore we must
    first mark the packet lost, then set the cwnd based on the
    (updated) inflight.
    
    This is not a pure refactor. Congestion control may potentially
    break if it uses (not yet updated) inflight to compute ssthresh.
    Fortunately all existing congestion control modules does not do that.
    Also it changes the inflight when CA_LOSS_EVENT is called, and only
    westwood processes such an event but does not use inflight.
    
    This change has two other minor side benefits:
    1) consistent with Fast Recovery s.t. the inflight is updated
       first before tcp_enter_recovery flips state to CA_Recovery.
    
    2) avoid intertwining loss marking with state update, making the
       code more readable.
    Signed-off-by: default avatarYuchung Cheng <ycheng@google.com>
    Signed-off-by: default avatarNeal Cardwell <ncardwell@google.com>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Reviewed-by: default avatarSoheil Hassas Yeganeh <soheil@google.com>
    Reviewed-by: default avatarPriyaranjan Jha <priyarjha@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    c77d62ff
tcp_input.c 182 KB