From nobody Sat Jul 11 14:00:17 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 9FE7D255F2C for ; Sat, 11 Jul 2026 03:44: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=1783741471; cv=none; b=KbSEg5ES4wUyRbMBihmGEaXxpOso0OK8ZFDgDg97RbHi02iutUjLkHJQ1zdWPp+KRK6EZzVHCguUcYwHYZyatEEmgqt+2cfBzFa91+cv6Gv6YNNO9CdrPC7UyfFLAnjkqvtnDbfq+T7BLjpouupt4z3XKEQV57mSM7W3zi2A4cs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783741471; c=relaxed/simple; bh=8cTcpANFISVzd/UkTlSvjt6Sffb3tRIft7Hf/f0QSgU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mDNrRaSEEsM6kHGgPjhwzjzFEA9Ysxi7RxKbSNGIgeqNn9rBrtqUvkIKaF2OESsLUDN93+KPPn4KyB3bZTORRI9je12gwE1btY+WdmMMrUU6T72OTep1BzVBjUVSUR0LT/sz0wcoQkHRkKEaILOtetcV2nwwbYEBi91d3zgdPcI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=L6CVxEEu; 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="L6CVxEEu" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7C9331F00A3A; Sat, 11 Jul 2026 03:44:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783741470; bh=V2En2bUH7kGZxRN5hLT4yY6yPs5AIwn4jjpk0vIxQeU=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=L6CVxEEu2kZ2T7cxUd33YNlNErqm8e8MOWDnJVRoYE0PzYg1v9CmRVs95EC08pnuz UlLN1DLl/1cOzn6YMlHjNoqHxZI0bFLyhR21AyFFieecREJ5UP6J6OZ5colKSHXxEE GqLyM9uKSqh8TjRl/uZrIVswXvxOtLhsV6L/AmAoOKbGhqbps1ISwPaqrYJ7IUuMs+ xn1+BKRB4bFEpWmqxacAWdtJjnLqDNP6hmh5+TpKgapROAsmPY+g+1GFJQYFj3NoDs A5fGwNAGshycKKuoRz0j8GlMaOjGSk4Qc0YyxHdSgI6dDXgmwCXbpnkZ6h8qdYkzz6 d5Ho2D91JMEYw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 01/14] selftests: mptcp: sockopt: reseed RNG after fork Date: Sat, 11 Jul 2026 11:43:29 +0800 Message-ID: <0b0e71be5930e970b6ec8693854ad79cfd620edf.1783740443.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 xfork() leaves the child sharing its parent's srand() state, so server and client processes drive rand() off the same seed. After the recent consolidation of mptcp_inq.c into mptcp_sockopt.c, mptcp_inq's per-fork reseed was lost. Restore it: have the child call init_rng() again so each fork gets an independent seed from /dev/urandom. This mirrors what the standalone mptcp_inq binary used to do, and keeps buffer-filling and huge-transfer sizes uncorrelated across the two processes. 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 b6e58d936ebe..05afe8dd1381 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; } --=20 2.53.0 From nobody Sat Jul 11 14:00:17 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 39A6C25B08D for ; Sat, 11 Jul 2026 03:44: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=1783741473; cv=none; b=Z2JixAjLCgXc8nE92ZKvQLNFT6gefd+YdRf41t3ZQ+0QWdWDp4DyLM1gZGZg+vvGoalCEwLzim1Tfv9lrBEicYsC3RJwB1mn45hA7bYYAoxQL690ftuGW+6qUcT1Vy32ObK+vCW7sFTjzI6hCZMxw1KzNh8T1WCa3MtOg+1xnLg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783741473; c=relaxed/simple; bh=wdItYL6Eab4Rsht9jxTtv6iaz6lXHo+3xmHkjUyKeBw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jMbdrLa0skJFuhl3yZOkvXTTy6arnC0amTRZJs5AsF+a5skA7yji8aALomF6Oq3X824ISBjIIyqjMtT4EYWYAoEn/WZWtXvkA4qUFPjfrtmxgZ4/VlOm22xXDEiC0aaYzqjI9E9A2iY3cR+RmdzBwY1ajIidIONxh43kq5VoVvY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bGW4fK4y; 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="bGW4fK4y" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CF7581F000E9; Sat, 11 Jul 2026 03:44:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783741471; bh=bTxtdF4uXyGcnO5JKlNt60QZT6NWIqPjT0Z06SUtYVY=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=bGW4fK4yBizKAb6NczqWQVqoNd69mJkXWB02Pc/TuuBNqKMvmQAz6IVoutKSPsCnl 0A3RUAFaTil4YXaPsqXqwRwQ4r0SoCPB8VqxGhUVy2YLoWircfzGWX6qrzF1d0Ec/X lsugZZTaYWYwgxSho9u6eFXi9bt/VGl2D81KiUyS6crDMPZZsdE2JXmEQtik/uFRw1 i2Nw0vBl/mOme/9yRfT3NmxfdzykgqxJgydONEsSQk/oUaeiMXRL1T8SCy4CCt3GOe IhQLcFw0F2GQfex4kwFoHajisbXjKvRa2epggp7iBvVuC9/oeMIAxSmUFbVqjQ628T /wZItNRX6coqQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 02/14] selftests: mptcp: sockopt: validate bytes_acked against sent bytes Date: Sat, 11 Jul 2026 11:43:30 +0800 Message-ID: <4ec9589e47698632c083dfc0441c238235d62335.1783740443.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 05afe8dd1381..fed6aba2a176 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -685,11 +685,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 11 14:00:17 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 49B7A23B62B for ; Sat, 11 Jul 2026 03:44:33 +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=1783741474; cv=none; b=nqhrZNr1qV78LNNOnPgqC56zcynpF9wWdL/BH/Gboafe1/VTzB5/JTJIJFMF3+tL1PvNPcBbrzM2ufNkrwJ8JbKLCZRYrn+aVxVGiVhvfVqliLJlUpK5ddDf+8cYcXpsDQXmf6zibS2KhKKmGgW6Apgsz1HEC63VDq82/fU0agg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783741474; c=relaxed/simple; bh=L4DxLdG7g88Yx5T8DYWnl8EdyGWtq+5hY+CLRKyMbsc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=X7E+pwu3b7Ti/nsSm+iSfIlLEVDGCZbTRw7Leetq8FEgtpak7eJATGk5cEp9aqnjxtSoNxa7DdIak/WInQ7hFe6gGK46PQtPOXutRTI/hClFXNprEMeBih7dhzD9LpAJw/h306MuSij80SG4Qo8an8fxGT0lf/nyDZRrL4VIHLE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cNf0fp0N; 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="cNf0fp0N" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2EFAA1F00A3A; Sat, 11 Jul 2026 03:44:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783741473; bh=hd8JdTIpTk4hJ2MMXEYtsi9aZJFWhfHaYon8sh+S8cw=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=cNf0fp0NzHoafjcKclCjCbnRDzQCpQJ7L7ZOOHaes/q1ZbwgeLLSqkfNUdpxLJtUB hpf58v4r3Ok8wmobRusHitgqkx7PSHcPUNXLC6Tg+sV3zU67TLsVZcz/RxFjclKoF6 Uzuu1EWOPVKU/08480w0SNeWF6dUiUpoVoHTKx+adGb9erh3gkbTyiFZu8KxiuoPWO fjfGDVZLa0gX046NBwGlTvuALsr/wn1tS1BxvvAlViS34Ii7xwHajwg+Wx6DjqQU/Z fIhogGQvRyLrogb9/j0B5h11LtOxQkos8pYfkG6AvgEVsu9RXvI6O3WYyzHFcF0RSa mGj+IJjaJ7fMQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 03/14] selftests: mptcp: sockopt: use r and w for byte counts Date: Sat, 11 Jul 2026 11:43:31 +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 ret/ret2/ret3 with r (received) and w (sent) for readability. This prepares for future updates where r will be modified via '+=3D'. 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 fed6aba2a176..f4c97b20a122 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -640,7 +640,7 @@ static void connect_one_server(int fd, int pipefd) =20 static void process_one_client(int fd, int pipefd) { - ssize_t ret, ret2, ret3; + ssize_t ret, r, w; struct so_state s; char buf[4096]; =20 @@ -653,43 +653,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); =20 if (s.tcpi_rcv_delta) assert(s.tcpi_rcv_delta =3D=3D (uint64_t)ret); =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) 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 11 14:00:17 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 69587282F0C for ; Sat, 11 Jul 2026 03:44: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=1783741475; cv=none; b=KkEm2UA5AM+vunyeHG0IIjmyNQeWMQBxe7NeNOyatGGMo3qvZA1E6KuaTlhUGEPNDN5bQwO0wQgy5qWxkOHc2x/N0/v1RhtHAmDeYfn1PXanhtSM87sTeMk+3k8edK4pv4IA4VW67bL7AveKHv6+v61FQhQkrFnFoBSbzs/WkLw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783741475; c=relaxed/simple; bh=H56Fd/7tXTrOApmaTi36C6F8LamNYisPGSPK2ZLHfhM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IrlwxqC0OhlWL3TVMhyb8F7GF6kiPgJkC8gknR9t59Ca8QVr0PEsH2jjrRRj+y28jxCGsiVs1QxOhEdSuDUQlOK/YK5OPEH4Dgxp3A0hhOd2nj3cCyNpT9W42U0sMOBDDr8XEdMpQ0MyK+g4FX9xiLhMxegFnZ0jwOsWi6qtNqg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZIlGS1vI; 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="ZIlGS1vI" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 806911F000E9; Sat, 11 Jul 2026 03:44:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783741474; bh=LMn7VL+dkINmW9jiw/Oy+2pScC30XDGiZe195Q2Vk24=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=ZIlGS1vIXT10g4wfZ85x7FA84Wtz7AJoCjAfuZ5jJyQ6FzRYwWzUOQRnuiutmTQ3W G6ciBccUx6hCpXAUGwDj3llp/RlbB4X3FdJU1sPTOLAuijv/VP/iwxcK6pQeAu8cKh G1xDP3d0R+ZTAocE1ZzN3aljARgpM5cct1W54yJfT/eEpmkDFKmJ4kLtANWYNgdV6z 4nnAOSRb1a4rPST01Whxkogo6kT3yje7o4iW5C0IlVS/dQ85Lab7ortC2lUNFrqEk4 RxeUBsuWZZTVLxOKOgX6ruM6raZ/9wIo2LKjpusAshpKRGsVcf60NIyelE5poHQ5Uw TmLZgLQhUo+lA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 04/14] selftests: mptcp: sockopt: add tx/rx protocol options Date: Sat, 11 Jul 2026 11:43:32 +0800 Message-ID: <35d655527eb1433beb394239be1f21f626fca05d.1783740443.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 f4c97b20a122..afc7a74feb18 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; @@ -559,6 +579,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); @@ -634,7 +657,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 @@ -672,7 +696,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) + if (proto_tx =3D=3D IPPROTO_MPTCP && proto_rx =3D=3D IPPROTO_MPTCP && + s.mptcpi_rcv_delta !=3D (uint64_t)r + 1) xerror("mptcpi_rcv_delta %" PRIu64 ", expect %" PRIu64 ", diff %" PRId64, s.mptcpi_rcv_delta, r + 1, s.mptcpi_rcv_delta - (r + 1)); =20 @@ -782,10 +807,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 11 14:00:17 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 EA224255F2C for ; Sat, 11 Jul 2026 03:44: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=1783741477; cv=none; b=qjjn8ZGUTQ0mk6tProD5oQaF0P+yOp85IKOKF/9qSOL4rHsS5II5RT1Kai60zbm9QM0tP7PjmsjxUwQt5zR1sJtPXGJH6xHJoVaCTI/f5DjnZp7ZJls+fuRNULIYW2qdGuMnWCvx2OeXbUt28RXhp6laTNYxKQ0mYamAlox+AOM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783741477; c=relaxed/simple; bh=tnJnaTF+xzgaaW/9ZyET3fUv5sKvK5MWp6zpeIQqrQg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r8VN7RsaKOcH5ygocEBRWWDtmOk2dguyRdtihGfRYyav/GFzaRe/QwhyxHsY2lv8IWDjhxy2+04dsvBf+fSwimsASrpLZYsUCrsP1Den0jS/Ns7yfrQ7xJO2WVY0uSyZwLPWnJXK08jEsjAs+qCTRm6CWZ6u2LmsQDLQKcsxuNQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=i3Pu622y; 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="i3Pu622y" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B1F3F1F00A3A; Sat, 11 Jul 2026 03:44:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783741475; bh=1jeulXRN/2w1yFxNogLOV1SwE1pqL95xqb2/Y0eXTCU=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=i3Pu622yuBxWyH7Pht4XbxHb965bTFm05ayZZ3C+NMhqiN92A5xC4PeU2ZqN1v9Uh yaQrQNDRRuDJ+Wrl6ximKjWNlL1WDZ0ENCng2hH3a1fWZ008Cm/9qExjRQbZlo1zsE RakpCw9hRTQ5iL+DmmloYHPdxIi3yoQf972wJxTrrhqIRbe3nGt7Ol3FS5iz7qCzQR lFyk7fohtSgtbJprcCnGzfSQBoNKuG7Tlm0FaCWMWCGmgseZD/GIfcR9nrVjam4fqv u8uEJ9gxLucL8oJ4P/Sh76yIrBt2bRtDJlkTSyv10kIyh2cHPuq1zAyptkumTrECZi h7nJ4e7qdR9Fg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 05/14] selftests: mptcp: sockopt: add TCP_INQ test option Date: Sat, 11 Jul 2026 11:43:33 +0800 Message-ID: <0fa16cda612b74322741010743061befe806fca9.1783740443.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 afc7a74feb18..ba251a4b0599 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; @@ -723,6 +728,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); @@ -730,6 +743,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 11 14:00:17 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 50D2B255F2C for ; Sat, 11 Jul 2026 03:44: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=1783741478; cv=none; b=TtSvqsbUMqUZPdopce17cGTqH1CBtYYLNvzkaR1qCeRbh0cQ5CG8BihUn0+ChckuvRuf+dPezwwz1EkWI2ZL6hoBbFYdDgUh1PiliRAEMbocLGPzuSMZ9iygM+9gJoCjWQ270gDby636/oUn6Siplfk0FY/sJNae8X+KsB8chUI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783741478; c=relaxed/simple; bh=BM3I5ZRAyf2yZugjzpptujdMvDemR9or2PZ2qB4uQYs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qfPp5GsmqRFtPImieLfhdEmhZ0dcu/85giXSr/bzmZ1+1jbznuGCuiw2RsRXwfjDLh0S8o7CDPVqXgT73usRCsWn+Yv2TjsnqO6FXVkztmETY5HSKe1QdyaQQjakcohrQfgQmYMkXZx1kpdrn2HBUaNCC/szRWc3DYpMBgtCeRE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=j85ypj5J; 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="j85ypj5J" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2A7FF1F000E9; Sat, 11 Jul 2026 03:44:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783741476; bh=iMPJqOZOQutlEF798KXDe0VIsyr/gaAwxu5fW73BVO8=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=j85ypj5JPp/DTt29ES5vjnebWqduOXNsLnUBv1dW7yR3rdfFDiq3jbauv6XFv5mK6 7kGe4TY6JIXhgZ4e5JLv23pxegIXz1sKlkaaChqdt1QyW8gOuWkG/sboB6Y5YeQnAG mpLq8STuUeoPwJNYLCL9zQE2YbZLtc4NeyVNoCxsjIc9iJ+oAvJk4N+RXPtdFVjQsE 1k8R10Jo9aDiLvLnm7td7XuL06cogDweEbccCwWOs4IwFXT+gU5s8shu2sJ6AIgt89 ShLGfYFt8b6rdLpgYSp+DgCs+1pIjgVqFRyXUBQHNNsuUE3i+wiXByHc00JttIwSiO 60MB+jxvBDZJA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 06/14] selftests: mptcp: sockopt: use unix socket instead of pipe Date: Sat, 11 Jul 2026 11:43:34 +0800 Message-ID: <907de77e6d5449d48258c77150806921fccb9cac.1783740443.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 pipe-based synchronization with Unix domain socket pairs (SOCK_STREAM) for bidirectional communication between the server and client processes. Pipes only support one-way flow, which required the code to open and close the pipe file descriptor at awkward points; a SOCK_STREAM socketpair gives a clean two-way channel. These IPC helpers are reused from mptcp_inq.c (which used SOCK_DGRAM); switching to SOCK_STREAM is correct here because the existing protocol exchanges fixed-size, byte-aligned control records rather than discrete datagrams. 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 ba251a4b0599..28dc825b9d48 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -597,7 +597,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; @@ -622,9 +622,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 @@ -667,7 +667,7 @@ static void connect_one_server(int fd, int pipefd) close(fd); } =20 -static void process_one_client(int fd, int pipefd) +static void process_one_client(int fd, int unixfd) { ssize_t ret, r, w; struct so_state s; @@ -676,7 +676,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)); @@ -749,7 +749,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 @@ -765,13 +765,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; @@ -815,7 +815,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 @@ -834,7 +834,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; } @@ -890,35 +890,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 11 14:00:17 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 5D3AB26ED59 for ; Sat, 11 Jul 2026 03:44: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=1783741479; cv=none; b=kQKhfaB0aryb6c8h/ULFTCsuxPNz6LDLLckcoZAdzwKGEHwJU4lJH4Ut8FBMr9HJkjzWRd6S4+0H1RrtFSGGcM3BpTSXPBej1dA1PsDVni/JwY7eAWkg4sjooi6hOmcm6JzR3C7/95DGW/3878k3WHTnhHYFBgh80ooUkb7av7k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783741479; c=relaxed/simple; bh=LiajPK8MZIldVLyvEXRV738yvvLYz1fsaX7CtprqIjU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WOcpFCqGhxwBCc9yKFyX25+YKjBKkkoZxIvm3ifrny4dP+kLHE/FrvGBscBmqvaCcRSRhH/I/LzcDLuhgQ+ZN7CRodyvhbkNWkSmQCs53kB/quJ6a+OQa0LQyEtblUt4fIUa8/jNmsZajcbxtun7q2QXSbTw6S81XDvjUYcWGvA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=n/eVrCg5; 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="n/eVrCg5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7C2191F00A3A; Sat, 11 Jul 2026 03:44:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783741478; bh=D4EjOjNTL56tA/2M17Ksd4eNhPTrpq3KnBTcDkHC+ts=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=n/eVrCg5T1DWTLcjmggCs/RctuX44kkr0wfPntKc13//Jh1H38DjHHiCgEFWkSToB VIgnwmTw+TelLq210mnm3JAvPGqOz6P3BTlYQEstg0I/DHoR8c24uH+DV4z7eutc50 Y383Z26ni4iiZWQu+AsMEFM51qAmga/U05XACq86NMJUAnB1vpnNVmiGzZBGdVaaut koUDBE/zRDyYteTpzuaTh0nh/whppSJ/buZYy9zLPAgha8OCVbthOAkOmAPOsYWYCz dZKRjwlB9EDjcU4kSky7yjqkzWUsqOHM3ISqFaI55sBfcF4+L09rNsB5yJ74tX4zkr 6Dk7QULvWUo5A== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 07/14] selftests: mptcp: sockopt: read exact payload length Date: Sat, 11 Jul 2026 11:43:35 +0800 Message-ID: <6f4f49cda462f116478be3a8153d7f0ad5222b9f.1783740443.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 is possible now that the payload length is passed from the client via the unixfd control channel, making the read size explicit and avoiding any potential over-read. This also 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 28dc825b9d48..96259f81240a 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -637,7 +637,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 11 14:00:17 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 E48CF273D6D for ; Sat, 11 Jul 2026 03:44:39 +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=1783741481; cv=none; b=YcJZLAl4wotkYZ10micvqV8sV5EMrkhUTaxlaYMVZ07OUzQSz0j28uQEKUIUdLRgweozLe5HRdR+wss4cgQX3QSsgC3C4XatDgNV2bC7bTE1jj4bt+q13kcf9esqqPTSg3shrkZQfGjap8wXyn3/WDdDyRZygzNGkv7cORHcfDo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783741481; c=relaxed/simple; bh=k03hOgfRBu3BZferhRwLFTzIi7p8xAZmK9y2pqgdWA4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LkjwBGY9IDXgnrnxJ/14qhgnwbnR5VhsmIlYLTTYUY9++wnUffIq8IH1enSdBUh3aES8GV8knWdzRG4+ksxMWaoojrHKQf/nHzy+HZzSTUP3qxe/ODuGurkcWZMTaxzo2nnR+vQwVd2Z/XlPKpbBKQff3BrjYQOUEsyR5tbr4z8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NVVlfS30; 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="NVVlfS30" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CC4531F000E9; Sat, 11 Jul 2026 03:44:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783741479; bh=0uPEwC3BLErqkVZoqZHPUrhW59oHtTApJl9SuU71bOQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=NVVlfS30dpLBx/Ai/YsgEG4lCLaDDXoQhT/ewhiifUNY1Rd/14Fp6zR20aBHVWkk4 J8MC3N1mFzewRmm0gzHmLBL8xU+/5h8fWWj+Soz/dwTRamcgZLJlEOn0HVwjQQ+IQf p+gaGHfLipPnElx71PpHYQucY7iDGTuCnmTIa0Zos9l91BleQOx3cnW6we0L5Bysei FxTw8MTOwRQH6fgW2MP+h3EsoKCOtjgRKuW1CMu1yIfX1QsvbA6mJgSPPKIDgeaS+5 3tATyGe2PkrsH3DC/N4cbel5EL9yzUjY3/Bea009ZZF51MGloAtWk+v7p/hwevsgu7 X0RvaYe3OQWHQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 08/14] selftests: mptcp: sockopt: pass echo length over unixfd Date: Sat, 11 Jul 2026 11:43:36 +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 Pass 'len' from the client to the server over the unixfd control channel so that the client knows the server's payload size in advance for the FIONREAD loop and TCP_CM_INQ validation in subsequent patches. Also keep the unixfd open for the second write by moving 'close(unixfd)' to the end of connect_one_server(). Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 12 +++++++++++- 1 file changed, 11 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 96259f81240a..181eae9de136 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -624,10 +624,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"); @@ -665,12 +667,14 @@ 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 static void process_one_client(int fd, int unixfd) { ssize_t ret, r, w; struct so_state s; + size_t expect_len; char buf[4096]; =20 memset(&s, 0, sizeof(s)); @@ -679,6 +683,12 @@ static void process_one_client(int fd, int unixfd) ret =3D write(unixfd, "xmit", 4); assert(ret =3D=3D 4); =20 + ret =3D read(unixfd, &expect_len, sizeof(expect_len)); + assert(ret =3D=3D (ssize_t)sizeof(expect_len)); + + if (expect_len > sizeof(buf)) + xerror("expect len %zu exceeds buffer size", expect_len); + ret =3D read(fd, buf, sizeof(buf)); if (ret < 0) die_perror("read"); --=20 2.53.0 From nobody Sat Jul 11 14:00:17 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 63841255F2C for ; Sat, 11 Jul 2026 03:44:41 +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=1783741482; cv=none; b=hNF5anUvyUuD7NYzYY2+ZxJSDxDLxusUL2fwCY212ZPnOCibyCcF3ji9n13MRzHh8sitCKz5Zx9+A5Hwy/SwFpovdcsubRiDDl8aVi3Rp66YP6pqBQ2A3HN+CRJ9o3mXVQI8rg/ArUcQntPf0QSLI7f6sdHsTirdlosvBNswICU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783741482; c=relaxed/simple; bh=mMjtAVY1DG5T0dWMgCVyTzfYfmysDjsN5NOgF7x0htI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Wx4hRkJZK3tq3DpvpbCEY197HlpjHm44sjjA7I+grstzcjJ4Nf/E1xOOgXicLVBhveM3ojQHFfkDLLlk80cbgGInHhPKCRc2litfxKk5Yp+2jbe2jrgEnl3UhXhWSUsclCGtlC0/04L/Yp+Yz9Dpzu+ugWQJbJY6SuaJgigwUjc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QsnZ0A6w; 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="QsnZ0A6w" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 29EBD1F00A3A; Sat, 11 Jul 2026 03:44:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783741481; bh=b2HtoZ8/+FnjSkbP3XlT2UgINU6F5GlFGXvirozYi8U=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=QsnZ0A6wC0GR2zqWGsmtCcknVO9OdID3LSO5i+IviiaWVqIf6/taLOw0WEjWqsc8S BDDv7mk3A9mRgYcf0V/TcUzX5Ps2elpiffiDNy41dW32lLORUpJqUwDvHqVtYy15wW ckcHcox4uZE9k3wSRZu4FFDiKsqeIwuoP1T72O3Oj8xBOLP2/GKnX9zug4qcueIxYW ZSRf1Iya19TqGSF16qoUrfSxOxBQmJcQyOs3eOgl3fwl+XsIAPok9VG1SmLPDccBXe YNlXhGYN9awfKyn/lnQgEgnb1oxPpoRpdm0ikWvYYyNjTzjT3dDVfzdB1frSeZ0xaQ B3crPGExY5NHg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 09/14] selftests: mptcp: sockopt: set FIONREAD ioctl Date: Sat, 11 Jul 2026 11:43:37 +0800 Message-ID: <552a0289eb6dd58e95a7a4fc4dfabff8e5d17e44.1783740443.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. These codes are from mptcp_inq.c. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 181eae9de136..6bccb206181f 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 @@ -689,6 +690,24 @@ static void process_one_client(int fd, int unixfd) if (expect_len > sizeof(buf)) xerror("expect len %zu exceeds buffer size", expect_len); =20 + for (;;) { + struct timespec req; + unsigned int queued; + + ret =3D ioctl(fd, FIONREAD, &queued); + if (ret < 0) + die_perror("FIONREAD"); + if (queued > expect_len) + xerror("FIONREAD returned %u, but only %zu expected\n", + queued, expect_len); + if (queued =3D=3D expect_len) + break; + + req.tv_sec =3D 0; + req.tv_nsec =3D 1000 * 1000ul; + nanosleep(&req, NULL); + } + ret =3D read(fd, buf, sizeof(buf)); if (ret < 0) die_perror("read"); --=20 2.53.0 From nobody Sat Jul 11 14:00:17 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 825E8273D6D for ; Sat, 11 Jul 2026 03:44:42 +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=1783741483; cv=none; b=Gg8U3k0AI8E1FZfGv/o6bxv7BA3x5tq7dKlwuUjPI2Pxk4sXr9V7fa377Ixsn2et/fguOZvnfhM9Yu0qS39xG6qahVkQzost4elqwEQVKHYRrcj78Xs0/r1bF6XfLsp6RBQBeQwqvwiN/Y2IWGBS5o8O2V9wpRDxBTaJrOIq6Tg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783741483; c=relaxed/simple; bh=x1CbtPVwQguICKzAUnm76U7+tE2g9/Uv9nLEOdW2V7A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nO9WYsBfrJUHzwayarrDmukI+WDnVS3i7xZPj12UF/pHaTwDOyAqj5X5Us6Ey6XoXphL9PiCCl/TWFmU7KX0R4Lx/UM2mACGr5aVLT5FC/EpAA5w29gJHNii1pL8Jpe3gJtK8gpDu0GfxPnSPk0AWIN50ASObzOKsxcOXM75Jww= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=M2o/V70T; 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="M2o/V70T" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 79EDB1F000E9; Sat, 11 Jul 2026 03:44:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783741482; bh=oUxSFupqP1UC4EwCPJdtIgzg3BH7U4VHifdRcePvlks=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=M2o/V70TcLqeds82E7j3nQG7RKF7OLwLTArMzgH/jsPMdZrSxWzU9agT6VSGkfacl 7hODaHK2uYi/N492OwQ2Em97V95O0sqnrL3EVONq36iZhqsWY1KcKvKY8wTeHOGAcW rV9K8oghALLStbEWpZVzCWVYIMBE1fUpUF5wjuz60DUcmp5ps00+Q5hEhubapkNaWQ 5pHesYV0RgdBqxR/w3VBg68Afj04ZkFMu+17VGnQG/tZWdnkHE3pOqBXRw5VUwz4W6 Kv/0lKjWvRHLZe3dxtwBDygUpWYZ+0Rey+0Xg0hmpZcf4boPcmLJUyTWEyCdtRFM6e jWh3Itzb4a8Lw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 10/14] selftests: mptcp: sockopt: add huge data transfer tests Date: Sat, 11 Jul 2026 11:43:38 +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. These codes are from mptcp_inq.c, but here they have been placed into two separate functions. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 6bccb206181f..aebf22337b8c 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -598,6 +598,55 @@ 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 server_huge_transfer(int fd, int unixfd, size_t len) +{ + char buf[4096], buf2[4]; + size_t i, total; + 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); + + ret =3D write(unixfd, &total, sizeof(total)); + assert(ret =3D=3D (ssize_t)sizeof(total)); + + while (total > 0) { + if (total > sizeof(buf)) + len =3D sizeof(buf); + else + len =3D total; + + ret =3D write(fd, buf, len); + if (ret < 0) + die_perror("write"); + total -=3D ret; + + /* we don't have to care about buf content, only + * number of total bytes sent + */ + } + + ret =3D read(unixfd, buf2, 4); + assert(ret =3D=3D 4); + assert(strncmp(buf2, "shut", 4) =3D=3D 0); + + ret =3D write(fd, buf, 1); + assert(ret =3D=3D 1); + 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]; @@ -667,10 +716,93 @@ 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); } =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 size_t client_huge_transfer(int fd, int unixfd) +{ + 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; + } 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); + + 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); + + return tot + 1; +} + static void process_one_client(int fd, int unixfd) { ssize_t ret, r, w; @@ -723,6 +855,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 */ ret =3D read(fd, buf, 1); if (ret !=3D 0) --=20 2.53.0 From nobody Sat Jul 11 14:00:17 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 AD2B1282F0C for ; Sat, 11 Jul 2026 03:44:43 +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=1783741485; cv=none; b=Dx2S+lCEhkuyMYX9x25hdpyGPinfCJ+XdqQsD7MdT5Sek2jCOWN2ur17XQNTN9+wEy+t0gbmuplkmu8SycFJfqkBe7FdKjPccCHeM39iU3wwCKZ1mOdtyuMuSkKR9tTH4YZlIzoNLCzJj6ESp7/PORbsVVUcozF+XkKyp5sr7LU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783741485; c=relaxed/simple; bh=ZtB4giW2IGgh60tSsWal8WZQH61EAYlXKmRthf/Tacg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fRR9B1jCJU+BjknokNRjkznUxHiAeAREFogo/+f7IT0XdSiqXM2uhIUx8Alrc1i/2nVr9kt8D/FbVF31z7QmeHQKT9V6Ea1+mbE9gk1EY0L4T3UnxTiwEKRBeivS3Pu4lBlw9TZZ3jzJKPqZfy8SXTQ9OWHjildZSfh4CfJzD4I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dsa+sQpw; 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="dsa+sQpw" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CBA5C1F00A3A; Sat, 11 Jul 2026 03:44:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783741483; bh=C4pJeJbo/xKslRek0LQHi3bi9Wa2TGdyyam5Q9wSCpY=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=dsa+sQpwjC8dzLELYee1rNfAyZJoZ2dUTSBTixOsUBjo2TGRm8ay68o9u1Yu0bhyW F5qHOC/O+ENVWF1TGb0XjvMJWElvGzGQigvUPPCStV4A+qLEVXHeWBEGTGJeZ6qlqb Wb1EsFB8HGimi1bKJras8RyJRAo7mzG2H42CjsVjMdoZzHFluZ0W0MKRyYlsk1GANe 9+HdP9cfq4JITZUniwPlbIavO7grMM4/8dkahtGy+7ESTzT0Amh8W8t7BBwg9GIIlH GiF86HBgnbd9OoUMPNAx6sZ3E6Bs+1eZ0JlK6+CNuRsgAWwbOOlb8lixBI/y/H5Oqu L1ZpLOJVzL/Ew== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 11/14] selftests: mptcp: sockopt: wait ack for huge transfer Date: Sat, 11 Jul 2026 11:43:39 +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 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. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index aebf22337b8c..1a5a7f25ae8b 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -26,6 +26,7 @@ #include =20 #include +#include #include =20 static int pf =3D AF_INET; @@ -598,10 +599,45 @@ 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; =20 for (i =3D 0; i < sizeof(buf) - 1; i++) { @@ -617,10 +653,13 @@ static void server_huge_transfer(int fd, int unixfd, = size_t len) =20 total =3D rand() % (16 * 1024 * 1024); total +=3D (1 * 1024 * 1024); + sent =3D total; =20 ret =3D write(unixfd, &total, sizeof(total)); assert(ret =3D=3D (ssize_t)sizeof(total)); =20 + wait_for_ack(fd, 5000, len); + while (total > 0) { if (total > sizeof(buf)) len =3D sizeof(buf); @@ -641,6 +680,8 @@ static void server_huge_transfer(int fd, int unixfd, si= ze_t len) assert(ret =3D=3D 4); assert(strncmp(buf2, "shut", 4) =3D=3D 0); =20 + wait_for_ack(fd, 5000, sent); + ret =3D write(fd, buf, 1); assert(ret =3D=3D 1); ret =3D write(unixfd, "closed", 6); --=20 2.53.0 From nobody Sat Jul 11 14:00:17 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 48B95255F2C for ; Sat, 11 Jul 2026 03:44:45 +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=1783741486; cv=none; b=aKVZksJRGi7jGo3LSE9OjrBD6h5dCquGrLtmQfpm85xBFrX6goSy8mAuAkr4hwHOVBF4P1rOu8HQX/6W1o72qB31Cp0iIz1N19g1kUVf1y3VeH4YzUpIFPJm+jtkRcTH9fV18F9Hj4g0d7NhVhIA3+6vI9iXtgI2/ETDRA7iBAU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783741486; c=relaxed/simple; bh=BX1tzfO84ZBU0Fe3B+qadOtzgKwQAxSAwE2eo55NA+Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EaMGBFTTPDjK0P7dx6zkPRLgymRlXkhiQvfSBWa3M983cdJ0m/wtMkVXsIdW4ofr6xPIoebcz/QsbfhBtHOUPAcikaf4F8/eHmX1ICB6wp2fVaQ7Wa0ZX4GH2YS+RhB+/3sqGuDU4JO7ds97cX2yVCNrcHlb6bCCaemWp7ustM8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KmrI3BJz; 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="KmrI3BJz" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 27B851F000E9; Sat, 11 Jul 2026 03:44:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783741484; bh=BwqbJMc8g8KhJPX30BxmNuq1FvOXGCntO+bZkDbL2xc=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=KmrI3BJzElAx7ViMTQXl+ljBDPio8MQtybwXX/RRAeS5O2jS64C2vMqxuIiCux+1V WBrtLVK/8nzuqvu0SqPYkbpgS6SxlbOsoG4Sbf76jgLmJRJpvEKEHxABvD1e9gcgdG FWGV5hMWnSx7mntf8A+wxinAwWANtIvgMotiejgEU/fY03Zfb0MscXIS9GazXDWS1E uypR8RS3cgEK7IAydkoUtekipGV/RMEwUMxuF8y0oyjln5ad1dZBJze5b1d6rLZQ7I TVtdr6pvsL9moJ+Cmkp0fYHnrfDSnqoXzuQFO6Et1UTAFgOoakztRWnnxkb78qRrRe rzWHPLjCg1Emg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 12/14] selftests: mptcp: sockopt: use recvmsg instead of read Date: Sat, 11 Jul 2026 11:43:40 +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. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 22 ++++++++++++++----- 1 file changed, 16 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 1a5a7f25ae8b..1ae63434d5f4 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -849,7 +849,9 @@ static void process_one_client(int fd, int unixfd) ssize_t ret, r, w; struct so_state s; size_t expect_len; - char buf[4096]; + struct inq_msg m; + + inq_msg_init(&m, 1); =20 memset(&s, 0, sizeof(s)); do_getsockopts(&s, fd, 0, 0); @@ -860,7 +862,7 @@ static void process_one_client(int fd, int unixfd) ret =3D read(unixfd, &expect_len, sizeof(expect_len)); assert(ret =3D=3D (ssize_t)sizeof(expect_len)); =20 - if (expect_len > sizeof(buf)) + if (expect_len > sizeof(m.buf)) xerror("expect len %zu exceeds buffer size", expect_len); =20 for (;;) { @@ -881,17 +883,24 @@ static void process_one_client(int fd, int unixfd) nanosleep(&req, NULL); } =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)ret); =20 if (s.tcpi_rcv_delta) assert(s.tcpi_rcv_delta =3D=3D (uint64_t)ret); =20 - ret =3D write(fd, buf, r); + ret =3D write(fd, m.buf, r); if (ret < 0) die_perror("write"); w =3D ret; @@ -900,7 +909,8 @@ static void process_one_client(int fd, int unixfd) r +=3D client_huge_transfer(fd, unixfd); =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 11 14:00:17 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 584F823B62B for ; Sat, 11 Jul 2026 03:44:46 +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=1783741487; cv=none; b=l7etUMuCAtIpfloJOKA8mjUN5PqC6vOsoXtuspj+smBMM4iMz9K+XmjI5kybdk9s28oHWYPFGaM1btNGPiF1M1KludKpGMLfEbcX8jubV0pCQ5wfFUxlw6LWKOn1M82UHTcpcGEZBr41egxJT09wOKrbtWxgwuPxDgZkFBJoxcc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783741487; c=relaxed/simple; bh=kYxObnbQHJCltpq35EYk5kkH+0SrQJO7FXN6ahRWGVg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=D70/at0BjDU9imHO4NDDGfNQv4qERUcE/lXWbRYpZXsjM7F3Wo8TkNNNKp8U5o0zwHm+ZeEbMDOsttQNLYDS0zJPoQGw/pF0DTmJ/VC58e+0j94ypwBhP8yhFLXgh7cluocsCGeT3utBggSGWlh1iRIGebjpnqfuSbEjpGmG4IM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IxtSGf+a; 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="IxtSGf+a" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 791921F00A3D; Sat, 11 Jul 2026 03:44:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783741486; bh=QIugCy0SGsMILygQETBQ10PPYnfQOJ/QNqCj7Cbwb24=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=IxtSGf+acfn26CkhmwIqyAEs6OiOzOhJv42l3PQi7/MMLLDkZpp8CPoUg18Hjn253 SkewZHTfCIlCLOR1KS/LF0dFHp1Sk9Y9iGe4vZkaA34oogN7S3yExFxbGZpIepC8m7 c7CeaOnssWzKjA5dWEA5uHm/ZgXInbK3rCrnLGqkoGRf+GbJ6w7Y+9Vk8y6A0tkJFF XnDwAay02zrFOW9shrdItM8pAAsn9qFhs/i4yA7p/I9nDtVDQum946ARBZ6GvvcWAc dDCp5QJf6tAkGTue7izJcPNmoUHUwNlLsQ2TwPWKDpDOfczrHfjiIp7HZnrwD9IenY OPvh37wuBYL+w== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 13/14] selftests: mptcp: sockopt: get and verify TCP_INQ Date: Sat, 11 Jul 2026 11:43:41 +0800 Message-ID: <6653ae01c942aeaf0b6816ea41408839ad96874a.1783740443.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 get_tcp_inq() helper to extract and verify TCP_CM_INQ values from received control messages. Integrate it into the echo test and huge data transfer 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 | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 1ae63434d5f4..5116de9429f0 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -793,8 +793,28 @@ 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 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; @@ -823,6 +843,14 @@ static size_t client_huge_transfer(int fd, int unixfd) xerror("unexpected EOF in huge recv"); =20 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); =20 ret =3D write(unixfd, "shut", 4); @@ -841,11 +869,17 @@ static size_t client_huge_transfer(int fd, int unixfd) die_perror("recvmsg"); assert(ret =3D=3D 1); =20 + 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; } =20 static void process_one_client(int fd, int unixfd) { + unsigned int tcp_inq; ssize_t ret, r, w; struct so_state s; size_t expect_len; @@ -889,12 +923,31 @@ static void process_one_client(int fd, int unixfd) die_perror("recvmsg"); r =3D ret; =20 + 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)); + } + 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; =20 + 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); + } + assert(s.mptcpi_rcv_delta <=3D (uint64_t)ret); =20 if (s.tcpi_rcv_delta) @@ -915,6 +968,11 @@ static void process_one_client(int fd, int unixfd) xerror("expected EOF, got %lu", ret); r +=3D ret; =20 + if (inq) { + get_tcp_inq(&m.hdr, &tcp_inq); + assert(tcp_inq =3D=3D 1); + } + do_getsockopts(&s, fd, r, w); if (proto_tx =3D=3D IPPROTO_MPTCP && proto_rx =3D=3D IPPROTO_MPTCP && s.mptcpi_rcv_delta !=3D (uint64_t)r + 1) --=20 2.53.0 From nobody Sat Jul 11 14:00:17 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 E321623B62B for ; Sat, 11 Jul 2026 03:44:47 +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=1783741489; cv=none; b=Tx/+yZ8tpScwJ8Kptx7mftohA2GMyZFKqqL2927ryRYMJ4V0QX3w/DkpRGRekacH9px6viA3aQxTH7zpWH2drrXJvuiKlQa/loHH2IeWq/tJ4cfc4mohCQbM1FguI2VALFlpMIm1Ay1OgaFM0nfmrtyeWBicdyyYmaNFcBZajFc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783741489; c=relaxed/simple; bh=davJKfqwFimkolEUfNpeKWCrS9Rq7pqt3dECx1AXij0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EvAPgADd02PIddfeZyONvLmrMZKJgwDA1exeRnFSFbbD20fK2a2p+ub7SvGRsqrRqeUNLMbhUkjCMi+AA+macgQAkoroaj1hNVpxsL6G6p8hn5KMoESnCD4fY1IYmIrjlZq15tN2ZcjWSgNwRTQxdou8FwMJstZLGIbjsx1rdi0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ivyj5Dmc; 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="ivyj5Dmc" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CA8C01F000E9; Sat, 11 Jul 2026 03:44:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783741487; bh=ldIVz/66ucoc/dYa9TXv1iVoC+LHiG88H8RV5q/XyRg=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=ivyj5DmctHRYUGVG78pDVc5EKtXsyRyWr9YnL5+jPMX5Z3fRjBlexUEw/hK+t44TE hrlH1Qv2Nve2K9zSQjtEZI+hbcN0pN7CLOL4KK/SYPXMtgcVhV30CWLeq5e+8dB1kB qbNUb+6Bzrv748uGSmuCF+J/NJhpBlnVfI2WH8AxQqrHu9Q1WdZ0v53ynEH8T7O0zq N/Ychz/L6OirehboV0LfEK+8b6F0Rml46v/0W7+Z64iOsBIF1WRWLwD0c88U6g993P auxcQBXrxIRo7YWXsXnlbxSVMj2bypN49KDWmo8c6ti+2Df4A5Iy5Tik9ocXnr3gBZ sDd1Nm1NexTxg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 14/14] selftests: mptcp: sockopt: replace mptcp_inq with sockopt Date: Sat, 11 Jul 2026 11:43:42 +0800 Message-ID: <72511aa4707a95b42c4eb0ef756f7e82c053d0bb.1783740443.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