mptcp: reset the packet scheduler on incoming MP_PRIO
authorPaolo Abeni <pabeni@redhat.com>
Fri, 8 Apr 2022 19:45:55 +0000 (12:45 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 11 Apr 2022 10:55:53 +0000 (11:55 +0100)
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: Davide Caratti <dcaratti@redhat.com>
Fixes: 40453a5c61f4 ("mptcp: add the incoming MP_PRIO support")
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>
net/mptcp/pm.c
net/mptcp/protocol.c
net/mptcp/protocol.h

index 01809eef29b4bb50f25bb33238a331e942c4e646..8aa0cdb7ad46a3239cf421e55ad601b71d2c0e4e 100644 (file)
@@ -262,14 +262,25 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
        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);
-       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)
index 2a9335ce5df11c748c376eec85f9515fd3f0537f..8f54293c1d88759cfb6ce997f4b87b7ebff9c70b 100644 (file)
@@ -3102,6 +3102,8 @@ static void mptcp_release_cb(struct sock *sk)
                        __mptcp_set_connected(sk);
                if (__test_and_clear_bit(MPTCP_ERROR_REPORT, &msk->cb_flags))
                        __mptcp_error_report(sk);
+               if (__test_and_clear_bit(MPTCP_RESET_SCHEDULER, &msk->cb_flags))
+                       msk->last_snd = NULL;
        }
 
        __mptcp_update_rmem(sk);
index 3c1a3036550f8410ba31d4d2c960d27c29c90186..aca1fb56523f62e4dd2851ad8fba25c7f161da10 100644 (file)
 #define MPTCP_RETRANSMIT       4
 #define MPTCP_FLUSH_JOIN_LIST  5
 #define MPTCP_CONNECTED                6
+#define MPTCP_RESET_SCHEDULER  7
 
 static inline bool before64(__u64 seq1, __u64 seq2)
 {