1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
// Test that a bare ACK does not complete a connection when TCP_DEFER_ACCEPT
// timeout is not hit but an ACK w/ data does complete and deliver the
// connection to the accept queue.
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_TCP, TCP_DEFER_ACCEPT, [5], 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
// Now send an ACK w/ data. This should complete the connection
// and deliver the socket to the accept queue.
+0.1 < . 1:5(4) ack 1 win 257
+0.0 > . 1:1(0) ack 5 <...>
// This should cause connection to transition to connected state.
+0.000 accept(3, ..., ...) = 4
+0.000 fcntl(4, F_SETFL, O_RDWR|O_NONBLOCK) = 0
// Now read the data and we should get 4 bytes.
+0.000 read(4,..., 4) = 4
+0.000 close(4) = 0
+0.0 > F. 1:1(0) ack 5 <...>
+0.0 < F. 5:5(0) ack 2 win 257
+0.01 > . 2:2(0) ack 6 <...>
|