Skip to content

Commit e7b4083

Browse files
Geliang Tangkuba-moo
authored andcommitted
mptcp: add mptcp_userspace_pm_lookup_addr helper
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 <[email protected]> Reviewed-by: Matthieu Baerts (NGI0) <[email protected]> Signed-off-by: Matthieu Baerts (NGI0) <[email protected]> Link: https://patch.msgid.link/20241213-net-next-mptcp-pm-misc-cleanup-v1-1-ddb6d00109a8@kernel.org Signed-off-by: Jakub Kicinski <[email protected]>
1 parent dcacb36 commit e7b4083

File tree

1 file changed

+36
-35
lines changed

1 file changed

+36
-35
lines changed

net/mptcp/pm_userspace.c

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,19 @@ void mptcp_free_local_addr_list(struct mptcp_sock *msk)
2626
}
2727
}
2828

29+
static struct mptcp_pm_addr_entry *
30+
mptcp_userspace_pm_lookup_addr(struct mptcp_sock *msk,
31+
const struct mptcp_addr_info *addr)
32+
{
33+
struct mptcp_pm_addr_entry *entry;
34+
35+
list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
36+
if (mptcp_addresses_equal(&entry->addr, addr, false))
37+
return entry;
38+
}
39+
return NULL;
40+
}
41+
2942
static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
3043
struct mptcp_pm_addr_entry *entry,
3144
bool needs_id)
@@ -90,22 +103,20 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
90103
static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk,
91104
struct mptcp_pm_addr_entry *addr)
92105
{
93-
struct mptcp_pm_addr_entry *entry, *tmp;
94106
struct sock *sk = (struct sock *)msk;
107+
struct mptcp_pm_addr_entry *entry;
95108

96-
list_for_each_entry_safe(entry, tmp, &msk->pm.userspace_pm_local_addr_list, list) {
97-
if (mptcp_addresses_equal(&entry->addr, &addr->addr, false)) {
98-
/* TODO: a refcount is needed because the entry can
99-
* be used multiple times (e.g. fullmesh mode).
100-
*/
101-
list_del_rcu(&entry->list);
102-
sock_kfree_s(sk, entry, sizeof(*entry));
103-
msk->pm.local_addr_used--;
104-
return 0;
105-
}
106-
}
107-
108-
return -EINVAL;
109+
entry = mptcp_userspace_pm_lookup_addr(msk, &addr->addr);
110+
if (!entry)
111+
return -EINVAL;
112+
113+
/* TODO: a refcount is needed because the entry can
114+
* be used multiple times (e.g. fullmesh mode).
115+
*/
116+
list_del_rcu(&entry->list);
117+
sock_kfree_s(sk, entry, sizeof(*entry));
118+
msk->pm.local_addr_used--;
119+
return 0;
109120
}
110121

111122
static struct mptcp_pm_addr_entry *
@@ -123,17 +134,12 @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
123134
int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
124135
struct mptcp_addr_info *skc)
125136
{
126-
struct mptcp_pm_addr_entry *entry = NULL, *e, new_entry;
137+
struct mptcp_pm_addr_entry *entry = NULL, new_entry;
127138
__be16 msk_sport = ((struct inet_sock *)
128139
inet_sk((struct sock *)msk))->inet_sport;
129140

130141
spin_lock_bh(&msk->pm.lock);
131-
list_for_each_entry(e, &msk->pm.userspace_pm_local_addr_list, list) {
132-
if (mptcp_addresses_equal(&e->addr, skc, false)) {
133-
entry = e;
134-
break;
135-
}
136-
}
142+
entry = mptcp_userspace_pm_lookup_addr(msk, skc);
137143
spin_unlock_bh(&msk->pm.lock);
138144
if (entry)
139145
return entry->addr.id;
@@ -153,15 +159,11 @@ bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
153159
struct mptcp_addr_info *skc)
154160
{
155161
struct mptcp_pm_addr_entry *entry;
156-
bool backup = false;
162+
bool backup;
157163

158164
spin_lock_bh(&msk->pm.lock);
159-
list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
160-
if (mptcp_addresses_equal(&entry->addr, skc, false)) {
161-
backup = !!(entry->flags & MPTCP_PM_ADDR_FLAG_BACKUP);
162-
break;
163-
}
164-
}
165+
entry = mptcp_userspace_pm_lookup_addr(msk, skc);
166+
backup = entry && !!(entry->flags & MPTCP_PM_ADDR_FLAG_BACKUP);
165167
spin_unlock_bh(&msk->pm.lock);
166168

167169
return backup;
@@ -606,13 +608,12 @@ int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info)
606608
bkup = 1;
607609

608610
spin_lock_bh(&msk->pm.lock);
609-
list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
610-
if (mptcp_addresses_equal(&entry->addr, &loc.addr, false)) {
611-
if (bkup)
612-
entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP;
613-
else
614-
entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP;
615-
}
611+
entry = mptcp_userspace_pm_lookup_addr(msk, &loc.addr);
612+
if (entry) {
613+
if (bkup)
614+
entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP;
615+
else
616+
entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP;
616617
}
617618
spin_unlock_bh(&msk->pm.lock);
618619

0 commit comments

Comments
 (0)