From nobody Wed Sep 17 18:08:12 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 47B49282FA for ; Fri, 8 Aug 2025 14:43:42 +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=1754664223; cv=none; b=O4nIQp/8XO6MKqdbdX/nboIJ2hwq5xF0M05pHEkEogoLFL2YE/qlUmMrxOnrtgSSVAuzkdb3Gp4bSzbtkcxa7SvR6LUabki26Y3HW7BTlH9kzkjsBHbnLN2lzK33hii99rx4J5hcNKt+DVCBS50RzOevZfW9KpRzA92Es8BMAX8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754664223; c=relaxed/simple; bh=hUeCdfvy1KLYUOQxjKBSVQMTwKknNzoqiFF4LLYh7aI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KYQ7LXWVK3MY8oJC/ybextFTotQ5a3WiD5+ukxkrGV/Yy92rQJ1i1QKkOeBfj0sRm3rNoY6oMrS9459VwGDbBjJUZsqtrNx46HfUWD76+0W1S1u98RqQP6pC1cWrInuSnGxq0KKZfodQ4rGy2uqCeYE0zhmmZwVcADdu8mTcHV0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=S2ga83Ps; 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="S2ga83Ps" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E29DEC4CEF6; Fri, 8 Aug 2025 14:43:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754664222; bh=hUeCdfvy1KLYUOQxjKBSVQMTwKknNzoqiFF4LLYh7aI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=S2ga83Pszzojlj2gsPGa/P2WFDCNO96g0i+DOD+J7q0tY9OkNVpjWILChCcFaMhcT dtEBgX8eahNQbakysX71H3/rtEPkNBALBaC+lBzBVqhO1zQ9V3jxUWstvA3vEfLuVG /wVVDr4bw5rqXXFVdpJygoFG8j3DgTm5y08+yfEIRToXmNgW6xMiWtbEM8mDf1CKeW ZDhj4rPTFGxv0HFYfXJn56UhDTFx4givj8PTFEzUjifVuy6I7FCgyhQ1Z+ILjnC9H6 pNeQBTZXNNu/cj5JpLX/ZYCJQdH+lw+5/69jlA4IG3qrKCxf3ryYJqBBZ6FpF9/JJ9 MzHY+ozOB6K2w== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v2 1/9] selftests: mptcp: sockopt: use getrandom for initialization Date: Fri, 8 Aug 2025 22:42:46 +0800 Message-ID: <2429797ceb15a01ee56c96864c2589437c22032e.1754664106.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 e934dd26a59d..2bd75f731dfd 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 @@ -815,21 +816,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 18:08:12 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 112B6282FA for ; Fri, 8 Aug 2025 14:43: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=1754664225; cv=none; b=Y0huAENAM7XMQ42kUIj5yhXMWU+Wh9Xj7q5VPjGH7n2unJZAifW7FpBj9Sur9s7iM4F0Qcjrhgtm559IMxaDc2eH54fDkHsvtAlBYfnqdgIVY/7ZcBGycIW+lr3jOfF5LohQS5Qh9rfWijxxtZpLzfWxNTG0JuhONjCecp8Z1ks= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754664225; c=relaxed/simple; bh=3UF18dHbqvSJoZN5CbIGKh0NUEWLtEYVZzYdySK/0kU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=P6aqFWKQcQBi7hOxnJ10nYJY35mTMjX60L6TRYQWf9iDWfb30ZwUkXdNJK+fgtalzfy/HbTEowOEy6VpypBNO57RRtE7byWHSP1FdmYIqBPTCPUFNqGESUDdN+APKLAiD3IDZ5vU+i3/2HihQj9f835iW4eYKkiCbjLukaoiRM4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TEOevYQz; 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="TEOevYQz" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 55A2FC4CEF7; Fri, 8 Aug 2025 14:43:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754664224; bh=3UF18dHbqvSJoZN5CbIGKh0NUEWLtEYVZzYdySK/0kU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TEOevYQzavUQo0a52XyXSlhza0HIb3cYm/fQpT11vTJHJR2isL+r3fm8D0/vBfnxj Jflv7Iae2sOB9rl764gq6qzHplhwgOou7yZRMfcc7LA5/uxWXc0yvD90FiTH0kYvIH EiRtSPO/dOe5wxvaS0JBXR0kSSukO1dpqaHxcZ1wjcTGPUuKB+YMLqq+UN781AdKbb t13LfbeaktZ9b9tME6pKP+xmA325Ncqq7m86la63BBpT4j/M3q0rQbiuF/dleavYQ0 CiVRfAm/xuIm1t14fLlMFtgJgilu0wga7ZIQrnZ5IH0dfYk1b3L4iGZWiihyDaPGF7 AsOyxPtQ0ueWg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v2 2/9] selftests: mptcp: sockopt: add protocol arguments Date: Fri, 8 Aug 2025 22:42:47 +0800 Message-ID: <920a094cf561c7a3f0aeff2fee3f246fee6cb1a8.1754664106.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 2bd75f731dfd..02470997d7b8 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; @@ -772,10 +791,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 18:08:12 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 7C879282FA for ; Fri, 8 Aug 2025 14:43:46 +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=1754664226; cv=none; b=F+5sR12sZLEti8pPzC/7sRy6VJaqc5w2eRIZ2zerZpulz/kh36nRZbjauONYlJDFA8NvZPYvu/xExckqHoUiAXn8JNjJ10h3kYjW94BMU2Zaf34F+8ZUF6RwzW2QGLt7VafITkvbtzqmA4wJMbqq0gnV0W4GHHeupjW+Sm7U0XU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754664226; c=relaxed/simple; bh=YW1cNRplX0PGLIvjIHxQvdH8aABk1d5ritNQWv3qM+8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TlR9d27ugDOwTwbJdvsWXeB+NFn752c6czwwHCTHC55r8B0QGZLgsWeoRrkHhwz6r4Y1XGyY8MDvxO/85h6EAFNv2hOu65cEX+HQsCgp2L2xi5YtPmPbVAultLkJdbX1FFOkmVOEmkyLDq4gVPg7ClffHmD0/PfuFCRr6awzY9U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kFz5G3Wf; 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="kFz5G3Wf" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 32730C4CEED; Fri, 8 Aug 2025 14:43:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754664226; bh=YW1cNRplX0PGLIvjIHxQvdH8aABk1d5ritNQWv3qM+8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kFz5G3WfVNjgbpaNparK3mevRvPu74dtCF3UtGYNI8VoMzQw/A0PuN0e56OmUvpT+ HtXi16WzMZNOnEPk6Eh1zQ+q+os79la7yf9zdDLPngc3/1kNnA3up+DxCEBUddJbLZ 2b7HDrfkJjVcUKHPfRJNnqtPmhledUsgT1Twc1u7nkX9nq+HbeJyib8gA1x+gGfYyE 2IVVrJwj79SFGo7ntunPglTb+dvDOLxvjBox+CgCl4u3coJpsPke2/mSv3lHn+br1u HYUnfmCT+kh3n5rdabSD6JSc60XSYUTp9OiPRePaVtxq31aV5vzktL9smEVsRbSZaV 96+VNnNKp5XjA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v2 3/9] selftests: mptcp: sockopt: add inq argument Date: Fri, 8 Aug 2025 22:42:48 +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 02470997d7b8..5ed8287a10e3 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 18:08:12 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 F04F027876E for ; Fri, 8 Aug 2025 14:43: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=1754664228; cv=none; b=kJHEidnVGeth2MeIEyrrxVCwVrO25IXlxASf6h2BelySw/51kYlkXm5OO/XPMqeK+6BwqLEBOLGQtOnEAigYkgFdUE+1FZ9z8YEb2bnSsjpU/lZgGmUn2EEESHVoyXDsGnuidad2ADR8CElzYdO1crfqQj873NyIToy6MNSCTCw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754664228; c=relaxed/simple; bh=tZOp9vcFp/Pqc7w2M88W0WH3JpVsajuVSOWWZdHJ0c0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EvWfmfDQHYrYG2zqkjX5lPxwWO39xr6adcJ/h6HSFsDmBoXjXU3LRWI6itRe+eJ4NOTGidl2hoUEx+I2CewDjBTy2uAQSM/dstYmS5xSHuXP5rdNtYouE+3u+p+Mfw8kwYOKqCCd57Q++Lsc076khQERKvpGXQNLYXiUqad3+OM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aQHvaTPr; 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="aQHvaTPr" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9C0E9C4CEF4; Fri, 8 Aug 2025 14:43:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754664227; bh=tZOp9vcFp/Pqc7w2M88W0WH3JpVsajuVSOWWZdHJ0c0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aQHvaTPrYNbEMssgzwCcjysuIUhzf2bUWWjVM4X0YFOIjcMp5STSG8ZYsNQiw2i9Y RTQguMW4WUL4OSeEu7qd/clnGtoZt6+93RmlOOMYYGw+3scoaSbNoyIo92YyfwXJKn ufrMTXF8y8e7Vxqu8DW3Il+OCaDABrTnqV0uIVSTgF+y7ZX5bXEyoDGO1c2RFPfmZH v3F9TElucIbc/4J/tfl1BkT/peJxAlaCmMpZGLQ62Xhqh4BdD0FL4idaE7mSZuh8rk 7ysnZyGqAWwb/ZjwH4p1krfkvLjfG445TeLVNJP87zCyDBbCmlMtZTuJd/S/8/QX11 HzxY5NG+Xz8tQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v2 4/9] selftests: mptcp: sockopt: set TCP_INQ on accepted sockets Date: Fri, 8 Aug 2025 22:42:49 +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 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 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 --- .../testing/selftests/net/mptcp/mptcp_sockopt.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 5ed8287a10e3..ce5d6b8c2d32 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -712,6 +712,20 @@ static void process_one_client(int fd, int pipefd) close(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 void do_setsockopts_accept(int fd) +{ + if (inq) + do_setsockopt_inq(fd); +} + static int xaccept(int s) { int fd =3D accept(s, NULL, 0); @@ -719,6 +733,8 @@ static int xaccept(int s) if (fd < 0) die_perror("accept"); =20 + do_setsockopts_accept(fd); + return fd; } =20 --=20 2.48.1 From nobody Wed Sep 17 18:08:12 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 7BDF227EC99 for ; Fri, 8 Aug 2025 14:43: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=1754664229; cv=none; b=VmQopYluACCBtL0c84U4UQJvNXWBfhD8WNYHhIxVhrBepPpXVlmZo1ySzzEyr6iAP8bGJPMSsoiW2EIne7awVmsjig84DZdCv3fp9S/9Pjp7rBuP703mnYmq6+hWOC6T6dej6Q7TQBHYnbjRPbLIifh6Nx8yRbMOB5r9BDDWq3c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754664229; c=relaxed/simple; bh=uH5IsOGqB/TeTg472gUZ7YqPPLrNj4Du2o/rbVqbz2o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Qew5uLL1UZUmj+qXf20vQcWBv/ZUaaII2MHPEJZ63fMn9e2kh+i4O6omEw132DkRRYN9h9Dl8EA4P6maFBfq+kf3rRZ+uahSfzjUNZx21DJGYoFY/ucyTZXw4nSfiKl7cC324qEFbzNJpQTB73H4F9SmosO0T6FpauW8AyyP3TI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=j1A4thBN; 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="j1A4thBN" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 11C86C4CEED; Fri, 8 Aug 2025 14:43:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754664229; bh=uH5IsOGqB/TeTg472gUZ7YqPPLrNj4Du2o/rbVqbz2o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=j1A4thBNQLO+w7iot9gU05vBIKAC4SOs2VtMgbvT6A8zYF109/bXGvnQtTkWxaSGX g3JA22YP3ewTxR9Ud+84gpKzWrAiHkc92IPsGGhRzdCQCOXED3V2dq5P9Tw4lmL0dE BxcOZj6RjyPe1E2JLSLR8VMczF8fRlebYkNVqigVbnxFM8/pdy9fe8O3CM0wwGox0p cx7xceoFYfz+96OHMexiI4ORfxjVJE+y/xidETXgiKMWifqW+bYMwh9fUq4ObIJJ+r 6L+UxnRtQdPgtrvAB8T6qL5wElfyAA/zYQ5VzWpWJGgd6GDbEjzSGLgLeKk5x0xJo6 6ohdLidgI1wFA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v2 5/9] selftests: mptcp: sockopt: rename pipefd to ipcfd Date: Fri, 8 Aug 2025 22:42:50 +0800 Message-ID: <18bae4cc7582165c767eb4f17f42913a5eecc3f9.1754664106.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 | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index ce5d6b8c2d32..79370df1d89d 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -738,7 +738,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 @@ -754,13 +754,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 return 0; } @@ -803,7 +803,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 @@ -822,7 +822,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; } @@ -869,31 +869,32 @@ 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) - return server(pipefds[1]); + return server(ipcfds[1]); =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 18:08:12 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 E034527FB2D for ; Fri, 8 Aug 2025 14:43:50 +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=1754664231; cv=none; b=FW8HoUP4Cr5eEFG9LNxnNOV0riIwjBvw6pTBmOridX9Uv6juc7ypP/UYT9ibN4PAr47pefWRHj9JBxJ0PZpMuocChyH6X5JkAaBnVDlOs4QvOHhovaAgibr4eJEtE5IK2llYbGSYaUsXT8GONY08HVxSBMAvlv44Bn0EQ7PeCqM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754664231; c=relaxed/simple; bh=vPnu0/PvHSB1HAFqB+VcS7SCYWciLpt0wmtXOIoJrXc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XuifgANPn05srffY1UdF56dvcIGZDun38h+OvgeFfkZp7klT7ViXrIDafLMFAKAuYndBtK35BkmihuvsLvInpNRMfGnHHgK/HJm2RuSyZZOfA//lPdRoikhBO0A9fL9tY4tv8VRutHi9vmt4rELgYzKPkR6FQgyXdUTlVLYlMrk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XUsGYCO6; 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="XUsGYCO6" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 95F6DC4CEF4; Fri, 8 Aug 2025 14:43:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754664230; bh=vPnu0/PvHSB1HAFqB+VcS7SCYWciLpt0wmtXOIoJrXc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XUsGYCO62QNKu+Y7KxQZBr0SpUgP6QV2601pyUvmzOtzmtG/538XdwQa3OzsUIeNJ fMRPtMvN/vS0S5cTLByBe2ZklTgjLJPBq5xaK2V6lRT5LAPnaIdylsiyW76ajsgLzU jLVhj1wYgNRj2dLHV8BRbjeeP2kzU2FaIoUbrizJwZHg3fb+O3WUu2rFqnwlNocPRz kRr5CuCYSE5Ta1xVxtgVDfNhg2pcXWe1Iifzbqt0aYqltHnJtMzNsVVlIbcOkE9a6D JDj3hj/TJSoO+DxmHNXagAohsO2TkHPHQZFQUvJ3LHg2edZsa6RP5F3B17SxUucg2Z iCIPTOnjr7qaw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v2 6/9] selftests: mptcp: sockopt: add TCP_INQ client processing Date: Fri, 8 Aug 2025 22:42:51 +0800 Message-ID: <84bf786dd175a375450941289c2c58c4d0bd24ca.1754664106.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 Implement process_one_client_inq() to handle TCP_INQ-specific client logic including: - Setting TCP_INQ sockopt - Validating INQ values via cmsg - Handling large data transfers with INQ checks - Verifying FIN sequence INQ semantics These codes are from mptcp_inq.c. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 153 +++++++++++++++++- 1 file changed, 152 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 79370df1d89d..0a85d7b3efe8 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 @@ -712,6 +713,153 @@ static void process_one_client(int fd, int pipefd) 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_one_client_inq(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 void do_setsockopt_inq(int fd) { int on =3D 1; @@ -760,7 +908,10 @@ static int server(int ipcfd) alarm(15); r =3D xaccept(fd); =20 - process_one_client(r, ipcfd); + if (inq) + process_one_client_inq(r, ipcfd); + else + process_one_client(r, ipcfd); =20 return 0; } --=20 2.48.1 From nobody Wed Sep 17 18:08:12 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 5E2A427FD51 for ; Fri, 8 Aug 2025 14:43:52 +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=1754664232; cv=none; b=cunB/I/ZsTZTZIRIHTf7Nt4vCJRgvBktGhgArak3wGikwq+7YMxCLCpV72PJhNlSTNYPZck7HKZ6uNzkN8jEihWWFDWHmXuNnX82zc46OnUtFP0QeskpljIImvJ5Gme4UF+UdQoJKgTwL2YAJzOuOs4t3giSwNDqOL7bYXHipCs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754664232; c=relaxed/simple; bh=7TFjjCCWW+R3t6INXdt1mhu9lsCXt5/N7WCdi+Q0fYo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kZMBWwnHo4eZXAelwP9omJjEH+x3Z3XTcJwV8AWfOgnrZogoge3Zud1ioZUv65yxZCf7V3UPPf/xUJ0jEeQXpn11ZjXdDFur+QZL+aWgXUOlMQrMrImIAtfBss6XHWqn6Tk1PNsEfupI/wMh6RN1e3xUr8h4upfdFLUNOgfodO8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GedM3uTV; 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="GedM3uTV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0A557C4CEF6; Fri, 8 Aug 2025 14:43:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754664231; bh=7TFjjCCWW+R3t6INXdt1mhu9lsCXt5/N7WCdi+Q0fYo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GedM3uTV8S/ekVGOvR3tbOwhP35RosM2fvZ/0Xj1GLJMtFE6ZfL1IbI2PiA1VkXbX oacjuqcRsgRlXS3SJbvwHTrqYqgn/5voJ1hgDUMrW5UB96Ms3lLIfZ5MjfNWrqi22h kabqHXfAbgarj0POChLQiO/0JcAWgetg7UVqJ2agVrJF4nNVK5n28oqhq0/EqWNgDb F8JQG6QR1tZJZjxH2iD8iE0bywWdkpD3r4dINxVwKOpUJ78kVwugrLv/lyjVvsxZy9 OnsqADAT4YahsiEzYevwmuJk7OmMHiSX1U2zrm73vJ2mOB4P/foCwqg4G5C883QTDn TECvRHQ3EjeAg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v2 7/9] selftests: mptcp: sockopt: add TCP_INQ server connection Date: Fri, 8 Aug 2025 22:42:52 +0800 Message-ID: <198003e3766655b965a316826a98073108190258.1754664106.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 Implement connect_one_server_inq() featuring: - Wait mechanisms for ACK verification - Large data transmission with flow control - Proper shutdown sequence handling - Integration with IPC signaling These codes are from mptcp_inq.c. 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 0a85d7b3efe8..c12c5e0e6766 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 pipefd) 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_one_server_inq(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 process_one_client(int fd, int pipefd) { 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_one_server_inq(fd, ipcfd); + else + connect_one_server(fd, ipcfd); =20 return 0; } --=20 2.48.1 From nobody Wed Sep 17 18:08:12 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 D74E227FD5A for ; Fri, 8 Aug 2025 14:43: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=1754664233; cv=none; b=MoDPaYz0z1wWEH+6/idwiFj+lgFuvV4qiknevxWkahLqm2A/krZh2WRio+O6N0VKnpncr8nSWB0g/mjTzT2jf0gm2sBn/+GiNgDOCFJarWVoY1Vt+PMCyez7iV9RMDeuGvNroZI3PRGMFoTkxzO9IYUocnG+rcPv4v1FLiDzorA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754664233; c=relaxed/simple; bh=jOTyncc6EWjzQ0xyqefGzIOH93ZK4g0LxFYw2/qVbWw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PFPEcuFABvgo9ZnVK7pi9WMkrIXgoOLsr2f7e5xgPrRvyxxtYhrUtv6fxbrDJkm0aKrGCHfWCbdPnOOYCNCgcpySiuJeHp0E3oksyYS67MDxOIqKzzX8xioAd9l5AqkQDua6FoqKidItpJBr+v9zntWaPh2GDn4r6bJMysHR4Ps= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=p2olaz6q; 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="p2olaz6q" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D8999C4CEED; Fri, 8 Aug 2025 14:43:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754664233; bh=jOTyncc6EWjzQ0xyqefGzIOH93ZK4g0LxFYw2/qVbWw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=p2olaz6qfGogflfFvCFDwGFGIqE5nyqlxTy0tTGrpJE9jUcDTjebBtFAvYQrR3Ruk baEwyAK3zRQe5HoGcNE6ZVrMzpLpwxvBgx4BprgaZxcRpevHwkqoSc8xxGE/u/+ykU lV0dvczpCQas6UiwmzGoCSunAF7Oo2eazfZK8vyeQ6MOKdBf0HMsZ1eoUav5kKa4/G iNZhrZ9IdBlpfqcKqtmX4zOu/qx9BGZ3fOOVQtX99YrLgAMCJiTYOhEYQA/p68hqaA gtGtAvshoedvwP2cqVLd+6SehCnK+iCS8jxDm9rqKWU7NAFxd5z/lwnWe88xmVlP0I Cba/AN50er1hA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v2 8/9] selftests: mptcp: sockopt: replace mptcp_inq with sockopt Date: Fri, 8 Aug 2025 22:42:53 +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 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. 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 418a903c3a4d..41201c5fa6af 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 18:08:12 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 8C3FC282FA for ; Fri, 8 Aug 2025 14:43:55 +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=1754664235; cv=none; b=IoZFm9nFf6Gj/lbezdaWaH9NzQEaa6nhPmB+0rPTkPK+GFBpkuqtEgGKkZnU19r8R3aMIOLYSldPifyphSGMhaBsXi7axnZbiM8Il/fdAaye65XuwC7fyiPuZvjSH9X4Vfs4nc9fWaYx9N3jRJLXeezHwQ9Agwy+cHRgk5LeVOY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754664235; c=relaxed/simple; bh=umgdrY7+C+IhLDV3/iQnB5ZcaCgIzmMGukdcQHfqYLM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BJtXQwNyJePRvuPX3hFStGckLJl2s0YwVBrMcru555xD9pFyyppU2jzH0Y0H+iA1+J24fSUiiMcg/e46SNY/0Z+R/VT0pfIpji7RuHjY/Z9vvb1RRLmHfTgwCjiHxQvIGJAN5THucOx8bmqZKMKLzb7pPT/Nlq2pTjh7TqEmzYE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GHQYl2eS; 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="GHQYl2eS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4FDF2C4CEED; Fri, 8 Aug 2025 14:43:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754664235; bh=umgdrY7+C+IhLDV3/iQnB5ZcaCgIzmMGukdcQHfqYLM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GHQYl2eSfsFcSkgglp9v9v8jN5v6f3QmPbaN412dz6J2QHgXzYmH2j36nTLbJqqil a4ckVLqT6fzunbSTtn8i4TXp1sMTIQfI9/Vvh33zJq0+6mqHFfbFm9mR/mPc1qoPMw 5EvCwZXKdvwmwJo1O6lcZ0gDykG+yPhR/dBZF90WnIhK7kUqBhjV6968ZUxoc9E9SM bYLDBJYJYiW2RimkiR04SarV8WMaox4CMpIkOnUk+H5vhyXpwWrzLCa/nXx8sQht9c eocJEq1hEETLq/vSK/klabt0vDQdpICAXlQmOHVupkbFeVmp/qzojWlOTnYevtpR/p L5d1sCFDbiNpQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v2 9/9] selftests: mptcp: sockopt: remove obsolete mptcp_inq Date: Fri, 8 Aug 2025 22:42:54 +0800 Message-ID: <99b384faaa9d3a26f9078a50487e33808633a6c6.1754664106.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 | 608 ------------------ 3 files changed, 1 insertion(+), 610 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 f3bcaa48df8f..000000000000 --- a/tools/testing/selftests/net/mptcp/mptcp_inq.c +++ /dev/null @@ -1,608 +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); - - 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) - return server(unixfds[1]); - - 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