49 lines
1.6 KiB
Plaintext
49 lines
1.6 KiB
Plaintext
|
// Test that a bare ACK is accepted after TCP_DEFER_ACCEPT timeout
|
||
|
// is hit and a connection is delivered.
|
||
|
|
||
|
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
|
||
|
+0 setsockopt(3, SOL_TCP, TCP_DEFER_ACCEPT, [3], 4) = 0
|
||
|
+0.000 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
|
||
|
+0 bind(3, ..., ...) = 0
|
||
|
|
||
|
// Set backlog to 1 so that we can easily test.
|
||
|
+0 listen(3, 1) = 0
|
||
|
|
||
|
// Establish a connection without timestamps.
|
||
|
+0.0 < S 0:0(0) win 32792 <mss 1460,sackOK,nop,nop,nop,wscale 7>
|
||
|
+0.0 > S. 0:0(0) ack 1 <...>
|
||
|
|
||
|
// Send a bare ACK this should not complete the connection as we
|
||
|
// set the TCP_DEFER_ACCEPT above.
|
||
|
+0.0 < . 1:1(0) ack 1 win 257
|
||
|
|
||
|
// The bare ACK should be dropped and no connection should be delivered
|
||
|
// to the accept queue.
|
||
|
+0.100 accept(3, ..., ...) = -1 EWOULDBLOCK (operation would block)
|
||
|
|
||
|
// Send another bare ACK and it should still fail we set TCP_DEFER_ACCEPT
|
||
|
// to 5 seconds above.
|
||
|
+2.5 < . 1:1(0) ack 1 win 257
|
||
|
+0.100 accept(3, ..., ...) = -1 EWOULDBLOCK (operation would block)
|
||
|
|
||
|
// set accept socket back to blocking.
|
||
|
+0.000 fcntl(3, F_SETFL, O_RDWR) = 0
|
||
|
|
||
|
// We should see one more retransmit of the SYN-ACK as a last ditch
|
||
|
// attempt when TCP_DEFER_ACCEPT timeout is hit to trigger another
|
||
|
// ACK or a packet with data.
|
||
|
+.35~+2.35 > S. 0:0(0) ack 1 <...>
|
||
|
|
||
|
// Now send another bare ACK after TCP_DEFER_ACCEPT time has been passed.
|
||
|
+0.0 < . 1:1(0) ack 1 win 257
|
||
|
|
||
|
// The ACK above should cause connection to transition to connected state.
|
||
|
+0.000 accept(3, ..., ...) = 4
|
||
|
+0.000 fcntl(4, F_SETFL, O_RDWR|O_NONBLOCK) = 0
|
||
|
|
||
|
+0.000 close(4) = 0
|
||
|
|
||
|
+0.0 > F. 1:1(0) ack 1 <...>
|
||
|
+0.0 < F. 1:1(0) ack 2 win 257
|
||
|
+0.01 > . 2:2(0) ack 2 <...>
|