From nobody Fri Jul 10 13:40:54 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AC1CF4499A6 for ; Fri, 10 Jul 2026 08:59:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673965; cv=none; b=sXSHlspxHo9qr88KDI2vW+7PhFQOPiA66XqiAbI9OFp+2td7+4b56v9Lofbs/HkeClz4J/jxyXRfe2/Osb/zcZR0W9Ayx7aJkX0W8rddb22CGDymENa8zwxx5EfH9TcZHtoonI/55yGecepP7RkvoCBWkI45Ndk584xAl5SZRXk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673965; c=relaxed/simple; bh=NAYH3kxoPHVsEU9ick6lWHtSbg/U0V7o0vo87/OibN8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DOjRXmxf3hCKfbq2AaRX9Qdfnd2p7dqFQIl13riS9mGpaa/qYQR5trBKU9snwHGjTA3u4Y+UhHO2+9uZV8LIY4jkl/JavKFK9eyRtXNcTfPf2VIQL8Z1jhtV4Rlj72cu8x+6Ykpsc1z3piiIegnzPi/hn+L7v8F0CfuparY0/VQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Biwdk4h5; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Biwdk4h5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2974C1F00A3E; Fri, 10 Jul 2026 08:59:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783673964; bh=s4KPJz7nQdwzveikwCSglZkYuUB9Zuo6cjnBHKJ0Muk=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Biwdk4h5UbxwUzO3gVYCj3TsdVKkjegpjP76XzyxHyP95TqA68GkkXdM1fifU9U9X atosdt8uvTarZ3jFWSyaXFRTBbgNXQXF9c7bcGlj6V2T0vo77nfs9raokpGa6BQsaC D/BA44Clgl6cgHVgslgNTw1sHMqYGZb+QigMoLXpd72yrsEPLI5zlfPf6oGcPHKxhg P0O8ypPzQ165XiQWoctTP+mhuavp6Co7Uy9pROmiMN6ZOHLfczbIrOjFCrgDAjg2Y2 fmPsrp8XBufLzzE7Gtp/heg843rJ4qfq/jgHDufUom4v5TLwuprxeiENzZ6uVuFKAX IxT3sCxbWZa1A== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v6 01/10] selftests: mptcp: sockopt: add tx/rx protocol options Date: Fri, 10 Jul 2026 16:59:04 +0800 Message-ID: <375ecd50891b71388ac45079717df9ed20f2ba65.1783673158.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Add -t and -r options to specify tx/rx protocols (TCP/MPTCP). This increases testing flexibility by allowing explicit protocol selection for both transmission and reception paths. These codes are from mptcp_inq.c. Enhance compatibility with TCP tests by skipping MPTCP getsockopt checks during TCP tests since MPTCP socket options are not available. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index b6e58d936ebe..70e8d6c5094c 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -28,6 +28,8 @@ #include =20 static int pf =3D AF_INET; +static int proto_tx =3D IPPROTO_MPTCP; +static int proto_rx =3D IPPROTO_MPTCP; =20 #ifndef IPPROTO_MPTCP #define IPPROTO_MPTCP 262 @@ -137,6 +139,7 @@ static void __noreturn die_perror(const char *msg) static void die_usage(int r) { fprintf(stderr, "Usage: mptcp_sockopt [-6]\n"); + fprintf(stderr, " [-t tcp|mptcp] [-r tcp|mptcp]\n"); exit(r); } =20 @@ -202,7 +205,7 @@ static int sock_listen_mptcp(const char * const listena= ddr, hints.ai_family =3D pf; =20 for (a =3D addr; a; a =3D a->ai_next) { - sock =3D socket(a->ai_family, a->ai_socktype, IPPROTO_MPTCP); + sock =3D socket(a->ai_family, a->ai_socktype, proto_rx); if (sock < 0) continue; =20 @@ -260,11 +263,22 @@ static int sock_connect_mptcp(const char * const remo= teaddr, return sock; } =20 +static int protostr_to_num(const char *s) +{ + if (strcasecmp(s, "tcp") =3D=3D 0) + return IPPROTO_TCP; + if (strcasecmp(s, "mptcp") =3D=3D 0) + return IPPROTO_MPTCP; + + die_usage(1); + return 0; +} + static void parse_opts(int argc, char **argv) { int c; =20 - while ((c =3D getopt(argc, argv, "h6")) !=3D -1) { + while ((c =3D getopt(argc, argv, "h6t:r:")) !=3D -1) { switch (c) { case 'h': die_usage(0); @@ -272,6 +286,12 @@ static void parse_opts(int argc, char **argv) case '6': pf =3D AF_INET6; break; + case 't': + proto_tx =3D protostr_to_num(optarg); + break; + case 'r': + proto_rx =3D protostr_to_num(optarg); + break; default: die_usage(1); break; @@ -557,6 +577,9 @@ static void do_getsockopt_mptcp_full_info(struct so_sta= te *s, int fd) =20 static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w) { + if (proto_tx !=3D IPPROTO_MPTCP || proto_rx !=3D IPPROTO_MPTCP) + return; + do_getsockopt_mptcp_info(s, fd, w); =20 do_getsockopt_tcp_info(s, fd, r, w); @@ -632,7 +655,8 @@ static void connect_one_server(int fd, int pipefd) if (eof) total +=3D 1; /* sequence advances due to FIN */ =20 - assert(s.mptcpi_rcv_delta =3D=3D (uint64_t)total); + if (proto_tx =3D=3D IPPROTO_MPTCP && proto_rx =3D=3D IPPROTO_MPTCP) + assert(s.mptcpi_rcv_delta =3D=3D (uint64_t)total); close(fd); } =20 @@ -667,7 +691,8 @@ static void process_one_client(int fd, int pipefd) xerror("expected EOF, got %lu", ret3); =20 do_getsockopts(&s, fd, ret, ret2); - if (s.mptcpi_rcv_delta !=3D (uint64_t)ret + 1) + if (proto_tx =3D=3D IPPROTO_MPTCP && proto_rx =3D=3D IPPROTO_MPTCP && + s.mptcpi_rcv_delta !=3D (uint64_t)ret + 1) xerror("mptcpi_rcv_delta %" PRIu64 ", expect %" PRIu64 ", diff %" PRId64, s.mptcpi_rcv_delta, ret + 1, s.mptcpi_rcv_delta - (ret + 1)); =20 @@ -777,10 +802,10 @@ static int client(int pipefd) =20 switch (pf) { case AF_INET: - fd =3D sock_connect_mptcp("127.0.0.1", "15432", IPPROTO_MPTCP); + fd =3D sock_connect_mptcp("127.0.0.1", "15432", proto_tx); break; case AF_INET6: - fd =3D sock_connect_mptcp("::1", "15432", IPPROTO_MPTCP); + fd =3D sock_connect_mptcp("::1", "15432", proto_tx); break; default: xerror("Unknown pf %d\n", pf); --=20 2.53.0 From nobody Fri Jul 10 13:40:54 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 946583955FF for ; Fri, 10 Jul 2026 08:59:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673967; cv=none; b=Lhf99alyRm+0AeWOcu/eoOT20SHX9HhCnzTm372uMLjpGE+hGk0s7LI2ABd3S2pj2HUx1a2as+jXk3mVR0V8KjqT75Nl0rFPUDBJc4OZDwMoEi3phJ1ZCQRSSZm+d+mNP9fZL9AA7xU4ygD+DpLh+JZRTDXFVJ4O091r0b2te0c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673967; c=relaxed/simple; bh=450FesHWxLXOt2PmDaP5ytyae3jC1kthpciYgQjY0LM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mnLXhoPoM+P/ogL/ACPe/d1GgWARL6+TTNR3ut4cFZp5/Ke6ZIR8TIRx0DkdYNdYEkn/AeQizDVNTsiwAWoul19keV51C5iL+bvfsxB2RMNsYLH+co1sf+shPpCVIrRb1Fmq3GcdmEf3/VoYVK1XbytuX6NVmLK8ZLsp6vkz7bU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KohWkK49; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="KohWkK49" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 033F71F000E9; Fri, 10 Jul 2026 08:59:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783673966; bh=OxHGGrgRqFTDYqFI00gPwdTFdogsVxR91HJ6xAaKLk8=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=KohWkK494g9jbVXwLApNUY/AMJ7t7aWtfVRjM7fj4MkBK8JFw2mgoAtfLxQVjd3d8 edajX+ojSCtSr8N78kJLRc5U5pDvdNjo1A0yue6fWDZkeFahix2KS59WCI5NWuHg98 4Q1sLybMOby9wF6hMT57CXE3RFazEQPdZCIMv18owNcEGSF7/f6zAzPJgy3bs1PNik mUiIzFpdzcpnsYwjvu2YmJ7fRdw0IayRU5B1qvuUaTgrWQPgoq1i3Q2dt0n/8Ny4iT lQNk+zC/a41lNh8jaCvka/BtsVY70mGYNE+yJkB7MFISmBS/PHmAijhlI7cgySn2Ip fCuvCPc/lUiaA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v6 02/10] selftests: mptcp: sockopt: add TCP_INQ test option Date: Fri, 10 Jul 2026 16:59:05 +0800 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Add -i option to enable TCP_INQ testing. This prepares for consolidating TCP_INQ tests into a single binary by adding the necessary command-line interface. Add helper functions to conditionally set TCP_INQ sockopt on accepted sockets when running in inq mode. This ensures proper testing of TCP_CM_INQ functionality by enabling the required socket option on the incoming server connection. These codes are from mptcp_inq.c. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 70e8d6c5094c..92661da821fa 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -30,6 +30,7 @@ static int pf =3D AF_INET; static int proto_tx =3D IPPROTO_MPTCP; static int proto_rx =3D IPPROTO_MPTCP; +static bool inq; =20 #ifndef IPPROTO_MPTCP #define IPPROTO_MPTCP 262 @@ -140,6 +141,7 @@ static void die_usage(int r) { fprintf(stderr, "Usage: mptcp_sockopt [-6]\n"); fprintf(stderr, " [-t tcp|mptcp] [-r tcp|mptcp]\n"); + fprintf(stderr, " [-i]\n"); exit(r); } =20 @@ -278,7 +280,7 @@ static void parse_opts(int argc, char **argv) { int c; =20 - while ((c =3D getopt(argc, argv, "h6t:r:")) !=3D -1) { + while ((c =3D getopt(argc, argv, "h6t:r:i")) !=3D -1) { switch (c) { case 'h': die_usage(0); @@ -292,6 +294,9 @@ static void parse_opts(int argc, char **argv) case 'r': proto_rx =3D protostr_to_num(optarg); break; + case 'i': + inq =3D true; + break; default: die_usage(1); break; @@ -718,6 +723,14 @@ static void process_one_client(int fd, int pipefd) close(fd); } =20 +static void do_setsockopt_inq(int fd) +{ + int on =3D 1; + + if (setsockopt(fd, IPPROTO_TCP, TCP_INQ, &on, sizeof(on))) + die_perror("setsockopt(TCP_INQ)"); +} + static int xaccept(int s) { int fd =3D accept(s, NULL, 0); @@ -725,6 +738,9 @@ static int xaccept(int s) if (fd < 0) die_perror("accept"); =20 + if (inq) + do_setsockopt_inq(fd); + return fd; } =20 --=20 2.53.0 From nobody Fri Jul 10 13:40:54 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 22CA13955FF for ; Fri, 10 Jul 2026 08:59:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673969; cv=none; b=WeTdsj1qV1eBzOhDHqi9RC1kYOZ5JNhEJ0fqVK+N3bm2VmcfsV3O7jft/7pk4Rqvt34XKQanc8I0pGHXhw4qG4Fj3lS0yYj5jm/fccD/cIRT/Wv1uT2jmMPGKEcR1thOxh4IoCthWEpakbOFXg+OvBix30xXGfzNuxOFTL14tEo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673969; c=relaxed/simple; bh=SLKlJrBhlhi3GqaXbTKy241dj7sHG4ZL0kCHA/dZcvs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q5tKBOF39vAp7Ga0gtYcOjwNwajs9pGxisbL7mly2mfsoKP0LUaE8NgXR594eRrLMLI+LxZKGOSUeKxPhS4sT6/Iz7TZ1Q2GrXeuA3sof75dWXKgve7ea6IzX3K6+pztWabV5ztNqMmB3C0tAztxc0X9Vazi28TUpybDCJZNihs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hwkeXhL8; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hwkeXhL8" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D10B81F00A3D; Fri, 10 Jul 2026 08:59:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783673967; bh=D8GwDMPGG+kH0O2I1n7A7rvzW0UtAtGxHTkPiOT2eUQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=hwkeXhL8M07rvJrcIi4M4agDMXiY9zeXhMZvSv+qSQWmcw0Pos6+oqeXhxzc/BMoR uNMzPdyxN9TFpBhrfMB5UDcn/GEeU3KGhvo4RvU07Ez6k4Q5uTWn1Eu0vtddTjBO+z syIDauUDF66Sv9DURxFj0Da9+8PpWgvCnN6Nsg+8B2zmKZmSYFNFz6+NcAa0SXFh7q T+9+GfiFA7Y49D5U3jb2ashsEiqgpKlZJV4O6egF0tKpP4ufYh5Xprj+POSjzkhvWF A+Vfa2aw9b41X65ufi+57aAdHWajikbP8wJtvIcZpflRJoTuG/qvDchZwqRMuCty/E WPrUr30tO6hng== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v6 03/10] selftests: mptcp: sockopt: use unix socket instead of pipe Date: Fri, 10 Jul 2026 16:59:06 +0800 Message-ID: <4ad3fad71387b68a11a260b37a88ac3a3e7e4a69.1783673158.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Replace pipe-based synchronization with Unix domain socket pairs (SOCK_DGRAM) for better bidirectional communication reliability between server and client processes. These codes are from mptcp_inq.c. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 92661da821fa..fdc7500b79b3 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -595,7 +595,7 @@ static void do_getsockopts(struct so_state *s, int fd, = size_t r, size_t w) do_getsockopt_mptcp_full_info(s, fd); } =20 -static void connect_one_server(int fd, int pipefd) +static void connect_one_server(int fd, int unixfd) { char buf[4096], buf2[4096]; size_t len, i, total; @@ -620,9 +620,9 @@ static void connect_one_server(int fd, int pipefd) do_getsockopts(&s, fd, 0, 0); =20 /* un-block server */ - ret =3D read(pipefd, buf2, 4); + ret =3D read(unixfd, buf2, 4); assert(ret =3D=3D 4); - close(pipefd); + close(unixfd); =20 assert(strncmp(buf2, "xmit", 4) =3D=3D 0); =20 @@ -665,7 +665,7 @@ static void connect_one_server(int fd, int pipefd) close(fd); } =20 -static void process_one_client(int fd, int pipefd) +static void process_one_client(int fd, int unixfd) { ssize_t ret, ret2, ret3; struct so_state s; @@ -674,7 +674,7 @@ static void process_one_client(int fd, int pipefd) memset(&s, 0, sizeof(s)); do_getsockopts(&s, fd, 0, 0); =20 - ret =3D write(pipefd, "xmit", 4); + ret =3D write(unixfd, "xmit", 4); assert(ret =3D=3D 4); =20 ret =3D read(fd, buf, sizeof(buf)); @@ -744,7 +744,7 @@ static int xaccept(int s) return fd; } =20 -static int server(int pipefd) +static int server(int unixfd) { int fd =3D -1, r; =20 @@ -760,13 +760,13 @@ static int server(int pipefd) break; } =20 - r =3D write(pipefd, "conn", 4); + r =3D write(unixfd, "conn", 4); assert(r =3D=3D 4); =20 alarm(15); r =3D xaccept(fd); =20 - process_one_client(r, pipefd); + process_one_client(r, unixfd); =20 close(fd); return 0; @@ -810,7 +810,7 @@ static void test_ip_tos_sockopt(int fd) xerror("expect socklen_t =3D=3D -1"); } =20 -static int client(int pipefd) +static int client(int unixfd) { int fd =3D -1; =20 @@ -829,7 +829,7 @@ static int client(int pipefd) =20 test_ip_tos_sockopt(fd); =20 - connect_one_server(fd, pipefd); + connect_one_server(fd, unixfd); =20 return 0; } @@ -883,35 +883,35 @@ int main(int argc, char *argv[]) { int e1, e2, wstatus; pid_t s, c, ret; - int pipefds[2]; + int unixfds[2]; =20 parse_opts(argc, argv); =20 init_rng(); =20 - e1 =3D pipe(pipefds); + e1 =3D socketpair(AF_UNIX, SOCK_DGRAM, 0, unixfds); if (e1 < 0) - die_perror("pipe"); + die_perror("socketpair"); =20 s =3D xfork(); if (s =3D=3D 0) { - close(pipefds[0]); - ret =3D server(pipefds[1]); - close(pipefds[1]); + close(unixfds[0]); + ret =3D server(unixfds[1]); + close(unixfds[1]); return ret; } =20 - close(pipefds[1]); + close(unixfds[1]); =20 /* wait until server bound a socket */ - e1 =3D read(pipefds[0], &e1, 4); + e1 =3D read(unixfds[0], &e1, 4); assert(e1 =3D=3D 4); =20 c =3D xfork(); if (c =3D=3D 0) - return client(pipefds[0]); + return client(unixfds[0]); =20 - close(pipefds[0]); + close(unixfds[0]); =20 ret =3D waitpid(s, &wstatus, 0); if (ret =3D=3D -1) --=20 2.53.0 From nobody Fri Jul 10 13:40:54 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A0833CAE8F for ; Fri, 10 Jul 2026 08:59:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673970; cv=none; b=HnRnt0Y9elF04fgPWzniGEkOBhgJtpI0xktoHxuh/6OeNeuyKYbPgu3E8BexXcitU7SmNXby2FAzHCPyBKECAfCV0xMCxTvMJlmSZRGfuTL/KavLXFrBvI/OrrEmgIg0Har8M0/CU2EaCkHtxPfX9Rv5MGUGtVPgrblxW9Us2lM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673970; c=relaxed/simple; bh=y+O4hutA1LCu76Wt2UuZCt+qeKP3z1WTn+2ddWbDVIY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SxxFzxCzCXJM7pa74YBk9T39lzIMRXi1H2FGPkQt3Ax+q4ttFtH7zSYlqeI6lfJT1ADa8gqtiIxbSuaY6MxeB1rTDFXWQAexQfvrdXSIbIDqL4BvkwrQqgAPCsR5z3KY6OaEDlDvvukfsWEqHAgqS65xXU8t1o9Gvh0pwXswlOk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZIrTNet+; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ZIrTNet+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 798711F000E9; Fri, 10 Jul 2026 08:59:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783673969; bh=XT2Fm68Nn9UY4ryLYaSauvHNaV5yHDRBI/NjPuJokbo=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=ZIrTNet+WvWmzfYMwjhYqP+XkKhm2MFqwj32ioVA7vxzAoN/7kOtC9qFL8TQFwtIM u20HNZblxn8af798JLLmJ3wGk2P6IBNk3I9jZ97Tv/JuKEbhJJKT/yqd+mdqx6CXKe QmBa2zHSfPOHJ5XhQ8L+2cwk7uDZ2KARXjM3g4fGAUdBm9n5OqLElLRbFvkBC5vohf 14oA5cdff4Fi+v2QhxYy0DSVRVivW5/ibikUhYdxzPyJUC00gwK6EmQxRHr6f7lUPQ mvPELhHjFF84QCFUXVD7b2Ns40LO5QT7iRo1tIvAS99mCR+VCEMjQUCLJGHhpFcJGZ Yy1PnIAd01vxg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v6 04/10] selftests: mptcp: sockopt: pass echo length over unixfd Date: Fri, 10 Jul 2026 16:59:07 +0800 Message-ID: <8b8e98c1b8727ba6e88d68a770f3cb8ac5f65be2.1783673158.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Pass 'len' from the client to the server over the unixfd control channel so that the client knows the server's payload size in advance for the FIONREAD loop and TCP_CM_INQ validation in subsequent patches. Also keep the unixfd open for the second write by moving 'close(unixfd)' to the end of connect_one_server(). Note: Additionally, silence a -Wstringop-overflow false positive by using 'len - total' as the read size, which lets GCC prove the destination is large enough. Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index fdc7500b79b3..5b6408f92fd6 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -622,10 +622,12 @@ static void connect_one_server(int fd, int unixfd) /* un-block server */ ret =3D read(unixfd, buf2, 4); assert(ret =3D=3D 4); - close(unixfd); =20 assert(strncmp(buf2, "xmit", 4) =3D=3D 0); =20 + ret =3D write(unixfd, &len, sizeof(len)); + assert(ret =3D=3D (ssize_t)sizeof(len)); + ret =3D write(fd, buf, len); if (ret < 0) die_perror("write"); @@ -635,7 +637,7 @@ static void connect_one_server(int fd, int unixfd) =20 total =3D 0; do { - ret =3D read(fd, buf2 + total, sizeof(buf2) - total); + ret =3D read(fd, buf2 + total, len - total); if (ret < 0) die_perror("read"); if (ret =3D=3D 0) { @@ -663,12 +665,14 @@ static void connect_one_server(int fd, int unixfd) if (proto_tx =3D=3D IPPROTO_MPTCP && proto_rx =3D=3D IPPROTO_MPTCP) assert(s.mptcpi_rcv_delta =3D=3D (uint64_t)total); close(fd); + close(unixfd); } =20 static void process_one_client(int fd, int unixfd) { ssize_t ret, ret2, ret3; struct so_state s; + size_t expect_len; char buf[4096]; =20 memset(&s, 0, sizeof(s)); @@ -677,6 +681,12 @@ static void process_one_client(int fd, int unixfd) ret =3D write(unixfd, "xmit", 4); assert(ret =3D=3D 4); =20 + ret =3D read(unixfd, &expect_len, sizeof(expect_len)); + assert(ret =3D=3D (ssize_t)sizeof(expect_len)); + + if (expect_len > sizeof(buf)) + xerror("expect len %zu exceeds buffer size", expect_len); + ret =3D read(fd, buf, sizeof(buf)); if (ret < 0) die_perror("read"); --=20 2.53.0 From nobody Fri Jul 10 13:40:54 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5E7793955FF for ; Fri, 10 Jul 2026 08:59:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673972; cv=none; b=Y62pR7twadrOHL1vrOlG70LNB4K+QqnqfjgLFHyKT6c1KmDzZJyO7glwMbUpdGZu8nPawvl41IKSZZOR7+0fzvoaX3cm3B15qTdyYeuErNJy721Qn/DlWK1qwb7fPqVObhrrS4huo9JwAjr/lEDrwY9pa/80VGeFu0gJp+QtF5Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673972; c=relaxed/simple; bh=gmQFuLF9lzlCjEWNU+AnHKEPuP5eUg6FhsiW1qSxGP4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pQ1a4jL7Fk+WGMQixcDehwX0nPxkZusMkBT/hEtwM0FHVD8J2fijnk3OmnmoM2bn8M+B3IkzM4SDsGeXxNwPbcwJGG98sELVwJnetSacp/HPfqiJ1tESebxQPG6PYWZTB23Tdnr52fygqRDlETJvKvNxz37VA4QdWmVmwF0goF0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=L7Jmh/Sa; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="L7Jmh/Sa" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 052AC1F00A3D; Fri, 10 Jul 2026 08:59:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783673971; bh=DmTdwy28o8ZtWle8pHfQ5SfBwAS9OvDLYZe/HQpUarY=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=L7Jmh/SaBRHZf7+RenRAJhrYlpSLsi3Lmesq3+x+Ojih5bSoqa3ViJfN+KOMsGu2O iXb5L09Mvmo2xO04/u16DE6Br/ShKpbmAkS6gDDCVBPQn4Gxyx922IEDEWD4wEFPCR r7qc6qY3J+JOuEYKX10ZOWIFSEmqIkKSMc8b6lguY0T2ZkVAFRhtnE9io+v6UJc0Ty cLklmLiRBB9iWvqLNJA9l+QqzoYm1y+35g7K+MRf+6yRa1/w9b8SG9YaewBjGOpQ74 k/KESG5HKLyNy+UDg4VBF01v7dkNVHw4qBceSQHp3lhB+T4QB70hz5IvAm4xbG45Ok XNRWvRa02i/Nw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v6 05/10] selftests: mptcp: sockopt: set FIONREAD ioctl Date: Fri, 10 Jul 2026 16:59:08 +0800 Message-ID: <0352c75d470f56b98bbef33e270ac5dd789a91b5.1783673158.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Implement FIONREAD ioctl checks to validate available data size, ensuring synchronization between write and read operations with non-blocking waits. These codes are from mptcp_inq.c. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 5b6408f92fd6..0bd5a9c51332 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -20,6 +20,7 @@ #include #include #include +#include =20 #include #include @@ -687,6 +688,24 @@ static void process_one_client(int fd, int unixfd) if (expect_len > sizeof(buf)) xerror("expect len %zu exceeds buffer size", expect_len); =20 + for (;;) { + struct timespec req; + unsigned int queued; + + ret =3D ioctl(fd, FIONREAD, &queued); + if (ret < 0) + die_perror("FIONREAD"); + if (queued > expect_len) + xerror("FIONREAD returned %u, but only %zu expected\n", + queued, expect_len); + if (queued =3D=3D expect_len) + break; + + req.tv_sec =3D 0; + req.tv_nsec =3D 1000 * 1000ul; + nanosleep(&req, NULL); + } + ret =3D read(fd, buf, sizeof(buf)); if (ret < 0) die_perror("read"); --=20 2.53.0 From nobody Fri Jul 10 13:40:54 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 975073A451E for ; Fri, 10 Jul 2026 08:59:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673975; cv=none; b=NtT8ODvWEwlsqY5ZiTxgQfrlsWbdi/s9Gm4FbSKdjzixc7zoyvGLqNVCBbCng6laC2B59ikOsG6hYp7gPXGRVYn5g+yM0jUaxeIv4ljbAogTd46jR6d5e8h3Cvtm6SOaGZGgdkQ7G/4ma3UvAhOmFlOPeXO3yYWjfReGAnz2fJQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673975; c=relaxed/simple; bh=+8N5vwlrtwG9DQ4AM8fzWYh9Pb2zp8sJ9SzcNOEtA/w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oOg+OjIL+2b49wQ9HJILqD0ntcfRtbvM0SMbR4I3fgNh/mRoiPQ1A6PpafpvUajZRG2QVk4Wuq5XL7qveqYBpjp0tS8apHb1Tul78TPvADOQY9lnnEpQykFYGsrZY6FPdopbtDYWC3FUA61eE8GnZrW5BrRZStYH+5Anc5sRc0g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hD4fmcdd; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hD4fmcdd" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A32FE1F000E9; Fri, 10 Jul 2026 08:59:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783673972; bh=2HWcyXxsgQ2XqhMb4o0HVs91veWFCFp94TkkzfEURcY=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=hD4fmcddCKc4ZoSYO0aO81nDAZDZyxgVPGOoa8w9ruf2n8NJc09ucQqnkotKHK4lI +78l5IKypoabC34wqY5f3//9z8OtuMeLlh7Ae42eAo7Si5gDslkHFvvZHjb3OJMjt3 ReogQlRaVZ5fPpcVPCzIGzUvVl/p/zLkVkeLohNeE9/lHEJ43X7qaiB8xcmMrori/g PdNfOUWPZPD42IBpp/Z8l+mFXdRFe3QRNn6iKlDXt63RBbfzSrOEYhbsBODfkbuXtp lnU/yu5Vw3wVnsrhmDRNaQOjMGCCf/2j8AUx+pZUkXPr2qaL/SQHdmj/kkolBhhwrW 86tZwr5qFfYXg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v6 06/10] selftests: mptcp: sockopt: add huge data transfer tests Date: Fri, 10 Jul 2026 16:59:09 +0800 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Introduce huge data transfer tests (1-17 MB) to validate MPTCP socket options under high-volume conditions, including proper EOF handling, preparing for TCP_INQ support in subsequent patches. These codes are from mptcp_inq.c, but here they have been placed into two separate functions. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 132 +++++++++++++++++- 1 file changed, 126 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 0bd5a9c51332..16b58f6ac7b7 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -596,6 +596,55 @@ static void do_getsockopts(struct so_state *s, int fd,= size_t r, size_t w) do_getsockopt_mptcp_full_info(s, fd); } =20 +static void server_huge_transfer(int fd, int unixfd, size_t len) +{ + char buf[4096], buf2[4]; + size_t i, total; + ssize_t ret; + + for (i =3D 0; i < len ; i++) { + buf[i] =3D rand() % 26; + buf[i] +=3D 'A'; + } + + buf[i] =3D '\n'; + + ret =3D read(unixfd, buf2, 4); + assert(ret =3D=3D 4); + assert(strncmp(buf2, "huge", 4) =3D=3D 0); + + total =3D rand() % (16 * 1024 * 1024); + total +=3D (1 * 1024 * 1024); + + ret =3D write(unixfd, &total, sizeof(total)); + assert(ret =3D=3D (ssize_t)sizeof(total)); + + while (total > 0) { + if (total > sizeof(buf)) + len =3D sizeof(buf); + else + len =3D total; + + ret =3D write(fd, buf, len); + if (ret < 0) + die_perror("write"); + total -=3D ret; + + /* we don't have to care about buf content, only + * number of total bytes sent + */ + } + + ret =3D read(unixfd, buf2, 4); + assert(ret =3D=3D 4); + assert(strncmp(buf2, "shut", 4) =3D=3D 0); + + ret =3D write(fd, buf, 1); + assert(ret =3D=3D 1); + ret =3D write(unixfd, "closed", 6); + assert(ret =3D=3D 6); +} + static void connect_one_server(int fd, int unixfd) { char buf[4096], buf2[4096]; @@ -665,16 +714,83 @@ static void connect_one_server(int fd, int unixfd) =20 if (proto_tx =3D=3D IPPROTO_MPTCP && proto_rx =3D=3D IPPROTO_MPTCP) assert(s.mptcpi_rcv_delta =3D=3D (uint64_t)total); + + if (inq) + server_huge_transfer(fd, unixfd, len); + close(fd); close(unixfd); } =20 +static size_t client_huge_transfer(int fd, int unixfd) +{ + char msg_buf[4096]; + size_t expect_len; + ssize_t ret, tot; + char buf[4096]; + char tmp[16]; + struct iovec iov =3D { + .iov_base =3D buf, + .iov_len =3D 1, + }; + struct msghdr msg =3D { + .msg_iov =3D &iov, + .msg_iovlen =3D 1, + .msg_control =3D msg_buf, + .msg_controllen =3D sizeof(msg_buf), + }; + + /* request a large swath of data. */ + ret =3D write(unixfd, "huge", 4); + assert(ret =3D=3D 4); + + ret =3D read(unixfd, &expect_len, sizeof(expect_len)); + assert(ret =3D=3D (ssize_t)sizeof(expect_len)); + + /* peer should send us a few mb of data */ + if (expect_len <=3D sizeof(buf)) + xerror("expect len %zu too small\n", expect_len); + + tot =3D 0; + do { + iov.iov_len =3D sizeof(buf); + msg.msg_controllen =3D sizeof(msg_buf); + ret =3D recvmsg(fd, &msg, 0); + if (ret < 0) + die_perror("recvmsg"); + if (ret =3D=3D 0) + xerror("unexpected EOF in huge recv"); + + tot +=3D ret; + } while ((size_t)tot < expect_len); + + ret =3D write(unixfd, "shut", 4); + assert(ret =3D=3D 4); + + /* wait for hangup. Should have received one more byte of data. */ + ret =3D read(unixfd, tmp, sizeof(tmp)); + assert(ret =3D=3D 6); + assert(strncmp(tmp, "closed", 6) =3D=3D 0); + + sleep(1); + + iov.iov_len =3D 1; + msg.msg_controllen =3D sizeof(msg_buf); + ret =3D recvmsg(fd, &msg, 0); + if (ret < 0) + die_perror("recvmsg"); + assert(ret =3D=3D 1); + + return tot + 1; +} + static void process_one_client(int fd, int unixfd) { ssize_t ret, ret2, ret3; struct so_state s; size_t expect_len; char buf[4096]; + size_t r =3D 0; =20 memset(&s, 0, sizeof(s)); do_getsockopts(&s, fd, 0, 0); @@ -719,16 +835,20 @@ static void process_one_client(int fd, int unixfd) if (ret2 < 0) die_perror("write"); =20 + if (inq) + r =3D client_huge_transfer(fd, unixfd); + /* wait for hangup */ ret3 =3D read(fd, buf, 1); if (ret3 !=3D 0) xerror("expected EOF, got %lu", ret3); =20 - do_getsockopts(&s, fd, ret, ret2); + do_getsockopts(&s, fd, ret + r, ret2); if (proto_tx =3D=3D IPPROTO_MPTCP && proto_rx =3D=3D IPPROTO_MPTCP && - s.mptcpi_rcv_delta !=3D (uint64_t)ret + 1) + s.mptcpi_rcv_delta !=3D (uint64_t)ret + r + 1) xerror("mptcpi_rcv_delta %" PRIu64 ", expect %" PRIu64 ", diff %" PRId64, - s.mptcpi_rcv_delta, ret + 1, s.mptcpi_rcv_delta - (ret + 1)); + s.mptcpi_rcv_delta, ret + r + 1, + s.mptcpi_rcv_delta - (ret + r + 1)); =20 /* be nice when running on top of older kernel */ if (s.pkt_stats_avail) { @@ -737,11 +857,11 @@ static void process_one_client(int fd, int unixfd) ", diff %" PRId64, s.last_sample.mptcpi_bytes_sent, ret2, s.last_sample.mptcpi_bytes_sent - ret2); - if (s.last_sample.mptcpi_bytes_received !=3D ret) + if (s.last_sample.mptcpi_bytes_received !=3D ret + r) xerror("mptcpi_bytes_received %" PRIu64 ", expect %" PRIu64 ", diff %" PRId64, - s.last_sample.mptcpi_bytes_received, ret, - s.last_sample.mptcpi_bytes_received - ret); + s.last_sample.mptcpi_bytes_received, ret + r, + s.last_sample.mptcpi_bytes_received - (ret + r)); if (s.last_sample.mptcpi_bytes_acked !=3D ret) xerror("mptcpi_bytes_acked %" PRIu64 ", expect %" PRIu64 ", diff %" PRId64, --=20 2.53.0 From nobody Fri Jul 10 13:40:54 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E35B03C8182 for ; Fri, 10 Jul 2026 08:59:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673976; cv=none; b=UhzoPAjAgBlo7M1C4s5AQfQiuR+e24Mt6nPKCg7yeFCQRMjbAs8GIgnPmVxdv80HwbHYiodFfZv+hxkUf3kKHlAFv6dlB8wOrIoRJxcx6IlcqyrJyxNa5yDVO3Dt1xZvO2KEDoRY6q036ga/+npyIKCTJ7IBl7vDomO9y3gYSFU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673976; c=relaxed/simple; bh=M029lbGzAkMEP+nQtfI1E9GVZ5Yxlk81bMtYkjJ99os=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qmFL7pUSiQQ46eUBMacrh9B1WOXUo2l/IBpOc4NPiLfHCj+4HRaqOVW+/MWRVGI+J6nQgunnocivorHgfItQ1zZltWgRZryH3lfPY8g2R0zXIZxosFtUCBPgh2RiDBKZxNx9KG5HoBxHV57o27nFtNZvWk+FsPcUt0ex18Qdbj0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dhrqn0xo; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="dhrqn0xo" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7CAA31F00A3A; Fri, 10 Jul 2026 08:59:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783673974; bh=hup+mlI7ipn8n1l4qPCTi18I+4c0oU5a9VFd++yfVCM=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=dhrqn0xo9f80Fzon7OwHzFU3kYJLqaGJ9Er96sG8KI44a1eylbkb9iN+MWNM8IXTq vltMJ+cqcI3g+YY2EjwLfUxEm/BsPT3Rpbr34+e/dJAEjplPxi0hd/jgfnZIzjCbJz 3MheIlriVrF32n7MErtBhF12pECtqYy8au7aeoWMi7D6yVVF1IWgaDwcn89F9lI7Gs HomUR1KaWS+sUPvbTfJAROjn3uEcFptisWb2jA70erkgnFOhS6jeYIxb+HB6eIM3au xB6OwYWE70SZhqZqdMrq+rKp5rJI1qd3SVzRhukklbn+Wszbp1qkU0mu3MGazUiKPV pRJOmU2UVePyw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v6 07/10] selftests: mptcp: sockopt: add wait_for_ack helper Date: Fri, 10 Jul 2026 16:59:10 +0800 Message-ID: <1cf028e5469b5e041d05b18fcf8271300c983d3a.1783673158.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Add wait_for_ack() helper using TIOCOUTQ/SIOCOUTQNSD ioctls to synchronize tests by waiting for data acknowledgment before proceeding. These codes are from mptcp_inq.c. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 16b58f6ac7b7..bc2cb3db3264 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -26,6 +26,7 @@ #include =20 #include +#include #include =20 static int pf =3D AF_INET; @@ -596,10 +597,44 @@ static void do_getsockopts(struct so_state *s, int fd= , size_t r, size_t w) do_getsockopt_mptcp_full_info(s, fd); } =20 +/* wait up to timeout milliseconds */ +static void wait_for_ack(int fd, int timeout, size_t total) +{ + int i; + + for (i =3D 0; i < timeout; i++) { + int nsd, ret, queued =3D -1; + struct timespec req; + + ret =3D ioctl(fd, TIOCOUTQ, &queued); + if (ret < 0) + die_perror("TIOCOUTQ"); + + ret =3D ioctl(fd, SIOCOUTQNSD, &nsd); + if (ret < 0) + die_perror("SIOCOUTQNSD"); + + if ((size_t)queued > total) + xerror("TIOCOUTQ %u, but only %zu expected\n", + queued, total); + assert(nsd <=3D queued); + + if (queued =3D=3D 0) + return; + + /* wait for peer to ack rx of all data */ + req.tv_sec =3D 0; + req.tv_nsec =3D 1 * 1000 * 1000ul; /* 1ms */ + nanosleep(&req, NULL); + } + + xerror("still tx data queued after %u ms\n", timeout); +} + static void server_huge_transfer(int fd, int unixfd, size_t len) { char buf[4096], buf2[4]; - size_t i, total; + size_t i, total, sent; ssize_t ret; =20 for (i =3D 0; i < len ; i++) { @@ -615,10 +650,13 @@ static void server_huge_transfer(int fd, int unixfd, = size_t len) =20 total =3D rand() % (16 * 1024 * 1024); total +=3D (1 * 1024 * 1024); + sent =3D total; =20 ret =3D write(unixfd, &total, sizeof(total)); assert(ret =3D=3D (ssize_t)sizeof(total)); =20 + wait_for_ack(fd, 5000, len); + while (total > 0) { if (total > sizeof(buf)) len =3D sizeof(buf); @@ -639,6 +677,8 @@ static void server_huge_transfer(int fd, int unixfd, si= ze_t len) assert(ret =3D=3D 4); assert(strncmp(buf2, "shut", 4) =3D=3D 0); =20 + wait_for_ack(fd, 5000, sent); + ret =3D write(fd, buf, 1); assert(ret =3D=3D 1); ret =3D write(unixfd, "closed", 6); --=20 2.53.0 From nobody Fri Jul 10 13:40:54 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5B54F3955FF for ; Fri, 10 Jul 2026 08:59:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673977; cv=none; b=QRFkdfM8WzXHUCS39+nydCdB/fpLgaLXGcOShewsyLX+oeIBhqh+V1gzq7n5JfwbYcemRbGRAHGS+TipRe93SErWrP3byXR+iSyEpNPQ18obaBBPTN0zZyTUiNj97lLjAybbVLfhOHGudUn6iI4oGFpoqrlas4HZ1aIjsGa5/NA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673977; c=relaxed/simple; bh=nbu9tbCCvcdWYQakc4RgLYYU/XEwbCUUQ2XVlkUd1ow=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r45aKwMNfcESdS5OlccOvYQqX9J4RrglhmmbCwwdxz/cjEzJLl5QowTRb9anLmM9HaUWjsechpyLdLCt2xIJgEZvQsW0xQCWOnwU9WaccJVNcWc6H3H4NPRm35zTz6TRZ1hxycuLWNi3Glqf5rsWKgUdQe6OJz4wJikdlQynmns= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ev5cKVoB; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ev5cKVoB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3DD7D1F000E9; Fri, 10 Jul 2026 08:59:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783673976; bh=vCL+PChNIQgknZgQo9Zf8mMHqnA7rRQocx3VDAipCDI=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=ev5cKVoBDX+iV3LTdTl+jkyRMz3UcljoCfF7zJHLDT4fQkmVxE+g20mx/K08zPr3k JEO61HMcucinBDgVkEvktR7Py6NaFEIDFiYfxBZYY9SWHdWB1/1JlhCcEeFVoyk0EL oirKrqyaZiThDuQvNrDry2C7Zbt7QExITCmDEfOAujf+MirDLzKktlkPSxeIAyJ+u1 eb/eycb9Y+rT0Im7ZnZsXBUwwZlnjLkdOZBwv2Ed0RbjhVbbZcd9sQWwIRdg+ZFsr0 G2suvMuod1XAtmV+GwneD3yESi3uSfoqSDiVos5elFsUjf4SpkOFX7IAvgcmIyn/0d nsNG2zCbz3OVA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v6 08/10] selftests: mptcp: sockopt: use recvmsg instead of read Date: Fri, 10 Jul 2026 16:59:11 +0800 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Replace read() with recvmsg() in process_one_client() to enable control message (CMSG) handling. The original read(fd, buf, sizeof(buf)) is split into two recvmsg() calls: the first reads exactly one byte, and the second reads the remaining bytes. This allows the code to access CMSG data for each received segment, facilitating the upcoming TCP_INQ validation. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index bc2cb3db3264..53852b44cfeb 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -827,10 +827,21 @@ static size_t client_huge_transfer(int fd, int unixfd) static void process_one_client(int fd, int unixfd) { ssize_t ret, ret2, ret3; + char msg_buf[4096]; struct so_state s; size_t expect_len; char buf[4096]; size_t r =3D 0; + struct iovec iov =3D { + .iov_base =3D buf, + .iov_len =3D 1, + }; + struct msghdr msg =3D { + .msg_iov =3D &iov, + .msg_iovlen =3D 1, + .msg_control =3D msg_buf, + .msg_controllen =3D sizeof(msg_buf), + }; =20 memset(&s, 0, sizeof(s)); do_getsockopts(&s, fd, 0, 0); @@ -862,9 +873,20 @@ static void process_one_client(int fd, int unixfd) nanosleep(&req, NULL); } =20 - ret =3D read(fd, buf, sizeof(buf)); + /* read one byte */ + ret =3D recvmsg(fd, &msg, 0); + if (ret < 0) + die_perror("recvmsg"); + + iov.iov_base =3D buf + 1; + iov.iov_len =3D sizeof(buf) - 1; + msg.msg_controllen =3D sizeof(msg_buf); + ret =3D recvmsg(fd, &msg, 0); if (ret < 0) - die_perror("read"); + die_perror("recvmsg"); + + /* add the first byte */ + ret +=3D 1; =20 assert(s.mptcpi_rcv_delta <=3D (uint64_t)ret); =20 @@ -879,7 +901,9 @@ static void process_one_client(int fd, int unixfd) r =3D client_huge_transfer(fd, unixfd); =20 /* wait for hangup */ - ret3 =3D read(fd, buf, 1); + iov.iov_len =3D 1; + msg.msg_controllen =3D sizeof(msg_buf); + ret3 =3D recvmsg(fd, &msg, 0); if (ret3 !=3D 0) xerror("expected EOF, got %lu", ret3); =20 --=20 2.53.0 From nobody Fri Jul 10 13:40:54 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3A9153CE497 for ; Fri, 10 Jul 2026 08:59:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673979; cv=none; b=JXJJ9R1CJCgt51tu86Icv2aCB8ajPKtQgrqsHoKYg4br5GcSESSxVwA4SLm5r23AY6UNtD2tq5B+/60NFP1FwPsuheopcDjFAuMHExOWJlmvqDUFBLL6fpCxDS+Eh1PhVAZ5VyOHgkSbJvk2p0nVsc6jiCuM4UHAr4MtgrOR9gI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673979; c=relaxed/simple; bh=53h4Mt5WAYNzmBKihqoyepbM+3rtvMNhbT7rt125pcA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IkVKi1HHswer6X+T8mNRBn3j0E0tR8CbJ0zHLe8LQorFxGyxFNz4kKCOcf8bXUCsrmSQ+EU7v0GeiXOUdVzPwaxVBJTCU6LC5P1ixyRAapIPUoiZ9zaOf7BJE/g6LsS8uKVG9PMju5liuT2vqKYZZl48bgMtpzeo1xm3gRkep9c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=e5PmRiMb; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="e5PmRiMb" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D9A5F1F00A3A; Fri, 10 Jul 2026 08:59:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783673977; bh=3ZVZ+WuGBQtQB9i5kiP9Uaa3mDCnJKynM8HoZ4bLa4c=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=e5PmRiMb/Zu03vJMM6JsbPr5VHbzmM948ULU32EeZclrQ7NR0InjfaXBIfjDl6w+B 9TzrYMLPlWFNcNDQu8mN3YEj55EbG8P7UVqk5nrg8GDkXanddVvhrBnEFvaraorzRa tNT8rWVNrignyVbuUHNcQ7jb7Dv+UXmR8htSqhylDFvoQwGvyPbDXYcUNoSIuS7yBR WLvdMuauMbziS03Eh1z5ey8kIYykrGFor7LUQqHgXc/ZgGqsM/FpKcFTTv/avkImI/ 5k3w/SoWh8r99VyKgX+e0ABSH90Z4NRgTlKAeujs7Bs+ICt7KU4CpRXZXXRx2Sr/fK vRycwYUbFe6Gw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v6 09/10] selftests: mptcp: sockopt: add get_tcp_inq helper Date: Fri, 10 Jul 2026 16:59:12 +0800 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Add check_tcp_inq() helper to extract and verify TCP_CM_INQ values from control messages, ensuring correct in-queue data tracking during transfers. These codes are from mptcp_inq.c. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 53852b44cfeb..ac209070e8f2 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -762,8 +762,28 @@ static void connect_one_server(int fd, int unixfd) close(unixfd); } =20 +static void get_tcp_inq(struct msghdr *msgh, unsigned int *inqv) +{ + struct cmsghdr *cmsg; + + for (cmsg =3D CMSG_FIRSTHDR(msgh); cmsg; + cmsg =3D CMSG_NXTHDR(msgh, cmsg)) { + if (cmsg->cmsg_level =3D=3D IPPROTO_TCP && + cmsg->cmsg_type =3D=3D TCP_CM_INQ) { + if (cmsg->cmsg_len < CMSG_LEN(sizeof(*inqv))) + xerror("TCP_CM_INQ cmsg_len too small: %u", + cmsg->cmsg_len); + memcpy(inqv, CMSG_DATA(cmsg), sizeof(*inqv)); + return; + } + } + + xerror("could not find TCP_CM_INQ cmsg type"); +} + static size_t client_huge_transfer(int fd, int unixfd) { + unsigned int tcp_inq; char msg_buf[4096]; size_t expect_len; ssize_t ret, tot; @@ -802,6 +822,14 @@ static size_t client_huge_transfer(int fd, int unixfd) xerror("unexpected EOF in huge recv"); =20 tot +=3D ret; + + get_tcp_inq(&msg, &tcp_inq); + + if (tcp_inq > expect_len - tot) + xerror("inq %d, remaining %zu total_len %d\n", + tcp_inq, expect_len - tot, (int)expect_len); + + assert(tcp_inq <=3D expect_len - tot); } while ((size_t)tot < expect_len); =20 ret =3D write(unixfd, "shut", 4); @@ -821,12 +849,18 @@ static size_t client_huge_transfer(int fd, int unixfd) die_perror("recvmsg"); assert(ret =3D=3D 1); =20 + get_tcp_inq(&msg, &tcp_inq); + + /* tcp_inq should be 1 due to received fin. */ + assert(tcp_inq =3D=3D 1); + return tot + 1; } =20 static void process_one_client(int fd, int unixfd) { ssize_t ret, ret2, ret3; + unsigned int tcp_inq; char msg_buf[4096]; struct so_state s; size_t expect_len; @@ -878,6 +912,16 @@ static void process_one_client(int fd, int unixfd) if (ret < 0) die_perror("recvmsg"); =20 + if (inq) { + if (msg.msg_controllen =3D=3D 0) + xerror("msg_controllen is 0"); + + get_tcp_inq(&msg, &tcp_inq); + + /* expect cmsg to return expected - 1 */ + assert((size_t)tcp_inq =3D=3D (expect_len - 1)); + } + iov.iov_base =3D buf + 1; iov.iov_len =3D sizeof(buf) - 1; msg.msg_controllen =3D sizeof(msg_buf); @@ -885,6 +929,15 @@ static void process_one_client(int fd, int unixfd) if (ret < 0) die_perror("recvmsg"); =20 + if (inq) { + /* should have gotten exact remainder of all pending data */ + assert(ret =3D=3D (ssize_t)tcp_inq); + + /* should be 0, all drained */ + get_tcp_inq(&msg, &tcp_inq); + assert(tcp_inq =3D=3D 0); + } + /* add the first byte */ ret +=3D 1; =20 @@ -907,6 +960,11 @@ static void process_one_client(int fd, int unixfd) if (ret3 !=3D 0) xerror("expected EOF, got %lu", ret3); =20 + if (inq) { + get_tcp_inq(&msg, &tcp_inq); + assert(tcp_inq =3D=3D 1); + } + do_getsockopts(&s, fd, ret + r, ret2); if (proto_tx =3D=3D IPPROTO_MPTCP && proto_rx =3D=3D IPPROTO_MPTCP && s.mptcpi_rcv_delta !=3D (uint64_t)ret + r + 1) --=20 2.53.0 From nobody Fri Jul 10 13:40:54 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D681B3C552B for ; Fri, 10 Jul 2026 08:59:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673981; cv=none; b=u2DuBKr4VFcQcPEO3C+yfzEtEs5j+WrwxC8HzJEgyQ4L+Xq8f5mJA1qUXCOXFdArAxSlN49Q0toL4b6eqX3fXC6D+HFvpYyjMLVAOoIB8CzVaEIL8PCZAG1qBWElMDKV/qwIoktqVLrTCunWkCwDBWsQpbQPWPjxHvlDarGuwZ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783673981; c=relaxed/simple; bh=davJKfqwFimkolEUfNpeKWCrS9Rq7pqt3dECx1AXij0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GiUvMPOtliB0mCEGALmtgp/vXX71qDxisUB85iFw+Wa8vmDXLM0t2ekrs9AlZzO0/mok4Krq4aMGU+cVEICZABjPzbbLBbCKrQhI5TFKJwAWi3KCBlN9nrd5xue3UHgL4D3B2FLLfqQKlH1t5HpKyB0DfGa8ujV8EXGKUEH2XGU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=B83CgW9c; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="B83CgW9c" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 81AEE1F000E9; Fri, 10 Jul 2026 08:59:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783673979; bh=ldIVz/66ucoc/dYa9TXv1iVoC+LHiG88H8RV5q/XyRg=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=B83CgW9cZA2DOsA7SbcGOKm3yvoPtd9MgtWONNdsA3yO0PZvkqzB+U4P/sDoSqOAw y+AF1Blc9aDrwhgONaZGf/XnVdu9l0Mus+ZtSAy69/9l/exfuTjuoVY9YqTkjCGEbX +0MHVINfO18AbRcz0R3AJKu+zqoVnQAkMtA6a7BTNv4bYjWm+sAGgbg8HtQq+A6OZL 2Q3WsSNCeKu06am5LxQM/yXkV9Qp1cwnk8d8elIfAZZB3MIyldKJKjulnhJKdNp4P6 ng56kw1BsB27Jn5qeU7+GvRLBdkwsPrwqWNB0GB5HEgSRc4C+zSynbzMAfHMU+2EEs UoY5idS44xjlg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v6 10/10] selftests: mptcp: sockopt: replace mptcp_inq with sockopt Date: Fri, 10 Jul 2026 16:59:13 +0800 Message-ID: <5f246024b44454c951179a7809cf6360a0c5cf99.1783673158.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Update mptcp_sockopt.sh to use mptcp_sockopt binary instead of mptcp_inq. This consolidates TCP_INQ testing into a single test binary while maintaining equivalent test coverage. Delete mptcp_inq binary and references since its functionality has been fully integrated into mptcp_sockopt. This simplifies the test suite structure and reduces maintenance overhead. Signed-off-by: Geliang Tang --- 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.sh | 8 +- 4 files changed, 4 insertions(+), 620 deletions(-) delete mode 100644 tools/testing/selftests/net/mptcp/mptcp_inq.c diff --git a/tools/testing/selftests/net/mptcp/.gitignore b/tools/testing/s= elftests/net/mptcp/.gitignore index 833279fb34e2..c62e91ce385d 100644 --- a/tools/testing/selftests/net/mptcp/.gitignore +++ b/tools/testing/selftests/net/mptcp/.gitignore @@ -1,7 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-only mptcp_connect mptcp_diag -mptcp_inq mptcp_sockopt pm_nl_ctl *.pcap diff --git a/tools/testing/selftests/net/mptcp/Makefile b/tools/testing/sel= ftests/net/mptcp/Makefile index 22ba0da2adb8..fa80e6448728 100644 --- a/tools/testing/selftests/net/mptcp/Makefile +++ b/tools/testing/selftests/net/mptcp/Makefile @@ -22,7 +22,6 @@ TEST_PROGS :=3D \ TEST_GEN_FILES :=3D \ mptcp_connect \ mptcp_diag \ - mptcp_inq \ mptcp_sockopt \ pm_nl_ctl \ # end of TEST_GEN_FILES diff --git a/tools/testing/selftests/net/mptcp/mptcp_inq.c b/tools/testing/= selftests/net/mptcp/mptcp_inq.c deleted file mode 100644 index 5716998da192..000000000000 --- a/tools/testing/selftests/net/mptcp/mptcp_inq.c +++ /dev/null @@ -1,614 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#ifndef IPPROTO_MPTCP -#define IPPROTO_MPTCP 262 -#endif -#ifndef SOL_MPTCP -#define SOL_MPTCP 284 -#endif - -static int pf =3D AF_INET; -static int proto_tx =3D IPPROTO_MPTCP; -static int proto_rx =3D IPPROTO_MPTCP; - -static void __noreturn die_perror(const char *msg) -{ - perror(msg); - exit(1); -} - -static void die_usage(int r) -{ - fprintf(stderr, "Usage: mptcp_inq [-6] [ -t tcp|mptcp ] [ -r tcp|mptcp]\n= "); - exit(r); -} - -static void __noreturn xerror(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - fputc('\n', stderr); - exit(1); -} - -static const char *getxinfo_strerr(int err) -{ - if (err =3D=3D EAI_SYSTEM) - return strerror(errno); - - return gai_strerror(err); -} - -static void xgetaddrinfo(const char *node, const char *service, - struct addrinfo *hints, - struct addrinfo **res) -{ - int err; - -again: - err =3D getaddrinfo(node, service, hints, res); - if (err) { - const char *errstr; - - if (err =3D=3D EAI_SOCKTYPE) { - hints->ai_protocol =3D IPPROTO_TCP; - goto again; - } - - errstr =3D getxinfo_strerr(err); - - fprintf(stderr, "Fatal: getaddrinfo(%s:%s): %s\n", - node ? node : "", service ? service : "", errstr); - exit(1); - } -} - -static int sock_listen_mptcp(const char * const listenaddr, - const char * const port) -{ - int sock =3D -1; - struct addrinfo hints =3D { - .ai_protocol =3D IPPROTO_MPTCP, - .ai_socktype =3D SOCK_STREAM, - .ai_flags =3D AI_PASSIVE | AI_NUMERICHOST - }; - - hints.ai_family =3D pf; - - struct addrinfo *a, *addr; - int one =3D 1; - - xgetaddrinfo(listenaddr, port, &hints, &addr); - hints.ai_family =3D pf; - - for (a =3D addr; a; a =3D a->ai_next) { - sock =3D socket(a->ai_family, a->ai_socktype, proto_rx); - if (sock < 0) - continue; - - if (-1 =3D=3D setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, - sizeof(one))) - perror("setsockopt"); - - if (bind(sock, a->ai_addr, a->ai_addrlen) =3D=3D 0) - break; /* success */ - - perror("bind"); - close(sock); - sock =3D -1; - } - - freeaddrinfo(addr); - - if (sock < 0) - xerror("could not create listen socket"); - - if (listen(sock, 20)) - die_perror("listen"); - - return sock; -} - -static int sock_connect_mptcp(const char * const remoteaddr, - const char * const port, int proto) -{ - struct addrinfo hints =3D { - .ai_protocol =3D IPPROTO_MPTCP, - .ai_socktype =3D SOCK_STREAM, - }; - struct addrinfo *a, *addr; - int sock =3D -1; - - hints.ai_family =3D pf; - - xgetaddrinfo(remoteaddr, port, &hints, &addr); - for (a =3D addr; a; a =3D a->ai_next) { - sock =3D socket(a->ai_family, a->ai_socktype, proto); - if (sock < 0) - continue; - - if (connect(sock, a->ai_addr, a->ai_addrlen) =3D=3D 0) - break; /* success */ - - die_perror("connect"); - } - - if (sock < 0) - xerror("could not create connect socket"); - - freeaddrinfo(addr); - return sock; -} - -static int protostr_to_num(const char *s) -{ - if (strcasecmp(s, "tcp") =3D=3D 0) - return IPPROTO_TCP; - if (strcasecmp(s, "mptcp") =3D=3D 0) - return IPPROTO_MPTCP; - - die_usage(1); - return 0; -} - -static void parse_opts(int argc, char **argv) -{ - int c; - - while ((c =3D getopt(argc, argv, "h6t:r:")) !=3D -1) { - switch (c) { - case 'h': - die_usage(0); - break; - case '6': - pf =3D AF_INET6; - break; - case 't': - proto_tx =3D protostr_to_num(optarg); - break; - case 'r': - proto_rx =3D protostr_to_num(optarg); - break; - default: - die_usage(1); - break; - } - } -} - -/* wait up to timeout milliseconds */ -static void wait_for_ack(int fd, int timeout, size_t total) -{ - int i; - - for (i =3D 0; i < timeout; i++) { - int nsd, ret, queued =3D -1; - struct timespec req; - - ret =3D ioctl(fd, TIOCOUTQ, &queued); - if (ret < 0) - die_perror("TIOCOUTQ"); - - ret =3D ioctl(fd, SIOCOUTQNSD, &nsd); - if (ret < 0) - die_perror("SIOCOUTQNSD"); - - if ((size_t)queued > total) - xerror("TIOCOUTQ %u, but only %zu expected\n", queued, total); - assert(nsd <=3D queued); - - if (queued =3D=3D 0) - return; - - /* wait for peer to ack rx of all data */ - req.tv_sec =3D 0; - req.tv_nsec =3D 1 * 1000 * 1000ul; /* 1ms */ - nanosleep(&req, NULL); - } - - xerror("still tx data queued after %u ms\n", timeout); -} - -static void connect_one_server(int fd, int unixfd) -{ - size_t len, i, total, sent; - char buf[4096], buf2[4096]; - ssize_t ret; - - len =3D rand() % (sizeof(buf) - 1); - - if (len < 128) - len =3D 128; - - for (i =3D 0; i < len ; i++) { - buf[i] =3D rand() % 26; - buf[i] +=3D 'A'; - } - - buf[i] =3D '\n'; - - /* un-block server */ - ret =3D read(unixfd, buf2, 4); - assert(ret =3D=3D 4); - - assert(strncmp(buf2, "xmit", 4) =3D=3D 0); - - ret =3D write(unixfd, &len, sizeof(len)); - assert(ret =3D=3D (ssize_t)sizeof(len)); - - ret =3D write(fd, buf, len); - if (ret < 0) - die_perror("write"); - - if (ret !=3D (ssize_t)len) - xerror("short write"); - - ret =3D read(unixfd, buf2, 4); - assert(strncmp(buf2, "huge", 4) =3D=3D 0); - - total =3D rand() % (16 * 1024 * 1024); - total +=3D (1 * 1024 * 1024); - sent =3D total; - - ret =3D write(unixfd, &total, sizeof(total)); - assert(ret =3D=3D (ssize_t)sizeof(total)); - - wait_for_ack(fd, 5000, len); - - while (total > 0) { - if (total > sizeof(buf)) - len =3D sizeof(buf); - else - len =3D total; - - ret =3D write(fd, buf, len); - if (ret < 0) - die_perror("write"); - total -=3D ret; - - /* we don't have to care about buf content, only - * number of total bytes sent - */ - } - - ret =3D read(unixfd, buf2, 4); - assert(ret =3D=3D 4); - assert(strncmp(buf2, "shut", 4) =3D=3D 0); - - wait_for_ack(fd, 5000, sent); - - ret =3D write(fd, buf, 1); - assert(ret =3D=3D 1); - close(fd); - ret =3D write(unixfd, "closed", 6); - assert(ret =3D=3D 6); - - close(unixfd); -} - -static void get_tcp_inq(struct msghdr *msgh, unsigned int *inqv) -{ - struct cmsghdr *cmsg; - - for (cmsg =3D CMSG_FIRSTHDR(msgh); cmsg ; cmsg =3D CMSG_NXTHDR(msgh, cmsg= )) { - if (cmsg->cmsg_level =3D=3D IPPROTO_TCP && cmsg->cmsg_type =3D=3D TCP_CM= _INQ) { - memcpy(inqv, CMSG_DATA(cmsg), sizeof(*inqv)); - return; - } - } - - xerror("could not find TCP_CM_INQ cmsg type"); -} - -static void process_one_client(int fd, int unixfd) -{ - unsigned int tcp_inq; - size_t expect_len; - char msg_buf[4096]; - char buf[4096]; - char tmp[16]; - struct iovec iov =3D { - .iov_base =3D buf, - .iov_len =3D 1, - }; - struct msghdr msg =3D { - .msg_iov =3D &iov, - .msg_iovlen =3D 1, - .msg_control =3D msg_buf, - .msg_controllen =3D sizeof(msg_buf), - }; - ssize_t ret, tot; - - ret =3D write(unixfd, "xmit", 4); - assert(ret =3D=3D 4); - - ret =3D read(unixfd, &expect_len, sizeof(expect_len)); - assert(ret =3D=3D (ssize_t)sizeof(expect_len)); - - if (expect_len > sizeof(buf)) - xerror("expect len %zu exceeds buffer size", expect_len); - - for (;;) { - struct timespec req; - unsigned int queued; - - ret =3D ioctl(fd, FIONREAD, &queued); - if (ret < 0) - die_perror("FIONREAD"); - if (queued > expect_len) - xerror("FIONREAD returned %u, but only %zu expected\n", - queued, expect_len); - if (queued =3D=3D expect_len) - break; - - req.tv_sec =3D 0; - req.tv_nsec =3D 1000 * 1000ul; - nanosleep(&req, NULL); - } - - /* read one byte, expect cmsg to return expected - 1 */ - ret =3D recvmsg(fd, &msg, 0); - if (ret < 0) - die_perror("recvmsg"); - - if (msg.msg_controllen =3D=3D 0) - xerror("msg_controllen is 0"); - - get_tcp_inq(&msg, &tcp_inq); - - assert((size_t)tcp_inq =3D=3D (expect_len - 1)); - - iov.iov_len =3D sizeof(buf); - ret =3D recvmsg(fd, &msg, 0); - if (ret < 0) - die_perror("recvmsg"); - - /* should have gotten exact remainder of all pending data */ - assert(ret =3D=3D (ssize_t)tcp_inq); - - /* should be 0, all drained */ - get_tcp_inq(&msg, &tcp_inq); - assert(tcp_inq =3D=3D 0); - - /* request a large swath of data. */ - ret =3D write(unixfd, "huge", 4); - assert(ret =3D=3D 4); - - ret =3D read(unixfd, &expect_len, sizeof(expect_len)); - assert(ret =3D=3D (ssize_t)sizeof(expect_len)); - - /* peer should send us a few mb of data */ - if (expect_len <=3D sizeof(buf)) - xerror("expect len %zu too small\n", expect_len); - - tot =3D 0; - do { - iov.iov_len =3D sizeof(buf); - ret =3D recvmsg(fd, &msg, 0); - if (ret < 0) - die_perror("recvmsg"); - - tot +=3D ret; - - get_tcp_inq(&msg, &tcp_inq); - - if (tcp_inq > expect_len - tot) - xerror("inq %d, remaining %d total_len %d\n", - tcp_inq, expect_len - tot, (int)expect_len); - - assert(tcp_inq <=3D expect_len - tot); - } while ((size_t)tot < expect_len); - - ret =3D write(unixfd, "shut", 4); - assert(ret =3D=3D 4); - - /* wait for hangup. Should have received one more byte of data. */ - ret =3D read(unixfd, tmp, sizeof(tmp)); - assert(ret =3D=3D 6); - assert(strncmp(tmp, "closed", 6) =3D=3D 0); - - sleep(1); - - iov.iov_len =3D 1; - ret =3D recvmsg(fd, &msg, 0); - if (ret < 0) - die_perror("recvmsg"); - assert(ret =3D=3D 1); - - get_tcp_inq(&msg, &tcp_inq); - - /* tcp_inq should be 1 due to received fin. */ - assert(tcp_inq =3D=3D 1); - - iov.iov_len =3D 1; - ret =3D recvmsg(fd, &msg, 0); - if (ret < 0) - die_perror("recvmsg"); - - /* expect EOF */ - assert(ret =3D=3D 0); - get_tcp_inq(&msg, &tcp_inq); - assert(tcp_inq =3D=3D 1); - - close(fd); -} - -static int xaccept(int s) -{ - int fd =3D accept(s, NULL, 0); - - if (fd < 0) - die_perror("accept"); - - return fd; -} - -static int server(int unixfd) -{ - int fd =3D -1, r, on =3D 1; - - switch (pf) { - case AF_INET: - fd =3D sock_listen_mptcp("127.0.0.1", "15432"); - break; - case AF_INET6: - fd =3D sock_listen_mptcp("::1", "15432"); - break; - default: - xerror("Unknown pf %d\n", pf); - break; - } - - r =3D write(unixfd, "conn", 4); - assert(r =3D=3D 4); - - alarm(15); - r =3D xaccept(fd); - - if (-1 =3D=3D setsockopt(r, IPPROTO_TCP, TCP_INQ, &on, sizeof(on))) - die_perror("setsockopt"); - - process_one_client(r, unixfd); - - close(fd); - return 0; -} - -static int client(int unixfd) -{ - int fd =3D -1; - - alarm(15); - - switch (pf) { - case AF_INET: - fd =3D sock_connect_mptcp("127.0.0.1", "15432", proto_tx); - break; - case AF_INET6: - fd =3D sock_connect_mptcp("::1", "15432", proto_tx); - break; - default: - xerror("Unknown pf %d\n", pf); - } - - connect_one_server(fd, unixfd); - - return 0; -} - -static void init_rng(void) -{ - unsigned int foo; - - if (getrandom(&foo, sizeof(foo), 0) =3D=3D -1) { - perror("getrandom"); - exit(1); - } - - srand(foo); -} - -static pid_t xfork(void) -{ - pid_t p =3D fork(); - - if (p < 0) - die_perror("fork"); - else if (p =3D=3D 0) - init_rng(); - - return p; -} - -static int rcheck(int wstatus, const char *what) -{ - if (WIFEXITED(wstatus)) { - if (WEXITSTATUS(wstatus) =3D=3D 0) - return 0; - fprintf(stderr, "%s exited, status=3D%d\n", what, WEXITSTATUS(wstatus)); - return WEXITSTATUS(wstatus); - } else if (WIFSIGNALED(wstatus)) { - xerror("%s killed by signal %d\n", what, WTERMSIG(wstatus)); - } else if (WIFSTOPPED(wstatus)) { - xerror("%s stopped by signal %d\n", what, WSTOPSIG(wstatus)); - } - - return 111; -} - -int main(int argc, char *argv[]) -{ - int e1, e2, wstatus; - pid_t s, c, ret; - int unixfds[2]; - - parse_opts(argc, argv); - - e1 =3D socketpair(AF_UNIX, SOCK_DGRAM, 0, unixfds); - if (e1 < 0) - die_perror("pipe"); - - s =3D xfork(); - if (s =3D=3D 0) { - close(unixfds[0]); - ret =3D server(unixfds[1]); - close(unixfds[1]); - return ret; - } - - close(unixfds[1]); - - /* wait until server bound a socket */ - e1 =3D read(unixfds[0], &e1, 4); - assert(e1 =3D=3D 4); - - c =3D xfork(); - if (c =3D=3D 0) - return client(unixfds[0]); - - close(unixfds[0]); - - ret =3D waitpid(s, &wstatus, 0); - if (ret =3D=3D -1) - die_perror("waitpid"); - e1 =3D rcheck(wstatus, "server"); - ret =3D waitpid(c, &wstatus, 0); - if (ret =3D=3D -1) - die_perror("waitpid"); - e2 =3D rcheck(wstatus, "client"); - - return e1 ? e1 : e2; -} diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/tes= ting/selftests/net/mptcp/mptcp_sockopt.sh index e850a87429b6..a39265555438 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh @@ -308,7 +308,7 @@ run_tests() do_tcpinq_test() { print_title "TCP_INQ cmsg/ioctl $*" - ip netns exec "$ns_sbox" ./mptcp_inq "$@" + ip netns exec "$ns_sbox" ./mptcp_sockopt "$@" local lret=3D$? if [ $lret -ne 0 ];then ret=3D$lret @@ -334,19 +334,19 @@ do_tcpinq_tests() =20 local args for args in "-t tcp" "-r tcp"; do - do_tcpinq_test $args + do_tcpinq_test $args -i lret=3D$? if [ $lret -ne 0 ] ; then return $lret fi - do_tcpinq_test -6 $args + do_tcpinq_test -6 $args -i lret=3D$? if [ $lret -ne 0 ] ; then return $lret fi done =20 - do_tcpinq_test -r tcp -t tcp + do_tcpinq_test -r tcp -t tcp -i =20 return $? } --=20 2.53.0