mptcp: add mptcp_userspace_pm_lookup_addr helper
authorGeliang Tang <tanggeliang@kylinos.cn>
Fri, 13 Dec 2024 19:52:52 +0000 (20:52 +0100)
committerJakub Kicinski <kuba@kernel.org>
Sun, 15 Dec 2024 22:28:33 +0000 (14:28 -0800)
Like __lookup_addr() helper in pm_netlink.c, a new helper
mptcp_userspace_pm_lookup_addr() is also defined in pm_userspace.c.
It looks up the corresponding mptcp_pm_addr_entry address in
userspace_pm_local_addr_list through the passed "addr" parameter
and returns the found address entry.

This helper can be used in mptcp_userspace_pm_delete_local_addr(),
mptcp_userspace_pm_set_flags(), mptcp_userspace_pm_get_local_id()
and mptcp_userspace_pm_is_backup() to simplify the code.

Please note that with this change now list_for_each_entry() is used in
mptcp_userspace_pm_append_new_local_addr(), not list_for_each_entry_safe(),
but that's OK to do so because mptcp_userspace_pm_lookup_addr() only
returns an entry from the list, the list hasn't been modified here.

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-1-ddb6d00109a8@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/pm_userspace.c

index e35178f5205faac4a9199df1ffca79085e4b7c68..3664f3c1572e269fd7c74ea1d86a49389ed5c0c1 100644 (file)
@@ -26,6 +26,19 @@ void mptcp_free_local_addr_list(struct mptcp_sock *msk)
        }
 }
 
+static struct mptcp_pm_addr_entry *
+mptcp_userspace_pm_lookup_addr(struct mptcp_sock *msk,
+                              const struct mptcp_addr_info *addr)
+{
+       struct mptcp_pm_addr_entry *entry;
+
+       list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
+               if (mptcp_addresses_equal(&entry->addr, addr, false))
+                       return entry;
+       }
+       return NULL;
+}
+
 static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
                                                    struct mptcp_pm_addr_entry *entry,
                                                    bool needs_id)
@@ -90,22 +103,20 @@ append_err:
 static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk,
                                                struct mptcp_pm_addr_entry *addr)
 {
-       struct mptcp_pm_addr_entry *entry, *tmp;
        struct sock *sk = (struct sock *)msk;
+       struct mptcp_pm_addr_entry *entry;
 
-       list_for_each_entry_safe(entry, tmp, &msk->pm.userspace_pm_local_addr_list, list) {
-               if (mptcp_addresses_equal(&entry->addr, &addr->addr, false)) {
-                       /* TODO: a refcount is needed because the entry can
-                        * be used multiple times (e.g. fullmesh mode).
-                        */
-                       list_del_rcu(&entry->list);
-                       sock_kfree_s(sk, entry, sizeof(*entry));
-                       msk->pm.local_addr_used--;
-                       return 0;
-               }
-       }
-
-       return -EINVAL;
+       entry = mptcp_userspace_pm_lookup_addr(msk, &addr->addr);
+       if (!entry)
+               return -EINVAL;
+
+       /* TODO: a refcount is needed because the entry can
+        * be used multiple times (e.g. fullmesh mode).
+        */
+       list_del_rcu(&entry->list);
+       sock_kfree_s(sk, entry, sizeof(*entry));
+       msk->pm.local_addr_used--;
+       return 0;
 }
 
 static struct mptcp_pm_addr_entry *
@@ -123,17 +134,12 @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
 int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
                                    struct mptcp_addr_info *skc)
 {
-       struct mptcp_pm_addr_entry *entry = NULL, *e, new_entry;
+       struct mptcp_pm_addr_entry *entry = NULL, new_entry;
        __be16 msk_sport =  ((struct inet_sock *)
                             inet_sk((struct sock *)msk))->inet_sport;
 
        spin_lock_bh(&msk->pm.lock);
-       list_for_each_entry(e, &msk->pm.userspace_pm_local_addr_list, list) {
-               if (mptcp_addresses_equal(&e->addr, skc, false)) {
-                       entry = e;
-                       break;
-               }
-       }
+       entry = mptcp_userspace_pm_lookup_addr(msk, skc);
        spin_unlock_bh(&msk->pm.lock);
        if (entry)
                return entry->addr.id;
@@ -153,15 +159,11 @@ bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
                                  struct mptcp_addr_info *skc)
 {
        struct mptcp_pm_addr_entry *entry;
-       bool backup = false;
+       bool backup;
 
        spin_lock_bh(&msk->pm.lock);
-       list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
-               if (mptcp_addresses_equal(&entry->addr, skc, false)) {
-                       backup = !!(entry->flags & MPTCP_PM_ADDR_FLAG_BACKUP);
-                       break;
-               }
-       }
+       entry = mptcp_userspace_pm_lookup_addr(msk, skc);
+       backup = entry && !!(entry->flags & MPTCP_PM_ADDR_FLAG_BACKUP);
        spin_unlock_bh(&msk->pm.lock);
 
        return backup;
@@ -606,13 +608,12 @@ int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info)
                bkup = 1;
 
        spin_lock_bh(&msk->pm.lock);
-       list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
-               if (mptcp_addresses_equal(&entry->addr, &loc.addr, false)) {
-                       if (bkup)
-                               entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP;
-                       else
-                               entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP;
-               }
+       entry = mptcp_userspace_pm_lookup_addr(msk, &loc.addr);
+       if (entry) {
+               if (bkup)
+                       entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP;
+               else
+                       entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP;
        }
        spin_unlock_bh(&msk->pm.lock);