From nobody Wed Sep 17 16:38:55 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 5427B311C1F for ; Fri, 12 Sep 2025 14:20:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686844; cv=none; b=amILT50Sk4iA8494fciXPoRAUOb4SXFQSih7Vc4VWvMJOrYmRdtSzCvQdJjl0SyNC6/hvUKw45AFZRMgGfBMYPUgPOYsotbB/jeIE4w9Iz5muS2YOUglDvL1nlRENFEgHoG3YhtaXshBKZJvDhKBGSpB50ldF4oCqebGfxPBe8g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686844; c=relaxed/simple; bh=sORVrbDby4l0RUPAX/NUWB18tAUnW3wZ8qQ9VUOecmM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VLhIyj7MsDYofzSquCz43Z20mD0/zbCSlWjq2+2VIFWH9MXcaW+JtOd8j8NRnmcw84y0uSGpdIzNQXt/Rq/5YP5Fzomg8Gf/ldg9siNpyF7sDh2VDpcps4E+zTyPdcXZWy3VIVG9fAwrHRefC7FZzA0oF4v176qHt7YdejfTcmc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=POywXzML; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="POywXzML" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EB2A4C4CEF4; Fri, 12 Sep 2025 14:20:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1757686843; bh=sORVrbDby4l0RUPAX/NUWB18tAUnW3wZ8qQ9VUOecmM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=POywXzMLqotBxUPu7U44LJqw/kh/AjMqfygs4cnn5qAoU+00nB17u6EsHIHUi3RZc 2kY4GsaWhg0AKVgKjhWanukNbbNPtgandR1Z2g6DksT7kiBTBsCMshKNAsH8RjXi1q 4HVsX/8M1mmOKf3jKuksz2Nd42336MZ7r6k3FDCdlEtzZcyi5ZnUnqKclMrlqvFENR hXUzXQ/Tgx30WoqAaV+cZGlInEljO6PTxH1f/wwGA8qA2/pzO4BYfKrMuPo+mxLsWG uj+hHqUBcPEmJ60YA/iaF1GbS9wEjMJZLanJwvQjCmrPapv2zKw0f3KBnC0AQcGfEU fcwfvo1VsLZQg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v4 1/9] selftests: mptcp: sockopt: replace /dev/urandom with getrandom Date: Fri, 12 Sep 2025 22:19:48 +0800 Message-ID: <48a919e434afba6997539465dd512cc30bea2f23.1757686538.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.48.1 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 /dev/urandom with getrandom() for initializing the RNG. This simplifies the code and avoids potential failures from opening device files while maintaining cryptographic quality randomness. These codes are from mptcp_inq.c. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 286164f7246e..32a78663d45d 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 @@ -820,21 +821,14 @@ static int rcheck(int wstatus, const char *what) =20 static void init_rng(void) { - int fd =3D open("/dev/urandom", O_RDONLY); + unsigned int foo; =20 - if (fd >=3D 0) { - unsigned int foo; - ssize_t ret; - - /* can't fail */ - ret =3D read(fd, &foo, sizeof(foo)); - assert(ret =3D=3D sizeof(foo)); - - close(fd); - srand(foo); - } else { - srand(time(NULL)); + if (getrandom(&foo, sizeof(foo), 0) =3D=3D -1) { + perror("getrandom"); + exit(1); } + + srand(foo); } =20 int main(int argc, char *argv[]) --=20 2.48.1 From nobody Wed Sep 17 16:38:55 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 2EA7E30BB81 for ; Fri, 12 Sep 2025 14:20:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686846; cv=none; b=o5Ke1iLH9Gj0GOEyC57euWxr8r6ZhAo6NfuSzsg4zBEFKvDZC197vbMLtgfL19buNOoWhD9PX1sGuI7tZ9lZnptMIt47lPSVkWQQ88pDitb6dtr7Vi7yceymITUI8xBcV0niMTUQk7QtRDpNkdDByelVSGHrrtzBDYGgazJ7dj4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686846; c=relaxed/simple; bh=Yi61iJFUeBY0PbfIYUfVHsEU0ktnN3E9Cye8b0kQsz0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=A1wUB5xCl5wAgdL7BAkcL/C1CQeUyPPTNBxj1QmRo32zgGPWp6jU30Y/4WQt+r55BmWmNwkKbaRFvn3aJFWUI95SCURAIsWZparBQLos6KvjEbkSs3zsWOPd4xMNU59sCTDTy3X1RzEpSxSPPeftWd9GjRjKjatA27NJCYRv4mI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aX+6Hwhc; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="aX+6Hwhc" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7A363C4CEF1; Fri, 12 Sep 2025 14:20:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1757686845; bh=Yi61iJFUeBY0PbfIYUfVHsEU0ktnN3E9Cye8b0kQsz0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aX+6HwhcP2udFqdHVRUcc5GccO28bw/BH5Lyk5JoIPT5D/nGMF6xxiilHDTcolB0h /1+43Ig7PgmOf4Sl+cDmWdYROjFP/I8lhiXFnNZ9qKScVmPgRD4dKHzwSjXPHxao0Q aHFH4rSuXN0hTA8bAXEhsxICHMz+Ejp06s+qaWkgFaXNyAbKFK+WGbA0rr2GpowbEl lum74gYjiI1T1ZVkdLSX8ekhoZFdwzqcMcXHHyuTZB5kOxbdFaxV7Dd+8J0GFii8op /GLBXiPubDf6ttPsOWpo3RV5cIqpC73TCfmHliKuN23uNC0EETJaNeaOgcndIGalFf PF2TCOXLWSXXw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v4 2/9] selftests: mptcp: sockopt: add protocol arguments Date: Fri, 12 Sep 2025 22:19:49 +0800 Message-ID: <5a81773864ebe08e15f54f053b14425a52ee2366.1757686538.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.48.1 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. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 32a78663d45d..838dc79cb09d 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 @@ -136,7 +138,7 @@ static void die_perror(const char *msg) =20 static void die_usage(int r) { - fprintf(stderr, "Usage: mptcp_sockopt [-6]\n"); + fprintf(stderr, "Usage: mptcp_sockopt [-6] [-t tcp|mptcp] [-r tcp|mptcp]\= n"); exit(r); } =20 @@ -202,7 +204,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 +262,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 +285,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; @@ -777,10 +796,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.48.1 From nobody Wed Sep 17 16:38:55 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 AA2DB314A93 for ; Fri, 12 Sep 2025 14:20:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686847; cv=none; b=UKDAs2B1a4LQNi4CJ1f4xonsMiVG28LbKqhrMKnRz/OX0zuDwxfZuY2/E05hIvIkMpiWebQaa2LVyY2W1/uXadZbtBaZMJreyC7OdkSfcxLUKfkPoLZY+dwz9GPhfpb4jtlBdrmMUFJ6D+XZbXYQEbAoerwWRpvB9AMuEGeSNjA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686847; c=relaxed/simple; bh=W+tzqBtYvb5YwA4Fm9nYlMhAAJcxvdUpVaKAlgy6D3E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Nb0tkmQzNoBAE1skoOONqTxYgCDM3yJ8zp2l53LJ1UJikMyyId5jWYzeoeIcb0yRVHjJrdHiC8BL7Zit7kiKnr8LBVMUqKvGv1bdymzAWsN+8t//WRrdW9G0sYL9RKUzWP4iMbDnvAWcXjm0mLKBeFbR9XLKvyFLkFli1i6OmkA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mNxPAOG4; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mNxPAOG4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 25047C4CEFF; Fri, 12 Sep 2025 14:20:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1757686847; bh=W+tzqBtYvb5YwA4Fm9nYlMhAAJcxvdUpVaKAlgy6D3E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mNxPAOG457b/dH8RuCdRkJP4VTkEGAwrm9LarrUiYMAHa1eYoN2ojqoyBMvqnQ2iq iP15eydZ3ZliLCp2k429TU915978NyxlgcmqttUOgNdRzNo4phClkkt+KYbBUdrsLf WaT2CCd+HvH9n5303WxutsmBF+itZbL+AxARE9NKlrZwwUQV63jhQF1hqy1yHRNSus tAs2A7mLUU//4YMnMeDIkArZz4/Ubnhqx15shGc7pL5otA7OhL+rvyHWwTQdUt7IVK HdMpDU4L6ThqnBaUHqcAHXL+/FZAwd6rzgdXLN4k9RqqUhip1aMqtEJJn34gyjf8O2 oBMhSyV9kmRoQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v4 3/9] selftests: mptcp: sockopt: add inq argument Date: Fri, 12 Sep 2025 22:19:50 +0800 Message-ID: X-Mailer: git-send-email 2.48.1 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 -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. Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 8 ++++++-- 1 file changed, 6 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 838dc79cb09d..96d636005cb2 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 @@ -138,7 +139,7 @@ static void die_perror(const char *msg) =20 static void die_usage(int r) { - fprintf(stderr, "Usage: mptcp_sockopt [-6] [-t tcp|mptcp] [-r tcp|mptcp]\= n"); + fprintf(stderr, "Usage: mptcp_sockopt [-6] [-t tcp|mptcp] [-r tcp|mptcp] = [-i]\n"); exit(r); } =20 @@ -277,7 +278,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); @@ -291,6 +292,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; --=20 2.48.1 From nobody Wed Sep 17 16:38:55 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 8CCDE311C20 for ; Fri, 12 Sep 2025 14:20:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686848; cv=none; b=RTvXv22IUgLMCu0pVXxiLzuGM4JMiE2YZFsv6Bh53MOOfQht57Xd8V/tqw9uJaRbQhyeRodq+0vVRrje/ZTjVsH1dm3dt5wVDROpE5bp3VDZ7rU7DtHs42fCAf5kB3uIviM9iUsZMcSrc3o/J4U8S249dlpbT640Mh/6nU1DMvM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686848; c=relaxed/simple; bh=FSmeiYgy7sMMXKU8zq/GyW3nKNSOEsJ6UV9HL0mgQKk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eRtWOlQHCensVxWNjHblmaoXLxKOlYjhVeRSmLo5Ci9IhkNU3u3345u4ryoRYJT4A+M7jKi8/X7Q0uZqjHsjQc3dCIXJNtVI/+hsgbwZubS8445zzFfNoJEhrjX2IfVHfmTZRXzapzyHzkGC611ahHOJVuos8p8QscvfbDWTn48= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ERDhcyGr; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ERDhcyGr" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A62FBC4CEFA; Fri, 12 Sep 2025 14:20:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1757686848; bh=FSmeiYgy7sMMXKU8zq/GyW3nKNSOEsJ6UV9HL0mgQKk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ERDhcyGrbDaTWvta7yf5kyECYEzFBGW249ZUzTiD8PWcfuUhM7ROIxNgweYCJsJ1a eA7unt3C+V7h7JjvhVTYCWJA4Zb59qXDljwjn2jANy8HCExVfuJC3Nlc24Nt3/5vEJ 8MYi1SxN8ge8uS15/T1TpuMzG777VDzFNvzsupZjNkexZ1WqjvNk/rocXJhAs79M/O zWRLPtQFGzBbTdv8nOxoMnToj6cGZopPI+NEK3I8il0eTHc2Ao3GeqbrGj3QOM5pgV L62OGP9emQgBkA8nqsRs6SpdHokhY5n0L9zDwqFtshP+FHO5/KTaEukQ1arqbwVcHu yUSxmQqVbYZUA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v4 4/9] selftests: mptcp: sockopt: rename pipefd to ipcfd Date: Fri, 12 Sep 2025 22:19:51 +0800 Message-ID: <9f9c9d888be62d21942aafc50ddd0eec1fba971d.1757686538.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.48.1 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 Rename pipefd to ipcfd to better reflect its generalized purpose since it now handles both pipes and Unix domain sockets. This naming improves code clarity for IPC channel handling. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 39 ++++++++++--------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 96d636005cb2..776a017577ce 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -590,7 +590,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 ipcfd) { char buf[4096], buf2[4096]; size_t len, i, total; @@ -615,9 +615,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(ipcfd, buf2, 4); assert(ret =3D=3D 4); - close(pipefd); + close(ipcfd); =20 assert(strncmp(buf2, "xmit", 4) =3D=3D 0); =20 @@ -659,7 +659,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 ipcfd) { ssize_t ret, ret2, ret3; struct so_state s; @@ -668,7 +668,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(ipcfd, "xmit", 4); assert(ret =3D=3D 4); =20 ret =3D read(fd, buf, sizeof(buf)); @@ -726,7 +726,7 @@ static int xaccept(int s) return fd; } =20 -static int server(int pipefd) +static int server(int ipcfd) { int fd =3D -1, r; =20 @@ -742,13 +742,13 @@ static int server(int pipefd) break; } =20 - r =3D write(pipefd, "conn", 4); + r =3D write(ipcfd, "conn", 4); assert(r =3D=3D 4); =20 alarm(15); r =3D xaccept(fd); =20 - process_one_client(r, pipefd); + process_one_client(r, ipcfd); =20 close(fd); return 0; @@ -792,7 +792,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 ipcfd) { int fd =3D -1; =20 @@ -811,7 +811,7 @@ static int client(int pipefd) =20 test_ip_tos_sockopt(fd); =20 - connect_one_server(fd, pipefd); + connect_one_server(fd, ipcfd); =20 return 0; } @@ -858,35 +858,36 @@ int main(int argc, char *argv[]) { int e1, e2, wstatus; pid_t s, c, ret; - int pipefds[2]; + int ipcfds[2]; =20 parse_opts(argc, argv); =20 init_rng(); =20 - e1 =3D pipe(pipefds); + e1 =3D inq ? socketpair(AF_UNIX, SOCK_DGRAM, 0, ipcfds) : + pipe(ipcfds); if (e1 < 0) die_perror("pipe"); =20 s =3D xfork(); if (s =3D=3D 0) { - close(pipefds[0]); - ret =3D server(pipefds[1]); - close(pipefds[1]); + close(ipcfds[0]); + ret =3D server(ipcfds[1]); + close(ipcfds[1]); return ret; } =20 - close(pipefds[1]); + close(ipcfds[1]); =20 /* wait until server bound a socket */ - e1 =3D read(pipefds[0], &e1, 4); + e1 =3D read(ipcfds[0], &e1, 4); assert(e1 =3D=3D 4); =20 c =3D xfork(); if (c =3D=3D 0) - return client(pipefds[0]); + return client(ipcfds[0]); =20 - close(pipefds[0]); + close(ipcfds[0]); =20 ret =3D waitpid(s, &wstatus, 0); if (ret =3D=3D -1) --=20 2.48.1 From nobody Wed Sep 17 16:38:55 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 365EF31282E for ; Fri, 12 Sep 2025 14:20:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686850; cv=none; b=hAznPSrbWLe2Fvaqlgf6d5KKHflSzHM8Dik0nkdR79Cq0Zc1majh/G7TK/QZ2eUq7MJo9HHKd6xWVd8yPGJgmfeQpLYBcU0NI1LFrn1KQK4eSooBYtuz04z7VR1IXQGJPgUV8VKkwVDGLU7cGu8fTStg/q8G9EWaQDJgOVjzso0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686850; c=relaxed/simple; bh=dLbxOzixE6Z6pyxUAfcPVjvDp+p5KIIzCtkK8diuUEk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ka+38r4rm8cDudyDW93WL//GVwiUAaXO4pEqptwc9fBXi8G+ct6Gtst45oADqAKPyqcU3JORkOJW7FBmsOcSrt9tlemaFlRgscRpzuxY8EnwmHvcamTDf1K1k90I+9wGF+5pRVjbsO3HxaTbCvnC2iBYkBhueJiHEl5XelTDDF8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Y1RCC7/f; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Y1RCC7/f" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 01716C4CEF4; Fri, 12 Sep 2025 14:20:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1757686849; bh=dLbxOzixE6Z6pyxUAfcPVjvDp+p5KIIzCtkK8diuUEk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Y1RCC7/fpBKSqmiokVn2e6It+C2OtpftPyIXByiQWdjlaRaB7LgTx8fluGfGWORj2 mXOY9sfiFn5D8M6qKtgsKQciGqcoZdNsJXgsFO/Lz+B7GD6stG1153EvNHSvKy/aR2 3IzLkqYLaPAnTH4ozSOLcY1++BHfgu50qdYbD4yhAfrqL6wBOOGbuZ5aNm4G9sQhID DAq+OFpE1qqmCxEVK5CcdxPMYNI4ehvQIgTkSv+hFtz8Dmy46Zl0Jtnw5l6lu+1CbY jHwYkH2XwyRkog1zHr2+8ZIngdJp8yl6Bq/wwWvgVs60j9DHeeSOQIX9yt+yOpWHWZ NwV1Vgli148MA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v4 5/9] selftests: mptcp: sockopt: set TCP_INQ sockopt Date: Fri, 12 Sep 2025 22:19:52 +0800 Message-ID: <0281880585ac76bb8efe55c9b1c42ba5a81fb314.1757686538.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.48.1 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 a helper 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 both ends of the connection. This setup is necessary for validating TCP_CM_INQ behavior during TCP_INQ-specific tests. These codes are from mptcp_inq.c. Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 776a017577ce..aadef8b0aea4 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -726,6 +726,14 @@ static int xaccept(int s) return fd; } =20 +static void do_setsockopt_inq(int fd) +{ + int on =3D 1; + + if (-1 =3D=3D setsockopt(fd, IPPROTO_TCP, TCP_INQ, &on, sizeof(on))) + die_perror("setsockopt(TCP_INQ)"); +} + static int server(int ipcfd) { int fd =3D -1, r; @@ -748,6 +756,9 @@ static int server(int ipcfd) alarm(15); r =3D xaccept(fd); =20 + if (inq) + do_setsockopt_inq(r); + process_one_client(r, ipcfd); =20 close(fd); --=20 2.48.1 From nobody Wed Sep 17 16:38:55 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 D1A70315D5A for ; Fri, 12 Sep 2025 14:20:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686851; cv=none; b=CqpUGCf0kFehZ4NlbcMknEmvAHCJHZ0NL0y7Zbp0xak7EGQ/2Y8REsyFX0d8ubvrx2JBLnsrHmYqlqwDQGIatcP6zRFblepq4IiI1+8yGi57rJvngJ4Har2og9AHG6pbhTUMpjM0AL+teLFcEu9d/rxJJB2yL+3wlU1jVhmICDo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686851; c=relaxed/simple; bh=mUNDXDJIOVbJUo86S+lfxiWVLoAz4O6y2Xreaei5Uis=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hl2ewRiEh2fswwmQGAT6setn/hDdQqxxPgSbqiCcahJQAbRxqbxkgfZJxteOYxmWzbl3hdbfaOJ0d1d/Sp2naa3XFRpEkIKPnac+QmPhysvpDEK9E2W/NZNorI0GjW+pApRr2QE6HqiywPGet/rXRNQNP8FxWnIeuR82pLdAwXE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=k9YPBOFa; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="k9YPBOFa" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3A239C4CEF1; Fri, 12 Sep 2025 14:20:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1757686851; bh=mUNDXDJIOVbJUo86S+lfxiWVLoAz4O6y2Xreaei5Uis=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=k9YPBOFapK6X2b1cWY8mDDpmuVVdJXJ63+4APPewGHdLwNwlcl1kNj/WSxtYr4DPp zEod1O5MUKuf+Xu4Xn0gCBF225rAhaW60R5PslZd6DiG/791BWxWXLIHb23Npc2OVm PSfraAEGOkwFykeV05vZSeh9b54FbXz34jy7aWcvE1r/Lb/CYvojKUs0yWYRUFv8jd B0p0rXqQEjOZ7Tfr7gB4F8mjwbr2DjX95NOfKpziu+haFgzFenJbtx1qB0r2D28FD3 raJ1hxMFUCXyAsyriNeIwISzJuIEVmYrNEuMVjDmXmDmN1eys+8itMnkfR5yD8EeZK D/IdG1UMG4//A== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v4 6/9] selftests: mptcp: sockopt: handle INQ on server side Date: Fri, 12 Sep 2025 22:19:53 +0800 Message-ID: <1235a810084875277744da045946fecf984aba02.1757686538.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.48.1 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 Integrate process_one_client() and get_tcp_inq() from mptcp_inq.c into mptcp_sockopt.c, and rename process_one_client() to process_inq_client() to handle TCP_INQ-specific operations on server side. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 155 +++++++++++++++++- 1 file changed, 153 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 aadef8b0aea4..f5342903a80a 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -21,6 +21,7 @@ #include #include #include +#include =20 #include #include @@ -716,6 +717,153 @@ static void process_one_client(int fd, int ipcfd) close(fd); } =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) { + memcpy(inqv, CMSG_DATA(cmsg), sizeof(*inqv)); + return; + } + } + + xerror("could not find TCP_CM_INQ cmsg type"); +} + +static void process_inq_client(int fd, int ipcfd) +{ + 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(ipcfd, "xmit", 4); + assert(ret =3D=3D 4); + + ret =3D read(ipcfd, &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(ipcfd, "huge", 4); + assert(ret =3D=3D 4); + + ret =3D read(ipcfd, &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(ipcfd, "shut", 4); + assert(ret =3D=3D 4); + + /* wait for hangup. Should have received one more byte of data. */ + ret =3D read(ipcfd, 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); @@ -756,10 +904,13 @@ static int server(int ipcfd) alarm(15); r =3D xaccept(fd); =20 - if (inq) + if (inq) { do_setsockopt_inq(r); =20 - process_one_client(r, ipcfd); + process_inq_client(r, ipcfd); + } else { + process_one_client(r, ipcfd); + } =20 close(fd); return 0; --=20 2.48.1 From nobody Wed Sep 17 16:38:55 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 B3E5930EF86 for ; Fri, 12 Sep 2025 14:20:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686853; cv=none; b=rWa7OOpiS5mzVmF4nHBbAJmbJ45uxQ+ilNZpiMarkwZyz3Lh4rUCf+LFU13pe6DaOG47m+3XFrMSnULZEMYgwwbkN8AONVM1aPiQ/4ufjAvQ8Ev0WWxNz7vCZOTdMV71IXqkyXsF3af8+CvO+nW4XJLPWIffxUqif/7cUvUZSKc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686853; c=relaxed/simple; bh=6Kif0ZlP8Z81dmo3UrqSBwhK5c7Q3HgfRP+XWW2LCzg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jzCzVMhhOEcjMwPzg/XghA1OPnDfz+9wEeFN1ESzz3wWwoMWdBQu/utLokgMEXIDXbNyVPXX0fFoN3d/jYB63dqs28u0fHI4bjY2Y9iR1m+xl54dW5HJtkI5IAguxxjl6/qI5bdYjRmjUH9QjzshdG8LOSpoRH25NFWA2OEH2kk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ffWIRgH9; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ffWIRgH9" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 52EA4C4CEF4; Fri, 12 Sep 2025 14:20:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1757686853; bh=6Kif0ZlP8Z81dmo3UrqSBwhK5c7Q3HgfRP+XWW2LCzg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ffWIRgH9ZUaSYVG3c7y1kwwScaVy2OwOQqnWrRjmpJ/Tpw0xApcwoUgMOxOjb4mHm +buIoFwfNbfbIqPZsX/ElRyuhLm3TIXN057WrfSbXEInT6Hyum9IY5N1Nabt00/OYi 7SXI2hAcKor9E39TzdDJKpyHJdQWFnQ7+XfAP7JLNuPANRra7gGRGc5W6nkDCi1OV4 1QYIQeZtrbwiYRazAaj4obvvpVojb5DRdHwb58F+jFp/t96GbQZbU+U9EjtUEdHxeK Cc82LPF0dugAWJopjtUuqGRHbF9o+CXelFEk2uaVxSIDFtUa9zUC9m1fmx+ZUi+dCJ v10shjwxWfrtQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v4 7/9] selftests: mptcp: sockopt: handle INQ on client side Date: Fri, 12 Sep 2025 22:19:54 +0800 Message-ID: <89286c8c40905c94c50021ebcedc636efe3d6709.1757686538.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.48.1 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 Integrate connect_one_server() and wait_for_ack() from mptcp_inq.c into mptcp_sockopt.c, and rename connect_one_server() to connect_inq_server() to handle TCP_INQ-specific operations on client side. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 116 +++++++++++++++++- 1 file changed, 115 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 f5342903a80a..ef7a445b626a 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -27,6 +27,7 @@ #include =20 #include +#include =20 static int pf =3D AF_INET; static int proto_tx =3D IPPROTO_MPTCP; @@ -660,6 +661,116 @@ static void connect_one_server(int fd, int ipcfd) close(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 connect_inq_server(int fd, int ipcfd) +{ + 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(ipcfd, buf2, 4); + assert(ret =3D=3D 4); + + assert(strncmp(buf2, "xmit", 4) =3D=3D 0); + + ret =3D write(ipcfd, &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(ipcfd, 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(ipcfd, &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(ipcfd, 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(ipcfd, "closed", 6); + assert(ret =3D=3D 6); + + close(ipcfd); +} + static void process_one_client(int fd, int ipcfd) { ssize_t ret, ret2, ret3; @@ -973,7 +1084,10 @@ static int client(int ipcfd) =20 test_ip_tos_sockopt(fd); =20 - connect_one_server(fd, ipcfd); + if (inq) + connect_inq_server(fd, ipcfd); + else + connect_one_server(fd, ipcfd); =20 return 0; } --=20 2.48.1 From nobody Wed Sep 17 16:38:55 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 B437F3126C0 for ; Fri, 12 Sep 2025 14:20:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686856; cv=none; b=Ov93MxPrDEbXeOamXrH3SSiFlcz3uaceywPiUgdwVpEtPRNbpl7t1iokdK3w4nrunqg7zgcCm8PyyiEcfw0yTIoh1nZHu2OQ/Z+QPyb0WBs2YinuQYbl73MBESVUzAtjW6Fl5BT9HtG50awYTx2wXQ4hYykux12O/Fic+3SuN4A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686856; c=relaxed/simple; bh=au+xRsOdcCORZSmkzgY3n1jdn4NKfNqrnuDb3mbtBNY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=s97bBh+mfNtalJXZyFAkeyGApLMDJx2JrkSecENaotTYWsNu/ROyCE6J8akQyD1F0QFnAP6zdVrSdxvn98Dvpe5hdzbF7g7C/L9z9DDaM4XUryfS9o7gohL99u22UL0r4hal7udyIYQZdsEQ0rW00GoENZnN8NFXbfEN+QjZfVw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XWkLw+Ar; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="XWkLw+Ar" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C783BC4CEF1; Fri, 12 Sep 2025 14:20:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1757686854; bh=au+xRsOdcCORZSmkzgY3n1jdn4NKfNqrnuDb3mbtBNY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XWkLw+Ar3YfQiMxtp3IoyJQSkmvt70ZfR/uUwlp5hlW+S26ShPa2foMr5EeeRSSCz 134giomfV8EqykNNh38YNdNx+STF0y0e44BrLqj4TghYyxXURCznO4KyEStPLsNitD SFjjP6wqjB/vsaEt5LCtpSkZdgnuP/aiVQUz1IZHU/B3P+b2Ng50iInpeVMm5BUMtp 0BD/vXrV6dRn2wqzHuqSOFTtE63yPxgISuQGPuvMZS+4ho1Gd+NB8GH/nM5BrpjxFr gGzG/7EaguGzm0R1EX4Mow1VgNDbh5e9M72L3s34RWpeGUJbAy1tOl2isGUOqKeSeI o3yloksgF93lw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v4 8/9] selftests: mptcp: sockopt: replace mptcp_inq with sockopt Date: Fri, 12 Sep 2025 22:19:55 +0800 Message-ID: <314b9dc0ce40664b06b1c12f796528482b830d1e.1757686538.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.48.1 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 This patch updates 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. Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/mptcp_sockopt.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/tes= ting/selftests/net/mptcp/mptcp_sockopt.sh index f01989be6e9b..14c18692065a 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh @@ -305,7 +305,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 @@ -330,7 +330,7 @@ do_tcpinq_tests() fi =20 local args - for args in "-t tcp" "-r tcp"; do + for args in "-t tcp -i" "-r tcp -i"; do do_tcpinq_test $args lret=3D$? if [ $lret -ne 0 ] ; then @@ -343,7 +343,7 @@ do_tcpinq_tests() fi done =20 - do_tcpinq_test -r tcp -t tcp + do_tcpinq_test -r tcp -t tcp -i =20 return $? } --=20 2.48.1 From nobody Wed Sep 17 16:38:55 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 B430230E831 for ; Fri, 12 Sep 2025 14:20:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686856; cv=none; b=I1BOsIQk3NXdvIOl17CcUxmsUg2XkTBzJKNh5g//kiVH+C9kqztYhajgurR73dvmb0QBAhpVaSr04v+UvM8SXoEj0gVR8OFtx7pPLB5sU1wqqRc1uUoO5yNV23wIHaOjKAeLhzS5IKWPncC0qkyHYkcRFcCwmuvDP4rtFunGBXk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757686856; c=relaxed/simple; bh=IUz4zsjMHnX7WW7cdSFw6QQ6REJSwMpdu4pF3K2S36I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=n3HyoxNM1WtfuuYyhsvSuEnSkkxUvbAY+zB3uLUG1KIppJ/jx21bXpE35cg9N07Adaszxq7MOWx00soerwl0WvB2IXUyXQCOnrgSkStEBITwQajWK9kwlOJcneaoTs8vkxDzOCQwElvTngdi/jcY8KE8YaJBzwG/nxor1Cv6PaM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XsIvtCKS; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="XsIvtCKS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 70541C4CEF4; Fri, 12 Sep 2025 14:20:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1757686856; bh=IUz4zsjMHnX7WW7cdSFw6QQ6REJSwMpdu4pF3K2S36I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XsIvtCKSWKbDsHLhgF8JpS9NcV+Ou9XMwFelUVVxR4TbNwPoqM/VWIeO9YtDTJP61 HJTWCyeB0IUwb4IQNKwGfkJAlrHAk9qR7Q9Ib/GClqUuXiBB+Ac40dh2hi3aspLD78 GDeuyrzCr7uocrQ5WbtAUphY9ZLwGrH7sBkCCN47UqRSR5Ycf3JvObZ4cAUcxXCuX+ xf0ATh8LcYhk3IoLV5QZMfh5cq9if6N480CzNoLLiBk+CsyW1WflThyGiqhqewcZYW 2t4m3+dmOEpWV3ASsHj5yL/SZBoPK0fPi2L1eLqjZvsQ8iq2OHE5lKW+UxvapPfQnu EPWaDim+w/R9g== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v4 9/9] selftests: mptcp: sockopt: remove obsolete mptcp_inq Date: Fri, 12 Sep 2025 22:19:56 +0800 Message-ID: <6e2213608dcc75f8fd4fbcf520203676d2d10e15.1757686538.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.48.1 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 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 | 2 +- tools/testing/selftests/net/mptcp/mptcp_inq.c | 613 ------------------ 3 files changed, 1 insertion(+), 615 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 4c7e51336ab2..9c8da49313fb 100644 --- a/tools/testing/selftests/net/mptcp/Makefile +++ b/tools/testing/selftests/net/mptcp/Makefile @@ -8,7 +8,7 @@ TEST_PROGS :=3D mptcp_connect.sh mptcp_connect_mmap.sh mptc= p_connect_sendfile.sh \ mptcp_connect_checksum.sh pm_netlink.sh mptcp_join.sh diag.sh \ simult_flows.sh mptcp_sockopt.sh userspace_pm.sh =20 -TEST_GEN_FILES =3D mptcp_connect pm_nl_ctl mptcp_sockopt mptcp_inq mptcp_d= iag +TEST_GEN_FILES =3D mptcp_connect pm_nl_ctl mptcp_sockopt mptcp_diag =20 TEST_FILES :=3D mptcp_lib.sh settings =20 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 8e8f6441ad8b..000000000000 --- a/tools/testing/selftests/net/mptcp/mptcp_inq.c +++ /dev/null @@ -1,613 +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 - -#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 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 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; -} --=20 2.48.1