• Neal Cardwell's avatar
    tcp: fix undo after RTO for CUBIC · 5a45f008
    Neal Cardwell authored
    This patch fixes CUBIC so that cwnd reductions made during RTOs can be
    undone (just as they already can be undone when using the default/Reno
    behavior).
    
    When undoing cwnd reductions, BIC-derived congestion control modules
    were restoring the cwnd from last_max_cwnd. There were two problems
    with using last_max_cwnd to restore a cwnd during undo:
    
    (a) last_max_cwnd was set to 0 on state transitions into TCP_CA_Loss
    (by calling the module's reset() functions), so cwnd reductions from
    RTOs could not be undone.
    
    (b) when fast_covergence is enabled (which it is by default)
    last_max_cwnd does not actually hold the value of snd_cwnd before the
    loss; instead, it holds a scaled-down version of snd_cwnd.
    
    This patch makes the following changes:
    
    (1) upon undo, revert snd_cwnd to ca->loss_cwnd, which is already, as
    the existing comment notes, the "congestion window at last loss"
    
    (2) stop forgetting ca->loss_cwnd on TCP_CA_Loss events
    
    (3) use ca->last_max_cwnd to check if we're in slow start
    Signed-off-by: default avatarNeal Cardwell <ncardwell@google.com>
    Acked-by: default avatarStephen Hemminger <shemminger@vyatta.com>
    Acked-by: default avatarSangtae Ha <sangtae.ha@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    5a45f008
tcp_cubic.c 14 KB