From nobody Sat Jul 25 07:27:13 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 4EFC4373BEE for ; Sun, 12 Jul 2026 09:54:53 +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=1783850094; cv=none; b=jXyY5Z9a5tAsQ3QRHxU/sLJNwNqINMTaE838PeUrdoSMc3/vLkVhO6176hiUkLAIXAACBStJPevddQIk6EM3PLpIaluMvFrgHXVvgnMuD4qDXwU1nOdcAgmuIq6a20nv3/Ug6jo2Am0fEOcCPaBFv8Pn3JPSOku979DH4/4JUJo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783850094; c=relaxed/simple; bh=r/iZBjr9j4falp+c+F8ZiqsszqQHQ2ZM1C1E1ek5gFA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tKYAQMgugDx56UofYYeBeEkEBHNx114mgZb7dd3AN4S+7zmxchjb5fVGTONuS8WjnvIEfByYfqRkhLXDVJg3//uFQx1R+Bc4IH87kobuVCDNjO3hLpFbFrOUj6k2E+hlPA2TKTo2InzpxB3mX3JUntPPQoYnNpS6GXhpZDUQQ+A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ciR2sf4T; 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="ciR2sf4T" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5A3C61F00A3A; Sun, 12 Jul 2026 09:54:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783850093; bh=vN9QUt0K3Ohrp+2UiVzxxGuyjGPwnF946W0GNQhwUY8=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=ciR2sf4T+ccF8DJGc7ZT9CwohV7JereUwFkQxqFSgFTLrPIF7YTMGgNBdFvBHZzky 6eT1JeRcQ+nbCS/0Hr/hZMsbhZJ2P5fhbgkDoOu+sHJ9J6yuFZNt767irXhpzVCCNa ahamg/vJqD5B0aGXCO3pYUDwFTzUsroMZQUjD7RbRYQhrPkt4gnZN5um8ifRgwtwng GghKrGeMeumQ+vRRvoHAKK9BCAT1XLAwLSRx0nknKUJ1unZSbT8Ob4zcOLIdnT1pcu D689/BJVDxehD0uxoRTn4jtMfmKHIvQ2nay+Tqh1nb4quSeUTvEQuoGt5vS0rxx/Pc NFJJGYWKPJirw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-net v8 01/15] selftests: mptcp: sockopt: validate bytes_acked against sent bytes Date: Sun, 12 Jul 2026 17:54:07 +0800 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang 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 b6e58d936ebe..d4ad03ed64ef 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:13 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 8BB6C373BEE for ; Sun, 12 Jul 2026 09:54:54 +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=1783850095; cv=none; b=cADamKNgrH4ypPYz73hpZjHdhaySPQ9Cj07d1Ha7IxIpSSf2UKbKCm1RVe58wJkA/hJ0T7WvxbSsxs/OcIMZCQ+sMcgQsbFducBm74KqknAm/jkgiIWopQokV1aSyYKf+uWXkpFY0VNuBdu1IOjJBtkQPR3RJSbJE1o7PclooRg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783850095; c=relaxed/simple; bh=nMMjQDBfE2ogYwxp8gSqZKFzX9zGkK070yqIdqFUeXM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JEQVMsPGnuC72YyA0aCYLg6SpxiJrAq57mMJU4I87gbjNXc+AkQROdpN/gGRripEhb71jbeV+VXDN9sYe0ZMGOPWxwy3AdnmVANIn8L1aty2Kbb3ukacdGbC8rZD9v/nf00TpjcTMUQS4YRAwPN2AAY4RczLdF4dAelEh4omi8g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kANwr82M; 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="kANwr82M" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6FC291F00A3D; Sun, 12 Jul 2026 09:54:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783850094; bh=6FHv24WUaJgGvOEGiQs8y5BDrWtl+De7QHF1+lUQohw=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=kANwr82MZ97zMYAgcnqtknyJ4F4V10Vc75Jh0QDloY/fRuv+SY0sOP006Ej3KXVQt 0MnjXiTuGpFmd0408srq6GAwr4TVrzSmDN0T1tdNu5TREzp2tvOw59nptZjmMa3f2N WsaJ6PTJhXJXjuvOO+h5vLQuhhARPj6n8GrY4eg1q37dr/TbhL4Ln/IBIgCjgdPYef 7a4HaB8Ab6MHRsMsVbKY5My2i/xI5/by18FDgs7Hhk1bPMwLLWrr37mFOSvfz4a4+B NXVYcmgJzV4v48783cD+qjRbFqWJSEuaQwOcw5c4382E7UOiPn+3MEWO9rWz60mYEd zicEcjArpY1jw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 02/15] selftests: mptcp: sockopt: replace /dev/urandom with getrandom Date: Sun, 12 Jul 2026 17:54:08 +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 d4ad03ed64ef..1f719885cd47 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 @@ -821,21 +822,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:13 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 8F7102F39B5 for ; Sun, 12 Jul 2026 09:54:55 +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=1783850096; cv=none; b=j09nT4guQxCl4uZgWU+30l5OWzHRnuJBPZbO0FF4a4kGfjz98u+6J8G+jObTEi44bUOx2dn91F6vli/6QTgSeAJAcH1NVMs0qK/okat2gKFaTKmlsLgHYcxJA7Iw06N5gLgO10MIiFgUyj7KdZymMnvkV3jCw+lb+hqdom9K6LQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783850096; c=relaxed/simple; bh=9lfwrFuLNblC7KI/9rXve3uu1ZE3kVaXnmRxYwHgRks=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AyrbCcKfv2acqrD1dCTB2vJegfwZefOY7h+1UbTjp3aC5UudZWycpR1wQfHSL97tvHxEj2xEcWKd+3Xskzce3SJOVdiJiOpk9rPNe8kEITQdoUoyq9tYdJE0dOlE/wQxvOxNq7x2Ewol1stMTRJKv7UHd2Jg7afoyjRwP94suJ8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MrMqER3P; 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="MrMqER3P" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8D5B01F000E9; Sun, 12 Jul 2026 09:54:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783850095; bh=r9L7lHw8DH9GW9XTF6xmbJ/Kplnl3oZMxtIjEPkVU6A=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=MrMqER3POD4KvEt5GuKnMippy2xX91lGIVOxM/Gnka9Ro5R2lxMk8qiVztTuMUGWr KlPJ9bEme6QQBLiT0yM98CkbAK+tA486Gx6jXzsISsYPJ91Ya8wTtCGqSYnMnQQ2f8 wQtOhxAqGHCk1TttuJLoycVgdtxRsQkXbAHhqJskyuej63gqD/fdFWORQJQtvceRRs 9eH4v/xfNXLDX12wBTJDNFHxPNwlhi+A9QGWvaHyldtjG5Q/QB8VgzcJHfLMrPTTom wazsh/j6JYJUmvXCOKtGcChcFiVwpU7oIGtFz3JDE1TfYQAKTWN++dYWrllunHlhm8 yX59qOa1e5u7Q== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 03/15] selftests: mptcp: sockopt: reseed RNG after fork Date: Sun, 12 Jul 2026 17:54:09 +0800 Message-ID: <3ac32a0cfeef2ea8c0b97f498ef19e286ee77a7f.1783849522.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() 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 1f719885cd47..d4bc5d879abd 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); @@ -800,6 +802,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:13 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 8187D373BEE for ; Sun, 12 Jul 2026 09:54:56 +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=1783850097; cv=none; b=UY6hskXPGWMzyR8LaqkyxpcTVvPfkfNxt3otWr2rCYMMMHTm79NsiwflblJe6mne66lprPMq90+SKvFI8C8BdlUzjd8d1p+SkVVxVSuSeQjWTFeECzaiMmDa7xGU4fH3iVZKvumiYMXFIU5gLNN8lPraBCarq0MipLxPTbKm4s0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783850097; c=relaxed/simple; bh=f/OTJ1wZIi2lBl0ExyrM4Y+R2NXlZm/KkJ7806LhQOk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FDI1Qipr64Ef9jUbjDw3DG75Ajd4+FIkvc32c2l/Octj/vCaveAPlsvjmNK/7e+M0ar9/6/MWHULa/8gQmQt+9zoPgj6jz6Wqj1DzCSEaNSkqpS6XG6LKkA5rZDYzNNmoj266NPl1HXwMnCJx5hC4v+Xvw2Bjm0tVRN0cKHkigM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Y0TKWEQX; 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="Y0TKWEQX" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A23381F00A3A; Sun, 12 Jul 2026 09:54:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783850096; bh=gVnw1wBUekjdWq8LwtkoVpJthk5945/E//ZMIDVBUMo=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Y0TKWEQXJ7bJL0SQXbDHPanqQ3FnNQaT1CUZHlSsQ8hz1CXSoI6hMr5rEG6z8rXn/ IP6IA3o9GHAulbC5CQfBUnogilDkxKLWc7B5Loi+oIXU9CLhfkR/fvqXAlpAG4Y5E+ i40NqffJUHs+vDT9vRFPy/32YtEXUg6tYOXHVphBqt9LmtcpvunW7jGuQ2ojl0kxM1 IRFJve9f6FnWCgR9phBq348BJCfNVoNgvmMcenQNi2EF4ViBqiAJUaUznH050HwyKP MdYkFZQ6HHRnbuR9/AJ4XZ0GGhZi5sIYvr9s+Nh5qAiyANoyOsMoYNXkqvPopvi9Zq fidRFhWD24IWA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 04/15] selftests: mptcp: sockopt: use r/w for byte counts Date: Sun, 12 Jul 2026 17:54:10 +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 | 43 ++++++++++--------- 1 file changed, 23 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 d4bc5d879abd..8781dfd50ba0 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -641,7 +641,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 @@ -654,43 +654,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:13 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 984912F39B5 for ; Sun, 12 Jul 2026 09:54:57 +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=1783850098; cv=none; b=t3mu/2wNBYzN+u/UQZdf5Pqb5ipZ15Njl+Z0jnEH3Vn02tZTYzDjawZ/jqeyWxZ+EIr0oADNFXf4mU18CVGFyLJiTCQCmiGU7gaONYRYJinPAl/J7G3XyU/9H6pvnKrki9drVQhglZxqF+cNbZWGkx/h9eIMvFYzj2Dk760XfDs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783850098; c=relaxed/simple; bh=4awVUK1Xkm+H+Ktpf52m8XoxGTGoEL7QvelIxCmsQIE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Te2Dl89Uf8RykKvZAFI5Oag+LO1PSykPpicQcjGMiR7NFPIIrygtKFXlC3cr0ToILlfyVUID95L4N5FHvLoClSH6n5l0zotufpnvEnk4wPciImjqGSDHpBlsdCUNrTJP1jtoONpJPch+cVK+5YFavJ48MlAKUciEq9ZQ3Mjq2hQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GZUPBO/J; 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="GZUPBO/J" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D68161F000E9; Sun, 12 Jul 2026 09:54:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783850097; bh=J1MDITCjlc0JLil0q013vmYlB/pgNsTdi5ySY2xWSK0=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=GZUPBO/JXtxg3wijGNBqyoPhbcLSu8TSt4s/hNv4lo6+bpQeNtXkN6PqRUCmtQhou HzMeDvL0dvTYJjVDbRcQ1yOfU52qCKuV2+toBQVEdyfUONiRoxGjB09SzU0bZidYHd 1MDFn6jRG7Jw0wxFpgY/fsGTNHB+x5mTeE/U+GtLD/2U7DUJ2BEbx01jpW7q9N5vzL 5NrXk2MZoPHhv9R69CKjQRRnZ4rbqe7YRF66S8LMiNHltlt5OMlyNSRUCAUP+2YFfQ 8XWDwe8N/FzZx0YYNSEdY+EhgpN6GL62b6Xbu0SLzp5y2Mu25zAsNjZLManVrRTOp1 ovgaPtaxfcolw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 05/15] selftests: mptcp: sockopt: add tx/rx protocol options Date: Sun, 12 Jul 2026 17:54:11 +0800 Message-ID: <872be3731b8851b6e3b1ecb17aa6856cd2192b7f.1783849522.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 8781dfd50ba0..5e0392fdf0e4 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 @@ -673,7 +697,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 @@ -783,10 +808,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:13 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 B7E27373BEE for ; Sun, 12 Jul 2026 09:54:58 +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=1783850099; cv=none; b=MJsk8uL9ylFkcqXHtrxklpsg60wDpJqo0jeZovp50RYsJ6Ix3Kjr083HiLKRNMVQUIQi45NWQ6ORr4jEo4G6VQVdc5IfS66qFRlE7Hq2pnkdv/2rJOQocYsIUA70X5/eXDfcKwaeq20YfAjVO/TJHNijKrozQn+al7Ai3sD1GBY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783850099; c=relaxed/simple; bh=wvYxkoXBtG/Jbq8dqCH8wGG+eUglq4YD5pIsApsCOu4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HrQ4tj2Kauxzbg4x9dd9MU4RpXYd6fcB5PSUFHP/nYqciNBEYyRoy8k52YF5yQbEtWQnpmzTcP2x+YAHiWoJEthxW9UgCt0pQMMc0MKhLPiakXYtzOWCnH+PsOIAYdjK/rCeWiF20+7i/bbQr3vVoD5dHLuDjlpFNYbrmclof+I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Qew+aJbU; 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="Qew+aJbU" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 03F9B1F00A3A; Sun, 12 Jul 2026 09:54:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783850098; bh=sWARq10Hm6eLkwVkMLWENcKfZGI8n5t7L0+/2yCXwjE=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Qew+aJbUMUN9mqvwcT8Bbp895B2i6OikyT7jS3GtpEQuBcgt5Oirh64EgnSFyFjXu PPMJD62utCpIc/tLsu4btiUTv3YRFVjSJMlQ7CiGZ8nN8PlKeejiTfgdpaeAOYz4wG FqnHhEZpc+54FIUYglAO7TvFMreHLZcb150jkUJ9L8h9j0BOuTwwGd+stwn3d79uE9 eUO+NQ9dYQfpufPVkp8dWPRcUfvAuiZnY8GvQhwBMg273MubH0ntor5cQ5gQNvHVCb lhnJC7y0IVhNYTINCYfmKKaBc74crdaWdgOCPHo1QYpXoL7caeQSFpTMTHr52rztKM ooSvKlWqfmAmg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 06/15] selftests: mptcp: sockopt: add TCP_INQ test option Date: Sun, 12 Jul 2026 17:54:12 +0800 Message-ID: <31d77b3ded2d0bc03bbaa3b1457d6b08cd2782f7.1783849522.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 5e0392fdf0e4..5c9a63ed6703 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; @@ -724,6 +729,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); @@ -731,6 +744,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:13 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 CF7CC2F39B5 for ; Sun, 12 Jul 2026 09:54:59 +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=1783850100; cv=none; b=NdmdL3rgkCmCoHgpqr7hHMwskmPEAGDvFesp4DD0VCr/vLRqEqUyThK9RewOdqUJ3DahGhqY/aqFoweCXOIhVIiBMdmtrf/191vDjjpOdWwkpszr5Xkn5pDQISpwYJAcx2QMf52IOjGzuV7pd1h6liE1OEVLsHHJOnGjP6Qsx7U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783850100; c=relaxed/simple; bh=5rAYe1P//CzlRtIgjwmBEjpHiExJ3Aq48A6bDKb/VrQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kXF3zBg6/Yk8mBGn2poJIfDdVdacoYcD13nVCVFU0+Wu1sRtNM/BuPXyQ/ZgsHflLQk+8Om62y0wdsLOTsPdH1h2FtEc7KyhCb9/i+aNUBhGjT64MvHWvooEVM/NLg6myE1rIT2E54/2VdOqJY6Ey8wvormz4PeapHvKV6k4IU0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jmptD22B; 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="jmptD22B" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 19F011F000E9; Sun, 12 Jul 2026 09:54:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783850099; bh=E7pYQsF7wRGzdyZoF4JYNXE7YsNbstPbbewyB5z2iUA=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=jmptD22BHO2CnySDcDSc1kfZ/OMrjmGPwkOPMTnKZEK/v1hc7KyDCMcZOlwbjCFSf 7HmDH4qxAw6RhGkoaGVUlVXpSAewAekYjkHCEdJ3LPUCISf8P5fOSTk5v5SVvCE784 sVQbrLtl4k1nZTElkBDiHK7Rvgydqqj9i9McceLLIJ/LbTDX7XIUttJBzk5CsZBcsE 99k2U/6nc27MrBa5hqSnAa1i2cbNuM+Ufqy71TWofFE7sP6LQpRASc4Hq59/kwhBZB 58nwc91IaDcg/9cvjkpYZRy4mmJuVO6gNI+8i4CXqwRDv2IvK92We+KBhtxYoIckuy Q8dujTBsAJD3w== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 07/15] selftests: mptcp: sockopt: use unix socket instead of pipe Date: Sun, 12 Jul 2026 17:54:13 +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 5c9a63ed6703..c7605ce5b9e1 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) { ssize_t ret, r, w; struct so_state s; @@ -677,7 +677,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)); @@ -750,7 +750,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 @@ -766,13 +766,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; @@ -816,7 +816,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 @@ -835,7 +835,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; } @@ -884,35 +884,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:13 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 E2202373BEE for ; Sun, 12 Jul 2026 09:55:00 +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=1783850101; cv=none; b=qzIJa63wMizqk4nmst4B3+TLdU+/wbJ2B/eP2r/eIz3iz8diJZmjp+d1gLyO3BvnYsnq7kfaa5+DOrOCMFbhfLbFr0IiXc9txBol5nZDktiNHQxcNA31+c4iEF4TlWrjQ1nkUNQpZsFX9NsqWtytmo2NGBFBbNZaYJ/ulZ2Fm8E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783850101; c=relaxed/simple; bh=tUV/bG2aSdVj/OffuGWN6+Gm/WPwU9Cw0uIodlOIVLg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=G+C1aRb+fqZFGwmo9pgdH/NR8s4Lk8INha4+7twb0tDin2KYzo5JT0wJM0TtwLlCaV9xrQqaRiEmrHueN6EOYWROSm8pCfdNpVeNjatxmKVUh1I4xMw6ayzG2/D/XwqMZ/udtu3Cqg2fIjll+rEJZONiHEmpJEg9Ny079M88Cnk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HcjOg6ZM; 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="HcjOg6ZM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2DFF01F00A3A; Sun, 12 Jul 2026 09:55:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783850100; bh=VsSoKOMdG6uaju5gb7OaiZJvP8qbDxGhPteeWsy1wUo=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=HcjOg6ZMSUo8xpXoOdIdskEryFYCa8orT7wIYTJF6C8q2/UpRr3P+kjMF43JtBwVj O7x1ot5/wioMkdqV1NPVPD3lvEJ+ZTTAtrC+wb/3J3GGPxGYzCoxPIEj6BGav/8qf3 ge4QF3pWRNqrZGU+N+9cV8qDcligMtUf9wuDorvZa1F2wD3ExsxWSeCZfdiHq9NtYb 7Ol3ER5OfVQ3FgH8fC1ODesiECvNylRu8SQkTwpm9g70kmgczkJrUjLlmGWVN3aRjj N85SiQ4/ThnHCKtzRKv1py47/qGwAGYLkVFD9oJPr2PVqqVu/aBj8YNbAM9GW8HJ25 dk1dofgrT4gcw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 08/15] selftests: mptcp: sockopt: read exact payload length Date: Sun, 12 Jul 2026 17:54:14 +0800 Message-ID: <9b27a4c74db82b52f09fd1f3ca9e8ac42c9e9c60.1783849522.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 c7605ce5b9e1..e717dddc6734 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:13 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 55916373BEE for ; Sun, 12 Jul 2026 09:55:02 +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=1783850103; cv=none; b=NG7W8yLw954zs1RY2jciQHeFjnHIQozBYpXKtiurw3bvdWoO4p4Atxh8mRd4qaMdtrndT2MdnUlgl3arm/A7jr03vD2JgzTecvqEq92c5e1X97n6hbl45ILReIpt+72VeTjJwWWzs+qzjm98myd00k/4jaBkHrL35qHN1ZbJhfY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783850103; c=relaxed/simple; bh=/RrrCrRv8+e84cE1JmIKiobD2c8QFIDMJqwPH93BwIA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bhg1W6sTunAk4tztb2cGB3o3XP4j5XEcnp0MmjyiSLCKtB36zoEVq+ibYquqig5vYvL1l4sEgfXle0rJQvD6400qfhXLk/jswBlrT/EoSAyOaN9qqZtCDAcmZ1QoKlo88mNWtXGLTRAtOrF+9VxYpzly/CbQQOPpYkf21wzsiZ0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QL+SDG5O; 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="QL+SDG5O" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4123C1F000E9; Sun, 12 Jul 2026 09:55:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783850101; bh=Q/s0UPbkn5SRhC2cwk0HTX4ntEsHsEoSFmTicKFg9Qc=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=QL+SDG5OWKfuSUo+pFC5nLyiWeqi0scp8/QwX2E/2lauxZerVuePT9ax7get1K2QR 0uLltXiUh+ESNe1AtGHIXe9r6ApArKSIcYv0Eh4ukxMVkZgFRDU8iLGte5Bf5UJP68 wpu5bo7IHREwpBpKaUsiU8chX19P7XRmlovY2flKV1onTxIQgakVLIut9X5iFNQCnI CeEur8fGS9JUHzdeqvJRSQkOy9QOycQ+rEcIaCAlD6hIPLrnS8OhQIst/jf5LUOWE6 LXG8Xc4Oo5eiJ5lPM4riQjK/aLe8nlft57rF4KwkiR8So1zg2mW2kaAaAPOuV7Of68 OBH3iYUYmbegw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 09/15] selftests: mptcp: sockopt: pass echo length over unixfd Date: Sun, 12 Jul 2026 17:54:15 +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 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. Also keep the unixfd open for the second write by moving 'close(unixfd)' to the end of connect_one_server(), so that the same control channel remains available for subsequent huge data transfer tests. 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 e717dddc6734..610e3af040c3 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -625,10 +625,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,12 +668,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)); @@ -680,6 +684,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 25 07:27:13 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 47F302F39B5 for ; Sun, 12 Jul 2026 09:55:03 +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=1783850104; cv=none; b=JW31Jcwt7Jic5tQcDx5TWGoXzk+KI1CJt8nThLBQimlN3sM+yKtmt7aGVEZxksgGqTk1Br2VlOI6CBU2Ds4K1g54fBovV1mYX1I45asy7v8Qfx+N03rl9uSnisJ0FGGICdYTUKsejMBWIqsF6DmUiIpZkDdqL2igRjJ3NsFFdps= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783850104; c=relaxed/simple; bh=vAHzquK1/9RiobeAb1B1mcpgQOpilNa0CSznpUpptn4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NJ3k3M3n+uD+JUIHtn9DRIG7rmMYir13vVF3Dh8p+G3kHCDhQHjOA4Xfd9WBXHxc9J+yiJp/9oXOXEmxJjd0GWtnwaIL8ZHBELuPrFfQjqy0lVPZ00tqbDyxiQV9AmlyqX76PxRsmveCvGYWT7XIDzPftgYIqi7tOhyDF4Ztc0E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=m6w9fU2F; 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="m6w9fU2F" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 573F01F00A3A; Sun, 12 Jul 2026 09:55:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783850103; bh=ezgykU1fYbc26AkgsqIVEMYQH/yT7CapDrWSqxVSm2o=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=m6w9fU2F/BpV2Jxm7pjkzfFvFRITIAMK9X9I+gaSNlVFEjmxpaQGigdfWP9aW4K56 9RXTYGD9VdKcFDA4SLzMYo3/ZWBcy168vqAvotgd+COmjqSo/m1HwqgqKhHOKu29ce yAFzHh74Py+xJd4hmgQcpqINnbeRDPBWN5UuSf0exPtiyBJa1pi7+BNc2l9UFq689u mHIVupgmm4slCxk5Ehso0pugHdW340oPZPL0zl4erVlt0S1EUaipwQXZBxJ9xHYLdQ 9BuvbFqNEzJkswIeEuOON9xmuqtC8x8Kf14UiIJVncpCbItMCUcedeZioYJEXQQr7r 3nohlDebP1Wfw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 10/15] selftests: mptcp: sockopt: set FIONREAD ioctl Date: Sun, 12 Jul 2026 17:54:16 +0800 Message-ID: <6eeeda460ce7c4cfcc84e51d969f84a76da16379.1783849522.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 610e3af040c3..165ff2c884c4 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 @@ -690,6 +691,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 25 07:27:13 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 3145B373BEE for ; Sun, 12 Jul 2026 09:55:04 +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=1783850105; cv=none; b=E2oIAhi8k1NnEqqjKLmAPGE/bDB8YB57pTjlpccVU3H8eVH/a3jdD4nk8Zy/NHNj9Kh61JrJ2BS5zDPWqXt5hkE5H2AcFvmXoRmOrbeHNPZDltTvz6CNftCPIizXlzBsB5rBOMqeOn75w6ecmflkSEybjPZNd85lWfXhfyPySck= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783850105; c=relaxed/simple; bh=bhkR5us+CckXujKJfwpussbstG5PWLGsPen85CP5Yj0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZIeGhKpfo+2LWf+/OjguWwtbCDzl32J55EThDMttUKwh4SuEPzB461yMJABDNaH5zniHW6km7zWI2kvdOWsfLGHiS33FAKjGYLL/lBfI8J1gExGzBylesYW9H50W34/FUePZ2QBq6wHTh1W0FcSGpsdbEq+XEasxyjTxUBmrvY0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WQARzkzn; 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="WQARzkzn" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6C6A71F00A3D; Sun, 12 Jul 2026 09:55:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783850104; bh=TVZQJAkHfzfGoyljdox27Js8Cz+0vl3qH9FlXdR5Q7o=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=WQARzkznrgoCyVR2FNFlJNhLG5cN6mQzGF1/6l6uIKQkrWOctQN0pN+85aE3eCmpq Km+Lw+fGaPu1MNN4Ka9AD3tdHLFLzKKwAEt3ku5STvGjTri0AefB3SSceB6ifR8jt5 j/jHMa64b0DB4NUGppD9/l3Vd3a/9On/FE8DjddXwjCBZETTmlBLkQsOryw2yjjUx2 CHOJZI7JNX0LiCnNX3yKXw9td2et3TvtXeTtSCwsZYwhyNPZAQISO/CaMrEgIpUdFi vhwI3hwfQVCbL4avkxZN6DhVHoYJG6Wwcv+hP7wJzxGr1WirWo43hsJpNpGZUYlOUh hAMRhKek5rZGA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 11/15] selftests: mptcp: sockopt: add huge data transfer tests Date: Sun, 12 Jul 2026 17:54:17 +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 165ff2c884c4..4503ec87f374 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -599,6 +599,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]; @@ -668,10 +717,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; @@ -724,6 +856,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 25 07:27:13 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 90560373BEE for ; Sun, 12 Jul 2026 09:55:05 +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=1783850106; cv=none; b=Kx6QSqPbycxD+oqcxSvcjJ8eywmOwwBsEHvgYxW0xyEwJz0BY+VuNjg6sAfQiBqdgdd7JtIr7lmFDJfIghSmfDWU2LgJJU0oVjbppMtLrBp9pxuEBOVHjAQy0CKQxoFSdFot/Gy0oWerIEM6daZBLNySdIbP8FHa/wn9o/rp4gA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783850106; c=relaxed/simple; bh=3qCFmuVaFBMqCZounj08gh296xFMpZi7ef621Sch1iI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sMwEhCnbmxpzmj/1WiWReUqSKTPJ4hSEvoBE2zCwr0qCUr0qonQh+jhIDNUMvlkccQOyriLvAiIdi+8DRUZZU+jWHiPT9uAwMge5+pzm125r2tmWU2thgTmVfNEJVDHK/yhn1yxAAOoNGIo9XUD7tjkVPdTMUiS/nxAQ3cG8al4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=FEjqnbCV; 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="FEjqnbCV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8229B1F000E9; Sun, 12 Jul 2026 09:55:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783850105; bh=CTPfuOlRA6FSdS5gT9+iSiNHBvw1nFhY1/Z7GPUxjK0=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=FEjqnbCVhQj/naIRBRCdqGPPUnikOaoETLdG/MmJ3VgZ8s7aPzGMSQogAsYLOPnHS c8FUgdjvTr97bKlQ+uLAkB0uSqqLLzUDkFlck4KDd9iJYo16xzcqMSquTtN7C2Jrf+ 8nB/xBSXc1cs34Soo6Jw8LUKU/bH06Ikw7PuaNAEE/aBMEReTprk8DlRBZD5huxaqk kXYiu7HyRgXmj7EvgnD9aHtVtUlyeMdeQyM4u3pzmK/c4jIFg+gxTVpk31taMXNmIm MffCCCFFrD5cPmDzGSLaTQPllOhB1dEGeVWax3cZVAGKTFOfCseOfCqDQ6x7rPGV0d DxTeViBLx5ixg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 12/15] selftests: mptcp: sockopt: wait ack for huge transfer Date: Sun, 12 Jul 2026 17:54:18 +0800 Message-ID: <00effe48c3f943dbf3d04688287d4515d89e22ce.1783849522.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 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 4503ec87f374..dbf13ef02298 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,10 +600,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++) { @@ -618,10 +654,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); @@ -642,6 +681,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 25 07:27:13 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 5B0D5374182 for ; Sun, 12 Jul 2026 09:55:06 +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=1783850107; cv=none; b=hFtoGtK+s/CoKxGBFpl52WNj7xM1y/XSNCwoa2gGgJfraOURY2C0mzMSs+kD/52DCTNOYK9EGBZePJoxqEnJphj7C+m3bsGqMxpKDDpO8h5qtvGHL1yvDPlnBgX1pQjf7cFU0Vh5Kk8y5h+FyiI2VBbet097lDPwYThx/xE77Js= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783850107; c=relaxed/simple; bh=qtI8Ow6B6xaCaiUpMuYw67eeEAK4bxfXYA2K6UOwwYc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=og8403oO08Vu1slVxebqOoPNWmRV2nPNXA6IKUpMIGQWApXxH/Jlt4HjVzk3cZSEfINTac+knL4cpSkNp9vYR/vObEvYUWM95nkLOxCsvlFXNdRhnv687IyiKIOfr339LxtN2NjwppKkZPgkquuH0pEVFeBaf5YC4UKKV0QJIyU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ecDGs1Ap; 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="ecDGs1Ap" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 96CF61F00A3A; Sun, 12 Jul 2026 09:55:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783850106; bh=5yMh8KCFOB0Gv/PLBvuEBWFVkNQEaPys3r/p/W76QeI=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=ecDGs1ApcigI7JWJbHnQQz+XvuiJYVfvqR5qhKECbm4+jNPIF1rcRh/1wHhb/diFE loc9nv84pRehUYLnIGrezB0tfB7TbYuGH4uSO7k5rtX7HuiB2GEjkfNgpEackN/XlV 2qwWF7xWZe5OrAvBipNJGTCxcl2JySP/DJx6owjsKwra509fxGxHexuu0E4P5dzITJ Uz3X/8Q6aPU5HjxXBcmyeuu6Y4Xme+fcoyRC5DfxXZ/i/aiWAmnGzwsLRhYCHHVNHy D2l1jzMGkKMlvSFYoYJZRIQ9ADX3deIM4cIPWRs8huQuWu1sxEyUEyVWkWPSPwE4pA psQjl8op6XImw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 13/15] selftests: mptcp: sockopt: use recvmsg instead of read Date: Sun, 12 Jul 2026 17:54:19 +0800 Message-ID: <5ea792547b1e7e39b1a2115d9761fb6281582d13.1783849522.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Replace read() with recvmsg() in process_one_client() to enable control message (CMSG) handling. The original read(fd, buf, sizeof(buf)) is split into two recvmsg() calls: the first reads exactly one byte, and the second reads the remaining bytes. This allows the code to access CMSG data for each received segment, facilitating the upcoming TCP_INQ validation. 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 dbf13ef02298..09136b34468c 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -850,7 +850,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); @@ -861,7 +863,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 (;;) { @@ -882,17 +884,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)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; @@ -901,7 +910,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 25 07:27:13 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 77881373BEE for ; Sun, 12 Jul 2026 09:55:07 +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=1783850108; cv=none; b=a5iUVscWtd9L8ijnC6HrGSavRMikcvYyQH0nlJdRcjtalBqnZ2UnDYlnz2l0UN2GYFmjIRwuCWt5o7wuae4MGO0VcLbi8tKYf3Kkhi5OVJrUdqMkQ+kvpRkwLub8prvD/WV0dSnbfMMhmKH7JbQKxCMS5SyLbnGhnPXF7mPdQ5Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783850108; c=relaxed/simple; bh=Tk+UKSyZLbkkpPpHzqRFDh+rLqgNjVqPMHNPPpV5bmY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KAhFH2kPwTaUD7uhsmm90nyB2QKeEbmSoWeLTNxiiFhGmr5zrL3gt2KgjfeDu4AmxDU6sJOuQQeeS6tBX4Bxu2AS2aKySYP+5+DzjLWi2sYSzVYG6mhqOp3U8JTKZW7IY56HEfBBeRWfNf2de6Dmd2TgQK0CXmzi+vMJbi5KBOQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=P7QQXvMN; 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="P7QQXvMN" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B11571F00A3D; Sun, 12 Jul 2026 09:55:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783850107; bh=v9nIMCpSlVRdpBZv7tHZ6wwfF5VXhrOG22IzyzQcipk=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=P7QQXvMNYlT+CXGeQDM6FfKaNcWtGJC33IK6QqC7AuYvBgRn1E3me//tm2g+sCRcw 1UNsn/DsOTZZOLGJgAcuMDNxKumYRP+t4XDky6V2EHIlENMZ6MAGTGOiU7pzra6m3a Xi9WllgQpFvIGh1PcL6D4nlGEPpKqt4pNEKutkCiuqdLskiXHly+SQwcclQ50RO2FS 6sOXt6ne8rCHD7lHTxhFUp2JouHNp3ZcqkM/jT9TOihKxylIHuoX7OmggUy+mstqzd 2yuyeCifAN3xkp2S54h72X5k2ev7CKuTUzKMJc33tce6IndcGo+H5DbVAaTAfOcfT+ wX1nUYjM+1FEQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 14/15] selftests: mptcp: sockopt: get and verify TCP_INQ Date: Sun, 12 Jul 2026 17:54:20 +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 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 | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 09136b34468c..61547d70576b 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -794,8 +794,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; @@ -824,6 +844,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); @@ -842,11 +870,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; @@ -888,12 +922,29 @@ static void process_one_client(int fd, int unixfd) 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); @@ -914,6 +965,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:13 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 A43FD2F39B5 for ; Sun, 12 Jul 2026 09:55: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=1783850110; cv=none; b=DKLrj7pIcRxfuEXtcpybb7gYVQpB1q19j7a6WCAbv0LVsg6iCdtq9Z3V2r5CEnJ5siOsqmG2Rt7JnP8NCNmpcO3drRGIbOmENxBYNieCXns9aztRRLdJfK5zSldl5fh+KUDHQe3+VdI9B6aoMON9OLLrv71ISZRUlT8GYzb7aMA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783850110; c=relaxed/simple; bh=2bwW6ciRIH3COpsPHrszcvWHu356hB6/G9ZwJy+7FNo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=A0Dip+ogIfC2b351vFTjvqvPO59CTO9xCmpZvQp7p+W0gR5PRVki7kgohBb+FiUE3WtBBua3Crjqyd8zshDUYvG0MBmNL/FT/m0CqVWGNMkIE4XMJDFUo4dE+HfCLRiUdGIduZZMr3zu49QP4hHuRAihgwqCfE4C5/Ie4yW+trI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lnJEnRiy; 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="lnJEnRiy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CADA01F00A3F; Sun, 12 Jul 2026 09:55:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783850108; bh=WsSuguUvTthLy/VyB8nBwxFIykuODS47uLsaIaG/41w=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=lnJEnRiyiyf30DXreY3FGW8wjrCKK3O7BOUC1L2SOcemeIpNY6YXNM8/N1j9mROVS cT1fCn6E8APS2qpX7Jor6gWjkzlSPsKZCbKsnb5W51c5Ela5qVbfbs+cVBTkKHH8yr EM4ymS9R9YK3n2o07W+w6G9gVEulqVD314O4uYT4eYpVTjxdalFP/2n0MKALVgv4vw hEOwN1NPwB22ZjqzlHOct9C2LEA5+qXnejT49ZV3ds30hg9Et/Ih58SEe0X6wkQqzL 19Pe1IxP3O2LbKVTEYdA8c84TNXPEi2z1la15ogU8/MKcCIHV70KCJ8eKm2qqg5j2D TVQclgHRcz61Q== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 15/15] selftests: mptcp: sockopt: replace mptcp_inq with sockopt Date: Sun, 12 Jul 2026 17:54:21 +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 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