• Eric Dumazet's avatar
    tcp: cubic: fix overflow error in bictcp_update() · 2ed0edf9
    Eric Dumazet authored
    commit 17a6e9f1 ("tcp_cubic: fix clock dependency") added an
    overflow error in bictcp_update() in following code :
    
    /* change the unit from HZ to bictcp_HZ */
    t = ((tcp_time_stamp + msecs_to_jiffies(ca->delay_min>>3) -
          ca->epoch_start) << BICTCP_HZ) / HZ;
    
    Because msecs_to_jiffies() being unsigned long, compiler does
    implicit type promotion.
    
    We really want to constrain (tcp_time_stamp - ca->epoch_start)
    to a signed 32bit value, or else 't' has unexpected high values.
    
    This bugs triggers an increase of retransmit rates ~24 days after
    boot [1], as the high order bit of tcp_time_stamp flips.
    
    [1] for hosts with HZ=1000
    
    Big thanks to Van Jacobson for spotting this problem.
    Diagnosed-by: default avatarVan Jacobson <vanj@google.com>
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Cc: Neal Cardwell <ncardwell@google.com>
    Cc: Yuchung Cheng <ycheng@google.com>
    Cc: Stephen Hemminger <stephen@networkplumber.org>
    Acked-by: default avatarNeal Cardwell <ncardwell@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    2ed0edf9
tcp_cubic.c 14 KB