Skip to content

Commit 77e4b94

Browse files
geliangtangdavem330
authored andcommitted
mptcp: update userspace pm infos
Increase pm subflows counter on both server side and client side when userspace pm creates a new subflow, and decrease the counter when it closes a subflow. Increase add_addr_signaled counter in mptcp_nl_cmd_announce() when the address is announced by userspace PM. This modification is similar to how the in-kernel PM is updating the counter: when additional subflows are created/removed. Fixes: 9ab4807 ("mptcp: netlink: Add MPTCP_PM_CMD_ANNOUNCE") Fixes: 702c2f6 ("mptcp: netlink: allow userspace-driven subflow establishment") Closes: multipath-tcp/mptcp_net-next#329 Cc: stable@vger.kernel.org Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: Geliang Tang <geliang.tang@suse.com> Signed-off-by: Mat Martineau <martineau@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 6c160b6 commit 77e4b94

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

net/mptcp/pm.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,15 @@ bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk)
8787
unsigned int subflows_max;
8888
int ret = 0;
8989

90-
if (mptcp_pm_is_userspace(msk))
91-
return mptcp_userspace_pm_active(msk);
90+
if (mptcp_pm_is_userspace(msk)) {
91+
if (mptcp_userspace_pm_active(msk)) {
92+
spin_lock_bh(&pm->lock);
93+
pm->subflows++;
94+
spin_unlock_bh(&pm->lock);
95+
return true;
96+
}
97+
return false;
98+
}
9299

93100
subflows_max = mptcp_pm_get_subflows_max(msk);
94101

@@ -181,8 +188,16 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock *ssk,
181188
struct mptcp_pm_data *pm = &msk->pm;
182189
bool update_subflows;
183190

184-
update_subflows = (subflow->request_join || subflow->mp_join) &&
185-
mptcp_pm_is_kernel(msk);
191+
update_subflows = subflow->request_join || subflow->mp_join;
192+
if (mptcp_pm_is_userspace(msk)) {
193+
if (update_subflows) {
194+
spin_lock_bh(&pm->lock);
195+
pm->subflows--;
196+
spin_unlock_bh(&pm->lock);
197+
}
198+
return;
199+
}
200+
186201
if (!READ_ONCE(pm->work_pending) && !update_subflows)
187202
return;
188203

net/mptcp/pm_userspace.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
6969
MPTCP_PM_MAX_ADDR_ID + 1,
7070
1);
7171
list_add_tail_rcu(&e->list, &msk->pm.userspace_pm_local_addr_list);
72+
msk->pm.local_addr_used++;
7273
ret = e->addr.id;
7374
} else if (match) {
7475
ret = entry->addr.id;
@@ -96,6 +97,7 @@ static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk,
9697
*/
9798
list_del_rcu(&entry->list);
9899
kfree(entry);
100+
msk->pm.local_addr_used--;
99101
return 0;
100102
}
101103
}
@@ -195,6 +197,7 @@ int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *info)
195197
spin_lock_bh(&msk->pm.lock);
196198

197199
if (mptcp_pm_alloc_anno_list(msk, &addr_val)) {
200+
msk->pm.add_addr_signaled++;
198201
mptcp_pm_announce_addr(msk, &addr_val.addr, false);
199202
mptcp_pm_nl_addr_send_ack(msk);
200203
}
@@ -343,6 +346,8 @@ int mptcp_nl_cmd_sf_create(struct sk_buff *skb, struct genl_info *info)
343346
spin_lock_bh(&msk->pm.lock);
344347
if (err)
345348
mptcp_userspace_pm_delete_local_addr(msk, &local);
349+
else
350+
msk->pm.subflows++;
346351
spin_unlock_bh(&msk->pm.lock);
347352

348353
create_err:

0 commit comments

Comments
 (0)