xref: /linux/tools/testing/selftests/net/packetdrill/tcp_tcp_info_tcp-info-sndbuf-limited.pkt (revision 0ad9617c78acbc71373fb341a6f75d4012b01d69)
1// SPDX-License-Identifier: GPL-2.0
2// Test send-buffer-limited time in tcp_info for client side.
3`./defaults.sh`
4
5// Create a socket and set it to non-blocking.
6    0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
7   +0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
8   +0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
9
10   +0 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
11   +0 > S 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
12 +.01 < S. 0:0(0) ack 1 win 10000 <mss 1000,sackOK,nop,nop,nop,wscale 8>
13   +0 > . 1:1(0) ack 1
14   +0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
15   +0 fcntl(3, F_SETFL, O_RDWR) = 0   // set back to blocking
16   +0 setsockopt(3, SOL_SOCKET, SO_SNDBUF, [10000], 4) = 0
17   +0 getsockopt(3, SOL_SOCKET, SO_SNDBUF, [20000], [4]) = 0
18
19 +.09...0.14 write(3, ..., 150000) = 150000
20
21 +.01 < . 1:1(0) ack 10001 win 10000
22
23 +.01 < . 1:1(0) ack 30001 win 10000
24
25// cwnd goes from 40(60KB) to 80(120KB), and that we hit the tiny sndbuf limit 10KB
26 +.01 < . 1:1(0) ack 70001 win 10000
27
28 +.02 < . 1:1(0) ack 95001 win 10000
29   +0 %{ assert 19000 <= tcpi_sndbuf_limited <= 21000, tcpi_sndbuf_limited; \
30	 assert 49000 <= tcpi_busy_time <= 52000, tcpi_busy_time; \
31	 assert 0 == tcpi_rwnd_limited, tcpi_rwnd_limited }%
32
33// This ack frees up enough buffer so we are no longer
34// buffer limited (socket flag SOCK_NOSPACE is cleared)
35 +.02 < . 1:1(0) ack 150001 win 10000
36   +0 %{ assert 19000 <= tcpi_sndbuf_limited <= 21000, tcpi_sndbuf_limited;\
37	 assert 69000 <= tcpi_busy_time <= 73000, tcpi_busy_time;\
38	 assert 0 == tcpi_rwnd_limited, tcpi_rwnd_limited }%
39