From nobody Wed Sep 17 16:14:27 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 A15C0307AF5 for ; Tue, 26 Aug 2025 09:29: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=1756200586; cv=none; b=Cc0UnMnAvkZh5ZdSP8c64MuYwhr0B4GZBnMEazxvwxUlAFwtuNZf8Jf/Dzl7wPJl4b/BBtNr/1PHc2PX4d74Gkn2jVXkkE4R6+EHklbernTz5Cf9a/Zq4E8sqzoawRA+dnarvRoGiZUfscQdjkjlHUbA9I0JAeotEAPYy5qcq18= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200586; c=relaxed/simple; bh=hUeCdfvy1KLYUOQxjKBSVQMTwKknNzoqiFF4LLYh7aI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BsB/EPdGdgTHuiXTuiqHWiXfrJ2nQy2Zp/dQZjYm9NG+QC4KgrbsEeIhxm38W/0N3Y67iMYEXIA6JfJGuf4hFJJv5W4AIA3g/4CdOji8GRuwRdMItT3AuVmt2Me5fRATJRMb7BtdiPsoAXiDAhWy8Jr9b4UykjaJYJ4Kzb8AWk0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fcBcZBDV; 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="fcBcZBDV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CDBE7C116B1; Tue, 26 Aug 2025 09:29:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756200586; bh=hUeCdfvy1KLYUOQxjKBSVQMTwKknNzoqiFF4LLYh7aI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fcBcZBDV05nqOaV0IILYQfxDZp/hdC6EGpo7nPgj4rzTttA1wyUxrJ7sDrd6l4C0X Zspl8JAd5MVvVBJ0skknvvFe0i4GBSPpo5uUMuyjOqUHZLBciotojls1zh20hZY3iE bdWdDbrkDSGjFtjQnA10Ip0TC6taAuAZfgk/2s+EpLd9kVudy/FfdBbMOa9nNEXJVO w15kwlLStCNN3Xr+K5hRLv9zQLIPOuofwadBuRiEEuUZvzYxSEdxwqw8HrTZ74EtA1 a7ld2BdkY0IpkoxB050QEdHbT7cbm/t6SxuuYqvr48BPGYGyrijT/MaoRWTjZmidcj m3rGH7i3PXbzw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 01/14] selftests: mptcp: sockopt: replace /dev/urandom with getrandom Date: Tue, 26 Aug 2025 17:29:25 +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 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 16:14:27 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 1B8871C5D4B for ; Tue, 26 Aug 2025 09:29:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200588; cv=none; b=uuTyYE20WA7vWhvOjn55wjuQbfyzNjnajX/kudyXAB2uPiym6RBseMyZWbzGDQWx2rJ8pzeMrjh0QurgRiVMnwAhsz6VbLRQDm0e3R8XggLBLn/K1JU8xZjoaodctQELull+QMsyNJs/8dDIGQ9e3zYXUR7MC6dnRS18IZs35TQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200588; c=relaxed/simple; bh=XO8d+3aApVsDtiNZGvQgp4A/wR8B5Lpcu78OzD+zysE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WTXAhAeLSKsCbInETJG1Ib6GZ46hEPW4PRm3KCvZMgbI8hnmi76x0G+vnFmets5ItrY47SUCZhV5GCQl76SN7DH7StB12pYPisApJoWAoVGJBVbaG0PekVuJGWOlWZ/MEoqJ/rmqD4UHSl0OYaDaFs/b1x+6+k47o1TpXKikNFw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BkwGobVc; 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="BkwGobVc" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C24C9C116B1; Tue, 26 Aug 2025 09:29:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756200588; bh=XO8d+3aApVsDtiNZGvQgp4A/wR8B5Lpcu78OzD+zysE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BkwGobVc30NQCNKa4DyussTDh96eg+1EddwB5v9qEhG3a9fyz1RhY/cECwbPck1ze OXDmg0jb7yNnCFtMrSME4N3EfXEALxIqNtOI2tA4ptUTrY50WFF6plU4GbQpEef+H/ SzsFWkMW4TzQZrnhsqC+vivDblPqPMjF63uoBOlrwpQgYiryZSEl4zGYzIWHLLCxEP 0f0bUlgwCACd/a3577cvANk4i+Y3P74Y1trJU9fHShYgmr6zIy52S5ikdPAwZa9WDk jyl3Nsq3niXqTvNunp2OGK9uJYdcgyi9ENgVHoMgiYoB9FDf8eYwWEWr2s1qtWaBBA YntXWbFarHPxg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 02/14] selftests: mptcp: sockopt: add protocol arguments Date: Tue, 26 Aug 2025 17:29:26 +0800 Message-ID: <76207e7f4c139a593585d9e94f7fb6b3149dea73.1756200029.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 | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 2bd75f731dfd..05caa9a57ac4 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; @@ -557,6 +576,9 @@ static void do_getsockopt_mptcp_full_info(struct so_sta= te *s, int fd) =20 static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w) { + if (proto_tx !=3D IPPROTO_MPTCP || proto_rx !=3D IPPROTO_MPTCP) + return; + do_getsockopt_mptcp_info(s, fd, w); =20 do_getsockopt_tcp_info(s, fd, r, w); @@ -632,7 +654,7 @@ static void connect_one_server(int fd, int pipefd) if (eof) total +=3D 1; /* sequence advances due to FIN */ =20 - assert(s.mptcpi_rcv_delta =3D=3D (uint64_t)total); + assert(s.mptcpi_rcv_delta ? s.mptcpi_rcv_delta =3D=3D (uint64_t)total : t= rue); close(fd); } =20 @@ -667,7 +689,7 @@ static void process_one_client(int fd, int pipefd) xerror("expected EOF, got %lu", ret3); =20 do_getsockopts(&s, fd, ret, ret2); - if (s.mptcpi_rcv_delta !=3D (uint64_t)ret + 1) + if (s.mptcpi_rcv_delta && s.mptcpi_rcv_delta !=3D (uint64_t)ret + 1) xerror("mptcpi_rcv_delta %" PRIu64 ", expect %" PRIu64, s.mptcpi_rcv_del= ta, ret + 1, s.mptcpi_rcv_delta - ret); =20 /* be nice when running on top of older kernel */ @@ -772,10 +794,10 @@ static int client(int pipefd) =20 switch (pf) { case AF_INET: - fd =3D sock_connect_mptcp("127.0.0.1", "15432", IPPROTO_MPTCP); + fd =3D sock_connect_mptcp("127.0.0.1", "15432", proto_tx); break; case AF_INET6: - fd =3D sock_connect_mptcp("::1", "15432", IPPROTO_MPTCP); + fd =3D sock_connect_mptcp("::1", "15432", proto_tx); break; default: xerror("Unknown pf %d\n", pf); --=20 2.48.1 From nobody Wed Sep 17 16:14:27 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 19B5B29ACDB for ; Tue, 26 Aug 2025 09:29: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=1756200590; cv=none; b=Vm6nM83bHEyAh4MKjvUSIebExZ8O+E66tBVaoNETVfzAW3M08AY49Im+Y86mKTlmBvAhSHKARXEnfOkZfmiqd3DbsOaoc9N/v4e0QCOptCY+QqDyA0ZsVz2STkKsl2OoX3dzgDkys+42kLhny5tvKeNfNf1ghsHKs4J+NWy/WjE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200590; c=relaxed/simple; bh=I6S0BVneL2OavfY3dEAfQM6f0qmK4LFuDqvUd0mChDI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Swro1Axe/N8TIcVHbzaBMVUiZsYptJy2N0wFHpoG+amVRPTky6Z+E+q9RQ8Di65755o075VGoikrHkYqixuo1w5e9d/CY+H7GoLGRayvvOcm0xDUJ2aqBdGdn+UhTy53I05OpVR9K5dwHdpJelMO7DNwTGZ9qpYe2AHfvZ5J43M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Qm02LcyM; 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="Qm02LcyM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9A539C4CEF1; Tue, 26 Aug 2025 09:29:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756200589; bh=I6S0BVneL2OavfY3dEAfQM6f0qmK4LFuDqvUd0mChDI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Qm02LcyMxjlcudS0MBPFsmJullC9Kngwjuh71VvnYWe6I7DluB9N4EcB33zvAy7oz LgMBTdJX9NGEyGf7axjXXrXKAOXZIayKKRclLTCsFGpbgvccP1bCEJQM8hW/j0ibk5 TW06nL4HZBtibJ3mnlunDVR+fnxVcfLItIeqClAWRRIpVCvdVk7rRocITRrMxR3fQB yuLJUGmWenBugf1l3i+WxXtMXXDPXDA1DZvQM5DZMO5ip8JX7BdY9sFMxwGXRWT4Hy F53jUisHOJ3WObgD3swmInrzEE5cE3alZ/ERWM9rUg99howKEc0GYuunCsNgO2GghU RJWekq4EdVpeA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 03/14] selftests: mptcp: sockopt: add inq argument Date: Tue, 26 Aug 2025 17:29:27 +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 05caa9a57ac4..cb3d8dc34997 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -30,6 +30,7 @@ static int pf =3D AF_INET; static int proto_tx =3D IPPROTO_MPTCP; static int proto_rx =3D IPPROTO_MPTCP; +static bool inq; =20 #ifndef IPPROTO_MPTCP #define IPPROTO_MPTCP 262 @@ -138,7 +139,7 @@ static void die_perror(const char *msg) =20 static void die_usage(int r) { - fprintf(stderr, "Usage: mptcp_sockopt [-6] [-t tcp|mptcp] [-r tcp|mptcp]\= n"); + fprintf(stderr, "Usage: mptcp_sockopt [-6] [-t tcp|mptcp] [-r tcp|mptcp] = [-i]\n"); exit(r); } =20 @@ -277,7 +278,7 @@ static void parse_opts(int argc, char **argv) { int c; =20 - while ((c =3D getopt(argc, argv, "h6t:r:")) !=3D -1) { + while ((c =3D getopt(argc, argv, "h6t:r:i")) !=3D -1) { switch (c) { case 'h': die_usage(0); @@ -291,6 +292,9 @@ static void parse_opts(int argc, char **argv) case 'r': proto_rx =3D protostr_to_num(optarg); break; + case 'i': + inq =3D true; + break; default: die_usage(1); break; --=20 2.48.1 From nobody Wed Sep 17 16:14:27 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 DD97A2F99A8 for ; Tue, 26 Aug 2025 09:29:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200591; cv=none; b=uJfodj/jmZ3B9y7xfM80wc3kC5ofvC3Yfiq+JSC8JNMWx3+ul5MEcBVeNnwK3yYTZJr8YsGQ6NuCJGbLEI708zn2IdfefWB4oZ2bUlkCI9SI1NklDK32GNVU7wEnCtn2XGis/Iydp+VAbdrc/ho94P44E+4GAw6HSSp2X2g7V/I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200591; c=relaxed/simple; bh=ut0LZqG+bpXm01iCKmp6mOogHMIbdycntYYmCYxtPvw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EA5UPdgul+0IOKG6SOXOcxrjDXCjhPljxvLiniNcNIzIZQ4CEipFDTnGEr0u3BbIKFkXqCae7Nnl7dOJ1Tsv2xotrMEjiRpTyv4KLV9GzMnFyVHANCQ5Be/Idumq+LlS/zEJoQdPxdlBM3ZUucwHWIKdj6h6iFTzXf5fn27XrxM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=T/b8+ysQ; 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="T/b8+ysQ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 28BBCC116C6; Tue, 26 Aug 2025 09:29:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756200591; bh=ut0LZqG+bpXm01iCKmp6mOogHMIbdycntYYmCYxtPvw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=T/b8+ysQ6dNGj4R5o8TEDgz8GuGtYnX7SKulZdxpE7JsY0L/uZ52VSyG02eEV4Dpo MDBd+V4YZoMw8kO69qK2zxkOFteWrDRMVzoAVuZwbsGBT7KahRCYh3Cu5QKwqNEd4j bONrO4CIEXMzisBf6j1XdhMQafRnzSgo3M1b0rSe7ublmGnIRxqFqOwe2geLtEqycJ 3aR9mONdsaZtA9tYkQXvfZJ6tJ5KFb9QMSN9tUkTNovmIEDt+G3sHJDReD1yty8M7O +iOKzs4+cGBtVXqPTnzaadBed7yz7U2HJoK4UeFWaJiJQ8drq2Ct2VZC16tInOxI9o HxGHjgiImTNCg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 04/14] selftests: mptcp: sockopt: set TCP_INQ on accepted sockets Date: Tue, 26 Aug 2025 17:29:28 +0800 Message-ID: <434baf239967e120a815419972c5ddb57453ed75.1756200029.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 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 --- tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index cb3d8dc34997..366e4aa4df0b 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -715,6 +715,14 @@ static void process_one_client(int fd, int pipefd) close(fd); } =20 +static void do_setsockopt_inq(int fd) +{ + int on =3D 1; + + if (setsockopt(fd, IPPROTO_TCP, TCP_INQ, &on, sizeof(on))) + die_perror("setsockopt(TCP_INQ)"); +} + static int xaccept(int s) { int fd =3D accept(s, NULL, 0); @@ -722,6 +730,9 @@ static int xaccept(int s) if (fd < 0) die_perror("accept"); =20 + if (inq) + do_setsockopt_inq(fd); + return fd; } =20 --=20 2.48.1 From nobody Wed Sep 17 16:14:27 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 708092FAC05 for ; Tue, 26 Aug 2025 09:29: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=1756200593; cv=none; b=ts5N70VNwHsgW7WqodW2/sm3QgHsXr47iXLfo7o4Tr6jfBkhxKqrMr0FKGARZMrHC7P0d29E/lwaDmwRfPYuCr4RhqhfjtL0SY1whBO3MZRMvbwcmNCAmAgqce0tDDpY4C7Orjsbh9FfAaCk9V+Rjlbfjmw0OyQh7xeD+Cyc9oU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200593; c=relaxed/simple; bh=ohugORkyhjAOiOavastc6HDoCmIIZrTHiG6dT9vAAMA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=W+/m1mfvp4c/chhPP1wOhTchgiCSgzLB0XgKVd0hl2lNvaUff8bMWvxKF1SOqlZbPf4C0dNFG6XcAnpJidjkZPBpjXeLgTMyh/Y9Rdrqy2+UKgs3/Z14NnW7sn/Z0LQnxlwxnaRtMIpIWPIOqhN+Bx1CXlfXds8js83Fn1Nu0rk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LE9lX5sf; 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="LE9lX5sf" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3F76FC4CEF4; Tue, 26 Aug 2025 09:29:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756200593; bh=ohugORkyhjAOiOavastc6HDoCmIIZrTHiG6dT9vAAMA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LE9lX5sf5MjQJFSrf40G7IEEpBhzD03h+7xAPc4WfrY5Dlcl4cIZJ1HinrCXXosxK N/xq6598r+g327w6IqlMh78+6pfUQONFaQcAzTdQu28aa5+10ZVgZ8xccK/YOS1t8w ZnKmlHaDmelbptywaLspU2ogTFGTjpazyS3ck1i58fS62P/ur/s+yy55WGhQgwdhXL o5jXjnAelnhh32FlgkINktvWkYPHEW1EnoumtmryGvbRFHqVsOgIy2jWNjngYPBLY1 mEKEZqDvzdYkPpHhJgeOOS9QDrRW6D03KwjIU2zv9+ZtV2PNZdONND7OF/wdvO58gz DUqZnKX2C4cEw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 05/14] selftests: mptcp: sockopt: use unix socket instead of pipe Date: Tue, 26 Aug 2025 17:29:29 +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 Replaces pipe-based synchronization with Unix domain socket pairs (SOCK_DGRAM) for better bidirectional communication reliability between server and client processes. These codes are from mptcp_inq.c. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 366e4aa4df0b..add29bdda9e5 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -593,7 +593,7 @@ static void do_getsockopts(struct so_state *s, int fd, = size_t r, size_t w) do_getsockopt_mptcp_full_info(s, fd); } =20 -static void connect_one_server(int fd, int pipefd) +static void connect_one_server(int fd, int unixfd) { char buf[4096], buf2[4096]; size_t len, i, total; @@ -618,9 +618,9 @@ static void connect_one_server(int fd, int pipefd) do_getsockopts(&s, fd, 0, 0); =20 /* un-block server */ - ret =3D read(pipefd, buf2, 4); + ret =3D read(unixfd, buf2, 4); assert(ret =3D=3D 4); - close(pipefd); + close(unixfd); =20 assert(strncmp(buf2, "xmit", 4) =3D=3D 0); =20 @@ -662,7 +662,7 @@ static void connect_one_server(int fd, int pipefd) close(fd); } =20 -static void process_one_client(int fd, int pipefd) +static void process_one_client(int fd, int unixfd) { ssize_t ret, ret2, ret3; struct so_state s; @@ -671,7 +671,7 @@ static void process_one_client(int fd, int pipefd) memset(&s, 0, sizeof(s)); do_getsockopts(&s, fd, 0, 0); =20 - ret =3D write(pipefd, "xmit", 4); + ret =3D write(unixfd, "xmit", 4); assert(ret =3D=3D 4); =20 ret =3D read(fd, buf, sizeof(buf)); @@ -736,7 +736,7 @@ static int xaccept(int s) return fd; } =20 -static int server(int pipefd) +static int server(int unixfd) { int fd =3D -1, r; =20 @@ -752,13 +752,13 @@ static int server(int pipefd) break; } =20 - r =3D write(pipefd, "conn", 4); + r =3D write(unixfd, "conn", 4); assert(r =3D=3D 4); =20 alarm(15); r =3D xaccept(fd); =20 - process_one_client(r, pipefd); + process_one_client(r, unixfd); =20 return 0; } @@ -801,7 +801,7 @@ static void test_ip_tos_sockopt(int fd) xerror("expect socklen_t =3D=3D -1"); } =20 -static int client(int pipefd) +static int client(int unixfd) { int fd =3D -1; =20 @@ -820,7 +820,7 @@ static int client(int pipefd) =20 test_ip_tos_sockopt(fd); =20 - connect_one_server(fd, pipefd); + connect_one_server(fd, unixfd); =20 return 0; } @@ -867,31 +867,31 @@ int main(int argc, char *argv[]) { int e1, e2, wstatus; pid_t s, c, ret; - int pipefds[2]; + int unixfds[2]; =20 parse_opts(argc, argv); =20 init_rng(); =20 - e1 =3D pipe(pipefds); + e1 =3D socketpair(AF_UNIX, SOCK_DGRAM, 0, unixfds); if (e1 < 0) - die_perror("pipe"); + die_perror("socketpair"); =20 s =3D xfork(); if (s =3D=3D 0) - return server(pipefds[1]); + return server(unixfds[1]); =20 - close(pipefds[1]); + close(unixfds[1]); =20 /* wait until server bound a socket */ - e1 =3D read(pipefds[0], &e1, 4); + e1 =3D read(unixfds[0], &e1, 4); assert(e1 =3D=3D 4); =20 c =3D xfork(); if (c =3D=3D 0) - return client(pipefds[0]); + return client(unixfds[0]); =20 - close(pipefds[0]); + close(unixfds[0]); =20 ret =3D waitpid(s, &wstatus, 0); if (ret =3D=3D -1) --=20 2.48.1 From nobody Wed Sep 17 16:14:27 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 0CEB23090D7 for ; Tue, 26 Aug 2025 09:29: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=1756200595; cv=none; b=hPM2sWhVkp/fHuCBDfxiq8dukPBGwEqQraKoRkO2kRM4HTlZ+oZiBiUWvCgVUo+SGixEeXRwSmn5SmjIxiftpdzqSbc42myqPZ47ISOF3/qykn9IQ4Hg5koi/pQnHR1h7MBvQxOQ5P11/AmxHA34jHTBdXfWJK0dJkEgykk74so= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200595; c=relaxed/simple; bh=qTPS7RLs53GHo22sjn1NyiUD2hAXnI4BGhqoo++z5lM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=D4vH7hGMKibe4VhbH5P61k3GoAXrtzfwiP94YZhEEpipMjskf2ZorOqYwBD4F5sBNe6PTA0dO/BqyCGcddN+isJNM+rN3IiJWaW81L7NGI/4PXZvtpJ7+WkH6T0MHlrK7FzugG/SZnwPgeAI1FxBJhchLPdCfxbaRZkNUUq5H7M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=a/tRWPBa; 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="a/tRWPBa" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E9BF1C116C6; Tue, 26 Aug 2025 09:29:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756200594; bh=qTPS7RLs53GHo22sjn1NyiUD2hAXnI4BGhqoo++z5lM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=a/tRWPBaTO1nowQdU0hcJQtCoFJl2Jd25qOuZebIqTSnEmQxQNFFLHiP2T0u4w1jF bzsWNaFIahe/OK1dEFPic5pwFaf9mFSfA49X5v+icEJ4UQkNBm5ESPxFhsViliwUDD 9Ho67dd/Kz0DeacEILVGZiQhd7MMXErn1+Fmk/cwBUrjjZhs/HfnU0yCUg88hPwgQ2 +a76Z/NDzNcUCGnm+uvkTCU312B+BQlyEhhiUO4QEJCQCKnbxYzkKv8gFhLt/Jj8Ek rxhgAbNxoz4zkD+Z9+xBGVN9RC2K7t8I2NQABKIKIWsNJ+woyxYuFNfT+YNJPnTilG 3tlXH8tQzryOg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 06/14] selftests: mptcp: sockopt: read eof at the end of process_one_client Date: Tue, 26 Aug 2025 17:29:30 +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 Moves EOF read handling to the end of process_one_client to ensure proper synchronization after processing all data transfers, preparing for TCP_INQ support in subsequent patches. Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index add29bdda9e5..d69b10d2dbe3 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -687,14 +687,9 @@ static void process_one_client(int fd, int unixfd) if (ret2 < 0) die_perror("write"); =20 - /* wait for hangup */ - ret3 =3D read(fd, buf, 1); - if (ret3 !=3D 0) - xerror("expected EOF, got %lu", ret3); - do_getsockopts(&s, fd, ret, ret2); - if (s.mptcpi_rcv_delta && s.mptcpi_rcv_delta !=3D (uint64_t)ret + 1) - xerror("mptcpi_rcv_delta %" PRIu64 ", expect %" PRIu64, s.mptcpi_rcv_del= ta, ret + 1, s.mptcpi_rcv_delta - ret); + if (s.mptcpi_rcv_delta && s.mptcpi_rcv_delta !=3D (uint64_t)ret) + xerror("mptcpi_rcv_delta %" PRIu64 ", expect %" PRIu64, s.mptcpi_rcv_del= ta, ret, s.mptcpi_rcv_delta - ret); =20 /* be nice when running on top of older kernel */ if (s.pkt_stats_avail) { @@ -712,6 +707,11 @@ static void process_one_client(int fd, int unixfd) s.last_sample.mptcpi_bytes_acked - ret2); } =20 + /* wait for hangup */ + ret3 =3D read(fd, buf, 1); + if (ret3 !=3D 0) + xerror("expected EOF, got %lu", ret3); + close(fd); } =20 --=20 2.48.1 From nobody Wed Sep 17 16:14:27 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 DEBC52D6625 for ; Tue, 26 Aug 2025 09:29:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200596; cv=none; b=DZsjJWGc8ume7wCKwdvXOqzDot4ZFCyQPkC647sOnqJJ3xGRJEyL/EqOMuhhBPrmjcrW+yxe8zs+SignCj0JT6Zknw0bqNco8OX1mSwN/DTLDdC0i2LejEPhmO5pNQNxjFAPBY+vQxqYFNahmbAKTDa8HSS4TYgYZv/0PayoRYw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200596; c=relaxed/simple; bh=9ZQPBMYQn0YNJAGbvgPTRLd+BttN17ECglWS9wogAYU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jls5GNYfUGuxMwRLWdRdpfpVx/2qLl+IarJAtxyBvbRpM+Zs7Z5gzMUA583KRZhdj8r8+45JXEiMmRiDN36+J6vFh2Lu3AtEeS46aREL1Dkmrs4cIXLFfYenD9wneeSrJBKyDq4MgB5hMOjyZnFULjkL5YQXAUW82vVxU1QWXA4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZRgEi+s3; 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="ZRgEi+s3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7FD0CC116B1; Tue, 26 Aug 2025 09:29:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756200596; bh=9ZQPBMYQn0YNJAGbvgPTRLd+BttN17ECglWS9wogAYU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZRgEi+s3LePDznkM2KimKN6wOhEw+3eWB+LjsICN2dGNKDcc8SCN+LwBkkos9pXdb 6rVMKuu/Tsb0YmH91aojAvxV2gbd6zRvMSKJRBut1fmbeZNQC15eTbiN8Yxa+L5Bpc bxHLvgC9k/cd4PVmVdBkPgBchBGfjtOAQw97+ky7QevQGOZaAs0/HLeK7xjoDl9q+W KQv31epIkqRsb31NdNekvcVW0kF5ji2K6LvLcAnqZXjq4CDaPskHkQ0hVJ4TmYKlLV E87WYVt+zTiP3NOXwI3w/9wGSUAL6SaQlCxLypsIDc1upaekafR6/0YJT2UHwWTQSy 1CC23cGcRaAww== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 07/14] selftests: mptcp: sockopt: use recvmsg instead of read Date: Tue, 26 Aug 2025 17:29:31 +0800 Message-ID: <9617a818fb66acbe37d4323b2453cfbcd14b30bf.1756200029.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 Replaces read() with recvmsg() to enable control message (CMSG) handling, preparing for TCP_INQ support in subsequent patches. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index d69b10d2dbe3..71cb311fcc50 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -665,8 +665,19 @@ static void connect_one_server(int fd, int unixfd) static void process_one_client(int fd, int unixfd) { ssize_t ret, ret2, ret3; + char msg_buf[4096]; struct so_state s; char buf[4096]; + struct iovec iov =3D { + .iov_base =3D buf, + .iov_len =3D 1, + }; + struct msghdr msg =3D { + .msg_iov =3D &iov, + .msg_iovlen =3D 1, + .msg_control =3D msg_buf, + .msg_controllen =3D sizeof(msg_buf), + }; =20 memset(&s, 0, sizeof(s)); do_getsockopts(&s, fd, 0, 0); @@ -674,9 +685,10 @@ static void process_one_client(int fd, int unixfd) ret =3D write(unixfd, "xmit", 4); assert(ret =3D=3D 4); =20 - ret =3D read(fd, buf, sizeof(buf)); + iov.iov_len =3D sizeof(buf); + ret =3D recvmsg(fd, &msg, 0); if (ret < 0) - die_perror("read"); + die_perror("recvmsg"); =20 assert(s.mptcpi_rcv_delta <=3D (uint64_t)ret); =20 @@ -708,7 +720,8 @@ static void process_one_client(int fd, int unixfd) } =20 /* wait for hangup */ - ret3 =3D read(fd, buf, 1); + iov.iov_len =3D 1; + ret3 =3D recvmsg(fd, &msg, 0); if (ret3 !=3D 0) xerror("expected EOF, got %lu", ret3); =20 --=20 2.48.1 From nobody Wed Sep 17 16:14:27 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 1B9E32FF176 for ; Tue, 26 Aug 2025 09:29:58 +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=1756200600; cv=none; b=VoHwE7pEAdh9J2eqMEK5Yr9TioMOjlh9e3gEAQd7anXTalK0sYywogP+3c6NhXOC2kSY1fxARcF1TFD70XGjbQJ03TUVzCsDgd9b4rokJOT0iE9Cs7xTuG17Vy9u6WcpQri19rKajThlyNe8g8yyACoHHGLfhJ3WwZ6gn6WCiLE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200600; c=relaxed/simple; bh=NwxROwi9cYQ5TFKU7gsM3OYl4s2YMtciGB1z2OF3GSM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tAx+CUa4VJzKQm7R9B7EcpB1Ot51XQdeXwT7Lz5DPaGppAgzcq59cBJiWsMyXtqFom3/v7K5G0ffo6zw9EzjkHfhYOF2zQA21W60ofJZxn4mTekz88wRapYNIqZzk+1tBYPmcWk7RcBiaus9ENn8MJcL72beLzgBlti316p/lvU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Zx0sEINJ; 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="Zx0sEINJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6BB65C116C6; Tue, 26 Aug 2025 09:29:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756200598; bh=NwxROwi9cYQ5TFKU7gsM3OYl4s2YMtciGB1z2OF3GSM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Zx0sEINJw40+FXlvLC1rzcDKF8fRXYlEAmUwuvf7FPhTzaU4hTV2dTlTAz2lNCG46 dBs5iPsMVrZltgl+7OJtNUmCIKSBun4eWIj2kQA0X+wJn8PtKkGHvlw5jK7KbKB88C QqPmdrsSwQvnHLEUsF2N60f/Wpc8jBQPlxw+Mu6CTkNmwlLHBzX0BmSNQZmc/wO+S1 ++wBO4Q3hfPV8YC9XeBbbiVmga1OLgM+Iv9HUKg6Lgc+j2JJBYqXDTcifFvPh3SMJe qh92auR20hftGW6f+gyThNRkya/ACFWScflwfItD+uiqjmnnCrilIwOnaHBR8s6a0Y Mr752KP2H4v8g== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 08/14] selftests: mptcp: sockopt: read one byte first Date: Tue, 26 Aug 2025 17:29:32 +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 Modifies data reading to first read one byte, then the remainder, ensuring accurate TCP_INQ validation and data consistency checks. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 71cb311fcc50..675ed2dcee9f 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -642,18 +642,18 @@ static void connect_one_server(int fd, int unixfd) } =20 total +=3D ret; - } while (total < len); + } while (total < len - 1); =20 - if (total !=3D len) - xerror("total %lu, len %lu eof %d\n", total, len, eof); + if (total !=3D len - 1) + xerror("total %lu, len - 1 %lu eof %d\n", total, len - 1, eof); =20 - if (memcmp(buf, buf2, len)) + if (memcmp(buf + 1, buf2, len - 1)) xerror("data corruption"); =20 if (s.tcpi_rcv_delta) assert(s.tcpi_rcv_delta <=3D total); =20 - do_getsockopts(&s, fd, ret, ret); + do_getsockopts(&s, fd, ret, ret + 1); =20 if (eof) total +=3D 1; /* sequence advances due to FIN */ @@ -685,6 +685,14 @@ static void process_one_client(int fd, int unixfd) ret =3D write(unixfd, "xmit", 4); assert(ret =3D=3D 4); =20 + /* read one byte, expect cmsg to return expected - 1 */ + ret =3D recvmsg(fd, &msg, 0); + if (ret < 0) + die_perror("recvmsg"); + + if (inq && msg.msg_controllen =3D=3D 0) + xerror("msg_controllen is 0"); + iov.iov_len =3D sizeof(buf); ret =3D recvmsg(fd, &msg, 0); if (ret < 0) @@ -699,9 +707,9 @@ static void process_one_client(int fd, int unixfd) if (ret2 < 0) die_perror("write"); =20 - do_getsockopts(&s, fd, ret, ret2); - if (s.mptcpi_rcv_delta && s.mptcpi_rcv_delta !=3D (uint64_t)ret) - xerror("mptcpi_rcv_delta %" PRIu64 ", expect %" PRIu64, s.mptcpi_rcv_del= ta, ret, s.mptcpi_rcv_delta - ret); + do_getsockopts(&s, fd, ret + 1, ret2); + if (s.mptcpi_rcv_delta && s.mptcpi_rcv_delta !=3D (uint64_t)ret + 1) + xerror("mptcpi_rcv_delta %" PRIu64 ", expect %" PRIu64, s.mptcpi_rcv_del= ta, ret + 1, s.mptcpi_rcv_delta - ret); =20 /* be nice when running on top of older kernel */ if (s.pkt_stats_avail) { @@ -709,9 +717,9 @@ static void process_one_client(int fd, int unixfd) xerror("mptcpi_bytes_sent %" PRIu64 ", expect %" PRIu64, s.last_sample.mptcpi_bytes_sent, ret2, s.last_sample.mptcpi_bytes_sent - ret2); - if (s.last_sample.mptcpi_bytes_received !=3D ret) + if (s.last_sample.mptcpi_bytes_received !=3D ret + 1) xerror("mptcpi_bytes_received %" PRIu64 ", expect %" PRIu64, - s.last_sample.mptcpi_bytes_received, ret, + s.last_sample.mptcpi_bytes_received, ret + 1, s.last_sample.mptcpi_bytes_received - ret); if (s.last_sample.mptcpi_bytes_acked !=3D ret) xerror("mptcpi_bytes_acked %" PRIu64 ", expect %" PRIu64, --=20 2.48.1 From nobody Wed Sep 17 16:14:27 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 47B9A301461 for ; Tue, 26 Aug 2025 09:30:00 +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=1756200600; cv=none; b=Hj3KhJoh5A/p6JS6+ri9u4bw2+8MJoMdL62R78KZMNnSnaQol08IFonafTdqLsNC01TaHhcvtash1uMJNXbc4Tx6OewGCxHXDKDvXTbPvCGrenj326af0j4tFMCv7fZE4DHVjnaKlvev2tkOZ1B/n3Ds3aVdF8l8WJQQCaF22Ks= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200600; c=relaxed/simple; bh=1JKAgF3adNToiZlKgOw2VSPvIYOIgDY9GzF5zcvyzrA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KKbfyuSgzcG9Cpc7Lhbg2Cd5x78ezphQbUaT0X997+E9qs3EbgOG+yl9uC259keDQCIBA0Vq8WtwH+nY0fBr1JfMY9CLQogi+g5L/kEEgg2jMRDxA7DNRj3YJq/j8hbjP/rrkkt9JV5F7YCLBze36oO0IDtnshGKinrTCXHcwDE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UvKAHI+r; 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="UvKAHI+r" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2D07EC4CEF1; Tue, 26 Aug 2025 09:29:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756200600; bh=1JKAgF3adNToiZlKgOw2VSPvIYOIgDY9GzF5zcvyzrA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UvKAHI+r64kob1/hsZxlOESf8Pzj7iNg8A090UCB4dEAseEzpQhdRHXUHtB7fHcla dn53oNQkWicg8lrJ2NL0LdVlYk0the4ekUj1dWV3MlxJm8MQhQ01P51rL9YDLqP+HL xzBj061mWVEZKIe7EBd+Kzn2MPk4m/910FkbuFkvXDmKGD9l/CbDORD87ecNeP4cB4 huYkaZAXnHQWraAbO3QtR8llceZ1BynPYbQJgTsRTQFRniIxbKQherkhrBoDX9TFaB tcszINSXP3w7u2/ioqgfZqhdWahkM0mZ2sEFLGByZ7701IF6wIdjcUGAfANalAdzFF nqOrZseCg5jvw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 09/14] selftests: mptcp: sockopt: add large data transfer tests Date: Tue, 26 Aug 2025 17:29:33 +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 Introduces large data transfer tests (1-17 MB) to validate MPTCP socket options under high-volume conditions, including proper EOF handling, preparing for TCP_INQ support in subsequent patches. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 90 ++++++++++++++++++- 1 file changed, 88 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 675ed2dcee9f..fc65157a41ee 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -620,10 +620,12 @@ static void connect_one_server(int fd, int unixfd) /* un-block server */ ret =3D read(unixfd, buf2, 4); assert(ret =3D=3D 4); - close(unixfd); =20 assert(strncmp(buf2, "xmit", 4) =3D=3D 0); =20 + ret =3D write(unixfd, &len, sizeof(len)); + assert(ret =3D=3D (ssize_t)sizeof(len)); + ret =3D write(fd, buf, len); if (ret < 0) die_perror("write"); @@ -659,14 +661,51 @@ static void connect_one_server(int fd, int unixfd) total +=3D 1; /* sequence advances due to FIN */ =20 assert(s.mptcpi_rcv_delta ? s.mptcpi_rcv_delta =3D=3D (uint64_t)total : t= rue); + + 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); + + ret =3D write(unixfd, &total, sizeof(total)); + assert(ret =3D=3D (ssize_t)sizeof(total)); + + while (total > 0) { + if (total > sizeof(buf)) + len =3D sizeof(buf); + else + len =3D total; + + ret =3D write(fd, buf, len); + if (ret < 0) + die_perror("write"); + total -=3D ret; + + /* we don't have to care about buf content, only + * number of total bytes sent + */ + } + + ret =3D read(unixfd, buf2, 4); + assert(ret =3D=3D 4); + assert(strncmp(buf2, "shut", 4) =3D=3D 0); + + ret =3D write(fd, buf, 1); + assert(ret =3D=3D 1); close(fd); + ret =3D write(unixfd, "closed", 6); + assert(ret =3D=3D 6); + + close(unixfd); } =20 static void process_one_client(int fd, int unixfd) { - ssize_t ret, ret2, ret3; + ssize_t ret, ret2, ret3, tot; char msg_buf[4096]; struct so_state s; + size_t expect_len; char buf[4096]; struct iovec iov =3D { .iov_base =3D buf, @@ -678,6 +717,7 @@ static void process_one_client(int fd, int unixfd) .msg_control =3D msg_buf, .msg_controllen =3D sizeof(msg_buf), }; + char tmp[16]; =20 memset(&s, 0, sizeof(s)); do_getsockopts(&s, fd, 0, 0); @@ -685,6 +725,12 @@ static void process_one_client(int fd, int unixfd) ret =3D write(unixfd, "xmit", 4); assert(ret =3D=3D 4); =20 + ret =3D read(unixfd, &expect_len, sizeof(expect_len)); + assert(ret =3D=3D (ssize_t)sizeof(expect_len)); + + if (expect_len > sizeof(buf)) + xerror("expect len %zu exceeds buffer size", expect_len); + /* read one byte, expect cmsg to return expected - 1 */ ret =3D recvmsg(fd, &msg, 0); if (ret < 0) @@ -703,6 +749,9 @@ static void process_one_client(int fd, int unixfd) if (s.tcpi_rcv_delta) assert(s.tcpi_rcv_delta =3D=3D (uint64_t)ret); =20 + /* should have gotten exact remainder of all pending data */ + assert(ret =3D=3D (ssize_t)expect_len - 1); + ret2 =3D write(fd, buf, ret); if (ret2 < 0) die_perror("write"); @@ -727,6 +776,43 @@ static void process_one_client(int fd, int unixfd) s.last_sample.mptcpi_bytes_acked - ret2); } =20 + /* 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; + } 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); + /* wait for hangup */ iov.iov_len =3D 1; ret3 =3D recvmsg(fd, &msg, 0); --=20 2.48.1 From nobody Wed Sep 17 16:14:27 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 2A79A306D3E for ; Tue, 26 Aug 2025 09:30:02 +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=1756200602; cv=none; b=WnGqpH2Y30id0sfVMJ6uTeAWGw4UTBK4w5FDOY1dCKZg3v0dicJFAG1Jk64+dyyvWOrDd4YwhvW27Ocofv8GVf9shmDxmP7LxJNM3sHT/7MkimWFCgG1YBbAE+QZDDSuCvwcF+3DLdOY3gUQi8vtBZSG59d7sjFZUEtuaN1r92s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200602; c=relaxed/simple; bh=aucwV16ajChVtuuyf7HN2IIBaCqGS3+1Xk2tmdqvbGk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LG9nQ1hd1e0AI1a6bNnxRy6MvdrfvOCEwS//+NVcoSeYWGZjCJBBKQuS6YPvfk9hyCXSzs6/xmqOM+wZyacS31bgHv8ItZa36dp4pcF3B6yG79Mod7C8GmtmFGBpIPD3DRSfx4dNb+AyOYFDsZkGzsxlvc7OS7ED2m/0XxIPOfg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=supiwRaH; 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="supiwRaH" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C9B19C116D0; Tue, 26 Aug 2025 09:30:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756200602; bh=aucwV16ajChVtuuyf7HN2IIBaCqGS3+1Xk2tmdqvbGk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=supiwRaHsBobzZfz0TlVUGt+ruK7WNvnPDfHzPNwoX0y6xBXgbOK2ShRqcvXE1Ans jgB7fxNaRxCQjV/r/Y458ENMF5Aqnao/MDuYcaZo3Ot+Bs1lQBWZIL4p0oGdP0LXVr Mw+nBck6Hfrr1Lv+4TFc3vD/xM5At27znNZwbHuE088L8TNnOkYFdHAAZUp6+jt+Au 3c3abLae/cFIdRcKCpSzken2TE88IUUOtnddBbqvdSnvRK0zPKx69JmjrrCYPxUTG+ ZdTQBFgGMXXO+TkgG2Wby8woMb2RrRbSHH36ekNZJUR7olFBaM60OOrpwolpwPTcwj 50i4uyXRxW/RA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 10/14] selftests: mptcp: sockopt: add wait_for_ack Date: Tue, 26 Aug 2025 17:29:34 +0800 Message-ID: <7c3b87fbfca4291c5df9a8efb26e57f0c0eba9fb.1756200029.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 Adds wait_for_ack() helper using TIOCOUTQ/SIOCOUTQNSD ioctls to synchronize tests by waiting for data acknowledgment before proceeding. These codes are from mptcp_inq.c. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index fc65157a41ee..b8e8fec8979f 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -21,11 +21,13 @@ #include #include #include +#include =20 #include #include =20 #include +#include =20 static int pf =3D AF_INET; static int proto_tx =3D IPPROTO_MPTCP; @@ -593,10 +595,43 @@ static void do_getsockopts(struct so_state *s, int fd= , size_t r, size_t w) do_getsockopt_mptcp_full_info(s, fd); } =20 +/* wait up to timeout milliseconds */ +static void wait_for_ack(int fd, int timeout, size_t total) +{ + int i; + + for (i =3D 0; i < timeout; i++) { + int nsd, ret, queued =3D -1; + struct timespec req; + + ret =3D ioctl(fd, TIOCOUTQ, &queued); + if (ret < 0) + die_perror("TIOCOUTQ"); + + ret =3D ioctl(fd, SIOCOUTQNSD, &nsd); + if (ret < 0) + die_perror("SIOCOUTQNSD"); + + if ((size_t)queued > total) + xerror("TIOCOUTQ %u, but only %zu expected\n", queued, total); + assert(nsd <=3D queued); + + if (queued =3D=3D 0) + return; + + /* wait for peer to ack rx of all data */ + req.tv_sec =3D 0; + req.tv_nsec =3D 1 * 1000 * 1000ul; /* 1ms */ + nanosleep(&req, NULL); + } + + xerror("still tx data queued after %u ms\n", timeout); +} + static void connect_one_server(int fd, int unixfd) { char buf[4096], buf2[4096]; - size_t len, i, total; + size_t len, i, total, sent; struct so_state s; bool eof =3D false; ssize_t ret; @@ -667,10 +702,13 @@ static void connect_one_server(int fd, int unixfd) =20 total =3D rand() % (16 * 1024 * 1024); total +=3D (1 * 1024 * 1024); + sent =3D total; =20 ret =3D write(unixfd, &total, sizeof(total)); assert(ret =3D=3D (ssize_t)sizeof(total)); =20 + wait_for_ack(fd, 5000, len); + while (total > 0) { if (total > sizeof(buf)) len =3D sizeof(buf); @@ -691,6 +729,8 @@ static void connect_one_server(int fd, int unixfd) assert(ret =3D=3D 4); assert(strncmp(buf2, "shut", 4) =3D=3D 0); =20 + wait_for_ack(fd, 5000, sent); + ret =3D write(fd, buf, 1); assert(ret =3D=3D 1); close(fd); --=20 2.48.1 From nobody Wed Sep 17 16:14:27 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 3D5F63093A7 for ; Tue, 26 Aug 2025 09:30:03 +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=1756200604; cv=none; b=aVc6MDPtO4e2nIiefP9MkmLo+7RFidq/qxhO8XJCqQm4t0+8TA/l7Qqe8EqHvyBR+LhHXGN+CDQY5GGZ3cMrSbTs3DG/fhnsUNS4QD/dEfSSVFmon/lltBnItHnE3TxXQFpyf4xGvDtHuRMdq8/cGkJJal7xXt2Ej0s07KwNeYo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200604; c=relaxed/simple; bh=8QagbiO/zoUMg9axgJJOInRd3KfFKq+khADlc59tUtU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nb9kVmQLA/AvH7Rx8jJxB8AeqNE5OeiudERv915UKn+GPrUzH4vU+++tOsLBMmnBr3tI+rXqXzf5DzgTznUbplMp9ZO92AS2L/XL1DIJR4E+mDT1QOQnicEEkVe3jbN8HEhRA4gEXMZRuFXcQqtLy1Z8fIJmKcs0Y+nKqN+kMBk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ntbY4Fiz; 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="ntbY4Fiz" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 95A53C116C6; Tue, 26 Aug 2025 09:30:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756200603; bh=8QagbiO/zoUMg9axgJJOInRd3KfFKq+khADlc59tUtU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ntbY4FizVL0boqrJT8H+GX7VsyXTDMes8eue9tksd8/I4hIg0EvqMiqzJ/IVyVSDz bbjImYx2pfETto5pq2RN4U5IodJE1qRu2TOE1BvVTos2G/7uVNi2DNpNj12XR3IJu8 Xs79cCACVDnvcC5U5Lt/RvmG7lFIMrN4PYgWhI2sarjSrt8w0JnAToqP7Tp2XUo/9Q 20SzJXHYBpLizFm55niKU/bG5ia/P4/qlNDHsa7tjnWAR8hIu4RdwB1NplmDq0gy5S ePMvY3UydV3xAnZf40K4zaLBdiSnc2ioUWdA06GTpu8tUcLmmuvy4FJOv+Ewb31nkG d6/zEkT+8SFKQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 11/14] selftests: mptcp: sockopt: set FIONREAD ioctl Date: Tue, 26 Aug 2025 17:29:35 +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 Implements FIONREAD ioctl checks to validate available data size, ensuring synchronization between write and read operations with non-blocking waits. These codes are from mptcp_inq.c. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index b8e8fec8979f..7cc4626b7bf3 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -771,6 +771,24 @@ static void process_one_client(int fd, int unixfd) if (expect_len > sizeof(buf)) xerror("expect len %zu exceeds buffer size", expect_len); =20 + for (;;) { + struct timespec req; + unsigned int queued; + + ret =3D ioctl(fd, FIONREAD, &queued); + if (ret < 0) + die_perror("FIONREAD"); + if (queued > expect_len) + xerror("FIONREAD returned %u, but only %zu expected\n", + queued, expect_len); + if (queued =3D=3D expect_len) + break; + + req.tv_sec =3D 0; + req.tv_nsec =3D 1000 * 1000ul; + nanosleep(&req, NULL); + } + /* read one byte, expect cmsg to return expected - 1 */ ret =3D recvmsg(fd, &msg, 0); if (ret < 0) --=20 2.48.1 From nobody Wed Sep 17 16:14:27 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 945452E7F32 for ; Tue, 26 Aug 2025 09:30:05 +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=1756200605; cv=none; b=k6sykQ4MNOlGV6xh3je1TDvhhlkVUDSMbVrY1QgWwWRmDct16gMG+j/qstOUSAkGgxHEX/29hpbMDIamPfnNm4WqGhQwM2mcR97I2tqMRM8wrtDSUP2bB0Lbh94AlnWqjQwmlJ/LQLkt3phpWI2TxHNnxN3/i26NRNI9oYbg3YY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200605; c=relaxed/simple; bh=qiqbcMib9J43NDONqFdTSTPr23jwgwITCPHvgod6958=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=l65yXrkO0xi8/lc9iybqMgNYFJ+ACYYtFnRes4bt1mYl11LFOPiCu9xaRTmsbCvhVwzMjbQu1VxnOoAmdLzBhzclwdGeJpMYCEmL+ud2yIGjQBiZc5nBfb5s8RbZZm5fHW0fLVdjtw7JPrQA8nvmp8sLDVdbWP+tuGqjMfibd5k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Gs2Gy6fi; 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="Gs2Gy6fi" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3F61FC4CEF4; Tue, 26 Aug 2025 09:30:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756200605; bh=qiqbcMib9J43NDONqFdTSTPr23jwgwITCPHvgod6958=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Gs2Gy6fikINrZGJF8sv5nSSyjfwmhznGTYZ5rNZoCEqZzkk2Yhzq8cjwRr+WeiPL0 cs2NqWW+GHnz2webxwtQrD0gpo0AdpBOTIsJFFurJkvWKBZUk/J8HcNyctWWMhz/xJ 3KovyKWOXprryMscjkMDVRyxwqO5+MoLIYXBj0VHK+Coi7kHsd4TYvSxeWCtncpxB+ qpI53VHSwtO2QOm24peSsBFplJBZDKt5uO4rdLwjtnPssNGYBxyP3I7pR4llZL6hPM AtQUrBd65oVFakjyPR5UujxN1HBBi6ET3YxcDmO1QdigCSFKQnkq52nlucOkImDlIg mjEKicDXdOmnw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 12/14] selftests: mptcp: sockopt: add check_tcp_inq helper Date: Tue, 26 Aug 2025 17:29:36 +0800 Message-ID: <8ca40aac424fff8465653c946e84fc29e18f19a8.1756200029.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 Adds check_tcp_inq() helper to extract and verify TCP_CM_INQ values from control messages, ensuring correct in-queue data tracking during transfers. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 7cc4626b7bf3..fb6f76c4dc07 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -740,6 +740,35 @@ static void connect_one_server(int fd, int unixfd) close(unixfd); } =20 +static void get_tcp_inq(struct msghdr *msgh, unsigned int *inqv) +{ + struct cmsghdr *cmsg; + + for (cmsg =3D CMSG_FIRSTHDR(msgh); cmsg ; cmsg =3D CMSG_NXTHDR(msgh, cmsg= )) { + if (cmsg->cmsg_level =3D=3D IPPROTO_TCP && cmsg->cmsg_type =3D=3D TCP_CM= _INQ) { + memcpy(inqv, CMSG_DATA(cmsg), sizeof(*inqv)); + return; + } + } + + xerror("could not find TCP_CM_INQ cmsg type"); +} + +static void check_tcp_inq(struct msghdr *msgh, unsigned int check, bool eq= ual) +{ + unsigned int tcp_inq; + + if (!inq) + return; + + get_tcp_inq(msgh, &tcp_inq); + + if (equal) + assert(tcp_inq =3D=3D check); + else + assert(tcp_inq <=3D check); +} + static void process_one_client(int fd, int unixfd) { ssize_t ret, ret2, ret3, tot; @@ -797,6 +826,8 @@ static void process_one_client(int fd, int unixfd) if (inq && msg.msg_controllen =3D=3D 0) xerror("msg_controllen is 0"); =20 + check_tcp_inq(&msg, expect_len - 1, true); + iov.iov_len =3D sizeof(buf); ret =3D recvmsg(fd, &msg, 0); if (ret < 0) @@ -810,6 +841,9 @@ static void process_one_client(int fd, int unixfd) /* should have gotten exact remainder of all pending data */ assert(ret =3D=3D (ssize_t)expect_len - 1); =20 + /* should be 0, all drained */ + check_tcp_inq(&msg, 0, true); + ret2 =3D write(fd, buf, ret); if (ret2 < 0) die_perror("write"); @@ -853,6 +887,8 @@ static void process_one_client(int fd, int unixfd) die_perror("recvmsg"); =20 tot +=3D ret; + + check_tcp_inq(&msg, expect_len - tot, false); } while ((size_t)tot < expect_len); =20 ret =3D write(unixfd, "shut", 4); @@ -871,11 +907,15 @@ static void process_one_client(int fd, int unixfd) die_perror("recvmsg"); assert(ret =3D=3D 1); =20 + /* tcp_inq should be 1 due to received fin. */ + check_tcp_inq(&msg, 1, true); + /* wait for hangup */ iov.iov_len =3D 1; ret3 =3D recvmsg(fd, &msg, 0); if (ret3 !=3D 0) xerror("expected EOF, got %lu", ret3); + check_tcp_inq(&msg, 1, true); =20 close(fd); } --=20 2.48.1 From nobody Wed Sep 17 16:14:27 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 EEA8A2F83C1 for ; Tue, 26 Aug 2025 09:30:06 +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=1756200607; cv=none; b=mKE7eyFyGPHX1sqeXZ33+3V0Zi560jD6c7/+RZAxEu0Rq+rk9OO//5OqhzmmWg6XZsfVTQZNTISNliJqt31hTwL+0uQ1sfkv/Aoz6YLCPOjCbLinF408h9Nb+eNHbDqGpnIYwHMFlueqJBWlR4lTdRw1KRlzqI8ThdJyNkcrcGc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200607; c=relaxed/simple; bh=zn9G0q4tgfuwbhmMWEICwzVsyAuMrbyo+0SHnIet2C0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=G3ToQLSkorhN9UQEQ9FagLXDdEfl1nP70fBbBjvKDXThK59/+UQygb5jPwWLqv9n4c9cvWaBY9gL99N2Vy+64rdiHSJ0ufSdLO1KI4zl/ErB6Tbw0APH6HEIpC4NurJjw4t10dygqA1Q/lAxdnQX4mrZ/oVd4f643QJRPQs2OVs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=e4FnuaXo; 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="e4FnuaXo" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CBE3CC4CEF1; Tue, 26 Aug 2025 09:30:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756200606; bh=zn9G0q4tgfuwbhmMWEICwzVsyAuMrbyo+0SHnIet2C0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=e4FnuaXoFcZ9hl+dRx7/9m1dCIjwKXijAUCkjgI+2xoprMLc14RhO95mhdxFgupL/ mXq1czMMwuAE3Er3d2Wy7Xk0mWXfIlE89ERd1619wMUcUScMuMzGY/HzAw/EB4OqJC oAzFattUMWZ5371sDtHF5EjsASgr1P2fTTB6PZTiJjaZbR+c6er3ieK5NlRZSnwZMZ g9AKmqsKzNgVqJSN0uvOKsZsHcj3c9cekSo36g4v+OH+uPK2sQ16xGqhAqc6R5cY+C SenN1MIMlyKLd2mRu3wXhh8dDag0AUtTk8OU7nGz944BhVF0M0l+t/tp7KiCcU8KUV Io1KlSj/8Rb/A== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 13/14] selftests: mptcp: sockopt: replace mptcp_inq with sockopt Date: Tue, 26 Aug 2025 17:29:37 +0800 Message-ID: <1b5e3a34620c8b6b44e7bb9e3ddcfee73c9b4f9b.1756200029.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 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 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/tes= ting/selftests/net/mptcp/mptcp_sockopt.sh index 418a903c3a4d..f5150a10b064 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 @@ -331,19 +331,19 @@ do_tcpinq_tests() =20 local args for args in "-t tcp" "-r tcp"; do - do_tcpinq_test $args + do_tcpinq_test $args -i lret=3D$? if [ $lret -ne 0 ] ; then return $lret fi - do_tcpinq_test -6 $args + do_tcpinq_test -6 $args -i lret=3D$? if [ $lret -ne 0 ] ; then return $lret fi done =20 - do_tcpinq_test -r tcp -t tcp + do_tcpinq_test -r tcp -t tcp -i =20 return $? } --=20 2.48.1 From nobody Wed Sep 17 16:14:27 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 DD18C3093DB for ; Tue, 26 Aug 2025 09:30:08 +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=1756200608; cv=none; b=VjvjaZqXMXUcyYuJmUdFZBoY6NXJcHssEu2eq7LBDMZNNTaBVwHSAjD/zZLQfjNhjRd/S9i19zD3C5GcqYtRJwT/V89zxsblNkx86kC8Lm9km+aWcyq8UDeh05te0hgUQatFqhIcza0VZ3EMnwPtDnAW3q1awj7/f5by5Io5Cc8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200608; c=relaxed/simple; bh=umgdrY7+C+IhLDV3/iQnB5ZcaCgIzmMGukdcQHfqYLM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=i1Xfot9R5/y8VFxIyiA5q90tmIkRtbA+YpPurCxt3YS34ElmGgdI6K8L43qmtLM0rf2hnZg9mt1m4ySDGFQ5ClMGRG29Y1yVMijDROabwbEHnUQHJ20vZLJUmSNpvuXFoZR6u8X2DnwzYQ/shaS/kmTHpcvWO1w1D5hx8ExXy9Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Dkfh4GZn; 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="Dkfh4GZn" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5B42FC4CEF4; Tue, 26 Aug 2025 09:30:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756200608; bh=umgdrY7+C+IhLDV3/iQnB5ZcaCgIzmMGukdcQHfqYLM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Dkfh4GZn76ONmuLiSZpqwj81ce31jm+I2Z3Ejj6wpz7ldh8mzbWmiBmFUcRuTVM7k pSv168py8fzIcsCgpPbgFLpVVULRHYSF914kYn0haTctp4mEweO7J779oc4W6tUFWg mq5uT+Ahy0yhxlnmd7NrzDaree/CNui13jUFWsD2g5i5p/UgPNt49SD7OcVAtT04GF yaAt4D+cHw9/ecLjCFKbdketUvWqpd4jNtSVorVXHlEN+7PSWoL37SThACzwU+sJ80 152i0mHgpA5rJo20CmCxuRAWKLKY3OZ02X8JcIAHwPrsG855z2Lr3ZfsRP36thBLVa EeFTm9vVrJAtA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 14/14] selftests: mptcp: sockopt: remove obsolete mptcp_inq Date: Tue, 26 Aug 2025 17:29:38 +0800 Message-ID: <7be4f94f0baa67040ce181f50c4c5cef1a07c065.1756200029.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