From nobody Sun Dec 14 02:01:13 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 A08D51F1315 for ; Sat, 7 Jun 2025 08:55:08 +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=1749286508; cv=none; b=EfB4L12gidbYjUeO2yrXYSbeDwBskg6oRBdxjhAw/7Tjztta4dApwK6sNCVngo16zL9VGdmfeYhzdf7yyRSjyJvfQEXrPsnoX5ouVPoZVJN9jxxCXx6V0e8Tpp29cLblLQnwRuvk2JV9hCK/B5NJbMH3uRlt5ww/CEctER033dQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749286508; c=relaxed/simple; bh=rlPWFbDGn4rfSud+FUNzK8GGdubOHWA050mN1hGDH4E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qzti6vlGrVXB456voIfxbSkuNW+1fnHbyNzDaGVMCep+291cNTcurOWIIW9Vsn+1O1CJa3PgHcTAY3sqeef63lBW6B9vykEKCPwrK3+svKCmT8s4a+CHtg7BYbheYt5ua4SVUwfyUyq/Li+uIgusQlgF37noCBL8XtvWMuKdO8E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=d9YWWeX9; 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="d9YWWeX9" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BDC33C4CEED; Sat, 7 Jun 2025 08:55:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1749286508; bh=rlPWFbDGn4rfSud+FUNzK8GGdubOHWA050mN1hGDH4E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=d9YWWeX9XYykvKixxJpFyHlgCl0GxMvCTRHzdsYvISP4i9qUg0p0ts4VqagHoQh8g l2ieUY34W3l2QwFpvKcNCb7Eu5c8Ar1X7xHHOzeJ2zsCFtgdG7/VSxRWuh98RosRE5 Xs9yjPNC5GRbMKd1GPBz1qEiQ3fcg7BtJsdlR1Ytt0LpEaOjfIqs4XMD1wjLse4aCB Oza5oeU4nIGyounTQnL16Zl1g305LHyf/IRug5SlEINV5WIA+sMbhnAdBqBTRv3oUh jywvBCkq12h27IkrnPFz1BMxSJMn4jy05S7ZRm70mVUBomj9mkhfN+HxsEYs6eC41z yaooxJ1Mb83KA== From: Geliang Tang To: mptcp@lists.linux.dev, hare@kernel.org Cc: Geliang Tang Subject: [PATCH mptcp-next v2 1/4] mptcp: use sk_eat_skb in recvmsg_mskq Date: Sat, 7 Jun 2025 08:54:16 +0000 Message-ID: <1da1c1ea356769ec72d0d0b211bb76770bc7e527.1749286212.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.43.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 This patch uses sk_eat_skb() helper in __mptcp_recvmsg_mskq() instead of open-coding it. Signed-off-by: Geliang Tang --- net/mptcp/protocol.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 7a52c127b60a..7fc940a60b3d 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1890,8 +1890,7 @@ static int __mptcp_recvmsg_mskq(struct sock *sk, skb->destructor =3D NULL; atomic_sub(skb->truesize, &sk->sk_rmem_alloc); sk_mem_uncharge(sk, skb->truesize); - __skb_unlink(skb, &sk->sk_receive_queue); - __kfree_skb(skb); + sk_eat_skb(sk, skb); msk->bytes_consumed +=3D count; } =20 --=20 2.43.0 From nobody Sun Dec 14 02:01:13 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 87C481F1315 for ; Sat, 7 Jun 2025 08:55:10 +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=1749286510; cv=none; b=nGr2wkPLES8DIvwgucA/GdNCHLVUBWUiw4VEptEg9zGL07H7WpmEuLUnrLQEDeOJ1jRrr2VvD/4Hnxoohh7npdrep84T8pZQ88zQXfupWWefP7+sd90M9outCIw4HGzSCwpWHkCc7yNjrJn3aj0Pc3UVxr2wAjHd3jFJO41cMHM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749286510; c=relaxed/simple; bh=iXP+eXD0Iko8Ej1JcFgDkE0uBeEgKk3crTkDqsVbG1o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZT7VM84ijtCT66QqwhaqjYFH8Mwh0UZw8vusk3v34phq+A0uj1ZIJnQS3fAe9qzj3eTwvje6AKyO9fDy5JcceB6parmEtFmrAa1zVmjIGOefwqpxBUnLz/YcPYlSzocqpFjUT5TqSETBaQtXUCnQkPxOCC6SQB8NQzk7Ui5t/3E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=d3NinwLy; 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="d3NinwLy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C8BD8C4CEE4; Sat, 7 Jun 2025 08:55:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1749286510; bh=iXP+eXD0Iko8Ej1JcFgDkE0uBeEgKk3crTkDqsVbG1o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=d3NinwLyuMsj6ECbVSjs41AvBYVBYIwV0K+/rZd1wZWpv588/QicEewOqftdHV1hu NyTiegRQ+rNMUTrFXBmLjnOt/HRv95fMx65su32C4/O1/V8ROuND/9nS7Q27GEg/3V goxtNxDgrAnTw3iGjbaCnT8zIeGeBBE8NUReNNiDk44Cw+Y/+eJSdjT3dDr1lCBi8e a65qqNQuOUFMqfGwpmrNLOw6T6ub9BB4wZ7a3QDb35xWBX+VxVFrqj0nin9auaWGb1 9iFMwSNR+y9h09qPtAk6vXfOC8nUmxlwo9kz6Dbc/t+Ww5fBQH8u3UyHd9Do3lnzPs UodoEFjN4V0wg== From: Geliang Tang To: mptcp@lists.linux.dev, hare@kernel.org Cc: Geliang Tang Subject: [PATCH mptcp-next v2 2/4] mptcp: implement .read_sock Date: Sat, 7 Jun 2025 08:54:17 +0000 Message-ID: <32cc946892d634a14cdf4373c1b9d47126162e5a.1749286212.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.43.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 nvme_tcp_try_recv() needs to call .read_sock interface of struct proto_ops, but it is not implemented in MPTCP. This patch implements it with reference to __mptcp_recvmsg_mskq(). v2: - first check the sk_state (Matt), but not look for the end of the end of a connection like TCP in __tcp_read_sock(): if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) break; This will cause a use-after-free error: BUG: KASAN: slab-use-after-free in mptcp_read_sock. Reviewed-by: Hannes Reinecke Signed-off-by: Geliang Tang --- net/mptcp/protocol.c | 61 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 7fc940a60b3d..da4242e48246 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3956,6 +3956,65 @@ static __poll_t mptcp_poll(struct file *file, struct= socket *sock, return mask; } =20 +/* + * Note: + * - It is assumed that the socket was locked by the caller. + */ +static int mptcp_read_sock(struct sock *sk, read_descriptor_t *desc, + sk_read_actor_t recv_actor) +{ + struct mptcp_sock *msk =3D mptcp_sk(sk); + struct scm_timestamping_internal tss; + struct sk_buff *skb, *tmp; + size_t len =3D INT_MAX; + int copied =3D 0; + + if (sk->sk_state =3D=3D TCP_LISTEN) + return -ENOTCONN; + skb_queue_walk_safe(&sk->sk_receive_queue, skb, tmp) { + u32 offset =3D MPTCP_SKB_CB(skb)->offset; + u32 data_len =3D skb->len - offset; + u32 size =3D min_t(size_t, len - copied, data_len); + int count; + + count =3D recv_actor(desc, skb, offset, size); + if (count <=3D 0) { + if (!copied) + copied =3D count; + break; + } + + if (MPTCP_SKB_CB(skb)->has_rxtstamp) + tcp_update_recv_tstamps(skb, &tss); + + copied +=3D count; + + if (count < data_len) { + MPTCP_SKB_CB(skb)->offset +=3D count; + MPTCP_SKB_CB(skb)->map_seq +=3D count; + msk->bytes_consumed +=3D count; + break; + } + + /* avoid the indirect call, we know the destructor is sock_wfree */ + skb->destructor =3D NULL; + atomic_sub(skb->truesize, &sk->sk_rmem_alloc); + sk_mem_uncharge(sk, skb->truesize); + sk_eat_skb(sk, skb); + msk->bytes_consumed +=3D count; + + if (copied >=3D len) + break; + } + + mptcp_rcv_space_adjust(msk, copied); + + if (copied > 0) + mptcp_cleanup_rbuf(msk, copied); + + return copied; +} + static const struct proto_ops mptcp_stream_ops =3D { .family =3D PF_INET, .owner =3D THIS_MODULE, @@ -3976,6 +4035,7 @@ static const struct proto_ops mptcp_stream_ops =3D { .recvmsg =3D inet_recvmsg, .mmap =3D sock_no_mmap, .set_rcvlowat =3D mptcp_set_rcvlowat, + .read_sock =3D mptcp_read_sock, }; =20 static struct inet_protosw mptcp_protosw =3D { @@ -4080,6 +4140,7 @@ static const struct proto_ops mptcp_v6_stream_ops =3D= { .compat_ioctl =3D inet6_compat_ioctl, #endif .set_rcvlowat =3D mptcp_set_rcvlowat, + .read_sock =3D mptcp_read_sock, }; =20 static struct proto mptcp_v6_prot; --=20 2.43.0 From nobody Sun Dec 14 02:01:13 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 6643D1F1315 for ; Sat, 7 Jun 2025 08:55:12 +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=1749286512; cv=none; b=q4ucvFKbHhOs2lIUc/PIq6HWUQkY3G5Ol6Pb7qWy5PbzK9N7cEJ38j3RJauLd8MIyW5ouvjI0pI0U0G2MYPf4eBdCS3xEfNeKyfHCsD+wL5snPiV2xeMiiO633xZFHbhEHHIWi6NmfZHsliYJVYRNMO0o4fmcuR/CtUwJ23AKS4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749286512; c=relaxed/simple; bh=Goj/UNQF3rHpV/V+ozNJvLsBVhQLUnwuzBq9mk1aa2g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=s60k6iG0OB94NMAhCsO5x7IHAFyGchX2tJHZHFIFEJXXGhfr8hgvlLwp8a351Eb/ftoCMX99d4s1xUI/ltVlBhZKohU5NiftA3s7Z0psGieZUaPsKPpqUx3m83PnZmnMO009IlviPSkpw8cnhGeL0oET7Y2gEsGAPHznRmimS9s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WHYD5f7R; 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="WHYD5f7R" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8DB68C4CEED; Sat, 7 Jun 2025 08:55:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1749286512; bh=Goj/UNQF3rHpV/V+ozNJvLsBVhQLUnwuzBq9mk1aa2g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WHYD5f7RqzD5fCLgLIjDVXihg5MHWuk400h4r8RDjjQ+ekohvNIm5mP107eD954Lz b4SUoAwuEKSY7BdyKFzynyupit30Cm2WrXK3L4+f0U/Dgnb0e7hGK5EmdJzrHkVxkA rUi+bJ5L9fzPUuefJOOReJRJ+pp0JGt4u+JpBCCvQb2KDWjG8hZK3uERnhS5Qd5cku ZH57v3qiX4XFdL+Znv51x1eOfkKhYQ7k6qaAAZTMpSooD1ejlQvEBshpawGBAcrlaY rWbM8SGnB3imxtNweQtRacafa07hMdyF593gN+a1oeQV5wQw5VHF/7+/BF20BQ61ZO Ni01vHg2fadTw== From: Geliang Tang To: mptcp@lists.linux.dev, hare@kernel.org Cc: Geliang Tang Subject: [PATCH mptcp-next v2 3/4] mptcp: set .splice_read Date: Sat, 7 Jun 2025 08:54:18 +0000 Message-ID: X-Mailer: git-send-email 2.43.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 This patch sets .splice_read interface of mptcp struct proto_ops as tcp_splice_read. And invoke .read_sock in __tcp_splice_read(). Signed-off-by: Geliang Tang --- net/ipv4/tcp.c | 6 ++++++ net/mptcp/protocol.c | 2 ++ 2 files changed, 8 insertions(+) diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index f2916aef1cf9..f9a9f8726be5 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -779,6 +779,12 @@ static int __tcp_splice_read(struct sock *sk, struct t= cp_splice_state *tss) .arg.data =3D tss, .count =3D tss->len, }; + const struct proto_ops *ops; + + ops =3D READ_ONCE(sk->sk_socket->ops); + + if (likely(ops->read_sock)) + return ops->read_sock(sk, &rd_desc, tcp_splice_data_recv); =20 return tcp_read_sock(sk, &rd_desc, tcp_splice_data_recv); } diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index da4242e48246..32d389329262 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -4036,6 +4036,7 @@ static const struct proto_ops mptcp_stream_ops =3D { .mmap =3D sock_no_mmap, .set_rcvlowat =3D mptcp_set_rcvlowat, .read_sock =3D mptcp_read_sock, + .splice_read =3D tcp_splice_read, }; =20 static struct inet_protosw mptcp_protosw =3D { @@ -4141,6 +4142,7 @@ static const struct proto_ops mptcp_v6_stream_ops =3D= { #endif .set_rcvlowat =3D mptcp_set_rcvlowat, .read_sock =3D mptcp_read_sock, + .splice_read =3D tcp_splice_read, }; =20 static struct proto mptcp_v6_prot; --=20 2.43.0 From nobody Sun Dec 14 02:01:13 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 1972D1F1315 for ; Sat, 7 Jun 2025 08:55:14 +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=1749286514; cv=none; b=Pl6ri7J1bQEGT3hzx5fWaTo2R2hDX/qmc1D3HUg+h4bi0nTzBYZjDrmgRMKvmbdxCCVWV636jHLYOyWFXT+eQWuCUftyThBE3bsymndR3NkgrOuXmbLDvPf8z94B8Cvbwow4/fY54zSg3zGmLRV7cY+ehhJIHMkqRXVs7NCoZDc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749286514; c=relaxed/simple; bh=6jTBX2P/L7dqAlV3vekCvy5AMbcwZq5wYQfVnNhLLBE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Cv0Im2RQYn2y5Dt28Ykr2s8aO/4/AxHoqBgldXexRKdOu2HtccNyYm0IlpySHR/0/2MC6HbS/wmdLqQ8sXzF7Ywb8DHyvzrQsuAf1GCqBcDukB+pZWrIqM4lbfuQa8GCKVsNHACTDtu8V1z83D1YgLQJ46ZgHHhMJSAwIB7ie3A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=utU7LmeY; 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="utU7LmeY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 95D54C4CEED; Sat, 7 Jun 2025 08:55:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1749286513; bh=6jTBX2P/L7dqAlV3vekCvy5AMbcwZq5wYQfVnNhLLBE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=utU7LmeYzFavsbqtjFsRvcABJWdfRoBFuaA06QHkuHnyiRjyNwP7+rts+hBAU3/Jk atEJ/bBv/nGvl1FWhl8wwDqalHUjR3bmD08ZZw85gQzwyAzA0bXyezA1xw2zyqGjwv A1KibvHSSLWC932shbsroECh8WiurmfbBJr4RjKLFKiFwyN8gFS/yCSmkVuN/9RV/T R3RE7Mw6XS1mwkEwPajFg7Uju6fwdD8dgADPTh3mdFWTgVSM1qG19FhQy/UiD0Z7E+ c3myaFfa4dM9Smg4rnEaLtc6WuIG0sbmcIwAkFAKUgG2bL0hU5Z42PDFpDhDdb6WkV ZCQv/chm3L9KQ== From: Geliang Tang To: mptcp@lists.linux.dev, hare@kernel.org Cc: Geliang Tang Subject: [PATCH mptcp-next v2 4/4] selftests: mptcp: add splice test Date: Sat, 7 Jun 2025 08:54:19 +0000 Message-ID: X-Mailer: git-send-email 2.43.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 This patch adds a mptcp socket splice test named mptcp_splice. And a new test in mptcp_join.sh. Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/Makefile | 2 +- .../testing/selftests/net/mptcp/mptcp_join.sh | 20 ++ .../selftests/net/mptcp/mptcp_splice.c | 201 ++++++++++++++++++ 3 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/net/mptcp/mptcp_splice.c diff --git a/tools/testing/selftests/net/mptcp/Makefile b/tools/testing/sel= ftests/net/mptcp/Makefile index e47788bfa671..b8c3ffe649f8 100644 --- a/tools/testing/selftests/net/mptcp/Makefile +++ b/tools/testing/selftests/net/mptcp/Makefile @@ -7,7 +7,7 @@ CFLAGS +=3D -Wall -Wl,--no-as-needed -O2 -g -I$(top_srcdir)= /usr/include $(KHDR_INC TEST_PROGS :=3D mptcp_connect.sh pm_netlink.sh mptcp_join.sh diag.sh \ simult_flows.sh mptcp_sockopt.sh userspace_pm.sh =20 -TEST_GEN_FILES =3D mptcp_connect pm_nl_ctl mptcp_sockopt mptcp_inq mptcp_d= iag +TEST_GEN_FILES =3D mptcp_connect pm_nl_ctl mptcp_sockopt mptcp_inq mptcp_d= iag mptcp_splice =20 TEST_FILES :=3D mptcp_lib.sh settings =20 diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testin= g/selftests/net/mptcp/mptcp_join.sh index b8af65373b3a..fccbe50d3486 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh @@ -3946,6 +3946,25 @@ endpoint_tests() fi } =20 +splice_tests() +{ + if reset "splice test"; then + mptcp_lib_pm_nl_set_limits $ns1 8 8 + mptcp_lib_pm_nl_set_limits $ns2 8 8 + mptcp_lib_pm_nl_add_endpoint $ns2 10.0.2.2 dev ns2eth2 flags subflow + mptcp_lib_pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow + mptcp_lib_pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow + + ip netns exec $ns1 ./mptcp_splice -l -o "$sout" -p 8080 & + local tests_pid=3D$! + sleep 1 + ip netns exec $ns2 ./mptcp_splice -i "$cin" -a 10.0.1.1 -p 8080 + mptcp_lib_kill_wait $tests_pid + check_transfer "$cin" "$sout" "file received by server" 1052 + chk_join_nr 3 3 3 + fi +} + # [$1: error message] usage() { @@ -3994,6 +4013,7 @@ all_tests_sorted=3D( F@fail_tests u@userspace_tests I@endpoint_tests + L@splice_tests ) =20 all_tests_args=3D"" diff --git a/tools/testing/selftests/net/mptcp/mptcp_splice.c b/tools/testi= ng/selftests/net/mptcp/mptcp_splice.c new file mode 100644 index 000000000000..a04ab7e1448d --- /dev/null +++ b/tools/testing/selftests/net/mptcp/mptcp_splice.c @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2025, Kylin Software */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef IPPROTO_MPTCP +#define IPPROTO_MPTCP 262 +#endif + +#define BUFFER_SIZE 65536 + +char *server_ip; +int port; + +static int server(char *output) +{ + int server_fd, client_fd, out_fd; + struct sockaddr_in address; + int addrlen =3D sizeof(address); + int pipefd[2]; + ssize_t bytes; + int opt =3D 1; + + server_fd =3D socket(AF_INET, SOCK_STREAM, IPPROTO_MPTCP); + if (server_fd < 0) { + perror("socket failed"); + exit(EXIT_FAILURE); + } + + if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, + &opt, sizeof(opt))) { + perror("setsockopt"); + exit(EXIT_FAILURE); + } + + address.sin_family =3D AF_INET; + address.sin_addr.s_addr =3D INADDR_ANY; + address.sin_port =3D htons(port); + + if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { + perror("bind failed"); + exit(EXIT_FAILURE); + } + + if (listen(server_fd, 3) < 0) { + perror("listen"); + exit(EXIT_FAILURE); + } + + printf("Server listening on port %d...\n", port); + + client_fd =3D accept(server_fd, (struct sockaddr *)&address, + (socklen_t *)&addrlen); + if (client_fd < 0) { + perror("accept"); + exit(EXIT_FAILURE); + } + + printf("Client connected. Receiving file...\n"); + + if (pipe(pipefd)) { + perror("pipe"); + exit(EXIT_FAILURE); + } + + out_fd =3D open(output, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (out_fd < 0) { + perror("open"); + exit(EXIT_FAILURE); + } + + while ((bytes =3D splice(client_fd, NULL, pipefd[1], NULL, BUFFER_SIZE, + SPLICE_F_MOVE | SPLICE_F_MORE)) > 0) { + splice(pipefd[0], NULL, out_fd, NULL, bytes, SPLICE_F_MOVE | SPLICE_F_MO= RE); + } + + if (bytes =3D=3D -1) + perror("splice"); + + printf("File transfer completed. Received %ld bytes.\n", + lseek(out_fd, 0, SEEK_CUR)); + + close(client_fd); + close(out_fd); + close(server_fd); + + return 0; +} + +static int client(char *input) +{ + struct sockaddr_in serv_addr; + int sock_fd, in_fd; + int pipefd[2]; + ssize_t bytes; + + sock_fd =3D socket(AF_INET, SOCK_STREAM, IPPROTO_MPTCP); + if (sock_fd < 0) { + perror("Socket creation error"); + exit(EXIT_FAILURE); + } + + serv_addr.sin_family =3D AF_INET; + serv_addr.sin_port =3D htons(port); + + if (inet_pton(AF_INET, server_ip, &serv_addr.sin_addr) <=3D 0) { + perror("Invalid address/ Address not supported"); + exit(EXIT_FAILURE); + } + + if (connect(sock_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < = 0) { + perror("Connection Failed"); + exit(EXIT_FAILURE); + } + + printf("Connected to server. Sending file...\n"); + + if (pipe(pipefd)) { + perror("pipe"); + exit(EXIT_FAILURE); + } + + in_fd =3D open(input, O_RDONLY); + if (in_fd =3D=3D -1) { + perror("open"); + exit(EXIT_FAILURE); + } + + while ((bytes =3D splice(in_fd, NULL, pipefd[1], NULL, BUFFER_SIZE, + SPLICE_F_MOVE | SPLICE_F_MORE)) > 0) { + splice(pipefd[0], NULL, sock_fd, NULL, bytes, SPLICE_F_MOVE | SPLICE_F_M= ORE); + } + + if (bytes =3D=3D -1) + perror("splice"); + + printf("File transfer completed. Sent %ld bytes.\n", + lseek(in_fd, 0, SEEK_CUR)); + + shutdown(sock_fd, SHUT_WR); + close(in_fd); + close(sock_fd); + + return 0; +} + +static void die_usage(void) +{ + fprintf(stderr, "Usage: mptcp_splice -l -p -o \n"); + fprintf(stderr, " mptcp_splice -a -p -i \= n"); + exit(EXIT_FAILURE); +} + +int main(int argc, char *argv[]) +{ + char *input =3D "", *output =3D ""; + bool listen_mode =3D false; + int c; + + if (argc < 2) + die_usage(); + + while ((c =3D getopt(argc, argv, "hli:o:a:p:")) !=3D -1) { + switch (c) { + case 'h': + die_usage(); + break; + case 'l': + listen_mode =3D true; + break; + case 'i': + input =3D optarg; + break; + case 'o': + output =3D optarg; + break; + case 'a': + server_ip =3D optarg; + break; + case 'p': + port =3D atoi(optarg); + break; + default: + die_usage(); + break; + } + } + + if (listen_mode) + return server(output); + return client(input); +} --=20 2.43.0