// SPDX-License-Identifier: GPL-2.0 // Test PRR-slowstart implementation. // In this variant we test a simple case where in-flight == ssthresh // all the way through recovery, so during fast recovery we send one segment // for each segment SACKed/ACKed. // Set up config. `./defaults.sh` // 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 +.1 < S 0:0(0) win 32792 +0 > S. 0:0(0) ack 1 // RTT 100ms +.1 < . 1:1(0) ack 1 win 320 +0 accept(3, ..., ...) = 4 // Send 10 data segments. +0 write(4, ..., 10000) = 10000 +0 > P. 1:10001(10000) ack 1 // Lost packet 1:1001. +.11 < . 1:1(0) ack 1 win 320 +.01 < . 1:1(0) ack 1 win 320 +.01 < . 1:1(0) ack 1 win 320 // Enter fast recovery. +0 > . 1:1001(1000) ack 1 +.01 %{ assert tcpi_ca_state == TCP_CA_Recovery, tcpi_ca_state assert tcpi_snd_cwnd == 7, tcpi_snd_cwnd assert tcpi_snd_ssthresh == 7, tcpi_snd_ssthresh }% // Write some more, which we will send 1 MSS at a time, // as in-flight segments are SACKed or ACKed. +.01 write(4, ..., 7000) = 7000 +.01 < . 1:1(0) ack 1 win 320 +0 > . 10001:11001(1000) ack 1 +.01 < . 1:1(0) ack 1 win 320 +0 > . 11001:12001(1000) ack 1 +.01 < . 1:1(0) ack 1 win 320 +0 > . 12001:13001(1000) ack 1 +.01 < . 1:1(0) ack 1 win 320 +0 > . 13001:14001(1000) ack 1 +.01 < . 1:1(0) ack 1 win 320 +0 > . 14001:15001(1000) ack 1 +.01 < . 1:1(0) ack 1 win 320 +0 > . 15001:16001(1000) ack 1 +.02 < . 1:1(0) ack 10001 win 320 +0 > P. 16001:17001(1000) ack 1 // Leave fast recovery. +.01 %{ assert tcpi_ca_state == TCP_CA_Open, tcpi_ca_state assert tcpi_snd_cwnd == 7, tcpi_snd_cwnd assert tcpi_snd_ssthresh == 7, tcpi_snd_ssthresh }% +.03 < . 1:1(0) ack 12001 win 320 +.02 < . 1:1(0) ack 14001 win 320 +.02 < . 1:1(0) ack 16001 win 320 +.02 < . 1:1(0) ack 17001 win 320