summaryrefslogtreecommitdiff
path: root/tools/testing/selftests/net/packetdrill/tcp_timestamping_server.pkt
blob: 84d94780e6be94468668c481d4b7f692dacba446 (plain)
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// SPDX-License-Identifier: GPL-2.0
// Test tx timestamping for server-side (IPv4).
`./defaults.sh
`

// Initialize 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

   +0	< S 0:0(0) win 32792 <mss 1000,sackOK,nop,nop,nop,wscale 10>
   +0	> S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
 +.01	< . 1:1(0) ack 1 win 514

   +0	accept(3, ..., ...) = 4
   +0	setsockopt(4, SOL_SOCKET, SO_TIMESTAMPING,
		   [SOF_TIMESTAMPING_TX_SCHED | SOF_TIMESTAMPING_TX_SOFTWARE |
		    SOF_TIMESTAMPING_TX_ACK | SOF_TIMESTAMPING_SOFTWARE |
		    SOF_TIMESTAMPING_OPT_ID], 4) = 0

// Write two 2KB chunks.
// setsockopt(..., [SOF_TIMESTAMPING_SOFTWARE | SOF_TIMESTAMPING_OPT_ID], ...)
// is called after when SYN is acked. So, we expect the last byte of the first
// and the second chunks to have timestamp keys of 1999 (i.e., 2000 - 1) and
// 3999 (i.e., 4000 - 1) respectively.
   +0	write(4, ..., 2000) = 2000
   +0	write(4, ..., 2000) = 2000
   +0	> P. 1:2001(2000) ack 1
   +0	> P. 2001:4001(2000) ack 1
 +.01	< .  1:1(0) ack 2001 win 514
 +.01	< .  1:1(0) ack 4001 win 514

// Make sure that internal TCP timestamps are not overwritten and we have sane
// RTT measurement.
   +0	%{
assert 5000 <= tcpi_rtt <= 20000, 'srtt=%d us' % tcpi_rtt
}%

// SCM_TSTAMP_SCHED for the first chunk should be received almost immediately
// after write at t=10ms.
   +0	recvmsg(4, {msg_name(...)=...,
		    msg_iov(1)=[{...,0}],
                    msg_flags=MSG_ERRQUEUE|MSG_TRUNC,
                    msg_control=[
			{cmsg_level=SOL_SOCKET,
			 cmsg_type=SCM_TIMESTAMPING,
			 cmsg_data={scm_sec=0,scm_nsec=10000000}},
			{cmsg_level=CMSG_LEVEL_IP,
			 cmsg_type=CMSG_TYPE_RECVERR,
			 cmsg_data={ee_errno=ENOMSG,
				    ee_origin=SO_EE_ORIGIN_TIMESTAMPING,
				    ee_type=0,
				    ee_code=0,
				    ee_info=SCM_TSTAMP_SCHED,
				    ee_data=1999}}
		    ]}, MSG_ERRQUEUE) = 0
// SCM_TSTAMP_SND for the first chunk should be received almost immediately
// after write at t=10ms.
   +0	recvmsg(4, {msg_name(...)=...,
		    msg_iov(1)=[{...,0}],
                    msg_flags=MSG_ERRQUEUE|MSG_TRUNC,
                    msg_control=[
			{cmsg_level=SOL_SOCKET,
			 cmsg_type=SCM_TIMESTAMPING,
			 cmsg_data={scm_sec=0,scm_nsec=10000000}},
			{cmsg_level=CMSG_LEVEL_IP,
			 cmsg_type=CMSG_TYPE_RECVERR,
			 cmsg_data={ee_errno=ENOMSG,
				    ee_origin=SO_EE_ORIGIN_TIMESTAMPING,
				    ee_type=0,
				    ee_code=0,
				    ee_info=SCM_TSTAMP_SND,
				    ee_data=1999}}
		    ]}, MSG_ERRQUEUE) = 0
// SCM_TSTAMP_SCHED for the second chunk should be received almost immediately
// after that at t=10ms.
   +0	recvmsg(4, {msg_name(...)=...,
		    msg_iov(1)=[{...,0}],
                    msg_flags=MSG_ERRQUEUE|MSG_TRUNC,
                    msg_control=[
			{cmsg_level=SOL_SOCKET,
			 cmsg_type=SCM_TIMESTAMPING,
			 cmsg_data={scm_sec=0,scm_nsec=10000000}},
			{cmsg_level=CMSG_LEVEL_IP,
			 cmsg_type=CMSG_TYPE_RECVERR,
			 cmsg_data={ee_errno=ENOMSG,
				    ee_origin=SO_EE_ORIGIN_TIMESTAMPING,
				    ee_type=0,
				    ee_code=0,
				    ee_info=SCM_TSTAMP_SCHED,
				    ee_data=3999}}
		    ]}, MSG_ERRQUEUE) = 0
// SCM_TSTAMP_SND for the second chunk should be received almost immediately
// after that at t=10ms.
   +0	recvmsg(4, {msg_name(...)=...,
		    msg_iov(1)=[{...,0}],
                    msg_flags=MSG_ERRQUEUE|MSG_TRUNC,
                    msg_control=[
			{cmsg_level=SOL_SOCKET,
			 cmsg_type=SCM_TIMESTAMPING,
			 cmsg_data={scm_sec=0,scm_nsec=10000000}},
			{cmsg_level=CMSG_LEVEL_IP,
			 cmsg_type=CMSG_TYPE_RECVERR,
			 cmsg_data={ee_errno=ENOMSG,
				    ee_origin=SO_EE_ORIGIN_TIMESTAMPING,
				    ee_type=0,
				    ee_code=0,
				    ee_info=SCM_TSTAMP_SND,
				    ee_data=3999}}
		    ]}, MSG_ERRQUEUE) = 0
// SCM_TSTAMP_ACK for the first chunk should be received at t=20ms.
   +0	recvmsg(4, {msg_name(...)=...,
		    msg_iov(1)=[{...,0}],
                    msg_flags=MSG_ERRQUEUE|MSG_TRUNC,
                    msg_control=[
			{cmsg_level=SOL_SOCKET,
			 cmsg_type=SCM_TIMESTAMPING,
			 cmsg_data={scm_sec=0,scm_nsec=20000000}},
			{cmsg_level=CMSG_LEVEL_IP,
			 cmsg_type=CMSG_TYPE_RECVERR,
			 cmsg_data={ee_errno=ENOMSG,
				    ee_origin=SO_EE_ORIGIN_TIMESTAMPING,
				    ee_type=0,
				    ee_code=0,
				    ee_info=SCM_TSTAMP_ACK,
				    ee_data=1999}}
		    ]}, MSG_ERRQUEUE) = 0
// SCM_TSTAMP_ACK for the second chunk should be received at t=30ms.
   +0	recvmsg(4, {msg_name(...)=...,
		    msg_iov(1)=[{...,0}],
                    msg_flags=MSG_ERRQUEUE|MSG_TRUNC,
                    msg_control=[
			{cmsg_level=SOL_SOCKET,
			 cmsg_type=SCM_TIMESTAMPING,
			 cmsg_data={scm_sec=0,scm_nsec=30000000}},
			{cmsg_level=CMSG_LEVEL_IP,
			 cmsg_type=CMSG_TYPE_RECVERR,
			 cmsg_data={ee_errno=ENOMSG,
				    ee_origin=SO_EE_ORIGIN_TIMESTAMPING,
				    ee_type=0,
				    ee_code=0,
				    ee_info=SCM_TSTAMP_ACK,
				    ee_data=3999}}
		    ]}, MSG_ERRQUEUE) = 0