Commit 43f5b111 authored by Paolo Abeni's avatar Paolo Abeni Committed by David S. Miller

mptcp: reset the packet scheduler on incoming MP_PRIO

When an incoming MP_PRIO option changes the backup
status of any subflow, we need to reset the packet
scheduler status, or the next send could keep using
the previously selected subflow, without taking in account
the new priorities.
Reported-by: default avatarDavide Caratti <dcaratti@redhat.com>
Fixes: 40453a5c ("mptcp: add the incoming MP_PRIO support")
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 65a569b0
...@@ -262,14 +262,25 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, ...@@ -262,14 +262,25 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
spin_unlock_bh(&pm->lock); spin_unlock_bh(&pm->lock);
} }
void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup) void mptcp_pm_mp_prio_received(struct sock *ssk, u8 bkup)
{ {
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
struct sock *sk = subflow->conn;
struct mptcp_sock *msk;
pr_debug("subflow->backup=%d, bkup=%d\n", subflow->backup, bkup); pr_debug("subflow->backup=%d, bkup=%d\n", subflow->backup, bkup);
subflow->backup = bkup; msk = mptcp_sk(sk);
if (subflow->backup != bkup) {
subflow->backup = bkup;
mptcp_data_lock(sk);
if (!sock_owned_by_user(sk))
msk->last_snd = NULL;
else
__set_bit(MPTCP_RESET_SCHEDULER, &msk->cb_flags);
mptcp_data_unlock(sk);
}
mptcp_event(MPTCP_EVENT_SUB_PRIORITY, mptcp_sk(subflow->conn), sk, GFP_ATOMIC); mptcp_event(MPTCP_EVENT_SUB_PRIORITY, msk, ssk, GFP_ATOMIC);
} }
void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq) void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq)
......
...@@ -3102,6 +3102,8 @@ static void mptcp_release_cb(struct sock *sk) ...@@ -3102,6 +3102,8 @@ static void mptcp_release_cb(struct sock *sk)
__mptcp_set_connected(sk); __mptcp_set_connected(sk);
if (__test_and_clear_bit(MPTCP_ERROR_REPORT, &msk->cb_flags)) if (__test_and_clear_bit(MPTCP_ERROR_REPORT, &msk->cb_flags))
__mptcp_error_report(sk); __mptcp_error_report(sk);
if (__test_and_clear_bit(MPTCP_RESET_SCHEDULER, &msk->cb_flags))
msk->last_snd = NULL;
} }
__mptcp_update_rmem(sk); __mptcp_update_rmem(sk);
......
...@@ -124,6 +124,7 @@ ...@@ -124,6 +124,7 @@
#define MPTCP_RETRANSMIT 4 #define MPTCP_RETRANSMIT 4
#define MPTCP_FLUSH_JOIN_LIST 5 #define MPTCP_FLUSH_JOIN_LIST 5
#define MPTCP_CONNECTED 6 #define MPTCP_CONNECTED 6
#define MPTCP_RESET_SCHEDULER 7
static inline bool before64(__u64 seq1, __u64 seq2) static inline bool before64(__u64 seq1, __u64 seq2)
{ {
......
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