From: Greg Kroah-Hartman Date: Mon, 23 Oct 2023 10:22:54 +0000 (+0200) Subject: 6.1-stable patches X-Git-Tag: v4.14.328~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7207cb3976373525a752f846fc630f9117d8f41d;p=thirdparty%2Fkernel%2Fstable-queue.git 6.1-stable patches added patches: mptcp-avoid-sending-rst-when-closing-the-initial-subflow.patch selftests-mptcp-join-correctly-check-for-no-rst.patch selftests-mptcp-join-no-rst-when-rm-subflow-addr.patch --- diff --git a/queue-6.1/mptcp-avoid-sending-rst-when-closing-the-initial-subflow.patch b/queue-6.1/mptcp-avoid-sending-rst-when-closing-the-initial-subflow.patch new file mode 100644 index 00000000000..529cf335f89 --- /dev/null +++ b/queue-6.1/mptcp-avoid-sending-rst-when-closing-the-initial-subflow.patch @@ -0,0 +1,94 @@ +From 14c56686a64c65ba716ff48f1f4b19c85f4cb2a9 Mon Sep 17 00:00:00 2001 +From: Geliang Tang +Date: Wed, 18 Oct 2023 11:23:55 -0700 +Subject: mptcp: avoid sending RST when closing the initial subflow + +From: Geliang Tang + +commit 14c56686a64c65ba716ff48f1f4b19c85f4cb2a9 upstream. + +When closing the first subflow, the MPTCP protocol unconditionally +calls tcp_disconnect(), which in turn generates a reset if the subflow +is established. + +That is unexpected and different from what MPTCP does with MPJ +subflows, where resets are generated only on FASTCLOSE and other edge +scenarios. + +We can't reuse for the first subflow the same code in place for MPJ +subflows, as MPTCP clean them up completely via a tcp_close() call, +while must keep the first subflow socket alive for later re-usage, due +to implementation constraints. + +This patch adds a new helper __mptcp_subflow_disconnect() that +encapsulates, a logic similar to tcp_close, issuing a reset only when +the MPTCP_CF_FASTCLOSE flag is set, and performing a clean shutdown +otherwise. + +Fixes: c2b2ae3925b6 ("mptcp: handle correctly disconnect() failures") +Cc: stable@vger.kernel.org +Reviewed-by: Matthieu Baerts +Co-developed-by: Paolo Abeni +Signed-off-by: Paolo Abeni +Signed-off-by: Geliang Tang +Signed-off-by: Mat Martineau +Link: https://lore.kernel.org/r/20231018-send-net-20231018-v1-4-17ecb002e41d@kernel.org +Signed-off-by: Jakub Kicinski +Signed-off-by: Matthieu Baerts +Signed-off-by: Greg Kroah-Hartman +--- + net/mptcp/protocol.c | 28 ++++++++++++++++++++++------ + 1 file changed, 22 insertions(+), 6 deletions(-) + +--- a/net/mptcp/protocol.c ++++ b/net/mptcp/protocol.c +@@ -2368,6 +2368,26 @@ bool __mptcp_retransmit_pending_data(str + #define MPTCP_CF_PUSH BIT(1) + #define MPTCP_CF_FASTCLOSE BIT(2) + ++/* be sure to send a reset only if the caller asked for it, also ++ * clean completely the subflow status when the subflow reaches ++ * TCP_CLOSE state ++ */ ++static void __mptcp_subflow_disconnect(struct sock *ssk, ++ struct mptcp_subflow_context *subflow, ++ unsigned int flags) ++{ ++ if (((1 << ssk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN)) || ++ (flags & MPTCP_CF_FASTCLOSE)) { ++ /* The MPTCP code never wait on the subflow sockets, TCP-level ++ * disconnect should never fail ++ */ ++ WARN_ON_ONCE(tcp_disconnect(ssk, 0)); ++ mptcp_subflow_ctx_reset(subflow); ++ } else { ++ tcp_shutdown(ssk, SEND_SHUTDOWN); ++ } ++} ++ + /* subflow sockets can be either outgoing (connect) or incoming + * (accept). + * +@@ -2405,7 +2425,7 @@ static void __mptcp_close_ssk(struct soc + lock_sock_nested(ssk, SINGLE_DEPTH_NESTING); + + if ((flags & MPTCP_CF_FASTCLOSE) && !__mptcp_check_fallback(msk)) { +- /* be sure to force the tcp_disconnect() path, ++ /* be sure to force the tcp_close path + * to generate the egress reset + */ + ssk->sk_lingertime = 0; +@@ -2415,12 +2435,8 @@ static void __mptcp_close_ssk(struct soc + + need_push = (flags & MPTCP_CF_PUSH) && __mptcp_retransmit_pending_data(sk); + if (!dispose_it) { +- /* The MPTCP code never wait on the subflow sockets, TCP-level +- * disconnect should never fail +- */ +- WARN_ON_ONCE(tcp_disconnect(ssk, 0)); ++ __mptcp_subflow_disconnect(ssk, subflow, flags); + msk->subflow->state = SS_UNCONNECTED; +- mptcp_subflow_ctx_reset(subflow); + release_sock(ssk); + + goto out; diff --git a/queue-6.1/selftests-mptcp-join-correctly-check-for-no-rst.patch b/queue-6.1/selftests-mptcp-join-correctly-check-for-no-rst.patch new file mode 100644 index 00000000000..e67bbc6cb5e --- /dev/null +++ b/queue-6.1/selftests-mptcp-join-correctly-check-for-no-rst.patch @@ -0,0 +1,55 @@ +From b134a5805455d1886662a6516c965cdb9df9fbcc Mon Sep 17 00:00:00 2001 +From: Matthieu Baerts +Date: Wed, 18 Oct 2023 11:23:52 -0700 +Subject: selftests: mptcp: join: correctly check for no RST + +From: Matthieu Baerts + +commit b134a5805455d1886662a6516c965cdb9df9fbcc upstream. + +The commit mentioned below was more tolerant with the number of RST seen +during a test because in some uncontrollable situations, multiple RST +can be generated. + +But it was not taking into account the case where no RST are expected: +this validation was then no longer reporting issues for the 0 RST case +because it is not possible to have less than 0 RST in the counter. This +patch fixes the issue by adding a specific condition. + +Fixes: 6bf41020b72b ("selftests: mptcp: update and extend fastclose test-cases") +Cc: stable@vger.kernel.org +Reviewed-by: Mat Martineau +Signed-off-by: Matthieu Baerts +Signed-off-by: Mat Martineau +Link: https://lore.kernel.org/r/20231018-send-net-20231018-v1-1-17ecb002e41d@kernel.org +Signed-off-by: Jakub Kicinski +Signed-off-by: Matthieu Baerts +Signed-off-by: Greg Kroah-Hartman +--- + tools/testing/selftests/net/mptcp/mptcp_join.sh | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh ++++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh +@@ -1413,7 +1413,9 @@ chk_rst_nr() + count=$(get_counter ${ns_tx} "MPTcpExtMPRstTx") + if [ -z "$count" ]; then + echo -n "[skip]" +- elif [ $count -lt $rst_tx ]; then ++ # accept more rst than expected except if we don't expect any ++ elif { [ $rst_tx -ne 0 ] && [ $count -lt $rst_tx ]; } || ++ { [ $rst_tx -eq 0 ] && [ $count -ne 0 ]; }; then + echo "[fail] got $count MP_RST[s] TX expected $rst_tx" + fail_test + dump_stats=1 +@@ -1425,7 +1427,9 @@ chk_rst_nr() + count=$(get_counter ${ns_rx} "MPTcpExtMPRstRx") + if [ -z "$count" ]; then + echo -n "[skip]" +- elif [ "$count" -lt "$rst_rx" ]; then ++ # accept more rst than expected except if we don't expect any ++ elif { [ $rst_rx -ne 0 ] && [ $count -lt $rst_rx ]; } || ++ { [ $rst_rx -eq 0 ] && [ $count -ne 0 ]; }; then + echo "[fail] got $count MP_RST[s] RX expected $rst_rx" + fail_test + dump_stats=1 diff --git a/queue-6.1/selftests-mptcp-join-no-rst-when-rm-subflow-addr.patch b/queue-6.1/selftests-mptcp-join-no-rst-when-rm-subflow-addr.patch new file mode 100644 index 00000000000..7c0308e5400 --- /dev/null +++ b/queue-6.1/selftests-mptcp-join-no-rst-when-rm-subflow-addr.patch @@ -0,0 +1,134 @@ +From 2cfaa8b3b7aece3c7b13dd10db20dcea65875692 Mon Sep 17 00:00:00 2001 +From: Matthieu Baerts +Date: Wed, 18 Oct 2023 11:23:56 -0700 +Subject: selftests: mptcp: join: no RST when rm subflow/addr + +From: Matthieu Baerts + +commit 2cfaa8b3b7aece3c7b13dd10db20dcea65875692 upstream. + +Recently, we noticed that some RST were wrongly generated when removing +the initial subflow. + +This patch makes sure RST are not sent when removing any subflows or any +addresses. + +Fixes: c2b2ae3925b6 ("mptcp: handle correctly disconnect() failures") +Cc: stable@vger.kernel.org +Acked-by: Paolo Abeni +Signed-off-by: Matthieu Baerts +Signed-off-by: Mat Martineau +Link: https://lore.kernel.org/r/20231018-send-net-20231018-v1-5-17ecb002e41d@kernel.org +Signed-off-by: Jakub Kicinski +Signed-off-by: Matthieu Baerts +Signed-off-by: Greg Kroah-Hartman +--- + tools/testing/selftests/net/mptcp/mptcp_join.sh | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh ++++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh +@@ -2263,6 +2263,7 @@ remove_tests() + run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow + chk_join_nr 1 1 1 + chk_rm_nr 1 1 ++ chk_rst_nr 0 0 + fi + + # multiple subflows, remove +@@ -2274,6 +2275,7 @@ remove_tests() + run_tests $ns1 $ns2 10.0.1.1 0 0 -2 slow + chk_join_nr 2 2 2 + chk_rm_nr 2 2 ++ chk_rst_nr 0 0 + fi + + # single address, remove +@@ -2285,6 +2287,7 @@ remove_tests() + chk_join_nr 1 1 1 + chk_add_nr 1 1 + chk_rm_nr 1 1 invert ++ chk_rst_nr 0 0 + fi + + # subflow and signal, remove +@@ -2297,6 +2300,7 @@ remove_tests() + chk_join_nr 2 2 2 + chk_add_nr 1 1 + chk_rm_nr 1 1 ++ chk_rst_nr 0 0 + fi + + # subflows and signal, remove +@@ -2310,6 +2314,7 @@ remove_tests() + chk_join_nr 3 3 3 + chk_add_nr 1 1 + chk_rm_nr 2 2 ++ chk_rst_nr 0 0 + fi + + # addresses remove +@@ -2323,6 +2328,7 @@ remove_tests() + chk_join_nr 3 3 3 + chk_add_nr 3 3 + chk_rm_nr 3 3 invert ++ chk_rst_nr 0 0 + fi + + # invalid addresses remove +@@ -2336,6 +2342,7 @@ remove_tests() + chk_join_nr 1 1 1 + chk_add_nr 3 3 + chk_rm_nr 3 1 invert ++ chk_rst_nr 0 0 + fi + + # subflows and signal, flush +@@ -2349,6 +2356,7 @@ remove_tests() + chk_join_nr 3 3 3 + chk_add_nr 1 1 + chk_rm_nr 1 3 invert simult ++ chk_rst_nr 0 0 + fi + + # subflows flush +@@ -2366,6 +2374,7 @@ remove_tests() + else + chk_rm_nr 3 3 + fi ++ chk_rst_nr 0 0 + fi + + # addresses flush +@@ -2379,6 +2388,7 @@ remove_tests() + chk_join_nr 3 3 3 + chk_add_nr 3 3 + chk_rm_nr 3 3 invert simult ++ chk_rst_nr 0 0 + fi + + # invalid addresses flush +@@ -2392,6 +2402,7 @@ remove_tests() + chk_join_nr 1 1 1 + chk_add_nr 3 3 + chk_rm_nr 3 1 invert ++ chk_rst_nr 0 0 + fi + + # remove id 0 subflow +@@ -2402,6 +2413,7 @@ remove_tests() + run_tests $ns1 $ns2 10.0.1.1 0 0 -9 slow + chk_join_nr 1 1 1 + chk_rm_nr 1 1 ++ chk_rst_nr 0 0 + fi + + # remove id 0 address +@@ -2413,6 +2425,7 @@ remove_tests() + chk_join_nr 1 1 1 + chk_add_nr 1 1 + chk_rm_nr 1 1 invert ++ chk_rst_nr 0 0 invert + fi + } + diff --git a/queue-6.1/series b/queue-6.1/series index 02b77a9cf57..aaa8f424dd5 100644 --- a/queue-6.1/series +++ b/queue-6.1/series @@ -191,3 +191,6 @@ phy-mapphone-mdm6600-fix-pinctrl_pm-handling-for-sle.patch net-move-altnames-together-with-the-netdevice.patch bluetooth-hci_sock-fix-slab-oob-read-in-create_monitor_event.patch bluetooth-hci_sock-correctly-bounds-check-and-pad-hci_mon_new_index-name.patch +mptcp-avoid-sending-rst-when-closing-the-initial-subflow.patch +selftests-mptcp-join-correctly-check-for-no-rst.patch +selftests-mptcp-join-no-rst-when-rm-subflow-addr.patch