From patchwork Tue Mar 4 11:40:28 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14000535 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 45AF21FCD00 for ; Tue, 4 Mar 2025 11:40:47 +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=1741088448; cv=none; b=DaI1kVJYcBc8xBgYAL79BAPhcYw9iyiLd43WX1ampHsuop1HF0PmraJN6ghenIpHR7OMbAmqbyxIGB4zwWh2W7qdWVWJcGrMbnsK8EfdNcwWV+/wO0PYAlC0hg7SSTGKY1VYt/xuC/d7TtUoDqxHU5P/rgUkTW2s890Dk732TYA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741088448; c=relaxed/simple; bh=AMoCLzwdQN8g4OTUtlZqh3gfR/+9q8YNFMizS0RV/Vc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=i7gwZxYIWqGmsu0yezZ0fYiE0U9ZkbVSdCDXGG4TQimdi72LMea+5mVljzpboEyx11XSh9Lr4kCe3bY+Jfcd0gHrLfOgceWLpBIzpQaQKMcr9TILztBJ/QpIjg79OavxuxjlyactrMnO0BOTkDUjvWL1sY3Lb7MGGeiMCtsBFMU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oFeOmL+S; 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="oFeOmL+S" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8F113C4CEE9; Tue, 4 Mar 2025 11:40:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741088447; bh=AMoCLzwdQN8g4OTUtlZqh3gfR/+9q8YNFMizS0RV/Vc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oFeOmL+SoyQaK+3jJD6XYgKWnKMUfPfZXSI4P7N63biEXL52i6Ak712YMUYr9E1Lo 1YlqF329ZKP51mgyOC4Lq1eyAXXfjbyKJtb3gSnDCV8GIIjZOnGH6dcISRePITSAO0 GMc42FXh93asVDVEDVamnWYdkyYuOOlEgzb3I4SyThNpCwo4Xvjam6qZL1dITjW3eQ YIBojS94VrrJkibqgduSDybBpmppfLTnb5r2tCXbJZt5HaCooR2Xtgap4op6ZUL2XD llYjdhsjTsD4IseHTpNW6wBu1eGw5TqA4Eb1bJ8L1fbMYscD/2Hkf+QCYQajglw36f qMnodFc7xM2Fg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 01/12] mptcp: pm: define struct mptcp_pm_ops Date: Tue, 4 Mar 2025 19:40:28 +0800 Message-ID: <4f1f5c350a67ac7116dd5b6daea1e57d891e8c52.1741088339.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 In order to allow users to develop their own BPF-based path manager, this patch defines a struct ops "mptcp_pm_ops" for a userspace path manager, which contains a set of interfaces. Add a set of functions to register, unregister, find and validate a given struct ops. 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 Tue Mar 4 11:40:29 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14000536 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 9BD3C1FCD00 for ; Tue, 4 Mar 2025 11:40:49 +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=1741088449; cv=none; b=Bi1GPDrKBDbMuZ45Mc+9BTA7K6UABWSyYXnUanopuGIVtTF9H05Kz30h+UdOHFbNZf0v/D3HgV0LScr08x7ppR7rvCtYdO082v/M8SEqWq1YbzC6RZXRCz4riO4aSX7sLEgNTVCSCSFZ6keQpV1nEBagTs0T7asy5RRT4VcKE68= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741088449; c=relaxed/simple; bh=N4TiRpcKY/hadngNzgMwXWTMRiPoa5WEUgsEcmFrUbw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WhZ8cVsTDem9cXftorwTBQTPs6qRL81orpzDhNj7n7VQRvotZG7ZQh3spohGURdyMjdWAguNaMx3R/p49Bwk1dlyURVzGDPSGOdmDYSiIoBXvExwmulC7eIRI2Oa+yt1fLZNoJArXE2l85lTLLTMoQl9KbKEkwOo3o4DdoKam2U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EkgeraBP; 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="EkgeraBP" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4FBF4C4CEE5; Tue, 4 Mar 2025 11:40:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741088449; bh=N4TiRpcKY/hadngNzgMwXWTMRiPoa5WEUgsEcmFrUbw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EkgeraBPBR0YRKGM8uKQ4U7sQzVaoNNfhBZqQwTRCffcDBj9g7ywxWytt3edN8FLj EClSwNiJhv35FpHULfvkpf1hRBkhEBg9Ws5lommiyyYj6H9uL2CBVYqtEb5o2WpBfX YO2Z/YUY+3pQOYmEYG1xyFEwCTddyJ73Dqauz3OJCjTl4FBSN41mv7064ZtFappCIR s6DiinlbgQA1qFgT9b1Sh2Qjlenah1QDiS8HaFcyMmOsS33M31DfX+vLS9h/l+bq18 fsRhT31ZRAbmvMUjHCIi/khoysQ31MnLFy/ge1n3IwV/0UV5y4HOGT3rTBfjqSLXCv rNUP+gjW7Kzbg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 02/12] mptcp: sysctl: new sysctl to set path manager by name Date: Tue, 4 Mar 2025 19:40:29 +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 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 Tue Mar 4 11:40:30 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14000537 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 776731FCD00 for ; Tue, 4 Mar 2025 11:40:51 +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=1741088451; cv=none; b=RwHdFKlT1/p8x1CNpLLXcMuC6nemB092kjJdfPorsIaK0kXhUrzvMtNCOJcUdbct6uhH67fHQP+XjplHn4A3W+hppHS5Z6n93BR4YCGKze+wdiznvCVPXosLWmqBOMbD/hA7LG+4NsXUL1UK8bk38Ba6KK/nqLuhtQhPQMOQSII= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741088451; c=relaxed/simple; bh=PG/XnEEn89IvGx7J1zeFTk0Clq2WvrZ5pQN/VQ+Xphs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qM1oJ46hv8LzQtvNSWkySDVyf3I/JW6IBzTIZOd+Xd2S2M1Yx67yXun+txmMWIz7v1pyfDvZXYSKEZ2gRBvSBx0d3CRWwwXa6sRAuGvVU60/7T9FUevme2Xn1jK2oyoYbgYUE/6HoYj0tIcYz8561Tfup8NllIKQDySxEoyA+UQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cRVR10tp; 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="cRVR10tp" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 292FAC4CEE5; Tue, 4 Mar 2025 11:40:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741088451; bh=PG/XnEEn89IvGx7J1zeFTk0Clq2WvrZ5pQN/VQ+Xphs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cRVR10tpn1XQMDUyPjEbCX6320/VnVLRFHHIAKKUEJIi9SudVA/q0HuiB3oXVV9l5 +DzucWPGsGi3PG7Yz2g3XcH3FctixdY+MyHy43QvKY2NWCeaBjBcRuMWzWLwMVg6Df an5m2ovHWL2Ghv95CjCLTL0ADEo+rHIXOAQSL159SrtH4AbY4z6azbNqAKf0F18xZi OT/e1ISnxcpxWbNQec58LQHzl41o8KCwaxIEe4ml+SkpP6sefvzleAA+twOT9t0qPf 2T6t+9LBPQlFRvJm+IUCKEVUJHt3jYm07/hp7PYlu3yvqYG3RiqWieCx8OjStDEk6I ljisOqvUBuMxw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 03/12] mptcp: sysctl: map pm_type to path_manager Date: Tue, 4 Mar 2025 19:40:30 +0800 Message-ID: <4edb40bf773e65c00d4447f4795cec26f9a047a3.1741088339.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". 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 d64e6b4f6d1d..d425fcbd036a 100644 --- a/net/mptcp/ctrl.c +++ b/net/mptcp/ctrl.c @@ -217,6 +217,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", @@ -261,7 +287,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 Tue Mar 4 11:40:31 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14000538 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 50B8F1FCD00 for ; Tue, 4 Mar 2025 11:40:53 +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=1741088453; cv=none; b=uP5NShZIbvCV2+qJrlsP//rt87qSM0l3fYCM7ot9DbogwbHouDR9XUVyjmLyoZ4DAqPq2cGKmBfEdyGGuxkw6chLDySdXReyv9L3KdtW/S0UWgzyDWGAWgvmsVIXQJtHtjhpHr+qqXoT1fKDvckXvyDQ34MxI84Lcd5tQtAQfI8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741088453; c=relaxed/simple; bh=IwS3BFgFmFv43uUVZdWzQ1w6iSYB3L/icJKvrdhmUYU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ANdO8jgnDnofnN62Cxjq4HMqsDIOIW/0jALQ87sJIK3c8wH6foyVUJyBMw8FtigtWLnku1Z9rbtxipWHOrNk4ukect31pFsgHkTRwGNkwodpoiJhMOuKJYMCWRH68L6MjVWjwXbkR2U9vg9D1iWkvkzaxfzAX2ylNpGrSM+yvf8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NY4f+wID; 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="NY4f+wID" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 028C9C4CEE5; Tue, 4 Mar 2025 11:40:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741088453; bh=IwS3BFgFmFv43uUVZdWzQ1w6iSYB3L/icJKvrdhmUYU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NY4f+wIDJsbZYRh3kxnIXkWg5I/ywt3JM+MMJ1K5e5WNHyYl/c5p4r+/wxMf6G992 46g1PbV8qiTqw60mSwqMWJS7J04uoAvLS/Vn2nMsTr8QbnNq977pe+KsdOEuY15+Ru f7LMNQCYUPV5a/RCm1LyxhfdmuH37ZA9eSBe8fyw1x6r6blgv6i6yqxbXuu9r+IdkY Mf1PsFSjYyD7DPiACVorhHKdsl+AZgC0AEJJSCZyogHqCKraOU042aM/b2LFfEPIUc eg7kv/fNFR8Nslw0KRrlmlJxfjpDEEUX/eDojl6sr1IdqasW73R3P++wVnKgo5wW33 ud9pfCUT30S4g== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 04/12] mptcp: sysctl: map path_manager to pm_type Date: Tue, 4 Mar 2025 19:40:31 +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 maps the newly added path manager sysctl "path_manager" to the old one "pm_type". 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 d425fcbd036a..a158a337cdb5 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 Tue Mar 4 11:40:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14000539 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 03BFC1FCD00 for ; Tue, 4 Mar 2025 11:40:55 +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=1741088455; cv=none; b=CiP0Nh2jf+t1fUhPbyM57CNA9dsxYIDWOyPaDv7ZoKgXNvVTL9X32t6TlJlVr8mBqs8V3tMTDCHIrdkrvQSvaz680ex1J1cQmthHzi8iqoSX8fnn0h5h0ywVVDIbdalOeSzoJDMwEz5u0CWQ13woC+WFImSrSOYRrc/zDl5QooQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741088455; c=relaxed/simple; bh=CNlCjvO+evCdk99ycH+QFZSd7wq0KDVvs5Fg4V12WwE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Sdl8thvPGm89TDkmI/djwuyY1xPsMs9VHp2QJcFGg289YoKDvs3Q4rHto8qvlbPQouz0Gxt4rimMDgVy9IpnM+Wq5xQhmP6cNBlJP09S+tVQ25boyNZvPdxjRC3olO8FhlGF+L5RMUE2FkqTER0EdrPZbK4WSzNPtkqQ29VygPM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kdaAK1n4; 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="kdaAK1n4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D035AC4CEEA; Tue, 4 Mar 2025 11:40:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741088454; bh=CNlCjvO+evCdk99ycH+QFZSd7wq0KDVvs5Fg4V12WwE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kdaAK1n4xIEQx5VlLhlpmZiA6OghGVlrrHJ+DwFtyZQw7VL9K5CPM8BKaUcc/4HXL ZJ62LBI6pCqVGp0mRK2m4Ek5JnlpoOMqOG7IWFEW2WIlXJMVv+otuiJgk7fUDUj8j+ 9Q9c5lTtLJJHzwSFM0pP2aFfeJnm1fpphAGYCELC/s3TW52i2rSeRvazGWmDzIvKn6 KntIFUha5+z6LRB5Pf9+wbfZB8OwxL09PwmxNRHiZs+luKs6XjRQ7W+AuJHJfDIljx TRJiU0F62OETRtYZtas/qZNOvm7TgP4jZ9PlIOG8nAyl6l1Ox9Cza6QhHcln6rgqeL xS5lSXyEDqQnQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 05/12] mptcp: sysctl: add available_path_managers Date: Tue, 4 Mar 2025 19:40:32 +0800 Message-ID: <7dcac63624dd38bc9e506e6f8ca909e6c4fcd541.1741088339.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 Tue Mar 4 11:40:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14000540 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 D0D5B1FCD00 for ; Tue, 4 Mar 2025 11:40:56 +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=1741088456; cv=none; b=BRCVTRNm5UV6ttMb2lWF3U0/cqsAl/dQhpopQuGK0CgIsRX2ktHF0DagPYejNRbmYKTZgmgF7dfTJvAV6qk/U9bcJojb2NYwh+HEr3HHP+IN9jdIu+DdeVxv2LixY8sXN2x4ko6CMBfyzkIXKTvI29SMY4AjZpdANOGm9sqOr78= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741088456; c=relaxed/simple; bh=uXFFIXiuMCSlu42AECY9nVz9kE16q1RrBYXcZyeVnSI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NBiyrvKv7Aqu8oEHac3MESK/09+ldDiLT5srDqhm3PZy7z0lhrEIMozaGqxumvoJmZ4D81CdBtiYOP1AGUTha+TaefDSbvZoJ0LVIvJ1RmOsXfECycTptPqptTWgoE1GcqRgXnJPUZdTpe/4kpbYjv4bSHb/910eyN1tgPEUmX8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QI10oBgJ; 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="QI10oBgJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5F21CC4CEE9; Tue, 4 Mar 2025 11:40:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741088456; bh=uXFFIXiuMCSlu42AECY9nVz9kE16q1RrBYXcZyeVnSI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QI10oBgJ9LvTN3Y81/RKweUoG+UD31nLmLTgRBmWpvJ31qdFY1MCkiAjoX0sAkJJg v5Nv6VMABZ6JXywajAjgc30obNbJy6shM3ltAnyx9yKx4Yhvj/ikpSYxJOUXFQwtl7 C3Asz6Mz21xcWCFO1jWUVbnrXeKEbUWS7SeHga+9XXrjoRilBI6TP7B6ri3q4ui8kJ nnFpGN+GTW6gajETG7IToHgAkV2Rl4AQOck99gtmJDhxwzzctzM0dMqvTPsIUJ+2Iw MrgqYHIMv3SrXVXBEnEDM4nqh9vcDwRsyd0FvEPaDgIDXZOIIK4Ppfwh+hZviup5HG Myq6ugaQfzQqQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 06/12] mptcp: pm: in-kernel: register mptcp_pm_kernel Date: Tue, 4 Mar 2025 19:40:33 +0800 Message-ID: <818c00e2242d2f76604c6d70176ab6fa94d7eaa5.1741088339.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 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..e6a1aef738a8 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_nl_initialize(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_nl_initialize, + .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 Tue Mar 4 11:40:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14000541 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 6C0A71FCD00 for ; Tue, 4 Mar 2025 11:40:58 +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=1741088458; cv=none; b=sPIMFLZZEySttPDL7ej8N8dQAI8vXVAAmefOLATB/ebOjwOfusWRaU8Mpv41lrUMLB1vUJMsmSKTgSol64V08vIv7oUw1PqFeOi2EDE3oTvkcWFZ9YneqAOqGLE2kHvtKOMLs/DsfUQg8LcMro3VEsg85B6palI6fmn5twqen1M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741088458; c=relaxed/simple; bh=cYBFZJj6SIuhneFq7DOaEhyk+/fllYGptmTWK49koYE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LKDZ9EoURPgJZUDzeTI1fVxY+Ddq/vOI4d0naZ0O3Y+FSKPAdILnoPlsxuiFDz65G0hjR3Vf48g5YN15VgjgcxUdtHVHjijie/VNeIQ6uIx71Sy30auMbN+94ZWeWG0VRntkQFWK7ZibyhvqfW/Awx0auv5nAWZiwdiKIYYg4Wc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=r0p+cqxO; 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="r0p+cqxO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4BC43C4CEE9; Tue, 4 Mar 2025 11:40:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741088458; bh=cYBFZJj6SIuhneFq7DOaEhyk+/fllYGptmTWK49koYE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=r0p+cqxO2L5LMxPOIAqH5BqdXP4umVzwBgyUYaZXX3CKiSCUsVfVdKpRCz8CiPtVF 1Ho8vVDwBPFyyRBV9FFneAR2CHl/GTVnLAg+r9dTE28zg9WeaqvOmhZEgDBe0d1QER ZJZBSE3O4r22TWDmqqcVqjav3r0WsbAOr3zPmasyMgmFIsItA3J/yy39ql8g+pjpPC 762QxAFQV6TDk2o6auWN3QC2gsmE/7e+0pKiU2UJELIvARhT78O+FMLUeU1HACe3gF OD+BNMmT63wNaSA1wVIcPqkoQhTgyC1NG2A67iS6RQO2Cz2TfxdkxU8un1QOnWoonG 0uKm4zTdeyZZA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 07/12] mptcp: pm: userspace: register mptcp_pm_userspace Date: Tue, 4 Mar 2025 19:40:34 +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 userspace path manager as a new struct mptcp_pm_ops named "mptcp_userspace_pm", and register it in mptcp_pm_init(). mptcp_userspace_pm_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..412d6c912148 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_userspace_pm_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_userspace_pm_release(struct mptcp_sock *msk) +{ + mptcp_userspace_pm_free_local_addr_list(msk); +} + +static struct mptcp_pm_ops mptcp_pm_userspace = { + .init = mptcp_userspace_pm_init, + .release = mptcp_userspace_pm_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 Tue Mar 4 11:40:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14000542 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 3A58B1FCD00 for ; Tue, 4 Mar 2025 11:41:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741088460; cv=none; b=ZdeuFTKiHruPUg+lLJuUcNIxn5JHNaree/eeLnIERB193f8SXvQSPPFUnztFJM2k5Ds1vCm7dQGJsSZdgiV8fOh/MbtazgnEk1QlPlKD8NvL8Pgl34S/1SxX/ScoSoOPNRfPPRXa1m0pugCL+YdWwPMzRsZjJe7pLm/oXw+c/gE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741088460; c=relaxed/simple; bh=7kmuYrhl2Xl4uqSRERyCWJy8xKADI41slbAAHA0FDLU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XvHZQCbBKjDEMfIeO7POIQE3sCb7MnuS6ULr6ZN1Xwxjhc45REJjOac5KjH4BoEr6M1EYch1daeyvbKyiSO+dYaIAZf2p1xZZgeQI3x4tM5qnaicNjHpmam8R2Gl5lyGoza14VMV9BHdmeHUqKj81l1S4AWbTknNKPR6cskTAzc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=stXjk3Ws; 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="stXjk3Ws" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D68DBC4CEE9; Tue, 4 Mar 2025 11:40:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741088460; bh=7kmuYrhl2Xl4uqSRERyCWJy8xKADI41slbAAHA0FDLU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=stXjk3WsvHupByLkbaCcTNDHUYxZGq9dxHjhE9Ap6V4JAcxYAGkZRjFM9eG1bAYBS yP2WV38423JkDevLHQR50HZ5aFZr8TFQxaIL3cbqRFS4ekL75gkV5tNY+h2MM+K+/x C3kOSrDigZO1mSY59bGkqvVpNT+3mddQcsf38LHH2u6+Algsf+tUVNlKVoZfn1EhAu eB0YBPhQNqJAX8DLoVUWHzZfeKcq3zz7PwNyKHcuSjWcT2mUrJzGPHfN/5s9Oo+/AN QUH7yLfjeay6NIpNr6EssWHBk/RvuW21DNxrbpQhA/joU0Fqm1L+CA5ipVgc8rSuf6 +CXJH5BS6TcmQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 08/12] mptcp: pm: initialize and release mptcp_pm_ops Date: Tue, 4 Mar 2025 19:40:35 +0800 Message-ID: <0fd4e42c04c60d63c11463c792084b751c4e2e48.1741088339.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 Add a struct mptcp_pm_ops pointer "ops" in struct mptcp_pm_data, and two functions mptcp_pm_initialize() and mptcp_pm_release(), to set and release this pointer. mptcp_pm_initialize() is invoked in mptcp_pm_data_reset(), while mptcp_pm_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..e4d84aad3795 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_initialize(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_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_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_initialize(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 Tue Mar 4 11:40:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14000543 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 ED2F01FCD00 for ; Tue, 4 Mar 2025 11:41:01 +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=1741088462; cv=none; b=LzFwPrhVhSROzw4F/bGSlLbTNo1q/3dYqTPjTIXrljyXyYofEHEaibm79tK3XbZEsDlV86q2rfPUvWtbd+AmPivKqFZSWRl2Wa4omiAt2Y+/eRKoY/To04FdYKUJTSr2wD653UYRNCTJTQhuJ0KM2QjOLe0UBMH1H1MUIM4d/e4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741088462; c=relaxed/simple; bh=zwmc9iy4HaEwJf4i+NElwtJ1RC20QcFcu/fyDvSstDk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MgrGnzRZqX0e//z59JRNUQS0lmz9dweoY2S+WBzf4PqtGI2w3lAsVGsLQnJO3FH5ZsSMnda0sibjH/5VrmjWuaJUsPPsUzgYgarwg7YVjbi0LiPe/qLjKSR5gPaVsazcwtZfX2OuXaoZyJQocmP4HXj7yC242pQjCBt4efcynWE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=crJhQqFS; 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="crJhQqFS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AF041C4CEEC; Tue, 4 Mar 2025 11:41:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741088461; bh=zwmc9iy4HaEwJf4i+NElwtJ1RC20QcFcu/fyDvSstDk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=crJhQqFSVlBmHOVe+OxOa/IOZsvddMF+vBK5ZWBHAse1IxEIaVDGU3CEcY7ykxEsj gdG83NCwO00rppM4QDLrxacvD24opY8Upjlgv8V2WzTSgFIGBxLKW/kmoeTSAqwORS CF1mKwK4BWrFSph9PgoK03SSdfXkyTBxo+xKKMVDcePngja5xcTeANPQGxpJYKwOjh 8eRQ1YRvowwATPUrfrRuPukqvq+/ShPoQ1t/ckaeJfUNbzRw6exywPT2aL5dRtmeIa gxQ0AbDH3Vy1zrQJ2PbpQq//rrXkGOZ/K07ZWWjeMSYMQNsnNL8cxHV626Z9hXLPDd gbypLF8jd9DVg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 09/12] mptcp: pm: add get_local_id() interface Date: Tue, 4 Mar 2025 19:40:36 +0800 Message-ID: <4325af2ffb85a7a0861d3936f09e0c0278d64399.1741088339.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 Now 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. Then mptcp_pm_nl_get_local_id() and mptcp_userspace_pm_get_local_id() helpers can be 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 e4d84aad3795..1e92bd470fdc 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 e6a1aef738a8..f134acc39101 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_nl_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_nl_initialize(struct mptcp_sock *msk) } struct mptcp_pm_ops mptcp_pm_kernel = { + .get_local_id = mptcp_pm_nl_get_local_id, .init = mptcp_pm_nl_initialize, .name = "kernel", .owner = THIS_MODULE, diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index 412d6c912148..c41ae9cb41df 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_userspace_pm_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_userspace_pm_release(struct mptcp_sock *msk) } static struct mptcp_pm_ops mptcp_pm_userspace = { + .get_local_id = mptcp_userspace_pm_get_local_id, .init = mptcp_userspace_pm_init, .release = mptcp_userspace_pm_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 Tue Mar 4 11:40:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14000544 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 B9E8F1FCD00 for ; Tue, 4 Mar 2025 11:41: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=1741088463; cv=none; b=QkF3ImMy6/AYf3Kr5Xg9Neugra61wCw4+2uHcTajf9kjOBxemRsQxTBWpeC1/p72G7XjZ07hmgT19z+bf6/AWwQ7mTGDrQqD8UFuf0I6F1nnQDko/GNX7GzC85Qc9rwxV/VX2mesomFTJiKdGVevt7465oAH6Jv7bzVArq2MNFU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741088463; c=relaxed/simple; bh=EyKbL7SnzXKnLyYnEuduV54mDm8OzZ9tfSUO3WocoMw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nlo6xyEAuf7XbkNF9yUqc7YEWl53zvKnplvnNoGuu65wDAEs1Fo5V0xXJy91KT8l/EnMP6R5eKwvm8uuDh9+9qlzoerI91qscJ1GILXDlQdJYFHx03a/MhwPA0MSBx+p78vsjF06wrTACMNOboSW3SbzK4z6wnRJ75pHSdVaQKs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fPJfMaDW; 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="fPJfMaDW" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 57128C4CEE5; Tue, 4 Mar 2025 11:41:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741088463; bh=EyKbL7SnzXKnLyYnEuduV54mDm8OzZ9tfSUO3WocoMw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fPJfMaDW1NT2+fxTpMpOwCn3DYPydw3UVQ9iSWggCSPbqgisM6+ahtkT3hNATP/W1 uoVGrK91mqm6Bi5iMJXZpWAZeCSK5P7+e1p6twZC1oZ4huarSezGXv//b84EEfrFXz vysoJTxOOftDb1yeB0ZiEW+trEzFiMexATC4oJR1vQJN8LUtI7CQe32eUwX4R94StE MW6L9t9zhktN4JMFhvNeKfByJ6+0DyP3fFmndJJjZvek6FE5bZp4gv+r8h5RMwmGJ2 cjyZIiBkbEL+W48IYeYwutCbpgqVDQybgj7Giyeuws8jC6cSIs1b3n4daS4VzjEvSa 1mLZE35Y5FURQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 10/12] mptcp: pm: add get_priority() interface Date: Tue, 4 Mar 2025 19:40:37 +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 Now 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. Then mptcp_pm_nl_is_backup() and mptcp_userspace_pm_is_backup() helpers can be 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 1e92bd470fdc..51866bf16d02 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 f134acc39101..8d661084daf3 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -722,7 +722,8 @@ static int mptcp_pm_nl_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_nl_is_backup(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_nl_initialize(struct mptcp_sock *msk) struct mptcp_pm_ops mptcp_pm_kernel = { .get_local_id = mptcp_pm_nl_get_local_id, + .get_priority = mptcp_pm_nl_is_backup, .init = mptcp_pm_nl_initialize, .name = "kernel", .owner = THIS_MODULE, diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index c41ae9cb41df..e219a2d37429 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -145,8 +145,8 @@ static int mptcp_userspace_pm_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_userspace_pm_is_backup(struct mptcp_sock *msk, + struct mptcp_addr_info *skc) { struct mptcp_pm_addr_entry *entry; bool backup; @@ -699,6 +699,7 @@ static void mptcp_userspace_pm_release(struct mptcp_sock *msk) static struct mptcp_pm_ops mptcp_pm_userspace = { .get_local_id = mptcp_userspace_pm_get_local_id, + .get_priority = mptcp_userspace_pm_is_backup, .init = mptcp_userspace_pm_init, .release = mptcp_userspace_pm_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 Tue Mar 4 11:40:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14000545 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 7D34A1FCD00 for ; Tue, 4 Mar 2025 11:41: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=1741088465; cv=none; b=k96Hj9Gqoykz/8tuliXmKqTOr/tgWgH7URgsLCfnMhpC7YxizP7pgiADzTVbEUJIMLe1nOWYHPVfiLVNpK2pnD+7xpjEYNnC7nU+3l36EgfspmTIxrj5D8+DuRYYK3SsIkmUEM12N1qOJIN1ofv/B0ZSPGgIdzU/9BcVm0F9Dic= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741088465; c=relaxed/simple; bh=+PQKihkDXPlndYbmwsdiDyVQpIisjZCnOzJvYYcl/pI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NEoRS+2tJUNMCTQntCiraIEQJbViHmLMmiL3m2Lfw+65XFtpDT4wodR2J6h70OVQCGr71hPIQo1oO1JE16FCaPhNIMj03qZuNTFM1NgnnheIa0yDDGbfMsrQ03WwqEYOVPt7whJ9aqGkMa7ipHOUivOrfV2OBwfJ/+ukJL98jEs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hrNfUb7Q; 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="hrNfUb7Q" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 30EE2C4CEE5; Tue, 4 Mar 2025 11:41:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741088465; bh=+PQKihkDXPlndYbmwsdiDyVQpIisjZCnOzJvYYcl/pI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hrNfUb7QyfXFvabOuyrrb8hDcWpA8Jx204Mt04g9mSe7MwmkpnqdSL68wb30rx/Kv UuivNlcUze/cVZNF7cTHUeW2jkd+A/N+8qvtDF2NAdc1m8zEy5kUiTo12uuMVrs+dc usX2JMLwPudgWl/4l0zT9Jx2IupDnq0+CzxxdDfSc2Jmz+IiETWbMmOTa8nbyEU8GU NSFmteA366KwIwwKc4Bg5I0mPCca1O+/0Flwt9kpxG2uvKWVvh/JvBHutcX2kgJIkq lLUgJxYyeFwCGJ2XHN8TYEnOfCjfOmaooERfkLM/LmjDEaEfTMav/RD5pvE9JYPH1r f3zO6qzgO8zBA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 11/12] selftests: mptcp: add pm_type mapping tests Date: Tue, 4 Mar 2025 19:40:38 +0800 Message-ID: <5af6ae4fa325ea616e4f65beba00a0a20afb60bc.1741088339.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 helper set_path_manager() to set the newly added net.mptcp.path_manager, and test it inside a userspace pm 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..fa1929ca6ad4 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 pm_type 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 pm_type 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 Tue Mar 4 11:40:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14000546 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 1769F1FCD00 for ; Tue, 4 Mar 2025 11:41: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=1741088467; cv=none; b=HxLd4kjKBng477wFU8c0e/ZoPcjCToBPIOSqqPNDMBSp0zqovzEPKx1Q7tjbTf+pwwjDt2G7oP0R6Ahm6hHjQYHoNFxUZKwI6TjKLnZc9m6a3DUUhaTA7GwbBjDqZ6vKt/3r5a0Ps5Ix8aMb8wUuNGfKPuAzf1IW6Jstc9uCClM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741088467; c=relaxed/simple; bh=sbUWC9SquLlleHoOdk86wuTG+zOwj14mSkxTPeXU8fU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GORpeBiL9i/U+38akPTjQkY/GaDhJXmkbBoiq1aLuE1DDxSUurE5wj9I2Hai2LUUIYt0zxD3g0f1UFL/ulctFqGqgBq9rDL7Icus57J1GSwsQu0M68ZIXwEmI+iL3a4tx5mFHStE2NdTGChcHwr/SULRLtfUbMvoBJkW0QDCYTs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Qj+x2wvY; 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="Qj+x2wvY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E55FEC4CEE5; Tue, 4 Mar 2025 11:41:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741088466; bh=sbUWC9SquLlleHoOdk86wuTG+zOwj14mSkxTPeXU8fU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Qj+x2wvYX7zwfuLB/cG2Clqg7AMNqj95TIeL9P1CKJoIFCfJG49mSWm1lNnPzqVJT X1xe30paTLOrCQ/G6SEdvWi30D1Pa7xEP9DscEz2NQOu6rwXPfJ4sVgNGKuLh7pb6q g9DHPswdfLNBsmCRhZMiP/2dE8Gf4+RQIT/7gbJ9emZhwK/WtB9NSACORVQPinIUyh Ot4CZKlmqGeJFu9B0XRi2Lwuwi7DqAe4LTOIH8/GcCt3GMg6xK0S66Md0KsVyN0Xeg t421SDN38Zdjevi7g1RxHtYMCn/Kv1L94YJg+RjOPLjIsL/DG0QoPbA8d8CBp8dp5q VRuv5TjiE44Gw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v8 12/12] selftests: mptcp: add path_manager sysctl test Date: Tue, 4 Mar 2025 19:40:39 +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 a userspace pm test. 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 fa1929ca6ad4..3b43b42f9abe 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