From nobody Wed Sep 17 18:21:57 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 47B9A301461 for ; Tue, 26 Aug 2025 09:30:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200600; cv=none; b=Hj3KhJoh5A/p6JS6+ri9u4bw2+8MJoMdL62R78KZMNnSnaQol08IFonafTdqLsNC01TaHhcvtash1uMJNXbc4Tx6OewGCxHXDKDvXTbPvCGrenj326af0j4tFMCv7fZE4DHVjnaKlvev2tkOZ1B/n3Ds3aVdF8l8WJQQCaF22Ks= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756200600; c=relaxed/simple; bh=1JKAgF3adNToiZlKgOw2VSPvIYOIgDY9GzF5zcvyzrA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KKbfyuSgzcG9Cpc7Lhbg2Cd5x78ezphQbUaT0X997+E9qs3EbgOG+yl9uC259keDQCIBA0Vq8WtwH+nY0fBr1JfMY9CLQogi+g5L/kEEgg2jMRDxA7DNRj3YJq/j8hbjP/rrkkt9JV5F7YCLBze36oO0IDtnshGKinrTCXHcwDE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UvKAHI+r; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UvKAHI+r" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2D07EC4CEF1; Tue, 26 Aug 2025 09:29:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756200600; bh=1JKAgF3adNToiZlKgOw2VSPvIYOIgDY9GzF5zcvyzrA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UvKAHI+r64kob1/hsZxlOESf8Pzj7iNg8A090UCB4dEAseEzpQhdRHXUHtB7fHcla dn53oNQkWicg8lrJ2NL0LdVlYk0the4ekUj1dWV3MlxJm8MQhQ01P51rL9YDLqP+HL xzBj061mWVEZKIe7EBd+Kzn2MPk4m/910FkbuFkvXDmKGD9l/CbDORD87ecNeP4cB4 huYkaZAXnHQWraAbO3QtR8llceZ1BynPYbQJgTsRTQFRniIxbKQherkhrBoDX9TFaB tcszINSXP3w7u2/ioqgfZqhdWahkM0mZ2sEFLGByZ7701IF6wIdjcUGAfANalAdzFF nqOrZseCg5jvw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v3 09/14] selftests: mptcp: sockopt: add large data transfer tests Date: Tue, 26 Aug 2025 17:29:33 +0800 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Introduces large data transfer tests (1-17 MB) to validate MPTCP socket options under high-volume conditions, including proper EOF handling, preparing for TCP_INQ support in subsequent patches. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/mptcp_sockopt.c | 90 ++++++++++++++++++- 1 file changed, 88 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/test= ing/selftests/net/mptcp/mptcp_sockopt.c index 675ed2dcee9f..fc65157a41ee 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c @@ -620,10 +620,12 @@ static void connect_one_server(int fd, int unixfd) /* un-block server */ ret =3D read(unixfd, buf2, 4); assert(ret =3D=3D 4); - close(unixfd); =20 assert(strncmp(buf2, "xmit", 4) =3D=3D 0); =20 + ret =3D write(unixfd, &len, sizeof(len)); + assert(ret =3D=3D (ssize_t)sizeof(len)); + ret =3D write(fd, buf, len); if (ret < 0) die_perror("write"); @@ -659,14 +661,51 @@ static void connect_one_server(int fd, int unixfd) total +=3D 1; /* sequence advances due to FIN */ =20 assert(s.mptcpi_rcv_delta ? s.mptcpi_rcv_delta =3D=3D (uint64_t)total : t= rue); + + ret =3D read(unixfd, buf2, 4); + assert(strncmp(buf2, "huge", 4) =3D=3D 0); + + total =3D rand() % (16 * 1024 * 1024); + total +=3D (1 * 1024 * 1024); + + ret =3D write(unixfd, &total, sizeof(total)); + assert(ret =3D=3D (ssize_t)sizeof(total)); + + while (total > 0) { + if (total > sizeof(buf)) + len =3D sizeof(buf); + else + len =3D total; + + ret =3D write(fd, buf, len); + if (ret < 0) + die_perror("write"); + total -=3D ret; + + /* we don't have to care about buf content, only + * number of total bytes sent + */ + } + + ret =3D read(unixfd, buf2, 4); + assert(ret =3D=3D 4); + assert(strncmp(buf2, "shut", 4) =3D=3D 0); + + ret =3D write(fd, buf, 1); + assert(ret =3D=3D 1); close(fd); + ret =3D write(unixfd, "closed", 6); + assert(ret =3D=3D 6); + + close(unixfd); } =20 static void process_one_client(int fd, int unixfd) { - ssize_t ret, ret2, ret3; + ssize_t ret, ret2, ret3, tot; char msg_buf[4096]; struct so_state s; + size_t expect_len; char buf[4096]; struct iovec iov =3D { .iov_base =3D buf, @@ -678,6 +717,7 @@ static void process_one_client(int fd, int unixfd) .msg_control =3D msg_buf, .msg_controllen =3D sizeof(msg_buf), }; + char tmp[16]; =20 memset(&s, 0, sizeof(s)); do_getsockopts(&s, fd, 0, 0); @@ -685,6 +725,12 @@ static void process_one_client(int fd, int unixfd) ret =3D write(unixfd, "xmit", 4); assert(ret =3D=3D 4); =20 + ret =3D read(unixfd, &expect_len, sizeof(expect_len)); + assert(ret =3D=3D (ssize_t)sizeof(expect_len)); + + if (expect_len > sizeof(buf)) + xerror("expect len %zu exceeds buffer size", expect_len); + /* read one byte, expect cmsg to return expected - 1 */ ret =3D recvmsg(fd, &msg, 0); if (ret < 0) @@ -703,6 +749,9 @@ static void process_one_client(int fd, int unixfd) if (s.tcpi_rcv_delta) assert(s.tcpi_rcv_delta =3D=3D (uint64_t)ret); =20 + /* should have gotten exact remainder of all pending data */ + assert(ret =3D=3D (ssize_t)expect_len - 1); + ret2 =3D write(fd, buf, ret); if (ret2 < 0) die_perror("write"); @@ -727,6 +776,43 @@ static void process_one_client(int fd, int unixfd) s.last_sample.mptcpi_bytes_acked - ret2); } =20 + /* request a large swath of data. */ + ret =3D write(unixfd, "huge", 4); + assert(ret =3D=3D 4); + + ret =3D read(unixfd, &expect_len, sizeof(expect_len)); + assert(ret =3D=3D (ssize_t)sizeof(expect_len)); + + /* peer should send us a few mb of data */ + if (expect_len <=3D sizeof(buf)) + xerror("expect len %zu too small\n", expect_len); + + tot =3D 0; + do { + iov.iov_len =3D sizeof(buf); + ret =3D recvmsg(fd, &msg, 0); + if (ret < 0) + die_perror("recvmsg"); + + tot +=3D ret; + } while ((size_t)tot < expect_len); + + ret =3D write(unixfd, "shut", 4); + assert(ret =3D=3D 4); + + /* wait for hangup. Should have received one more byte of data. */ + ret =3D read(unixfd, tmp, sizeof(tmp)); + assert(ret =3D=3D 6); + assert(strncmp(tmp, "closed", 6) =3D=3D 0); + + sleep(1); + + iov.iov_len =3D 1; + ret =3D recvmsg(fd, &msg, 0); + if (ret < 0) + die_perror("recvmsg"); + assert(ret =3D=3D 1); + /* wait for hangup */ iov.iov_len =3D 1; ret3 =3D recvmsg(fd, &msg, 0); --=20 2.48.1