Skip to content

Commit 8254aa4

Browse files
Geliang Tangintel-lab-lkp
authored andcommitted
mptcp: pm: use addr entry for get_local_id
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(). Signed-off-by: Geliang Tang <[email protected]>
1 parent 795a8f6 commit 8254aa4

File tree

4 files changed

+20
-23
lines changed

4 files changed

+20
-23
lines changed

net/mptcp/pm.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
403403

404404
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
405405
{
406-
struct mptcp_addr_info skc_local;
406+
struct mptcp_pm_addr_entry skc_local = { 0 };
407407
struct mptcp_addr_info msk_local;
408408

409409
if (WARN_ON_ONCE(!msk))
@@ -413,10 +413,13 @@ int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
413413
* addr
414414
*/
415415
mptcp_local_address((struct sock_common *)msk, &msk_local);
416-
mptcp_local_address((struct sock_common *)skc, &skc_local);
417-
if (mptcp_addresses_equal(&msk_local, &skc_local, false))
416+
mptcp_local_address((struct sock_common *)skc, &skc_local.addr);
417+
if (mptcp_addresses_equal(&msk_local, &skc_local.addr, false))
418418
return 0;
419419

420+
skc_local.addr.id = 0;
421+
skc_local.flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
422+
420423
if (mptcp_pm_is_userspace(msk))
421424
return mptcp_userspace_pm_get_local_id(msk, &skc_local);
422425
return mptcp_pm_nl_get_local_id(msk, &skc_local);

net/mptcp/pm_netlink.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1139,7 +1139,8 @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
11391139
return err;
11401140
}
11411141

1142-
int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc)
1142+
int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
1143+
struct mptcp_pm_addr_entry *skc)
11431144
{
11441145
struct mptcp_pm_addr_entry *entry;
11451146
struct pm_nl_pernet *pernet;
@@ -1148,7 +1149,7 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc
11481149
pernet = pm_nl_get_pernet_from_msk(msk);
11491150

11501151
rcu_read_lock();
1151-
entry = __lookup_addr(pernet, skc);
1152+
entry = __lookup_addr(pernet, &skc->addr);
11521153
ret = entry ? entry->addr.id : -1;
11531154
rcu_read_unlock();
11541155
if (ret >= 0)
@@ -1159,12 +1160,8 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc
11591160
if (!entry)
11601161
return -ENOMEM;
11611162

1162-
entry->addr = *skc;
1163-
entry->addr.id = 0;
1163+
*entry = *skc;
11641164
entry->addr.port = 0;
1165-
entry->ifindex = 0;
1166-
entry->flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
1167-
entry->lsk = NULL;
11681165
ret = mptcp_pm_nl_append_new_local_addr(pernet, entry, true);
11691166
if (ret < 0)
11701167
kfree(entry);

net/mptcp/pm_userspace.c

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -131,27 +131,22 @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
131131
}
132132

133133
int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
134-
struct mptcp_addr_info *skc)
134+
struct mptcp_pm_addr_entry *skc)
135135
{
136-
struct mptcp_pm_addr_entry *entry = NULL, new_entry;
137136
__be16 msk_sport = ((struct inet_sock *)
138137
inet_sk((struct sock *)msk))->inet_sport;
138+
struct mptcp_pm_addr_entry *entry;
139139

140140
spin_lock_bh(&msk->pm.lock);
141-
entry = mptcp_userspace_pm_lookup_addr(msk, skc);
141+
entry = mptcp_userspace_pm_lookup_addr(msk, &skc->addr);
142142
spin_unlock_bh(&msk->pm.lock);
143143
if (entry)
144144
return entry->addr.id;
145145

146-
memset(&new_entry, 0, sizeof(struct mptcp_pm_addr_entry));
147-
new_entry.addr = *skc;
148-
new_entry.addr.id = 0;
149-
new_entry.flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
150-
151-
if (new_entry.addr.port == msk_sport)
152-
new_entry.addr.port = 0;
146+
if (skc->addr.port == msk_sport)
147+
skc->addr.port = 0;
153148

154-
return mptcp_userspace_pm_append_new_local_addr(msk, &new_entry, true);
149+
return mptcp_userspace_pm_append_new_local_addr(msk, skc, true);
155150
}
156151

157152
bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,

net/mptcp/protocol.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,8 +1126,10 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, const struct sk_buff *skb,
11261126
bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
11271127
struct mptcp_rm_list *rm_list);
11281128
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
1129-
int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
1130-
int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
1129+
int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
1130+
struct mptcp_pm_addr_entry *skc);
1131+
int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
1132+
struct mptcp_pm_addr_entry *skc);
11311133
bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc);
11321134
bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
11331135
bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);

0 commit comments

Comments
 (0)