From nobody Sun Feb 8 13:13:01 2026 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 56146148FF6 for ; Fri, 4 Oct 2024 12:51:03 +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=1728046263; cv=none; b=kHRxyoHdeSMaiyB1+BSvPJNwr0FJ6i0/aSuCmfcO2APtKhigq4zX9SWWjSbNYvn28xf/9jAgcsv146lspr8V+C0jbC4ViQSw9Tyv9hzK62tArmrSb8q8MXHvOpzfGVtNWO+EureXFtY9MsRjjWgkia1ANKp2hjXaJ9CtMwNtYzY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728046263; c=relaxed/simple; bh=TNhoiMjMuRV0q6ikbbbcSagg77q1gkuJcavG4tqvUnI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EXRDT+Bu3D8txH84NGRVN4GFF6g3Vijt4OFHqWYS6+HkR1KQe6lCzlwVe8CII5n0QWL5g44vcGNXA9tlCPV+b5rL7qH3NOpwcqdQch8LlhQK2kSLcmpsWfyWPIZqbPs5dURRf92t5mdxktegGmzSnBafOzlMrVwt5Ie4Y29K6gM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=J07ILc6/; 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="J07ILc6/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 25365C4DE13; Fri, 4 Oct 2024 12:51:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1728046263; bh=TNhoiMjMuRV0q6ikbbbcSagg77q1gkuJcavG4tqvUnI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=J07ILc6//jG540YEN6d2mGbsnSRGXyf2pCiY7cFxila1TPZbXgAYBsSvlQ4jFroyO c3uqO2c9ib9tLSDk6KiRiyJmfMNjFKi77a+nxO5EuvwnwrBGI3MkkCtjSK6zsvjqNe K8Lv05wON+C0vpgMNDU/xhlFyheVRaEaIBRyTjxMmumC4BC0g/Q/kXL0kslgSGxPLj 3eFdL9PGwc1ytXzou16m0kQMCRD3xOiqSkdeq2HRApiN9RvJIFnUZmt13Q6XrP8mCJ IRckZGeTaxiLd1hKoK8FA5yClAtuokCU0GqWhrGnjO9C0bJSXGJY9Kz43+8zXtVulZ WdH7xeYDJwJAg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 1/7] bpf: Register mptcp common kfunc set Date: Fri, 4 Oct 2024 20:50:47 +0800 Message-ID: <123f59dc2484dabb2552f0fe49a69983d327683f.1728046021.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 Helpers mptcp_sk(), mptcp_subflow_ctx() and mptcp_subflow_tcp_sock() are useful in MPTCP BPF programs. This patch defines corresponding wrappers of them, and put the wrappers into mptcp common kfunc set and register the set with BPF_PROG_TYPE_UNSPEC. Two other kfuncs mptcp_subflow_active() and mptcp_subflow_set_scheduled() are going to be used in mptcp_subflow bpf_iter selftest, put them into mptcp common kfunc set too. Signed-off-by: Geliang Tang --- net/mptcp/bpf.c | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c index 6414824402e6..c8bc18dff85d 100644 --- a/net/mptcp/bpf.c +++ b/net/mptcp/bpf.c @@ -205,6 +205,23 @@ __diag_push(); __diag_ignore_all("-Wmissing-prototypes", "kfuncs which will be used in BPF programs"); =20 +__bpf_kfunc struct mptcp_sock *bpf_mptcp_sk(struct sock *sk) +{ + return mptcp_sk(sk); +} + +__bpf_kfunc struct mptcp_subflow_context * +bpf_mptcp_subflow_ctx(const struct sock *sk) +{ + return mptcp_subflow_ctx(sk); +} + +__bpf_kfunc struct sock * +bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) +{ + return mptcp_subflow_tcp_sock(subflow); +} + __bpf_kfunc struct mptcp_subflow_context * bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned= int pos) { @@ -220,10 +237,21 @@ __bpf_kfunc bool bpf_mptcp_subflow_queues_empty(struc= t sock *sk) =20 __diag_pop(); =20 -BTF_KFUNCS_START(bpf_mptcp_sched_kfunc_ids) +BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids) +BTF_ID_FLAGS(func, bpf_mptcp_sk) +BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx) +BTF_ID_FLAGS(func, bpf_mptcp_subflow_tcp_sock) BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled) -BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos) BTF_ID_FLAGS(func, mptcp_subflow_active) +BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids) + +static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set =3D { + .owner =3D THIS_MODULE, + .set =3D &bpf_mptcp_common_kfunc_ids, +}; + +BTF_KFUNCS_START(bpf_mptcp_sched_kfunc_ids) +BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos) BTF_ID_FLAGS(func, mptcp_set_timeout) BTF_ID_FLAGS(func, mptcp_wnd_end) BTF_ID_FLAGS(func, tcp_stream_memory_free) @@ -241,6 +269,8 @@ static int __init bpf_mptcp_kfunc_init(void) int ret; =20 ret =3D register_btf_fmodret_id_set(&bpf_mptcp_fmodret_set); + ret =3D ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_UNSPEC, + &bpf_mptcp_common_kfunc_set); ret =3D ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_STRUCT_OPS, &bpf_mptcp_sched_kfunc_set); #ifdef CONFIG_BPF_JIT --=20 2.43.0 From nobody Sun Feb 8 13:13:01 2026 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 708B3148FF6 for ; Fri, 4 Oct 2024 12:51:05 +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=1728046265; cv=none; b=TajcwEZ4643WbVgke6x2/ExBINv0Jiz1+Q7BJa7hTOqWWLD2razf5/u4+LhyH5kcQOtHffpcayu2xfFgZ79GBe68zF8TXFHYIhf7NG3dPh/DwVk1XDXXrB4QPZFzpxH5JHPo6U+bSP8wxDS8srFGldrjPd6wG6c/+3wd5vS2e9Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728046265; c=relaxed/simple; bh=O1htgLgO+7Td8JamHEr01Fptmb+sf0FY9hvLQG6kjOM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AB+u+BQ97bTSX4vPkNtdqrDIFXaLCd0vzj9EPnF2XqMJkHFL4XW4Rld4lKnRChS7dGhkUJkomervZ2SnNrZ5BiWkC2dpwyEn5bXRUu/712AWCzuQurju+H02pMrEtk0kdF3OQviCofqpE1cGi5Qay3dKD6gPqPHsK6vsJQPpwhw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=h3aHGd31; 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="h3aHGd31" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D70BEC4DE1E; Fri, 4 Oct 2024 12:51:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1728046265; bh=O1htgLgO+7Td8JamHEr01Fptmb+sf0FY9hvLQG6kjOM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=h3aHGd313DuwjByV18TEfIvArHGclaY5gVxSD1CNw+OIVj+u3L7hkWkUHocfEq398 jyIdunmFiXFTBFQBE6exggN8jf+bPh4PfbWMrF0EJ0xpJiPCrvuaxzWp6XuT8/i+KV oAVav1WrBb31nuW1wxp1CkDybKhANTrpVGHa/1uZ3EqSBX47HMG+xP5UJcFGHhNYvU PyKENS0vXPEz+Pi5jQjqnAShuRdC61k8INpoNOinjNfje3vfb9/qnrk4lUiR0DZW+C DvjzLVVk8FLHshG+uMPVuXEFWSEJr9PGUk5/hoGfMVYsZ3M2asxwnQdLR0vXz8qthh Z9B/7+QDG/GFA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 2/7] bpf: Add mptcp_subflow bpf_iter Date: Fri, 4 Oct 2024 20:50:48 +0800 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 It's necessary to traverse all subflows on the conn_list of an MPTCP socket and then call kfunc to modify the fields of each subflow. In kernel space, mptcp_for_each_subflow() helper is used for this: mptcp_for_each_subflow(msk, subflow) kfunc(subflow); But in the MPTCP BPF program, this has not yet been implemented. As Martin suggested recently, this conn_list walking + modify-by-kfunc usage fits the bpf_iter use case. So this patch adds a new bpf_iter type named "mptcp_subflow" to do this and implements its helpers bpf_iter_mptcp_subflow_new()/_next()/ _destroy(). And register these bpf_iter mptcp_subflow into mptcp common kfunc set. Then bpf_for_each() for mptcp_subflow can be used in BPF program like this: bpf_for_each(mptcp_subflow, subflow, msk) kfunc(subflow); v2: remove msk->pm.lock in _new() and _destroy() (Martin) drop DEFINE_BPF_ITER_FUNC, change opaque[3] to opaque[2] (Andrii) v3: drop bpf_iter__mptcp_subflow v4: if msk is NULL, initialize kit->msk to NULL in _new() and check it in _next() (Andrii) v5: use list_is_last() instead of list_entry_is_head() add KF_ITER_NEW/NEXT/DESTROY flags add msk_owned_by_me in _new() v6: add KF_TRUSTED_ARGS flag (Andrii, Martin) "Suggested-by: Martin KaFai Lau " Signed-off-by: Geliang Tang --- net/mptcp/bpf.c | 49 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c index c8bc18dff85d..49df9e5d5667 100644 --- a/net/mptcp/bpf.c +++ b/net/mptcp/bpf.c @@ -201,9 +201,16 @@ static const struct btf_kfunc_id_set bpf_mptcp_fmodret= _set =3D { .set =3D &bpf_mptcp_fmodret_ids, }; =20 -__diag_push(); -__diag_ignore_all("-Wmissing-prototypes", - "kfuncs which will be used in BPF programs"); +struct bpf_iter_mptcp_subflow { + __u64 __opaque[2]; +} __attribute__((aligned(8))); + +struct bpf_iter_mptcp_subflow_kern { + struct mptcp_sock *msk; + struct list_head *pos; +} __attribute__((aligned(8))); + +__bpf_kfunc_start_defs(); =20 __bpf_kfunc struct mptcp_sock *bpf_mptcp_sk(struct sock *sk) { @@ -222,6 +229,37 @@ bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_= context *subflow) return mptcp_subflow_tcp_sock(subflow); } =20 +__bpf_kfunc int bpf_iter_mptcp_subflow_new(struct bpf_iter_mptcp_subflow *= it, + struct mptcp_sock *msk) +{ + struct bpf_iter_mptcp_subflow_kern *kit =3D (void *)it; + + kit->msk =3D msk; + if (!msk) + return -EINVAL; + + msk_owned_by_me(msk); + + kit->pos =3D &msk->conn_list; + return 0; +} + +__bpf_kfunc struct mptcp_subflow_context * +bpf_iter_mptcp_subflow_next(struct bpf_iter_mptcp_subflow *it) +{ + struct bpf_iter_mptcp_subflow_kern *kit =3D (void *)it; + + if (!kit->msk || list_is_last(kit->pos, &kit->msk->conn_list)) + return NULL; + + kit->pos =3D kit->pos->next; + return list_entry(kit->pos, struct mptcp_subflow_context, node); +} + +__bpf_kfunc void bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subf= low *it) +{ +} + __bpf_kfunc struct mptcp_subflow_context * bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned= int pos) { @@ -235,7 +273,7 @@ __bpf_kfunc bool bpf_mptcp_subflow_queues_empty(struct = sock *sk) return tcp_rtx_queue_empty(sk); } =20 -__diag_pop(); +__bpf_kfunc_end_defs(); =20 BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids) BTF_ID_FLAGS(func, bpf_mptcp_sk) @@ -243,6 +281,9 @@ BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx) BTF_ID_FLAGS(func, bpf_mptcp_subflow_tcp_sock) BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled) BTF_ID_FLAGS(func, mptcp_subflow_active) +BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_new, KF_ITER_NEW | KF_TRUSTED_AR= GS) +BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_next, KF_ITER_NEXT | KF_RET_NULL) +BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_destroy, KF_ITER_DESTROY) BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids) =20 static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set =3D { --=20 2.43.0 From nobody Sun Feb 8 13:13:01 2026 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 121FD1DC725 for ; Fri, 4 Oct 2024 12:51:07 +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=1728046267; cv=none; b=rU3J129VL3EdSLxOKAorla7fKI2Fy/rSNXAIB0r/FZDqzwJT2zBs6uQmcYW1dMKOvYApRZ3X8gZqlsvlO4dKXQAz02k7P8m8ZuKvHmPBUlNqRdDRPiSXlx5poTYd08KjHKggQW9v9URUZBgNNXqzoh4FmP5AecSMv7TqVn/qV30= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728046267; c=relaxed/simple; bh=N4f5rVYDDgamnmspueWxm9kpAhwX+7YZy1q8g8y7Sno=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ILfTKDLrXtu1BQfajq98x7iNYKVy5Dc5RvYERb7Ycggd9bRmLLLubKyn+Xuvw7dRHUfw1gMb2L6LZcGcbAy2BAKWTwp6e6axENiUvIaM+di4i8jS2Ne4UjjWeYAEwUj3kqTC88Md5cMmGfZxqW7AHeF4f5HM0LatlY5hrtmAppE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OLyNAxPU; 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="OLyNAxPU" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B0A85C4E673; Fri, 4 Oct 2024 12:51:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1728046266; bh=N4f5rVYDDgamnmspueWxm9kpAhwX+7YZy1q8g8y7Sno=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OLyNAxPUgyRdQXvnPcMBltjUJUtAtf+1p99krsGmUPLFImBb8vLFzW/JiBvQvij8Z axJqnMtMc3eOTSVOEANPHK4MpFVoRm5KNrZtxLjBHmQNR/HAd0EODyevZ7gFTiwa1V mImsImne9/BRmpdeN6guzLxvndGQrt67ITvBe96AkJFI8Bw8RcDAhyaHOjHbSxmCSM W7mtbtLp7z/CJKFEB9x5z/9zztOdDCIFK+5C/npWICCss08E2bJhdaYtGk/7tBff0D r27NFMOLWe2gGlIKSD22tDxXem+dmIvHkb3fMVAr2y3Mq/tn2/XRbmkD11uRE/zHTf 9nCJXGwonlQVg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 3/7] bpf: Add mptcp_sock acquire and release helpers Date: Fri, 4 Oct 2024 20:50:49 +0800 Message-ID: <93161d30c383af13faece05d6e47fd75ff61a697.1728046021.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 KF_TRUSTED_ARGS flag is used for bpf_iter_mptcp_subflow_new, it indicates that the all pointer arguments are valid. It's necessary to add a KF_ACQUIRE helper to get valid "msk". This patch adds bpf_mptcp_sock_acquire() and bpf_mptcp_sock_release() helpers for this. Increase sk->sk_refcnt in _acquire() and decrease it in _release(). Register them with KF_ACQUIRE flag and KF_RELEASE flag. Signed-off-by: Geliang Tang --- net/mptcp/bpf.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c index 49df9e5d5667..1dd98765e2d1 100644 --- a/net/mptcp/bpf.c +++ b/net/mptcp/bpf.c @@ -260,6 +260,22 @@ __bpf_kfunc void bpf_iter_mptcp_subflow_destroy(struct= bpf_iter_mptcp_subflow *i { } =20 +__bpf_kfunc struct mptcp_sock *bpf_mptcp_sock_acquire(struct mptcp_sock *m= sk) +{ + struct sock *sk =3D (struct sock *)msk; + + if (sk && refcount_inc_not_zero(&sk->sk_refcnt)) + return msk; + return NULL; +} + +__bpf_kfunc void bpf_mptcp_sock_release(struct mptcp_sock *msk) +{ + struct sock *sk =3D (struct sock *)msk; + + WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt)); +} + __bpf_kfunc struct mptcp_subflow_context * bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned= int pos) { @@ -284,6 +300,8 @@ BTF_ID_FLAGS(func, mptcp_subflow_active) BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_new, KF_ITER_NEW | KF_TRUSTED_AR= GS) BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_next, KF_ITER_NEXT | KF_RET_NULL) BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_destroy, KF_ITER_DESTROY) +BTF_ID_FLAGS(func, bpf_mptcp_sock_acquire, KF_ACQUIRE | KF_RET_NULL) +BTF_ID_FLAGS(func, bpf_mptcp_sock_release, KF_RELEASE) BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids) =20 static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set =3D { --=20 2.43.0 From nobody Sun Feb 8 13:13:01 2026 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 D52DD148FF6 for ; Fri, 4 Oct 2024 12:51: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=1728046268; cv=none; b=hq63kN8hTxzVXNa5mnFTbyHe3xyjBiqvixvd+cdmlKzgTmooPxieL4GWw8ky2samtK00GG3wm7vWnSF539oWi23l+bK42HCZ6L0UrGQs1XfSUyK9yjtwyquwTl0sy9U+4D/VFWHyihL1jn+qPsPw+o7GXhjYkIp5vrhcdIB0NfM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728046268; c=relaxed/simple; bh=y8csAOl3RyE9Mf54rOn42XkriCJxKz+lbdbLXSwnqQY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=k65/vvVfCZUWvGWg2XPXeIeM5fVjTz3mioWb05/46IM0FQWaQlegz2fJvjtjeQy0v4JMYCLqu7mn0UXBXbZwp8Zj1p4vRd//F+rqxAOAuFaDrWFtXsdX8FEPgGdo+mT9SFfWKm/+j1O9bbeeezjC1Asc7MRmzqJltFfcwuuuSAw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=VfMFBPwE; 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="VfMFBPwE" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8CEE5C4E66E; Fri, 4 Oct 2024 12:51:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1728046268; bh=y8csAOl3RyE9Mf54rOn42XkriCJxKz+lbdbLXSwnqQY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VfMFBPwEFfyBWSOYh8/XnbrUBJ7Kd4z7gdbyVZiiDvKVixAAh19azw+WpFl0rqItM QRBhE5nqdfmIjmeMFGtTyMRGWaf9UCs8SVwFxoE7T8mDXeXphFKc2RINneH8YAswbb MNXH3+ko3UYbMXEkRyy/qNCf4A3Mo/Ss/Y2bwUjQQA7B47tdtMCaymrDma3rvKn8D8 PK6ED+lfe/ncdbNdpkdpXKRGBFTjsH62xd2uOA19b1UxhVu6/rDGJzn1+p4kFHklHu bD3EUfTRuRGt51+pJzlsw2p570P2/n5LVXmCZBDMKEOC6Sjvfarqihs3xneryABrmG 29CkHp+Tq4W1w== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 4/7] selftests/bpf: Add mptcp_subflow bpf_iter test prog Date: Fri, 4 Oct 2024 20:50:50 +0800 Message-ID: <107c9ba99516663569ccb0031259c7b4cbb1ad95.1728046021.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 adds a ftrace hook for mptcp_sched_get_send() to test the newly added mptcp_subflow bpf_iter. This test simulates a typical mptcp packet scheduler, which selects a subflow from multiple subflows of an mptcp socket to send data. Export mptcp_subflow helpers bpf_iter_mptcp_subflow_new/_next/_destroy, bpf_mptcp_sock_acquire/_release and other helpers into bpf_experimental.h. Use _acquire() to acquire the msk, then use bpf_for_each(mptcp_subflow) to walk the subflow list of this msk. Invoke kfuncs mptcp_subflow_active() and bpf_mptcp_subflow_tcp_sock() in the loop to pick a subsocket. Finally use bpf_mptcp_subflow_ctx() to get the subflow context of this subsocket and use mptcp_subflow_set_scheduled() to set it as being scheduled. Signed-off-by: Geliang Tang --- .../testing/selftests/bpf/bpf_experimental.h | 7 ++++ tools/testing/selftests/bpf/progs/mptcp_bpf.h | 10 +++++ .../selftests/bpf/progs/mptcp_bpf_iter.c | 42 +++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_iter.c diff --git a/tools/testing/selftests/bpf/bpf_experimental.h b/tools/testing= /selftests/bpf/bpf_experimental.h index b0668f29f7b3..d43690b17468 100644 --- a/tools/testing/selftests/bpf/bpf_experimental.h +++ b/tools/testing/selftests/bpf/bpf_experimental.h @@ -575,6 +575,13 @@ extern int bpf_iter_css_new(struct bpf_iter_css *it, extern struct cgroup_subsys_state *bpf_iter_css_next(struct bpf_iter_css *= it) __weak __ksym; extern void bpf_iter_css_destroy(struct bpf_iter_css *it) __weak __ksym; =20 +struct bpf_iter_mptcp_subflow; +extern int bpf_iter_mptcp_subflow_new(struct bpf_iter_mptcp_subflow *it, + struct mptcp_sock *msk) __weak __ksym; +extern struct mptcp_subflow_context * +bpf_iter_mptcp_subflow_next(struct bpf_iter_mptcp_subflow *it) __weak __ks= ym; +extern void bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subflow *= it) __weak __ksym; + extern int bpf_wq_init(struct bpf_wq *wq, void *p__map, unsigned int flags= ) __weak __ksym; extern int bpf_wq_start(struct bpf_wq *wq, unsigned int flags) __weak __ks= ym; extern int bpf_wq_set_callback_impl(struct bpf_wq *wq, diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf.h b/tools/testing/= selftests/bpf/progs/mptcp_bpf.h index c3800f986ae1..ada2273bf7b6 100644 --- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h @@ -43,9 +43,19 @@ mptcp_subflow_tcp_sock(const struct mptcp_subflow_contex= t *subflow) } =20 /* ksym */ +extern bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) __= ksym; extern void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subf= low, bool scheduled) __ksym; =20 +extern struct mptcp_sock *bpf_mptcp_sock_acquire(struct mptcp_sock *msk) _= _ksym; +extern void bpf_mptcp_sock_release(struct mptcp_sock *msk) __ksym; + +extern struct mptcp_sock *bpf_mptcp_sk(struct sock *sk) __ksym; +extern struct mptcp_subflow_context * +bpf_mptcp_subflow_ctx(const struct sock *sk) __ksym; +extern struct sock * +bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) __= ksym; + extern struct mptcp_subflow_context * bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned= int pos) __ksym; =20 diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_iter.c b/tools/tes= ting/selftests/bpf/progs/mptcp_bpf_iter.c new file mode 100644 index 000000000000..4268e4604c5a --- /dev/null +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_iter.c @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024, Kylin Software */ + +/* vmlinux.h, bpf_helpers.h and other 'define' */ +#include "bpf_tracing_net.h" +#include "mptcp_bpf.h" + +char _license[] SEC("license") =3D "GPL"; +int subflows; +int pid; + +SEC("fentry/mptcp_sched_get_send") +int BPF_PROG(trace_mptcp_sched_get_send, struct mptcp_sock *msk) +{ + struct mptcp_subflow_context *subflow; + struct sock *ssk =3D NULL; + + if (bpf_get_current_pid_tgid() >> 32 !=3D pid) + return 0; + + msk =3D bpf_mptcp_sock_acquire(msk); + if (!msk) + return 0; + bpf_for_each(mptcp_subflow, subflow, msk) { + if (subflow->token !=3D msk->token) + break; + + if (!mptcp_subflow_active(subflow)) + continue; + + ssk =3D bpf_mptcp_subflow_tcp_sock(subflow); + } + bpf_mptcp_sock_release(msk); + + if (!ssk) + return 0; + subflow =3D bpf_mptcp_subflow_ctx(ssk); + mptcp_subflow_set_scheduled(subflow, true); + subflows =3D subflow->subflow_id; + + return 0; +} --=20 2.43.0 From nobody Sun Feb 8 13:13:01 2026 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 0DF80148FF6 for ; Fri, 4 Oct 2024 12:51: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=1728046271; cv=none; b=anzeQGaYofKriF6KG+4rLcAFQI0BbXjxPdFFTsuvX5fY/rXwwtqooL5ZgOo9B/wUQ9DWyt01iUzl+H8gg8L/zFROD+yxoX+gkECa5Te9Opp3vIA/4nTmWuW1hZ+MA5kjZaqw9GmOPPA0Go+zAZVgbk3qVw2glrHK9c6tBTiHfyE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728046271; c=relaxed/simple; bh=Rrwmr/UzblTRnxYyE1VfmSxemd4f/+6ILdhvnsszKtU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PBy9WBKZx8GxXWBPvaXjboVu6sMuDtozvZH1ux0ar5q+X57uTzgKENOWSELVWfKGCjbNTrCK0skufHr7ePjzKSrOzEUhhsM9j477A6znaGZD0FoOmnYatbCR6TWncqAcRbk8vL0CB2/IpIr4nY/ICdJDsERWwSoDV4O1OecCP9U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DB1LmeCY; 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="DB1LmeCY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 65386C4E690; Fri, 4 Oct 2024 12:51:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1728046270; bh=Rrwmr/UzblTRnxYyE1VfmSxemd4f/+6ILdhvnsszKtU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DB1LmeCYuWo3pwwUvlO9x1Fgn+6f99cdqXF19J97YBWSjIS+n0YQVlKm/3u4tq80r fzPqBuuOCnklejXcJGLzvkj0IQsZrO/bqiL/XJJaDvuWDloKRsDwyaGwaHcvVsCpeG V/Vtk0l/3B5dbAsG+7uPCk7oqjCcERNZczP8wVXx5MkOFCPGnYy9pDw2VPUnqddM0O lCmZ3AGYESSRn8ZSi0X38zRGiy0FkxiO7Q9gOnXpXfwps855D262MYy2xyePe+/maF E5gggS+YgJMdS5XVpZdKEPVNXvoKPFp/YqI/sMZ07EHZWcvLkGJ3APfHa86HsWeims U2GDXVDqNYdUw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 5/7] selftests/bpf: More endpoints for endpoint_init Date: Fri, 4 Oct 2024 20:50:51 +0800 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 two more test addresses ADDR_3 and ADDR_4, and adds a new helper address_init() to initialize all these addresses. Add a new parameter "endpoints" for endpoint_init() to control how many endpoints are used for the tests. This makes it more flexible. Update the parameters of endpoint_init() in test_subflow(). Signed-off-by: Geliang Tang --- .../testing/selftests/bpf/prog_tests/mptcp.c | 46 +++++++++++++++++-- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing= /selftests/bpf/prog_tests/mptcp.c index acd79be134cd..076903680e75 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -20,6 +20,8 @@ #define NS_TEST "mptcp_ns" #define ADDR_1 "10.0.1.1" #define ADDR_2 "10.0.1.2" +#define ADDR_3 "10.0.1.3" +#define ADDR_4 "10.0.1.4" #define PORT_1 10001 #define WITH_DATA true #define WITHOUT_DATA false @@ -351,22 +353,56 @@ static void test_mptcpify(void) close(cgroup_fd); } =20 -static int endpoint_init(char *flags) +static int address_init(void) { SYS(fail, "ip -net %s link add veth1 type veth peer name veth2", NS_TEST); SYS(fail, "ip -net %s addr add %s/24 dev veth1", NS_TEST, ADDR_1); SYS(fail, "ip -net %s link set dev veth1 up", NS_TEST); SYS(fail, "ip -net %s addr add %s/24 dev veth2", NS_TEST, ADDR_2); SYS(fail, "ip -net %s link set dev veth2 up", NS_TEST); - if (SYS_NOFAIL("ip -net %s mptcp endpoint add %s %s", NS_TEST, ADDR_2, fl= ags)) { + + SYS(fail, "ip -net %s link add veth3 type veth peer name veth4", NS_TEST); + SYS(fail, "ip -net %s addr add %s/24 dev veth3", NS_TEST, ADDR_3); + SYS(fail, "ip -net %s link set dev veth3 up", NS_TEST); + SYS(fail, "ip -net %s addr add %s/24 dev veth4", NS_TEST, ADDR_4); + SYS(fail, "ip -net %s link set dev veth4 up", NS_TEST); + + return 0; +fail: + return -1; +} + +static int endpoint_add(char *addr, char *flags) +{ + return SYS_NOFAIL("ip -net %s mptcp endpoint add %s %s", NS_TEST, addr, f= lags); +} + +static int endpoint_init(char *flags, u8 endpoints) +{ + int ret =3D -1; + + if (!endpoints || endpoints > 4) + goto fail; + + if (address_init()) + goto fail; + + if (SYS_NOFAIL("ip -net %s mptcp limits set add_addr_accepted 4 subflows = 4", + NS_TEST)) { printf("'ip mptcp' not supported, skip this test.\n"); test__skip(); goto fail; } =20 - return 0; + if (endpoints > 1) + ret =3D endpoint_add(ADDR_2, flags); + if (endpoints > 2) + ret =3D ret ?: endpoint_add(ADDR_3, flags); + if (endpoints > 3) + ret =3D ret ?: endpoint_add(ADDR_4, flags); + fail: - return -1; + return ret; } =20 static void wait_for_new_subflows(int fd) @@ -452,7 +488,7 @@ static void test_subflow(void) if (!ASSERT_OK_PTR(nstoken, "create_netns: mptcp_subflow")) goto skel_destroy; =20 - if (endpoint_init("subflow") < 0) + if (endpoint_init("subflow", 2) < 0) goto close_netns; =20 run_subflow(); --=20 2.43.0 From nobody Sun Feb 8 13:13:01 2026 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 E3B7D29422 for ; Fri, 4 Oct 2024 12:51: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=1728046273; cv=none; b=ftTTf+rqszjw5J3Cqxm7Wlcu9iimjws4XjUAbp8TotkYHKF+rxl6Sy4fTzP7BDI9U/KfQHCBAbyVGY4NdCxBmh3WyBGBzMeJTylxuL4CPf69rOaCzkKtfIPIkOH9xahkozKH+/Euq9P03UfLkOsgSa7xO2PBBL9L39vH2DZy+d4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728046273; c=relaxed/simple; bh=gOqNsUvZEZDjK8CsDu5DMyfFN8Ko6EcnpPEPr+AKob8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JVHperbjZcDbd1+4gIGqCbc6QmKST2BzbMVs2l/zuJOm/UPMwTWLQTeeN7R8it5nn9EADRmhUOn+39gqJTm45LvuxUHh0WWDJqYE00Jewe9KohXtAIwO4sRI8zV/ApCaStLCClDCgtazAOZIGeIzt+a39ewPF/3yzghdlGJH3wQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MQt2c0Sc; 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="MQt2c0Sc" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 41217C4E693; Fri, 4 Oct 2024 12:51:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1728046272; bh=gOqNsUvZEZDjK8CsDu5DMyfFN8Ko6EcnpPEPr+AKob8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MQt2c0ScXFfIot9c8GrdqJjtjZCtgsw/bnQLMelkuVAcdyJQ5YF+w9eds1mivmEVK /7Xm2EOQaD0lZ5GkC2+4RZVv/pHMC4YoeiIhA+MUNBMYvi9ENjK+HTJ7Vi73CSQsBN oe1mBcL0raCAzi6aHg5h/Ecvv+FPpN5ZOcJrcZt29W4e9eGV1X1lSXeItdHgHsSn97 cOlA8NLke/xfLBTFx9XYVSLVzIgWQB+47JcL0f7U04mfReR2fGeMEQ+33W9TR0pVAo owqaBf1ST9Xv+sBAn4Bh8a39tvTUoVZv4RLqiP58IkoQOLvQDcl77cEDP6P5y3xjq2 HQqxm2r3qTmaQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 6/7] Squash to "selftests/bpf: Add bpf scheduler test" Date: Fri, 4 Oct 2024 20:50:52 +0800 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 Update endpoint_init() in sched_init(). Signed-off-by: Geliang Tang --- tools/testing/selftests/bpf/prog_tests/mptcp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing= /selftests/bpf/prog_tests/mptcp.c index 076903680e75..64b5ce25e1a1 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -509,7 +509,7 @@ static struct nstoken *sched_init(char *flags, char *sc= hed) if (!ASSERT_OK_PTR(nstoken, "create_netns")) return NULL; =20 - if (endpoint_init("subflow") < 0) + if (endpoint_init("subflow", 2) < 0) goto fail; =20 SYS(fail, "ip netns exec %s sysctl -qw net.mptcp.scheduler=3D%s", NS_TEST= , sched); --=20 2.43.0 From nobody Sun Feb 8 13:13:01 2026 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 BABD429422 for ; Fri, 4 Oct 2024 12:51: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=1728046275; cv=none; b=nRCy2ik2AedBL3o22Ag3s41Cbl0/GSr0/TNidYCnTkPGgwJTFAUlYym6vop+4I+bYjWA/TzKoouaOgx0iNWBXgnj+PFQWDGueFKcJ5yk8nfhze1yXdD/GObAk7gDzXQsuZp6Q7e/a0ZSDIHONaQn3t0umvdQQVsrp4hXp6q8wIM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728046275; c=relaxed/simple; bh=AFbkfTXQEhD8dHj3RRFAxacukbj8ZyyDHGS+UDqVU3s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WqRl49kr6GhwusbDQjobOEUfx6w/an5qI/upaSD3L6YM9MK32NIR9NJt4VDYpXIUal9lNu7RJlO/5DHxw+++Vg63kz4oFMpHcXqhFJcgHD7wIMmu3CKyBBCdsxCnLElly/StbMFnIHpkII+CP8pCrF6BsF3BEdyEiqndzNBmMQs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GTWSOIcV; 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="GTWSOIcV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 17913C4E694; Fri, 4 Oct 2024 12:51:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1728046274; bh=AFbkfTXQEhD8dHj3RRFAxacukbj8ZyyDHGS+UDqVU3s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GTWSOIcVsMDrbcKXG73ngi1be8tk4AAOtio10Qy0vDS+c54+k53p0WznFndNrewzX WGjH6GFzLnbvho2MAyjLEcx9LSw9A5enwtfj5VGR5CRiH3KcfTgmve2BUMX8fFQTSL xbVoakZX3k9qeLVgbLrp0QqVoSJiDaeX/3TOnyAO+hAvVcqfkOZHwsZPPeQe6fLqFN 2UX+Yvs13cuDc14yPJyHL67Mxdim178xDG+6CX/fKSBL6CDRnTEjDfEpq1aOAdRtWp OKJrViO7OYsZfo4iyzzu2QACiwQ3xMB8eaoSboDLo63lgKWrk8pcWMPNiaMaaUkZGt rfBB8FX2+FgFw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 7/7] selftests/bpf: Add mptcp_subflow bpf_iter subtest Date: Fri, 4 Oct 2024 20:50:53 +0800 Message-ID: <2876161b43f9011a78f61afcafa1a608bb591cff.1728046021.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 adds a subtest named test_bpf_iter to load and verify the newly added mptcp_subflow type bpf_iter example in test_mptcp. Use the helper endpoint_init() to add 3 new subflow endpoints. A new helper recv_byte() is invoked to trigger the ftrace hook for mptcp_sched_get_send() after wait_for_new_subflows(). Check if skel->bss->subflows equals 4 to verify whether the "fentry" program loops fourth as expected. Signed-off-by: Geliang Tang --- .../testing/selftests/bpf/prog_tests/mptcp.c | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing= /selftests/bpf/prog_tests/mptcp.c index 64b5ce25e1a1..233da5317e47 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -11,6 +11,7 @@ #include "mptcp_sock.skel.h" #include "mptcpify.skel.h" #include "mptcp_subflow.skel.h" +#include "mptcp_bpf_iter.skel.h" #include "mptcp_bpf_first.skel.h" #include "mptcp_bpf_bkup.skel.h" #include "mptcp_bpf_rr.skel.h" @@ -261,6 +262,19 @@ static void send_byte(int fd) ASSERT_EQ(write(fd, &b, sizeof(b)), 1, "send single byte"); } =20 +static int recv_byte(int fd) +{ + char buf[1]; + ssize_t n; + + n =3D recv(fd, buf, sizeof(buf), 0); + if (CHECK(n <=3D 0, "recv_byte", "recv")) { + log_err("failed/partial recv"); + return -1; + } + return 0; +} + static int verify_mptcpify(int server_fd, int client_fd) { struct __mptcp_info info; @@ -501,6 +515,68 @@ static void test_subflow(void) close(cgroup_fd); } =20 +static void run_bpf_iter(void) +{ + int server_fd, client_fd, accept_fd; + + server_fd =3D start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0); + if (!ASSERT_OK_FD(server_fd, "start_mptcp_server")) + return; + + client_fd =3D connect_to_fd(server_fd, 0); + if (!ASSERT_OK_FD(client_fd, "connect_to_fd")) + goto close_server; + + accept_fd =3D accept(server_fd, NULL, NULL); + if (!ASSERT_OK_FD(accept_fd, "accept")) + goto close_client; + + send_byte(client_fd); + wait_for_new_subflows(client_fd); + recv_byte(accept_fd); + send_byte(client_fd); + + close(accept_fd); +close_client: + close(client_fd); +close_server: + close(server_fd); +} + +static void test_bpf_iter(void) +{ + struct mptcp_bpf_iter *skel; + struct nstoken *nstoken; + int subflows =3D 4; + int err; + + skel =3D mptcp_bpf_iter__open_and_load(); + if (!ASSERT_OK_PTR(skel, "skel_open_load: mptcp_iter")) + return; + + skel->bss->pid =3D getpid(); + + err =3D mptcp_bpf_iter__attach(skel); + if (!ASSERT_OK(err, "skel_attach: mptcp_iter")) + goto skel_destroy; + + nstoken =3D create_netns(); + if (!ASSERT_OK_PTR(nstoken, "create_netns: mptcp_iter")) + goto skel_destroy; + + if (endpoint_init("subflow", subflows) < 0) + goto close_netns; + + run_bpf_iter(); + + ASSERT_EQ(skel->bss->subflows, subflows, "subflows"); + +close_netns: + cleanup_netns(nstoken); +skel_destroy: + mptcp_bpf_iter__destroy(skel); +} + static struct nstoken *sched_init(char *flags, char *sched) { struct nstoken *nstoken; @@ -682,6 +758,8 @@ void test_mptcp(void) test_mptcpify(); if (test__start_subtest("subflow")) test_subflow(); + if (test__start_subtest("bpf_iter")) + test_bpf_iter(); if (test__start_subtest("default")) test_default(); if (test__start_subtest("first")) --=20 2.43.0