From: Geliang Tang <tanggeliang@kylinos.cn>
This patch defines the original in-kernel netlink path manager as a
new struct mptcp_pm_ops named "mptcp_kernel_pm", and register it in
mptcp_pm_nl_init().
This mptcp_pm_ops will be skipped in mptcp_pm_unregister().
Only get_local_id() and get_priority() interfaces are implemented here.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/pm.c | 3 +++
net/mptcp/pm_kernel.c | 9 +++++++++
net/mptcp/protocol.h | 2 ++
3 files changed, 14 insertions(+)
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 88ff136b3786..e648cb522320 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -1075,6 +1075,9 @@ int mptcp_pm_register(struct mptcp_pm_ops *pm)
void mptcp_pm_unregister(struct mptcp_pm_ops *pm)
{
+ if (pm == &mptcp_kernel_pm)
+ 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 daf8f98a3164..8a5966e6e3e3 100644
--- a/net/mptcp/pm_kernel.c
+++ b/net/mptcp/pm_kernel.c
@@ -1400,6 +1400,13 @@ static struct pernet_operations mptcp_pm_pernet_ops = {
.size = sizeof(struct pm_nl_pernet),
};
+struct mptcp_pm_ops mptcp_kernel_pm = {
+ .get_local_id = mptcp_pm_nl_get_local_id,
+ .get_priority = mptcp_pm_nl_is_backup,
+ .name = "kernel",
+ .owner = THIS_MODULE,
+};
+
void __init mptcp_pm_nl_init(void)
{
if (register_pernet_subsys(&mptcp_pm_pernet_ops) < 0)
@@ -1407,4 +1414,6 @@ void __init mptcp_pm_nl_init(void)
if (genl_register_family(&mptcp_genl_family))
panic("Failed to register MPTCP PM netlink family\n");
+
+ mptcp_pm_register(&mptcp_kernel_pm);
}
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 9dbfde4027b3..56d3a7457f80 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -1051,6 +1051,8 @@ 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);
+extern struct mptcp_pm_ops mptcp_kernel_pm;
+
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);
--
2.43.0