From nobody Sat Jul 25 07:27:11 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 233DB30C161 for ; Tue, 14 Jul 2026 02:09:08 +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=1783994950; cv=none; b=GZHMImFrDNNDGGMPOt6KoTf4GDrA28NK/DbZvGjIYyLA6m9ZaSpJrPjbWEgkamLW6/LQPf0EYOaD0qNOdCNmXaXifC55EYLvY8tXv/6ahYzYg4oII53sFGvIGBKtkzZY4UfWFifHUdo6LE+A69Xv2XC3bwAS7+hc+Fs0MUAoEhc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783994950; c=relaxed/simple; bh=E4+8BQijWHmG1OGtCBIKn3pK+83OfxnFId+oAwj5cYo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=udE9ke2ig7SNr4ItPMgKRWUfolXiKPQ9U38jPu3KlsaM5kRrxTylD0hNSavhK1RargCIXe0ct90YX4lyAbSWV50MwXb7t2vNQtclZVvPsvvsQe9TzDjrFSzxeV7Z+6FMuozA4IPEkVOz4upQCxnoqwQ0oHgzSexgq0CAzBSpxbI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Nm5Woq5f; 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="Nm5Woq5f" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8E0EA1F00A3A; Tue, 14 Jul 2026 02:09:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783994948; bh=1zWGNbmkdou13OHw9YPYspst/mpgnuk5b3F86NnzW4o=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Nm5Woq5fXbWwj9UW0Qyg+DeqkbkbjasQaUzAs8qxjm0pOoLfwZQuYHjCtf3w+D3Cg WcoHGZu+I4es0ETuQq0rMigBmjswEija79XVXdfbxTsMHOWKBhUfozacKq7VAs/co5 IYgLBgXc/7W9DkJeyWSuQPumA1DYHraYpRm5ScXLgSvSomP091UE3M2fqCXTL0yo1r C1oWQXwTyzHQYboYlfI0PhvJGSNZ7TPnf4xmTqFQY75ChzkY6ZxIuf5V5ivprlaR+F I8eodvUW568BHIgU2tbtPEgXu25I1QGlUA0KHgP5F0U4MwRy2vup0Hc3TF2H80NXU9 NK1+wBVziyDGw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-net v10 01/13] selftests: mptcp: sockopt: pass cumulative totals to do_getsockopts Date: Tue, 14 Jul 2026 10:08:46 +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 connect_one_server() passes per-chunk ret to do_getsockopts() instead of cumulative total and original len, causing mismatches when the echo is fragmented. Fix by passing (total, len) to match the semantics used in process_one_client(). Fixes: ce9979129a0b ("selftests: mptcp: add mptcp getsockopt test cases") Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index b6e58d936ebe..56f2109699aa 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -627,7 +627,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, len); =20 if (eof) total +=3D 1; /* sequence advances due to FIN */ --=20 2.53.0 From nobody Sat Jul 25 07:27:11 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 054C4371878 for ; Tue, 14 Jul 2026 02:09:10 +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=1783994952; cv=none; b=X/I5R+50h8rqMYzd8xP+JZGVkRBLw4x9tRw24QMrMTz/UUKhb368mToMstVINt9ZXYfA5H+KSca/1zaJOK98NSjvnliHTO8AjlFYTsvEskG3W+hQpE3niLBdCKJXGPTAdQT4poWJFL+sx6bBrlR0gcy8BbuOOQ5UkYNmPnIuZZ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783994952; c=relaxed/simple; bh=su3byV5CQRgP/hVAJAxGXtFNOhd7bwk3bqqSMy8GUak=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r2cZ8nlI8rUsaejvpoVZTeTGMKesYjG+X6r42E4mK3Rpf1kEJObgLEIfP7/7vPjCTADQqddPML9Q10y78vZblVDnL8cutys353SrO3yrfpqWPbzhAEWOxvKyzfzTM5GmISsKrhlqtuNEFar/hRpmXaDyJgwz43cla0X2LHMNwdk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Nc+g1i6V; 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="Nc+g1i6V" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6782C1F000E9; Tue, 14 Jul 2026 02:09:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783994950; bh=FQ+liz7xroJkaMduO7Qio+7oB+puSGrcDRagRxjeiwg=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Nc+g1i6VsuwlBBrfug9au/KVlbMqcXx2wth+9QcwI9kJ6CPDuGZRoXrFDxaUbsPhg ZW3wYAJhBaE59PGqdRw0Tda13ljnaU/zg2J0JIek9WYIaRw8b7aX2zUnwrXUm2IMW/ LMhbP5KHoyGuhElFMVURiReuPchhOea+BhDhMAlBeGPN+JaJu/mm/eoXqwmX5UB8XO i3BpkC6vyURJ1Oei/3xRkn9boXi8okScu8zkPilVkhdFb8GuFQToYQpCqAN+q1rl5V NiiK68LI2Q8iWGOuYqygROxre/BpBJ7gT+QE2ZBbq1aigafENQ95lBmBHl4qx6Xzyb 1xgOn9F4EZ1hA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-net v10 02/13] selftests: mptcp: sockopt: validate bytes_acked against sent bytes Date: Tue, 14 Jul 2026 10:08:47 +0800 Message-ID: <12f1842569af336508444be4d03160a7a0af1399.1783994494.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 mptcpi_bytes_acked tracks the number of bytes sent and acknowledged, so it should be compared with the amount of data written (ret2), not the amount read (ret). This corrects a logical error in the test validation. Fixes: b86418beade1 ("selftests: mptcp: sockopt: fix error messages") Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 6 +++--- 1 file changed, 3 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 56f2109699aa..2eef0912a932 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -683,11 +683,11 @@ static void process_one_client(int fd, int pipefd) ", 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) + if (s.last_sample.mptcpi_bytes_acked !=3D ret2) xerror("mptcpi_bytes_acked %" PRIu64 ", expect %" PRIu64 ", diff %" PRId64, - s.last_sample.mptcpi_bytes_acked, ret, - s.last_sample.mptcpi_bytes_acked - ret); + s.last_sample.mptcpi_bytes_acked, ret2, + s.last_sample.mptcpi_bytes_acked - ret2); } =20 close(fd); --=20 2.53.0 From nobody Sat Jul 25 07:27:11 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 47A1D3769FF for ; Tue, 14 Jul 2026 02:09:12 +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=1783994953; cv=none; b=gfuT3FAANEFejaSTrqH8PxopuIKLyaglHYpNSHBQMmWvzTaVatJPAtcWwl4TWbBHMH1EvqvyfYVHG715ZcvWbBzqtaKKIoH4Hu9zynjS60V+PF90lJHNBxHSV+eTg3jjDLLicJoOXOc1BDj25BDCKqwbZURiX1opfSAb+C+M7Nc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783994953; c=relaxed/simple; bh=fsFaZPrrPHTuw5B3uuawDsmw7lXY5K/Sn7eiktwRw4o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rLpHdlEXIX10PcemEqpFHyhrCSwugcCi0rLidHt5j020QXBJxfZEUmmzL/viQPtTScUXXdQhyRjgFil49CIZeyLNbs9d1bPkHdTEFWHwVDCQneg2dCU2gc4KY0lA22tZoMbQGt/bDm0QP+YsHa1zThQVkFIYT7TMdGS/F3chUoA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=or/FpUxv; 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="or/FpUxv" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3518E1F00A3F; Tue, 14 Jul 2026 02:09:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783994952; bh=cFs79TsycrRyEfcpbNzzI1ybuRr0BLKdkbm1J59x4+c=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=or/FpUxvS0cXBEuDnzQ8kZMQegNDIJ+EaBI4LZYueU/9uEbQTlZOxpYMMgcfByTa4 thDpXIHNjxC0joRMNHmQvsp1dssq2iQLwLBaJhfZo2sbpCtTWTn0pOzZWf+WQPOD8B XGr927ASk+9uuC7oaBlEOExFsEuRU0qEQQsaRUm2WFFekUMe4jxATpPiPb2Zb6VKkE V2lTYL/keCaAHhrUVNQJ+8ST1nATzMcNZucs/opQIAWp2xn8AO4GwBycDGyj1/ZDsh ghBSPzdOljNsGIOXmn5oAMD62jZiRDKrcWzdzufg3rqDygzjweSmwhic/mYXqLp2R4 iMjba50qSxwFw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v10 03/13] selftests: mptcp: sockopt: use size_t for byte counters Date: Tue, 14 Jul 2026 10:08:48 +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 Rename ret/ret2/ret3 to ret (ssize_t, syscall return), r and w (size_t, byte counters) for readability. This prepares for future updates where r will be modified via '+=3D'. The byte counters were ssize_t but only ever hold non-negative byte counts; size_t is the natural type for them and better matches do_getsockopts(s, fd, size_t r, size_t w). A practical reason to make the change: r and w are passed to xerror() variadic calls with PRIu64 format specifiers. On 32-bit targets ssize_t is 4 bytes while PRIu64 reads 8 bytes via varargs default argument promotion, corrupting subsequent variadic arguments. size_t is 64-bit on 64-bit platforms and at minimum 32-bit elsewhere; on the common 64-bit case the variadic layout is now correct, and the type documents intent. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 44 ++++++++++--------- 1 file changed, 24 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 2eef0912a932..55929f0e851f 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -638,9 +638,10 @@ static void connect_one_server(int fd, int pipefd) =20 static void process_one_client(int fd, int pipefd) { - ssize_t ret, ret2, ret3; struct so_state s; char buf[4096]; + size_t r, w; + ssize_t ret; =20 memset(&s, 0, sizeof(s)); do_getsockopts(&s, fd, 0, 0); @@ -651,43 +652,46 @@ 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 %lu", ret); + r +=3D ret; =20 - do_getsockopts(&s, fd, ret, ret2); - if (s.mptcpi_rcv_delta !=3D (uint64_t)ret + 1) + do_getsockopts(&s, fd, r, w); + if (s.mptcpi_rcv_delta !=3D (uint64_t)r + 1) /* +1 for FIN */ xerror("mptcpi_rcv_delta %" PRIu64 ", expect %" PRIu64 ", diff %" PRId64, - s.mptcpi_rcv_delta, ret + 1, s.mptcpi_rcv_delta - (ret + 1)); + s.mptcpi_rcv_delta, r + 1, s.mptcpi_rcv_delta - (r + 1)); =20 /* be nice when running on top of older kernel */ if (s.pkt_stats_avail) { - if (s.last_sample.mptcpi_bytes_sent !=3D ret2) + if (s.last_sample.mptcpi_bytes_sent !=3D w) 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) + s.last_sample.mptcpi_bytes_sent, w, + s.last_sample.mptcpi_bytes_sent - w); + if (s.last_sample.mptcpi_bytes_received !=3D r) 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 ret2) + s.last_sample.mptcpi_bytes_received, r, + s.last_sample.mptcpi_bytes_received - r); + if (s.last_sample.mptcpi_bytes_acked !=3D w) xerror("mptcpi_bytes_acked %" PRIu64 ", expect %" PRIu64 ", diff %" PRId64, - s.last_sample.mptcpi_bytes_acked, ret2, - s.last_sample.mptcpi_bytes_acked - ret2); + s.last_sample.mptcpi_bytes_acked, w, + s.last_sample.mptcpi_bytes_acked - w); } =20 close(fd); --=20 2.53.0 From nobody Sat Jul 25 07:27:11 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 769E337A839 for ; Tue, 14 Jul 2026 02:09:13 +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=1783994955; cv=none; b=UmbbiGbce2SKo5tlUDtGxZbGvf20ufgg7ntkIpdcoCoVDrnnxUEO8AKSWPovu3jpZL2EUloq515wwnL40RaPbmizE1VgJO0g1fBbnw/tu6yBIoS4ah7xrTecHULaaask2DXD/mmI8YWmPUBdXtidb8amzcATylqSMHhkFRVQN9g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783994955; c=relaxed/simple; bh=sNwiXpzxO4tz8+YS0XmMEXMwc5igr61AHew42KffMS4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kUB1Sckhczb60Of0HgS/+Lg3n5M8UIj3vZRdQUKVCBPNHRGGpEOm1YSlys5rOHJtrhxGB928toQNHZuManyEcsPS3qtRmIrd6l22Y29E5eIUbUqyYfJAcT0BoxOSa7WwLYWj6KWSA9cyWiFCteG4kNBiA3/9UgZvgr5dtypE7tA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CUWIc0VQ; 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="CUWIc0VQ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 78D6D1F000E9; Tue, 14 Jul 2026 02:09:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783994953; bh=HySpgrAg9VZ/4tSSuxcra0GXJl+hi07cC82ft/zMjP4=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=CUWIc0VQ5LKGzmB7zaUb87JrBjQQnmWVJSHkUE7E9WRU5mkaYTOdN3ZAJNV6L0e3b 0iq7fvkj1sqTrpQR6IYBYdGCv+V0MK2BF+aK9DLB5Tym3IGT5Ly+aTqYL1O+Uwx6P6 GDTi2tJgsGxGmubAAuXIrz/ho1MBO70vITQ8qzsVwv5rSX5p3mO4Miib97LY47PjE5 YkBE1M80MiVN/YHaCJogFjo5UH9Hw16FeVBcj+krErMKX39AlVNI/7WDKHuAgAB/Dq tGfKIirdWwWafYKwPWChk8LhWa8SO4jedrgRmN6UCDkYANGQ/iRnATs053vFdJt4rg 59VdG/Stfu+bg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v10 04/13] selftests: mptcp: sockopt: replace /dev/urandom with getrandom Date: Tue, 14 Jul 2026 10:08:49 +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 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 55929f0e851f..7c44ea9f5f8c 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 @@ -825,21 +826,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.53.0 From nobody Sat Jul 25 07:27:11 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 006693769FF for ; Tue, 14 Jul 2026 02:09:15 +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=1783994956; cv=none; b=izVh1CoWrqMhW4hI4M7O9k0o+l+u2MFCdPNqagyn73ka3HrSPuji5R+Nj6AxjMQXRP4MO8Zb+EBCX0VWEdrb+JVwz0XT4bD9Q5NC8a5glOR9vRr3vZ+Vr27bt1sSwxmbI2tFD8FPooTvmS30NzICcdqkixEjekKcVUm+XnTRBxo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783994956; c=relaxed/simple; bh=nY0nhfemzgBAfUBDzhNYkIYvReaOY7admvguETm0/S0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QwZC39aAvseI4gvQ7CCa1RLL53/6gjBz0pwQvqhgPwpFTQBNhWD0TJVnlX9kzAbOM+v90EqlDUMS8153pVRG9aNLG9V8XBUV+5pE7uHx+Q2huDDNlh2p0un7uJN72sVzyCwgjXAS3/kePkaMjRux4GDHkn+wRFJGUAAAgFiun7o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aWcs6NUH; 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="aWcs6NUH" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C286B1F00A3D; Tue, 14 Jul 2026 02:09:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783994954; bh=l2Us0jicaa2oFREbC9oh7qDh1V7BTGodvFmSVkyxxVo=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=aWcs6NUHtA1J15q2wLE7EdbA6jt5Obk3iY1ttpuJ6KiFjFzqBQqrANPrnuWcowcqw NqV+dVrtBDGE9pNLx+iuUXc3uVNiWdZhQ1tC2yTCcZGZ4dI3eeEpllRZ8yzOx+Y1F1 wzNuKwWmhV+e8p/Msw1TupRMtaF3fJdSHPKiT0isDhvTImM35Ao0BrfT2VAIDmakKy PZ5qEr9PJf5dDNDBfv9ZqfIA+eMl7EL/oLfRCrOnTOuHMUgCHEdJ2KLnPi7QmqwYC7 5ILfkHQ4XB4XKtr9t2eG+rpy3FvYx+lDlE8HEa7rXr62rsBjMoEJVC45v0YqjvIrmY ZihFTmH7ZMlyw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v10 05/13] selftests: mptcp: sockopt: reseed RNG after fork Date: Tue, 14 Jul 2026 10:08:50 +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. These codes are from mptcp_inq.c. Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 7c44ea9f5f8c..241b9b82dabb 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -129,6 +129,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); @@ -804,6 +806,8 @@ static pid_t xfork(void) =20 if (p < 0) die_perror("fork"); + else if (p =3D=3D 0) + init_rng(); =20 return p; } --=20 2.53.0 From nobody Sat Jul 25 07:27:11 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 B9D863769FF for ; Tue, 14 Jul 2026 02:09:16 +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=1783994957; cv=none; b=e1J2wJcIYu02/2SDkmpS7OwirqgWZ+9MrKTKW0ejnehHjnM3DRv4B9MXXCNSERoQIVFsoeI3QmmKGp6FExslAcY7IlfEAfkZM6N5bMdRrShyHVII/bydH8jJXVI9469IY+b3cHJDmOAHHo1WcNiaBAF80DDOQmIcqtS+WGHeehU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783994957; c=relaxed/simple; bh=ETXdNcOWNP5Fcu4336E1Pu5BQy0Pl4QqjsU3LTx1Am8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ScNYMrqyHEQmVoSqP+A7NT/aZ2NtWVjqw3+BeanWr03y6QMelVrhbedZRkv+SXMyv8+J67HIPOjvkQYW9L5vDkFnY/vDDXVMbqPIWTm+E35XjjyitGm+WpF1/Yhfjl6g4/s5/qzG6jRLJc0KBlZk2n4TBxBbzFBRIrzqVc3wIX4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JUAmYv+2; 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="JUAmYv+2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8AE661F00A3A; Tue, 14 Jul 2026 02:09:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783994956; bh=b8c5orose6hBjS/GxfYHra0ebROh2MLiBZpyEMVxyco=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=JUAmYv+24y+XB5Ol+ilK0GyTPK023wS/4I4+/mhYzxs75RyXG1AL5qTrRRgnIMAqP 7ZyO+MUaGLaN0mWuf1LkT7zbhT9gMydlzIg8fBvsLv8edkSJx2mePcZb24jahX1Saa 7D/tJSkje12ur+qFSMbjhr20zDZs7Zjip3UWqbMWPjtwxVRVnOPxVcq3/gKKZEQPDL V49gWsniag12YsVhj+S5GsDthg8fa/AkN7EsU26xhEq7LPd6kM30RMQOTKz5R/bCXX XACtLnklgvaf2zSwqQ/j6nXSL8rDHh51RX/TWEdvOVUYGIeR/YdmnLg038z9ut28B4 fMtxfNNL5QCCQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v10 06/13] selftests: mptcp: sockopt: add tx/rx protocol options Date: Tue, 14 Jul 2026 10:08:51 +0800 Message-ID: <59fb47e21dbb31e03c1e83f2648ad7e64dd904af.1783994494.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. Enhance compatibility with TCP tests by skipping MPTCP getsockopt checks during TCP tests since MPTCP socket options are not available. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 241b9b82dabb..eddb1f7b3cec 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -29,6 +29,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 @@ -140,6 +142,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 @@ -205,7 +208,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 @@ -263,11 +266,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); @@ -275,6 +289,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; @@ -560,6 +580,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); @@ -635,7 +658,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 (proto_tx =3D=3D IPPROTO_MPTCP && proto_rx =3D=3D IPPROTO_MPTCP) + assert(s.mptcpi_rcv_delta =3D=3D (uint64_t)total); close(fd); } =20 @@ -674,7 +698,8 @@ static void process_one_client(int fd, int pipefd) r +=3D ret; =20 do_getsockopts(&s, fd, r, w); - if (s.mptcpi_rcv_delta !=3D (uint64_t)r + 1) /* +1 for FIN */ + if (proto_tx =3D=3D IPPROTO_MPTCP && proto_rx =3D=3D IPPROTO_MPTCP && + s.mptcpi_rcv_delta !=3D (uint64_t)r + 1) /* +1 for FIN */ xerror("mptcpi_rcv_delta %" PRIu64 ", expect %" PRIu64 ", diff %" PRId64, s.mptcpi_rcv_delta, r + 1, s.mptcpi_rcv_delta - (r + 1)); =20 @@ -784,10 +809,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 Sat Jul 25 07:27:11 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 55E103655C0 for ; Tue, 14 Jul 2026 02:09:18 +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=1783994959; cv=none; b=LFqDwS0QXFA/EMsnvXzUrNUcCsrAUoN9ks6o+B8GXIO84BP1+jxzxt2ztRIf3IVy40ujc4H1Lf4tjCe7ZmrMLIMjoAIQ53PC5Ph3xkKR5GPcCHMXKxcHDdEJFNapQXNRTXXCWyWkMQZhuGDy4edNfh3DAJh+MxGH4jDdB/ZeI94= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783994959; c=relaxed/simple; bh=gMbI6emK/l1rQ+1tDK4HdyiP2mG/7I0uaQmnMrIGlgQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=l14hf3eagowJQoZbZdV77qLuYggfJ2f4qB6738is6VwAob6prxJ80vcjswXIT1i2e4PxVepGQa6JTm2mkcM7QsRZNgyMJLPouHZSRhzfwipSvKj+gYILwYo97Y7ctPOXbgBewyg/JI1hiGF332slFxQ64MDDvcQeQt813hjlq1E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=c3wMokpC; 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="c3wMokpC" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 32B661F00A3F; Tue, 14 Jul 2026 02:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783994958; bh=6ugR++eJrUaKBma0SmHuiOejOQJtd65R7CO3HKAdxas=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=c3wMokpCIUmhXoO7WoPFULQOOayWoGBAIpkMC6evFBNoxlQVo/X5cSsZzoomF3/WE Ypstgl+SKHLRAGInvoNzyXxhAOsuFL5KqMB9Yi53iiUMhHXR4Vp3ncl4LQcdPTpPOk LMJInoBBhqxRNahUQwRxeZawhvxJ1XjZLMkQ8wYfrx6H3HSY8nSdeJXBVJfUEGfLIj 44Z3wai1YzrzIiUVpoeNCguqrOAhJcpCnJfF4iczvQ4jeltyUfR0xpbY2N748sEHv/ Bnwb8oOOTWAJ62GEOxJ6bg/iGojJFkDr5gk4kcW5iZiYNrLKELK9fBKXCyxfzUEKqY 5fV/fbHN6HlyA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v10 07/13] selftests: mptcp: sockopt: add TCP_INQ test option Date: Tue, 14 Jul 2026 10:08:52 +0800 Message-ID: <7d15a7a9c4fc0fffee077e5477c228ac76d05582.1783994494.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 eddb1f7b3cec..0a80d505dc4c 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -31,6 +31,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 @@ -143,6 +144,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 @@ -281,7 +283,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); @@ -295,6 +297,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; @@ -725,6 +730,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); @@ -732,6 +745,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 Sat Jul 25 07:27:11 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 151233655C0 for ; Tue, 14 Jul 2026 02:09:19 +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=1783994961; cv=none; b=OQqChzyT8aGBzdrYlFgv+PBDxc6fE2gvU4m8WfdMGHc6FXx1XVXditXdrfK7gNdBUQkjW7NnmdoM5zja+bE61yom+vJeFepfeu7rZwPytQXcDcMEddFAXkSVzM6ipApJX+1gvwWxdALk+quPfYxTEL1F9piG6R7H7PrDszSYMpE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783994961; c=relaxed/simple; bh=PQG2+RYvEuYVEusU5ghWIhKMd3gObQT59O+pC0+kiQs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nP2hlRKLzywj2DadriRr+vcMoYJoIp4PmApx8VhLE3CPOSwxpLzKDpwAEPM+7kWJZ2gU2iWszPJSrMlGXaRPoK831xwsRHDPuun/sLKE8t1/FroU1bB1neFMfmAI0tuux+b64UNiVDLtDFnG7Avq2ndro25eefG0ipICi+wvZAE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hl0C7yzR; 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="hl0C7yzR" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8974E1F000E9; Tue, 14 Jul 2026 02:09:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783994959; bh=xENSgfz4sXSBBuvgWRNv/zBxxsghBkRIwFcg3dj/ahY=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=hl0C7yzRoaDpgBOAnFxaBAhDlndyL5WaQEDn8unvEm8Id8xIimpabIMNgyTXuMtNs zTp5MB/gG1yJ5w46/WEfqy2sJrPQH0F5UxbXy3WuswZAn5BxK6QjjOEj7fouvzQWUd o8woGyBKJL5abTGWAYpFTQnxk77e7I5UFp/jrSmmUOBCqU7OXZK62wMDndmgcMEceZ AZ4+FiMxLgAiArDb10ciMulgaXBMvsbAXfxZo7S5hQhTGYD9ZexceR8jnA/4ayeIwq 7cu9a3xSjHtWfpHXUZSi9o84i5HOtiZoSw3SZGGHCpSafpq6Z/alxWlsx4hV3esYa8 EeGnla08HkksA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v10 08/13] selftests: mptcp: sockopt: use unix socket instead of pipe Date: Tue, 14 Jul 2026 10:08:53 +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 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 0a80d505dc4c..e4fc9f12f164 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -598,7 +598,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; @@ -623,9 +623,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 @@ -668,7 +668,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) { struct so_state s; char buf[4096]; @@ -678,7 +678,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)); @@ -751,7 +751,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 @@ -767,13 +767,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; @@ -817,7 +817,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 @@ -836,7 +836,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; } @@ -885,35 +885,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 Sat Jul 25 07:27:11 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 CD09327FD51 for ; Tue, 14 Jul 2026 02:09:21 +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=1783994962; cv=none; b=TxZkI3NEvjTw0VMZrkYbrS3i8BM3RU9qbisIC3I3zTAy8slyrMWlDHrWZpMMcP3gMuVkuBN0ww29wHJmraMpEwSTiM0E/HuoqokMfpqb8j80HiFOjsoZyKt+9zhXZTHf4GXKFyZHRCVMt3m4LXzq5jchzd2L5FJFVeWMCcuyFw8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783994962; c=relaxed/simple; bh=1lToBpP4v6Pt+zkWkiaD8y3VY/ItDN2sjMSY7TyyC1E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=q0LWLLl1UiLDmtUCwFTSbnddHD+Pe5yv7aCrpEzcyET0BVCb5b0jxMQ0Y2iguGe6mvcGcBZbQ8vz3k6ARwSOyZ2nGBmG4V5YwomFygjcl6F4DNgY3CcdW2wOJ5PL0mxqgYMiMPvYLBjzIw0yrhL0JdghnBdI7a9saPBWF/UXQGI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bExDVOMN; 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="bExDVOMN" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5DB8F1F00A3A; Tue, 14 Jul 2026 02:09:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783994961; bh=YN8mkl9xwkJthpi3jXgkzEDo9ltUOsgPjbcsf0TA8PY=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=bExDVOMN7jbciZsIwtuw6CpvHEsBgnNf3VyYiz+30P1RqXoZ7ax+rLjadYYDKjHKj VHGqB0zFhdBEW99HMPobYRM1QFtXFEwJhPWrthOL8JQjrxNsmFIQOnR22ET426FDjM lhiTiPbAVn26PcM42EAoVNMrFi4ObTjHhCFnPPBHDQwJZXTbEiq4+88gTXxd02DdI7 Tjbwbqqy7uaHDh+y4lQquasPDftS+9A4OVPzMcyLPOz0zgs0tmo9znbn2w9nyVsvcv J4xFj3o7WMg4hmESeFDE+l+84ZC4OU4zsFxLZ6zpbYHaGwO2m2wUmaDGmeunYM1rqj iWRIhxBUC5RDg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v10 09/13] selftests: mptcp: sockopt: use recvmsg instead of read Date: Tue, 14 Jul 2026 10:08:54 +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 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 e4fc9f12f164..cc1d45e85fb2 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -668,36 +668,74 @@ static void connect_one_server(int fd, int unixfd) close(fd); } =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; size_t r, w; ssize_t ret; =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 %lu", ret); r +=3D ret; --=20 2.53.0 From nobody Sat Jul 25 07:27:11 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 8993327FD51 for ; Tue, 14 Jul 2026 02:09: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=1783994964; cv=none; b=nMgI3yytIqkXV49hkvoiRf+OHZKe7IeXXVTwXXoMe+omCqci7jn9PkW7Z0ykE4sGoQpFtGU9Aj2sKoTxVGHDydcVDZacGr3bGZxgoAgrD4xPH5iNThl+q89BV73mIbF/SaVgWM3yGgBjqbqmuzUVb8XYTsmflQ7/cUIMUumog0I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783994964; c=relaxed/simple; bh=xY3Jrz7DHqrlZTDts8LE0cTJU986/V5IDCKLgpBUcGI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XFrFSqU9a42Sf16Thxb0dABqjMW3DDeqI7RW1dDlpN0Hqulz2Umf+MvIRIsbQma8NTtkpqHN/HOdINyHzZpF9y4WNZyT6BPW0IJxs9lqiD8OFZHKXtkFtpOnvF35T3qGcFxO8rvFdxTCtLk336705xtSzz9fuB6cJ4xBip8WgYY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=L7d4EGqE; 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="L7d4EGqE" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 377ED1F000E9; Tue, 14 Jul 2026 02:09:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783994963; bh=rprTC4QLGXt3kdKTKNzxsjt5ZuKLPqQSPHB0wRXoAVk=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=L7d4EGqEo50r9qTFeqNH62ZsCr5HL9JnzLKHV7qU2ReipMWfu10xnJE31ElPDqqmm D7iaMFy854SAnose58q4JLNHGlomH5hkUtH3v7+Yq5iESEoQEjcmuAocsfBoi6eoYu USVd2dX0w4qRhYJB5/ogLhLaQz72uSjThc6uBr++ZCNYtTk+8fugBoSLG1E6WLpQFt aqwlVazawxCSlU53AJ6hDnoF/LLupdWZvlBHjvz3UA79i0/PqL7gkwYaJAGmh6mnLv gVDKTQXUpHfD5d5hEG+alj5Al+HdYIwIKXfM6Gk46YIaLYM68yltpr93l41wDsHKJ1 i/OVXo5WrTJvA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v10 10/13] selftests: mptcp: sockopt: read exact payload length Date: Tue, 14 Jul 2026 10:08:55 +0800 Message-ID: <027f4ac4507fa246c0f2b38f30f794fae2acb992.1783994494.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 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. Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index cc1d45e85fb2..ba13898d8cf6 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -638,7 +638,7 @@ static void connect_one_server(int fd, int unixfd) =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) { --=20 2.53.0 From nobody Sat Jul 25 07:27:11 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 EF73327FD51 for ; Tue, 14 Jul 2026 02:09: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=1783994966; cv=none; b=UMTeRfEmZ7wEtt5Zs9I52OvhAgtWQBB2uyea3naEg78HXlPCB6VwRaqqQ5i7HBCa3PxShySuJ/Sd9gA5Bi6Orx7Ce4H1wXzLjlu8Pex9iBc2cIogGkjy8QBO8Nd6PpHHrDlWrXNdmcniHkZ3HjidiiZt10LQTL3MoAjVt4+PDbY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783994966; c=relaxed/simple; bh=mgO5i9Z87gQFlsOrujmO14VEZvriCvaUfyLAMOnsVzE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hZfU+DE6JlE45a5LJEesrC7MzVV5/yIZSfdv2MUeS5IQRGVlT9LSp/PZdy5PJsx2w6pL9kr8CnfQ7UtyUiRwNWG1fM+zL13i0uUx5zEArG+ipfKcnUTzyfiG0SU9n1gOKrgRCwwf7A5ZkI5wT1erw0ZbOTvXxBsjfi2l27zHwcc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DOrneimW; 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="DOrneimW" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BA2B71F00A3A; Tue, 14 Jul 2026 02:09:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783994964; bh=2oantI8CTqd4fbvosDWSs7isIUNXbvNzCbGK4W2TX8c=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=DOrneimWbmC1tzOfaqfcT4+RKM2GE75HOa+7x4H55KBEeE4e8nqJqt8s10jF1Cil5 aAOCQhm/gozgt2dnD5IHWQrKh2YrjGoUNLVpWwXWf9m0g2oODe6a5TUadXClzcX9sm mq+yy3PY+VMTHbU013m3O74bbaWH4IuSAtdN9m0f2E20TfE59AaokxhNkF2kLeGb1N FHmnAv0ElnPCr3VA4FmYUzZrDo8SUm1IA/2BoUnSquahCuCUIV/eLm4p06NsJ0+cmy zKkwS6gkoF/6yLKCt2yfYEFXcyzkpCahX0/ojxECGsx+6+bHRSpZ+8Q5ztzIheToeK 5/8t5Kjstk/+w== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v10 11/13] selftests: mptcp: sockopt: get and verify TCP_INQ Date: Tue, 14 Jul 2026 10:08:56 +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 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 ba13898d8cf6..303a90d43123 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -21,6 +21,7 @@ #include #include #include +#include =20 #include #include @@ -625,10 +626,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"); @@ -666,6 +669,7 @@ static void connect_one_server(int fd, int unixfd) if (proto_tx =3D=3D IPPROTO_MPTCP && proto_rx =3D=3D IPPROTO_MPTCP) assert(s.mptcpi_rcv_delta =3D=3D (uint64_t)total); close(fd); + close(unixfd); } =20 struct inq_msg { @@ -696,9 +700,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: %u", + 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; size_t r, w; ssize_t ret; @@ -711,16 +736,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); @@ -738,6 +804,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 %lu", 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 Sat Jul 25 07:27:11 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 8E56F3655C0 for ; Tue, 14 Jul 2026 02:09: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=1783994967; cv=none; b=L/qEmiR1kpD3zeSliC/PU7lLgzCaWU480I1nLkdXaknPOaldJ2eMaPN4qebsEg+3rW4+yyCqlLbPz5BdLK6gE7MjcUcjLha06dPu1Fmt40c1OS4mxZoaVosrPKUMkROepLSmiE9xbK3H0wnAxZxIwX69GlJf4kMxpQpanS8Fe18= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783994967; c=relaxed/simple; bh=HCwWB4fv3q1zuy/9VhRfqfaaMPOsS9O4HbgW/8VoiUI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=S96cUHh1HnzBmYObpyOETP27qPtZqmdIFQ3fx9jLiwaJQqMCZvjkqFUGx9OaUvYL5NlMcwYhPGbp9OLebEa8MJCyD32DbW+vDtkUzj1SvbRyFqU+YhPUtORDoVA3v2NuBqUrJ2EnO43pLwvsIe63MRx/gnvZJ9/Fct0mtqkIwko= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JixwTNkz; 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="JixwTNkz" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7A7861F000E9; Tue, 14 Jul 2026 02:09:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783994966; bh=ePrRCsUUh3lbdbwOdgFVKR9weCBbfqmv7aJWhgCOjGU=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=JixwTNkzqigwrb4Vbt7vwSywYKuCru0WZhX6pBCWAjKJtnEuMvDA1oMnf4Kb+IwV/ HvJvR4G08wrtqHaJQGJT9KXIP/ehtYZc4GN5yFAaxNPyfAvrM6HM/WzAABk+F+rysf ZgYOFIWPRgY6ahoupFyNub343eSYpTUv9G2E/EVMlHIUsJRNi+uROPq98X/LArEVVi yjRfBmgmeIeQwiYt1E9fmjMBq8WcopKHIsuPxnhqYplkoxn5Qo2xX2AHJQTMVho79C xMMR1OCCbrbefnV+RGSmGUMr9CuwXIPPyAwf+pa+QcMZVXjzYG2R7uNkRGFVxlypQW 1buPtox/N8lkg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v10 12/13] selftests: mptcp: sockopt: add huge data transfer tests Date: Tue, 14 Jul 2026 10:08:57 +0800 Message-ID: <28627b960a2ad83329fc4e4b73bbde8636fe6952.1783994494.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 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. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 164 ++++++++++++++++++ 1 file changed, 164 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 303a90d43123..c2a50a19a770 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -27,6 +27,7 @@ #include =20 #include +#include #include =20 static int pf =3D AF_INET; @@ -599,6 +600,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 len) +{ + char buf[4096], buf2[4]; + size_t 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, 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); + 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]; @@ -668,6 +758,10 @@ static void connect_one_server(int fd, int unixfd) =20 if (proto_tx =3D=3D IPPROTO_MPTCP && proto_rx =3D=3D IPPROTO_MPTCP) assert(s.mptcpi_rcv_delta =3D=3D (uint64_t)total); + + if (inq) + server_huge_transfer(fd, unixfd, len); + close(fd); close(unixfd); } @@ -719,6 +813,73 @@ 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) +{ + 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); + + 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; @@ -799,6 +960,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 Sat Jul 25 07:27:11 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 653EF30C161 for ; Tue, 14 Jul 2026 02:09: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=1783994970; cv=none; b=FBeR5btxY/MlwKcwo+0NaRPj+gkMhuoZu5AWmm4gLN0t9mIRu3gp46vQI9DrHPC5SlrJBd88ICHjxkqIcCHtVjWXgF8l/7mxxgyTDbJfIvkmewhHTo/Dfa2/X0CRBSY05foDZ+q0GWq99fXJCjDrVU124byalKUY+IUBe0PQDuY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783994970; c=relaxed/simple; bh=2bwW6ciRIH3COpsPHrszcvWHu356hB6/G9ZwJy+7FNo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LULIosiSHLSRNSK/+qivxzYv/IWfM3tEWsOy2RwmcdWBWewW1RrpOC1PEKY4uBxWBFY0dZVeoOR6GNZYj+Z3wmlG9EfpqErtvjx3os5oqc/qMOzldC+MV3M/j2nv5PBRvg3sl6yNBEUg7UuZ9PD3MyzKjy/bEPVHZFdWX240n7I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kw8+evS/; 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="kw8+evS/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 174051F00A3A; Tue, 14 Jul 2026 02:09:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783994968; bh=WsSuguUvTthLy/VyB8nBwxFIykuODS47uLsaIaG/41w=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=kw8+evS/q/16I8CsSNSKEP5PEH76AUcGOPov3MQp8blUjd8Es3XNHnhp5ptMGeCab ExKqn1ZoQ+iiFXyr7NFPbWoSa3DIGgkFeWOraQPT77CDq6ipteRatxDQuvnW/jbULA 19HjlxqKLwpjoJhWy4EeOlUVCJs4wkOz/F7b1Ou2/qzwox01DisKQkwkKOzHukltV8 JBfPQcgEq6a+fLe/7V2Oo3CGO7cfb2Lt6oKJH8+EEKozN+eGU4X2JPqV0sOydRGNJf CFb52koMbssalxuLIlrX+y4JSaTWNQtRaqAgLN+CsCtBHqTGhHZsH72KHYSE51fq0S kFEVNki8f+GDQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v10 13/13] selftests: mptcp: sockopt: replace mptcp_inq with sockopt Date: Tue, 14 Jul 2026 10:08:58 +0800 Message-ID: <8c6e499ef56bc8f447535b7b74006d069c0dad0d.1783994494.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 9e47ecfe58e2..d5fab4d26de7 100644 --- a/tools/testing/selftests/net/mptcp/Makefile +++ b/tools/testing/selftests/net/mptcp/Makefile @@ -23,7 +23,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