• Pengcheng Yang's avatar
    tcp: fix F-RTO may not work correctly when receiving DSACK · d9157f68
    Pengcheng Yang authored
    Currently DSACK is regarded as a dupack, which may cause
    F-RTO to incorrectly enter "loss was real" when receiving
    DSACK.
    
    Packetdrill to demonstrate:
    
    // Enable F-RTO and TLP
        0 `sysctl -q net.ipv4.tcp_frto=2`
        0 `sysctl -q net.ipv4.tcp_early_retrans=3`
        0 `sysctl -q net.ipv4.tcp_congestion_control=cubic`
    
    // Establish a connection
       +0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
       +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
       +0 bind(3, ..., ...) = 0
       +0 listen(3, 1) = 0
    
    // RTT 10ms, RTO 210ms
      +.1 < S 0:0(0) win 32792 <mss 1000,sackOK,nop,nop,nop,wscale 7>
       +0 > S. 0:0(0) ack 1 <...>
     +.01 < . 1:1(0) ack 1 win 257
       +0 accept(3, ..., ...) = 4
    
    // Send 2 data segments
       +0 write(4, ..., 2000) = 2000
       +0 > P. 1:2001(2000) ack 1
    
    // TLP
    +.022 > P. 1001:2001(1000) ack 1
    
    // Continue to send 8 data segments
       +0 write(4, ..., 10000) = 10000
       +0 > P. 2001:10001(8000) ack 1
    
    // RTO
    +.188 > . 1:1001(1000) ack 1
    
    // The original data is acked and new data is sent(F-RTO step 2.b)
       +0 < . 1:1(0) ack 2001 win 257
       +0 > P. 10001:12001(2000) ack 1
    
    // D-SACK caused by TLP is regarded as a dupack, this results in
    // the incorrect judgment of "loss was real"(F-RTO step 3.a)
    +.022 < . 1:1(0) ack 2001 win 257 <sack 1001:2001,nop,nop>
    
    // Never-retransmitted data(3001:4001) are acked and
    // expect to switch to open state(F-RTO step 3.b)
       +0 < . 1:1(0) ack 4001 win 257
    +0 %{ assert tcpi_ca_state == 0, tcpi_ca_state }%
    
    Fixes: e33099f9 ("tcp: implement RFC5682 F-RTO")
    Signed-off-by: default avatarPengcheng Yang <yangpc@wangsu.com>
    Acked-by: default avatarNeal Cardwell <ncardwell@google.com>
    Tested-by: default avatarNeal Cardwell <ncardwell@google.com>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Link: https://lore.kernel.org/r/1650967419-2150-1-git-send-email-yangpc@wangsu.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    d9157f68
tcp_input.c 200 KB