From nobody Mon Aug 24 20:41:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 88E6D27703 for ; Sun, 26 Jul 2026 08:30:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054624; cv=none; b=dWj8ycEe3ijSBFTWLUos17OT/ThIfttyAQXTkj/bWtIPReQx+mg09FY5V7ZdFHnCluSl8epEM94LI/wPDsPVtIQUDvNCAQ+Borcgja7xZ69A/XYD6Dota7WqMJ+1hQ7/NWoNEU9RuN4WcU5gk8apTbEshls/X2yTKhb5gK9IO0M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054624; c=relaxed/simple; bh=uvfZ6kDhqO0L3HnNSmvXqrG4OhMUiWk1+eIM4AP+02U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PA+6c0n6g8d2sYBLjUIs+Zxm13ZgaRocB2zFxqnoGECfSg9CZRmgEgDtpDeN7nc8z9JltqQ9Gs38bQ7Py0zDWe39LjzxAlSHyS8tNMUzcEsGtPyoWGxe4VLuM+Ay3HHysT/wNNYm4zrPR6MyoBbozQVr4Wz4wpFVeutyVDgkD8Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DsJ4iYIM; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="DsJ4iYIM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8B4481F00A3F; Sun, 26 Jul 2026 08:30:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785054623; bh=2J/s/eXSR8JDR/0lG9znHs/mhbbm0LpOf8PbPcED0/M=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=DsJ4iYIMGY3JWQvG37WxytkZAvcTc3uP7lkXi7C18LQIxzfXsRYvv1ZGObDmbdsGi 1gCZoQy0YEH9WpkJycEKNfC9kwRadN0vn/nx1CSInxOMkHSkIBZUIlT0iZHHL0GagE ij//vip1TvwymDy6/w3x47t7kFXkcHFAxq9fKRrtr8ZZdKBUWdOw5gxeVnPW5eTbQf 7JQg/yBbam8htD4oZJrobsdQ+XxuW4afom6cSIcE2W/zFZtVmN1S4XoAEvuC2VU6Zi 2A8MYlffG8Dp5heVAbRmI4wFxpf1Cmhqy11SmwfBk2wQmLD+xOwZ9P06/XWyBq/6mc oww4Ikc8CRASw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v13 01/12] selftests: mptcp: sockopt: reseed RNG after fork Date: Sun, 26 Jul 2026 16:30:06 +0800 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang xfork() does not reseed the RNG in the child, so server and client processes use the same rand() sequence. Restore the per-fork reseed from mptcp_inq.c by calling init_rng() in the child, ensuring independent random values for buffer contents and transfer sizes. init_rng() is now called from each forked child (server, client) so that rand() sequences don't diverge from a single parent seed. But the fallback path did 'srand(time(NULL))' - and time(NULL) has 1-second resolution, so the two children spawned back-to-back in main() almost always land in the same second and end up with the same seed, defeating the per-child re-seed. Mix in getpid() (per-process unique, kernel-guaranteed) with time(NULL) (cross-second entropy) so the fallback produces an independent seed for each child even when /dev/urandom is unavailable. Also hoist the 'foo' local to function scope and collapse the two srand() callsites into a single one at the end, so both branches consistently write the seed into 'foo' first. Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 10 +++++++--- 1 file changed, 7 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 b6e58d936ebe..6c3d896d4a1b 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -128,6 +128,8 @@ struct so_state { #define MIN(a, b) ((a) < (b) ? (a) : (b)) #endif =20 +static void init_rng(void); + static void __noreturn die_perror(const char *msg) { perror(msg); @@ -799,6 +801,8 @@ static pid_t xfork(void) =20 if (p < 0) die_perror("fork"); + else if (p =3D=3D 0) + init_rng(); =20 return p; } @@ -822,9 +826,9 @@ static int rcheck(int wstatus, const char *what) 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; =20 /* can't fail */ @@ -832,10 +836,10 @@ static void init_rng(void) assert(ret =3D=3D sizeof(foo)); =20 close(fd); - srand(foo); } else { - srand(time(NULL)); + foo =3D getpid() ^ time(NULL); } + srand(foo); } =20 int main(int argc, char *argv[]) --=20 2.53.0 From nobody Mon Aug 24 20:41:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E678527703 for ; Sun, 26 Jul 2026 08:30:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054626; cv=none; b=uyZUeOzPdJw99FMEnVdbUALgjWnE6AGlmNR4kyloAU9ypuER1Bmk+WjtHEGln+pArPVMLOlVpqgLaAJqXlZQnJq9afN/aWFZ8oFzFUiJhjByvoXk9/xFzzjj2u6Fvt3EQ9EsfOMEmaJhXZ/4VT4hFI4tymUnDgKkIlPYn+Qmz6Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054626; c=relaxed/simple; bh=+7WgKNSlrugYDiZ5+80t0H5Hlr3KXOlbLNCsPwqHfYI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=k88uI75i1fUJfsmfDiWaW0u7ojFpCTHXMdFDxlycPVtY2PvfVPaO5bUvkhU2nB+gIFInC0he05dmwp28Yq02ZT1Nk+e/q0p5Zpg1rX8KEEJ3hM2MduggIYywwe/EVVneJdIFxWPvMGrRlOOXDbAcp71Eci1ZW96KV0v8G3evSbU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=N9W8wL4x; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="N9W8wL4x" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DC3101F00A3A; Sun, 26 Jul 2026 08:30:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785054624; bh=xLhJCXWMpWarH0jIkywBa5ypIEKygvKthsKGETUyyZw=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=N9W8wL4xb8ys4YFokh2IXueW9ZRlI9SywWldm7N3KWtZ/SZxE4WUlRKc1w0yAXWIS k8mW1yeRfc+kjADOXw4rWvlO+h3BJYf2t4ItQMg7736gKO4oU9jogyLgkdiOlwugza 01UWruU086ljAWyMO2jMWZ9jeQJVQ1DGTwauNzH20PKAi/hqm/vweZ+caMzUJP7QHy EcwNXKOzITJ+DgSTcMrUfPcxruyljq8y9DnAoGDckJt3nonBxUSASCk5+V3Iz+IgvH ycdsD5zuYd9Bc3I6WPLAONftYfW/JaZ2fZAsjyy6D7mPujrBHhBz8fmsrkJqNbQfR7 tl75GhmCJs3lA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v13 02/12] selftests: mptcp: sockopt: use exact length in connect_one_server Date: Sun, 26 Jul 2026 16:30:07 +0800 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Use the exact remaining length ('len - total') when reading the echoed data from the socket, instead of the full buffer size. This silences a false positive -Wstringop-overflow warning from GCC, as the compiler can now prove that the destination buffer is large enough for the specified read size. connect_one_server() passes per-chunk 'ret' to do_getsockopts() instead of cumulative 'total', causing mismatches when the echo is fragmented. Fix by passing 'total' to match the semantics used in process_one_client(). Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 4 ++-- 1 file changed, 2 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 6c3d896d4a1b..469384823dc6 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -609,7 +609,7 @@ static void connect_one_server(int fd, int pipefd) =20 total =3D 0; do { - ret =3D read(fd, buf2 + total, sizeof(buf2) - total); + ret =3D read(fd, buf2 + total, len - total); if (ret < 0) die_perror("read"); if (ret =3D=3D 0) { @@ -629,7 +629,7 @@ static void connect_one_server(int fd, int pipefd) if (s.tcpi_rcv_delta) assert(s.tcpi_rcv_delta <=3D total); =20 - do_getsockopts(&s, fd, ret, ret); + do_getsockopts(&s, fd, total, total); =20 if (eof) total +=3D 1; /* sequence advances due to FIN */ --=20 2.53.0 From nobody Mon Aug 24 20:41:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 472581DE3B7 for ; Sun, 26 Jul 2026 08:30:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054627; cv=none; b=bGqQFimA5jcpXogUqFHB26n2UKeM7H/a65UFStEtgDhndbUUf4iHvv4tOaSL22kEtGUKW0SmxmqxStKD2Vsh4j7a4qk4QLbqRABGXzqBH+o7FqOZeVcuwfvvqAp8/bE3twJ+0YvS5+jgbzc6R//4Wcwq1FGfxiRLmep4RAO3bgI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054627; c=relaxed/simple; bh=ueP1imoXOc+NytGOTzyA5tXXy2JV/JYY7hOAPA0sARk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ak04UuzhDZrXUH7ElmVrnNwjzIrwiCdwl7WaVuuoPvaY5W/8LATz7XaqEPqLrblHnNsUPrehkQk6T1qSi0uwkMSFXd/+jXvzY6fHEIfmj8u3JNaFNEepBWLs18wTvUfeudxlDHs3k26FOlylFVSqH4krvRX0BES+JFGeyaEK2RI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fUohnRwY; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="fUohnRwY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 36EF41F00A3E; Sun, 26 Jul 2026 08:30:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785054626; bh=W1NabytxOtzXfAt74Uq1mHRW7TcBXBLpkjn3gvvJPUY=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=fUohnRwYV3KWbQscpfy+Vh03l+/tOfCybcjXvdarRg2pK/9MLEZK+REGGVO5ZxdkK qf7sqegugMx8kifhK7n5su/hgHwYMuLeb+8tUXUzKYzlGuj96Y/0j4Wg/AU6+qhAxk C0gl7MeUlz2gscQks0/EFNWxypHI3fbL7x5NnGhYZmqQdXrWEXxsL5CeUmCTS+5CQh 5use2bBostJBHmTS17h6TKzxuOkLPwAOCKzduCUF9YYRSYR6xxzz5E7eaEJfqH8ZCs h0Y25G73rj2500qQwRPa2VLLE5R53WplbaXsC14RVwQPh8IWL4UeE4fXQYIt7mpNfH YIjHZPl+fn1tA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v13 03/12] selftests: mptcp: sockopt: add check_stat_equal helper Date: Sun, 26 Jul 2026 16:30:08 +0800 Message-ID: <43789c8b18c33a8a2343ba375c895576bc36acf9.1785054129.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Add check_stat_equal() helper to reduce repetitive error reporting code when validating MPTCP statistics values in process_one_client(). Also fix bytes_acked validation: compare it against the amount of data written (ret2) instead of the amount read (ret), as bytes_acked tracks sent and acknowledged data. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 39 ++++++++++--------- 1 file changed, 21 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 469384823dc6..a68fbe13b096 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -638,6 +638,16 @@ static void connect_one_server(int fd, int pipefd) close(fd); } =20 +static void check_stat_equal(const char *name, uint64_t actual, + uint64_t expected) +{ + if (actual =3D=3D expected) + return; + + xerror("%s %" PRIu64 ", expect %" PRIu64 ", diff %" PRId64, + name, actual, expected, (int64_t)(actual - expected)); +} + static void process_one_client(int fd, int pipefd) { ssize_t ret, ret2, ret3; @@ -669,27 +679,20 @@ 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) - xerror("mptcpi_rcv_delta %" PRIu64 ", expect %" PRIu64 ", diff %" PRId64, - s.mptcpi_rcv_delta, ret + 1, s.mptcpi_rcv_delta - (ret + 1)); + check_stat_equal("mptcpi_rcv_delta", s.mptcpi_rcv_delta, + (uint64_t)ret + 1); /* +1 for FIN */ =20 /* be nice when running on top of older kernel */ if (s.pkt_stats_avail) { - if (s.last_sample.mptcpi_bytes_sent !=3D ret2) - xerror("mptcpi_bytes_sent %" PRIu64 ", expect %" PRIu64 - ", diff %" PRId64, - s.last_sample.mptcpi_bytes_sent, ret2, - s.last_sample.mptcpi_bytes_sent - ret2); - if (s.last_sample.mptcpi_bytes_received !=3D ret) - xerror("mptcpi_bytes_received %" PRIu64 ", expect %" PRIu64 - ", diff %" PRId64, - s.last_sample.mptcpi_bytes_received, ret, - s.last_sample.mptcpi_bytes_received - ret); - if (s.last_sample.mptcpi_bytes_acked !=3D ret) - xerror("mptcpi_bytes_acked %" PRIu64 ", expect %" PRIu64 - ", diff %" PRId64, - s.last_sample.mptcpi_bytes_acked, ret, - s.last_sample.mptcpi_bytes_acked - ret); + check_stat_equal("mptcpi_bytes_sent", + s.last_sample.mptcpi_bytes_sent, + (uint64_t)ret2); + check_stat_equal("mptcpi_bytes_received", + s.last_sample.mptcpi_bytes_received, + (uint64_t)ret); + check_stat_equal("mptcpi_bytes_acked", + s.last_sample.mptcpi_bytes_acked, + (uint64_t)ret2); } =20 close(fd); --=20 2.53.0 From nobody Mon Aug 24 20:41:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A52081DE3B7 for ; Sun, 26 Jul 2026 08:30:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054628; cv=none; b=n0hd/110VjQTemi/k5YKmsKig1uvEpF4o88V3fIBwwBfVwwtVkILc05r6IGKByMBPP08JbRZz1Pu0rtgqAiQpC4ISBzRGu94azfntvq2TustJD0CX2SzxtNjyyOeuV7Scndowsg9fl5P3y4Oi8a6QNNP7+gxW3Ng30qlNXP+L/c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054628; c=relaxed/simple; bh=54RU6yRc9qeD0tcfjyoka7QKsx1+RquwweBEULIY+Yk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AWZJ2W0QOs2MKsQRWA8Qw9YSFhrdivXLM2kpNqBRx55NM3BQNqdF9IYX+ip6fAdE/R8Nh+Q47zjPMY3wBH24h0y9iUaN6K3XscsLg6DiM9TsIEu2QTEHYTtQwW2OyzH6K3wgCzTBkh5QcyDj09jc4VUUVxuM3WXGnoBjJrADp14= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZbMEKjA5; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ZbMEKjA5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 897741F00A3A; Sun, 26 Jul 2026 08:30:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785054627; bh=QC6FRY0ncAnlonmIKXjv3a9HL6OULQy+CqRKZpH/AIY=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=ZbMEKjA5yaXWWM3+onHdBri8qcbcEC+21rnyps/s4hXgm0tVzlqbdr1ZoYtsYzo3R eg5FcRDXkK8+RCxNFSXSKDcNmuK2x+FUtIKEOEYGM4UR0qwD8ydmyBRHOggPDg8CAc /3o3W56AZD65R8r3ARJUsM4J5gx7zziW/mLvz8JKEkhl+HyeR1rezSQb3BSFqIPOww qpjKFJwHiaoWJBD+Tq9PahUmRJR7K5vLSfNZF1rLPUF3n+nm+DdebWRUh9w8bm+j/X ORDxTJBw3Sk3Mhv6jl9sWSOX+Tb8BfFa9Mj3I1yQewX8wXCrN4IDNLpPDOIu/VnFFl wDysYmwuK0s0A== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v13 04/12] selftests: mptcp: sockopt: use size_t for byte counters Date: Sun, 26 Jul 2026 16:30:09 +0800 Message-ID: <89bb8d9e2665492d4c91dbe60fa554b7ace910cd.1785054129.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Rename ret/ret2/ret3 to ret (ssize_t, for syscall return values) and r/w (size_t, for byte counters) for better readability. The byte counters were previously stored in ssize_t but never hold negative values; size_t is the natural type and matches the parameter types of do_getsockopts(s, fd, size_t r, size_t w). This also prepares for future updates where r will be modified via '+=3D'. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 30 +++++++++++-------- 1 file changed, 17 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 a68fbe13b096..3a7fcef5aa54 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -650,9 +650,10 @@ static void check_stat_equal(const char *name, uint64_= t actual, =20 static void process_one_client(int fd, int pipefd) { - ssize_t ret, ret2, ret3; struct so_state s; char buf[4096]; + ssize_t ret; + size_t r, w; =20 memset(&s, 0, sizeof(s)); do_getsockopts(&s, fd, 0, 0); @@ -663,36 +664,39 @@ static void process_one_client(int fd, int pipefd) ret =3D read(fd, buf, sizeof(buf)); if (ret < 0) die_perror("read"); + r =3D ret; =20 - assert(s.mptcpi_rcv_delta <=3D (uint64_t)ret); + assert(s.mptcpi_rcv_delta <=3D (uint64_t)r); =20 if (s.tcpi_rcv_delta) - assert(s.tcpi_rcv_delta =3D=3D (uint64_t)ret); + assert(s.tcpi_rcv_delta =3D=3D (uint64_t)r); =20 - ret2 =3D write(fd, buf, ret); - if (ret2 < 0) + ret =3D write(fd, buf, r); + if (ret < 0) die_perror("write"); + w =3D ret; =20 /* wait for hangup */ - ret3 =3D read(fd, buf, 1); - if (ret3 !=3D 0) - xerror("expected EOF, got %lu", ret3); + ret =3D read(fd, buf, 1); + if (ret !=3D 0) + xerror("expected EOF, got %zd", ret); + r +=3D ret; =20 - do_getsockopts(&s, fd, ret, ret2); + do_getsockopts(&s, fd, r, w); check_stat_equal("mptcpi_rcv_delta", s.mptcpi_rcv_delta, - (uint64_t)ret + 1); /* +1 for FIN */ + (uint64_t)r + 1); /* +1 for FIN */ =20 /* be nice when running on top of older kernel */ if (s.pkt_stats_avail) { check_stat_equal("mptcpi_bytes_sent", s.last_sample.mptcpi_bytes_sent, - (uint64_t)ret2); + (uint64_t)w); check_stat_equal("mptcpi_bytes_received", s.last_sample.mptcpi_bytes_received, - (uint64_t)ret); + (uint64_t)r); check_stat_equal("mptcpi_bytes_acked", s.last_sample.mptcpi_bytes_acked, - (uint64_t)ret2); + (uint64_t)w); } =20 close(fd); --=20 2.53.0 From nobody Mon Aug 24 20:41:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BD9D2270552 for ; Sun, 26 Jul 2026 08:30:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054629; cv=none; b=BQ6vZufkJhX3ZAUUdrhyC73GqbTcc8TAvl3AWE8kgLzCMIN9PD3eOo5d6uxsPwWaa2srIN/NHLHTDzfUKHOBfL8+siqX8Mw7XPwRH2EMom07wxMuLUpXmB6hUsFfc7LkRU3SlSQEQE9FcjTyKv+ezVlkOTTTOEY+p4D2cvzwoT8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054629; c=relaxed/simple; bh=Ib7XYkm0dMxHmtl0Aq2mTT2Tov+g7aMvwaMvHDvCs0s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MwNcrWmF9QojuPs2xiD9Tzxs26tl87VlX0+aXJ4OLVWYdapckQV6bWogNicM2885b2rcWPTva2xOZZMKoRWbJAgllWY1en85Fm5y4pFLvOiiT/1vzJ3wLg8WsHaMgcd6aLCs1+aUOxocj1oYAoK5hNRwW52vAkmtAr72iv0xnAo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OoykBEYl; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="OoykBEYl" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DA3D91F00A3E; Sun, 26 Jul 2026 08:30:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785054628; bh=81a85aiMFWA+HNBMxInHMwDsZ0pEY8T2+dr0W0x5GUU=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=OoykBEYlymHJnR2O6HSBjBizbftZIJ6nU7iAwUej6/dzHTECTmfrtiub79zo7/pll YUeLVQGaCSS+wfuAGkWYIe6prWewB7DvSr6/xlNGSiy2AgecCczXqDof/ecz1OF1RG cYFm4OTWRrNTBm49EM3QKyRU1QYoiOeplrHE9bcBbxoA20wU8Zd0rm5m4qMK5wsKen KsrPRmjBIbxXXE29/lppNT1zBAPCY9cAF70tQZKguUIfu88zU7VgEloKN7GdTyaE8t dIfc6xH3Wsit38WK86WIds1c5E/S7frAvUTu5RH7yCGcayxtsDCudSQdlxRkbxsMYK ozayF2upFassA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v13 05/12] selftests: mptcp: sockopt: add is_mptcp_socket helper Date: Sun, 26 Jul 2026 16:30:10 +0800 Message-ID: <9eca715549e6b7622c02942055dfffde7a72b21c.1785054129.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Add a small is_mptcp_socket() helper that issues getsockopt(TCP_IS_MPTCP) and returns whether the fd belongs to an MPTCP socket. Use it to gate the MPTCP-specific assertions: skip do_getsockopts() entirely for plain TCP or fallback MPTCP sockets, and skip mptcpi_rcv_delta checks in connect_one_server()/process_one_client() when the socket is not an MPTCP socket. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 23 ++++++++++++++++--- 1 file changed, 20 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 3a7fcef5aa54..7e3a28863cbf 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -557,8 +557,23 @@ static void do_getsockopt_mptcp_full_info(struct so_st= ate *s, int fd) assert(!memcmp(&sfinfo->addrs, &s->addrs, sizeof(struct mptcp_subflow_add= rs))); } =20 +static int is_mptcp_socket(int fd) +{ + int is_mptcp =3D -1; + socklen_t optlen; + + optlen =3D sizeof(is_mptcp); + if (getsockopt(fd, IPPROTO_TCP, TCP_IS_MPTCP, &is_mptcp, &optlen) =3D=3D = -1) + die_perror("getsockopt TCP_IS_MPTCP"); + + return is_mptcp; +} + static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w) { + if (is_mptcp_socket(fd) <=3D 0) + return; + do_getsockopt_mptcp_info(s, fd, w); =20 do_getsockopt_tcp_info(s, fd, r, w); @@ -634,7 +649,8 @@ static void connect_one_server(int fd, int pipefd) if (eof) total +=3D 1; /* sequence advances due to FIN */ =20 - assert(s.mptcpi_rcv_delta =3D=3D (uint64_t)total); + if (is_mptcp_socket(fd) > 0) + assert(s.mptcpi_rcv_delta =3D=3D (uint64_t)total); close(fd); } =20 @@ -683,8 +699,9 @@ static void process_one_client(int fd, int pipefd) r +=3D ret; =20 do_getsockopts(&s, fd, r, w); - check_stat_equal("mptcpi_rcv_delta", s.mptcpi_rcv_delta, - (uint64_t)r + 1); /* +1 for FIN */ + if (is_mptcp_socket(fd) > 0) + check_stat_equal("mptcpi_rcv_delta", s.mptcpi_rcv_delta, + (uint64_t)r + 1); /* +1 for FIN */ =20 /* be nice when running on top of older kernel */ if (s.pkt_stats_avail) { --=20 2.53.0 From nobody Mon Aug 24 20:41:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 52B9837C113 for ; Sun, 26 Jul 2026 08:30:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054631; cv=none; b=NwVpdJpA9o7DjvgMdXndip7j4WX4BAKBQ72m2Iqdm+WGboIRxamB8GSlMhN6kZkMAd6xbUmfVSlV5QVekA1IdXemrG2mtW7nA7PtHihwehppaz0h4pEsCOO/JEwK8hOo1P38GlVaJ3MFFHj1DvoNUZaWC+Izu+GXof6ff1vCauY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054631; c=relaxed/simple; bh=83pMA5zjkkJ7Bs7XLKCMIRXrVFxjoOtRteUrl0XiKHc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uCmNAwxjB0+YeDDykiPFQP0afp7GeI5+86H53Zl7RPyr7SshHjAJfant4cRmZY/RspjT5/phC2wO8KoMWUEZbJZSM+ikVRz7uMihjcDundAFJx7WHZkWDpUcabvkzyFGxY3NMrX/7+4t6GH7KnnTpP99PgKrVtorQ1YKl0VF2RY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NNycA3k4; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NNycA3k4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 372551F00A3F; Sun, 26 Jul 2026 08:30:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785054630; bh=jmrnWgE3gy4eQy2LUg9edMt6GJy5lVShv9uI1PWG/Kc=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=NNycA3k4AKi8i7zeODSd9Ict+BrpejJqx0KWTDLTKNedgjI3CSWkGeLuX4C/VkwGs wy+NGIhOb/c65zxiJ9Sie8XLZtmxczveKLpq9h/lKL8EdBjt9TDQ81iVMIQiLW0Wk/ vC2nX28HPxAFDiyfP1GjckdNbdv4JlzobVTUOSmb/QTkDKGiIxXGAYxWK5a/ogkHAb 8Lju1Pd8Oy1kQxzlI81PAvb/Cpr4l2gbrdUml2bw8BFgGPb+uonIMPy5KakzAdsCha x9GOo1w5hkfP171NalPKNnZvEbsZBCwQNcgxcUduyArSUFowNxFhREMIDDC+u2xPXY wXUe4OIqTf+fA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v13 06/12] selftests: mptcp: sockopt: add tx/rx protocol options Date: Sun, 26 Jul 2026 16:30:11 +0800 Message-ID: <9262d0f2f2497eb6fbb1bb024eb2b1aed02359c8.1785054129.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Add -t and -r options to specify tx/rx protocols (TCP/MPTCP). This increases testing flexibility by allowing explicit protocol selection for both transmission and reception paths. These codes are from mptcp_inq.c. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 7e3a28863cbf..3dec34dbc062 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 @@ -139,6 +141,7 @@ static void __noreturn die_perror(const char *msg) static void die_usage(int r) { fprintf(stderr, "Usage: mptcp_sockopt [-6]\n"); + fprintf(stderr, " [-t tcp|mptcp] [-r tcp|mptcp]\n"); exit(r); } =20 @@ -204,7 +207,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 @@ -262,11 +265,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); @@ -274,6 +288,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; @@ -803,10 +823,10 @@ static int client(int pipefd) =20 switch (pf) { case AF_INET: - fd =3D sock_connect_mptcp("127.0.0.1", "15432", IPPROTO_MPTCP); + fd =3D sock_connect_mptcp("127.0.0.1", "15432", proto_tx); break; case AF_INET6: - fd =3D sock_connect_mptcp("::1", "15432", IPPROTO_MPTCP); + fd =3D sock_connect_mptcp("::1", "15432", proto_tx); break; default: xerror("Unknown pf %d\n", pf); --=20 2.53.0 From nobody Mon Aug 24 20:41:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C1CF33502A7 for ; Sun, 26 Jul 2026 08:30:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054632; cv=none; b=NK2Vz//WcN5LhemM8QypQvM0fnYTYYJTT4yNf7DdGUbjMmJey4Yp7FdaL1vvVGcHTC5XYxJ7tjLDQeIouTW93oFUaIo8PltnYw37sKOXtNobl9LrVleQttO1vrAkjQPLbiihdbZu6DNPuRcqnxM/6eIA5aKaIBxdbH7sep0cMJI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054632; c=relaxed/simple; bh=YDmgH4nNV+IIp6M3/K8Jvh6VKwmMidf0cyV+OjcQFI8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o35WSZym/ofAslw3VpH2rVfuq6Q9UFeKjRA6/0VAqMfYjAeVUOYSLNynReVDTSDr5PmBq65qQAXQ+7GnF3yq2eMKa5C9d9hM7hVsVahj8iotlXJXNoySMQ9B5iW44v43ziRjfjT5r1N9TZJ7XSk84Vdis3ZNw3K4HK1ecutSc30= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aP5RRoLR; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="aP5RRoLR" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A18511F00A3A; Sun, 26 Jul 2026 08:30:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785054631; bh=J6FALD64Of2O8m+uPDTLf9bMklKcSThCVpuePsnlPVM=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=aP5RRoLR4dyMLbrj4oa9hCnENoPA0EBm0kQUN6w3gHcP2iu/oEa1ktty+zJSMi1/t pcvtafUn3LwMMRaK6mAB+zG1lZZ920usYnQYaraZsJfk00nMMsk22bJYRHhfshHCUc emZwlHWKR4MNAcL29YnSVGbDZJbgL/z9P/WFu46qESeWdzT6CT/BdRpaMhSzBa7AhV Fr/MjB532ZkSkk3oofG09gtb3sv6V4tkqQzTCCCvORIKkmXdE+gVQ+vFgulB/6ccUO RzSJiCLz9SAsrC++KForpMc3TgXhLU3ilMOLglUksOuuvSycq7MqTX4MaW0VSzF5wH tqbywTmEgjvBw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v13 07/12] selftests: mptcp: sockopt: add TCP_INQ test option Date: Sun, 26 Jul 2026 16:30:12 +0800 Message-ID: <7ad66e3abec37d59b515704da25bf77964a80bd4.1785054129.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Add -i option to enable TCP_INQ testing. This prepares for consolidating TCP_INQ tests into a single binary by adding the necessary command-line interface. Add helper functions to conditionally set TCP_INQ sockopt on accepted sockets when running in inq mode. This ensures proper testing of TCP_CM_INQ functionality by enabling the required socket option on the incoming server connection. These codes are from mptcp_inq.c. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 3dec34dbc062..b1b39c9c3fae 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 @@ -142,6 +143,7 @@ static void die_usage(int r) { fprintf(stderr, "Usage: mptcp_sockopt [-6]\n"); fprintf(stderr, " [-t tcp|mptcp] [-r tcp|mptcp]\n"); + fprintf(stderr, " [-i]\n"); exit(r); } =20 @@ -280,7 +282,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); @@ -294,6 +296,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; @@ -739,6 +744,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); @@ -746,6 +759,9 @@ static int xaccept(int s) if (fd < 0) die_perror("accept"); =20 + if (inq) + do_setsockopt_inq(fd); + return fd; } =20 --=20 2.53.0 From nobody Mon Aug 24 20:41:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 05CDE379C40 for ; Sun, 26 Jul 2026 08:30:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054634; cv=none; b=tDzMiJ3oUyz7NMWJ4dzxtsQrxx9RsnEcEW5aKp7j1kj8nyYThCWMdnLZtjW2S7nYoIyueR6c+16vc7elLfLmaby610De78qs9GxsC1Drn+eiRcGFoUsca+XutCBJl0YpZ4CK+pGaWoAu+tUiQ7pZCMKKVCX2PWxWUgcZTpQj8UY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054634; c=relaxed/simple; bh=syTE8YiHPoq9pl4r+l8K1A6VcAirUVVeUrYbhuR4rGk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ECdYZgHOY5JTlajXpnRIBBLGCSnDOVQ38FoTGIErSUwGGyg2JtSmB/L/CQfjrIJMhfRl4GADDyEysVCkzobvoMx/uV9QqkDUTvamzNG99q/S+QNnJx8JAI/9ANGeQW1qNTpafKTaubiSAykmtwcXOa4rQ2WTsyCAx+xfVLMcS/E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hH6t69G6; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hH6t69G6" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F1E6D1F00A3E; Sun, 26 Jul 2026 08:30:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785054632; bh=AUGXXK5KzeBhvWH4m0Wu0RDS1VLzFCRWCFGjrqkk2bM=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=hH6t69G6R7GzFuCzotz+gfdiSkwkj87gVXrJjqAhGzfKAmA++/SVnDFDRqm1QniCj KekvMtUG6W6dUyGEGnZBDUw91U0qQ1ZFuyNd5Vge0jcwB2084ibMK5OX9xXFxvG5Kk f8eX8H4E4Kn53YIZB3eNu7t29b6MmPGYGoC3l4WjqDPOfJTFQVPiAp4xahF/Me0F45 iqqq71ipMlyQAwoYFYqueKDqQu5McxjxNNqghdgNsMdtG3K2qWecCuyPTvU6aLheaS TAfNxivxOKz+MNeDDHEjjrC40ZCPjLh5QENkW8/Urwr8n51oLejEJJGAnat5P3LmiF LtvFittQRu2pA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v13 08/12] selftests: mptcp: sockopt: use unix socket instead of pipe Date: Sun, 26 Jul 2026 16:30:13 +0800 Message-ID: <24d59971d01e59e6a73c83f48915c219f5ed8d72.1785054129.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Replace the pipe() with socketpair(AF_UNIX, SOCK_STREAM) for inter-process communication. This prepares for upcoming patches that will require bidirectional communication and reliable EOF behavior, which a pipe does not fully support. Use SOCK_STREAM over SOCK_DGRAM (used in the original mptcp_inq.c) to reliably detect peer closure via EOF, avoiding indefinite hangs. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index b1b39c9c3fae..53687d1464a3 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -609,7 +609,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; @@ -634,9 +634,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 @@ -689,7 +689,7 @@ static void check_stat_equal(const char *name, uint64_t= actual, name, actual, expected, (int64_t)(actual - expected)); } =20 -static void process_one_client(int fd, int pipefd) +static void process_one_client(int fd, int unixfd) { struct so_state s; char buf[4096]; @@ -699,7 +699,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)); @@ -765,7 +765,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 @@ -781,13 +781,13 @@ static int server(int pipefd) break; } =20 - r =3D write(pipefd, "conn", 4); + r =3D write(unixfd, "conn", 4); assert(r =3D=3D 4); =20 alarm(15); r =3D xaccept(fd); =20 - process_one_client(r, pipefd); + process_one_client(r, unixfd); =20 close(fd); return 0; @@ -831,7 +831,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 @@ -850,7 +850,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; } @@ -906,35 +906,35 @@ int main(int argc, char *argv[]) { int e1, e2, wstatus; pid_t s, c, ret; - int pipefds[2]; + int unixfds[2]; =20 parse_opts(argc, argv); =20 init_rng(); =20 - e1 =3D pipe(pipefds); + e1 =3D socketpair(AF_UNIX, SOCK_STREAM, 0, unixfds); if (e1 < 0) - die_perror("pipe"); + die_perror("socketpair"); =20 s =3D xfork(); if (s =3D=3D 0) { - close(pipefds[0]); - ret =3D server(pipefds[1]); - close(pipefds[1]); + close(unixfds[0]); + ret =3D server(unixfds[1]); + close(unixfds[1]); return ret; } =20 - close(pipefds[1]); + close(unixfds[1]); =20 /* wait until server bound a socket */ - e1 =3D read(pipefds[0], &e1, 4); + e1 =3D read(unixfds[0], &e1, 4); assert(e1 =3D=3D 4); =20 c =3D xfork(); if (c =3D=3D 0) - return client(pipefds[0]); + return client(unixfds[0]); =20 - close(pipefds[0]); + close(unixfds[0]); =20 ret =3D waitpid(s, &wstatus, 0); if (ret =3D=3D -1) --=20 2.53.0 From nobody Mon Aug 24 20:41:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 31ED33502A7 for ; Sun, 26 Jul 2026 08:30:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054635; cv=none; b=pMZJuMbypbwu38rlyZTwfrEGcMsw41rJI3uKPXJIGK6kVGmFnI9m3t6Cff3X+mfXoBP/DnNjSn2BYvVQjruiHDapTqx6KCBlvv4Zjg8e1gDzbaWBMzdiUhHYQDIASl+ZwxOqGMt1by8EnWMjWejDznvo/q/ArqMrYRRLUfi/SXA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054635; c=relaxed/simple; bh=kQRwKFplTo5Xgcoy6d0KIIsKqL5WlAnOqSQ1ZDbZCoM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CzvBwtMCF8TpBFqIGvq5LO1ctxOTmzJwEmHFRdBFLd2obZGhSpHLTt9Iu7wWB3xTMtJAbZlkxsp4EtW9DBDhEoqDyKrSOsPYnIBBUT/KqMAM6PARYaPNoBo/xFYmsCjs8QA3QZQI6tYRH7FvG+w4+0qhYGuXCm0YaaAW3/d8UEg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ikdKZPWt; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ikdKZPWt" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4E9791F00A3D; Sun, 26 Jul 2026 08:30:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785054634; bh=FGnm6t37HzJrJogPYbLA2eYt9k1gEoQl01X5E9AEHmw=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=ikdKZPWtBC6BeOUQuVOv6WnK7KitrPu2bgWEYpKkCSiiMN25QSMr6XaaE5A/Sj7mC I7/cNExU/jTseeDXql5BCVREjM/YyuPZ6wGeacpjrMtgdJ2AlWSxtl7vAc2id2g11L sUe6MJrQteuKd0EzTWgwgbM95/NEqvKDOhgx/MsDj86zng9+SnpSwCZsPdaws+czK6 GBlhKdvih/a8NM7F2BaltmhFi52LSx1OAytD1PXIqZa7gFaqS03Ile9S1tFLBIpjSr S4dtpoYU7jSxfuR8oDuKGs3r42EWPYlaJPV4Z0Ogc6ZUGYuvSH2ut0DRUQdTKj8eEG U5Obj1XHdZmeg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v13 09/12] selftests: mptcp: sockopt: use recvmsg instead of read Date: Sun, 26 Jul 2026 16:30:14 +0800 Message-ID: <5dd5af7642ada68509233f18d064468ce7807513.1785054129.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Replace read() with recvmsg() in process_one_client() to enable control message (CMSG) handling. The original read(fd, buf, sizeof(buf)) is split into two recvmsg() calls: the first reads exactly one byte, and the second reads the remaining bytes. This allows the code to access CMSG data for each received segment, facilitating the upcoming TCP_INQ validation. Introduce inq_msg_init() and inq_msg_reset() helpers to manage the struct inq_msg control buffer and iovec, enabling reuse of the same msghdr across multiple recvmsg() calls with different payload buffers. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 48 +++++++++++++++++-- 1 file changed, 43 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 53687d1464a3..f4c5c063469a 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -689,36 +689,74 @@ static void check_stat_equal(const char *name, uint64= _t actual, name, actual, expected, (int64_t)(actual - expected)); } =20 +struct inq_msg { + char buf[4096]; + union { + struct cmsghdr cmsg; + char msg_buf[4096]; + } control; + struct iovec iov; + struct msghdr hdr; +}; + +static void inq_msg_init(struct inq_msg *m, size_t iov_len) +{ + memset(m, 0, sizeof(*m)); + m->iov.iov_base =3D m->buf; + m->iov.iov_len =3D iov_len; + m->hdr.msg_iov =3D &m->iov; + m->hdr.msg_iovlen =3D 1; + m->hdr.msg_control =3D m->control.msg_buf; + m->hdr.msg_controllen =3D sizeof(m->control.msg_buf); +} + +static void inq_msg_reset(struct inq_msg *m, size_t iov_len, void *base) +{ + m->iov.iov_base =3D base; + m->iov.iov_len =3D iov_len; + m->hdr.msg_controllen =3D sizeof(m->control.msg_buf); +} + static void process_one_client(int fd, int unixfd) { struct so_state s; - char buf[4096]; + struct inq_msg m; ssize_t ret; size_t r, w; =20 + inq_msg_init(&m, 1); + memset(&s, 0, sizeof(s)); do_getsockopts(&s, fd, 0, 0); =20 ret =3D write(unixfd, "xmit", 4); assert(ret =3D=3D 4); =20 - ret =3D read(fd, buf, sizeof(buf)); + /* read one byte */ + ret =3D recvmsg(fd, &m.hdr, 0); if (ret < 0) - die_perror("read"); + die_perror("recvmsg"); r =3D ret; =20 + inq_msg_reset(&m, sizeof(m.buf) - 1, m.buf + 1); + ret =3D recvmsg(fd, &m.hdr, 0); + if (ret < 0) + die_perror("recvmsg"); + r +=3D ret; + assert(s.mptcpi_rcv_delta <=3D (uint64_t)r); =20 if (s.tcpi_rcv_delta) assert(s.tcpi_rcv_delta =3D=3D (uint64_t)r); =20 - ret =3D write(fd, buf, r); + ret =3D write(fd, m.buf, r); if (ret < 0) die_perror("write"); w =3D ret; =20 /* wait for hangup */ - ret =3D read(fd, buf, 1); + inq_msg_reset(&m, 1, m.buf); + ret =3D recvmsg(fd, &m.hdr, 0); if (ret !=3D 0) xerror("expected EOF, got %zd", ret); r +=3D ret; --=20 2.53.0 From nobody Mon Aug 24 20:41:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D9245379C40 for ; Sun, 26 Jul 2026 08:30:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054637; cv=none; b=McbUSl1ef4dN7ibOln6HANUJvooBwKDAMyTrzcLRp9M13doyaKV976gbE8X3HoeB9/q4T7tuRgrBmfQbB1QkPY1Ur27SDobmAm2zYwFbEYKv9DbkMRtn8wxCkY+HUaOSSsVxE3ye4z5DGFm/JEZWTHPaCZcCdtdI1HBDgQ8BZBc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054637; c=relaxed/simple; bh=51bRHJ5A1CWgZoS6m8QK5GOIZmiq4TVxXFk9a+Pn5QE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YzcnUm18jfiLfqBovUNtXEEG4JxeRrYLxD85uPCQV8OGeQ72RyK6BDvn0ujbi22QAuEJXfgtmXXSPUB0kugz+oh9GSmsHYiKGMcYe107bGIB14LVNqrpFndKzxf17nWXYL30J/9gyxdAhrQ3/UwPFelSTIRpLNODzvoJNzgpms4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UXY6ofPG; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UXY6ofPG" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9F8231F00A3E; Sun, 26 Jul 2026 08:30:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785054635; bh=Lfc1Dle7sXpSBmoxKuqrBvAbiUVX5SJcB370LIzuPwg=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=UXY6ofPG66o2uisUjwJJ5RckHs430TVAo77XC0icsqjp6H6ws6F/sO82o2rCvOSHW c8jexCBfftlwnEGAHK1EsaEaTQbdm7K7e14tqFJtZQeljylYbXz91DZt72cjOhm5cQ n7VTqVtTtsABMjbn4bFh5l3M9WA6EqwJFAlBE1FAP7t4qTHL1VRqVeOPEFds86LKNN 0lHqTAZswQa0+BZio21tn8ScP9YI0cLleh0rsbAJUS1SLKKnM1ZC07faObTD8TfA1W x+tYZT0oX5ehIwvs7KeqWaAGxnUEB9h0J/gklX0RRdFuQ98WZ7vxcZSgcyEhAcYNmm VIgYUvZmSzLmA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v13 10/12] selftests: mptcp: sockopt: get and verify TCP_INQ Date: Sun, 26 Jul 2026 16:30:15 +0800 Message-ID: <46cd973771858cc3232e37c208f70f7cf01df8ce.1785054129.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Implement FIONREAD ioctl checks to validate available data size, ensuring synchronization between write and read operations with non-blocking waits. Pass the payload length ('len') from the client to the server via the unixfd control channel. This allows the server to know the exact amount of data to expect, enabling precise FIONREAD loop and later TCP_CM_INQ validation. Add get_tcp_inq() helper to extract and verify TCP_CM_INQ values from received control messages. Integrate it into the echo test to validate in-queue byte counts at key stages, ensuring correct TCP_INQ behavior with MPTCP. Code adapted from mptcp_inq.c. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 72 ++++++++++++++++++- 1 file changed, 71 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 f4c5c063469a..9ae0f2c00810 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 @@ -636,10 +637,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"); @@ -677,6 +680,7 @@ static void connect_one_server(int fd, int unixfd) if (is_mptcp_socket(fd) > 0) assert(s.mptcpi_rcv_delta =3D=3D (uint64_t)total); close(fd); + close(unixfd); } =20 static void check_stat_equal(const char *name, uint64_t actual, @@ -717,9 +721,30 @@ static void inq_msg_reset(struct inq_msg *m, size_t io= v_len, void *base) m->hdr.msg_controllen =3D sizeof(m->control.msg_buf); } =20 +static void get_tcp_inq(struct msghdr *msgh, unsigned int *inqv) +{ + struct cmsghdr *cmsg; + + for (cmsg =3D CMSG_FIRSTHDR(msgh); cmsg; + cmsg =3D CMSG_NXTHDR(msgh, cmsg)) { + if (cmsg->cmsg_level =3D=3D IPPROTO_TCP && + cmsg->cmsg_type =3D=3D TCP_CM_INQ) { + if (cmsg->cmsg_len < CMSG_LEN(sizeof(*inqv))) + xerror("TCP_CM_INQ cmsg_len too small: %zu", + cmsg->cmsg_len); + 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; struct so_state s; + size_t expect_len; struct inq_msg m; ssize_t ret; size_t r, w; @@ -732,16 +757,57 @@ 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(m.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 */ ret =3D recvmsg(fd, &m.hdr, 0); if (ret < 0) die_perror("recvmsg"); + if (inq) { + if (m.hdr.msg_controllen =3D=3D 0) + xerror("msg_controllen is 0"); + + get_tcp_inq(&m.hdr, &tcp_inq); + + /* expect cmsg to return expected - 1 */ + assert((size_t)tcp_inq =3D=3D (expect_len - 1)); + } r =3D ret; =20 inq_msg_reset(&m, sizeof(m.buf) - 1, m.buf + 1); ret =3D recvmsg(fd, &m.hdr, 0); if (ret < 0) die_perror("recvmsg"); + if (inq) { + /* should have gotten exact remainder of all pending data */ + assert(ret =3D=3D (ssize_t)tcp_inq); + + /* should be 0, all drained */ + get_tcp_inq(&m.hdr, &tcp_inq); + assert(tcp_inq =3D=3D 0); + } r +=3D ret; =20 assert(s.mptcpi_rcv_delta <=3D (uint64_t)r); @@ -759,6 +825,10 @@ static void process_one_client(int fd, int unixfd) ret =3D recvmsg(fd, &m.hdr, 0); if (ret !=3D 0) xerror("expected EOF, got %zd", ret); + if (inq) { + get_tcp_inq(&m.hdr, &tcp_inq); + assert(tcp_inq =3D=3D 1); + } r +=3D ret; =20 do_getsockopts(&s, fd, r, w); --=20 2.53.0 From nobody Mon Aug 24 20:41:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5032D311969 for ; Sun, 26 Jul 2026 08:30:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054638; cv=none; b=NDbiMntrgFpiDPphNYP4YubquQ5sLKo/vCerxaRNzBwF3ELvqS7kmmTAKYHvnmyMA8+jtP0y8uVWbQI9ktrmpVdUfAuL58pa6aM6O7xVQfToyUHrJCgo8iaxGQ8mp11uL2J1e/xtImoF8D1WEUJwWMC1TQAMcfASPcEXQa+ibaY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054638; c=relaxed/simple; bh=t6T9oPAIkgchVXElsEw0U9NAaevr2G1geaCRxo2bs+o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nGROlYmqaM6K4WkNz+8d38IqdUqXoeB4HMgZssyTnjp/7Ss6LHAQjSy9CXD+UZTJ8OxyXBxtwrkutN7gvIEZO6V4HB7bAE/rmFI4/5/2jlV2CV4EhH6wZ5e9yo2Yorjfnv0JC+N0rHRE1vSqHcu1py7oFXYo7IKhVlDHpy8z8hg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PyriudoG; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PyriudoG" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2E4051F00A3D; Sun, 26 Jul 2026 08:30:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785054637; bh=Cr4cIfxwJbLryxoMM6/+svp8hS5Jzl2pkRTy7S9YUhI=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=PyriudoGyApUhV2lrgmM8WRlOQSalHh79p+V7IIR9A/akcaSzWRlOZnMiJWaeBT3P oeHruyoJLxoBIP749Ca1O/eTIN1I3UqDnTRDw20susNxci+aTqkmOrc+ZheSphtzmt vJ14AXQgOhfuv6PBCG+pcMh59NAhEWRAHeJleydJg5RuaD2Li+ws1jyMhAgGYOq9vV tK5Ayz0gGiB8oO1xBszU+ZM/ZGUPTyRSioZgCDE2go3Q8E1gmbgzXQRuLq7kmoPRSy jl5Bc6cEKsJ3iCbfEQX8o8tr5uwv4Uxd/ot8EzUvAPWAlAYEECEX9JayNwtOuY1IHt 9mgukErXuUIcA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v13 11/12] selftests: mptcp: sockopt: add huge data transfer tests Date: Sun, 26 Jul 2026 16:30:16 +0800 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Introduce huge data transfer tests (1-17 MB) to validate MPTCP socket options under high-volume conditions, including proper EOF handling, preparing for TCP_INQ support in subsequent patches. Add wait_for_ack() helper to synchronize test steps by waiting until the send queue is drained (all data ACKed). Used in server_huge_transfer() to ensure reliable TCP_INQ validation. These codes are from mptcp_inq.c, but here they have been placed into two separate functions. And in client_huge_transfer(), do a blocking read for EOF on unixfd instead of sleeping, and poll with POLLRDHUP to wait for FIN arrival before reading the final byte, preventing flaky EOF detection. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 9ae0f2c00810..bdece9cf5495 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -16,6 +16,7 @@ #include #include #include +#include =20 #include #include @@ -26,6 +27,7 @@ #include =20 #include +#include #include =20 static int pf =3D AF_INET; @@ -610,6 +612,95 @@ static void do_getsockopts(struct so_state *s, int fd,= size_t r, size_t w) do_getsockopt_mptcp_full_info(s, fd); } =20 +/* wait up to timeout milliseconds */ +static void wait_for_ack(int fd, int timeout, size_t total) +{ + int i; + + for (i =3D 0; i < timeout; i++) { + int nsd, ret, queued =3D -1; + struct timespec req; + + ret =3D ioctl(fd, TIOCOUTQ, &queued); + if (ret < 0) + die_perror("TIOCOUTQ"); + + ret =3D ioctl(fd, SIOCOUTQNSD, &nsd); + if (ret < 0) + die_perror("SIOCOUTQNSD"); + + if ((size_t)queued > total) + xerror("TIOCOUTQ %u, but only %zu expected\n", + queued, total); + assert(nsd <=3D queued); + + if (queued =3D=3D 0) + return; + + /* wait for peer to ack rx of all data */ + req.tv_sec =3D 0; + req.tv_nsec =3D 1 * 1000 * 1000ul; /* 1ms */ + nanosleep(&req, NULL); + } + + xerror("still tx data queued after %u ms\n", timeout); +} + +static void server_huge_transfer(int fd, int unixfd, size_t echo) +{ + char buf[4096], buf2[4]; + size_t len, i, total; + size_t sent; + ssize_t ret; + + for (i =3D 0; i < sizeof(buf) - 1; i++) { + buf[i] =3D rand() % 26; + buf[i] +=3D 'A'; + } + + buf[i] =3D '\n'; + + ret =3D read(unixfd, buf2, 4); + assert(ret =3D=3D 4); + assert(strncmp(buf2, "huge", 4) =3D=3D 0); + + total =3D rand() % (16 * 1024 * 1024); + total +=3D (1 * 1024 * 1024); + sent =3D total; + + ret =3D write(unixfd, &total, sizeof(total)); + assert(ret =3D=3D (ssize_t)sizeof(total)); + + wait_for_ack(fd, 5000, echo); + + 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); + ret =3D write(unixfd, "closed", 6); + assert(ret =3D=3D 6); +} + static void connect_one_server(int fd, int unixfd) { char buf[4096], buf2[4096]; @@ -679,6 +770,10 @@ static void connect_one_server(int fd, int unixfd) =20 if (is_mptcp_socket(fd) > 0) assert(s.mptcpi_rcv_delta =3D=3D (uint64_t)total); + + if (inq) + server_huge_transfer(fd, unixfd, total); + close(fd); close(unixfd); } @@ -740,6 +835,79 @@ static void get_tcp_inq(struct msghdr *msgh, unsigned = int *inqv) xerror("could not find TCP_CM_INQ cmsg type"); } =20 +static size_t client_huge_transfer(int fd, int unixfd) +{ + struct pollfd pfd =3D { .fd =3D fd, .events =3D POLLRDHUP }; + unsigned int tcp_inq; + size_t expect_len; + ssize_t ret, tot; + struct inq_msg m; + char tmp[16]; + + inq_msg_init(&m, 1); + + /* 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(m.buf)) + xerror("expect len %zu too small\n", expect_len); + + tot =3D 0; + do { + inq_msg_reset(&m, sizeof(m.buf), m.buf); + ret =3D recvmsg(fd, &m.hdr, 0); + if (ret < 0) + die_perror("recvmsg"); + if (ret =3D=3D 0) + xerror("unexpected EOF in huge recv"); + + tot +=3D ret; + + get_tcp_inq(&m.hdr, &tcp_inq); + + if (tcp_inq > expect_len - tot) + xerror("inq %d, remaining %zu total_len %d\n", + tcp_inq, expect_len - tot, (int)expect_len); + + assert(tcp_inq <=3D expect_len - tot); + } while ((size_t)tot < expect_len); + + ret =3D write(unixfd, "shut", 4); + assert(ret =3D=3D 4); + + /* wait for "closed"; server did final write on fd */ + ret =3D read(unixfd, tmp, sizeof(tmp)); + assert(ret =3D=3D 6); + assert(strncmp(tmp, "closed", 6) =3D=3D 0); + + /* block on EOF: server close(fd) precedes close(unixfd) */ + ret =3D read(unixfd, tmp, sizeof(tmp)); + assert(ret =3D=3D 0); + + /* Wait for the TCP FIN to actually arrive. */ + ret =3D poll(&pfd, 1, 5000); + assert(ret =3D=3D 1); + assert(pfd.revents & POLLRDHUP); + + inq_msg_reset(&m, 1, m.buf); + ret =3D recvmsg(fd, &m.hdr, 0); + if (ret < 0) + die_perror("recvmsg"); + assert(ret =3D=3D 1); + + get_tcp_inq(&m.hdr, &tcp_inq); + + /* tcp_inq should be 1 due to received fin. */ + assert(tcp_inq =3D=3D 1); + + return tot + 1; +} + static void process_one_client(int fd, int unixfd) { unsigned int tcp_inq; @@ -820,6 +988,9 @@ static void process_one_client(int fd, int unixfd) die_perror("write"); w =3D ret; =20 + if (inq) + r +=3D client_huge_transfer(fd, unixfd); + /* wait for hangup */ inq_msg_reset(&m, 1, m.buf); ret =3D recvmsg(fd, &m.hdr, 0); --=20 2.53.0 From nobody Mon Aug 24 20:41:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 994C737B02A for ; Sun, 26 Jul 2026 08:30:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054640; cv=none; b=j1JO00O8uu606hw9qPnvsWe3MgsTkX3kwMHxa+gfMt0pKhIGKkCXuoxXQx225OYEU/EIney+wSBkCFI++Y0PEc5zU5dJnVKTbFxo+5ja3oxTMbrMlm/av6G6gGrhvFGk1KXcuIEtvOIjlHQcnvbjt8ykEwMaeRb8pg0deAus0tw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785054640; c=relaxed/simple; bh=davJKfqwFimkolEUfNpeKWCrS9Rq7pqt3dECx1AXij0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iUYoPV+Ra16bswsCQKno7RwRxz+LUVtxh7eC/ax9Zdu5OO5IZZxaHOTyHlChPyip7m9vIg5mrzq8tMYPOFWNGQUJkHVdEhkpRm+SnGsn4LKsWPHKgX6GZprQsCVHNKatofq7xN8ieZ+dgaxsWr1gmphhylgpI2C/BgD1LpQVzP8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DtnGlkqa; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="DtnGlkqa" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7F0C91F00A3F; Sun, 26 Jul 2026 08:30:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785054638; bh=ldIVz/66ucoc/dYa9TXv1iVoC+LHiG88H8RV5q/XyRg=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=DtnGlkqa7NDlAnbylKwNBkqCjNTV7pagcy/WI0n8DLaCmxKfZcuCTJ80tkJhC4Vjz pIcgJZJ7FnzPDSpkXkvqtW1ZGOJ2UO+98JJSfDLQAhV9gT/QF5mE1PAQROjVnBzLn/ QsQ9P8ws5z0NQucgqd5OHbJSn6jaEpxVMWkAPA0VlXXnbrQ3nejLHa5mcJdOVXJGu1 hmC2PKyxZFl7B9SAc5eUUOCe7QSLo1Jya9cqPQMEEP95NNgJRrtgEU54DyhE89gA35 92RCTRRZo1eEe6ZDEwCNMQTVLhRLtGoYzk91FTk3UUueS4scD7Fgvd8J9+YZ1nVJvc 7Jw0zZFV16e1A== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v13 12/12] selftests: mptcp: sockopt: replace mptcp_inq with sockopt Date: Sun, 26 Jul 2026 16:30:17 +0800 Message-ID: <0d9e7f683031b6089a102b8fb37701a7356cf42d.1785054129.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Update mptcp_sockopt.sh to use mptcp_sockopt binary instead of mptcp_inq. This consolidates TCP_INQ testing into a single test binary while maintaining equivalent test coverage. Delete mptcp_inq binary and references since its functionality has been fully integrated into mptcp_sockopt. This simplifies the test suite structure and reduces maintenance overhead. Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/.gitignore | 1 - tools/testing/selftests/net/mptcp/Makefile | 1 - tools/testing/selftests/net/mptcp/mptcp_inq.c | 614 ------------------ .../selftests/net/mptcp/mptcp_sockopt.sh | 8 +- 4 files changed, 4 insertions(+), 620 deletions(-) delete mode 100644 tools/testing/selftests/net/mptcp/mptcp_inq.c diff --git a/tools/testing/selftests/net/mptcp/.gitignore b/tools/testing/s= elftests/net/mptcp/.gitignore index 833279fb34e2..c62e91ce385d 100644 --- a/tools/testing/selftests/net/mptcp/.gitignore +++ b/tools/testing/selftests/net/mptcp/.gitignore @@ -1,7 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-only mptcp_connect mptcp_diag -mptcp_inq mptcp_sockopt pm_nl_ctl *.pcap diff --git a/tools/testing/selftests/net/mptcp/Makefile b/tools/testing/sel= ftests/net/mptcp/Makefile index 22ba0da2adb8..fa80e6448728 100644 --- a/tools/testing/selftests/net/mptcp/Makefile +++ b/tools/testing/selftests/net/mptcp/Makefile @@ -22,7 +22,6 @@ TEST_PROGS :=3D \ TEST_GEN_FILES :=3D \ mptcp_connect \ mptcp_diag \ - mptcp_inq \ mptcp_sockopt \ pm_nl_ctl \ # end of TEST_GEN_FILES diff --git a/tools/testing/selftests/net/mptcp/mptcp_inq.c b/tools/testing/= selftests/net/mptcp/mptcp_inq.c deleted file mode 100644 index 5716998da192..000000000000 --- a/tools/testing/selftests/net/mptcp/mptcp_inq.c +++ /dev/null @@ -1,614 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#ifndef IPPROTO_MPTCP -#define IPPROTO_MPTCP 262 -#endif -#ifndef SOL_MPTCP -#define SOL_MPTCP 284 -#endif - -static int pf =3D AF_INET; -static int proto_tx =3D IPPROTO_MPTCP; -static int proto_rx =3D IPPROTO_MPTCP; - -static void __noreturn die_perror(const char *msg) -{ - perror(msg); - exit(1); -} - -static void die_usage(int r) -{ - fprintf(stderr, "Usage: mptcp_inq [-6] [ -t tcp|mptcp ] [ -r tcp|mptcp]\n= "); - exit(r); -} - -static void __noreturn xerror(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - fputc('\n', stderr); - exit(1); -} - -static const char *getxinfo_strerr(int err) -{ - if (err =3D=3D EAI_SYSTEM) - return strerror(errno); - - return gai_strerror(err); -} - -static void xgetaddrinfo(const char *node, const char *service, - struct addrinfo *hints, - struct addrinfo **res) -{ - int err; - -again: - err =3D getaddrinfo(node, service, hints, res); - if (err) { - const char *errstr; - - if (err =3D=3D EAI_SOCKTYPE) { - hints->ai_protocol =3D IPPROTO_TCP; - goto again; - } - - errstr =3D getxinfo_strerr(err); - - fprintf(stderr, "Fatal: getaddrinfo(%s:%s): %s\n", - node ? node : "", service ? service : "", errstr); - exit(1); - } -} - -static int sock_listen_mptcp(const char * const listenaddr, - const char * const port) -{ - int sock =3D -1; - struct addrinfo hints =3D { - .ai_protocol =3D IPPROTO_MPTCP, - .ai_socktype =3D SOCK_STREAM, - .ai_flags =3D AI_PASSIVE | AI_NUMERICHOST - }; - - hints.ai_family =3D pf; - - struct addrinfo *a, *addr; - int one =3D 1; - - xgetaddrinfo(listenaddr, port, &hints, &addr); - hints.ai_family =3D pf; - - for (a =3D addr; a; a =3D a->ai_next) { - sock =3D socket(a->ai_family, a->ai_socktype, proto_rx); - if (sock < 0) - continue; - - if (-1 =3D=3D setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, - sizeof(one))) - perror("setsockopt"); - - if (bind(sock, a->ai_addr, a->ai_addrlen) =3D=3D 0) - break; /* success */ - - perror("bind"); - close(sock); - sock =3D -1; - } - - freeaddrinfo(addr); - - if (sock < 0) - xerror("could not create listen socket"); - - if (listen(sock, 20)) - die_perror("listen"); - - return sock; -} - -static int sock_connect_mptcp(const char * const remoteaddr, - const char * const port, int proto) -{ - struct addrinfo hints =3D { - .ai_protocol =3D IPPROTO_MPTCP, - .ai_socktype =3D SOCK_STREAM, - }; - struct addrinfo *a, *addr; - int sock =3D -1; - - hints.ai_family =3D pf; - - xgetaddrinfo(remoteaddr, port, &hints, &addr); - for (a =3D addr; a; a =3D a->ai_next) { - sock =3D socket(a->ai_family, a->ai_socktype, proto); - if (sock < 0) - continue; - - if (connect(sock, a->ai_addr, a->ai_addrlen) =3D=3D 0) - break; /* success */ - - die_perror("connect"); - } - - if (sock < 0) - xerror("could not create connect socket"); - - freeaddrinfo(addr); - return sock; -} - -static int protostr_to_num(const char *s) -{ - if (strcasecmp(s, "tcp") =3D=3D 0) - return IPPROTO_TCP; - if (strcasecmp(s, "mptcp") =3D=3D 0) - return IPPROTO_MPTCP; - - die_usage(1); - return 0; -} - -static void parse_opts(int argc, char **argv) -{ - int c; - - while ((c =3D getopt(argc, argv, "h6t:r:")) !=3D -1) { - switch (c) { - case 'h': - die_usage(0); - break; - case '6': - pf =3D AF_INET6; - break; - case 't': - proto_tx =3D protostr_to_num(optarg); - break; - case 'r': - proto_rx =3D protostr_to_num(optarg); - break; - default: - die_usage(1); - break; - } - } -} - -/* wait up to timeout milliseconds */ -static void wait_for_ack(int fd, int timeout, size_t total) -{ - int i; - - for (i =3D 0; i < timeout; i++) { - int nsd, ret, queued =3D -1; - struct timespec req; - - ret =3D ioctl(fd, TIOCOUTQ, &queued); - if (ret < 0) - die_perror("TIOCOUTQ"); - - ret =3D ioctl(fd, SIOCOUTQNSD, &nsd); - if (ret < 0) - die_perror("SIOCOUTQNSD"); - - if ((size_t)queued > total) - xerror("TIOCOUTQ %u, but only %zu expected\n", queued, total); - assert(nsd <=3D queued); - - if (queued =3D=3D 0) - return; - - /* wait for peer to ack rx of all data */ - req.tv_sec =3D 0; - req.tv_nsec =3D 1 * 1000 * 1000ul; /* 1ms */ - nanosleep(&req, NULL); - } - - xerror("still tx data queued after %u ms\n", timeout); -} - -static void connect_one_server(int fd, int unixfd) -{ - size_t len, i, total, sent; - char buf[4096], buf2[4096]; - ssize_t ret; - - len =3D rand() % (sizeof(buf) - 1); - - if (len < 128) - len =3D 128; - - for (i =3D 0; i < len ; i++) { - buf[i] =3D rand() % 26; - buf[i] +=3D 'A'; - } - - buf[i] =3D '\n'; - - /* un-block server */ - ret =3D read(unixfd, buf2, 4); - assert(ret =3D=3D 4); - - assert(strncmp(buf2, "xmit", 4) =3D=3D 0); - - ret =3D write(unixfd, &len, sizeof(len)); - assert(ret =3D=3D (ssize_t)sizeof(len)); - - ret =3D write(fd, buf, len); - if (ret < 0) - die_perror("write"); - - if (ret !=3D (ssize_t)len) - xerror("short write"); - - ret =3D read(unixfd, buf2, 4); - assert(strncmp(buf2, "huge", 4) =3D=3D 0); - - total =3D rand() % (16 * 1024 * 1024); - total +=3D (1 * 1024 * 1024); - sent =3D total; - - ret =3D write(unixfd, &total, sizeof(total)); - assert(ret =3D=3D (ssize_t)sizeof(total)); - - wait_for_ack(fd, 5000, len); - - while (total > 0) { - if (total > sizeof(buf)) - len =3D sizeof(buf); - else - len =3D total; - - ret =3D write(fd, buf, len); - if (ret < 0) - die_perror("write"); - total -=3D ret; - - /* we don't have to care about buf content, only - * number of total bytes sent - */ - } - - ret =3D read(unixfd, buf2, 4); - assert(ret =3D=3D 4); - assert(strncmp(buf2, "shut", 4) =3D=3D 0); - - wait_for_ack(fd, 5000, sent); - - ret =3D write(fd, buf, 1); - assert(ret =3D=3D 1); - close(fd); - ret =3D write(unixfd, "closed", 6); - assert(ret =3D=3D 6); - - close(unixfd); -} - -static void get_tcp_inq(struct msghdr *msgh, unsigned int *inqv) -{ - struct cmsghdr *cmsg; - - for (cmsg =3D CMSG_FIRSTHDR(msgh); cmsg ; cmsg =3D CMSG_NXTHDR(msgh, cmsg= )) { - if (cmsg->cmsg_level =3D=3D IPPROTO_TCP && cmsg->cmsg_type =3D=3D TCP_CM= _INQ) { - memcpy(inqv, CMSG_DATA(cmsg), sizeof(*inqv)); - return; - } - } - - xerror("could not find TCP_CM_INQ cmsg type"); -} - -static void process_one_client(int fd, int unixfd) -{ - unsigned int tcp_inq; - size_t expect_len; - char msg_buf[4096]; - char buf[4096]; - char tmp[16]; - struct iovec iov =3D { - .iov_base =3D buf, - .iov_len =3D 1, - }; - struct msghdr msg =3D { - .msg_iov =3D &iov, - .msg_iovlen =3D 1, - .msg_control =3D msg_buf, - .msg_controllen =3D sizeof(msg_buf), - }; - ssize_t ret, tot; - - ret =3D write(unixfd, "xmit", 4); - assert(ret =3D=3D 4); - - ret =3D read(unixfd, &expect_len, sizeof(expect_len)); - assert(ret =3D=3D (ssize_t)sizeof(expect_len)); - - if (expect_len > sizeof(buf)) - xerror("expect len %zu exceeds buffer size", expect_len); - - for (;;) { - struct timespec req; - unsigned int queued; - - ret =3D ioctl(fd, FIONREAD, &queued); - if (ret < 0) - die_perror("FIONREAD"); - if (queued > expect_len) - xerror("FIONREAD returned %u, but only %zu expected\n", - queued, expect_len); - if (queued =3D=3D expect_len) - break; - - req.tv_sec =3D 0; - req.tv_nsec =3D 1000 * 1000ul; - nanosleep(&req, NULL); - } - - /* read one byte, expect cmsg to return expected - 1 */ - ret =3D recvmsg(fd, &msg, 0); - if (ret < 0) - die_perror("recvmsg"); - - if (msg.msg_controllen =3D=3D 0) - xerror("msg_controllen is 0"); - - get_tcp_inq(&msg, &tcp_inq); - - assert((size_t)tcp_inq =3D=3D (expect_len - 1)); - - iov.iov_len =3D sizeof(buf); - ret =3D recvmsg(fd, &msg, 0); - if (ret < 0) - die_perror("recvmsg"); - - /* should have gotten exact remainder of all pending data */ - assert(ret =3D=3D (ssize_t)tcp_inq); - - /* should be 0, all drained */ - get_tcp_inq(&msg, &tcp_inq); - assert(tcp_inq =3D=3D 0); - - /* request a large swath of data. */ - ret =3D write(unixfd, "huge", 4); - assert(ret =3D=3D 4); - - ret =3D read(unixfd, &expect_len, sizeof(expect_len)); - assert(ret =3D=3D (ssize_t)sizeof(expect_len)); - - /* peer should send us a few mb of data */ - if (expect_len <=3D sizeof(buf)) - xerror("expect len %zu too small\n", expect_len); - - tot =3D 0; - do { - iov.iov_len =3D sizeof(buf); - ret =3D recvmsg(fd, &msg, 0); - if (ret < 0) - die_perror("recvmsg"); - - tot +=3D ret; - - get_tcp_inq(&msg, &tcp_inq); - - if (tcp_inq > expect_len - tot) - xerror("inq %d, remaining %d total_len %d\n", - tcp_inq, expect_len - tot, (int)expect_len); - - assert(tcp_inq <=3D expect_len - tot); - } while ((size_t)tot < expect_len); - - ret =3D write(unixfd, "shut", 4); - assert(ret =3D=3D 4); - - /* wait for hangup. Should have received one more byte of data. */ - ret =3D read(unixfd, tmp, sizeof(tmp)); - assert(ret =3D=3D 6); - assert(strncmp(tmp, "closed", 6) =3D=3D 0); - - sleep(1); - - iov.iov_len =3D 1; - ret =3D recvmsg(fd, &msg, 0); - if (ret < 0) - die_perror("recvmsg"); - assert(ret =3D=3D 1); - - get_tcp_inq(&msg, &tcp_inq); - - /* tcp_inq should be 1 due to received fin. */ - assert(tcp_inq =3D=3D 1); - - iov.iov_len =3D 1; - ret =3D recvmsg(fd, &msg, 0); - if (ret < 0) - die_perror("recvmsg"); - - /* expect EOF */ - assert(ret =3D=3D 0); - get_tcp_inq(&msg, &tcp_inq); - assert(tcp_inq =3D=3D 1); - - close(fd); -} - -static int xaccept(int s) -{ - int fd =3D accept(s, NULL, 0); - - if (fd < 0) - die_perror("accept"); - - return fd; -} - -static int server(int unixfd) -{ - int fd =3D -1, r, on =3D 1; - - switch (pf) { - case AF_INET: - fd =3D sock_listen_mptcp("127.0.0.1", "15432"); - break; - case AF_INET6: - fd =3D sock_listen_mptcp("::1", "15432"); - break; - default: - xerror("Unknown pf %d\n", pf); - break; - } - - r =3D write(unixfd, "conn", 4); - assert(r =3D=3D 4); - - alarm(15); - r =3D xaccept(fd); - - if (-1 =3D=3D setsockopt(r, IPPROTO_TCP, TCP_INQ, &on, sizeof(on))) - die_perror("setsockopt"); - - process_one_client(r, unixfd); - - close(fd); - return 0; -} - -static int client(int unixfd) -{ - int fd =3D -1; - - alarm(15); - - switch (pf) { - case AF_INET: - fd =3D sock_connect_mptcp("127.0.0.1", "15432", proto_tx); - break; - case AF_INET6: - fd =3D sock_connect_mptcp("::1", "15432", proto_tx); - break; - default: - xerror("Unknown pf %d\n", pf); - } - - connect_one_server(fd, unixfd); - - return 0; -} - -static void init_rng(void) -{ - unsigned int foo; - - if (getrandom(&foo, sizeof(foo), 0) =3D=3D -1) { - perror("getrandom"); - exit(1); - } - - srand(foo); -} - -static pid_t xfork(void) -{ - pid_t p =3D fork(); - - if (p < 0) - die_perror("fork"); - else if (p =3D=3D 0) - init_rng(); - - return p; -} - -static int rcheck(int wstatus, const char *what) -{ - if (WIFEXITED(wstatus)) { - if (WEXITSTATUS(wstatus) =3D=3D 0) - return 0; - fprintf(stderr, "%s exited, status=3D%d\n", what, WEXITSTATUS(wstatus)); - return WEXITSTATUS(wstatus); - } else if (WIFSIGNALED(wstatus)) { - xerror("%s killed by signal %d\n", what, WTERMSIG(wstatus)); - } else if (WIFSTOPPED(wstatus)) { - xerror("%s stopped by signal %d\n", what, WSTOPSIG(wstatus)); - } - - return 111; -} - -int main(int argc, char *argv[]) -{ - int e1, e2, wstatus; - pid_t s, c, ret; - int unixfds[2]; - - parse_opts(argc, argv); - - e1 =3D socketpair(AF_UNIX, SOCK_DGRAM, 0, unixfds); - if (e1 < 0) - die_perror("pipe"); - - s =3D xfork(); - if (s =3D=3D 0) { - close(unixfds[0]); - ret =3D server(unixfds[1]); - close(unixfds[1]); - return ret; - } - - close(unixfds[1]); - - /* wait until server bound a socket */ - e1 =3D read(unixfds[0], &e1, 4); - assert(e1 =3D=3D 4); - - c =3D xfork(); - if (c =3D=3D 0) - return client(unixfds[0]); - - close(unixfds[0]); - - ret =3D waitpid(s, &wstatus, 0); - if (ret =3D=3D -1) - die_perror("waitpid"); - e1 =3D rcheck(wstatus, "server"); - ret =3D waitpid(c, &wstatus, 0); - if (ret =3D=3D -1) - die_perror("waitpid"); - e2 =3D rcheck(wstatus, "client"); - - return e1 ? e1 : e2; -} diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/tes= ting/selftests/net/mptcp/mptcp_sockopt.sh index e850a87429b6..a39265555438 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh @@ -308,7 +308,7 @@ run_tests() do_tcpinq_test() { print_title "TCP_INQ cmsg/ioctl $*" - ip netns exec "$ns_sbox" ./mptcp_inq "$@" + ip netns exec "$ns_sbox" ./mptcp_sockopt "$@" local lret=3D$? if [ $lret -ne 0 ];then ret=3D$lret @@ -334,19 +334,19 @@ do_tcpinq_tests() =20 local args for args in "-t tcp" "-r tcp"; do - do_tcpinq_test $args + do_tcpinq_test $args -i lret=3D$? if [ $lret -ne 0 ] ; then return $lret fi - do_tcpinq_test -6 $args + do_tcpinq_test -6 $args -i lret=3D$? if [ $lret -ne 0 ] ; then return $lret fi done =20 - do_tcpinq_test -r tcp -t tcp + do_tcpinq_test -r tcp -t tcp -i =20 return $? } --=20 2.53.0