[PATCH mptcp-next v14 00/12] selftests: consolidate TCP_INQ testing into sockopt

Geliang Tang <[email protected]> Thu, 30 Jul 2026 11:15:11 +0800
Newsgroups dev.linux.lists.mptcp
Message-ID <[email protected]>
From: Geliang Tang <[email protected]>

This series consolidates the TCP_INQ test functionality from mptcp_inq
into mptcp_sockopt, simplifying the test suite while maintaining full
test coverage.

The first version of this series was sent out a year ago. Recently, I
refactored it and addressed all the review comments from Sashiko. During
this process, I fixed several bugs in the original code, so this is a
much better version.

All CI tests are currently passing, including Sashiko and nipa/ai-review.
The two checkpatch warnings are false positives. In addition, I've also
run extensive loop stability tests, and they all passed as well.

v14:
 - Patch 5: add a fallback definition for TCP_IS_MPTCP; check if errno is
   ENOPROTOOPT in is_mptcp_socket; set default value of is_mptcp to 0.
 - Patch 6: mv proto_tx/proto_rx variables after the fallback definition
   of IPPROTO_MPTCP.

v13:
 - Patch 1: seed RNG per child in init_rng fallback. The
   previous fallback 'srand(time(NULL))' collided for two
   children forked in the same second (1-second resolution);
   mixing in getpid() (per-process unique) gives each
   child an independent seed even when /dev/urandom is
   unavailable.
 - Patch 5: fail loud on legacy kernels lacking TCP_IS_MPTCP.
   Previously, getsockopt() returning -1 left is_mptcp at
   0 and do_getsockopts() saw 0 and silently skipped every
   MPTCP-specific assert. Initialize is_mptcp to -1 and
   die_perror() on getsockopt failure, and update call sites
   to handle the tri-state return ('<= 0' / '> 0').
 - https://patchwork.kernel.org/project/mptcp/cover/[email protected]/

v12:
 - Patch 6 is the only one updated. It no longer uses
	proto_tx == IPPROTO_MPTCP && proto_rx == IPPROTO_MPTCP
   to check for MPTCP sockets - now it uses TCP_IS_MPTCP via a new helper
   in patch 5, which is more accurate. This also makes it work for future
   TCP_MD5SIG tests that use fallback MPTCP sockets.
 - https://patchwork.kernel.org/project/mptcp/cover/[email protected]/

v11:
 - Drop "replace /dev/urandom with getrandom".
 - Add check_stat_equal() helper to centralize and simplify MPTCP stats
   validation.
 - Fix cmsg_len format specifier in get_tcp_inq() (%u -> %zu) to match
   size_t type.
 - Fix format specifier in EOF error message (%lu -> %zd) for ssize_t
   type.
 - Add poll() with POLLRDHUP in client_huge_transfer() to wait for FIN
   arrival before reading the final byte, preventing flaky EOF detection.
 - Pass total to server_huge_transfer(), instead of len.
 - https://patchwork.kernel.org/project/mptcp/cover/[email protected]/

v10:
 - Patch 1, a new fix.
 - Patch 3, change the type of r/w as size_t.
 - Patch 12, in client_huge_transfer(), do a blocking read for EOF on
   unixfd instead of sleeping.
 - https://patchwork.kernel.org/project/mptcp/cover/[email protected]/

v9:
 - No code changes compared to v8.
 - To address Sashiko's complaints that the implementation of
   server_huge_transfer() was split across several patches, the patch
   order has been rearranged, some patches have been squashed into
   fewer ones, and the commit logs have been updated.
 - https://patchwork.kernel.org/project/mptcp/cover/[email protected]/

v8:
 - patch 2, a new patch to replace /dev/urandom with getrandom().
 - patch 4, check against the accumulated total r instead of ret in
   process_one_client().
 - patch 7 and patch 9, update commit logs.
 - https://patchwork.kernel.org/project/mptcp/cover/[email protected]/

v7:
 - Add a new patch to reseed RNG in child after fork.
 - Add a new patch to fix bytes_acked validation against sent bytes.
 - Add a new patch to use r/w for byte counts in process_one_client().
 - Split v6-0004 into two separate patches: read exact payload length,
   and pass len over unixfd.
 - Change socketpair type from SOCK_DGRAM to SOCK_STREAM to avoid
   indefinite blocking when peer exits.
 - Fully initialize buf in server_huge_transfer() to silence MSAN/Valgrind
   warnings.
 - Use a union containing struct cmsghdr for control message buffers to
   prevent unaligned access on strict-alignment architectures.
 - Reorder and renumber patches accordingly.
 - https://patchwork.kernel.org/project/mptcp/cover/[email protected]/

v6:
 - A new patch to use recvmsg instead of read.
 - Squash the four original patches into two.
 - Reset msg.msg_controllen.
 - Check cmsg_len in get_tcp_inq.
 - Check return value of client_huge_transfer.
 - Address other comments from Sashiko.
 - https://patchwork.kernel.org/project/mptcp/cover/[email protected]/

v5:
 - Continue using the approach from v3 and fix the instability issues.
   This version has undergone extensive loop testing.
 - The new two separate functions, server_huge_transfer() and 
   client_huge_transfer(), improve code structure.
 - https://patchwork.kernel.org/project/mptcp/cover/[email protected]/

v4:
 - v3 changed the behavior of process_one_client and connect_one_server,
   causing intermittent failures during loop testing. Revert to using the 
   v2 approach, along with some cleanups.
 - https://patchwork.kernel.org/project/mptcp/cover/[email protected]/

v3:
 - No longer using process_one_client_inq() and connect_one_server_inq()
   for switching; instead, the inq-related code has been merged into
   process_one_client() and connect_one_server().
 - https://patchwork.kernel.org/project/mptcp/cover/[email protected]/

v2:
 - patch 4, a new patch, add do_setsockopt_inq helper.
 - cleanups.
 - https://patchwork.kernel.org/project/mptcp/cover/[email protected]/

v1:
 - https://patchwork.kernel.org/project/mptcp/cover/[email protected]/

Geliang Tang (12):
  selftests: mptcp: sockopt: reseed RNG after fork
  selftests: mptcp: sockopt: use exact length in connect_one_server
  selftests: mptcp: sockopt: add check_stat_equal helper
  selftests: mptcp: sockopt: use size_t for byte counters
  selftests: mptcp: sockopt: add is_mptcp_socket helper
  selftests: mptcp: sockopt: add tx/rx protocol options
  selftests: mptcp: sockopt: add TCP_INQ test option
  selftests: mptcp: sockopt: use unix socket instead of pipe
  selftests: mptcp: sockopt: use recvmsg instead of read
  selftests: mptcp: sockopt: get and verify TCP_INQ
  selftests: mptcp: sockopt: add huge data transfer tests
  selftests: mptcp: sockopt: replace mptcp_inq with sockopt

 tools/testing/selftests/net/mptcp/.gitignore  |   1 -
 tools/testing/selftests/net/mptcp/Makefile    |   1 -
 tools/testing/selftests/net/mptcp/mptcp_inq.c | 614 ------------------
 .../selftests/net/mptcp/mptcp_sockopt.c       | 472 ++++++++++++--
 .../selftests/net/mptcp/mptcp_sockopt.sh      |   8 +-
 5 files changed, 416 insertions(+), 680 deletions(-)
 delete mode 100644 tools/testing/selftests/net/mptcp/mptcp_inq.c

-- 
2.53.0