mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
mptcp: do not block subflows creation on errors
If the MPTCP configuration allows for multiple subflows creation, and the first additional subflows never reach the fully established status - e.g. due to packets drop or reset - the in kernel path manager do not move to the next subflow. This patch introduces a new PM helper to cope with MPJ subflow creation failure and delay and hook it where appropriate. Such helper triggers additional subflow creation, as needed and updates the PM subflow counter, if the current one is closing. Additionally start all the needed additional subflows as soon as the MPTCP socket is fully established, so we don't have to cope with slow MPJ handshake blocking the next subflow creation. Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
86e39e0448
commit
a88c9e4969
4 changed files with 72 additions and 32 deletions
|
@ -172,9 +172,28 @@ void mptcp_pm_subflow_established(struct mptcp_sock *msk)
|
|||
spin_unlock_bh(&pm->lock);
|
||||
}
|
||||
|
||||
void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id)
|
||||
void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock *ssk,
|
||||
const struct mptcp_subflow_context *subflow)
|
||||
{
|
||||
pr_debug("msk=%p", msk);
|
||||
struct mptcp_pm_data *pm = &msk->pm;
|
||||
bool update_subflows;
|
||||
|
||||
update_subflows = (ssk->sk_state == TCP_CLOSE) &&
|
||||
(subflow->request_join || subflow->mp_join);
|
||||
if (!READ_ONCE(pm->work_pending) && !update_subflows)
|
||||
return;
|
||||
|
||||
spin_lock_bh(&pm->lock);
|
||||
if (update_subflows)
|
||||
pm->subflows--;
|
||||
|
||||
/* Even if this subflow is not really established, tell the PM to try
|
||||
* to pick the next ones, if possible.
|
||||
*/
|
||||
if (mptcp_pm_nl_check_work_pending(msk))
|
||||
mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED);
|
||||
|
||||
spin_unlock_bh(&pm->lock);
|
||||
}
|
||||
|
||||
void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue