Commit 77e4b94a authored by Geliang Tang's avatar Geliang Tang Committed by David S. Miller

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: 9ab4807c ("mptcp: netlink: Add MPTCP_PM_CMD_ANNOUNCE")
Fixes: 702c2f64 ("mptcp: netlink: allow userspace-driven subflow establishment")
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/329
Cc: stable@vger.kernel.org
Reviewed-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: default avatarGeliang Tang <geliang.tang@suse.com>
Signed-off-by: default avatarMat Martineau <martineau@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6c160b63
...@@ -87,8 +87,15 @@ bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk) ...@@ -87,8 +87,15 @@ bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk)
unsigned int subflows_max; unsigned int subflows_max;
int ret = 0; int ret = 0;
if (mptcp_pm_is_userspace(msk)) if (mptcp_pm_is_userspace(msk)) {
return mptcp_userspace_pm_active(msk); if (mptcp_userspace_pm_active(msk)) {
spin_lock_bh(&pm->lock);
pm->subflows++;
spin_unlock_bh(&pm->lock);
return true;
}
return false;
}
subflows_max = mptcp_pm_get_subflows_max(msk); subflows_max = mptcp_pm_get_subflows_max(msk);
...@@ -181,8 +188,16 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock *ssk, ...@@ -181,8 +188,16 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock *ssk,
struct mptcp_pm_data *pm = &msk->pm; struct mptcp_pm_data *pm = &msk->pm;
bool update_subflows; bool update_subflows;
update_subflows = (subflow->request_join || subflow->mp_join) && update_subflows = subflow->request_join || subflow->mp_join;
mptcp_pm_is_kernel(msk); if (mptcp_pm_is_userspace(msk)) {
if (update_subflows) {
spin_lock_bh(&pm->lock);
pm->subflows--;
spin_unlock_bh(&pm->lock);
}
return;
}
if (!READ_ONCE(pm->work_pending) && !update_subflows) if (!READ_ONCE(pm->work_pending) && !update_subflows)
return; return;
......
...@@ -69,6 +69,7 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk, ...@@ -69,6 +69,7 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
MPTCP_PM_MAX_ADDR_ID + 1, MPTCP_PM_MAX_ADDR_ID + 1,
1); 1);
list_add_tail_rcu(&e->list, &msk->pm.userspace_pm_local_addr_list); list_add_tail_rcu(&e->list, &msk->pm.userspace_pm_local_addr_list);
msk->pm.local_addr_used++;
ret = e->addr.id; ret = e->addr.id;
} else if (match) { } else if (match) {
ret = entry->addr.id; ret = entry->addr.id;
...@@ -96,6 +97,7 @@ static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk, ...@@ -96,6 +97,7 @@ static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk,
*/ */
list_del_rcu(&entry->list); list_del_rcu(&entry->list);
kfree(entry); kfree(entry);
msk->pm.local_addr_used--;
return 0; return 0;
} }
} }
...@@ -195,6 +197,7 @@ int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *info) ...@@ -195,6 +197,7 @@ int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *info)
spin_lock_bh(&msk->pm.lock); spin_lock_bh(&msk->pm.lock);
if (mptcp_pm_alloc_anno_list(msk, &addr_val)) { if (mptcp_pm_alloc_anno_list(msk, &addr_val)) {
msk->pm.add_addr_signaled++;
mptcp_pm_announce_addr(msk, &addr_val.addr, false); mptcp_pm_announce_addr(msk, &addr_val.addr, false);
mptcp_pm_nl_addr_send_ack(msk); mptcp_pm_nl_addr_send_ack(msk);
} }
...@@ -343,6 +346,8 @@ int mptcp_nl_cmd_sf_create(struct sk_buff *skb, struct genl_info *info) ...@@ -343,6 +346,8 @@ int mptcp_nl_cmd_sf_create(struct sk_buff *skb, struct genl_info *info)
spin_lock_bh(&msk->pm.lock); spin_lock_bh(&msk->pm.lock);
if (err) if (err)
mptcp_userspace_pm_delete_local_addr(msk, &local); mptcp_userspace_pm_delete_local_addr(msk, &local);
else
msk->pm.subflows++;
spin_unlock_bh(&msk->pm.lock); spin_unlock_bh(&msk->pm.lock);
create_err: create_err:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment