github.com/SagerNet/gvisor@v0.0.0-20210707092255-7731c139d75c/test/packetdrill/tcp_defer_accept_timeout.pkt (about) 1 // Test that a bare ACK is accepted after TCP_DEFER_ACCEPT timeout 2 // is hit and a connection is delivered. 3 4 0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3 5 +0 setsockopt(3, SOL_TCP, TCP_DEFER_ACCEPT, [3], 4) = 0 6 +0.000 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 7 +0 bind(3, ..., ...) = 0 8 9 // Set backlog to 1 so that we can easily test. 10 +0 listen(3, 1) = 0 11 12 // Establish a connection without timestamps. 13 +0.0 < S 0:0(0) win 32792 <mss 1460,sackOK,nop,nop,nop,wscale 7> 14 +0.0 > S. 0:0(0) ack 1 <...> 15 16 // Send a bare ACK this should not complete the connection as we 17 // set the TCP_DEFER_ACCEPT above. 18 +0.0 < . 1:1(0) ack 1 win 257 19 20 // The bare ACK should be dropped and no connection should be delivered 21 // to the accept queue. 22 +0.100 accept(3, ..., ...) = -1 EWOULDBLOCK (operation would block) 23 24 // Send another bare ACK and it should still fail we set TCP_DEFER_ACCEPT 25 // to 5 seconds above. 26 +2.5 < . 1:1(0) ack 1 win 257 27 +0.100 accept(3, ..., ...) = -1 EWOULDBLOCK (operation would block) 28 29 // set accept socket back to blocking. 30 +0.000 fcntl(3, F_SETFL, O_RDWR) = 0 31 32 // We should see one more retransmit of the SYN-ACK as a last ditch 33 // attempt when TCP_DEFER_ACCEPT timeout is hit to trigger another 34 // ACK or a packet with data. 35 +.35~+2.35 > S. 0:0(0) ack 1 <...> 36 37 // Now send another bare ACK after TCP_DEFER_ACCEPT time has been passed. 38 +0.0 < . 1:1(0) ack 1 win 257 39 40 // The ACK above should cause connection to transition to connected state. 41 +0.000 accept(3, ..., ...) = 4 42 +0.000 fcntl(4, F_SETFL, O_RDWR|O_NONBLOCK) = 0 43 44 +0.000 close(4) = 0 45 46 +0.0 > F. 1:1(0) ack 1 <...> 47 +0.0 < F. 1:1(0) ack 2 win 257 48 +0.01 > . 2:2(0) ack 2 <...>