mptcp: pm: send ACK on an active subflow
commitc07cc3ed89upstream. Taking the first one on the list doesn't work in some cases, e.g. if the initial subflow is being removed. Pick another one instead of not sending anything. Fixes:84dfe3677a("mptcp: send out dedicated ADD_ADDR packet") Cc: stable@vger.kernel.org Reviewed-by: Mat Martineau <martineau@kernel.org> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org> Signed-off-by: Paolo Abeni <pabeni@redhat.com> [ Conflicts in pm_netlink.c, because the code has been refactored in commitf5360e9b31("mptcp: introduce and use mptcp_pm_send_ack()") which is difficult to backport in this version. The same adaptations have been applied: iterating over all subflows, and send the ACK on the first active subflow. ] Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
fd5364b22f
commit
c6877abcdb
+10
-8
@@ -693,16 +693,18 @@ void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk)
|
||||
return;
|
||||
|
||||
__mptcp_flush_join_list(msk);
|
||||
subflow = list_first_entry_or_null(&msk->conn_list, typeof(*subflow), node);
|
||||
if (subflow) {
|
||||
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
|
||||
mptcp_for_each_subflow(msk, subflow) {
|
||||
if (__mptcp_subflow_active(subflow)) {
|
||||
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
|
||||
|
||||
spin_unlock_bh(&msk->pm.lock);
|
||||
pr_debug("send ack for %s\n",
|
||||
mptcp_pm_should_add_signal(msk) ? "add_addr" : "rm_addr");
|
||||
spin_unlock_bh(&msk->pm.lock);
|
||||
pr_debug("send ack for %s\n",
|
||||
mptcp_pm_should_add_signal(msk) ? "add_addr" : "rm_addr");
|
||||
|
||||
mptcp_subflow_send_ack(ssk);
|
||||
spin_lock_bh(&msk->pm.lock);
|
||||
mptcp_subflow_send_ack(ssk);
|
||||
spin_lock_bh(&msk->pm.lock);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user