From nobody Wed Sep 17 18:16:52 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 8D9041862BB for ; Fri, 8 Aug 2025 02:45:18 +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=1754621118; cv=none; b=hrzH4y+dwCgFyabg+7JOs4l+uFu+gw6jnZLp0xFf7CIWIGp0aDP/4UPyYtbUev+xuBGqua7iEFeU6ce2oBHoilmXwOi8YSoEn/aIOV/Mxo/ITTXRCOK0wAlTZGxVIMGkNXLPOBAQVs+hPhq8DRktfKzzANtFeJOuDsGqkXpAmHA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754621118; c=relaxed/simple; bh=hUeCdfvy1KLYUOQxjKBSVQMTwKknNzoqiFF4LLYh7aI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=owQ5/5URxFANDXoLAXShIlHjquiKLMRqaePLkOhS4L2k31xP65DTAtQGVKmIex+jz7nlagU8iKIV3ZnSm57K4lpYotNWkWzOoT60Pxuhj4lrQESkFtIDX5+OmeCTGrLP83bjPf8d3Jgr/saDScRcddOv9YqOZUN4zJ42rlEWbmo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=S3xymUj+; 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="S3xymUj+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7E236C4CEEB; Fri, 8 Aug 2025 02:45:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754621118; bh=hUeCdfvy1KLYUOQxjKBSVQMTwKknNzoqiFF4LLYh7aI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=S3xymUj+asv3Jx7MxRuMepkhJ0hqba832MoeV5gwGWwv7gq39OeLsN9iXO3VIIm3P pJNHrp3M6E8f22mnQGNDnPcsd0DoIDZCN5eBjr3XCWPVlpVA3cSw60bFqmQZWFSPNP qT6LKUweisomOLv76/fctrTUfhohSEKm8ecRiIcwY6LXSQyPIFqrPwj4KW+rxIeNiY WYVrgfD8bEeUWNKFw4nzD1qFlu9+SelFcvKN6D6PtvfdAMHfKWY5/c09zGTPDnxnRB rEagGh/6qaf1zECOs9jvaNXT1Ndm4ykJ3x2IMGpAmASgyElqg6p/kmZvkyiMCWpEly sLCoz0e1Bo0uw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next 1/8] selftests: mptcp: sockopt: use getrandom for initialization Date: Fri, 8 Aug 2025 10:45:02 +0800 Message-ID: <82946098d3b1fcc1ba911349ca79089e08d951d7.1754620968.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:16:52 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 5781D8F54 for ; Fri, 8 Aug 2025 02:45:21 +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=1754621121; cv=none; b=lKTHJ39q5Q/aph8AIerof0o4rPyGq8IMVrLGXq2jC6crm0NI4VlURMVRxhE3xD3U/U6szTdNoLCSY19EucT+fnTMOBFnSiRfkBYIeK6oGRTMvScFCQggzMhhqYsdWXt2qMgL2cx4RRYQjReOjeDxaHcv6cZj7fyPiz36DN8+Ifs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754621121; c=relaxed/simple; bh=CjyIMBCy2ciLprUN6DjsY/OUJtjZGPGmMylwxbq7CnU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=e8K3QgfQ4jju2P8YqZCrg/wabq+8VGF8Uo3WFPJVDV4uw1oHDWYWU4PqsXF0jY1orgAsv05EQL19vflNxgjhJ2RLweqRBrPIDKoWzDGJRQ2lKSwpp14L29OpoZH4zOCjS1QKtdXahILrVitlXs+viicfN+yqoH/Ze4SuxK2r8rg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MBP/YiNg; 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="MBP/YiNg" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8DF6BC4CEF1; Fri, 8 Aug 2025 02:45:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754621121; bh=CjyIMBCy2ciLprUN6DjsY/OUJtjZGPGmMylwxbq7CnU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MBP/YiNgGOCHsXiic1/1KaSvKXN1dpoUYShT23QkRc3/d08lybdU9ZxmnU+GdINQe e0Wc98uPq5599my0R9VxHbK7KJP3vTM8aD9nlEHRCCGj2rH3MilYYlnNaOximQTd21 PvFzfnpTDn77aTu2axq1zXnWTQTzmQIaqV3z9wjTXqtpp0ydW/B9iGDrYGp0kZw8UO FmYIXEvpBBh2sc2EDfbkP1S99t8wtDPUesUrYrB5fAjTMoy9eXW9MuCilHCAFhNlAs ziYLzlEkL7AndaEn9DqAybZXPNER8n93E6U5BDVFfbekNNfpakhg0jgWGDYYpU/Wmt kLFVpSKb7fvOg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next 2/8] selftests: mptcp: sockopt: add protocol arguments Date: Fri, 8 Aug 2025 10:45:03 +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 -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..d6c1d746f12e 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|mptc= p]\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:16:52 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 291B8156678 for ; Fri, 8 Aug 2025 02:45:23 +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=1754621124; cv=none; b=HKl0cuAMcXt5lD0aPH8LBJV4mINf/UJuAnHIfVP6DpEFkQklnYDnhSpJR0gdvKqx+b/feDkDjx23v6c2S0BKtrZQcYgKaQDzH3lAC9yfy64o3Bq3xMyI5T0hjM+KLHnnslLnR/gW+kSlMIiaPKFoX/SCGquWuEjaCM9PBs0PCXA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754621124; c=relaxed/simple; bh=vhlpHiMy4/JuelGsLW79zrMMIqrA2KYoKVENZZXED24=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q2RcTx9K//sfmnZWPS2fh7ocj/7gW5I2IP7C7G2nCwIEsYf5M1KzoOp2DFkNOi4ePSRYNXt+v3Y54EoJduLDQJ1XsE3RqUwAdsVCHJoE3vlBu9y7tkwn4e0vWoDWUznmu0f9dVrfzlf8PKltfyVZCOA6BrY17O60lMiMwm6yfZI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qIIHgsty; 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="qIIHgsty" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C350DC4CEEB; Fri, 8 Aug 2025 02:45:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754621123; bh=vhlpHiMy4/JuelGsLW79zrMMIqrA2KYoKVENZZXED24=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qIIHgstyFCWFXHKEw5nYmyZFeDpl6kYGpMLmlqVDRPYZ4GqnYHHpbKREv6VUSVLtF d7Tdli8qS6l+19/W3SUkO5b/w7vposs6J4fw9qMbeaECVoALV43zdVovCFRITRYtXj /Bi5TT+ah5J5Jsho5+JjqUAZCms05V9AD2htxZTl3QSi4HXVQkWGNsMquR0T/bcAYN JWfFx1BNyaTFKW840mWHq2CxaLvN+KYNjddyeP5tiJbPODtrxdTz337lxJ2F8r4e5f /E2UC3avwN2tYXEtXv6RTWrmmTNCfYvEv0/ETBkFW3/8iLdurkp+jp+hlinvpYDTfq qoNjD7iHeD/mQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next 3/8] selftests: mptcp: sockopt: add inq argument Date: Fri, 8 Aug 2025 10:45:04 +0800 Message-ID: <2d6a5bd353dad4dc01ded98f9a55fcb89da5d1f0.1754620968.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 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 d6c1d746f12e..9558c68a62e7 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|mptc= p]\n"); + fprintf(stderr, "Usage: mptcp_sockopt [-6] [ -t tcp|mptcp ] [ -r tcp|mptc= p] [ -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:16:52 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 EC86C83CC7 for ; Fri, 8 Aug 2025 02:45:25 +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=1754621126; cv=none; b=Xri3ANv0WsWV/LbkKVVdpQgw7mayFX2BsghU7DLd6ql04v0Luf3aeJFSUtPc+ebtoem6AMF41hyUqbkBvE0vYtOTS3sTvdkB8jksjJxRapPz1OUS+cqJP4rwc/yahiTEUxa+PMF8QvwD9sBenm8sdDhrDBo3j6nkIATDLxolCSA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754621126; c=relaxed/simple; bh=BTIoI8T1orRCkdAfASX32D0EECBLQsnOa3P/iDP/Zl0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZqvMyw6uq7Jt6oK2fbP9hJdmlI0aFD7McvxyDFa0Sh8OxuFYevVPSxmviKl7493lsiveIxyF1jGvfZAE9o8MUqF0HHCYrWF8ie69TiXL9+XEND+vqPyebVVKIL1TfkbXfSL1IgCqG3W1TdOpZ383854Msz9merLgXNj9deHP4xY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PnPFraHu; 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="PnPFraHu" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7A74CC4CEF1; Fri, 8 Aug 2025 02:45:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754621125; bh=BTIoI8T1orRCkdAfASX32D0EECBLQsnOa3P/iDP/Zl0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PnPFraHupArGKz294uWxcyvlkuYnKhqMmNr6wJGS4crgffXMFVcGJkAR+nt+S89b/ 1/N5NyURXEx4/h/6tiasAhMYDDK2GOMCR/PJtP7K/k7VNffvWC0xJRm5n6hojhqRFg r6O/IzG47UVcg+L0CTSrc4rYmprdsMV4uUvOZ8LYE4bFX55vT7mY57lQHPxH0/auQp OWHZcnNcwWN9yfmUcKsa9vcAneYTfYt+i3STbKzrQIGC+GnzLJ+wYVjehkw27M5Xes b7p5csfAF+PlgqbxIoogKz9FRzjcBMmnpOYCB9alZGQK8IVcmSXD52/veQEEOmAs8s G1kk6tCJC8PYg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next 4/8] selftests: mptcp: sockopt: rename pipefd to ipcfd Date: Fri, 8 Aug 2025 10:45:05 +0800 Message-ID: <653a76c5131b687a850996f962d1173e95e2c601.1754620968.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 9558c68a62e7..f767caa55a0a 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -722,7 +722,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 @@ -738,13 +738,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; } @@ -787,7 +787,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 @@ -806,7 +806,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; } @@ -853,31 +853,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:16:52 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 1F4941684AC for ; Fri, 8 Aug 2025 02:45:28 +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=1754621128; cv=none; b=f8NqCZJzkk+897uIzVjRY2KzZ+/6TkhNK6pz2bt5F2PkKG8vFV2bRFwsUTSzmpdTAJD7kj7q4WHNh8hiSJ+NUC8NI+fQKAEFtk3MJn91e+fw43gRv85Q1RD4PBWHTWt89r6MVqz7t6jlyHsLCQNk5on+CetcZAIx9NijpdaPS98= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754621128; c=relaxed/simple; bh=GlTXWNex+oZ5YxaE/dM0qkUjTNEm0qmafNpl5FjKtN4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UHBpG9er5uIikaFh52T30gIsjZw5J5h1EA4X824G/cqpG6Locjcfm+cXoeJcF13X7MN7e4meSJyDsi0q1c0IxLSUve+OpcJAJAjO+ygenaC0e7PAHscaLLLa3Vdm4NUnhMTHYmCdMJ+ryP7Ia4BAoRQC58MqSXzqWONicGklOXY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GGFRHciY; 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="GGFRHciY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A21B1C4CEEB; Fri, 8 Aug 2025 02:45:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754621127; bh=GlTXWNex+oZ5YxaE/dM0qkUjTNEm0qmafNpl5FjKtN4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GGFRHciYhGdAUQntoaIB7W79m8vRT0bwPZIXOQ1mFGifpx8yRc817QUAH0ifdlO2c ueFKmWh7fnyJ8ogaPRUTqKXKp5EP8VOyIdRrzbNZyOaFkhzYZMrwvVOsslqA7unDJU STV4hTZNeZzsL9Ax6HiUO5M7fGACbelMoUXrp9rouVwG8ZjX/G2dWRYNaZ5jJx/aK8 r+vWN+CVKq9j0V4s2TO6cB2JyZteuNrWoE3GfqbauLc7KYGPDlogIIuPlNSSkS75YZ ZrdMWaMv4zPwg1T2FMy4mDchjxUZV8hLgorrS3Xy3/SaHW5iUHuzuF0nVsabMLyMr3 9pKwf4mYBgQ6g== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next 5/8] selftests: mptcp: sockopt: add TCP_INQ client processing Date: Fri, 8 Aug 2025 10:45:06 +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 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 | 157 +++++++++++++++++- 1 file changed, 156 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 f767caa55a0a..d68db3f0d5f5 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,157 @@ 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; + int on =3D 1; + + if (-1 =3D=3D setsockopt(fd, IPPROTO_TCP, TCP_INQ, &on, sizeof(on))) + die_perror("setsockopt"); + + 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); @@ -744,7 +896,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:16:52 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 7488583CC7 for ; Fri, 8 Aug 2025 02:45:30 +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=1754621130; cv=none; b=TgQBP2v83TVJipCaHiY27vWpjrNQgVBpltGFEE0evkZHfoKHNrDdRND5fuwgRXh8MYS/5DxvcfL7UGQkxSfGNueVbd9SjMP2wnDnfUXJHWYoth5ROP3ZZ9ZS4UgnoZwOAvzDaZ+IOd5N5tyh4PTZFq4rLzWDjgC9ljYXX0wWr2E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754621130; c=relaxed/simple; bh=bzmZGZMFMHzVLnybsX1umsqQILIwhLnzq64QMuLnak0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Tc1zZegYMDc3p6CyovbEbVv7fpP2ZsgxmCdCqaKtz2J4fPhM6IMrUKaH6y1wHniGlKIzWC9tmP30+6NJrCQSErJYtMZAleD8glP9XoANfavk4OWfHEkSX1mO5iIIDwT22FcdgnZ3kg3rKpB9ZYHuSf1IAoXxZAe7jwfICP/Vy78= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kZ6RFvBI; 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="kZ6RFvBI" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9E6CDC4CEF1; Fri, 8 Aug 2025 02:45:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754621130; bh=bzmZGZMFMHzVLnybsX1umsqQILIwhLnzq64QMuLnak0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kZ6RFvBIm5oJg1iikNeXFJ2w2WXO6I33PtvwqigA4wH8jrsjFxXJtM+dBj+uZ1Ulp MIEoxXs6PCaHi3pu/wv/4Xsv5ezBBzXlaA0SKyROjf/Hnilo2gbAIbehvrC4O4H0gZ Bjy/dHxBLXiKZYpDulD9WgokIckmdL4nCboZht0K3ia2HZTMGlB9vcTQwQwxCXFcGj D5gInZQXd27LUCRzds8ytdxoRCcvALam+fRBt3VGlG/JdIN3BrWb2/uJCJRNk1MbJi odcPVA1+ZbkK49wUrrLYwkDO0QGwNHBBnQwEGk4D2PtuK0KJrA9i65C2CDsOu7RzMv ME41FOSkzuvXQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next 6/8] selftests: mptcp: sockopt: add TCP_INQ server connection Date: Fri, 8 Aug 2025 10:45:07 +0800 Message-ID: <6eacbf444287ddd95f7171bfb782e4f3a4c82424.1754620968.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 d68db3f0d5f5..e2fcc6656058 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; @@ -961,7 +1072,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:16:52 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 4FCCA8F54 for ; Fri, 8 Aug 2025 02:45:32 +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=1754621132; cv=none; b=WbV+vC/SHdzuMX6HHyaOyPUzzOPNS8gL3eBhcaXAWIIMB0j9sh4eDFQcPuXIn6DInli8oZfeS2lWAP17F2oqSArQZD1ICyjulfgAxG39pGTV096MkoiiuxxatTL1JAog8DfvUjxbA2tGOdGHAeV6eZH3uPe3B6V8/yPBfw9BONI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754621132; c=relaxed/simple; bh=jOTyncc6EWjzQ0xyqefGzIOH93ZK4g0LxFYw2/qVbWw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AY1dw7IBzhs7oChmR87jtGW7P56CujZKXLCh3o6zJjOa1CTGkGEKLUIpssEcomtb6adNmdKx0kbzXuRYyLg6EF5Uabx45saSIor4WfZViImcr3QU+MsboDUtdAhHHMg/Sw3h8gv1Apko8fp6s0PicvRquHNJcx7A6osxLk5IGsA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oP3lvguv; 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="oP3lvguv" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B64CBC4CEEB; Fri, 8 Aug 2025 02:45:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754621132; bh=jOTyncc6EWjzQ0xyqefGzIOH93ZK4g0LxFYw2/qVbWw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oP3lvguvpLk45lKolF141G5dD1wiXGBafNmy2V3vOrsqm7uWleBA1EIimK71ultZi qUqybksnvLoKs/Ke+kvc/PLugiO9CHw/C7VuOj5J29+BycLTSunIDAfnbgcaTrtOZ+ rob365hbqYKThq4hyK29Iyvh0bBfDsv7u9kVXVtvRLpB0EafGK3oiumbj0grb5RHmj mxwLBxq3YQ7vxTSr2durXu/QH1HzqrsZarSRg2IVOd1VVgsDrafDz/6MUkULBOfQOM X33jT7l4ibj1qhJUQk/VFEZCgi+ICUCMKFUJGc11LNfEOuB6iyDy4s1IwXO2iGdXnS ov+C9jUMR3XUA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next 7/8] selftests: mptcp: replace mptcp_inq with sockopt Date: Fri, 8 Aug 2025 10:45:08 +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:16:52 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 D49A4156F3C for ; Fri, 8 Aug 2025 02:45:35 +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=1754621135; cv=none; b=IUvofdUDIUJbYNvmhP5+qglkvnidcG3LYiF7NPz/c32UmO7g6bxACirtUkaZrMr4ASNT96DCZr/D6DZLw5GIUVjDvYll9S6gnImt8k4iaMt5d5/ghpMUogNCW9i8ofJLDMePg4CHfjy1x4x//iE5P1moD/MGC17OeEu6idYAV54= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754621135; c=relaxed/simple; bh=umgdrY7+C+IhLDV3/iQnB5ZcaCgIzmMGukdcQHfqYLM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RsUC3wxhZ48J6GUKQXm5DaTHImwq3UnvTinFfyPEKYTcGVT5gtfVPgBUOpFcwvNsN9l0XGkki6uSES1+HRJQkSQfZjHTEOaLH/k3X+2C/uoPEO7TPYy44Ba8cl0MuSO+OA7OA/Fl/6S+Q/O37ETUqufKxLIAX79OHWkn+P5Tbp4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LaewUN7u; 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="LaewUN7u" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C17E1C4CEEB; Fri, 8 Aug 2025 02:45:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754621135; bh=umgdrY7+C+IhLDV3/iQnB5ZcaCgIzmMGukdcQHfqYLM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LaewUN7u3jDGLWqHbJoPr6kTEPWpubnc3TTbO5q3UZEERMSr8ElI7eC7T5e1yFpdb MxSB0u9WXfGYm7BaWZzEYTYidYzG4sgOLIv9H06lR9j+s1mibCFAVghsuPijdRaWpd qdI/mmEA7DmR729CfYwO10O/1rM+mNyUmzOLVbXXPLQv4lwraTOsSHOgLlnftlkMH4 9IAj+B/q2L3CUn0C/tv7ypG3PFs/8SiL6+oIPl/9VuK+Ro/fll30Vsfvy23pkh2k6B X2E36kxo8djDEkkMADMEiv5J9T0Uk0HMKbe9tqk+NGmiQ/T3GsWCn8W7pTFrergCR4 XXnnfSZGyiMtg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next 8/8] selftests: mptcp: remove obsolete mptcp_inq Date: Fri, 8 Aug 2025 10:45:09 +0800 Message-ID: <83404d26f76a8df64949b3b724e9c92aab91a99a.1754620968.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