mptcp: pm: use addr entry for get_local_id
authorGeliang Tang <tanggeliang@kylinos.cn>
Fri, 7 Mar 2025 11:21:45 +0000 (12:21 +0100)
committerJakub Kicinski <kuba@kernel.org>
Mon, 10 Mar 2025 20:35:48 +0000 (13:35 -0700)
The following code in mptcp_userspace_pm_get_local_id() that assigns "skc"
to "new_entry" is not allowed in BPF if we use the same code to implement
the get_local_id() interface of a BFP path manager:

memset(&new_entry, 0, sizeof(struct mptcp_pm_addr_entry));
new_entry.addr = *skc;
new_entry.addr.id = 0;
new_entry.flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;

To solve the issue, this patch moves this assignment to "new_entry" forward
to mptcp_pm_get_local_id(), and then passing "new_entry" as a parameter to
both mptcp_pm_nl_get_local_id() and mptcp_userspace_pm_get_local_id().

No behavioural changes intended.

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/20250307-net-next-mptcp-pm-reorg-v1-1-abef20ada03b@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/pm.c
net/mptcp/pm_netlink.c
net/mptcp/pm_userspace.c
net/mptcp/protocol.h

index 6c8cadf84f31f4c7dcc38b787beda048d5362dc8..f6030ce04efdf20b512b3445fb909b4dec386b1a 100644 (file)
@@ -406,7 +406,7 @@ out_unlock:
 
 int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
 {
-       struct mptcp_addr_info skc_local;
+       struct mptcp_pm_addr_entry skc_local = { 0 };
        struct mptcp_addr_info msk_local;
 
        if (WARN_ON_ONCE(!msk))
@@ -416,10 +416,13 @@ int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
         * addr
         */
        mptcp_local_address((struct sock_common *)msk, &msk_local);
-       mptcp_local_address((struct sock_common *)skc, &skc_local);
-       if (mptcp_addresses_equal(&msk_local, &skc_local, false))
+       mptcp_local_address((struct sock_common *)skc, &skc_local.addr);
+       if (mptcp_addresses_equal(&msk_local, &skc_local.addr, false))
                return 0;
 
+       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);
index a6387bcf848b9483feb454c78ba110ae7fd72621..23c28e37ab8f1befb391894e465635ee523d54ed 100644 (file)
@@ -1150,7 +1150,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_addr_info *skc)
+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;
@@ -1159,7 +1160,7 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc
        pernet = pm_nl_get_pernet_from_msk(msk);
 
        rcu_read_lock();
-       entry = __lookup_addr(pernet, skc);
+       entry = __lookup_addr(pernet, &skc->addr);
        ret = entry ? entry->addr.id : -1;
        rcu_read_unlock();
        if (ret >= 0)
@@ -1170,12 +1171,8 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc
        if (!entry)
                return -ENOMEM;
 
-       entry->addr = *skc;
-       entry->addr.id = 0;
+       *entry = *skc;
        entry->addr.port = 0;
-       entry->ifindex = 0;
-       entry->flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
-       entry->lsk = NULL;
        ret = mptcp_pm_nl_append_new_local_addr(pernet, entry, true, false);
        if (ret < 0)
                kfree(entry);
index 7e7d01bef5d403cb8569a3e26102eccf466745a5..8c45eebe9bbc755cc11dfb615be693799829f250 100644 (file)
@@ -130,27 +130,22 @@ 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 *skc)
 {
-       struct mptcp_pm_addr_entry *entry = NULL, new_entry;
        __be16 msk_sport =  ((struct inet_sock *)
                             inet_sk((struct sock *)msk))->inet_sport;
+       struct mptcp_pm_addr_entry *entry;
 
        spin_lock_bh(&msk->pm.lock);
-       entry = mptcp_userspace_pm_lookup_addr(msk, skc);
+       entry = mptcp_userspace_pm_lookup_addr(msk, &skc->addr);
        spin_unlock_bh(&msk->pm.lock);
        if (entry)
                return entry->addr.id;
 
-       memset(&new_entry, 0, sizeof(struct mptcp_pm_addr_entry));
-       new_entry.addr = *skc;
-       new_entry.addr.id = 0;
-       new_entry.flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
-
-       if (new_entry.addr.port == msk_sport)
-               new_entry.addr.port = 0;
+       if (skc->addr.port == msk_sport)
+               skc->addr.port = 0;
 
-       return mptcp_userspace_pm_append_new_local_addr(msk, &new_entry, true);
+       return mptcp_userspace_pm_append_new_local_addr(msk, skc, true);
 }
 
 bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
index 7b74dedc79362203cb058122e0d0a1718fb6035a..333d20a018b42e8881b8ad62466a2f196e869bdc 100644 (file)
@@ -1121,8 +1121,10 @@ 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_addr_info *skc);
-int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *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);