1// SPDX-License-Identifier: GPL-2.0 2// 3// A reproducer case for a TFO SYNACK RTO undo bug in: 4// 794200d66273 ("tcp: undo cwnd on Fast Open spurious SYNACK retransmit") 5// This sequence that tickles this bug is: 6// - Fast Open server receives TFO SYN with data, sends SYNACK 7// - (client receives SYNACK and sends ACK, but ACK is lost) 8// - server app sends some data packets 9// - (N of the first data packets are lost) 10// - server receives client ACK that has a TS ECR matching first SYNACK, 11// and also SACKs suggesting the first N data packets were lost 12// - server performs undo of SYNACK RTO, then immediately enters recovery 13// - buggy behavior in 794200d66273 then performed an undo that caused 14// the connection to be in a bad state, in CA_Open with retrans_out != 0 15 16// Check that outbound TS Val ticks are as we would expect with 1000 usec per 17// timestamp tick: 18--tcp_ts_tick_usecs=1000 19 20`./defaults.sh` 21 22// Initialize connection 23 0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3 24 +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 25 +0 setsockopt(3, SOL_TCP, TCP_FASTOPEN, [1], 4) = 0 26 +0 bind(3, ..., ...) = 0 27 +0 listen(3, 1) = 0 28 29 +0 < S 0:1000(1000) win 65535 <mss 1012,sackOK,TS val 1000 ecr 0,wscale 7,nop,nop,nop,FO TFO_COOKIE> 30 +0 > S. 0:0(0) ack 1001 <mss 1460,sackOK,TS val 2000 ecr 1000,nop,wscale 8> 31 +0 accept(3, ..., ...) = 4 32 33// Application writes more data 34 +.010 write(4, ..., 10000) = 10000 35 +0 > P. 1:5001(5000) ack 1001 <nop,nop,TS val 2010 ecr 1000> 36 +0 > P. 5001:10001(5000) ack 1001 <nop,nop,TS val 2010 ecr 1000> 37 +0 %{ assert tcpi_snd_cwnd == 10, tcpi_snd_cwnd }% 38 39 +0 < . 1001:1001(0) ack 1 win 257 <TS val 1010 ecr 2000,sack 2001:5001> 40 +0 > P. 1:2001(2000) ack 1001 <nop,nop,TS val 2010 ecr 1010> 41 +0 %{ assert tcpi_ca_state == TCP_CA_Recovery, tcpi_ca_state }% 42 +0 %{ assert tcpi_snd_cwnd == 7, tcpi_snd_cwnd }% 43 44 +0 < . 1001:1001(0) ack 1 win 257 <TS val 1011 ecr 2000,sack 2001:6001> 45 +0 %{ assert tcpi_ca_state == TCP_CA_Recovery, tcpi_ca_state }% 46 +0 %{ assert tcpi_snd_cwnd == 7, tcpi_snd_cwnd }% 47