]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
mptcp: move mptcp_pm_remove_addrs into pm_userspace
authorGeliang Tang <tanggeliang@kylinos.cn>
Fri, 13 Dec 2024 19:52:55 +0000 (20:52 +0100)
committerJakub Kicinski <kuba@kernel.org>
Sun, 15 Dec 2024 22:28:34 +0000 (14:28 -0800)
Since mptcp_pm_remove_addrs() is only called from the userspace PM, this
patch moves it into pm_userspace.c.

For this, lookup_subflow_by_saddr() and remove_anno_list_by_saddr()
helpers need to be exported in protocol.h. Also add "mptcp_" prefix for
these helpers.

Here, mptcp_pm_remove_addrs() is not changed to a static function because
it will be used in BPF Path Manager.

This patch doesn't change the behaviour of the code, just refactoring.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20241213-net-next-mptcp-pm-misc-cleanup-v1-4-ddb6d00109a8@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/pm_netlink.c
net/mptcp/pm_userspace.c
net/mptcp/protocol.h

index 7a0f7998376a5bb73a37829f9a6b3cdb9a3236a2..98ac73938bd8196e196d5ee8c264784ba8d37645 100644 (file)
@@ -107,8 +107,8 @@ static void remote_address(const struct sock_common *skc,
 #endif
 }
 
-static bool lookup_subflow_by_saddr(const struct list_head *list,
-                                   const struct mptcp_addr_info *saddr)
+bool mptcp_lookup_subflow_by_saddr(const struct list_head *list,
+                                  const struct mptcp_addr_info *saddr)
 {
        struct mptcp_subflow_context *subflow;
        struct mptcp_addr_info cur;
@@ -1447,8 +1447,8 @@ out_free:
        return ret;
 }
 
-static bool remove_anno_list_by_saddr(struct mptcp_sock *msk,
-                                     const struct mptcp_addr_info *addr)
+bool mptcp_remove_anno_list_by_saddr(struct mptcp_sock *msk,
+                                    const struct mptcp_addr_info *addr)
 {
        struct mptcp_pm_add_entry *entry;
 
@@ -1476,7 +1476,7 @@ static bool mptcp_pm_remove_anno_addr(struct mptcp_sock *msk,
 
        list.ids[list.nr++] = mptcp_endp_get_local_id(msk, addr);
 
-       ret = remove_anno_list_by_saddr(msk, addr);
+       ret = mptcp_remove_anno_list_by_saddr(msk, addr);
        if (ret || force) {
                spin_lock_bh(&msk->pm.lock);
                if (ret) {
@@ -1520,7 +1520,7 @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
                }
 
                lock_sock(sk);
-               remove_subflow = lookup_subflow_by_saddr(&msk->conn_list, addr);
+               remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, addr);
                mptcp_pm_remove_anno_addr(msk, addr, remove_subflow &&
                                          !(entry->flags & MPTCP_PM_ADDR_FLAG_IMPLICIT));
 
@@ -1633,36 +1633,6 @@ int mptcp_pm_nl_del_addr_doit(struct sk_buff *skb, struct genl_info *info)
        return ret;
 }
 
-/* Called from the userspace PM only */
-void mptcp_pm_remove_addrs(struct mptcp_sock *msk, struct list_head *rm_list)
-{
-       struct mptcp_rm_list alist = { .nr = 0 };
-       struct mptcp_pm_addr_entry *entry;
-       int anno_nr = 0;
-
-       list_for_each_entry(entry, rm_list, list) {
-               if (alist.nr >= MPTCP_RM_IDS_MAX)
-                       break;
-
-               /* only delete if either announced or matching a subflow */
-               if (remove_anno_list_by_saddr(msk, &entry->addr))
-                       anno_nr++;
-               else if (!lookup_subflow_by_saddr(&msk->conn_list,
-                                                 &entry->addr))
-                       continue;
-
-               alist.ids[alist.nr++] = entry->addr.id;
-       }
-
-       if (alist.nr) {
-               spin_lock_bh(&msk->pm.lock);
-               msk->pm.add_addr_signaled -= anno_nr;
-               mptcp_pm_remove_addr(msk, &alist);
-               spin_unlock_bh(&msk->pm.lock);
-       }
-}
-
-/* Called from the in-kernel PM only */
 static void mptcp_pm_flush_addrs_and_subflows(struct mptcp_sock *msk,
                                              struct list_head *rm_list)
 {
@@ -1671,11 +1641,11 @@ static void mptcp_pm_flush_addrs_and_subflows(struct mptcp_sock *msk,
 
        list_for_each_entry(entry, rm_list, list) {
                if (slist.nr < MPTCP_RM_IDS_MAX &&
-                   lookup_subflow_by_saddr(&msk->conn_list, &entry->addr))
+                   mptcp_lookup_subflow_by_saddr(&msk->conn_list, &entry->addr))
                        slist.ids[slist.nr++] = mptcp_endp_get_local_id(msk, &entry->addr);
 
                if (alist.nr < MPTCP_RM_IDS_MAX &&
-                   remove_anno_list_by_saddr(msk, &entry->addr))
+                   mptcp_remove_anno_list_by_saddr(msk, &entry->addr))
                        alist.ids[alist.nr++] = mptcp_endp_get_local_id(msk, &entry->addr);
        }
 
index afb04343e74d2340cd77e298489b55340dda0899..cac4b4a7b1e586b66d86c7a15462f642a7b0314f 100644 (file)
@@ -287,6 +287,34 @@ remove_err:
        return err;
 }
 
+void mptcp_pm_remove_addrs(struct mptcp_sock *msk, struct list_head *rm_list)
+{
+       struct mptcp_rm_list alist = { .nr = 0 };
+       struct mptcp_pm_addr_entry *entry;
+       int anno_nr = 0;
+
+       list_for_each_entry(entry, rm_list, list) {
+               if (alist.nr >= MPTCP_RM_IDS_MAX)
+                       break;
+
+               /* only delete if either announced or matching a subflow */
+               if (mptcp_remove_anno_list_by_saddr(msk, &entry->addr))
+                       anno_nr++;
+               else if (!mptcp_lookup_subflow_by_saddr(&msk->conn_list,
+                                                       &entry->addr))
+                       continue;
+
+               alist.ids[alist.nr++] = entry->addr.id;
+       }
+
+       if (alist.nr) {
+               spin_lock_bh(&msk->pm.lock);
+               msk->pm.add_addr_signaled -= anno_nr;
+               mptcp_pm_remove_addr(msk, &alist);
+               spin_unlock_bh(&msk->pm.lock);
+       }
+}
+
 int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
 {
        struct nlattr *id = info->attrs[MPTCP_PM_ATTR_LOC_ID];
index a93e661ef5c435155066ce9cc109092661f0711c..5ba67cb601e02902ca6fcd91028ce36d30f45fc3 100644 (file)
@@ -1027,6 +1027,10 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk,
 struct mptcp_pm_add_entry *
 mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock *msk,
                                const struct mptcp_addr_info *addr);
+bool mptcp_lookup_subflow_by_saddr(const struct list_head *list,
+                                  const struct mptcp_addr_info *saddr);
+bool mptcp_remove_anno_list_by_saddr(struct mptcp_sock *msk,
+                                    const struct mptcp_addr_info *addr);
 int mptcp_pm_set_flags(struct sk_buff *skb, struct genl_info *info);
 int mptcp_pm_nl_set_flags(struct sk_buff *skb, struct genl_info *info);
 int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info);