mptcp: pm: send ACK on an active subflow

commit c07cc3ed89 upstream.

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
  commit f5360e9b31 ("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:
Matthieu Baerts (NGI0)
2024-09-06 10:33:35 +02:00
committed by Greg Kroah-Hartman
parent fd5364b22f
commit c6877abcdb
+10 -8
View File
@@ -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;
}
}
}