From patchwork Wed Mar 5 10:59:42 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14002432 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 890A6221F1E for ; Wed, 5 Mar 2025 11:00:06 +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=1741172406; cv=none; b=VEujVjr41syAUodrrVHWmdHhUcsj29Ljjy3R3Zz+iikytGGp4mAMWPs+04Uh2MCKLR0Qn+RH/Ax6knsIejjCSWx0rd/FIZ3br01TkYkobn8NhCJDNtDsTqFYXX8Z/YVLHw8HRH+lbeNnBZKOJW8AhBYb8tEebvMfn6Cj8q4AAL8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741172406; c=relaxed/simple; bh=sYnrSigWaWAheOO3wnenOB+tbc+oqDuX+T2QUS6eE5U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NkISN4UDYWwm1NoLHAUtP1Eht/To0d4onpk5feZkrKBxabHU/D+Qqs0Bm1erXjqhKCPsR2eARhoFKDGR8JxwqEZDhxH2k8SuaE9GEqHVVO7fNzNR1srMgZquAPa98HkRlypwLQwo3buVIK++Zo9+M5/hndWDcsDWyNdBzgyBF+o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=O1BOXmzg; 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="O1BOXmzg" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C28C3C4CEE8; Wed, 5 Mar 2025 11:00:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741172406; bh=sYnrSigWaWAheOO3wnenOB+tbc+oqDuX+T2QUS6eE5U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=O1BOXmzgJ1ljpQW9YcD+hBkQFKuLoiWiy0G0kAoIA4zl5w+9ia26hsK4CE0xfxmI+ Tw0HkmRap8giIT11b1m3DBNx5CGk8oymwNaxxo/Pc1oSkePewE2lIl3vn42yE7wZpJ kHH7JFj5RxmhgWUXPq643XWXo1H3+6YTgwpI+ZpajOb4KVIcPoiljRbEm2dcuhTUpj p2PRmlGNcS5GuxcihpOO+o+z6Jt0jozSv9NDgsNfHRLB/G1YthC0ETfuAn4nALrUil Xd/RmsbVDXRRqK6PFe66scDGThw9jk9pPDm7YHYAJF4P55Li9xHUmf4PNFU/3ZLZvS 2W5qHT+OhXUmg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v9 01/12] mptcp: pm: define struct mptcp_pm_ops Date: Wed, 5 Mar 2025 18:59:42 +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 From: Geliang Tang In order to allow users to develop their own BPF-based path manager, this patch defines a struct ops "mptcp_pm_ops" for an MPTCP path manager, which contains a set of interfaces. Currently only init() and release() are included, but subsequent patches will add other interfaces. Add a set of functions to register, unregister, find and validate a given struct ops. "list" is used to add this path manager to mptcp_pm_list list when it is registered. "name" is used to identify this path manager. mptcp_pm_find() uses "name" to find a path manager on the list, and mptcp_pm_validate() is used to check whether required ops are defined. Signed-off-by: Geliang Tang --- include/net/mptcp.h | 12 ++++++++++ net/mptcp/pm.c | 55 ++++++++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 5 ++++ 3 files changed, 72 insertions(+) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 72d6e6597add..aeb3b1e4d8f2 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -14,6 +14,7 @@ struct mptcp_info; struct mptcp_sock; +struct mptcp_pm_addr_entry; struct seq_file; /* MPTCP sk_buff extension data */ @@ -121,6 +122,17 @@ struct mptcp_sched_ops { void (*release)(struct mptcp_sock *msk); } ____cacheline_aligned_in_smp; +#define MPTCP_PM_NAME_MAX 16 + +struct mptcp_pm_ops { + char name[MPTCP_PM_NAME_MAX]; + struct module *owner; + struct list_head list; + + void (*init)(struct mptcp_sock *msk); + void (*release)(struct mptcp_sock *msk); +} ____cacheline_aligned_in_smp; + #ifdef CONFIG_MPTCP void mptcp_init(void); diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 04a156395aad..1af42c6a24c6 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -5,6 +5,8 @@ */ #define pr_fmt(fmt) "MPTCP: " fmt +#include +#include #include "protocol.h" #include "mib.h" @@ -18,6 +20,9 @@ struct mptcp_pm_add_entry { struct mptcp_sock *sock; }; +static DEFINE_SPINLOCK(mptcp_pm_list_lock); +static LIST_HEAD(mptcp_pm_list); + /* path manager helpers */ /* if sk is ipv4 or ipv6_only allows only same-family local and remote addresses, @@ -1025,3 +1030,53 @@ void __init mptcp_pm_init(void) mptcp_pm_kernel_register(); mptcp_pm_nl_init(); } + +/* Must be called with rcu read lock held */ +struct mptcp_pm_ops *mptcp_pm_find(const char *name) +{ + struct mptcp_pm_ops *pm; + + list_for_each_entry_rcu(pm, &mptcp_pm_list, list) { + if (!strcmp(pm->name, name)) + return pm; + } + + return NULL; +} + +int mptcp_pm_validate(struct mptcp_pm_ops *pm) +{ + if (!pm->init) { + pr_err("%s does not implement required ops\n", pm->name); + return -EINVAL; + } + + return 0; +} + +int mptcp_pm_register(struct mptcp_pm_ops *pm) +{ + int ret; + + ret = mptcp_pm_validate(pm); + if (ret) + return ret; + + spin_lock(&mptcp_pm_list_lock); + if (mptcp_pm_find(pm->name)) { + spin_unlock(&mptcp_pm_list_lock); + return -EEXIST; + } + list_add_tail_rcu(&pm->list, &mptcp_pm_list); + spin_unlock(&mptcp_pm_list_lock); + + pr_debug("%s registered\n", pm->name); + return 0; +} + +void mptcp_pm_unregister(struct mptcp_pm_ops *pm) +{ + spin_lock(&mptcp_pm_list_lock); + list_del_rcu(&pm->list); + spin_unlock(&mptcp_pm_list_lock); +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 99b848de5229..e1cd69d376d1 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1049,6 +1049,11 @@ int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_ void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk, struct mptcp_pm_addr_entry *entry); +struct mptcp_pm_ops *mptcp_pm_find(const char *name); +int mptcp_pm_validate(struct mptcp_pm_ops *pm); +int mptcp_pm_register(struct mptcp_pm_ops *pm); +void mptcp_pm_unregister(struct mptcp_pm_ops *pm); + void mptcp_userspace_pm_free_local_addr_list(struct mptcp_sock *msk); void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk, From patchwork Wed Mar 5 10:59:43 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14002433 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 4135B221F2F for ; Wed, 5 Mar 2025 11:00: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=1741172408; cv=none; b=peJfI5elqPa0hJ+4+Re7SeBqDIFDo4T+b8/rWwCE1r7z60t34pdLQxfr8qn5Y3lL0oBMBXaQpJ4pUZyCgOaMCiEzJbl2wa5qe/nyGzJ61NLfHC6ZUn1OgMs0xAgVnYR5pUnuij1P3IZ784yt5Vb+Jr0MlGZG2OJiMblD+dx+VQM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741172408; c=relaxed/simple; bh=N4TiRpcKY/hadngNzgMwXWTMRiPoa5WEUgsEcmFrUbw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LGbGh7kKWZcQoTZSWcL0wPsnDMtDvDhk+wlTDn/O84z5p2jVsC1/mvcsbq/prtRuDZubx3ysLPWpeUqpKuJKfzYm6Dbhwn8amjO59mGMYViACDRsyGJjI4vIVxbyygGnGt55hpW+q6TpBUX0O09HIjXU+8R5txFCAICyPO1gvAo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lbjVlw/I; 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="lbjVlw/I" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9C18BC4CEE2; Wed, 5 Mar 2025 11:00:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741172407; bh=N4TiRpcKY/hadngNzgMwXWTMRiPoa5WEUgsEcmFrUbw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lbjVlw/IegFoM8qMKotvP5ihSMg3zm/3qbZsiHToyNZ1LM3OtaOpKPig/VHhcga9m 5fTRSGN8026TdJai0rEATCtgSyvt+8fCaWy6360Oje7T8AUmTLwQ42XE3mXnKh5Byl tHQXQaBYIzqU5U1GOQwplnYpYcB+44f+hj8rNIWdqQhRpQCX9K2FODE3WCD2srQGg+ c4XT+NutOwbQAHTWBUr0co7fYJzF6ETDCfCmLjrUcsU0ljol0+azC2ATublQ+Rx1uu tIwYHt+daS/Ow3UCkKXvsd5aGmlfs+EWNnL7syMkGWQ0q/Fo61gIjEB51IifZlNV+q K3IcPp4MyPKpA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v9 02/12] mptcp: sysctl: set path manager by name Date: Wed, 5 Mar 2025 18:59:43 +0800 Message-ID: <2d91ed311b005d9be175413cf09bda8d4ebacaf8.1741171898.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 From: Geliang Tang A new net.mptcp.path_manager sysctl is added to determine which path manager will be used by each newly-created MPTCP socket by setting the name of it. This sysctl makes the old one "pm_type" deprecated. Signed-off-by: Geliang Tang --- Documentation/networking/mptcp-sysctl.rst | 19 +++++++++ net/mptcp/ctrl.c | 50 +++++++++++++++++++++++ net/mptcp/protocol.h | 1 + 3 files changed, 70 insertions(+) diff --git a/Documentation/networking/mptcp-sysctl.rst b/Documentation/networking/mptcp-sysctl.rst index 03e1d3610333..b78a2254d452 100644 --- a/Documentation/networking/mptcp-sysctl.rst +++ b/Documentation/networking/mptcp-sysctl.rst @@ -72,6 +72,23 @@ enabled - BOOLEAN Default: 1 (enabled) +path_manager - STRING + Set the default path manager name to use for each new MPTCP + socket. In-kernel path management will control subflow + connections and address advertisements according to + per-namespace values configured over the MPTCP netlink + API. Userspace path management puts per-MPTCP-connection subflow + connection decisions and address advertisements under control of + a privileged userspace program, at the cost of more netlink + traffic to propagate all of the related events and commands. + + This is a per-namespace sysctl. + + * "kernel" - In-kernel path manager + * "userspace" - Userspace path manager + + Default: "kernel" + pm_type - INTEGER Set the default path manager type to use for each new MPTCP socket. In-kernel path management will control subflow @@ -84,6 +101,8 @@ pm_type - INTEGER This is a per-namespace sysctl. + Deprecated since v6.15, use path_manager instead. + * 0 - In-kernel path manager * 1 - Userspace path manager diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c index be6c0237e10b..d64e6b4f6d1d 100644 --- a/net/mptcp/ctrl.c +++ b/net/mptcp/ctrl.c @@ -39,6 +39,7 @@ struct mptcp_pernet { u8 allow_join_initial_addr_port; u8 pm_type; char scheduler[MPTCP_SCHED_NAME_MAX]; + char path_manager[MPTCP_PM_NAME_MAX]; }; static struct mptcp_pernet *mptcp_get_pernet(const struct net *net) @@ -83,6 +84,11 @@ int mptcp_get_pm_type(const struct net *net) return mptcp_get_pernet(net)->pm_type; } +const char *mptcp_get_path_manager(const struct net *net) +{ + return mptcp_get_pernet(net)->path_manager; +} + const char *mptcp_get_scheduler(const struct net *net) { return mptcp_get_pernet(net)->scheduler; @@ -101,6 +107,7 @@ static void mptcp_pernet_set_defaults(struct mptcp_pernet *pernet) pernet->stale_loss_cnt = 4; pernet->pm_type = MPTCP_PM_TYPE_KERNEL; strscpy(pernet->scheduler, "default", sizeof(pernet->scheduler)); + strscpy(pernet->path_manager, "kernel", sizeof(pernet->path_manager)); } #ifdef CONFIG_SYSCTL @@ -174,6 +181,42 @@ static int proc_blackhole_detect_timeout(const struct ctl_table *table, return ret; } +static int mptcp_set_path_manager(char *path_manager, const char *name) +{ + struct mptcp_pm_ops *pm; + int ret = 0; + + rcu_read_lock(); + pm = mptcp_pm_find(name); + if (pm) + strscpy(path_manager, name, MPTCP_PM_NAME_MAX); + else + ret = -ENOENT; + rcu_read_unlock(); + + return ret; +} + +static int proc_path_manager(const struct ctl_table *ctl, int write, + void *buffer, size_t *lenp, loff_t *ppos) +{ + char (*path_manager)[MPTCP_PM_NAME_MAX] = ctl->data; + char val[MPTCP_PM_NAME_MAX]; + const struct ctl_table tbl = { + .data = val, + .maxlen = MPTCP_PM_NAME_MAX, + }; + int ret; + + strscpy(val, *path_manager, MPTCP_PM_NAME_MAX); + + ret = proc_dostring(&tbl, write, buffer, lenp, ppos); + if (write && ret == 0) + ret = mptcp_set_path_manager(*path_manager, val); + + return ret; +} + static struct ctl_table mptcp_sysctl_table[] = { { .procname = "enabled", @@ -253,6 +296,12 @@ static struct ctl_table mptcp_sysctl_table[] = { .mode = 0644, .proc_handler = proc_dou8vec_minmax, }, + { + .procname = "path_manager", + .maxlen = MPTCP_PM_NAME_MAX, + .mode = 0644, + .proc_handler = proc_path_manager, + }, }; static int mptcp_pernet_new_table(struct net *net, struct mptcp_pernet *pernet) @@ -278,6 +327,7 @@ static int mptcp_pernet_new_table(struct net *net, struct mptcp_pernet *pernet) table[8].data = &pernet->close_timeout; table[9].data = &pernet->blackhole_timeout; table[10].data = &pernet->syn_retrans_before_tcp_fallback; + table[11].data = &pernet->path_manager; hdr = register_net_sysctl_sz(net, MPTCP_SYSCTL_PATH, table, ARRAY_SIZE(mptcp_sysctl_table)); diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index e1cd69d376d1..ff14d43bf8a9 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -694,6 +694,7 @@ int mptcp_allow_join_id0(const struct net *net); unsigned int mptcp_stale_loss_cnt(const struct net *net); unsigned int mptcp_close_timeout(const struct sock *sk); int mptcp_get_pm_type(const struct net *net); +const char *mptcp_get_path_manager(const struct net *net); const char *mptcp_get_scheduler(const struct net *net); void mptcp_active_disable(struct sock *sk); From patchwork Wed Mar 5 10:59:44 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14002434 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 0BBDE221F2E for ; Wed, 5 Mar 2025 11:00:09 +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=1741172410; cv=none; b=TIZ7q3otl61Rl+ze90QJDHWFETjbJ9+0sPSQG3iSejhoJUdsXL/PTNgK3lmqiH9KF8Hpd0/p37f11KK/yU5Z6sr2TilRpSRLbjOfYMD6iE2wJFc2gAKH6lTO/1cOoQgM3hel17q/oVrYtypmwMi6zUWtsi4IQWCgMuwiSE8t+XM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741172410; c=relaxed/simple; bh=ppIVdsbAzhhY0inaSHQyxu5FUK3NzRkLg0s4dP9jnYE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=e6Osf8AYfMBGB8NzIBW4UgZvmMgYQnrqgth3vA2zNFVhJ3JNsn2PMhg3dhqJKYCafiH3+jumqNry7BGDBigvWGnz7HngYKIe/u/ee39bJaHi1dR8BrFSlNC95UwwqrufV3kRRm/N9Rq/eAaKN5+9yQID/dXeRje/cphfyFUNwrk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jkm+Kc/v; 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="jkm+Kc/v" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 43C2CC4CEE8; Wed, 5 Mar 2025 11:00:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741172409; bh=ppIVdsbAzhhY0inaSHQyxu5FUK3NzRkLg0s4dP9jnYE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jkm+Kc/vtPmb/bxncsAnlZTz5uJd7AHoB1PMgxjYkR/zLZOObfNmuDp5ZtLBOzw55 6OVqELQFyoqfzG5gfFUXVcxqt1QWrcp5hcetSxJiMm6gwgmzJXb/8fsuH1gTZGkZuX Vrauou2qlr8vkya+/QEXk76paG6mijgfjUzae7yDtlkhFTV7waWNp9bMdbFaE9ZGP9 KfHM9/ulV9eg/D/jP2h3VWEy9PVeHPbG6CjFhHtEwtxgRG78r9cHRr6dfPcdijrAgb qk65Pm9Yf5EpVIFB3d9bD2zZLZi4Cbj+XgPnvD7jN4kIf/fptUZk/O6JikGNO4SSkS Z7wOHml+HpzMA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v9 03/12] mptcp: sysctl: map path_manager to pm_type Date: Wed, 5 Mar 2025 18:59:44 +0800 Message-ID: <1a5c165f2e139c2afffb71e4032fc2090b4d4b08.1741171898.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 From: Geliang Tang This patch maps the newly added path manager sysctl "path_manager" to the old one "pm_type". path_manager pm_type "kernel" -> MPTCP_PM_TYPE_KERNEL "userspace" -> MPTCP_PM_TYPE_USERSPACE Signed-off-by: Geliang Tang --- net/mptcp/ctrl.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c index d64e6b4f6d1d..fe06be11dc83 100644 --- a/net/mptcp/ctrl.c +++ b/net/mptcp/ctrl.c @@ -200,6 +200,9 @@ static int mptcp_set_path_manager(char *path_manager, const char *name) static int proc_path_manager(const struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos) { + struct mptcp_pernet *pernet = container_of(ctl->data, + struct mptcp_pernet, + path_manager); char (*path_manager)[MPTCP_PM_NAME_MAX] = ctl->data; char val[MPTCP_PM_NAME_MAX]; const struct ctl_table tbl = { @@ -211,8 +214,14 @@ static int proc_path_manager(const struct ctl_table *ctl, int write, strscpy(val, *path_manager, MPTCP_PM_NAME_MAX); ret = proc_dostring(&tbl, write, buffer, lenp, ppos); - if (write && ret == 0) + if (write && ret == 0) { + u8 pm_type = MPTCP_PM_TYPE_KERNEL; + + if (!strncmp(val, "userspace", MPTCP_PM_NAME_MAX)) + pm_type = MPTCP_PM_TYPE_USERSPACE; + pernet->pm_type = pm_type; ret = mptcp_set_path_manager(*path_manager, val); + } return ret; } From patchwork Wed Mar 5 10:59:45 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14002435 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 6B9FD2046BF for ; Wed, 5 Mar 2025 11:00:11 +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=1741172411; cv=none; b=Fp5ABMrmh6dcIMINWo6qWV2lej44V0tDZf3A6xS0LYyPk9e+9P4LNaVe29dJnJ3Y3rltLV4OPGqkjDXn0SO5PxNM14ns/MEMqiseZK0o5HYfEqvTNfLx+SB5i0EOKKbJFsKN9XCWx0p1qztZF49k5PyzT3dZUVH6mfBW6wnJpCg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741172411; c=relaxed/simple; bh=ncPlHSpl3wroyFeG6CM2MYz0Q+Tyexe5AhYAyEAY8/U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iJpriv2OpkgciuI2e9qkJm1fiJ+UeiwzC6XHlw8M1TNFWDA5qnz5HjZnUsTzdaLhyI9luDXIblSipwz1+NGMCnY1SpxjgAicRvU05x3Jcj38bYi9qxVBwyXPZWEcZDOKgq0O30qjT0nQJ9gfSseUh3ZWE32EqfiXruUwQCkJ58g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=pOny7tKn; 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="pOny7tKn" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 36AF6C4CEE2; Wed, 5 Mar 2025 11:00:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741172411; bh=ncPlHSpl3wroyFeG6CM2MYz0Q+Tyexe5AhYAyEAY8/U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pOny7tKnSC8GbMTdzoauMZiHWQQwHOkt8M/jh9+bTYpc0cM4vV2FqRSw68dqPuG24 KWo+XFEdwPtbMFY/EiBfnm0Cd/BLMwgyj5AGXi0sNpS4iRB8G8xWgm4vX7Qwf2A6+l XHPJivucppQ5hHNV5ARlTMKJFSakMHxC0cBYFefuwQLKKAwxfLnsprSOekCa2gxzps 6Atyv6H+JK13ls6HnMwUa+oHHGg6v1I/rJtaX0rxRWVE5Yj86tRWSl2EXgQD5CpVhw kCy8Rl167rr7zM45TrU0BZC4VEhzaQHmaEQ0wuMMsT38hWtDjF9JmiflTQAJq+r5Av CKdJK6WH7PyhQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v9 04/12] mptcp: sysctl: map pm_type to path_manager Date: Wed, 5 Mar 2025 18:59:45 +0800 Message-ID: <8cc85a63af73b3460868905e15678926a01cebe3.1741171898.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 From: Geliang Tang This patch adds a new proc_handler "proc_pm_type" for "pm_type" to map old path manager sysctl "pm_type" to the newly added "path_manager". path_manager pm_type MPTCP_PM_TYPE_KERNEL -> "kernel" MPTCP_PM_TYPE_USERSPACE -> "userspace" Signed-off-by: Geliang Tang --- net/mptcp/ctrl.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c index fe06be11dc83..a158a337cdb5 100644 --- a/net/mptcp/ctrl.c +++ b/net/mptcp/ctrl.c @@ -226,6 +226,32 @@ static int proc_path_manager(const struct ctl_table *ctl, int write, return ret; } +static int proc_pm_type(const struct ctl_table *ctl, int write, + void *buffer, size_t *lenp, loff_t *ppos) +{ + struct mptcp_pernet *pernet = container_of(ctl->data, + struct mptcp_pernet, + pm_type); + u8 pm_type = READ_ONCE(*(u8 *)ctl->data); + const struct ctl_table tbl = { + .maxlen = sizeof(pm_type), + .data = &pm_type, + }; + int ret; + + ret = proc_dou8vec_minmax(&tbl, write, buffer, lenp, ppos); + if (write && ret == 0) { + char *path_manager = "kernel"; + + if (pm_type == MPTCP_PM_TYPE_USERSPACE) + path_manager = "userspace"; + mptcp_set_path_manager(pernet->path_manager, path_manager); + WRITE_ONCE(*(u8 *)ctl->data, pm_type); + } + + return ret; +} + static struct ctl_table mptcp_sysctl_table[] = { { .procname = "enabled", @@ -270,7 +296,7 @@ static struct ctl_table mptcp_sysctl_table[] = { .procname = "pm_type", .maxlen = sizeof(u8), .mode = 0644, - .proc_handler = proc_dou8vec_minmax, + .proc_handler = proc_pm_type, .extra1 = SYSCTL_ZERO, .extra2 = &mptcp_pm_type_max }, From patchwork Wed Mar 5 10:59:46 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14002436 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 84C8B2288F9 for ; Wed, 5 Mar 2025 11:00:13 +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=1741172413; cv=none; b=lWw61NmoYNVFLkmsS8kXievsvT+TZuW+XFZCp03xmedlJ6dc5SGbyvlvuTbaoW+DADmJGLRdzarVtnHGgwMBhytgi97x0R0gB4cX1joLDWal2GQS2fcvnM0iV2/eaGprFlRRdpX6Hdy6obeogm+XoKAllbx8tG8y+1j0mo9G8/c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741172413; c=relaxed/simple; bh=CNlCjvO+evCdk99ycH+QFZSd7wq0KDVvs5Fg4V12WwE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HECpEKThKXOuL65JPXB7QHNW/wO+McAY26oGXg2KtAwbt5rYe6tYQMpnNF22Aeuhil6xreOXgJ7rUcPg5F/BV1oYV2dN7Vl9oPVYEKPvzHd4cRmeEqQ18GLX80YGBcQJwcieLzVy3Ete1na/cM/nm3LE1avAAXmyFAh8cfD+Y0M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BgDVwHhJ; 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="BgDVwHhJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EB60FC4CEE2; Wed, 5 Mar 2025 11:00:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741172413; bh=CNlCjvO+evCdk99ycH+QFZSd7wq0KDVvs5Fg4V12WwE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BgDVwHhJq2a04tzLajbdAmWgqKnvbXzL71tQ0xnhQeJUX1VoNtRUvregvWXghBvQN Mb2vLXLmPQ2wkyD2Z044RvJe5GsI0J8y82+fAmrQ8Qxtrc48QehSGauyCY1oM6Wd5l /u4YuN8wAOv7hyd+lBTkkMIcvGFzDaLnarrrc/J4r3LiixQDgHWTSXQFbY5Dkd2AF+ nY9KWcBSRgOK3lB2pNBODL/35UzucBjVkUpyqMhYu/6Aj/Zx6G8QYK6GeYrk+QyMd7 R8qw43J9J005czZjbszvDyXBPFQqJT3bC1OZ7ZZRJbl76YV6H1cz+oysGcJ+x6sISV NUfpRx51EPuBw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v9 05/12] mptcp: sysctl: add available_path_managers Date: Wed, 5 Mar 2025 18:59:46 +0800 Message-ID: <7cf7198673f5e9ab45d1ad6cbce2ccae07b91032.1741171898.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 From: Geliang Tang Similarly to net.mptcp.available_schedulers, this patch adds a new one net.mptcp.available_path_managers to list the available path managers. Signed-off-by: Geliang Tang --- Documentation/networking/mptcp-sysctl.rst | 4 ++++ include/net/mptcp.h | 2 ++ net/mptcp/ctrl.c | 25 +++++++++++++++++++++++ net/mptcp/pm.c | 19 +++++++++++++++++ net/mptcp/protocol.h | 1 + 5 files changed, 51 insertions(+) diff --git a/Documentation/networking/mptcp-sysctl.rst b/Documentation/networking/mptcp-sysctl.rst index b78a2254d452..5bfab01eff5a 100644 --- a/Documentation/networking/mptcp-sysctl.rst +++ b/Documentation/networking/mptcp-sysctl.rst @@ -30,6 +30,10 @@ allow_join_initial_addr_port - BOOLEAN Default: 1 +available_path_managers - STRING + Shows the available path managers choices that are registered. More + path managers may be available, but not loaded. + available_schedulers - STRING Shows the available schedulers choices that are registered. More packet schedulers may be available, but not loaded. diff --git a/include/net/mptcp.h b/include/net/mptcp.h index aeb3b1e4d8f2..c53ffff0a4cd 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -123,6 +123,8 @@ struct mptcp_sched_ops { } ____cacheline_aligned_in_smp; #define MPTCP_PM_NAME_MAX 16 +#define MPTCP_PM_MAX 128 +#define MPTCP_PM_BUF_MAX (MPTCP_PM_NAME_MAX * MPTCP_PM_MAX) struct mptcp_pm_ops { char name[MPTCP_PM_NAME_MAX]; diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c index a158a337cdb5..c11edcb683d0 100644 --- a/net/mptcp/ctrl.c +++ b/net/mptcp/ctrl.c @@ -252,6 +252,24 @@ static int proc_pm_type(const struct ctl_table *ctl, int write, return ret; } +static int proc_available_path_managers(const struct ctl_table *ctl, + int write, void *buffer, + size_t *lenp, loff_t *ppos) +{ + struct ctl_table tbl = { .maxlen = MPTCP_PM_BUF_MAX, }; + int ret; + + tbl.data = kmalloc(tbl.maxlen, GFP_USER); + if (!tbl.data) + return -ENOMEM; + + mptcp_pm_get_available(tbl.data, MPTCP_PM_BUF_MAX); + ret = proc_dostring(&tbl, write, buffer, lenp, ppos); + kfree(tbl.data); + + return ret; +} + static struct ctl_table mptcp_sysctl_table[] = { { .procname = "enabled", @@ -337,6 +355,12 @@ static struct ctl_table mptcp_sysctl_table[] = { .mode = 0644, .proc_handler = proc_path_manager, }, + { + .procname = "available_path_managers", + .maxlen = MPTCP_PM_BUF_MAX, + .mode = 0444, + .proc_handler = proc_available_path_managers, + }, }; static int mptcp_pernet_new_table(struct net *net, struct mptcp_pernet *pernet) @@ -363,6 +387,7 @@ static int mptcp_pernet_new_table(struct net *net, struct mptcp_pernet *pernet) table[9].data = &pernet->blackhole_timeout; table[10].data = &pernet->syn_retrans_before_tcp_fallback; table[11].data = &pernet->path_manager; + /* table[12] is for available_path_managers which is read-only info */ hdr = register_net_sysctl_sz(net, MPTCP_SYSCTL_PATH, table, ARRAY_SIZE(mptcp_sysctl_table)); diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 1af42c6a24c6..a2b210873b23 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -1080,3 +1080,22 @@ void mptcp_pm_unregister(struct mptcp_pm_ops *pm) list_del_rcu(&pm->list); spin_unlock(&mptcp_pm_list_lock); } + +/* Build string with list of available path manager values. + * Similar to tcp_get_available_congestion_control() + */ +void mptcp_pm_get_available(char *buf, size_t maxlen) +{ + struct mptcp_pm_ops *pm; + size_t offs = 0; + + rcu_read_lock(); + list_for_each_entry_rcu(pm, &mptcp_pm_list, list) { + offs += snprintf(buf + offs, maxlen - offs, "%s%s", + offs == 0 ? "" : " ", pm->name); + + if (WARN_ON_ONCE(offs >= maxlen)) + break; + } + rcu_read_unlock(); +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index ff14d43bf8a9..246b44db9775 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1054,6 +1054,7 @@ struct mptcp_pm_ops *mptcp_pm_find(const char *name); int mptcp_pm_validate(struct mptcp_pm_ops *pm); int mptcp_pm_register(struct mptcp_pm_ops *pm); void mptcp_pm_unregister(struct mptcp_pm_ops *pm); +void mptcp_pm_get_available(char *buf, size_t maxlen); void mptcp_userspace_pm_free_local_addr_list(struct mptcp_sock *msk); From patchwork Wed Mar 5 10:59:47 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14002437 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 4D98F22AE5E for ; Wed, 5 Mar 2025 11:00: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=1741172415; cv=none; b=HiB3+AR06rGG8VqvEwqwop7FWSNMIeDrXW1F9zY60DdJibO8aZM4zw1DQerg8Lv5+ZhC3IyTGJTaR/j76zTrau1L0FqwyPt1mxAzeywV1x519WwxJZ2OY1b6as3wWMBIZxbjQLC51PMDxI3i44Eq14GgtHGvYX+oa2L4ztH1Lhw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741172415; c=relaxed/simple; bh=WPM0IBE+9dT+2lkbkB5+IsH8/4hucIS1ihkj2nvGWFc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nGkudaRoaAV7YZSUHbKGObHniuhjKvagPPZN002ouaYpd5/KHidlwT3ItkyZw7zyll4JJ/qzgQAqgWYw79+XS6e0DKHNMYOn7TnZRS2+DjOUVHXYqDlC2j+rrx/XD5TZOyOS9FrXL7pbtY+iv5JvBVzCgdWID1+0znzPV60H58E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bHm7lHC5; 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="bHm7lHC5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AC01EC4CEE2; Wed, 5 Mar 2025 11:00:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741172414; bh=WPM0IBE+9dT+2lkbkB5+IsH8/4hucIS1ihkj2nvGWFc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bHm7lHC5HJeWD5GcNeTmPGVPkz6VriRLyS/ZT75cVnStEDDkuykYm/5LPmmc/mLOo CFf6542NhqlL6a4Cc/bWp+RsuTgIHPs5VDJyOWQS12+/eMIByONnWS0jrY1bSciQN9 lShvnRbAx9a6Dad6KFY4Kg4611ku8sqD5p3tGMYOKifTtEI8ucwvmBDtvb+qnLDR/b PpwXtBIBJ0z75ewVok7Su8itYxLIGTzIS7Ku84Y8Vc2bWQ1emGOfJevrfLQRmssTdB 4lXrfXHo9WhFsuf3/B9pNlyDLIv/rvjohSsGPoT5+CX0KOPSpZwB/cfFB7a+Ewy3G3 aOvykQKkMoy8w== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v9 06/12] mptcp: pm: in-kernel: register mptcp_pm_kernel Date: Wed, 5 Mar 2025 18:59:47 +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 From: Geliang Tang This patch defines the original in-kernel netlink path manager as a new struct mptcp_pm_ops named "mptcp_pm_kernel", and register it in mptcp_pm_kernel_register(). This mptcp_pm_ops will be skipped in mptcp_pm_unregister(). Signed-off-by: Geliang Tang --- net/mptcp/pm.c | 4 ++++ net/mptcp/pm_kernel.c | 26 ++++++++++++++++++++++++++ net/mptcp/protocol.h | 3 +++ 3 files changed, 33 insertions(+) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index a2b210873b23..28ea8bdaa8b0 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -1076,6 +1076,10 @@ int mptcp_pm_register(struct mptcp_pm_ops *pm) void mptcp_pm_unregister(struct mptcp_pm_ops *pm) { + /* skip unregistering the default path manager */ + if (pm == &mptcp_pm_kernel) + return; + spin_lock(&mptcp_pm_list_lock); list_del_rcu(&pm->list); spin_unlock(&mptcp_pm_list_lock); diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c index 806a9b5b3c07..8bd4431d8656 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -1398,8 +1398,34 @@ static struct pernet_operations mptcp_pm_pernet_ops = { .size = sizeof(struct pm_nl_pernet), }; +static void mptcp_pm_kernel_init(struct mptcp_sock *msk) +{ + bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk); + struct mptcp_pm_data *pm = &msk->pm; + + /* pm->work_pending must be only be set to 'true' when + * pm is the default path manager + */ + WRITE_ONCE(pm->work_pending, + (!!mptcp_pm_get_local_addr_max(msk) && + subflows_allowed) || + !!mptcp_pm_get_add_addr_signal_max(msk)); + WRITE_ONCE(pm->accept_addr, + !!mptcp_pm_get_add_addr_accept_max(msk) && + subflows_allowed); + WRITE_ONCE(pm->accept_subflow, subflows_allowed); +} + +struct mptcp_pm_ops mptcp_pm_kernel = { + .init = mptcp_pm_kernel_init, + .name = "kernel", + .owner = THIS_MODULE, +}; + void __init mptcp_pm_kernel_register(void) { if (register_pernet_subsys(&mptcp_pm_pernet_ops) < 0) panic("Failed to register MPTCP PM pernet subsystem.\n"); + + mptcp_pm_register(&mptcp_pm_kernel); } diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 246b44db9775..f700cb55bf49 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1050,6 +1050,9 @@ int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_ void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk, struct mptcp_pm_addr_entry *entry); +/* the default path manager, used in mptcp_pm_unregister */ +extern struct mptcp_pm_ops mptcp_pm_kernel; + struct mptcp_pm_ops *mptcp_pm_find(const char *name); int mptcp_pm_validate(struct mptcp_pm_ops *pm); int mptcp_pm_register(struct mptcp_pm_ops *pm); From patchwork Wed Mar 5 10:59:48 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14002438 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 B8EAC22D4E9 for ; Wed, 5 Mar 2025 11:00:16 +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=1741172416; cv=none; b=WVEitSfv9LtVnL8oqWkOGihVwRwgjXmZH7oj+CTbO5ZAfdhlayOHBzNtcbUIrfB8TmljwXkSu9ax3Q4NGhCnoTLH6fztBZvRCY1Ir4QS3bjzagumGsQZzYF2FA7IkciQ/aPRYoZHbnzG8/cHe9MtnvNJ5r5J2TZEQ6GVg9DHrE4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741172416; c=relaxed/simple; bh=ZrXeFgbX3fXImDOUNOR58o7loCEylvGDwXnHrWJ7uXM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IM/+2jDGpLV9lbn/jMLZWUd5hBGwj9ENELAcjE/DB3UgXa/TtjgF/dneCnbs7FrjsR8+nN6yKfD5PR3k4sHArJZBEaGTO6OmsfGaHk2STq3lx5hQopt2AdIlZRnEHgTLZvdP5Mypdwd6mni1LvLeVhNeUoSuhLjKHdkLQlVzCBg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=k2YgUOOi; 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="k2YgUOOi" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6D23DC4CEE8; Wed, 5 Mar 2025 11:00:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741172416; bh=ZrXeFgbX3fXImDOUNOR58o7loCEylvGDwXnHrWJ7uXM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=k2YgUOOizZiY46fbxESml2EliYb5loV2QKo0AIftT/LkjdOQfGLEBcKj11ylmbeSZ yDlb92HPYyaySaCE3jIBCIM3qez3QrDXWGutQa9PVYUkdfKWP8uZ1vjAhcWDMAIVyO ZuM0NfWrZrDzYPdz5ciYpixFylW1TgcowYrIybUnfCwbJ61ZRIGtXGsHxrxs5XkBFN q4vWwLu1HoXl85iT1o9KYzOKIrGpY3re5lqYZXKTL2KS5ro0UuLkSEEwDY5OZaA8/7 E1Okfm9pzf9pLbqNMwqPvJ5BZ8m7psr05O388huKysXjg76Stcc92QLBmwtAIsWk4H GTLM64yFTB7zA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v9 07/12] mptcp: pm: userspace: register mptcp_pm_userspace Date: Wed, 5 Mar 2025 18:59:48 +0800 Message-ID: <3bdd767731ec0cbf909bbd0e0882bfd851814fb1.1741171898.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 From: Geliang Tang This patch defines the original userspace path manager as a new struct mptcp_pm_ops named "mptcp_userspace_pm", and register it in mptcp_pm_init(). mptcp_pm_userspace_is_release() is a wrapper of mptcp_userspace_pm_free_local_addr_list(). Signed-off-by: Geliang Tang --- net/mptcp/pm.c | 1 + net/mptcp/pm_userspace.c | 26 ++++++++++++++++++++++++++ net/mptcp/protocol.h | 1 + 3 files changed, 28 insertions(+) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 28ea8bdaa8b0..5018ed3c575f 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -1028,6 +1028,7 @@ void mptcp_pm_data_init(struct mptcp_sock *msk) void __init mptcp_pm_init(void) { mptcp_pm_kernel_register(); + mptcp_pm_userspace_register(); mptcp_pm_nl_init(); } diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index 13856df22673..dedff896346f 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -682,3 +682,29 @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr, sock_put(sk); return ret; } + +static void mptcp_pm_userspace_init(struct mptcp_sock *msk) +{ + struct mptcp_pm_data *pm = &msk->pm; + + WRITE_ONCE(pm->work_pending, 0); + WRITE_ONCE(pm->accept_addr, 0); + WRITE_ONCE(pm->accept_subflow, 0); +} + +static void mptcp_pm_userspace_release(struct mptcp_sock *msk) +{ + mptcp_userspace_pm_free_local_addr_list(msk); +} + +static struct mptcp_pm_ops mptcp_pm_userspace = { + .init = mptcp_pm_userspace_init, + .release = mptcp_pm_userspace_release, + .name = "userspace", + .owner = THIS_MODULE, +}; + +void __init mptcp_pm_userspace_register(void) +{ + mptcp_pm_register(&mptcp_pm_userspace); +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index f700cb55bf49..658bc60d4cd8 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1162,6 +1162,7 @@ static inline u8 subflow_get_local_id(const struct mptcp_subflow_context *subflo } void __init mptcp_pm_kernel_register(void); +void __init mptcp_pm_userspace_register(void); void __init mptcp_pm_nl_init(void); void mptcp_pm_worker(struct mptcp_sock *msk); void __mptcp_pm_kernel_worker(struct mptcp_sock *msk); From patchwork Wed Mar 5 10:59:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14002439 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 3C7B722E3E9 for ; Wed, 5 Mar 2025 11:00:18 +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=1741172418; cv=none; b=ebr2M3RdsG8F7yekPdLU18R0lYmdnXI+cVmNwa5oIhZ9tIo2RGotA4ZR1TiizGPbpi8v/IayJNNOZM9hLjVyWoWm1d+uwYkuREwUoV5hBL1c8ty9eQfhjqWVq00UNzYRxFPpQJ5hVZq9BJNrtTodKdUvikeZ7mWw71TG8n9avDM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741172418; c=relaxed/simple; bh=o6x5OpLX869vSVjiJS5uVh+MzsowDYAK40fP3KBW39Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BWbB/FPZUP5423InhAULcG7VVEl3Qi7PIevBL1ggs5v9u3J6Ek0tYeERTEv+IJTKHUm5VBrKDmOiR/75iHHDLCxLIPqWkJYpO9waJoO9MqL6sGY9IcrhwvjgsFo7ZMpQtR5807Ct5Blp1bT82HDLBtONKJXibD5ObpZoVOmff6s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=H/2zbXPY; 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="H/2zbXPY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 46B07C4CEE8; Wed, 5 Mar 2025 11:00:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741172418; bh=o6x5OpLX869vSVjiJS5uVh+MzsowDYAK40fP3KBW39Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=H/2zbXPYmFKAY1ecBqeF/EfPBJ8lz3Zfsy2C2yNpL9tFBiSAP2TByNxB7hgLM3Zd5 Z/KTGjEfdfj8N6ENT9gmGh9Ihmlcgl/AV5UeFtgPJgNYivGkcSlclWLg1qDp3ms8Hr 6NgixzCXxhq6jSJs0p+NF7843dNRuiwzR3RsVlyRO5DuNAj3NCPsWAoq7t/abRNEB+ 8eEJOHnAnMElINZ8tqHOI/eKevnyEMY0Cwr7faLVod1J2exAKOhjcNKDVGUtCgz6cE /l5dS6xgXy8mdHaXpEcHb+pKKtH2SYQ2PTjZjZ3srlzmO+tkekiKJnUU1rG6OJME4H TriePTrI99iZQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v9 08/12] mptcp: pm: init and release mptcp_pm_ops Date: Wed, 5 Mar 2025 18:59:49 +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 From: Geliang Tang Add a struct mptcp_pm_ops pointer "ops" in struct mptcp_pm_data, and two helpers mptcp_pm_ops_init() and mptcp_pm_ops_release(), to set and release this pointer. mptcp_pm_ops_init() is invoked in mptcp_pm_data_reset(), while mptcp_pm_ops_release() is invoked in mptcp_pm_destroy(). Signed-off-by: Geliang Tang --- net/mptcp/pm.c | 57 +++++++++++++++++++++++++++----------------- net/mptcp/protocol.h | 1 + 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 5018ed3c575f..fc728c55cda5 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -970,16 +970,45 @@ void mptcp_pm_worker(struct mptcp_sock *msk) spin_unlock_bh(&msk->pm.lock); } +static void mptcp_pm_ops_init(struct mptcp_sock *msk, + struct mptcp_pm_ops *pm) +{ + if (!pm || !bpf_try_module_get(pm, pm->owner)) { + pr_warn_once("pm %s fails, fallback to default pm", + pm->name); + pm = &mptcp_pm_kernel; + } + + msk->pm.ops = pm; + if (msk->pm.ops->init) + msk->pm.ops->init(msk); + + pr_debug("pm %s initialized\n", pm->name); +} + +static void mptcp_pm_ops_release(struct mptcp_sock *msk) +{ + struct mptcp_pm_ops *pm = msk->pm.ops; + + if (!pm) + return; + + msk->pm.ops = NULL; + if (pm->release) + pm->release(msk); + + bpf_module_put(pm, pm->owner); +} + void mptcp_pm_destroy(struct mptcp_sock *msk) { mptcp_pm_free_anno_list(msk); - - if (mptcp_pm_is_userspace(msk)) - mptcp_userspace_pm_free_local_addr_list(msk); + mptcp_pm_ops_release(msk); } void mptcp_pm_data_reset(struct mptcp_sock *msk) { + const char *path_manager = mptcp_get_path_manager(sock_net((struct sock *)msk)); u8 pm_type = mptcp_get_pm_type(sock_net((struct sock *)msk)); struct mptcp_pm_data *pm = &msk->pm; @@ -991,25 +1020,9 @@ void mptcp_pm_data_reset(struct mptcp_sock *msk) pm->rm_list_rx.nr = 0; WRITE_ONCE(pm->pm_type, pm_type); - if (pm_type == MPTCP_PM_TYPE_KERNEL) { - bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk); - - /* pm->work_pending must be only be set to 'true' when - * pm->pm_type is set to MPTCP_PM_TYPE_KERNEL - */ - WRITE_ONCE(pm->work_pending, - (!!mptcp_pm_get_local_addr_max(msk) && - subflows_allowed) || - !!mptcp_pm_get_add_addr_signal_max(msk)); - WRITE_ONCE(pm->accept_addr, - !!mptcp_pm_get_add_addr_accept_max(msk) && - subflows_allowed); - WRITE_ONCE(pm->accept_subflow, subflows_allowed); - } else { - WRITE_ONCE(pm->work_pending, 0); - WRITE_ONCE(pm->accept_addr, 0); - WRITE_ONCE(pm->accept_subflow, 0); - } + rcu_read_lock(); + mptcp_pm_ops_init(msk, mptcp_pm_find(path_manager)); + rcu_read_unlock(); WRITE_ONCE(pm->addr_signal, 0); WRITE_ONCE(pm->remote_deny_join_id0, false); diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 658bc60d4cd8..2a264124cb17 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -220,6 +220,7 @@ struct mptcp_pm_data { struct mptcp_addr_info remote; struct list_head anno_list; struct list_head userspace_pm_local_addr_list; + struct mptcp_pm_ops *ops; spinlock_t lock; /*protects the whole PM data */ From patchwork Wed Mar 5 10:59:50 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14002440 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 F0E5D22E017 for ; Wed, 5 Mar 2025 11:00:19 +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=1741172420; cv=none; b=srIS3VMHPRv5A7r380hghZ9bX7rytS4l+C0asBDLuDKJMqPISCziS3u72D2ObxLO3mMVA5hFQVGTN/pRrAth07UERLtHI0xukG1tJDBxb2b4tZ9JOkyg+uarReBVCX8X3k7iWQzbn+R2t78Vcsg4H9qfcZH1dHyYTh+qo2lvGXA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741172420; c=relaxed/simple; bh=OJ9uTTv7qiOzPPaUd25ddnhlk0mauKfn0oNkHq6DTUo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lxE+SkHssopZeFcwuSQ5QCeDfbnDO0LVQ6PaeNSYCevSHejP0L6C7LwgkL52upf1srZ9lewSck+b6b7sIaSP+8PAGQ96gqxjv50EyNQ5HY09eehx7nLyIYb78GQhGxvdC9xoQHOp8sFm3/nVDyntZv3a2CvfVoJ2KsLgZCoHCQg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hxPqqxni; 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="hxPqqxni" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A56A4C4CEE2; Wed, 5 Mar 2025 11:00:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741172419; bh=OJ9uTTv7qiOzPPaUd25ddnhlk0mauKfn0oNkHq6DTUo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hxPqqxniuVTYqEZXUyrsUeMoNDjkQX5mDR2uLdAs8OIHOWjid4CUgksHqLfj2DuXB VabtjVFBw6gOEPfitIxPEOgvBq8dDK7X/AFXb97BAgeh/cnInMC9e33tsGMv4mHLGU OC1GzD1TWA2WhFUp7ncKqREelbs3dA75OtXg6rOk95SAZgD2qWoCOfR/yQ+F1YBfKu LrWmusjpAJ79yx+StRmqLCEMOOoVJvR6h5ajDQ7Ce90gecQbn2nxHrG8bGW/j+BPfq fcoDUgsk7+yVu22CxEVtFiKZMx8g1QsL16B2FnIZZasfDQ5/yvJ7GLGrBtWC7K/Bs6 WMAwRmaoTnwgw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v9 09/12] mptcp: pm: add get_local_id() interface Date: Wed, 5 Mar 2025 18:59:50 +0800 Message-ID: <82a0259a67bf70f2e183a41fa0aeb8ddccead338.1741171898.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 From: Geliang Tang This patch adds get_local_id() interface for struct mptcp_sched_ops, then mptcp_pm_get_local_id() can directly invoke get_local_id() interface through "ops" of "msk->pm". Instead of using mptcp_pm_is_userspace() to check which get_local_id() helper to invoke. Rename mptcp_pm_nl_get_local_id()/mptcp_userspace_pm_get_local_id() to mptcp_pm_kernel_get_local_id()/mptcp_pm_userspace_get_local_id() and make them static. Signed-off-by: Geliang Tang --- include/net/mptcp.h | 3 +++ net/mptcp/pm.c | 6 ++---- net/mptcp/pm_kernel.c | 5 +++-- net/mptcp/pm_userspace.c | 5 +++-- net/mptcp/protocol.h | 4 ---- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index c53ffff0a4cd..6090a9853f45 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -127,6 +127,9 @@ struct mptcp_sched_ops { #define MPTCP_PM_BUF_MAX (MPTCP_PM_NAME_MAX * MPTCP_PM_MAX) struct mptcp_pm_ops { + int (*get_local_id)(struct mptcp_sock *msk, + struct mptcp_pm_addr_entry *skc); + char name[MPTCP_PM_NAME_MAX]; struct module *owner; struct list_head list; diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index fc728c55cda5..20eee0dcb369 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -872,9 +872,7 @@ int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc) skc_local.addr.id = 0; skc_local.flags = MPTCP_PM_ADDR_FLAG_IMPLICIT; - if (mptcp_pm_is_userspace(msk)) - return mptcp_userspace_pm_get_local_id(msk, &skc_local); - return mptcp_pm_nl_get_local_id(msk, &skc_local); + return msk->pm.ops->get_local_id(msk, &skc_local); } bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc) @@ -1060,7 +1058,7 @@ struct mptcp_pm_ops *mptcp_pm_find(const char *name) int mptcp_pm_validate(struct mptcp_pm_ops *pm) { - if (!pm->init) { + if (!pm->init || !pm->get_local_id) { pr_err("%s does not implement required ops\n", pm->name); return -EINVAL; } diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c index 8bd4431d8656..5f04dad4efc8 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -693,8 +693,8 @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk, return err; } -int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, - struct mptcp_pm_addr_entry *skc) +static int mptcp_pm_kernel_get_local_id(struct mptcp_sock *msk, + struct mptcp_pm_addr_entry *skc) { struct mptcp_pm_addr_entry *entry; struct pm_nl_pernet *pernet; @@ -1417,6 +1417,7 @@ static void mptcp_pm_kernel_init(struct mptcp_sock *msk) } struct mptcp_pm_ops mptcp_pm_kernel = { + .get_local_id = mptcp_pm_kernel_get_local_id, .init = mptcp_pm_kernel_init, .name = "kernel", .owner = THIS_MODULE, diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index dedff896346f..1753210941a4 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -126,8 +126,8 @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id) return NULL; } -int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk, - struct mptcp_pm_addr_entry *skc) +static int mptcp_pm_userspace_get_local_id(struct mptcp_sock *msk, + struct mptcp_pm_addr_entry *skc) { __be16 msk_sport = ((struct inet_sock *) inet_sk((struct sock *)msk))->inet_sport; @@ -698,6 +698,7 @@ static void mptcp_pm_userspace_release(struct mptcp_sock *msk) } static struct mptcp_pm_ops mptcp_pm_userspace = { + .get_local_id = mptcp_pm_userspace_get_local_id, .init = mptcp_pm_userspace_init, .release = mptcp_pm_userspace_release, .name = "userspace", diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 2a264124cb17..85c5a5bd3657 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1137,10 +1137,6 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, const struct sk_buff *skb, bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining, struct mptcp_rm_list *rm_list); int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc); -int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, - struct mptcp_pm_addr_entry *skc); -int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk, - struct mptcp_pm_addr_entry *skc); bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc); bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc); bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc); From patchwork Wed Mar 5 10:59:51 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14002441 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 EDD5A23027C for ; Wed, 5 Mar 2025 11:00:20 +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=1741172421; cv=none; b=KVUkbtnu642NlprHiXI6Ytz4XN4Lx5KVzqjJFD6aQeY3PI1kw/hYGPCYP52D6LG+ixFJheZgbktEY/U/YMgHkpnqAnO7PGOQl51G+9tbW2ztatLNRVW9/2BTnp5bGvPr1M7Sry1CPLheM/4n0j/e+jY+qdAW18vNZpRDyAAqGaM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741172421; c=relaxed/simple; bh=dvgdTum6q7jsEZnsSwIb78JuDJXsd/2oo2C5O56lxH0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PrNjS5ECAJRTokleTv7nNxOohZWkzSsbvnqDaPLaVIMaIPFS+XWl5hfAYaYuE6L8bNlQ08GySypsNcjjpqqG11mZgv1vO4/jVJJ/Hk2vW/kUEVzFw7+fKCNEh27ta2AAmpPy/RwKOdrGp/H3V6+EAiBu3yFRKTeQP6D0b9JfWt0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ek+vFU1y; 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="ek+vFU1y" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F2F32C4CEE9; Wed, 5 Mar 2025 11:00:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741172420; bh=dvgdTum6q7jsEZnsSwIb78JuDJXsd/2oo2C5O56lxH0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ek+vFU1yFkhaHW9vUZK8Evidc97Ng12+ZK+F0p2Jr13UoLeTQCoTte9IZwjJyjI+2 K8lRaL93DFdQdvKh8FWmskfScqkXtMZ9Mp4M+0iPibsB4jotQHlBSniD3FVy3oe2yS mxUHkOErgsztwoybxCcf1aXOp+VCfUou89mZ4BOj1rsOgEPIwijadORV3AzjuHGLhe OtfeWHxwcR/wdCd00Gk355x/iXnmXYw2opT0VxnX8dFsY2Dyx3zml3x0KqR60/hEWZ wlMe7Vh4OZCVXc4cJdNb6lXlgXjeebG4uFtRLLOqN9Wj7m1eSUur7LLpZHyt/fPx6i fgl3Edm3hWMrg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v9 10/12] mptcp: pm: add get_priority() interface Date: Wed, 5 Mar 2025 18:59:51 +0800 Message-ID: <13286c165869d4e567caf9ca74db69aca14f0125.1741171898.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 From: Geliang Tang This patch adds get_priority() interface for struct mptcp_sched_ops, then mptcp_pm_is_backup() can directly invoke get_priority() interface through "ops" of "msk->pm". Instead of using mptcp_pm_is_userspace() to check which is_backup() helper to invoke. Rename mptcp_pm_nl_is_backup()/mptcp_userspace_pm_is_backup() to mptcp_pm_kernel_get_priority()/mptcp_pm_userspace_get_priority() and make them static. Signed-off-by: Geliang Tang --- include/net/mptcp.h | 2 ++ net/mptcp/pm.c | 7 ++----- net/mptcp/pm_kernel.c | 4 +++- net/mptcp/pm_userspace.c | 5 +++-- net/mptcp/protocol.h | 2 -- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 6090a9853f45..83977fe3dd30 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -129,6 +129,8 @@ struct mptcp_sched_ops { struct mptcp_pm_ops { int (*get_local_id)(struct mptcp_sock *msk, struct mptcp_pm_addr_entry *skc); + bool (*get_priority)(struct mptcp_sock *msk, + struct mptcp_addr_info *skc); char name[MPTCP_PM_NAME_MAX]; struct module *owner; diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 20eee0dcb369..d1f2b3bf9af8 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -881,10 +881,7 @@ bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc) mptcp_local_address((struct sock_common *)skc, &skc_local); - if (mptcp_pm_is_userspace(msk)) - return mptcp_userspace_pm_is_backup(msk, &skc_local); - - return mptcp_pm_nl_is_backup(msk, &skc_local); + return msk->pm.ops->get_priority(msk, &skc_local); } static void mptcp_pm_subflows_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) @@ -1058,7 +1055,7 @@ struct mptcp_pm_ops *mptcp_pm_find(const char *name) int mptcp_pm_validate(struct mptcp_pm_ops *pm) { - if (!pm->init || !pm->get_local_id) { + if (!pm->init || !pm->get_local_id || !pm->get_priority) { pr_err("%s does not implement required ops\n", pm->name); return -EINVAL; } diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c index 5f04dad4efc8..f81926f7b821 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -722,7 +722,8 @@ static int mptcp_pm_kernel_get_local_id(struct mptcp_sock *msk, return ret; } -bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc) +static bool mptcp_pm_kernel_get_priority(struct mptcp_sock *msk, + struct mptcp_addr_info *skc) { struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); struct mptcp_pm_addr_entry *entry; @@ -1418,6 +1419,7 @@ static void mptcp_pm_kernel_init(struct mptcp_sock *msk) struct mptcp_pm_ops mptcp_pm_kernel = { .get_local_id = mptcp_pm_kernel_get_local_id, + .get_priority = mptcp_pm_kernel_get_priority, .init = mptcp_pm_kernel_init, .name = "kernel", .owner = THIS_MODULE, diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index 1753210941a4..2274f02dd8f4 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -145,8 +145,8 @@ static int mptcp_pm_userspace_get_local_id(struct mptcp_sock *msk, return mptcp_userspace_pm_append_new_local_addr(msk, skc, true); } -bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk, - struct mptcp_addr_info *skc) +static bool mptcp_pm_userspace_get_priority(struct mptcp_sock *msk, + struct mptcp_addr_info *skc) { struct mptcp_pm_addr_entry *entry; bool backup; @@ -699,6 +699,7 @@ static void mptcp_pm_userspace_release(struct mptcp_sock *msk) static struct mptcp_pm_ops mptcp_pm_userspace = { .get_local_id = mptcp_pm_userspace_get_local_id, + .get_priority = mptcp_pm_userspace_get_priority, .init = mptcp_pm_userspace_init, .release = mptcp_pm_userspace_release, .name = "userspace", diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 85c5a5bd3657..776a4bc3e5af 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1138,8 +1138,6 @@ bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining, struct mptcp_rm_list *rm_list); int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc); bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc); -bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc); -bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc); int mptcp_pm_nl_dump_addr(struct sk_buff *msg, struct netlink_callback *cb); int mptcp_userspace_pm_dump_addr(struct sk_buff *msg, From patchwork Wed Mar 5 10:59:52 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14002442 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 60C822309B9 for ; Wed, 5 Mar 2025 11:00:22 +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=1741172422; cv=none; b=bIy+NvUjXFTiTGsuWa7UfUqbnZPierSUX4emVnygby2ykO1RjN3GDyGt8dj4UfgQNATDviL1Pe7mfZBECOEP7qhFOeNNJGkaPeNMqCuc/+XTnkQKkIf6uyNZzjeW/6yYIPEDdd1NlzkLe8XHlLxQNT+esj95npxDKJotB4kVzsY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741172422; c=relaxed/simple; bh=+8ih1OeiChrKLHPnVCx/OhGqDAeh8VXQArMrP/N9i7U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=X8RHVqiLSf0sb/pXohoBAQjUPJM+d7gKPPZbXZ0SzdUr/MU00cMklCZsJo9KS15ORCQEjslzy/pXxg8M3Zwa2cCWVoNUcD/fqpBSSLOVhm54HRRYMNbLxqLnxSFjIUgBIVMdG8/HfM1Ymjsb39UYMEE/th+E7Noec9XRWAHnPU4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ToSuOuBJ; 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="ToSuOuBJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 604CEC4CEE2; Wed, 5 Mar 2025 11:00:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741172422; bh=+8ih1OeiChrKLHPnVCx/OhGqDAeh8VXQArMrP/N9i7U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ToSuOuBJNizxhbo5nxNzEQlf0gijwVhh5MaznhK2aZd7Qfm2j8FdSeqK8eN+wC6C3 McJBWfnX09Wmxo/t4Kd8c4Ofx5TY7uS6TfpcmfpIi4dmkzUKHdoJLHIL0KENTXuyjF 0ZCVrNg1Xhe40atpqRTygWbdaFDoPPVh5C9mehdZre6bAKoOOIfz9D+UtbZHjM1M/5 PY64bA3bAflMPoVWnd7IVDbcXNsgTRWVYu3Mzz/zfwPOkxv4r0qUEQ3SaYA5xQbvzc fSOtRHFi18xN2xk5KmSqKEzTBhzH21omTZB6pjnW905rZmkEum4hPbk4yVvjhAIlRX MVQO4WfOkCcUA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v9 11/12] selftests: mptcp: pm_type to path_manager mapping tests Date: Wed, 5 Mar 2025 18:59: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 From: Geliang Tang This patch checks if the newly added net.mptcp.path_manager is mapped successfully from the old net.mptcp.pm_type inside "userspace pm address" test. Signed-off-by: Geliang Tang --- tools/testing/selftests/net/mptcp/mptcp_join.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh index 13a3b68181ee..c55f5d526769 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh @@ -3572,6 +3572,21 @@ userspace_tests() if reset_with_events "userspace pm add & remove address" && continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then set_userspace_pm $ns1 + if continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/path_manager'; then + local pm1 pm2 + + pm1=$(ip netns exec ${ns1} sysctl -n net.mptcp.path_manager) + if [ "$pm1" != "userspace" ]; then + mptcp_lib_pr_fail "ns1 path_manager mapping fails" + return 1 + fi + + pm2=$(ip netns exec ${ns2} sysctl -n net.mptcp.path_manager) + if [ "$pm2" != "kernel" ]; then + mptcp_lib_pr_fail "ns2 path_manager mapping fails" + return 1 + fi + fi pm_nl_set_limits $ns2 2 2 { speed=5 \ run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null From patchwork Wed Mar 5 10:59:53 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14002443 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 2F5CD1F03C1 for ; Wed, 5 Mar 2025 11:00:23 +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=1741172424; cv=none; b=h7LcgjaDRcEwER3fs19di3YTUi5xJj06rlK04Ep22xzslA6umOJZp7RhC7mj9fSVbvty9ajhm8IhjeTHZ5mFX2Jefir8cdGQ7CzFr2AzI7D5LxVATI217GpySF/VgTrDB3g2X1/aF7pwyZyYJVheRVEijTKw6AsdH0qi1yyrT1Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741172424; c=relaxed/simple; bh=l8XTTzYZTexQuN0rQgrmnYxsaqNiFhSaahEvEc4TTkw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BzMCr43Ys27u8W4iVP2adqeLxH3MZ/3/BtUMgfpOXmCucXPJzebHkNUIpQaY84sVE9BYw6rORImUPqzFKP+8oEeU3rXUM+ozJq2s+dKEhCBqNCcF+NBs3JksV8GFbKdbjHsDiS8DYRMtdSDSeqdRfa/vU07xz4eS4HcZkbKo2xo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OMGgcTUk; 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="OMGgcTUk" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C4D9FC4CEE2; Wed, 5 Mar 2025 11:00:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741172423; bh=l8XTTzYZTexQuN0rQgrmnYxsaqNiFhSaahEvEc4TTkw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OMGgcTUkfJNR90wcUDQ4kyYchEMv6AClrmu9myYQqed7eYUdu7iQzMp8Uem+04ZnF 3sQVyjyRSm2eAn2S9DiCrq4cinppoeNZdUfhAkxX2IC4T9R95iAGgaf6GAepR0dYUC uu/bKG0oISEbQZqXdpmtM4Qhy60EkZ0pHNUeAdCd9Jzc8U1p71nivUv9rEKTAkJPuJ 3Sr76CleMpTrTAnGi7ea1McLKzaPIFJBebtLYC8lXaH0jCDBvCI3r90UfAxQXg+uCD 81hiOkqyo0CWuWHEDxgRvZ1+VGHAalBJhXd0wCLDtgBGY1G3Bik/ca/dtoL3PJGOEU 37pIdS2+GTwfg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v9 12/12] selftests: mptcp: add path_manager sysctl tests Date: Wed, 5 Mar 2025 18:59:53 +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 From: Geliang Tang This patch adds a new helper set_path_manager() to set the newly added net.mptcp.path_manager, and test it inside "userspace pm subflow" test. Also check if old sysctl net.mptcp.pm_type is mapped successfully. Signed-off-by: Geliang Tang --- .../testing/selftests/net/mptcp/mptcp_join.sh | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh index c55f5d526769..c140860ab754 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh @@ -91,6 +91,19 @@ CBPF_MPTCP_SUBOPTION_ADD_ADDR="14, 6 0 0 65535, 6 0 0 0" +set_path_manager() +{ + local ns=$1 + local pm=$2 + + if ! ip netns exec ${ns} sysctl net.mptcp.available_path_managers | + grep -wq "${pm}"; then + mptcp_lib_pr_fail "path manager ${pm} not found" + return 1 + fi + ip netns exec ${ns} sysctl -q net.mptcp.path_manager="${pm}" +} + init_partial() { capout=$(mktemp) @@ -3619,7 +3632,26 @@ userspace_tests() # userspace pm create destroy subflow if reset_with_events "userspace pm create destroy subflow" && continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then - set_userspace_pm $ns2 + if continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/path_manager'; then + local pm1 pm2 + + set_path_manager $ns1 "kernel" + set_path_manager $ns2 "userspace" + + pm1=$(ip netns exec ${ns1} sysctl -n net.mptcp.pm_type) + if [ "$pm1" != "0" ]; then + mptcp_lib_pr_fail "ns1 pm_type mapping fails" + return 1 + fi + + pm2=$(ip netns exec ${ns2} sysctl -n net.mptcp.pm_type) + if [ "$pm2" != "1" ]; then + mptcp_lib_pr_fail "ns2 pm_type mapping fails" + return 1 + fi + else + set_userspace_pm $ns2 + fi pm_nl_set_limits $ns1 0 1 { speed=5 \ run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null