From: Greg Kroah-Hartman Date: Wed, 4 Sep 2024 14:32:50 +0000 (+0200) Subject: 6.1-stable patches X-Git-Tag: v6.1.109~30 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a9faf0267c0ac695fc9d5a79f64c203de2b16526;p=thirdparty%2Fkernel%2Fstable-queue.git 6.1-stable patches added patches: mptcp-pm-avoid-possible-uaf-when-selecting-endp.patch mptcp-pm-fix-id-0-endp-usage-after-multiple-re-creations.patch mptcp-pm-fullmesh-select-the-right-id-later.patch mptcp-pm-reuse-id-0-after-delete-and-re-add.patch mptcp-pr_debug-add-missing-n-at-the-end.patch selftests-mptcp-add-explicit-test-case-for-remove-readd.patch selftests-mptcp-join-check-re-adding-init-endp-with-id.patch selftests-mptcp-join-check-re-using-id-of-closed-subflow.patch selftests-mptcp-join-check-re-using-id-of-unused-add_addr.patch selftests-mptcp-join-test-for-flush-re-add-endpoints.patch selftests-mptcp-join-validate-fullmesh-endp-on-1st-sf.patch --- diff --git a/queue-6.1/mptcp-pm-avoid-possible-uaf-when-selecting-endp.patch b/queue-6.1/mptcp-pm-avoid-possible-uaf-when-selecting-endp.patch new file mode 100644 index 00000000000..01ce42cd3a4 --- /dev/null +++ b/queue-6.1/mptcp-pm-avoid-possible-uaf-when-selecting-endp.patch @@ -0,0 +1,183 @@ +From stable+bounces-73002-greg=kroah.com@vger.kernel.org Wed Sep 4 12:58:37 2024 +From: "Matthieu Baerts (NGI0)" +Date: Wed, 4 Sep 2024 12:57:22 +0200 +Subject: mptcp: pm: avoid possible UaF when selecting endp +To: stable@vger.kernel.org, gregkh@linuxfoundation.org +Cc: MPTCP Upstream , "Matthieu Baerts (NGI0)" , Paolo Abeni , Mat Martineau , Jakub Kicinski +Message-ID: <20240904105721.4075460-2-matttbe@kernel.org> + +From: "Matthieu Baerts (NGI0)" + +commit 48e50dcbcbaaf713d82bf2da5c16aeced94ad07d upstream. + +select_local_address() and select_signal_address() both select an +endpoint entry from the list inside an RCU protected section, but return +a reference to it, to be read later on. If the entry is dereferenced +after the RCU unlock, reading info could cause a Use-after-Free. + +A simple solution is to copy the required info while inside the RCU +protected section to avoid any risk of UaF later. The address ID might +need to be modified later to handle the ID0 case later, so a copy seems +OK to deal with. + +Reported-by: Paolo Abeni +Closes: https://lore.kernel.org/45cd30d3-7710-491c-ae4d-a1368c00beb1@redhat.com +Fixes: 01cacb00b35c ("mptcp: add netlink-based PM") +Cc: stable@vger.kernel.org +Reviewed-by: Mat Martineau +Signed-off-by: Matthieu Baerts (NGI0) +Link: https://patch.msgid.link/20240819-net-mptcp-pm-reusing-id-v1-14-38035d40de5b@kernel.org +Signed-off-by: Jakub Kicinski +[ Conflicts in pm_netlink.c, because the context has been modified in + commit b9d69db87fb7 ("mptcp: let the in-kernel PM use mixed IPv4 and + IPv6 addresses"), which is not a candidate for the backports. The same + modifications have been applied in this version. The conflict in + mptcp_pm_create_subflow_or_signal_addr() has been resolved by taking + the newer version, which skip a lock if it is not needed. ] +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Greg Kroah-Hartman +--- + net/mptcp/pm_netlink.c | 68 ++++++++++++++++++++++++++----------------------- + 1 file changed, 37 insertions(+), 31 deletions(-) + +--- a/net/mptcp/pm_netlink.c ++++ b/net/mptcp/pm_netlink.c +@@ -150,12 +150,14 @@ static bool lookup_subflow_by_daddr(cons + return false; + } + +-static struct mptcp_pm_addr_entry * ++static bool + select_local_address(const struct pm_nl_pernet *pernet, +- const struct mptcp_sock *msk) ++ const struct mptcp_sock *msk, ++ struct mptcp_pm_addr_entry *new_entry) + { + const struct sock *sk = (const struct sock *)msk; +- struct mptcp_pm_addr_entry *entry, *ret = NULL; ++ struct mptcp_pm_addr_entry *entry; ++ bool found = false; + + msk_owned_by_me(msk); + +@@ -177,17 +179,21 @@ select_local_address(const struct pm_nl_ + continue; + } + +- ret = entry; ++ *new_entry = *entry; ++ found = true; + break; + } + rcu_read_unlock(); +- return ret; ++ ++ return found; + } + +-static struct mptcp_pm_addr_entry * +-select_signal_address(struct pm_nl_pernet *pernet, const struct mptcp_sock *msk) ++static bool ++select_signal_address(struct pm_nl_pernet *pernet, const struct mptcp_sock *msk, ++ struct mptcp_pm_addr_entry *new_entry) + { +- struct mptcp_pm_addr_entry *entry, *ret = NULL; ++ struct mptcp_pm_addr_entry *entry; ++ bool found = false; + + rcu_read_lock(); + /* do not keep any additional per socket state, just signal +@@ -202,11 +208,13 @@ select_signal_address(struct pm_nl_perne + if (!(entry->flags & MPTCP_PM_ADDR_FLAG_SIGNAL)) + continue; + +- ret = entry; ++ *new_entry = *entry; ++ found = true; + break; + } + rcu_read_unlock(); +- return ret; ++ ++ return found; + } + + unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk) +@@ -527,9 +535,10 @@ __lookup_addr(struct pm_nl_pernet *perne + + static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) + { +- struct mptcp_pm_addr_entry *local, *signal_and_subflow = NULL; + struct sock *sk = (struct sock *)msk; ++ struct mptcp_pm_addr_entry local; + unsigned int add_addr_signal_max; ++ bool signal_and_subflow = false; + unsigned int local_addr_max; + struct pm_nl_pernet *pernet; + unsigned int subflows_max; +@@ -580,23 +589,22 @@ static void mptcp_pm_create_subflow_or_s + if (msk->pm.addr_signal & BIT(MPTCP_ADD_ADDR_SIGNAL)) + return; + +- local = select_signal_address(pernet, msk); +- if (!local) ++ if (!select_signal_address(pernet, msk, &local)) + goto subflow; + + /* If the alloc fails, we are on memory pressure, not worth + * continuing, and trying to create subflows. + */ +- if (!mptcp_pm_alloc_anno_list(msk, &local->addr)) ++ if (!mptcp_pm_alloc_anno_list(msk, &local.addr)) + return; + +- __clear_bit(local->addr.id, msk->pm.id_avail_bitmap); ++ __clear_bit(local.addr.id, msk->pm.id_avail_bitmap); + msk->pm.add_addr_signaled++; +- mptcp_pm_announce_addr(msk, &local->addr, false); ++ mptcp_pm_announce_addr(msk, &local.addr, false); + mptcp_pm_nl_addr_send_ack(msk); + +- if (local->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) +- signal_and_subflow = local; ++ if (local.flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) ++ signal_and_subflow = true; + } + + subflow: +@@ -607,24 +615,22 @@ subflow: + bool fullmesh; + int i, nr; + +- if (signal_and_subflow) { +- local = signal_and_subflow; +- signal_and_subflow = NULL; +- } else { +- local = select_local_address(pernet, msk); +- if (!local) +- break; +- } ++ if (signal_and_subflow) ++ signal_and_subflow = false; ++ else if (!select_local_address(pernet, msk, &local)) ++ break; + +- fullmesh = !!(local->flags & MPTCP_PM_ADDR_FLAG_FULLMESH); ++ fullmesh = !!(local.flags & MPTCP_PM_ADDR_FLAG_FULLMESH); + + msk->pm.local_addr_used++; +- nr = fill_remote_addresses_vec(msk, &local->addr, fullmesh, addrs); +- if (nr) +- __clear_bit(local->addr.id, msk->pm.id_avail_bitmap); ++ __clear_bit(local.addr.id, msk->pm.id_avail_bitmap); ++ nr = fill_remote_addresses_vec(msk, &local.addr, fullmesh, addrs); ++ if (nr == 0) ++ continue; ++ + spin_unlock_bh(&msk->pm.lock); + for (i = 0; i < nr; i++) +- __mptcp_subflow_connect(sk, &local->addr, &addrs[i]); ++ __mptcp_subflow_connect(sk, &local.addr, &addrs[i]); + spin_lock_bh(&msk->pm.lock); + } + mptcp_pm_nl_check_work_pending(msk); diff --git a/queue-6.1/mptcp-pm-fix-id-0-endp-usage-after-multiple-re-creations.patch b/queue-6.1/mptcp-pm-fix-id-0-endp-usage-after-multiple-re-creations.patch new file mode 100644 index 00000000000..83aa9b3b574 --- /dev/null +++ b/queue-6.1/mptcp-pm-fix-id-0-endp-usage-after-multiple-re-creations.patch @@ -0,0 +1,67 @@ +From stable+bounces-73006-greg=kroah.com@vger.kernel.org Wed Sep 4 13:04:07 2024 +From: "Matthieu Baerts (NGI0)" +Date: Wed, 4 Sep 2024 13:03:09 +0200 +Subject: mptcp: pm: fix ID 0 endp usage after multiple re-creations +To: mptcp@lists.linux.dev, stable@vger.kernel.org, gregkh@linuxfoundation.org +Cc: "Matthieu Baerts (NGI0)" , "Arınç ÜNAL" , syzbot+455d38ecd5f655fc45cf@syzkaller.appspotmail.com, "Mat Martineau" , "Paolo Abeni" +Message-ID: <20240904110306.4082410-6-matttbe@kernel.org> + +From: "Matthieu Baerts (NGI0)" + +commit 9366922adc6a71378ca01f898c41be295309f044 upstream. + +'local_addr_used' and 'add_addr_accepted' are decremented for addresses +not related to the initial subflow (ID0), because the source and +destination addresses of the initial subflows are known from the +beginning: they don't count as "additional local address being used" or +"ADD_ADDR being accepted". + +It is then required not to increment them when the entrypoint used by +the initial subflow is removed and re-added during a connection. Without +this modification, this entrypoint cannot be removed and re-added more +than once. + +Reported-by: Arınç ÜNAL +Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/512 +Fixes: 3ad14f54bd74 ("mptcp: more accurate MPC endpoint tracking") +Reported-by: syzbot+455d38ecd5f655fc45cf@syzkaller.appspotmail.com +Closes: https://lore.kernel.org/00000000000049861306209237f4@google.com +Cc: stable@vger.kernel.org +Tested-by: Arınç ÜNAL +Reviewed-by: Mat Martineau +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Paolo Abeni +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Greg Kroah-Hartman +--- + net/mptcp/pm_netlink.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +--- a/net/mptcp/pm_netlink.c ++++ b/net/mptcp/pm_netlink.c +@@ -627,12 +627,13 @@ subflow: + + fullmesh = !!(local.flags & MPTCP_PM_ADDR_FLAG_FULLMESH); + +- msk->pm.local_addr_used++; + __clear_bit(local.addr.id, msk->pm.id_avail_bitmap); + + /* Special case for ID0: set the correct ID */ + if (local.addr.id == msk->mpc_endpoint_id) + local.addr.id = 0; ++ else /* local_addr_used is not decr for ID 0 */ ++ msk->pm.local_addr_used++; + + nr = fill_remote_addresses_vec(msk, &local.addr, fullmesh, addrs); + if (nr == 0) +@@ -758,7 +759,9 @@ static void mptcp_pm_nl_add_addr_receive + spin_lock_bh(&msk->pm.lock); + + if (sf_created) { +- msk->pm.add_addr_accepted++; ++ /* add_addr_accepted is not decr for ID 0 */ ++ if (remote.id) ++ msk->pm.add_addr_accepted++; + if (msk->pm.add_addr_accepted >= add_addr_accept_max || + msk->pm.subflows >= subflows_max) + WRITE_ONCE(msk->pm.accept_addr, false); diff --git a/queue-6.1/mptcp-pm-fullmesh-select-the-right-id-later.patch b/queue-6.1/mptcp-pm-fullmesh-select-the-right-id-later.patch new file mode 100644 index 00000000000..f11b4c744ca --- /dev/null +++ b/queue-6.1/mptcp-pm-fullmesh-select-the-right-id-later.patch @@ -0,0 +1,84 @@ +From stable+bounces-73001-greg=kroah.com@vger.kernel.org Wed Sep 4 12:58:26 2024 +From: "Matthieu Baerts (NGI0)" +Date: Wed, 4 Sep 2024 12:56:28 +0200 +Subject: mptcp: pm: fullmesh: select the right ID later +To: stable@vger.kernel.org, gregkh@linuxfoundation.org +Cc: MPTCP Upstream , "Matthieu Baerts (NGI0)" , Mat Martineau , Jakub Kicinski +Message-ID: <20240904105627.4074381-2-matttbe@kernel.org> + +From: "Matthieu Baerts (NGI0)" + +commit 09355f7abb9fbfc1a240be029837921ea417bf4f upstream. + +When reacting upon the reception of an ADD_ADDR, the in-kernel PM first +looks for fullmesh endpoints. If there are some, it will pick them, +using their entry ID. + +It should set the ID 0 when using the endpoint corresponding to the +initial subflow, it is a special case imposed by the MPTCP specs. + +Note that msk->mpc_endpoint_id might not be set when receiving the first +ADD_ADDR from the server. So better to compare the addresses. + +Fixes: 1a0d6136c5f0 ("mptcp: local addresses fullmesh") +Cc: stable@vger.kernel.org +Reviewed-by: Mat Martineau +Signed-off-by: Matthieu Baerts (NGI0) +Link: https://patch.msgid.link/20240819-net-mptcp-pm-reusing-id-v1-12-38035d40de5b@kernel.org +Signed-off-by: Jakub Kicinski +[ Conflicts in pm_netlink.c, because the new 'mpc_addr' variable is + added where the 'local' one was, before commit b9d69db87fb7 ("mptcp: + let the in-kernel PM use mixed IPv4 and IPv6 addresses"), that is not + a candidate for the backports. This 'local' variable has been moved to + the new place to reduce the scope, and help with possible future + backports. ] +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Greg Kroah-Hartman +--- + net/mptcp/pm_netlink.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +--- a/net/mptcp/pm_netlink.c ++++ b/net/mptcp/pm_netlink.c +@@ -648,7 +648,7 @@ static unsigned int fill_local_addresses + { + struct sock *sk = (struct sock *)msk; + struct mptcp_pm_addr_entry *entry; +- struct mptcp_addr_info local; ++ struct mptcp_addr_info mpc_addr; + struct pm_nl_pernet *pernet; + unsigned int subflows_max; + int i = 0; +@@ -656,6 +656,8 @@ static unsigned int fill_local_addresses + pernet = pm_nl_get_pernet_from_msk(msk); + subflows_max = mptcp_pm_get_subflows_max(msk); + ++ mptcp_local_address((struct sock_common *)msk, &mpc_addr); ++ + rcu_read_lock(); + list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) { + if (!(entry->flags & MPTCP_PM_ADDR_FLAG_FULLMESH)) +@@ -673,7 +675,13 @@ static unsigned int fill_local_addresses + + if (msk->pm.subflows < subflows_max) { + msk->pm.subflows++; +- addrs[i++] = entry->addr; ++ addrs[i] = entry->addr; ++ ++ /* Special case for ID0: set the correct ID */ ++ if (mptcp_addresses_equal(&entry->addr, &mpc_addr, entry->addr.port)) ++ addrs[i].id = 0; ++ ++ i++; + } + } + rcu_read_unlock(); +@@ -682,6 +690,8 @@ static unsigned int fill_local_addresses + * 'IPADDRANY' local address + */ + if (!i) { ++ struct mptcp_addr_info local; ++ + memset(&local, 0, sizeof(local)); + local.family = msk->pm.remote.family; + diff --git a/queue-6.1/mptcp-pm-reuse-id-0-after-delete-and-re-add.patch b/queue-6.1/mptcp-pm-reuse-id-0-after-delete-and-re-add.patch new file mode 100644 index 00000000000..bf49a908571 --- /dev/null +++ b/queue-6.1/mptcp-pm-reuse-id-0-after-delete-and-re-add.patch @@ -0,0 +1,56 @@ +From stable+bounces-73005-greg=kroah.com@vger.kernel.org Wed Sep 4 13:04:05 2024 +From: "Matthieu Baerts (NGI0)" +Date: Wed, 4 Sep 2024 13:03:08 +0200 +Subject: mptcp: pm: reuse ID 0 after delete and re-add +To: mptcp@lists.linux.dev, stable@vger.kernel.org, gregkh@linuxfoundation.org +Cc: "Matthieu Baerts (NGI0)" , Mat Martineau , Paolo Abeni +Message-ID: <20240904110306.4082410-5-matttbe@kernel.org> + +From: "Matthieu Baerts (NGI0)" + +commit 8b8ed1b429f8fa7ebd5632555e7b047bc0620075 upstream. + +When the endpoint used by the initial subflow is removed and re-added +later, the PM has to force the ID 0, it is a special case imposed by the +MPTCP specs. + +Note that the endpoint should then need to be re-added reusing the same +ID. + +Fixes: 3ad14f54bd74 ("mptcp: more accurate MPC endpoint tracking") +Cc: stable@vger.kernel.org +Reviewed-by: Mat Martineau +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Paolo Abeni +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Greg Kroah-Hartman +--- + net/mptcp/pm_netlink.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/net/mptcp/pm_netlink.c ++++ b/net/mptcp/pm_netlink.c +@@ -600,6 +600,11 @@ static void mptcp_pm_create_subflow_or_s + + __clear_bit(local.addr.id, msk->pm.id_avail_bitmap); + msk->pm.add_addr_signaled++; ++ ++ /* Special case for ID0: set the correct ID */ ++ if (local.addr.id == msk->mpc_endpoint_id) ++ local.addr.id = 0; ++ + mptcp_pm_announce_addr(msk, &local.addr, false); + mptcp_pm_nl_addr_send_ack(msk); + +@@ -624,6 +629,11 @@ subflow: + + msk->pm.local_addr_used++; + __clear_bit(local.addr.id, msk->pm.id_avail_bitmap); ++ ++ /* Special case for ID0: set the correct ID */ ++ if (local.addr.id == msk->mpc_endpoint_id) ++ local.addr.id = 0; ++ + nr = fill_remote_addresses_vec(msk, &local.addr, fullmesh, addrs); + if (nr == 0) + continue; diff --git a/queue-6.1/mptcp-pr_debug-add-missing-n-at-the-end.patch b/queue-6.1/mptcp-pr_debug-add-missing-n-at-the-end.patch new file mode 100644 index 00000000000..b58c3d2038b --- /dev/null +++ b/queue-6.1/mptcp-pr_debug-add-missing-n-at-the-end.patch @@ -0,0 +1,1012 @@ +From stable+bounces-73013-greg=kroah.com@vger.kernel.org Wed Sep 4 13:09:42 2024 +From: "Matthieu Baerts (NGI0)" +Date: Wed, 4 Sep 2024 13:09:27 +0200 +Subject: mptcp: pr_debug: add missing \n at the end +To: stable@vger.kernel.org, gregkh@linuxfoundation.org +Cc: MPTCP Upstream , "Matthieu Baerts (NGI0)" , Geliang Tang , Jakub Kicinski +Message-ID: <20240904110926.4090424-2-matttbe@kernel.org> + +From: "Matthieu Baerts (NGI0)" + +commit cb41b195e634d3f1ecfcd845314e64fd4bb3c7aa upstream. + +pr_debug() have been added in various places in MPTCP code to help +developers to debug some situations. With the dynamic debug feature, it +is easy to enable all or some of them, and asks users to reproduce +issues with extra debug. + +Many of these pr_debug() don't end with a new line, while no 'pr_cont()' +are used in MPTCP code. So the goal was not to display multiple debug +messages on one line: they were then not missing the '\n' on purpose. +Not having the new line at the end causes these messages to be printed +with a delay, when something else needs to be printed. This issue is not +visible when many messages need to be printed, but it is annoying and +confusing when only specific messages are expected, e.g. + + # echo "func mptcp_pm_add_addr_echoed +fmp" \ + > /sys/kernel/debug/dynamic_debug/control + # ./mptcp_join.sh "signal address"; \ + echo "$(awk '{print $1}' /proc/uptime) - end"; \ + sleep 5s; \ + echo "$(awk '{print $1}' /proc/uptime) - restart"; \ + ./mptcp_join.sh "signal address" + 013 signal address + (...) + 10.75 - end + 15.76 - restart + 013 signal address + [ 10.367935] mptcp:mptcp_pm_add_addr_echoed: MPTCP: msk=(...) + (...) + + => a delay of 5 seconds: printed with a 10.36 ts, but after 'restart' + which was printed at the 15.76 ts. + +The 'Fixes' tag here below points to the first pr_debug() used without +'\n' in net/mptcp. This patch could be split in many small ones, with +different Fixes tag, but it doesn't seem worth it, because it is easy to +re-generate this patch with this simple 'sed' command: + + git grep -l pr_debug -- net/mptcp | + xargs sed -i "s/\(pr_debug(\".*[^n]\)\(\"[,)]\)/\1\\\n\2/g" + +So in case of conflicts, simply drop the modifications, and launch this +command. + +Fixes: f870fa0b5768 ("mptcp: Add MPTCP socket stubs") +Cc: stable@vger.kernel.org +Reviewed-by: Geliang Tang +Signed-off-by: Matthieu Baerts (NGI0) +Link: https://patch.msgid.link/20240826-net-mptcp-close-extra-sf-fin-v1-4-905199fe1172@kernel.org +Signed-off-by: Jakub Kicinski +[ As mentioned above, conflicts were expected, and resolved by using the + 'sed' command which is visible above. ] +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Greg Kroah-Hartman +--- + net/mptcp/options.c | 50 +++++++++++++++++++++++------------------------ + net/mptcp/pm.c | 28 +++++++++++++------------- + net/mptcp/pm_netlink.c | 20 +++++++++--------- + net/mptcp/protocol.c | 52 ++++++++++++++++++++++++------------------------- + net/mptcp/protocol.h | 4 +-- + net/mptcp/sockopt.c | 4 +-- + net/mptcp/subflow.c | 50 +++++++++++++++++++++++------------------------ + 7 files changed, 104 insertions(+), 104 deletions(-) + +--- a/net/mptcp/options.c ++++ b/net/mptcp/options.c +@@ -112,7 +112,7 @@ static void mptcp_parse_option(const str + mp_opt->suboptions |= OPTION_MPTCP_CSUMREQD; + ptr += 2; + } +- pr_debug("MP_CAPABLE version=%x, flags=%x, optlen=%d sndr=%llu, rcvr=%llu len=%d csum=%u", ++ pr_debug("MP_CAPABLE version=%x, flags=%x, optlen=%d sndr=%llu, rcvr=%llu len=%d csum=%u\n", + version, flags, opsize, mp_opt->sndr_key, + mp_opt->rcvr_key, mp_opt->data_len, mp_opt->csum); + break; +@@ -126,7 +126,7 @@ static void mptcp_parse_option(const str + ptr += 4; + mp_opt->nonce = get_unaligned_be32(ptr); + ptr += 4; +- pr_debug("MP_JOIN bkup=%u, id=%u, token=%u, nonce=%u", ++ pr_debug("MP_JOIN bkup=%u, id=%u, token=%u, nonce=%u\n", + mp_opt->backup, mp_opt->join_id, + mp_opt->token, mp_opt->nonce); + } else if (opsize == TCPOLEN_MPTCP_MPJ_SYNACK) { +@@ -137,19 +137,19 @@ static void mptcp_parse_option(const str + ptr += 8; + mp_opt->nonce = get_unaligned_be32(ptr); + ptr += 4; +- pr_debug("MP_JOIN bkup=%u, id=%u, thmac=%llu, nonce=%u", ++ pr_debug("MP_JOIN bkup=%u, id=%u, thmac=%llu, nonce=%u\n", + mp_opt->backup, mp_opt->join_id, + mp_opt->thmac, mp_opt->nonce); + } else if (opsize == TCPOLEN_MPTCP_MPJ_ACK) { + mp_opt->suboptions |= OPTION_MPTCP_MPJ_ACK; + ptr += 2; + memcpy(mp_opt->hmac, ptr, MPTCPOPT_HMAC_LEN); +- pr_debug("MP_JOIN hmac"); ++ pr_debug("MP_JOIN hmac\n"); + } + break; + + case MPTCPOPT_DSS: +- pr_debug("DSS"); ++ pr_debug("DSS\n"); + ptr++; + + /* we must clear 'mpc_map' be able to detect MP_CAPABLE +@@ -164,7 +164,7 @@ static void mptcp_parse_option(const str + mp_opt->ack64 = (flags & MPTCP_DSS_ACK64) != 0; + mp_opt->use_ack = (flags & MPTCP_DSS_HAS_ACK); + +- pr_debug("data_fin=%d dsn64=%d use_map=%d ack64=%d use_ack=%d", ++ pr_debug("data_fin=%d dsn64=%d use_map=%d ack64=%d use_ack=%d\n", + mp_opt->data_fin, mp_opt->dsn64, + mp_opt->use_map, mp_opt->ack64, + mp_opt->use_ack); +@@ -202,7 +202,7 @@ static void mptcp_parse_option(const str + ptr += 4; + } + +- pr_debug("data_ack=%llu", mp_opt->data_ack); ++ pr_debug("data_ack=%llu\n", mp_opt->data_ack); + } + + if (mp_opt->use_map) { +@@ -226,7 +226,7 @@ static void mptcp_parse_option(const str + ptr += 2; + } + +- pr_debug("data_seq=%llu subflow_seq=%u data_len=%u csum=%d:%u", ++ pr_debug("data_seq=%llu subflow_seq=%u data_len=%u csum=%d:%u\n", + mp_opt->data_seq, mp_opt->subflow_seq, + mp_opt->data_len, !!(mp_opt->suboptions & OPTION_MPTCP_CSUMREQD), + mp_opt->csum); +@@ -288,7 +288,7 @@ static void mptcp_parse_option(const str + mp_opt->ahmac = get_unaligned_be64(ptr); + ptr += 8; + } +- pr_debug("ADD_ADDR%s: id=%d, ahmac=%llu, echo=%d, port=%d", ++ pr_debug("ADD_ADDR%s: id=%d, ahmac=%llu, echo=%d, port=%d\n", + (mp_opt->addr.family == AF_INET6) ? "6" : "", + mp_opt->addr.id, mp_opt->ahmac, mp_opt->echo, ntohs(mp_opt->addr.port)); + break; +@@ -304,7 +304,7 @@ static void mptcp_parse_option(const str + mp_opt->rm_list.nr = opsize - TCPOLEN_MPTCP_RM_ADDR_BASE; + for (i = 0; i < mp_opt->rm_list.nr; i++) + mp_opt->rm_list.ids[i] = *ptr++; +- pr_debug("RM_ADDR: rm_list_nr=%d", mp_opt->rm_list.nr); ++ pr_debug("RM_ADDR: rm_list_nr=%d\n", mp_opt->rm_list.nr); + break; + + case MPTCPOPT_MP_PRIO: +@@ -313,7 +313,7 @@ static void mptcp_parse_option(const str + + mp_opt->suboptions |= OPTION_MPTCP_PRIO; + mp_opt->backup = *ptr++ & MPTCP_PRIO_BKUP; +- pr_debug("MP_PRIO: prio=%d", mp_opt->backup); ++ pr_debug("MP_PRIO: prio=%d\n", mp_opt->backup); + break; + + case MPTCPOPT_MP_FASTCLOSE: +@@ -324,7 +324,7 @@ static void mptcp_parse_option(const str + mp_opt->rcvr_key = get_unaligned_be64(ptr); + ptr += 8; + mp_opt->suboptions |= OPTION_MPTCP_FASTCLOSE; +- pr_debug("MP_FASTCLOSE: recv_key=%llu", mp_opt->rcvr_key); ++ pr_debug("MP_FASTCLOSE: recv_key=%llu\n", mp_opt->rcvr_key); + break; + + case MPTCPOPT_RST: +@@ -338,7 +338,7 @@ static void mptcp_parse_option(const str + flags = *ptr++; + mp_opt->reset_transient = flags & MPTCP_RST_TRANSIENT; + mp_opt->reset_reason = *ptr; +- pr_debug("MP_RST: transient=%u reason=%u", ++ pr_debug("MP_RST: transient=%u reason=%u\n", + mp_opt->reset_transient, mp_opt->reset_reason); + break; + +@@ -349,7 +349,7 @@ static void mptcp_parse_option(const str + ptr += 2; + mp_opt->suboptions |= OPTION_MPTCP_FAIL; + mp_opt->fail_seq = get_unaligned_be64(ptr); +- pr_debug("MP_FAIL: data_seq=%llu", mp_opt->fail_seq); ++ pr_debug("MP_FAIL: data_seq=%llu\n", mp_opt->fail_seq); + break; + + default: +@@ -412,7 +412,7 @@ bool mptcp_syn_options(struct sock *sk, + *size = TCPOLEN_MPTCP_MPC_SYN; + return true; + } else if (subflow->request_join) { +- pr_debug("remote_token=%u, nonce=%u", subflow->remote_token, ++ pr_debug("remote_token=%u, nonce=%u\n", subflow->remote_token, + subflow->local_nonce); + opts->suboptions = OPTION_MPTCP_MPJ_SYN; + opts->join_id = subflow->local_id; +@@ -496,7 +496,7 @@ static bool mptcp_established_options_mp + *size = TCPOLEN_MPTCP_MPC_ACK; + } + +- pr_debug("subflow=%p, local_key=%llu, remote_key=%llu map_len=%d", ++ pr_debug("subflow=%p, local_key=%llu, remote_key=%llu map_len=%d\n", + subflow, subflow->local_key, subflow->remote_key, + data_len); + +@@ -505,7 +505,7 @@ static bool mptcp_established_options_mp + opts->suboptions = OPTION_MPTCP_MPJ_ACK; + memcpy(opts->hmac, subflow->hmac, MPTCPOPT_HMAC_LEN); + *size = TCPOLEN_MPTCP_MPJ_ACK; +- pr_debug("subflow=%p", subflow); ++ pr_debug("subflow=%p\n", subflow); + + /* we can use the full delegate action helper only from BH context + * If we are in process context - sk is flushing the backlog at +@@ -673,7 +673,7 @@ static bool mptcp_established_options_ad + + *size = len; + if (drop_other_suboptions) { +- pr_debug("drop other suboptions"); ++ pr_debug("drop other suboptions\n"); + opts->suboptions = 0; + + /* note that e.g. DSS could have written into the memory +@@ -690,7 +690,7 @@ static bool mptcp_established_options_ad + msk->remote_key, + &opts->addr); + } +- pr_debug("addr_id=%d, ahmac=%llu, echo=%d, port=%d", ++ pr_debug("addr_id=%d, ahmac=%llu, echo=%d, port=%d\n", + opts->addr.id, opts->ahmac, echo, ntohs(opts->addr.port)); + + return true; +@@ -721,7 +721,7 @@ static bool mptcp_established_options_rm + opts->rm_list = rm_list; + + for (i = 0; i < opts->rm_list.nr; i++) +- pr_debug("rm_list_ids[%d]=%d", i, opts->rm_list.ids[i]); ++ pr_debug("rm_list_ids[%d]=%d\n", i, opts->rm_list.ids[i]); + + return true; + } +@@ -747,7 +747,7 @@ static bool mptcp_established_options_mp + opts->suboptions |= OPTION_MPTCP_PRIO; + opts->backup = subflow->request_bkup; + +- pr_debug("prio=%d", opts->backup); ++ pr_debug("prio=%d\n", opts->backup); + + return true; + } +@@ -789,7 +789,7 @@ static bool mptcp_established_options_fa + opts->suboptions |= OPTION_MPTCP_FASTCLOSE; + opts->rcvr_key = msk->remote_key; + +- pr_debug("FASTCLOSE key=%llu", opts->rcvr_key); ++ pr_debug("FASTCLOSE key=%llu\n", opts->rcvr_key); + MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFASTCLOSETX); + return true; + } +@@ -811,7 +811,7 @@ static bool mptcp_established_options_mp + opts->suboptions |= OPTION_MPTCP_FAIL; + opts->fail_seq = subflow->map_seq; + +- pr_debug("MP_FAIL fail_seq=%llu", opts->fail_seq); ++ pr_debug("MP_FAIL fail_seq=%llu\n", opts->fail_seq); + MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFAILTX); + + return true; +@@ -899,7 +899,7 @@ bool mptcp_synack_options(const struct r + opts->csum_reqd = subflow_req->csum_reqd; + opts->allow_join_id0 = subflow_req->allow_join_id0; + *size = TCPOLEN_MPTCP_MPC_SYNACK; +- pr_debug("subflow_req=%p, local_key=%llu", ++ pr_debug("subflow_req=%p, local_key=%llu\n", + subflow_req, subflow_req->local_key); + return true; + } else if (subflow_req->mp_join) { +@@ -908,7 +908,7 @@ bool mptcp_synack_options(const struct r + opts->join_id = subflow_req->local_id; + opts->thmac = subflow_req->thmac; + opts->nonce = subflow_req->local_nonce; +- pr_debug("req=%p, bkup=%u, id=%u, thmac=%llu, nonce=%u", ++ pr_debug("req=%p, bkup=%u, id=%u, thmac=%llu, nonce=%u\n", + subflow_req, opts->backup, opts->join_id, + opts->thmac, opts->nonce); + *size = TCPOLEN_MPTCP_MPJ_SYNACK; +--- a/net/mptcp/pm.c ++++ b/net/mptcp/pm.c +@@ -20,7 +20,7 @@ int mptcp_pm_announce_addr(struct mptcp_ + { + u8 add_addr = READ_ONCE(msk->pm.addr_signal); + +- pr_debug("msk=%p, local_id=%d, echo=%d", msk, addr->id, echo); ++ pr_debug("msk=%p, local_id=%d, echo=%d\n", msk, addr->id, echo); + + lockdep_assert_held(&msk->pm.lock); + +@@ -45,7 +45,7 @@ int mptcp_pm_remove_addr(struct mptcp_so + { + u8 rm_addr = READ_ONCE(msk->pm.addr_signal); + +- pr_debug("msk=%p, rm_list_nr=%d", msk, rm_list->nr); ++ pr_debug("msk=%p, rm_list_nr=%d\n", msk, rm_list->nr); + + if (rm_addr) { + pr_warn("addr_signal error, rm_addr=%d", rm_addr); +@@ -65,7 +65,7 @@ void mptcp_pm_new_connection(struct mptc + { + struct mptcp_pm_data *pm = &msk->pm; + +- pr_debug("msk=%p, token=%u side=%d", msk, msk->token, server_side); ++ pr_debug("msk=%p, token=%u side=%d\n", msk, msk->token, server_side); + + WRITE_ONCE(pm->server_side, server_side); + mptcp_event(MPTCP_EVENT_CREATED, msk, ssk, GFP_ATOMIC); +@@ -89,7 +89,7 @@ bool mptcp_pm_allow_new_subflow(struct m + + subflows_max = mptcp_pm_get_subflows_max(msk); + +- pr_debug("msk=%p subflows=%d max=%d allow=%d", msk, pm->subflows, ++ pr_debug("msk=%p subflows=%d max=%d allow=%d\n", msk, pm->subflows, + subflows_max, READ_ONCE(pm->accept_subflow)); + + /* try to avoid acquiring the lock below */ +@@ -113,7 +113,7 @@ bool mptcp_pm_allow_new_subflow(struct m + static bool mptcp_pm_schedule_work(struct mptcp_sock *msk, + enum mptcp_pm_status new_status) + { +- pr_debug("msk=%p status=%x new=%lx", msk, msk->pm.status, ++ pr_debug("msk=%p status=%x new=%lx\n", msk, msk->pm.status, + BIT(new_status)); + if (msk->pm.status & BIT(new_status)) + return false; +@@ -128,7 +128,7 @@ void mptcp_pm_fully_established(struct m + struct mptcp_pm_data *pm = &msk->pm; + bool announce = false; + +- pr_debug("msk=%p", msk); ++ pr_debug("msk=%p\n", msk); + + spin_lock_bh(&pm->lock); + +@@ -152,14 +152,14 @@ void mptcp_pm_fully_established(struct m + + void mptcp_pm_connection_closed(struct mptcp_sock *msk) + { +- pr_debug("msk=%p", msk); ++ pr_debug("msk=%p\n", msk); + } + + void mptcp_pm_subflow_established(struct mptcp_sock *msk) + { + struct mptcp_pm_data *pm = &msk->pm; + +- pr_debug("msk=%p", msk); ++ pr_debug("msk=%p\n", msk); + + if (!READ_ONCE(pm->work_pending)) + return; +@@ -211,7 +211,7 @@ void mptcp_pm_add_addr_received(const st + struct mptcp_sock *msk = mptcp_sk(subflow->conn); + struct mptcp_pm_data *pm = &msk->pm; + +- pr_debug("msk=%p remote_id=%d accept=%d", msk, addr->id, ++ pr_debug("msk=%p remote_id=%d accept=%d\n", msk, addr->id, + READ_ONCE(pm->accept_addr)); + + mptcp_event_addr_announced(ssk, addr); +@@ -244,7 +244,7 @@ void mptcp_pm_add_addr_echoed(struct mpt + { + struct mptcp_pm_data *pm = &msk->pm; + +- pr_debug("msk=%p", msk); ++ pr_debug("msk=%p\n", msk); + + spin_lock_bh(&pm->lock); + +@@ -268,7 +268,7 @@ void mptcp_pm_rm_addr_received(struct mp + struct mptcp_pm_data *pm = &msk->pm; + u8 i; + +- pr_debug("msk=%p remote_ids_nr=%d", msk, rm_list->nr); ++ pr_debug("msk=%p remote_ids_nr=%d\n", msk, rm_list->nr); + + for (i = 0; i < rm_list->nr; i++) + mptcp_event_addr_removed(msk, rm_list->ids[i]); +@@ -307,19 +307,19 @@ void mptcp_pm_mp_fail_received(struct so + struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + struct mptcp_sock *msk = mptcp_sk(subflow->conn); + +- pr_debug("fail_seq=%llu", fail_seq); ++ pr_debug("fail_seq=%llu\n", fail_seq); + + if (!READ_ONCE(msk->allow_infinite_fallback)) + return; + + if (!subflow->fail_tout) { +- pr_debug("send MP_FAIL response and infinite map"); ++ pr_debug("send MP_FAIL response and infinite map\n"); + + subflow->send_mp_fail = 1; + subflow->send_infinite_map = 1; + tcp_send_ack(sk); + } else { +- pr_debug("MP_FAIL response received"); ++ pr_debug("MP_FAIL response received\n"); + WRITE_ONCE(subflow->fail_tout, 0); + } + } +--- a/net/mptcp/pm_netlink.c ++++ b/net/mptcp/pm_netlink.c +@@ -305,7 +305,7 @@ static void mptcp_pm_add_timer(struct ti + struct mptcp_sock *msk = entry->sock; + struct sock *sk = (struct sock *)msk; + +- pr_debug("msk=%p", msk); ++ pr_debug("msk=%p\n", msk); + + if (!msk) + return; +@@ -324,7 +324,7 @@ static void mptcp_pm_add_timer(struct ti + spin_lock_bh(&msk->pm.lock); + + if (!mptcp_pm_should_add_signal_addr(msk)) { +- pr_debug("retransmit ADD_ADDR id=%d", entry->addr.id); ++ pr_debug("retransmit ADD_ADDR id=%d\n", entry->addr.id); + mptcp_pm_announce_addr(msk, &entry->addr, false); + mptcp_pm_add_addr_send_ack(msk); + entry->retrans_times++; +@@ -405,7 +405,7 @@ void mptcp_pm_free_anno_list(struct mptc + struct sock *sk = (struct sock *)msk; + LIST_HEAD(free_list); + +- pr_debug("msk=%p", msk); ++ pr_debug("msk=%p\n", msk); + + spin_lock_bh(&msk->pm.lock); + list_splice_init(&msk->pm.anno_list, &free_list); +@@ -482,7 +482,7 @@ static void __mptcp_pm_send_ack(struct m + struct sock *ssk = mptcp_subflow_tcp_sock(subflow); + bool slow; + +- pr_debug("send ack for %s", ++ pr_debug("send ack for %s\n", + prio ? "mp_prio" : (mptcp_pm_should_add_signal(msk) ? "add_addr" : "rm_addr")); + + slow = lock_sock_fast(ssk); +@@ -732,7 +732,7 @@ static void mptcp_pm_nl_add_addr_receive + add_addr_accept_max = mptcp_pm_get_add_addr_accept_max(msk); + subflows_max = mptcp_pm_get_subflows_max(msk); + +- pr_debug("accepted %d:%d remote family %d", ++ pr_debug("accepted %d:%d remote family %d\n", + msk->pm.add_addr_accepted, add_addr_accept_max, + msk->pm.remote.family); + +@@ -803,7 +803,7 @@ int mptcp_pm_nl_mp_prio_send_ack(struct + { + struct mptcp_subflow_context *subflow; + +- pr_debug("bkup=%d", bkup); ++ pr_debug("bkup=%d\n", bkup); + + mptcp_for_each_subflow(msk, subflow) { + struct sock *ssk = mptcp_subflow_tcp_sock(subflow); +@@ -834,7 +834,7 @@ static void mptcp_pm_nl_rm_addr_or_subfl + struct sock *sk = (struct sock *)msk; + u8 i; + +- pr_debug("%s rm_list_nr %d", ++ pr_debug("%s rm_list_nr %d\n", + rm_type == MPTCP_MIB_RMADDR ? "address" : "subflow", rm_list->nr); + + msk_owned_by_me(msk); +@@ -865,7 +865,7 @@ static void mptcp_pm_nl_rm_addr_or_subfl + if (rm_type == MPTCP_MIB_RMSUBFLOW && id != rm_id) + continue; + +- pr_debug(" -> %s rm_list_ids[%d]=%u local_id=%u remote_id=%u mpc_id=%u", ++ pr_debug(" -> %s rm_list_ids[%d]=%u local_id=%u remote_id=%u mpc_id=%u\n", + rm_type == MPTCP_MIB_RMADDR ? "address" : "subflow", + i, rm_id, id, remote_id, msk->mpc_endpoint_id); + spin_unlock_bh(&msk->pm.lock); +@@ -922,7 +922,7 @@ void mptcp_pm_nl_work(struct mptcp_sock + + spin_lock_bh(&msk->pm.lock); + +- pr_debug("msk=%p status=%x", msk, pm->status); ++ pr_debug("msk=%p status=%x\n", msk, pm->status); + if (pm->status & BIT(MPTCP_PM_ADD_ADDR_RECEIVED)) { + pm->status &= ~BIT(MPTCP_PM_ADD_ADDR_RECEIVED); + mptcp_pm_nl_add_addr_received(msk); +@@ -1540,7 +1540,7 @@ static int mptcp_nl_remove_subflow_and_s + long s_slot = 0, s_num = 0; + struct mptcp_sock *msk; + +- pr_debug("remove_id=%d", addr->id); ++ pr_debug("remove_id=%d\n", addr->id); + + while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { + struct sock *sk = (struct sock *)msk; +--- a/net/mptcp/protocol.c ++++ b/net/mptcp/protocol.c +@@ -152,7 +152,7 @@ static bool mptcp_try_coalesce(struct so + !skb_try_coalesce(to, from, &fragstolen, &delta)) + return false; + +- pr_debug("colesced seq %llx into %llx new len %d new end seq %llx", ++ pr_debug("colesced seq %llx into %llx new len %d new end seq %llx\n", + MPTCP_SKB_CB(from)->map_seq, MPTCP_SKB_CB(to)->map_seq, + to->len, MPTCP_SKB_CB(from)->end_seq); + MPTCP_SKB_CB(to)->end_seq = MPTCP_SKB_CB(from)->end_seq; +@@ -230,7 +230,7 @@ static void mptcp_data_queue_ofo(struct + end_seq = MPTCP_SKB_CB(skb)->end_seq; + max_seq = atomic64_read(&msk->rcv_wnd_sent); + +- pr_debug("msk=%p seq=%llx limit=%llx empty=%d", msk, seq, max_seq, ++ pr_debug("msk=%p seq=%llx limit=%llx empty=%d\n", msk, seq, max_seq, + RB_EMPTY_ROOT(&msk->out_of_order_queue)); + if (after64(end_seq, max_seq)) { + /* out of window */ +@@ -653,7 +653,7 @@ static bool __mptcp_move_skbs_from_subfl + } + } + +- pr_debug("msk=%p ssk=%p", msk, ssk); ++ pr_debug("msk=%p ssk=%p\n", msk, ssk); + tp = tcp_sk(ssk); + do { + u32 map_remaining, offset; +@@ -732,7 +732,7 @@ static bool __mptcp_ofo_queue(struct mpt + u64 end_seq; + + p = rb_first(&msk->out_of_order_queue); +- pr_debug("msk=%p empty=%d", msk, RB_EMPTY_ROOT(&msk->out_of_order_queue)); ++ pr_debug("msk=%p empty=%d\n", msk, RB_EMPTY_ROOT(&msk->out_of_order_queue)); + while (p) { + skb = rb_to_skb(p); + if (after64(MPTCP_SKB_CB(skb)->map_seq, msk->ack_seq)) +@@ -754,7 +754,7 @@ static bool __mptcp_ofo_queue(struct mpt + int delta = msk->ack_seq - MPTCP_SKB_CB(skb)->map_seq; + + /* skip overlapping data, if any */ +- pr_debug("uncoalesced seq=%llx ack seq=%llx delta=%d", ++ pr_debug("uncoalesced seq=%llx ack seq=%llx delta=%d\n", + MPTCP_SKB_CB(skb)->map_seq, msk->ack_seq, + delta); + MPTCP_SKB_CB(skb)->offset += delta; +@@ -1292,7 +1292,7 @@ static int mptcp_sendmsg_frag(struct soc + size_t copy; + int i; + +- pr_debug("msk=%p ssk=%p sending dfrag at seq=%llu len=%u already sent=%u", ++ pr_debug("msk=%p ssk=%p sending dfrag at seq=%llu len=%u already sent=%u\n", + msk, ssk, dfrag->data_seq, dfrag->data_len, info->sent); + + if (WARN_ON_ONCE(info->sent > info->limit || +@@ -1393,7 +1393,7 @@ alloc_skb: + mpext->use_map = 1; + mpext->dsn64 = 1; + +- pr_debug("data_seq=%llu subflow_seq=%u data_len=%u dsn64=%d", ++ pr_debug("data_seq=%llu subflow_seq=%u data_len=%u dsn64=%d\n", + mpext->data_seq, mpext->subflow_seq, mpext->data_len, + mpext->dsn64); + +@@ -1870,7 +1870,7 @@ static int mptcp_sendmsg(struct sock *sk + if (!msk->first_pending) + WRITE_ONCE(msk->first_pending, dfrag); + } +- pr_debug("msk=%p dfrag at seq=%llu len=%u sent=%u new=%d", msk, ++ pr_debug("msk=%p dfrag at seq=%llu len=%u sent=%u new=%d\n", msk, + dfrag->data_seq, dfrag->data_len, dfrag->already_sent, + !dfrag_collapsed); + +@@ -2226,7 +2226,7 @@ static int mptcp_recvmsg(struct sock *sk + } + } + +- pr_debug("block timeout %ld", timeo); ++ pr_debug("block timeout %ld\n", timeo); + sk_wait_data(sk, &timeo, NULL); + } + +@@ -2242,7 +2242,7 @@ out_err: + } + } + +- pr_debug("msk=%p rx queue empty=%d:%d copied=%d", ++ pr_debug("msk=%p rx queue empty=%d:%d copied=%d\n", + msk, skb_queue_empty_lockless(&sk->sk_receive_queue), + skb_queue_empty(&msk->receive_queue), copied); + if (!(flags & MSG_PEEK)) +@@ -2697,7 +2697,7 @@ static void mptcp_mp_fail_no_response(st + if (!ssk) + return; + +- pr_debug("MP_FAIL doesn't respond, reset the subflow"); ++ pr_debug("MP_FAIL doesn't respond, reset the subflow\n"); + + slow = lock_sock_fast(ssk); + mptcp_subflow_reset(ssk); +@@ -2869,7 +2869,7 @@ void mptcp_subflow_shutdown(struct sock + break; + default: + if (__mptcp_check_fallback(mptcp_sk(sk))) { +- pr_debug("Fallback"); ++ pr_debug("Fallback\n"); + ssk->sk_shutdown |= how; + tcp_shutdown(ssk, how); + +@@ -2879,7 +2879,7 @@ void mptcp_subflow_shutdown(struct sock + WRITE_ONCE(mptcp_sk(sk)->snd_una, mptcp_sk(sk)->snd_nxt); + mptcp_schedule_work(sk); + } else { +- pr_debug("Sending DATA_FIN on subflow %p", ssk); ++ pr_debug("Sending DATA_FIN on subflow %p\n", ssk); + tcp_send_ack(ssk); + if (!mptcp_rtx_timer_pending(sk)) + mptcp_reset_rtx_timer(sk); +@@ -2922,7 +2922,7 @@ static void mptcp_check_send_data_fin(st + struct mptcp_subflow_context *subflow; + struct mptcp_sock *msk = mptcp_sk(sk); + +- pr_debug("msk=%p snd_data_fin_enable=%d pending=%d snd_nxt=%llu write_seq=%llu", ++ pr_debug("msk=%p snd_data_fin_enable=%d pending=%d snd_nxt=%llu write_seq=%llu\n", + msk, msk->snd_data_fin_enable, !!mptcp_send_head(sk), + msk->snd_nxt, msk->write_seq); + +@@ -2946,7 +2946,7 @@ static void __mptcp_wr_shutdown(struct s + { + struct mptcp_sock *msk = mptcp_sk(sk); + +- pr_debug("msk=%p snd_data_fin_enable=%d shutdown=%x state=%d pending=%d", ++ pr_debug("msk=%p snd_data_fin_enable=%d shutdown=%x state=%d pending=%d\n", + msk, msk->snd_data_fin_enable, sk->sk_shutdown, sk->sk_state, + !!mptcp_send_head(sk)); + +@@ -2961,7 +2961,7 @@ static void __mptcp_destroy_sock(struct + { + struct mptcp_sock *msk = mptcp_sk(sk); + +- pr_debug("msk=%p", msk); ++ pr_debug("msk=%p\n", msk); + + might_sleep(); + +@@ -3073,7 +3073,7 @@ cleanup: + inet_sk_state_store(sk, TCP_CLOSE); + + sock_hold(sk); +- pr_debug("msk=%p state=%d", sk, sk->sk_state); ++ pr_debug("msk=%p state=%d\n", sk, sk->sk_state); + if (mptcp_sk(sk)->token) + mptcp_event(MPTCP_EVENT_CLOSED, msk, NULL, GFP_KERNEL); + +@@ -3331,12 +3331,12 @@ static struct sock *mptcp_accept(struct + return NULL; + } + +- pr_debug("msk=%p, listener=%p", msk, mptcp_subflow_ctx(listener->sk)); ++ pr_debug("msk=%p, listener=%p\n", msk, mptcp_subflow_ctx(listener->sk)); + newsk = inet_csk_accept(listener->sk, flags, err, kern); + if (!newsk) + return NULL; + +- pr_debug("msk=%p, subflow is mptcp=%d", msk, sk_is_mptcp(newsk)); ++ pr_debug("msk=%p, subflow is mptcp=%d\n", msk, sk_is_mptcp(newsk)); + if (sk_is_mptcp(newsk)) { + struct mptcp_subflow_context *subflow; + struct sock *new_mptcp_sock; +@@ -3550,7 +3550,7 @@ static int mptcp_get_port(struct sock *s + struct socket *ssock; + + ssock = msk->subflow; +- pr_debug("msk=%p, subflow=%p", msk, ssock); ++ pr_debug("msk=%p, subflow=%p\n", msk, ssock); + if (WARN_ON_ONCE(!ssock)) + return -EINVAL; + +@@ -3568,7 +3568,7 @@ void mptcp_finish_connect(struct sock *s + sk = subflow->conn; + msk = mptcp_sk(sk); + +- pr_debug("msk=%p, token=%u", sk, subflow->token); ++ pr_debug("msk=%p, token=%u\n", sk, subflow->token); + + mptcp_crypto_key_sha(subflow->remote_key, NULL, &ack_seq); + ack_seq++; +@@ -3608,7 +3608,7 @@ bool mptcp_finish_join(struct sock *ssk) + struct sock *parent = (void *)msk; + bool ret = true; + +- pr_debug("msk=%p, subflow=%p", msk, subflow); ++ pr_debug("msk=%p, subflow=%p\n", msk, subflow); + + /* mptcp socket already closing? */ + if (!mptcp_is_fully_established(parent)) { +@@ -3653,7 +3653,7 @@ err_prohibited: + + static void mptcp_shutdown(struct sock *sk, int how) + { +- pr_debug("sk=%p, how=%d", sk, how); ++ pr_debug("sk=%p, how=%d\n", sk, how); + + if ((how & SEND_SHUTDOWN) && mptcp_close_state(sk)) + __mptcp_wr_shutdown(sk); +@@ -3854,7 +3854,7 @@ static int mptcp_listen(struct socket *s + struct socket *ssock; + int err; + +- pr_debug("msk=%p", msk); ++ pr_debug("msk=%p\n", msk); + + lock_sock(sk); + +@@ -3889,7 +3889,7 @@ static int mptcp_stream_accept(struct so + struct socket *ssock; + int err; + +- pr_debug("msk=%p", msk); ++ pr_debug("msk=%p\n", msk); + + /* Buggy applications can call accept on socket states other then LISTEN + * but no need to allocate the first subflow just to error out. +@@ -3963,7 +3963,7 @@ static __poll_t mptcp_poll(struct file * + sock_poll_wait(file, sock, wait); + + state = inet_sk_state_load(sk); +- pr_debug("msk=%p state=%d flags=%lx", msk, state, msk->flags); ++ pr_debug("msk=%p state=%d flags=%lx\n", msk, state, msk->flags); + if (state == TCP_LISTEN) { + struct socket *ssock = READ_ONCE(msk->subflow); + +--- a/net/mptcp/protocol.h ++++ b/net/mptcp/protocol.h +@@ -973,7 +973,7 @@ static inline bool mptcp_check_fallback( + static inline void __mptcp_do_fallback(struct mptcp_sock *msk) + { + if (test_bit(MPTCP_FALLBACK_DONE, &msk->flags)) { +- pr_debug("TCP fallback already done (msk=%p)", msk); ++ pr_debug("TCP fallback already done (msk=%p)\n", msk); + return; + } + set_bit(MPTCP_FALLBACK_DONE, &msk->flags); +@@ -1000,7 +1000,7 @@ static inline void mptcp_do_fallback(str + } + } + +-#define pr_fallback(a) pr_debug("%s:fallback to TCP (msk=%p)", __func__, a) ++#define pr_fallback(a) pr_debug("%s:fallback to TCP (msk=%p)\n", __func__, a) + + static inline bool mptcp_check_infinite_map(struct sk_buff *skb) + { +--- a/net/mptcp/sockopt.c ++++ b/net/mptcp/sockopt.c +@@ -881,7 +881,7 @@ int mptcp_setsockopt(struct sock *sk, in + struct mptcp_sock *msk = mptcp_sk(sk); + struct sock *ssk; + +- pr_debug("msk=%p", msk); ++ pr_debug("msk=%p\n", msk); + + if (level == SOL_SOCKET) + return mptcp_setsockopt_sol_socket(msk, optname, optval, optlen); +@@ -1292,7 +1292,7 @@ int mptcp_getsockopt(struct sock *sk, in + struct mptcp_sock *msk = mptcp_sk(sk); + struct sock *ssk; + +- pr_debug("msk=%p", msk); ++ pr_debug("msk=%p\n", msk); + + /* @@ the meaning of setsockopt() when the socket is connected and + * there are multiple subflows is not yet defined. It is up to the +--- a/net/mptcp/subflow.c ++++ b/net/mptcp/subflow.c +@@ -39,7 +39,7 @@ static void subflow_req_destructor(struc + { + struct mptcp_subflow_request_sock *subflow_req = mptcp_subflow_rsk(req); + +- pr_debug("subflow_req=%p", subflow_req); ++ pr_debug("subflow_req=%p\n", subflow_req); + + if (subflow_req->msk) + sock_put((struct sock *)subflow_req->msk); +@@ -145,7 +145,7 @@ static int subflow_check_req(struct requ + struct mptcp_options_received mp_opt; + bool opt_mp_capable, opt_mp_join; + +- pr_debug("subflow_req=%p, listener=%p", subflow_req, listener); ++ pr_debug("subflow_req=%p, listener=%p\n", subflow_req, listener); + + #ifdef CONFIG_TCP_MD5SIG + /* no MPTCP if MD5SIG is enabled on this socket or we may run out of +@@ -218,7 +218,7 @@ again: + } + + if (subflow_use_different_sport(subflow_req->msk, sk_listener)) { +- pr_debug("syn inet_sport=%d %d", ++ pr_debug("syn inet_sport=%d %d\n", + ntohs(inet_sk(sk_listener)->inet_sport), + ntohs(inet_sk((struct sock *)subflow_req->msk)->inet_sport)); + if (!mptcp_pm_sport_in_anno_list(subflow_req->msk, sk_listener)) { +@@ -237,7 +237,7 @@ again: + return -EPERM; + } + +- pr_debug("token=%u, remote_nonce=%u msk=%p", subflow_req->token, ++ pr_debug("token=%u, remote_nonce=%u msk=%p\n", subflow_req->token, + subflow_req->remote_nonce, subflow_req->msk); + } + +@@ -415,7 +415,7 @@ static void subflow_finish_connect(struc + subflow->rel_write_seq = 1; + subflow->conn_finished = 1; + subflow->ssn_offset = TCP_SKB_CB(skb)->seq; +- pr_debug("subflow=%p synack seq=%x", subflow, subflow->ssn_offset); ++ pr_debug("subflow=%p synack seq=%x\n", subflow, subflow->ssn_offset); + + mptcp_get_options(skb, &mp_opt); + if (subflow->request_mptcp) { +@@ -434,7 +434,7 @@ static void subflow_finish_connect(struc + subflow->mp_capable = 1; + subflow->can_ack = 1; + subflow->remote_key = mp_opt.sndr_key; +- pr_debug("subflow=%p, remote_key=%llu", subflow, ++ pr_debug("subflow=%p, remote_key=%llu\n", subflow, + subflow->remote_key); + MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPCAPABLEACTIVEACK); + mptcp_finish_connect(sk); +@@ -451,7 +451,7 @@ static void subflow_finish_connect(struc + subflow->thmac = mp_opt.thmac; + subflow->remote_nonce = mp_opt.nonce; + WRITE_ONCE(subflow->remote_id, mp_opt.join_id); +- pr_debug("subflow=%p, thmac=%llu, remote_nonce=%u backup=%d", ++ pr_debug("subflow=%p, thmac=%llu, remote_nonce=%u backup=%d\n", + subflow, subflow->thmac, subflow->remote_nonce, + subflow->backup); + +@@ -477,7 +477,7 @@ static void subflow_finish_connect(struc + MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINSYNACKBACKUPRX); + + if (subflow_use_different_dport(mptcp_sk(parent), sk)) { +- pr_debug("synack inet_dport=%d %d", ++ pr_debug("synack inet_dport=%d %d\n", + ntohs(inet_sk(sk)->inet_dport), + ntohs(inet_sk(parent)->inet_dport)); + MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINPORTSYNACKRX); +@@ -548,7 +548,7 @@ static int subflow_v4_conn_request(struc + { + struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + +- pr_debug("subflow=%p", subflow); ++ pr_debug("subflow=%p\n", subflow); + + /* Never answer to SYNs sent to broadcast or multicast */ + if (skb_rtable(skb)->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) +@@ -579,7 +579,7 @@ static int subflow_v6_conn_request(struc + { + struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + +- pr_debug("subflow=%p", subflow); ++ pr_debug("subflow=%p\n", subflow); + + if (skb->protocol == htons(ETH_P_IP)) + return subflow_v4_conn_request(sk, skb); +@@ -697,7 +697,7 @@ static struct sock *subflow_syn_recv_soc + struct mptcp_sock *owner; + struct sock *child; + +- pr_debug("listener=%p, req=%p, conn=%p", listener, req, listener->conn); ++ pr_debug("listener=%p, req=%p, conn=%p\n", listener, req, listener->conn); + + /* After child creation we must look for MPC even when options + * are not parsed +@@ -788,7 +788,7 @@ create_child: + ctx->conn = (struct sock *)owner; + + if (subflow_use_different_sport(owner, sk)) { +- pr_debug("ack inet_sport=%d %d", ++ pr_debug("ack inet_sport=%d %d\n", + ntohs(inet_sk(sk)->inet_sport), + ntohs(inet_sk((struct sock *)owner)->inet_sport)); + if (!mptcp_pm_sport_in_anno_list(owner, sk)) { +@@ -845,7 +845,7 @@ enum mapping_status { + + static void dbg_bad_map(struct mptcp_subflow_context *subflow, u32 ssn) + { +- pr_debug("Bad mapping: ssn=%d map_seq=%d map_data_len=%d", ++ pr_debug("Bad mapping: ssn=%d map_seq=%d map_data_len=%d\n", + ssn, subflow->map_subflow_seq, subflow->map_data_len); + } + +@@ -1005,7 +1005,7 @@ static enum mapping_status get_mapping_s + + data_len = mpext->data_len; + if (data_len == 0) { +- pr_debug("infinite mapping received"); ++ pr_debug("infinite mapping received\n"); + MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_INFINITEMAPRX); + subflow->map_data_len = 0; + return MAPPING_INVALID; +@@ -1015,7 +1015,7 @@ static enum mapping_status get_mapping_s + if (data_len == 1) { + bool updated = mptcp_update_rcv_data_fin(msk, mpext->data_seq, + mpext->dsn64); +- pr_debug("DATA_FIN with no payload seq=%llu", mpext->data_seq); ++ pr_debug("DATA_FIN with no payload seq=%llu\n", mpext->data_seq); + if (subflow->map_valid) { + /* A DATA_FIN might arrive in a DSS + * option before the previous mapping +@@ -1040,7 +1040,7 @@ static enum mapping_status get_mapping_s + data_fin_seq &= GENMASK_ULL(31, 0); + + mptcp_update_rcv_data_fin(msk, data_fin_seq, mpext->dsn64); +- pr_debug("DATA_FIN with mapping seq=%llu dsn64=%d", ++ pr_debug("DATA_FIN with mapping seq=%llu dsn64=%d\n", + data_fin_seq, mpext->dsn64); + } + +@@ -1087,7 +1087,7 @@ static enum mapping_status get_mapping_s + if (unlikely(subflow->map_csum_reqd != csum_reqd)) + return MAPPING_INVALID; + +- pr_debug("new map seq=%llu subflow_seq=%u data_len=%u csum=%d:%u", ++ pr_debug("new map seq=%llu subflow_seq=%u data_len=%u csum=%d:%u\n", + subflow->map_seq, subflow->map_subflow_seq, + subflow->map_data_len, subflow->map_csum_reqd, + subflow->map_data_csum); +@@ -1122,7 +1122,7 @@ static void mptcp_subflow_discard_data(s + avail_len = skb->len - offset; + incr = limit >= avail_len ? avail_len + fin : limit; + +- pr_debug("discarding=%d len=%d offset=%d seq=%d", incr, skb->len, ++ pr_debug("discarding=%d len=%d offset=%d seq=%d\n", incr, skb->len, + offset, subflow->map_subflow_seq); + MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DUPDATA); + tcp_sk(ssk)->copied_seq += incr; +@@ -1231,7 +1231,7 @@ static bool subflow_check_data_avail(str + + old_ack = READ_ONCE(msk->ack_seq); + ack_seq = mptcp_subflow_get_mapped_dsn(subflow); +- pr_debug("msk ack_seq=%llx subflow ack_seq=%llx", old_ack, ++ pr_debug("msk ack_seq=%llx subflow ack_seq=%llx\n", old_ack, + ack_seq); + if (unlikely(before64(ack_seq, old_ack))) { + mptcp_subflow_discard_data(ssk, skb, old_ack - ack_seq); +@@ -1303,7 +1303,7 @@ bool mptcp_subflow_data_available(struct + subflow->map_valid = 0; + WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA); + +- pr_debug("Done with mapping: seq=%u data_len=%u", ++ pr_debug("Done with mapping: seq=%u data_len=%u\n", + subflow->map_subflow_seq, + subflow->map_data_len); + } +@@ -1403,7 +1403,7 @@ void mptcpv6_handle_mapped(struct sock * + + target = mapped ? &subflow_v6m_specific : subflow_default_af_ops(sk); + +- pr_debug("subflow=%p family=%d ops=%p target=%p mapped=%d", ++ pr_debug("subflow=%p family=%d ops=%p target=%p mapped=%d\n", + subflow, sk->sk_family, icsk->icsk_af_ops, target, mapped); + + if (likely(icsk->icsk_af_ops == target)) +@@ -1497,7 +1497,7 @@ int __mptcp_subflow_connect(struct sock + goto failed; + + mptcp_crypto_key_sha(subflow->remote_key, &remote_token, NULL); +- pr_debug("msk=%p remote_token=%u local_id=%d remote_id=%d", msk, ++ pr_debug("msk=%p remote_token=%u local_id=%d remote_id=%d\n", msk, + remote_token, local_id, remote_id); + subflow->remote_token = remote_token; + WRITE_ONCE(subflow->remote_id, remote_id); +@@ -1626,7 +1626,7 @@ int mptcp_subflow_create_socket(struct s + SOCK_INODE(sf)->i_gid = SOCK_INODE(sk->sk_socket)->i_gid; + + subflow = mptcp_subflow_ctx(sf->sk); +- pr_debug("subflow=%p", subflow); ++ pr_debug("subflow=%p\n", subflow); + + *new_sock = sf; + sock_hold(sk); +@@ -1650,7 +1650,7 @@ static struct mptcp_subflow_context *sub + INIT_LIST_HEAD(&ctx->node); + INIT_LIST_HEAD(&ctx->delegated_node); + +- pr_debug("subflow=%p", ctx); ++ pr_debug("subflow=%p\n", ctx); + + ctx->tcp_sock = sk; + WRITE_ONCE(ctx->local_id, -1); +@@ -1803,7 +1803,7 @@ static int subflow_ulp_init(struct sock + goto out; + } + +- pr_debug("subflow=%p, family=%d", ctx, sk->sk_family); ++ pr_debug("subflow=%p, family=%d\n", ctx, sk->sk_family); + + tp->is_mptcp = 1; + ctx->icsk_af_ops = icsk->icsk_af_ops; diff --git a/queue-6.1/selftests-mptcp-add-explicit-test-case-for-remove-readd.patch b/queue-6.1/selftests-mptcp-add-explicit-test-case-for-remove-readd.patch new file mode 100644 index 00000000000..2403e0642aa --- /dev/null +++ b/queue-6.1/selftests-mptcp-add-explicit-test-case-for-remove-readd.patch @@ -0,0 +1,67 @@ +From stable+bounces-73009-greg=kroah.com@vger.kernel.org Wed Sep 4 13:06:37 2024 +From: "Matthieu Baerts (NGI0)" +Date: Wed, 4 Sep 2024 13:06:12 +0200 +Subject: selftests: mptcp: add explicit test case for remove/readd +To: stable@vger.kernel.org, gregkh@linuxfoundation.org +Cc: MPTCP Upstream , Paolo Abeni , Matthieu Baerts , "David S . Miller" +Message-ID: <20240904110611.4086328-3-matttbe@kernel.org> + +From: "Matthieu Baerts (NGI0)" + +From: Paolo Abeni + +commit b5e2fb832f48bc01d937a053e0550a1465a2f05d upstream. + +Delete and re-create a signal endpoint and ensure that the PM +actually deletes and re-create the subflow. + +Signed-off-by: Paolo Abeni +Reviewed-by: Matthieu Baerts (NGI0) +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: David S. Miller +Stable-dep-of: e06959e9eebd ("selftests: mptcp: join: test for flush/re-add endpoints") +[ No conflicts, but adapt the test to the helpers in this version: + - run_tests has been modified a few times to reduce the number of + positional parameters + - no pm_nl_check_endpoint helper + - no chk_mptcp_info helper + - chk_subflow_nr taking an extra parameter + - kill_tests_wait instead of mptcp_lib_kill_wait ] +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Greg Kroah-Hartman +--- + tools/testing/selftests/net/mptcp/mptcp_join.sh | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh ++++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh +@@ -3239,6 +3239,29 @@ userspace_tests() + chk_join_nr 1 1 1 + chk_rm_nr 1 1 + fi ++ ++ # remove and re-add ++ if reset "delete re-add signal" && ++ mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then ++ pm_nl_set_limits $ns1 1 1 ++ pm_nl_set_limits $ns2 1 1 ++ pm_nl_add_endpoint $ns1 10.0.2.1 id 1 flags signal ++ run_tests $ns1 $ns2 10.0.1.1 4 0 0 speed_20 2>/dev/null & ++ local tests_pid=$! ++ ++ wait_mpj $ns2 ++ chk_subflow_nr needtitle "before delete" 2 ++ ++ pm_nl_del_endpoint $ns1 1 10.0.2.1 ++ sleep 0.5 ++ chk_subflow_nr "" "after delete" 1 ++ ++ pm_nl_add_endpoint $ns1 10.0.2.1 flags signal ++ wait_mpj $ns2 ++ chk_subflow_nr "" "after re-add" 2 ++ kill_tests_wait ++ fi ++ + } + + endpoint_tests() diff --git a/queue-6.1/selftests-mptcp-join-check-re-adding-init-endp-with-id.patch b/queue-6.1/selftests-mptcp-join-check-re-adding-init-endp-with-id.patch new file mode 100644 index 00000000000..d3b28b9f32e --- /dev/null +++ b/queue-6.1/selftests-mptcp-join-check-re-adding-init-endp-with-id.patch @@ -0,0 +1,90 @@ +From stable+bounces-73012-greg=kroah.com@vger.kernel.org Wed Sep 4 13:09:09 2024 +From: "Matthieu Baerts (NGI0)" +Date: Wed, 4 Sep 2024 13:08:31 +0200 +Subject: selftests: mptcp: join: check re-adding init endp with != id +To: stable@vger.kernel.org, gregkh@linuxfoundation.org +Cc: MPTCP Upstream , "Matthieu Baerts (NGI0)" , Mat Martineau , Paolo Abeni +Message-ID: <20240904110830.4089238-2-matttbe@kernel.org> + +From: "Matthieu Baerts (NGI0)" + +commit 1c2326fcae4f0c5de8ad0d734ced43a8e5f17dac upstream. + +The initial subflow has a special local ID: 0. It is specific per +connection. + +When a global endpoint is deleted and re-added later, it can have a +different ID, but the kernel should still use the ID 0 if it corresponds +to the initial address. + +This test validates this behaviour: the endpoint linked to the initial +subflow is removed, and re-added with a different ID. + +Note that removing the initial subflow will not decrement the 'subflows' +counters, which corresponds to the *additional* subflows. On the other +hand, when the same endpoint is re-added, it will increment this +counter, as it will be seen as an additional subflow this time. + +The 'Fixes' tag here below is the same as the one from the previous +commit: this patch here is not fixing anything wrong in the selftests, +but it validates the previous fix for an issue introduced by this commit +ID. + +Fixes: 3ad14f54bd74 ("mptcp: more accurate MPC endpoint tracking") +Cc: stable@vger.kernel.org +Reviewed-by: Mat Martineau +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Paolo Abeni +[ Conflicts in mptcp_join.sh, because the helpers are different in this + version: + - run_tests has been modified a few times to reduce the number of + positional parameters + - no chk_mptcp_info helper + - chk_subflow_nr taking an extra parameter + - kill_tests_wait instead of mptcp_lib_kill_wait ] +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Greg Kroah-Hartman +--- + tools/testing/selftests/net/mptcp/mptcp_join.sh | 19 ++++++++++++++----- + 1 file changed, 14 insertions(+), 5 deletions(-) + +--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh ++++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh +@@ -3243,11 +3243,12 @@ userspace_tests() + # remove and re-add + if reset "delete re-add signal" && + mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then +- pm_nl_set_limits $ns1 0 2 +- pm_nl_set_limits $ns2 2 2 ++ pm_nl_set_limits $ns1 0 3 ++ pm_nl_set_limits $ns2 3 3 + pm_nl_add_endpoint $ns1 10.0.2.1 id 1 flags signal + # broadcast IP: no packet for this address will be received on ns1 + pm_nl_add_endpoint $ns1 224.0.0.1 id 2 flags signal ++ pm_nl_add_endpoint $ns1 10.0.1.1 id 42 flags signal + run_tests $ns1 $ns2 10.0.1.1 4 0 0 speed_20 2>/dev/null & + local tests_pid=$! + +@@ -3263,11 +3264,19 @@ userspace_tests() + pm_nl_add_endpoint $ns1 10.0.3.1 id 2 flags signal + wait_mpj $ns2 + chk_subflow_nr "" "after re-add" 3 ++ ++ pm_nl_del_endpoint $ns1 42 10.0.1.1 ++ sleep 0.5 ++ chk_subflow_nr "" "after delete ID 0" 2 ++ ++ pm_nl_add_endpoint $ns1 10.0.1.1 id 99 flags signal ++ wait_mpj $ns2 ++ chk_subflow_nr "" "after re-add" 3 + kill_tests_wait + +- chk_join_nr 3 3 3 +- chk_add_nr 4 4 +- chk_rm_nr 2 1 invert ++ chk_join_nr 4 4 4 ++ chk_add_nr 5 5 ++ chk_rm_nr 3 2 invert + fi + + } diff --git a/queue-6.1/selftests-mptcp-join-check-re-using-id-of-closed-subflow.patch b/queue-6.1/selftests-mptcp-join-check-re-using-id-of-closed-subflow.patch new file mode 100644 index 00000000000..9d316827e85 --- /dev/null +++ b/queue-6.1/selftests-mptcp-join-check-re-using-id-of-closed-subflow.patch @@ -0,0 +1,104 @@ +From matttbe@kernel.org Wed Sep 4 13:05:24 2024 +From: "Matthieu Baerts (NGI0)" +Date: Wed, 4 Sep 2024 13:05:11 +0200 +Subject: selftests: mptcp: join: check re-using ID of closed subflow +To: stable@vger.kernel.org, gregkh@linuxfoundation.org +Cc: MPTCP Upstream , "Matthieu Baerts (NGI0)" , Mat Martineau , Jakub Kicinski +Message-ID: <20240904110510.4085066-2-matttbe@kernel.org> + +From: "Matthieu Baerts (NGI0)" + +commit 65fb58afa341ad68e71e5c4d816b407e6a683a66 upstream. + +This test extends "delete and re-add" to validate the previous commit. A +new 'subflow' endpoint is added, but the subflow request will be +rejected. The result is that no subflow will be established from this +address. + +Later, the endpoint is removed and re-added after having cleared the +firewall rule. Before the previous commit, the client would not have +been able to create this new subflow. + +While at it, extra checks have been added to validate the expected +numbers of MPJ and RM_ADDR. + +The 'Fixes' tag here below is the same as the one from the previous +commit: this patch here is not fixing anything wrong in the selftests, +but it validates the previous fix for an issue introduced by this commit +ID. + +Fixes: b6c08380860b ("mptcp: remove addr and subflow in PM netlink") +Cc: stable@vger.kernel.org +Reviewed-by: Mat Martineau +Signed-off-by: Matthieu Baerts (NGI0) +Link: https://patch.msgid.link/20240819-net-mptcp-pm-reusing-id-v1-4-38035d40de5b@kernel.org +Signed-off-by: Jakub Kicinski +[ Conflicts in mptcp_join.sh, because this subtest has been modified in + newer versions, e.g. commit 9095ce97bf8a ("selftests: mptcp: add + mptcp_info tests") added chk_mptcp_info check, commit 03668c65d153 + ("selftests: mptcp: join: rework detailed report") changed the way + the info are displayed, commit 04b57c9e096a ("selftests: mptcp: join: + stop transfer when check is done (part 2)") uses the new + mptcp_lib_kill_wait helper instead of kill_tests_wait. + Conflicts have been resolved by not using the new helpers, the rest + was the same. ] +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Greg Kroah-Hartman +--- + tools/testing/selftests/net/mptcp/mptcp_join.sh | 25 +++++++++++++++++++----- + 1 file changed, 20 insertions(+), 5 deletions(-) + +--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh ++++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh +@@ -402,9 +402,10 @@ reset_with_tcp_filter() + local ns="${!1}" + local src="${2}" + local target="${3}" ++ local chain="${4:-INPUT}" + + if ! ip netns exec "${ns}" ${iptables} \ +- -A INPUT \ ++ -A "${chain}" \ + -s "${src}" \ + -p tcp \ + -j "${target}"; then +@@ -3265,10 +3266,10 @@ endpoint_tests() + kill_tests_wait + fi + +- if reset "delete and re-add" && ++ if reset_with_tcp_filter "delete and re-add" ns2 10.0.3.2 REJECT OUTPUT && + mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then +- pm_nl_set_limits $ns1 1 1 +- pm_nl_set_limits $ns2 1 1 ++ pm_nl_set_limits $ns1 0 2 ++ pm_nl_set_limits $ns2 0 2 + pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow + run_tests $ns1 $ns2 10.0.1.1 4 0 0 speed_20 2>/dev/null & + +@@ -3277,10 +3278,24 @@ endpoint_tests() + sleep 0.5 + chk_subflow_nr needtitle "after delete" 1 + +- pm_nl_add_endpoint $ns2 10.0.2.2 dev ns2eth2 flags subflow ++ pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow + wait_mpj $ns2 + chk_subflow_nr "" "after re-add" 2 ++ ++ pm_nl_add_endpoint $ns2 10.0.3.2 id 3 flags subflow ++ wait_attempt_fail $ns2 ++ chk_subflow_nr "" "after new reject" 2 ++ ++ ip netns exec "${ns2}" ${iptables} -D OUTPUT -s "10.0.3.2" -p tcp -j REJECT ++ pm_nl_del_endpoint $ns2 3 10.0.3.2 ++ pm_nl_add_endpoint $ns2 10.0.3.2 id 3 flags subflow ++ wait_mpj $ns2 ++ chk_subflow_nr "" "after no reject" 3 ++ + kill_tests_wait ++ ++ chk_join_nr 3 3 3 ++ chk_rm_nr 1 1 + fi + + # remove and re-add diff --git a/queue-6.1/selftests-mptcp-join-check-re-using-id-of-unused-add_addr.patch b/queue-6.1/selftests-mptcp-join-check-re-using-id-of-unused-add_addr.patch new file mode 100644 index 00000000000..6d0c9fdfbb4 --- /dev/null +++ b/queue-6.1/selftests-mptcp-join-check-re-using-id-of-unused-add_addr.patch @@ -0,0 +1,87 @@ +From stable+bounces-73011-greg=kroah.com@vger.kernel.org Wed Sep 4 13:07:31 2024 +From: "Matthieu Baerts (NGI0)" +Date: Wed, 4 Sep 2024 13:07:06 +0200 +Subject: selftests: mptcp: join: check re-using ID of unused ADD_ADDR +To: stable@vger.kernel.org, gregkh@linuxfoundation.org +Cc: MPTCP Upstream , "Matthieu Baerts (NGI0)" , Mat Martineau , Jakub Kicinski +Message-ID: <20240904110705.4087459-2-matttbe@kernel.org> + +From: "Matthieu Baerts (NGI0)" + +commit a13d5aad4dd9a309eecdc33cfd75045bd5f376a3 upstream. + +This test extends "delete re-add signal" to validate the previous +commit. An extra address is announced by the server, but this address +cannot be used by the client. The result is that no subflow will be +established to this address. + +Later, the server will delete this extra endpoint, and set a new one, +with a valid address, but re-using the same ID. Before the previous +commit, the server would not have been able to announce this new +address. + +While at it, extra checks have been added to validate the expected +numbers of MPJ, ADD_ADDR and RM_ADDR. + +The 'Fixes' tag here below is the same as the one from the previous +commit: this patch here is not fixing anything wrong in the selftests, +but it validates the previous fix for an issue introduced by this commit +ID. + +Fixes: b6c08380860b ("mptcp: remove addr and subflow in PM netlink") +Cc: stable@vger.kernel.org +Reviewed-by: Mat Martineau +Signed-off-by: Matthieu Baerts (NGI0) +Link: https://patch.msgid.link/20240819-net-mptcp-pm-reusing-id-v1-2-38035d40de5b@kernel.org +Signed-off-by: Jakub Kicinski +[ Conflicts in mptcp_join.sh, because the helpers are different in this + version: + - run_tests has been modified a few times to reduce the number of + positional parameters + - no chk_mptcp_info helper + - chk_subflow_nr taking an extra parameter + - kill_tests_wait instead of mptcp_lib_kill_wait ] +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Greg Kroah-Hartman +--- + tools/testing/selftests/net/mptcp/mptcp_join.sh | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh ++++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh +@@ -3243,9 +3243,11 @@ userspace_tests() + # remove and re-add + if reset "delete re-add signal" && + mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then +- pm_nl_set_limits $ns1 1 1 +- pm_nl_set_limits $ns2 1 1 ++ pm_nl_set_limits $ns1 0 2 ++ pm_nl_set_limits $ns2 2 2 + pm_nl_add_endpoint $ns1 10.0.2.1 id 1 flags signal ++ # broadcast IP: no packet for this address will be received on ns1 ++ pm_nl_add_endpoint $ns1 224.0.0.1 id 2 flags signal + run_tests $ns1 $ns2 10.0.1.1 4 0 0 speed_20 2>/dev/null & + local tests_pid=$! + +@@ -3253,13 +3255,19 @@ userspace_tests() + chk_subflow_nr needtitle "before delete" 2 + + pm_nl_del_endpoint $ns1 1 10.0.2.1 ++ pm_nl_del_endpoint $ns1 2 224.0.0.1 + sleep 0.5 + chk_subflow_nr "" "after delete" 1 + +- pm_nl_add_endpoint $ns1 10.0.2.1 flags signal ++ pm_nl_add_endpoint $ns1 10.0.2.1 id 1 flags signal ++ pm_nl_add_endpoint $ns1 10.0.3.1 id 2 flags signal + wait_mpj $ns2 +- chk_subflow_nr "" "after re-add" 2 ++ chk_subflow_nr "" "after re-add" 3 + kill_tests_wait ++ ++ chk_join_nr 3 3 3 ++ chk_add_nr 4 4 ++ chk_rm_nr 2 1 invert + fi + + } diff --git a/queue-6.1/selftests-mptcp-join-test-for-flush-re-add-endpoints.patch b/queue-6.1/selftests-mptcp-join-test-for-flush-re-add-endpoints.patch new file mode 100644 index 00000000000..579e3f59331 --- /dev/null +++ b/queue-6.1/selftests-mptcp-join-test-for-flush-re-add-endpoints.patch @@ -0,0 +1,80 @@ +From stable+bounces-73010-greg=kroah.com@vger.kernel.org Wed Sep 4 13:06:39 2024 +From: "Matthieu Baerts (NGI0)" +Date: Wed, 4 Sep 2024 13:06:13 +0200 +Subject: selftests: mptcp: join: test for flush/re-add endpoints +To: stable@vger.kernel.org, gregkh@linuxfoundation.org +Cc: MPTCP Upstream , "Matthieu Baerts (NGI0)" , Mat Martineau , Jakub Kicinski +Message-ID: <20240904110611.4086328-4-matttbe@kernel.org> + +From: "Matthieu Baerts (NGI0)" + +commit e06959e9eebdfea4654390f53b65cff57691872e upstream. + +After having flushed endpoints that didn't cause the creation of new +subflows, it is important to check endpoints can be re-created, re-using +previously used IDs. + +Before the previous commit, the client would not have been able to +re-create the subflow that was previously rejected. + +The 'Fixes' tag here below is the same as the one from the previous +commit: this patch here is not fixing anything wrong in the selftests, +but it validates the previous fix for an issue introduced by this commit +ID. + +Fixes: 06faa2271034 ("mptcp: remove multi addresses and subflows in PM") +Cc: stable@vger.kernel.org +Reviewed-by: Mat Martineau +Signed-off-by: Matthieu Baerts (NGI0) +Link: https://patch.msgid.link/20240819-net-mptcp-pm-reusing-id-v1-6-38035d40de5b@kernel.org +Signed-off-by: Jakub Kicinski +[ No conflicts, but adapt the test to the helpers in this version: + - run_tests has been modified a few times to reduce the number of + positional parameters + - no chk_mptcp_info helper + - chk_subflow_nr taking an extra parameter + - kill_tests_wait instead of mptcp_lib_kill_wait ] +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Greg Kroah-Hartman +--- + tools/testing/selftests/net/mptcp/mptcp_join.sh | 29 ++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh ++++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh +@@ -3368,6 +3368,35 @@ endpoint_tests() + chk_rm_nr 3 2 invert + fi + ++ # flush and re-add ++ if reset_with_tcp_filter "flush re-add" ns2 10.0.3.2 REJECT OUTPUT && ++ mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then ++ pm_nl_set_limits $ns1 0 2 ++ pm_nl_set_limits $ns2 1 2 ++ # broadcast IP: no packet for this address will be received on ns1 ++ pm_nl_add_endpoint $ns1 224.0.0.1 id 2 flags signal ++ pm_nl_add_endpoint $ns2 10.0.3.2 id 3 flags subflow ++ run_tests $ns1 $ns2 10.0.1.1 4 0 0 speed_20 2>/dev/null & ++ local tests_pid=$! ++ ++ wait_attempt_fail $ns2 ++ chk_subflow_nr needtitle "before flush" 1 ++ ++ pm_nl_flush_endpoint $ns2 ++ pm_nl_flush_endpoint $ns1 ++ wait_rm_addr $ns2 0 ++ ip netns exec "${ns2}" ${iptables} -D OUTPUT -s "10.0.3.2" -p tcp -j REJECT ++ pm_nl_add_endpoint $ns2 10.0.3.2 id 3 flags subflow ++ wait_mpj $ns2 ++ pm_nl_add_endpoint $ns1 10.0.3.1 id 2 flags signal ++ wait_mpj $ns2 ++ kill_wait "${tests_pid}" ++ kill_tests_wait ++ ++ chk_join_nr 2 2 2 ++ chk_add_nr 2 2 ++ chk_rm_nr 1 0 invert ++ fi + } + + # [$1: error message] diff --git a/queue-6.1/selftests-mptcp-join-validate-fullmesh-endp-on-1st-sf.patch b/queue-6.1/selftests-mptcp-join-validate-fullmesh-endp-on-1st-sf.patch new file mode 100644 index 00000000000..66f598c0861 --- /dev/null +++ b/queue-6.1/selftests-mptcp-join-validate-fullmesh-endp-on-1st-sf.patch @@ -0,0 +1,48 @@ +From stable+bounces-73007-greg=kroah.com@vger.kernel.org Wed Sep 4 13:04:50 2024 +From: "Matthieu Baerts (NGI0)" +Date: Wed, 4 Sep 2024 13:04:31 +0200 +Subject: selftests: mptcp: join: validate fullmesh endp on 1st sf +To: stable@vger.kernel.org, gregkh@linuxfoundation.org +Cc: MPTCP Upstream , "Matthieu Baerts (NGI0)" , Mat Martineau , Jakub Kicinski +Message-ID: <20240904110430.4084188-2-matttbe@kernel.org> + +From: "Matthieu Baerts (NGI0)" + +commit 4878f9f8421f4587bee7b232c1c8a9d3a7d4d782 upstream. + +This case was not covered, and the wrong ID was set before the previous +commit. + +The rest is not modified, it is just that it will increase the code +coverage. + +The right address ID can be verified by looking at the packet traces. We +could automate that using Netfilter with some cBPF code for example, but +that's always a bit cryptic. Packetdrill seems better fitted for that. + +Fixes: 4f49d63352da ("selftests: mptcp: add fullmesh testcases") +Cc: stable@vger.kernel.org +Reviewed-by: Mat Martineau +Signed-off-by: Matthieu Baerts (NGI0) +Link: https://patch.msgid.link/20240819-net-mptcp-pm-reusing-id-v1-13-38035d40de5b@kernel.org +Signed-off-by: Jakub Kicinski +[ Conflicts in mptcp_join.sh, because the 'run_tests' helper has been + modified in multiple commits that are not in this version, e.g. commit + e571fb09c893 ("selftests: mptcp: add speed env var"). The conflict was + in the context, the new line can still be added at the same place. ] +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Greg Kroah-Hartman +--- + tools/testing/selftests/net/mptcp/mptcp_join.sh | 1 + + 1 file changed, 1 insertion(+) + +--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh ++++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh +@@ -3023,6 +3023,7 @@ fullmesh_tests() + pm_nl_set_limits $ns1 1 3 + pm_nl_set_limits $ns2 1 3 + pm_nl_add_endpoint $ns1 10.0.2.1 flags signal ++ pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow,fullmesh + run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow + chk_join_nr 3 3 3 + chk_add_nr 1 1 diff --git a/queue-6.1/series b/queue-6.1/series index 22b0633751e..464eb84bddf 100644 --- a/queue-6.1/series +++ b/queue-6.1/series @@ -13,3 +13,14 @@ selftests-mptcp-join-check-re-using-id-of-unused-add.patch selftests-mptcp-join-check-re-adding-init-endp-with-.patch pci-msi-fix-uaf-in-msi_capability_init.patch f2fs-fix-to-truncate-preallocated-blocks-in-f2fs_file_open.patch +mptcp-pm-fullmesh-select-the-right-id-later.patch +mptcp-pm-avoid-possible-uaf-when-selecting-endp.patch +mptcp-pm-reuse-id-0-after-delete-and-re-add.patch +mptcp-pm-fix-id-0-endp-usage-after-multiple-re-creations.patch +selftests-mptcp-join-validate-fullmesh-endp-on-1st-sf.patch +selftests-mptcp-join-check-re-using-id-of-closed-subflow.patch +selftests-mptcp-add-explicit-test-case-for-remove-readd.patch +selftests-mptcp-join-test-for-flush-re-add-endpoints.patch +selftests-mptcp-join-check-re-using-id-of-unused-add_addr.patch +selftests-mptcp-join-check-re-adding-init-endp-with-id.patch +mptcp-pr_debug-add-missing-n-at-the-end.patch