xref: /linux/tools/testing/selftests/net/packetdrill/tcp_nagle_sendmsg_msg_more.pkt (revision 0ad9617c78acbc71373fb341a6f75d4012b01d69)
1// SPDX-License-Identifier: GPL-2.0
2// Test the MSG_MORE flag will correctly corks the tiny writes
3`./defaults.sh`
4
5    0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
6   +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
7   +0 bind(3, ..., ...) = 0
8   +0 listen(3, 1) = 0
9
10   +0 < S 0:0(0) win 32792 <mss 1000,nop,wscale 7>
11   +0 > S. 0:0(0) ack 1 <mss 1460,nop,wscale 8>
12 +.01 < . 1:1(0) ack 1 win 257
13   +0 accept(3, ..., ...) = 4
14// Disable Nagle by default on this socket.
15   +0 setsockopt(4, SOL_TCP, TCP_NODELAY, [1], 4) = 0
16
17// Test the basic case: MSG_MORE overwrites TCP_NODELAY and enables Nagle.
18   +0 sendmsg(4, {msg_name(...)=...,
19                  msg_iov(1)=[{..., 40}], msg_flags=0}, MSG_MORE) = 40
20 +.21~+.215 > P. 1:41(40) ack 1
21 +.01 < . 1:1(0) ack 41 win 257
22
23// Test unsetting MSG_MORE releases the packet
24   +0 sendmsg(4, {msg_name(...)=...,
25                  msg_iov(1)=[{..., 100}], msg_flags=0}, MSG_MORE) = 100
26+.005 sendmsg(4, {msg_name(...)=...,
27                  msg_iov(1)=[{..., 160}], msg_flags=0}, MSG_MORE) = 160
28 +.01 sendmsg(4, {msg_name(...)=...,
29                  msg_iov(3)=[{..., 100}, {..., 200}, {..., 195}],
30		  msg_flags=0}, MSG_MORE) = 495
31+.008 sendmsg(4, {msg_name(...)=...,
32                  msg_iov(1)=[{..., 5}], msg_flags=0}, 0) = 5
33   +0 > P. 41:801(760) ack 1
34 +.02 < . 1:1(0) ack 801 win 257
35
36
37// Test >MSS write will unleash MSS packets but hold on the remaining data.
38  +.1 sendmsg(4, {msg_name(...)=...,
39                  msg_iov(1)=[{..., 3100}], msg_flags=0}, MSG_MORE) = 3100
40   +0 > . 801:3801(3000) ack 1
41+.003 sendmsg(4, {msg_name(...)=...,
42                  msg_iov(1)=[{..., 50}], msg_flags=0}, MSG_MORE) = 50
43
44 +.01 < . 1:1(0) ack 2801 win 257
45// Err... we relase the remaining right after the ACK? note that PUSH is reset
46   +0 > . 3801:3951(150) ack 1
47
48// Test we'll hold on the subsequent writes when inflight (3801:3951) > 0
49+.001 sendmsg(4, {msg_name(...)=...,
50                  msg_iov(1)=[{..., 1}], msg_flags=0}, MSG_MORE) = 1
51+.002 sendmsg(4, {msg_name(...)=...,
52                  msg_iov(1)=[{..., 2}], msg_flags=0}, MSG_MORE) = 2
53+.003 sendmsg(4, {msg_name(...)=...,
54                  msg_iov(1)=[{..., 3}], msg_flags=0}, MSG_MORE) = 3
55+.004 sendmsg(4, {msg_name(...)=...,
56                  msg_iov(1)=[{..., 4}], msg_flags=0}, MSG_MORE) = 4
57 +.02 < . 1:1(0) ack 3951 win 257
58   +0 > . 3951:3961(10) ack 1
59 +.02 < . 1:1(0) ack 3961 win 257
60
61
62// Test the case a MSG_MORE send followed by a write flushes the data
63   +0 sendmsg(4, {msg_name(...)=...,
64                  msg_iov(1)=[{..., 20}], msg_flags=0}, MSG_MORE) = 20
65 +.05 write(4, ..., 20) = 20
66   +0 > P. 3961:4001(40) ack 1
67