From patchwork Tue Mar 11 06:31: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: 14011208 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 B881F13C3C2 for ; Tue, 11 Mar 2025 06:32:17 +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=1741674738; cv=none; b=U7S44xEOYKIz0dlquTN72ouP5xijxeISLrrbzB3Kq73FikRS8UOUEPVj9rJ9H5hM/55J99jOz9cMb5Nm4q+/lm7MkTNs/ybbqtF0DA0f0GQsS2B00SMIJF5RTb3MzzBMQ+N0Q0kzIyaDUkHG8t9a1GCyEFb9MzQ63YJSxQaue9A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741674738; c=relaxed/simple; bh=OhwYR31+IhA2KME5QZm3e1i7HD/AKq4Nksok1oesewY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RVH+pZLdZx+7vwPp0+oyJ/4BpjWU9Jn7Tvqkeo6D8j8X+tu7S3nQp4UHFcAtrfPGNM0M5wbKu9zijOVJK8iRaNP5/Y/uwLjG4EUNDPOg8FBSylO0vHnOSUJjZL9BD8eeybQCfYxWl5mkm3AvREUDIPqQqtT2GXRwW6StDAQ7ld0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KdF0E1/2; 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="KdF0E1/2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2937CC4CEEA; Tue, 11 Mar 2025 06:32:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741674737; bh=OhwYR31+IhA2KME5QZm3e1i7HD/AKq4Nksok1oesewY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KdF0E1/2shi64LRZpRTFvRF7TaV55tYE/kJ+NNAUdUDvkEGBfmlfbbcDGrUy8ASA5 hwe9AVqZjHxkT2iyDB5QDdfcOWPnx4ypjwTWFtRs/hERq1uLdwX2Pnz6UaNw3B/nqe yOlUtJ/ikf0srTQ4fxJgNUw7+DUN17PmEoMXFXWYXorOOCvGM2u/oBzJqXZj0nJj9D Pm8Fr8Zomhz0rs6YbRTHGw4+2XG6hClO2TbHOQKHcKM90Wq3aP7ZTnS+i2M35ELrh5 9irJtJuC1/CI7+12GD0rlREatzQgVV6eWOskqHQ6SodQ29jB/3rA6UCpgpdZ7S0KPi Sr6xCYr2Z25Lw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v11 01/10] mptcp: pm: define struct mptcp_pm_ops Date: Tue, 11 Mar 2025 14:31: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 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() interfaces are included, subsequent patches will add others step by step. Add a set of functions to register, unregister, find and validate a given path manager 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. mptcp_pm_unregister is not used in this set, but will be invoked in .unreg of struct bpf_struct_ops. mptcp_pm_validate() will be invoked in .validate of struct bpf_struct_ops. That's why they are exported. Signed-off-by: Geliang Tang --- include/net/mptcp.h | 12 +++++++++++ net/mptcp/pm.c | 50 ++++++++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 5 +++++ 3 files changed, 67 insertions(+) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index e9832a8f981e..69f7b35e57c3 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 */ @@ -112,6 +113,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 85ee999729a1..f4948a2cf9be 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, @@ -1015,3 +1020,48 @@ 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_ops; + + list_for_each_entry_rcu(pm_ops, &mptcp_pm_list, list) { + if (!strcmp(pm_ops->name, name)) + return pm_ops; + } + + return NULL; +} + +int mptcp_pm_validate(struct mptcp_pm_ops *pm_ops) +{ + return 0; +} + +int mptcp_pm_register(struct mptcp_pm_ops *pm_ops) +{ + int ret; + + ret = mptcp_pm_validate(pm_ops); + if (ret) + return ret; + + spin_lock(&mptcp_pm_list_lock); + if (mptcp_pm_find(pm_ops->name)) { + spin_unlock(&mptcp_pm_list_lock); + return -EEXIST; + } + list_add_tail_rcu(&pm_ops->list, &mptcp_pm_list); + spin_unlock(&mptcp_pm_list_lock); + + pr_debug("%s registered\n", pm_ops->name); + return 0; +} + +void mptcp_pm_unregister(struct mptcp_pm_ops *pm_ops) +{ + spin_lock(&mptcp_pm_list_lock); + list_del_rcu(&pm_ops->list); + spin_unlock(&mptcp_pm_list_lock); +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index b5c945064baf..2307f2fcbe9d 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1052,6 +1052,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_register(struct mptcp_pm_ops *pm_ops); +void mptcp_pm_unregister(struct mptcp_pm_ops *pm_ops); +int mptcp_pm_validate(struct mptcp_pm_ops *pm_ops); + 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 11 06:31:54 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14011209 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 B2B3913C3C2 for ; Tue, 11 Mar 2025 06:32: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=1741674739; cv=none; b=mf46YIwzTRvu20rItWdD+rCyOw/Skp58560a7Bv9uGt7gloNciErcc/CVGHE5DOeepnVvtra4DgXnH7yKZgz74kCDqfkA5tXzfN13VcMWZpfa4nUwEb1Y7sAJURKNKhFwYHHW98dJtj2UVqusRMBCRfSU4Uf+5rwcqum8q89CYQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741674739; c=relaxed/simple; bh=oNWnP3dFUGf54fFAbPaMRgKKSKm2ROkfP3OqKveubjs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qPmtAHifPdujeJcSQNhfspLZGsrlpLFqfI235F/fnZijAfRH5j8pX88pK6THLeO17Rz8yk8iBYxy9NB62XPgkUIt/Buq5YGAj9OZFrxbKgYvDVf8y0r0RNn9vr/TnuBSk9Gsm9TTnO/FBbe4PRdlcZVbm5HcyhoizsajqHEoiSc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YvUCs9dy; 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="YvUCs9dy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 02D19C4CEEE; Tue, 11 Mar 2025 06:32:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741674739; bh=oNWnP3dFUGf54fFAbPaMRgKKSKm2ROkfP3OqKveubjs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YvUCs9dymmXoO8Dm7Q2jlQYnOFKqByXmExli7T6oW0O3AGUfwvnud6lV2MvCU6FYo Y014rfUYT6tTuABKn0PlgtibMORvR/1Na5e8UQwx3RskGrJWTe/OHyA8BQ8A2UnBoM 2jaUbUBxPYdehjbsjYIRkvWpDXd7qmRJx+YUMp/lGFXS3tfpqsGSagMvuVq+f6Yovm pUg/iq8KtRx3H31DY1O12dQ5CLgNHAX1L67B1jALaYMqZ9rX1anrgASgI/bAPnoO+o nmoYnR0SZH+dh9nfAHENNIKpD+vpYeMq2Dk5wSCU+IB/EMa5nYbfSzY4fBEqc0UKYg Lve4jAIruC3YA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v11 02/10] mptcp: pm: register in-kernel and userspace PM Date: Tue, 11 Mar 2025 14:31:54 +0800 Message-ID: <2928be52eee7f083a74c71eeb70c6c046cf5450c.1741674285.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(). And define the userspace path manager as a new struct mptcp_pm_ops named "mptcp_pm_userspace", and register it in mptcp_pm_init(). To ensure that there's always a valid path manager available, the default path manager "mptcp_pm_kernel" will be skipped in mptcp_pm_unregister(). Signed-off-by: Geliang Tang --- net/mptcp/pm.c | 5 +++++ net/mptcp/pm_kernel.c | 7 +++++++ net/mptcp/pm_userspace.c | 10 ++++++++++ net/mptcp/protocol.h | 4 ++++ 4 files changed, 26 insertions(+) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index f4948a2cf9be..3896f21a46bd 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -1018,6 +1018,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(); } @@ -1061,6 +1062,10 @@ int mptcp_pm_register(struct mptcp_pm_ops *pm_ops) void mptcp_pm_unregister(struct mptcp_pm_ops *pm_ops) { + /* skip unregistering the default path manager */ + if (WARN_ON_ONCE(pm_ops == &mptcp_pm_kernel)) + return; + spin_lock(&mptcp_pm_list_lock); list_del_rcu(&pm_ops->list); spin_unlock(&mptcp_pm_list_lock); diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c index 806a9b5b3c07..d39e7c178460 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -1398,8 +1398,15 @@ static struct pernet_operations mptcp_pm_pernet_ops = { .size = sizeof(struct pm_nl_pernet), }; +struct mptcp_pm_ops mptcp_pm_kernel = { + .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/pm_userspace.c b/net/mptcp/pm_userspace.c index 13856df22673..2cb62f026b1f 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -682,3 +682,13 @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr, sock_put(sk); return ret; } + +static struct mptcp_pm_ops mptcp_pm_userspace = { + .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 2307f2fcbe9d..f87c71550394 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1052,6 +1052,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_register(struct mptcp_pm_ops *pm_ops); void mptcp_pm_unregister(struct mptcp_pm_ops *pm_ops); @@ -1160,6 +1163,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 11 06:31:55 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14011210 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 9290013C3C2 for ; Tue, 11 Mar 2025 06:32:21 +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=1741674741; cv=none; b=sCoF+Y+ZKl3gWpSR+Xl2UGfVNFTxdOhmiXhkXnhHmfIR0KdbkCgcn+gufQPUCojfvbpsJoVrrW78xROk7Ggc7vPQwchCsbGzbRzkY2HOEYiCZRVom/BHNLicoaqHpcXZKE7HpA8WptS1CnF0dH6TzU8tMHV9qaOuMoHRH/f5yPo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741674741; c=relaxed/simple; bh=8SsJ9KVEkwGUkJeMETXL31Tp1CKNe4rdjqdtmGvRkP8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gKkrjNqj2/NkM3C4Fj8UPJq62WF281OrhB+VaY2DbEEcvraIb9oTKli6Hz+GTXD9/G36JsbB62ho6z6t4NecB8IVGruFa6WW8RdxvfU9UyGpJ+Bw+iikLjmz5MP+WYhm8k9s68YRjlgK7il0uH8UpRdXXYR6qweSgAvxSDmQlPg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=M6CQZoRI; 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="M6CQZoRI" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D0994C4CEE9; Tue, 11 Mar 2025 06:32:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741674741; bh=8SsJ9KVEkwGUkJeMETXL31Tp1CKNe4rdjqdtmGvRkP8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=M6CQZoRIsmZmtbXcOwWYkxKMO9z+0xI9OSvK++PP9j19Ozc+vqkEMmj7BcQvczlbo C1FUW78j+809mHmJEaax+ukcz5KHuwGx1s3AkiqDrogkW01pmfuBlh4CVxCBfl3UG9 XY10swJrxtcyaF9fmjOR6C8j+oLXPeIaW9ZDw9CboQZt5MtT571exvmqoDHbJqgpUC y1isVaOXizdUxwViFTKGn10wAgt+OI3K8u+yWmhz9k6y4KLmNHltd7GJtCJLn7Y+D5 fK4i7OBvuKS1RBi1/JN69bB+u0EDal1waRF/uFKCyKl2XE3+yPxxvthD+dz6XZ0v9m rPNPfV3Fwn2kQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v11 03/10] mptcp: sysctl: set path manager by name Date: Tue, 11 Mar 2025 14:31:55 +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..4209dc7f9704 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_ops; + int ret = 0; + + rcu_read_lock(); + pm_ops = mptcp_pm_find(name); + if (pm_ops) + 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 pm_name[MPTCP_PM_NAME_MAX]; + const struct ctl_table tbl = { + .data = pm_name, + .maxlen = MPTCP_PM_NAME_MAX, + }; + int ret; + + strscpy(pm_name, *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, pm_name); + + 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 f87c71550394..d5eaf78c041f 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -699,6 +699,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 11 06:31:56 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14011211 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 5DCE113C3C2 for ; Tue, 11 Mar 2025 06:32: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=1741674743; cv=none; b=iyQE7C5jbQywCIENamwxKU9xuD+Pz+JKa1G1Frf1DPj6g6QQYe3zI+UgyPTbhiG0kZkomecinsrqNJSX0/Y0XJcPuHlyQeQ+JCJMPsWdnJ/ri0yeQxA+0ZVquS+99ZC/C3WW2cNNeTFf+nw3KPcq94y7XV66axWcRM0VYoVxWLg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741674743; c=relaxed/simple; bh=eKkhSvyW4nBiMdbk8iICkik1gxPlOK2XTvR9/zjiP8k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MqAyBqWugfmWhmyPczmVflrL8EdKzPoDOH9cQ1VIqPBWt4Fp2x7kdkZcAJYTP2aI6ZwMkgIe9k8Prp2+A11ayyrueVfE1Sw2FAi61AYjZOxtQrYhLW+++9XvkOm/6Yc9nBU/LD4lmi6QvjKM1UjjS+OHxoafAK75djmk79AbjYQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BdPjoJP4; 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="BdPjoJP4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AA750C4CEEA; Tue, 11 Mar 2025 06:32:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741674742; bh=eKkhSvyW4nBiMdbk8iICkik1gxPlOK2XTvR9/zjiP8k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BdPjoJP4aigX+5FhAYwZ8d/7JXyH5ZPUXe+dR+FggO+5ihuoEG/lKhTdJVwhPrH4A +Ouc+vRotYlJXdtUJmTuujZhzy1lEiVl1elu5QIkA4yGFiXT3HdBZF+3elFGcvL4+S vCz09rJmkrasuIZMNBg+4XNJAaRukmxfCbBvvx6+M8P/VGquLXclLHLwYhIkmqyppd 4/nxPOl+NxNfvavuYLo7KBjvM1uRU+7fhgnQnDG7FaBp0iV7MB4gDu371vWmJ0xxo7 PCSnXWK13oQzSJxSJuyrCx+DnXp6V8e895wp7dIfirOV8gLepS11tddoSCej6L9I86 hvXtgc7Gpp93A== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v11 04/10] mptcp: pm: init and release mptcp_pm_ops Date: Tue, 11 Mar 2025 14:31:56 +0800 Message-ID: <18395835fb6c2267c06cac27c3287f331445bc68.1741674285.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 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(). mptcp_pm_kernel_init() is defined as init() interface of the in-kernel PM, which sets work_pending, accept_addr and accept_subflow. mptcp_pm_userspace_is_release() is defined as release() interface of the userspace PM, which is a wrapper of userspace_pm_free_local_addr_list(). Signed-off-by: Geliang Tang --- net/mptcp/pm.c | 57 +++++++++++++++++++++++++--------------- net/mptcp/pm_kernel.c | 21 +++++++++++++++ net/mptcp/pm_userspace.c | 6 +++++ net/mptcp/protocol.h | 1 + 4 files changed, 64 insertions(+), 21 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 3896f21a46bd..bf318cecb242 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -970,17 +970,46 @@ 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_ops) +{ + if (!pm_ops || !bpf_try_module_get(pm_ops, pm_ops->owner)) { + pr_warn_once("pm %s fails, fallback to default pm", + pm_ops->name); + pm_ops = &mptcp_pm_kernel; + } + + msk->pm.ops = pm_ops; + if (msk->pm.ops->init) + msk->pm.ops->init(msk); + + pr_debug("pm %s initialized\n", pm_ops->name); +} + +static void mptcp_pm_ops_release(struct mptcp_sock *msk) +{ + struct mptcp_pm_ops *pm_ops = msk->pm.ops; + + msk->pm.ops = NULL; + if (pm_ops->release) + pm_ops->release(msk); + + bpf_module_put(pm_ops, pm_ops->owner); + + pr_debug("pm %s released\n", pm_ops->name); +} + 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) { - u8 pm_type = mptcp_get_pm_type(sock_net((struct sock *)msk)); + const struct net *net = sock_net((struct sock *)msk); + const char *pm_name = mptcp_get_path_manager(net); + u8 pm_type = mptcp_get_pm_type(net); struct mptcp_pm_data *pm = &msk->pm; memset(&pm->reset, 0, sizeof(pm->reset)); @@ -988,23 +1017,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); - - bitmap_fill(pm->id_avail_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); - } + rcu_read_lock(); + mptcp_pm_ops_init(msk, mptcp_pm_find(pm_name)); + rcu_read_unlock(); } void mptcp_pm_data_init(struct mptcp_sock *msk) diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c index d39e7c178460..687a423f5252 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -1398,7 +1398,28 @@ 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->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); + + bitmap_fill(pm->id_avail_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); +} + struct mptcp_pm_ops mptcp_pm_kernel = { + .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 2cb62f026b1f..6afab631580f 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -683,7 +683,13 @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr, return ret; } +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 = { + .release = mptcp_pm_userspace_release, .name = "userspace", .owner = THIS_MODULE, }; diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index d5eaf78c041f..a1670463519f 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 11 06:31:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14011212 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 0F8D113C3C2 for ; Tue, 11 Mar 2025 06:32:24 +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=1741674745; cv=none; b=UE5stW9bjCkA4B7Vjup+7Hlze94avD31Qi8v9nTKZ7bScFtF9YUY2FbEZxnHVzCYHxsgCcH1ybRj8pXilXtKNpa3jxP+iuoAu+CN6OWC7t0sLax1Q2jB6nEObTCXYFkQ2VxQI6ZvmrGzX2PPFLTGVgoyxfmbXlIjTGZqyI6iFrQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741674745; c=relaxed/simple; bh=3pSdRl72NPBSLmsNzmBbIGDRz8yVC91f/w9oeV51xjo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=W9otSge8I6NxMdOo52qiDWNWQUWTn3QToZFP+a82/RS72o5mUJ85NrW7H7bZPRtm+vwTIUiRKMqLNDH7N3jruHeUh2f83gDwzPs6rmkn3McVe3QkjoqK7li0/C7S7x9Fh3biyH0VeH5nSZvEKZ9Vzqe0dsR6Um+CZUBIbmu7Mx0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KJrucjHm; 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="KJrucjHm" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 760EBC4CEE9; Tue, 11 Mar 2025 06:32:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741674744; bh=3pSdRl72NPBSLmsNzmBbIGDRz8yVC91f/w9oeV51xjo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KJrucjHmUzKQdUVww3gZLa3Th/xupe9m/QObDin6Y99GdweluDSrNndgry6pJ7w7j kFZI6njMFM022qmpCOnyLS/se8+yx20Bq25GnspXSHC4inXauD70uZUFX6iBiNxKb2 hpx6HSy7ddhk2OeZkcmyeJA+0CmIQjhDwgSTK1AL66C41+S2V237shvsANrr4ZDPYO A55zEuACvOXxHm44mroSG5KeO+Ut8zea1epfNC0MdWUo4/odRj918Zkhv5kuED+p1b xKPO+ZILMu09W5l7CEqvvEjHMLtM2swLGAgPZ4fNQIIRhdtwXStmjvtpFBSetAxLOT ICvYljcD8C1fA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v11 05/10] mptcp: pm: add get_local_id() interface Date: Tue, 11 Mar 2025 14:31:57 +0800 Message-ID: <061e62fc02eb7944356ffd49cbcf202d833e65e0.1741674285.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. Also rename mptcp_pm_nl_get_local_id() to mptcp_pm_kernel_get_local_id() and mptcp_userspace_pm_get_local_id() to mptcp_pm_userspace_get_local_id(), and make them static. Signed-off-by: Geliang Tang --- include/net/mptcp.h | 3 +++ net/mptcp/pm.c | 9 ++++++--- net/mptcp/pm_kernel.c | 5 +++-- net/mptcp/pm_userspace.c | 5 +++-- net/mptcp/protocol.h | 4 ---- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 69f7b35e57c3..169e19440b03 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -116,6 +116,9 @@ struct mptcp_sched_ops { #define MPTCP_PM_NAME_MAX 16 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 bf318cecb242..6eaf072a472a 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) @@ -1052,6 +1050,11 @@ struct mptcp_pm_ops *mptcp_pm_find(const char *name) int mptcp_pm_validate(struct mptcp_pm_ops *pm_ops) { + if (!pm_ops->get_local_id) { + pr_err("%s does not implement required ops\n", pm_ops->name); + return -EINVAL; + } + return 0; } diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c index 687a423f5252..1380e529aa02 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; @@ -1419,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, .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 6afab631580f..81ddc14bc273 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; @@ -689,6 +689,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, .release = mptcp_pm_userspace_release, .name = "userspace", .owner = THIS_MODULE, diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index a1670463519f..282067717b39 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1139,10 +1139,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 11 06:31:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14011213 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 D0E9F13C3C2 for ; Tue, 11 Mar 2025 06:32:26 +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=1741674746; cv=none; b=DwGCjAz3LG+OohO6sqYumoky2yzx9GiTWCgls2KYoyIiHjjrziYehayeIhUFPsIm3aVSUlwVlXCc9m3J+ICjJU8YgV3NvLXYw5IdA3zkZC21cYCgfNNKD9DZuolC8uwd5YCg1FkGNF8bDeEQVdSFQ4rwnv9+iVdGqiF1O03qatE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741674746; c=relaxed/simple; bh=AQFh4s/EcQE+bgtcyIcEhQ5u9U/Ae8UL0tkLZRS2I9c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LSUk3ZUMfDE6xQwCfUVioTyMfmXO7j6akmMalGURz3F7uNcTfXURujh6JSi0Z3q2tQU6L6Z10WCzaDjWASjLlKk0H7JvCeqvLZFhK04hj0ZGykO3URe7N37jORZL4fSv2/R4iFchpcxuiQy51xOaWB+hhK+aJh9tjiKgUjMHCOs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hkWRfb+5; 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="hkWRfb+5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 137C2C4CEED; Tue, 11 Mar 2025 06:32:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741674746; bh=AQFh4s/EcQE+bgtcyIcEhQ5u9U/Ae8UL0tkLZRS2I9c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hkWRfb+5ogIqmSZRLJ/XBIqoofM8AzGCzuo8bTwAu/egmH6c321ctqGcRaElYyfQb UK7OPQlI7BP0qD2YRlRITS1w2v/MCPz33p8hdCwEUwC9VKBfrKrr4iKcoJK2c1kXYJ aATG7FccITerVsuDTb9YSMuwkJ646W6eF4A+3yOIm+SKGvvGLTuHvZkgJTjp6h5W96 uCKpqiaLxRTdCgxxgP5Gzdw5cCjF3LUSM9rsOHRdr9k/Hr6AegL/qvQTIQJT7aqsoT x7n8aZSV6LQte32oFbDnKU69GktYtwy1lpjM4j5zdGp2bEOrvLBSknsntC2gXsb1T5 KzExXz1NgOoAg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v11 06/10] mptcp: pm: add get_priority() interface Date: Tue, 11 Mar 2025 14:31:58 +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 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. Also rename mptcp_pm_nl_is_backup() to mptcp_pm_kernel_get_priority() and mptcp_userspace_pm_is_backup() to 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 169e19440b03..b344b909e749 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -118,6 +118,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 6eaf072a472a..e4d790ecfe27 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) @@ -1050,7 +1047,7 @@ struct mptcp_pm_ops *mptcp_pm_find(const char *name) int mptcp_pm_validate(struct mptcp_pm_ops *pm_ops) { - if (!pm_ops->get_local_id) { + if (!pm_ops->get_local_id || !pm_ops->get_priority) { pr_err("%s does not implement required ops\n", pm_ops->name); return -EINVAL; } diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c index 1380e529aa02..7ec81d5195d4 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; @@ -1420,6 +1421,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 81ddc14bc273..7fc19b844384 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; @@ -690,6 +690,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, .release = mptcp_pm_userspace_release, .name = "userspace", .owner = THIS_MODULE, diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 282067717b39..d69c9e07e6e6 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1140,8 +1140,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 11 06:31:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14011214 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 5B34D13C3C2 for ; Tue, 11 Mar 2025 06:32:27 +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=1741674748; cv=none; b=JmAEc7iSAUmhBwqKscVqqQWxYzA4oxtz+idG1hI1XRxRfrgZ/n1I77ggG852pH0tkvzuasvvKavs+TnWBK6wyo3HPiFgyHqi7PtNvjLdX9W/AfetN9CfIiYo5PRv2TEkcJUP2LLfBb+C500wwE3yvazFWMBbp/K64DhJOrzCvYk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741674748; c=relaxed/simple; bh=+nH88dP7Lw4AMHof9Ds35NJJ1HWFILVKR2SC2Nd4XYA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PBByvOED1Mp1WCDtSiVI18+dIHHl6wQXjm2/fwEfaZK5rOj9ziDiBEPPmnd2o6anbd5sFlDtB6U8NX0tLe69gxkz9oZJsPY4JYFIpZF7gYGLaQ+S1YRHE0sEoqiflbNJ13+JDqstbucVzMghDJdGMEUB3OY7lMAmHjE8iMwXRgs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WuATHQG4; 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="WuATHQG4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E0D12C4CEE9; Tue, 11 Mar 2025 06:32:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741674747; bh=+nH88dP7Lw4AMHof9Ds35NJJ1HWFILVKR2SC2Nd4XYA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WuATHQG4p1uRDDRjweOGAcLtjqiED+guQc02HVicLbHcTyb03oOAvVU0g+9g5Q3vs c80dizJHfnzev67jUj1p3Ov8xuV3if0hPcacWPkOAYo8M8rHPXztlFaChBwn4o2HJg M2jmMgoBQjzfAde2K7NdqoiWIJJmXnv8IzadZoXoElf0V8UQIaHd/sXAcYHMJu0H4k QeY7vRxvkyYgYKfd852Mfg7ewLEAZ85Awmrr1tMlWKraRYTZKVTTDMdMKf6YN4ZzfG 6TxEwKlfAMcmyKgWaZlzlT16y85tF2G/DXdyUZS7oqGuaLjzYuZSM8M52yaQ1O6/ja Pkofuy/8jymkg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v11 07/10] mptcp: sysctl: map path_manager to pm_type Date: Tue, 11 Mar 2025 14:31:59 +0800 Message-ID: <3bed5ce4e4cfffaa7e41a449e80827faa70141f6.1741674285.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 others -> __MPTCP_PM_TYPE_NR Signed-off-by: Geliang Tang --- net/mptcp/ctrl.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c index 4209dc7f9704..cb0811e636ff 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 pm_name[MPTCP_PM_NAME_MAX]; const struct ctl_table tbl = { @@ -211,8 +214,18 @@ static int proc_path_manager(const struct ctl_table *ctl, int write, strscpy(pm_name, *path_manager, MPTCP_PM_NAME_MAX); ret = proc_dostring(&tbl, write, buffer, lenp, ppos); - if (write && ret == 0) + if (write && ret == 0) { ret = mptcp_set_path_manager(*path_manager, pm_name); + if (ret == 0) { + u8 pm_type = __MPTCP_PM_TYPE_NR; + + if (strncmp(pm_name, "kernel", MPTCP_PM_NAME_MAX) == 0) + pm_type = MPTCP_PM_TYPE_KERNEL; + else if (strncmp(pm_name, "userspace", MPTCP_PM_NAME_MAX) == 0) + pm_type = MPTCP_PM_TYPE_USERSPACE; + pernet->pm_type = pm_type; + } + } return ret; } From patchwork Tue Mar 11 06:32:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14011215 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 C6AE413C3C2 for ; Tue, 11 Mar 2025 06:32:29 +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=1741674749; cv=none; b=Rv83Kev57OYjmYB06+OWCT4xevE+EdeZp78ZwTvzqWfEZakYYSFKsZPkzuAbBe2wOG8ZSf+2GVjBrivw/Qe5u1oJ2sdqDgx396Kvh319ypmW0V6g8QLoFiHfG7mWXCoYZ/T/y9SlnS1klRrmWyE8Hsg2HOCu27S2/Eob1rG+JgE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741674749; c=relaxed/simple; bh=MKe8F/fmlAEcIbExfzRf3fT64Ho8ImNHvcose8ARXjQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q8VyHXpyyLc8JMD3bSrUhT85j+9TouNP4UXoOThDBa1a3cWOH6ZVZRgiuTG3U6ZDe7ItuyRtwmKkZBxHbGdE2UzwWH3MKvmu+RWfz/2ZZeGbAHaw9mv0KZAHf4II9BwvcbyTcKNtPOVGjsb+tcYqxIDIZ8Wsu/3wPZ6NHhvvFOg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TvapMtBZ; 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="TvapMtBZ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7D456C4CEE9; Tue, 11 Mar 2025 06:32:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741674749; bh=MKe8F/fmlAEcIbExfzRf3fT64Ho8ImNHvcose8ARXjQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TvapMtBZLrxQj7vm6SQfNtd37uXyrtdL2lY6Q8WHIK3M5FRZPVtwstmL0wbvPagXr J7/2rGRq97MBMvghyYWCEKfKH4XxtVxeCCzwD9loETB9I6aU9o68VA69+TjmwyPWRz 9xW+7gPw0HQa/82eczW9NkAvTGL9UGSYjZP62ObjVh0KUgdwRYR9LIqP7jNE4tgjcz UaVp+q7ycN+7PFFmK61F+y6TAj11kzVkP6N+J4YlVcR5dJ8Pqee3dDKrESoCIrWxjS V/T81arPaCT9AvNEPNBk+GJF1MLXmZVYGSM4Ltvc+zVpV7pKwHmepjFhM92Naohmo7 xhbcIAD6JgsvA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v11 08/10] mptcp: sysctl: map pm_type to path_manager Date: Tue, 11 Mar 2025 14:32:00 +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 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 | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c index cb0811e636ff..4d8b31f32eb5 100644 --- a/net/mptcp/ctrl.c +++ b/net/mptcp/ctrl.c @@ -230,6 +230,29 @@ 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); + int ret; + + ret = proc_dou8vec_minmax(ctl, write, buffer, lenp, ppos); + if (write && ret == 0) { + u8 pm_type = READ_ONCE(*(u8 *)ctl->data); + char *pm_name = ""; + + if (pm_type == MPTCP_PM_TYPE_KERNEL) + pm_name = "kernel"; + else if (pm_type == MPTCP_PM_TYPE_USERSPACE) + pm_name = "userspace"; + mptcp_set_path_manager(pernet->path_manager, pm_name); + } + + return ret; +} + static struct ctl_table mptcp_sysctl_table[] = { { .procname = "enabled", @@ -274,7 +297,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 11 06:32:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14011216 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 2403613C3C2 for ; Tue, 11 Mar 2025 06:32:33 +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=1741674753; cv=none; b=e+wymt9Hz1cihlUZizwc6i6qNml3kkS0xJUDXF+uNLea0ja+iQIhON+y1wehphhQVSyNQmxhWQe5E7BJRbZtdYxsmBYLYJedhnb8ByAYHjQ8FIkNcaC4RWWoutVljNYBi81tYSCJtajIvbSrA6tJmk/i7Q3p3OdzNPT/aNCTZx0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741674753; c=relaxed/simple; bh=0UdmuOxN6B6kcX9f2AZJJD1VajTKoOkroMfKJN3+d+o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GzdidEk0yCMle7+Q0STa3mPQ1iLx5ML460H+DaBeSpNquPIPmHfpi96RM/AKvpNACwW7uTsOnOwCLum9Pl/m4/1rYCpGm4Tjj5f7hNbUV6Pd3GSRq2u+S91UcGd06o0E/2d08FvnYYyqWKYYUaF2BmE7x8z0YbnzhsaB3KKp0TE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ox8SL4ez; 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="ox8SL4ez" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 44B18C4CEE9; Tue, 11 Mar 2025 06:32:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741674753; bh=0UdmuOxN6B6kcX9f2AZJJD1VajTKoOkroMfKJN3+d+o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ox8SL4ezxZRCAb074Zf96iJ1a0pntNkZ4EfBliEYJnB/Rr1Dof+ba/qOO2uDivFOk VGv6qGebFmd8nuFZz9obgRiVGWj6+XPV7tGivCcAYTs/cmeak0vnOC4uIVo5zLN+Q1 5gQqT9dKPg3sLOokK4vc24L2aAedLyu6/LY2VqRFY2gdNEg31FLJRjMxlpJkbJ5hO8 69mTEhNMR15/dpDA1Xg0tXa7BpWIVGftMvIPQivF877GfHHpepDsclW2HgQCKsbHZb jO0t/URmS9AwuKnKT4ZB0m9KiHfDT1Wm39xpRym5XBnH2O+5nka3aoXtXy7HUC0QXU tWQtrkEa4tPoA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v11 09/10] mptcp: sysctl: add available_path_managers Date: Tue, 11 Mar 2025 14:32:01 +0800 Message-ID: <842ec02bcbae69f82c80d7be685efe665c5cf162.1741674285.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 b344b909e749..6a08ac862bbe 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -114,6 +114,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 { int (*get_local_id)(struct mptcp_sock *msk, diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c index 4d8b31f32eb5..d9290c5bb6c7 100644 --- a/net/mptcp/ctrl.c +++ b/net/mptcp/ctrl.c @@ -253,6 +253,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", @@ -338,6 +356,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) @@ -364,6 +388,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 e4d790ecfe27..ba7424582ebf 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -1085,3 +1085,22 @@ void mptcp_pm_unregister(struct mptcp_pm_ops *pm_ops) list_del_rcu(&pm_ops->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_ops; + size_t offs = 0; + + rcu_read_lock(); + list_for_each_entry_rcu(pm_ops, &mptcp_pm_list, list) { + offs += snprintf(buf + offs, maxlen - offs, "%s%s", + offs == 0 ? "" : " ", pm_ops->name); + + if (WARN_ON_ONCE(offs >= maxlen)) + break; + } + rcu_read_unlock(); +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index d69c9e07e6e6..d9ca3a19a218 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1061,6 +1061,7 @@ struct mptcp_pm_ops *mptcp_pm_find(const char *name); int mptcp_pm_register(struct mptcp_pm_ops *pm_ops); void mptcp_pm_unregister(struct mptcp_pm_ops *pm_ops); int mptcp_pm_validate(struct mptcp_pm_ops *pm_ops); +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 11 06:32:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14011217 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 61FED13C3C2 for ; Tue, 11 Mar 2025 06:32:34 +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=1741674755; cv=none; b=AOoMUc4Z8VjqwdJR33WDhwHDJOvS6/iS/cqOhrCb15MiN6eAI55pmeX1JVy348iJEGq5MFve7ihDd9ovtH9gaiGjyX7x064SFTl8cH83NppYAS6mUmGwHYIdWEmcNfyDrIOuCKEBeP+61q46O2YRtdM+SqmE2e8dEzyFWcoSceQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741674755; c=relaxed/simple; bh=A2X00gCDQP/wlsCXvloDMCCwZxgxiwZc0BgKClX01Fc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hwCcLgwfJ7bNckQRHiemvCw5+mt5b/RouaNm7KKYbrQWgK7rGR+5gRmisJ0jY2BF4Frx2FrpXE2J7qi+VmCT4HfCf1dROZ2sgapXS5CDd4z8g0cEA6AjFFM8z17BStmtNhGaaEsm2VJiotFupF/C/+lURq6FNDn0u1/G0QUKjaQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=j60/KCuE; 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="j60/KCuE" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AB076C4CEE9; Tue, 11 Mar 2025 06:32:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741674754; bh=A2X00gCDQP/wlsCXvloDMCCwZxgxiwZc0BgKClX01Fc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=j60/KCuE5VU9bNWtmbuA70PA6hKt4KmNmnI87xKFiLMT3azJEJRVwtrwwv7J9B3tC Dbi4vhkfcQEYQkXtgcjhiiORmQP/gxCGDZmpWf0v8oEjqbAR7RiCoGAfIKBMvAUCp5 UTuWVoYvRRRWVOAaqv6NMTd8p2I3P59hnLwumRG2Xr22FWBH8MGeuyAh7a4LYoOSaZ pk5GWRNmCk7KjMIvSYpWNcShtu+ZsCt2QuaDPi1yu5WfaM1V3aqJW6e7vQmIDp4rFz 1uOOQ1I4j2j1SyyD2WAEcA3sguA67F5nPuY6MkOBcnkqBm0vPSsWeNupQ3PLYxPYt5 fyBkSK48LUR0g== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v11 10/10] selftests: mptcp: add pm sysctl mapping tests Date: Tue, 11 Mar 2025 14:32:02 +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 or to the old net.mptcp.pm_type in userspace_pm.sh. Signed-off-by: Geliang Tang --- .../selftests/net/mptcp/userspace_pm.sh | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/mptcp/userspace_pm.sh b/tools/testing/selftests/net/mptcp/userspace_pm.sh index 3651f73451cf..333064b0b5ac 100755 --- a/tools/testing/selftests/net/mptcp/userspace_pm.sh +++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh @@ -117,7 +117,36 @@ cleanup() trap cleanup EXIT # Create and configure network namespaces for testing +print_title "Init" mptcp_lib_ns_init ns1 ns2 + +# check path_manager and pm_type sysctl mapping +if [ -f /proc/sys/net/mptcp/path_manager ]; then + ip netns exec "$ns1" sysctl -q net.mptcp.path_manager=userspace + pm_type="$(ip netns exec "$ns1" sysctl -n net.mptcp.pm_type)" + if [ "${pm_type}" != "1" ]; then + test_fail "unexpected pm_type: ${pm_type}" + mptcp_lib_result_print_all_tap + exit ${KSFT_FAIL} + fi + + ip netns exec "$ns1" sysctl -q net.mptcp.path_manager=error 2>/dev/null + pm_type="$(ip netns exec "$ns1" sysctl -n net.mptcp.pm_type)" + if [ "${pm_type}" != "1" ]; then + test_fail "unexpected pm_type after error: ${pm_type}" + mptcp_lib_result_print_all_tap + exit ${KSFT_FAIL} + fi + + ip netns exec "$ns1" sysctl -q net.mptcp.pm_type=0 + pm_name="$(ip netns exec "$ns1" sysctl -n net.mptcp.path_manager)" + if [ "${pm_name}" != "kernel" ]; then + test_fail "unexpected path-manager: ${pm_name}" + mptcp_lib_result_print_all_tap + exit ${KSFT_FAIL} + fi +fi + for i in "$ns1" "$ns2" ;do ip netns exec "$i" sysctl -q net.mptcp.pm_type=1 done @@ -152,7 +181,6 @@ mptcp_lib_events "${ns1}" "${server_evts}" server_evts_pid sleep 0.5 mptcp_lib_subtests_last_ts_reset -print_title "Init" print_test "Created network namespaces ns1, ns2" test_pass