[PATCH mptcp-net v3 3/8] mptcp: pm: userspace: ID0 is not part of local_addr_used
"Matthieu Baerts (NGI0)" <[email protected]>
| Newsgroups | dev.linux.lists.mptcp |
|---|---|
| Message-ID | <20260807-mptcp-pm-userspace-id0-case-v3-3-de9088549924@kernel.org> |
The PM's local_addr_used counter doesn't take into account the ID0,
similar to what is done with the in-kernel PM.
When deleting a local address, only decrement the counter if it is not
linked to the (initial) ID0. Similarly, do not increment it when
re-adding the exact same entry.
Fixes: 77e4b94a3de6 ("mptcp: update userspace pm infos")
Signed-off-by: Matthieu Baerts (NGI0) <[email protected]>
---
v3:
- split from patch 1.
- do the same check when incrementing it to avoid a "leak". (Sashiko)
- use a new dedicated helper, clearer.
---
net/mptcp/pm_userspace.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 3f1471ec3fc7..27fed3519d39 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -27,6 +27,12 @@ void mptcp_userspace_pm_free_local_addr_list(struct mptcp_sock *msk)
}
}
+static bool
+is_init_id0(struct mptcp_pm_addr_entry *entry)
+{
+ return entry->addr.id == 0 && entry->addr.port == 0;
+}
+
static struct mptcp_pm_addr_entry *
mptcp_userspace_pm_lookup_addr(struct mptcp_sock *msk,
const struct mptcp_addr_info *addr)
@@ -95,7 +101,9 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
MPTCP_PM_MAX_ADDR_ID + 1,
1);
list_add_tail_rcu(&e->list, &msk->pm.userspace_pm_local_addr_list);
- msk->pm.local_addr_used++;
+ /* Just to avoid this counter not to decrease when deleted */
+ if (!is_init_id0(e))
+ msk->pm.local_addr_used++;
ret = e->addr.id;
} else if (addr_match && id_match) {
ret = entry->addr.id;
@@ -121,12 +129,15 @@ static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk,
if (!entry)
return -EINVAL;
+ /* The initial address ID doesn't increment local_addr_used */
+ if (!is_init_id0(entry))
+ msk->pm.local_addr_used--;
+
/* 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;
}
--
2.53.0