]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.6-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 4 Sep 2024 14:29:03 +0000 (16:29 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 4 Sep 2024 14:29:03 +0000 (16:29 +0200)
added patches:
mptcp-avoid-duplicated-sub_closed-events.patch
mptcp-pr_debug-add-missing-n-at-the-end.patch
selftests-mptcp-add-mptcp_lib_events-helper.patch
selftests-mptcp-join-check-re-re-adding-id-0-signal.patch
selftests-mptcp-join-disable-get-and-dump-addr-checks.patch
selftests-mptcp-join-stop-transfer-when-check-is-done-part-2.2.patch
selftests-mptcp-join-test-for-flush-re-add-endpoints.patch
selftests-mptcp-join-validate-event-numbers.patch

queue-6.6/mptcp-avoid-duplicated-sub_closed-events.patch [new file with mode: 0644]
queue-6.6/mptcp-pr_debug-add-missing-n-at-the-end.patch [new file with mode: 0644]
queue-6.6/selftests-mptcp-add-mptcp_lib_events-helper.patch [new file with mode: 0644]
queue-6.6/selftests-mptcp-join-check-re-re-adding-id-0-signal.patch [new file with mode: 0644]
queue-6.6/selftests-mptcp-join-disable-get-and-dump-addr-checks.patch [new file with mode: 0644]
queue-6.6/selftests-mptcp-join-stop-transfer-when-check-is-done-part-2.2.patch [new file with mode: 0644]
queue-6.6/selftests-mptcp-join-test-for-flush-re-add-endpoints.patch [new file with mode: 0644]
queue-6.6/selftests-mptcp-join-validate-event-numbers.patch [new file with mode: 0644]
queue-6.6/series

diff --git a/queue-6.6/mptcp-avoid-duplicated-sub_closed-events.patch b/queue-6.6/mptcp-avoid-duplicated-sub_closed-events.patch
new file mode 100644 (file)
index 0000000..b98bf17
--- /dev/null
@@ -0,0 +1,86 @@
+From stable+bounces-72801-greg=kroah.com@vger.kernel.org Tue Sep  3 12:18:08 2024
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+Date: Tue,  3 Sep 2024 12:17:48 +0200
+Subject: mptcp: avoid duplicated SUB_CLOSED events
+To: stable@vger.kernel.org, gregkh@linuxfoundation.org
+Cc: "MPTCP Upstream" <mptcp@lists.linux.dev>, "Matthieu Baerts (NGI0)" <matttbe@kernel.org>, "Arınç ÜNAL" <arinc.unal@arinc9.com>, "Mat Martineau" <martineau@kernel.org>, "Paolo Abeni" <pabeni@redhat.com>
+Message-ID: <20240903101747.3377518-2-matttbe@kernel.org>
+
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+
+commit d82809b6c5f2676b382f77a5cbeb1a5d91ed2235 upstream.
+
+The initial subflow might have already been closed, but still in the
+connection list. When the worker is instructed to close the subflows
+that have been marked as closed, it might then try to close the initial
+subflow again.
+
+ A consequence of that is that the SUB_CLOSED event can be seen twice:
+
+  # ip mptcp endpoint
+  1.1.1.1 id 1 subflow dev eth0
+  2.2.2.2 id 2 subflow dev eth1
+
+  # ip mptcp monitor &
+  [         CREATED] remid=0 locid=0 saddr4=1.1.1.1 daddr4=9.9.9.9
+  [     ESTABLISHED] remid=0 locid=0 saddr4=1.1.1.1 daddr4=9.9.9.9
+  [  SF_ESTABLISHED] remid=0 locid=2 saddr4=2.2.2.2 daddr4=9.9.9.9
+
+  # ip mptcp endpoint delete id 1
+  [       SF_CLOSED] remid=0 locid=0 saddr4=1.1.1.1 daddr4=9.9.9.9
+  [       SF_CLOSED] remid=0 locid=0 saddr4=1.1.1.1 daddr4=9.9.9.9
+
+The first one is coming from mptcp_pm_nl_rm_subflow_received(), and the
+second one from __mptcp_close_subflow().
+
+To avoid doing the post-closed processing twice, the subflow is now
+marked as closed the first time.
+
+Note that it is not enough to check if we are dealing with the first
+subflow and check its sk_state: the subflow might have been reset or
+closed before calling mptcp_close_ssk().
+
+Fixes: b911c97c7dc7 ("mptcp: add netlink event support")
+Cc: stable@vger.kernel.org
+Tested-by: Arınç ÜNAL <arinc.unal@arinc9.com>
+Reviewed-by: Mat Martineau <martineau@kernel.org>
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+[ Conflict in protocol.h due to commit f1f26512a9bf ("mptcp: use plain
+  bool instead of custom binary enum") and more that are not in this
+  version, because they modify the context and the size of __unused. The
+  conflict is easy to resolve, by not modifying data_avail type. ]
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/mptcp/protocol.c |    6 ++++++
+ net/mptcp/protocol.h |    3 ++-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+--- a/net/mptcp/protocol.c
++++ b/net/mptcp/protocol.c
+@@ -2471,6 +2471,12 @@ out:
+ void mptcp_close_ssk(struct sock *sk, struct sock *ssk,
+                    struct mptcp_subflow_context *subflow)
+ {
++      /* The first subflow can already be closed and still in the list */
++      if (subflow->close_event_done)
++              return;
++
++      subflow->close_event_done = true;
++
+       if (sk->sk_state == TCP_ESTABLISHED)
+               mptcp_event(MPTCP_EVENT_SUB_CLOSED, mptcp_sk(sk), ssk, GFP_KERNEL);
+--- a/net/mptcp/protocol.h
++++ b/net/mptcp/protocol.h
+@@ -500,7 +500,8 @@ struct mptcp_subflow_context {
+               stale : 1,          /* unable to snd/rcv data, do not use for xmit */
+               valid_csum_seen : 1,        /* at least one csum validated */
+               is_mptfo : 1,       /* subflow is doing TFO */
+-              __unused : 10;
++              close_event_done : 1,       /* has done the post-closed part */
++              __unused : 9;
+       enum mptcp_data_avail data_avail;
+       bool    scheduled;
+       u32     remote_nonce;
diff --git a/queue-6.6/mptcp-pr_debug-add-missing-n-at-the-end.patch b/queue-6.6/mptcp-pr_debug-add-missing-n-at-the-end.patch
new file mode 100644 (file)
index 0000000..33bf7dc
--- /dev/null
@@ -0,0 +1,1042 @@
+From matttbe@kernel.org Tue Sep  3 12:10:15 2024
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+Date: Tue,  3 Sep 2024 12:09:58 +0200
+Subject: mptcp: pr_debug: add missing \n at the end
+To: stable@vger.kernel.org, gregkh@linuxfoundation.org
+Cc: MPTCP Upstream <mptcp@lists.linux.dev>, "Matthieu Baerts (NGI0)" <matttbe@kernel.org>, Geliang Tang <geliang@kernel.org>, Jakub Kicinski <kuba@kernel.org>
+Message-ID: <20240903100957.3368081-2-matttbe@kernel.org>
+
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+
+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 <geliang@kernel.org>
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Link: https://patch.msgid.link/20240826-net-mptcp-close-extra-sf-fin-v1-4-905199fe1172@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+[ As mentioned above, conflicts were expected, and resolved by using the
+  'sed' command which is visible above. ]
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/mptcp/fastopen.c   |    4 +--
+ 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/sched.c      |    4 +--
+ net/mptcp/sockopt.c    |    4 +--
+ net/mptcp/subflow.c    |   48 ++++++++++++++++++++++-----------------------
+ 9 files changed, 107 insertions(+), 107 deletions(-)
+
+--- a/net/mptcp/fastopen.c
++++ b/net/mptcp/fastopen.c
+@@ -68,12 +68,12 @@ void __mptcp_fastopen_gen_msk_ackseq(str
+       skb = skb_peek_tail(&sk->sk_receive_queue);
+       if (skb) {
+               WARN_ON_ONCE(MPTCP_SKB_CB(skb)->end_seq);
+-              pr_debug("msk %p moving seq %llx -> %llx end_seq %llx -> %llx", sk,
++              pr_debug("msk %p moving seq %llx -> %llx end_seq %llx -> %llx\n", sk,
+                        MPTCP_SKB_CB(skb)->map_seq, MPTCP_SKB_CB(skb)->map_seq + msk->ack_seq,
+                        MPTCP_SKB_CB(skb)->end_seq, MPTCP_SKB_CB(skb)->end_seq + msk->ack_seq);
+               MPTCP_SKB_CB(skb)->map_seq += msk->ack_seq;
+               MPTCP_SKB_CB(skb)->end_seq += msk->ack_seq;
+       }
+-      pr_debug("msk=%p ack_seq=%llx", msk, msk->ack_seq);
++      pr_debug("msk=%p ack_seq=%llx\n", msk, msk->ack_seq);
+ }
+--- a/net/mptcp/options.c
++++ b/net/mptcp/options.c
+@@ -117,7 +117,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;
+@@ -131,7 +131,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) {
+@@ -142,19 +142,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
+@@ -169,7 +169,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);
+@@ -207,7 +207,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) {
+@@ -231,7 +231,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);
+@@ -293,7 +293,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;
+@@ -309,7 +309,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:
+@@ -318,7 +318,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:
+@@ -329,7 +329,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:
+@@ -343,7 +343,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;
+@@ -354,7 +354,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:
+@@ -417,7 +417,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;
+@@ -500,7 +500,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);
+@@ -509,7 +509,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
+@@ -675,7 +675,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
+@@ -695,7 +695,7 @@ static bool mptcp_established_options_ad
+       } else {
+               MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADDTX);
+       }
+-      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;
+@@ -726,7 +726,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]);
+       MPTCP_ADD_STATS(sock_net(sk), MPTCP_MIB_RMADDRTX, opts->rm_list.nr);
+       return true;
+ }
+@@ -752,7 +752,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;
+ }
+@@ -794,7 +794,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;
+ }
+@@ -816,7 +816,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;
+@@ -904,7 +904,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) {
+@@ -913,7 +913,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);
+@@ -46,7 +46,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) {
+               MPTCP_ADD_STATS(sock_net((struct sock *)msk),
+@@ -67,7 +67,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);
+@@ -91,7 +91,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 */
+@@ -115,7 +115,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;
+@@ -130,7 +130,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);
+@@ -154,14 +154,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;
+@@ -213,7 +213,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);
+@@ -246,7 +246,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);
+@@ -270,7 +270,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]);
+@@ -302,19 +302,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
+@@ -295,7 +295,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;
+@@ -314,7 +314,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++;
+@@ -395,7 +395,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);
+@@ -481,7 +481,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);
+@@ -730,7 +730,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);
+@@ -1545,7 +1545,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
+@@ -141,7 +141,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;
+@@ -219,7 +219,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 */
+@@ -643,7 +643,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;
+@@ -722,7 +722,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))
+@@ -744,7 +744,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;
+@@ -1235,7 +1235,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 ||
+@@ -1336,7 +1336,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);
+@@ -1855,7 +1855,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);
+@@ -2211,7 +2211,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);
+       }
+@@ -2227,7 +2227,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))
+@@ -2686,7 +2686,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);
+@@ -2856,7 +2856,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);
+@@ -2866,7 +2866,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);
+@@ -2932,7 +2932,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);
+@@ -2956,7 +2956,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));
+@@ -2971,7 +2971,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();
+@@ -3079,7 +3079,7 @@ cleanup:
+               mptcp_set_state(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 (msk->token)
+               mptcp_event(MPTCP_EVENT_CLOSED, msk, NULL, GFP_KERNEL);
+@@ -3514,7 +3514,7 @@ static int mptcp_get_port(struct sock *s
+ {
+       struct mptcp_sock *msk = mptcp_sk(sk);
+-      pr_debug("msk=%p, ssk=%p", msk, msk->first);
++      pr_debug("msk=%p, ssk=%p\n", msk, msk->first);
+       if (WARN_ON_ONCE(!msk->first))
+               return -EINVAL;
+@@ -3531,7 +3531,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);
+       subflow->map_seq = subflow->iasn;
+       subflow->map_subflow_seq = 1;
+@@ -3560,7 +3560,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)) {
+@@ -3606,7 +3606,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);
+@@ -3826,7 +3826,7 @@ static int mptcp_listen(struct socket *s
+       struct sock *ssk;
+       int err;
+-      pr_debug("msk=%p", msk);
++      pr_debug("msk=%p\n", msk);
+       lock_sock(sk);
+@@ -3866,7 +3866,7 @@ static int mptcp_stream_accept(struct so
+       struct sock *ssk, *newsk;
+       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.
+@@ -3875,12 +3875,12 @@ static int mptcp_stream_accept(struct so
+       if (!ssk)
+               return -EINVAL;
+-      pr_debug("ssk=%p, listener=%p", ssk, mptcp_subflow_ctx(ssk));
++      pr_debug("ssk=%p, listener=%p\n", ssk, mptcp_subflow_ctx(ssk));
+       newsk = inet_csk_accept(ssk, flags, &err, kern);
+       if (!newsk)
+               return err;
+-      pr_debug("newsk=%p, subflow is mptcp=%d", newsk, sk_is_mptcp(newsk));
++      pr_debug("newsk=%p, subflow is mptcp=%d\n", newsk, sk_is_mptcp(newsk));
+       if (sk_is_mptcp(newsk)) {
+               struct mptcp_subflow_context *subflow;
+               struct sock *new_mptcp_sock;
+@@ -3973,7 +3973,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 sock *ssk = READ_ONCE(msk->first);
+--- a/net/mptcp/protocol.h
++++ b/net/mptcp/protocol.h
+@@ -1092,7 +1092,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);
+@@ -1119,7 +1119,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/sched.c
++++ b/net/mptcp/sched.c
+@@ -64,7 +64,7 @@ int mptcp_register_scheduler(struct mptc
+       list_add_tail_rcu(&sched->list, &mptcp_sched_list);
+       spin_unlock(&mptcp_sched_list_lock);
+-      pr_debug("%s registered", sched->name);
++      pr_debug("%s registered\n", sched->name);
+       return 0;
+ }
+@@ -96,7 +96,7 @@ int mptcp_init_sched(struct mptcp_sock *
+       if (msk->sched->init)
+               msk->sched->init(msk);
+-      pr_debug("sched=%s", msk->sched->name);
++      pr_debug("sched=%s\n", msk->sched->name);
+       return 0;
+ }
+--- a/net/mptcp/sockopt.c
++++ b/net/mptcp/sockopt.c
+@@ -858,7 +858,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);
+@@ -1416,7 +1416,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
+@@ -40,7 +40,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);
+@@ -146,7 +146,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
+@@ -219,7 +219,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)) {
+@@ -238,7 +238,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);
+       }
+@@ -508,7 +508,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) {
+@@ -540,7 +540,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);
+@@ -566,7 +566,7 @@ static void subflow_finish_connect(struc
+                       MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINSYNACKBACKUPRX);
+               if (subflow_use_different_dport(msk, 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);
+@@ -636,7 +636,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))
+@@ -667,7 +667,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);
+@@ -786,7 +786,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
+@@ -877,7 +877,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)) {
+@@ -934,7 +934,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);
+ }
+@@ -1094,7 +1094,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;
+@@ -1104,7 +1104,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
+@@ -1129,7 +1129,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);
+               }
+@@ -1176,7 +1176,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);
+@@ -1211,7 +1211,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;
+@@ -1312,7 +1312,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);
+@@ -1384,7 +1384,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);
+       }
+@@ -1494,7 +1494,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))
+@@ -1589,7 +1589,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);
+@@ -1727,7 +1727,7 @@ release_ssk:
+       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);
+@@ -1751,7 +1751,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);
+@@ -1902,7 +1902,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.6/selftests-mptcp-add-mptcp_lib_events-helper.patch b/queue-6.6/selftests-mptcp-add-mptcp_lib_events-helper.patch
new file mode 100644 (file)
index 0000000..42ae64a
--- /dev/null
@@ -0,0 +1,112 @@
+From stable+bounces-72804-greg=kroah.com@vger.kernel.org Tue Sep  3 12:24:14 2024
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+Date: Tue,  3 Sep 2024 12:23:49 +0200
+Subject: selftests: mptcp: add mptcp_lib_events helper
+To: mptcp@lists.linux.dev, stable@vger.kernel.org, gregkh@linuxfoundation.org
+Cc: Geliang Tang <tanggeliang@kylinos.cn>, Matthieu Baerts <matttbe@kernel.org>, Jakub Kicinski <kuba@kernel.org>
+Message-ID: <20240903102347.3384947-6-matttbe@kernel.org>
+
+From: Geliang Tang <tanggeliang@kylinos.cn>
+
+commit 35bc143a8514ee72b2e9d6b8b385468608b93a53 upstream.
+
+To avoid duplicated code in different MPTCP selftests, we can add and
+use helpers defined in mptcp_lib.sh.
+
+This patch unifies "pm_nl_ctl events" related code in userspace_pm.sh
+and mptcp_join.sh into a helper mptcp_lib_events(). Define it in
+mptcp_lib.sh and use it in both scripts.
+
+Note that mptcp_lib_kill_wait is now call before starting 'events' for
+mptcp_join.sh as well, but that's fine: each test is started from a new
+netns, so there will not be any existing pid there, and nothing is done
+when mptcp_lib_kill_wait is called with 0.
+
+Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
+Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Link: https://lore.kernel.org/r/20240306-upstream-net-next-20240304-selftests-mptcp-shared-code-shellcheck-v2-6-bc79e6e5e6a0@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Stable-dep-of: 20ccc7c5f7a3 ("selftests: mptcp: join: validate event numbers")
+[ Conflicts in mptcp_lib.sh, because the context is different at the end
+  of the file, where the new helper is supposed to go. The new helper
+  has simply be added at the end. ]
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ tools/testing/selftests/net/mptcp/mptcp_join.sh   |   10 ++++------
+ tools/testing/selftests/net/mptcp/mptcp_lib.sh    |   12 ++++++++++++
+ tools/testing/selftests/net/mptcp/userspace_pm.sh |   14 ++------------
+ 3 files changed, 18 insertions(+), 18 deletions(-)
+
+--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
++++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
+@@ -468,12 +468,8 @@ reset_with_events()
+ {
+       reset "${1}" || return 1
+-      :> "$evts_ns1"
+-      :> "$evts_ns2"
+-      ip netns exec $ns1 ./pm_nl_ctl events >> "$evts_ns1" 2>&1 &
+-      evts_ns1_pid=$!
+-      ip netns exec $ns2 ./pm_nl_ctl events >> "$evts_ns2" 2>&1 &
+-      evts_ns2_pid=$!
++      mptcp_lib_events "${ns1}" "${evts_ns1}" evts_ns1_pid
++      mptcp_lib_events "${ns2}" "${evts_ns2}" evts_ns2_pid
+ }
+ reset_with_tcp_filter()
+@@ -672,7 +668,9 @@ wait_mpj()
+ kill_events_pids()
+ {
+       mptcp_lib_kill_wait $evts_ns1_pid
++      evts_ns1_pid=0
+       mptcp_lib_kill_wait $evts_ns2_pid
++      evts_ns2_pid=0
+ }
+ pm_nl_set_limits()
+--- a/tools/testing/selftests/net/mptcp/mptcp_lib.sh
++++ b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
+@@ -258,3 +258,15 @@ mptcp_lib_get_counter() {
+       echo "${count}"
+ }
++
++mptcp_lib_events() {
++      local ns="${1}"
++      local evts="${2}"
++      declare -n pid="${3}"
++
++      :>"${evts}"
++
++      mptcp_lib_kill_wait "${pid:-0}"
++      ip netns exec "${ns}" ./pm_nl_ctl events >> "${evts}" 2>&1 &
++      pid=$!
++}
+--- a/tools/testing/selftests/net/mptcp/userspace_pm.sh
++++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh
+@@ -201,21 +201,11 @@ make_connection()
+       if [ -z "$client_evts" ]; then
+               client_evts=$(mktemp)
+       fi
+-      :>"$client_evts"
+-      if [ $client_evts_pid -ne 0 ]; then
+-              mptcp_lib_kill_wait $client_evts_pid
+-      fi
+-      ip netns exec "$ns2" ./pm_nl_ctl events >> "$client_evts" 2>&1 &
+-      client_evts_pid=$!
++      mptcp_lib_events "${ns2}" "${client_evts}" client_evts_pid
+       if [ -z "$server_evts" ]; then
+               server_evts=$(mktemp)
+       fi
+-      :>"$server_evts"
+-      if [ $server_evts_pid -ne 0 ]; then
+-              mptcp_lib_kill_wait $server_evts_pid
+-      fi
+-      ip netns exec "$ns1" ./pm_nl_ctl events >> "$server_evts" 2>&1 &
+-      server_evts_pid=$!
++      mptcp_lib_events "${ns1}" "${server_evts}" server_evts_pid
+       sleep 0.5
+       # Run the server
diff --git a/queue-6.6/selftests-mptcp-join-check-re-re-adding-id-0-signal.patch b/queue-6.6/selftests-mptcp-join-check-re-re-adding-id-0-signal.patch
new file mode 100644 (file)
index 0000000..d85247b
--- /dev/null
@@ -0,0 +1,95 @@
+From stable+bounces-72806-greg=kroah.com@vger.kernel.org Tue Sep  3 12:24:19 2024
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+Date: Tue,  3 Sep 2024 12:23:51 +0200
+Subject: selftests: mptcp: join: check re-re-adding ID 0 signal
+To: mptcp@lists.linux.dev, stable@vger.kernel.org, gregkh@linuxfoundation.org
+Cc: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>, Mat Martineau <martineau@kernel.org>, Paolo Abeni <pabeni@redhat.com>
+Message-ID: <20240903102347.3384947-8-matttbe@kernel.org>
+
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+
+commit f18fa2abf81099d822d842a107f8c9889c86043c upstream.
+
+This test extends "delete re-add signal" to validate the previous
+commit: when the 'signal' endpoint linked to the initial subflow (ID 0)
+is re-added multiple times, it will re-send the ADD_ADDR with id 0. The
+client should still be able to re-create this subflow, even if the
+add_addr_accepted limit has been reached as this special address is not
+considered as a new address.
+
+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: d0876b2284cf ("mptcp: add the incoming RM_ADDR support")
+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>
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ tools/testing/selftests/net/mptcp/mptcp_join.sh |   34 +++++++++++++++---------
+ 1 file changed, 22 insertions(+), 12 deletions(-)
+
+--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
++++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
+@@ -3794,7 +3794,7 @@ endpoint_tests()
+               # 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
+-              test_linkfail=4 speed=20 \
++              test_linkfail=4 speed=5 \
+                       run_tests $ns1 $ns2 10.0.1.1 &
+               local tests_pid=$!
+@@ -3823,7 +3823,17 @@ endpoint_tests()
+               pm_nl_add_endpoint $ns1 10.0.1.1 id 99 flags signal
+               wait_mpj $ns2
+-              chk_subflow_nr "after re-add" 3
++              chk_subflow_nr "after re-add ID 0" 3
++              chk_mptcp_info subflows 3 subflows 3
++
++              pm_nl_del_endpoint $ns1 99 10.0.1.1
++              sleep 0.5
++              chk_subflow_nr "after re-delete ID 0" 2
++              chk_mptcp_info subflows 2 subflows 2
++
++              pm_nl_add_endpoint $ns1 10.0.1.1 id 88 flags signal
++              wait_mpj $ns2
++              chk_subflow_nr "after re-re-add ID 0" 3
+               chk_mptcp_info subflows 3 subflows 3
+               mptcp_lib_kill_wait $tests_pid
+@@ -3833,19 +3843,19 @@ endpoint_tests()
+               chk_evt_nr ns1 MPTCP_LIB_EVENT_ESTABLISHED 1
+               chk_evt_nr ns1 MPTCP_LIB_EVENT_ANNOUNCED 0
+               chk_evt_nr ns1 MPTCP_LIB_EVENT_REMOVED 0
+-              chk_evt_nr ns1 MPTCP_LIB_EVENT_SUB_ESTABLISHED 4
+-              chk_evt_nr ns1 MPTCP_LIB_EVENT_SUB_CLOSED 2
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_SUB_ESTABLISHED 5
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_SUB_CLOSED 3
+               chk_evt_nr ns2 MPTCP_LIB_EVENT_CREATED 1
+               chk_evt_nr ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
+-              chk_evt_nr ns2 MPTCP_LIB_EVENT_ANNOUNCED 5
+-              chk_evt_nr ns2 MPTCP_LIB_EVENT_REMOVED 3
+-              chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_ESTABLISHED 4
+-              chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_CLOSED 2
+-
+-              chk_join_nr 4 4 4
+-              chk_add_nr 5 5
+-              chk_rm_nr 3 2 invert
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_ANNOUNCED 6
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_REMOVED 4
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_ESTABLISHED 5
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_CLOSED 3
++
++              chk_join_nr 5 5 5
++              chk_add_nr 6 6
++              chk_rm_nr 4 3 invert
+       fi
+ }
diff --git a/queue-6.6/selftests-mptcp-join-disable-get-and-dump-addr-checks.patch b/queue-6.6/selftests-mptcp-join-disable-get-and-dump-addr-checks.patch
new file mode 100644 (file)
index 0000000..55327dd
--- /dev/null
@@ -0,0 +1,53 @@
+From stable+bounces-73054-greg=kroah.com@vger.kernel.org Wed Sep  4 15:39:40 2024
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+Date: Wed,  4 Sep 2024 15:37:57 +0200
+Subject: selftests: mptcp: join: disable get and dump addr checks
+To: mptcp@lists.linux.dev, stable@vger.kernel.org, gregkh@linuxfoundation.org
+Cc: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>, sashal@kernel.org
+Message-ID: <20240904133755.67974-5-matttbe@kernel.org>
+
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+
+These new checks have been recently queued to v6.6 [1] with the backport
+of commit 38f027fca1b7 ("selftests: mptcp: dump userspace addrs list"),
+and commit 4cc5cc7ca052 ("selftests: mptcp: userspace pm get addr
+tests").
+
+On v6.6, these checks will simply print 'skip', because the associated
+features are not available in this version. That's fine, except that the
+MPTCP CI sets the SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES=1 env var,
+which will force these subtests to fail when using the selftests from
+v6.6 on a v6.6 kernel, because the feature is not available.
+
+To ease the backports (and possible future ones), I suggest to keep the
+recent backports, but skip calling mptcp_lib_kallsyms_has() not to have
+the CIs setting this env var complaining about the associated features
+not being available.
+
+Link: https://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git/commit/?id=bd2122541bd8 [1]
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ tools/testing/selftests/net/mptcp/mptcp_join.sh |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
++++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
+@@ -3472,7 +3472,7 @@ userspace_pm_chk_dump_addr()
+       print_check "dump addrs ${check}"
+-      if mptcp_lib_kallsyms_has "mptcp_userspace_pm_dump_addr$"; then
++      if false && mptcp_lib_kallsyms_has "mptcp_userspace_pm_dump_addr$"; then
+               check_output "userspace_pm_dump ${ns}" "${exp}"
+       else
+               print_skip
+@@ -3487,7 +3487,7 @@ userspace_pm_chk_get_addr()
+       print_check "get id ${id} addr"
+-      if mptcp_lib_kallsyms_has "mptcp_userspace_pm_get_addr$"; then
++      if false && mptcp_lib_kallsyms_has "mptcp_userspace_pm_get_addr$"; then
+               check_output "userspace_pm_get_addr ${ns} ${id}" "${exp}"
+       else
+               print_skip
diff --git a/queue-6.6/selftests-mptcp-join-stop-transfer-when-check-is-done-part-2.2.patch b/queue-6.6/selftests-mptcp-join-stop-transfer-when-check-is-done-part-2.2.patch
new file mode 100644 (file)
index 0000000..0552928
--- /dev/null
@@ -0,0 +1,40 @@
+From stable+bounces-73055-greg=kroah.com@vger.kernel.org Wed Sep  4 15:39:40 2024
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+Date: Wed,  4 Sep 2024 15:37:58 +0200
+Subject: selftests: mptcp: join: stop transfer when check is done (part 2.2)
+To: mptcp@lists.linux.dev, stable@vger.kernel.org, gregkh@linuxfoundation.org
+Cc: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>, sashal@kernel.org
+Message-ID: <20240904133755.67974-6-matttbe@kernel.org>
+
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+
+Use mptcp_lib_kill_wait in "userspace pm create id 0 subflow" subtest.
+
+This new test has recently been queued to v6.6 [1] with the backport of
+commit b2e2248f365a ("selftests: mptcp: userspace pm create id 0
+subflow").
+
+The modification here was part of commit 04b57c9e096a ("selftests:
+mptcp: join: stop transfer when check is done (part 2)") that has been
+backported to v6.6 a few months ago -- see commit 358f02b84fbb
+("selftests: mptcp: join: stop transfer when check is done (part 2)") --
+but it was not modifying this subtest as it was not present in v6.6.
+
+Link: https://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git/commit/?id=bd2122541bd8 [1]
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ tools/testing/selftests/net/mptcp/mptcp_join.sh |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
++++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
+@@ -3678,7 +3678,7 @@ userspace_tests()
+               chk_mptcp_info subflows 1 subflows 1
+               chk_subflows_total 2 2
+               kill_events_pids
+-              wait $tests_pid
++              mptcp_lib_kill_wait $tests_pid
+       fi
+ }
diff --git a/queue-6.6/selftests-mptcp-join-test-for-flush-re-add-endpoints.patch b/queue-6.6/selftests-mptcp-join-test-for-flush-re-add-endpoints.patch
new file mode 100644 (file)
index 0000000..90b0a16
--- /dev/null
@@ -0,0 +1,71 @@
+From e06959e9eebdfea4654390f53b65cff57691872e Mon Sep 17 00:00:00 2001
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+Date: Mon, 19 Aug 2024 21:45:24 +0200
+Subject: selftests: mptcp: join: test for flush/re-add endpoints
+
+From: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+
+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 <martineau@kernel.org>
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Link: https://patch.msgid.link/20240819-net-mptcp-pm-reusing-id-v1-6-38035d40de5b@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ tools/testing/selftests/net/mptcp/mptcp_join.sh |   30 ++++++++++++++++++++++++
+ 1 file changed, 30 insertions(+)
+
+--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
++++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
+@@ -3858,6 +3858,36 @@ endpoint_tests()
+               chk_rm_nr 4 3 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
++              test_linkfail=4 speed=20 \
++                      run_tests $ns1 $ns2 10.0.1.1 &
++              local tests_pid=$!
++
++              wait_attempt_fail $ns2
++              chk_subflow_nr "before flush" 1
++              chk_mptcp_info subflows 0 subflows 0
++
++              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
++              mptcp_lib_kill_wait $tests_pid
++
++              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.6/selftests-mptcp-join-validate-event-numbers.patch b/queue-6.6/selftests-mptcp-join-validate-event-numbers.patch
new file mode 100644 (file)
index 0000000..1a5b5e1
--- /dev/null
@@ -0,0 +1,190 @@
+From stable+bounces-72805-greg=kroah.com@vger.kernel.org Tue Sep  3 12:24:15 2024
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+Date: Tue,  3 Sep 2024 12:23:50 +0200
+Subject: selftests: mptcp: join: validate event numbers
+To: mptcp@lists.linux.dev, stable@vger.kernel.org, gregkh@linuxfoundation.org
+Cc: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>, Mat Martineau <martineau@kernel.org>, Paolo Abeni <pabeni@redhat.com>
+Message-ID: <20240903102347.3384947-7-matttbe@kernel.org>
+
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+
+commit 20ccc7c5f7a3aa48092441a4b182f9f40418392e upstream.
+
+This test extends "delete and re-add" and "delete re-add signal" to
+validate the previous commit: the number of MPTCP events are checked to
+make sure there are no duplicated or unexpected ones.
+
+A new helper has been introduced to easily check these events. The
+missing events have been added to the lib.
+
+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: b911c97c7dc7 ("mptcp: add netlink event support")
+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 mptcp_join.sh and mptcp_lib.sh, due to commit
+  38f027fca1b7 ("selftests: mptcp: dump userspace addrs list") -- linked
+  to a new feature, not backportable to stable -- and commit
+  23a0485d1c04 ("selftests: mptcp: declare event macros in mptcp_lib")
+  -- depending on the previous one -- not in this version. The conflicts
+  in mptcp_join.sh were in the context, because a new helper had to be
+  added after others that are not in this version. The conflicts in
+  mptcp_lib.sh were due to the fact the other MPTCP_LIB_EVENT_*
+  constants were not present. They have all been added in this version
+  to ease future backports if any. ]
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ tools/testing/selftests/net/mptcp/mptcp_join.sh |   74 +++++++++++++++++++++++-
+ tools/testing/selftests/net/mptcp/mptcp_lib.sh  |   15 ++++
+ 2 files changed, 86 insertions(+), 3 deletions(-)
+
+--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
++++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
+@@ -464,12 +464,17 @@ reset_with_fail()
+       fi
+ }
++start_events()
++{
++      mptcp_lib_events "${ns1}" "${evts_ns1}" evts_ns1_pid
++      mptcp_lib_events "${ns2}" "${evts_ns2}" evts_ns2_pid
++}
++
+ reset_with_events()
+ {
+       reset "${1}" || return 1
+-      mptcp_lib_events "${ns1}" "${evts_ns1}" evts_ns1_pid
+-      mptcp_lib_events "${ns2}" "${evts_ns2}" evts_ns2_pid
++      start_events
+ }
+ reset_with_tcp_filter()
+@@ -3489,6 +3494,36 @@ userspace_pm_chk_get_addr()
+       fi
+ }
++# $1: ns ; $2: event type ; $3: count
++chk_evt_nr()
++{
++      local ns=${1}
++      local evt_name="${2}"
++      local exp="${3}"
++
++      local evts="${evts_ns1}"
++      local evt="${!evt_name}"
++      local count
++
++      evt_name="${evt_name:16}" # without MPTCP_LIB_EVENT_
++      [ "${ns}" == "ns2" ] && evts="${evts_ns2}"
++
++      print_check "event ${ns} ${evt_name} (${exp})"
++
++      if [[ "${evt_name}" = "LISTENER_"* ]] &&
++         ! mptcp_lib_kallsyms_has "mptcp_event_pm_listener$"; then
++              print_skip "event not supported"
++              return
++      fi
++
++      count=$(grep -cw "type:${evt}" "${evts}")
++      if [ "${count}" != "${exp}" ]; then
++              fail_test "got ${count} events, expected ${exp}"
++      else
++              print_ok
++      fi
++}
++
+ userspace_tests()
+ {
+       # userspace pm type prevents add_addr
+@@ -3678,6 +3713,7 @@ endpoint_tests()
+       if reset_with_tcp_filter "delete and re-add" ns2 10.0.3.2 REJECT OUTPUT &&
+          mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then
++              start_events
+               pm_nl_set_limits $ns1 0 3
+               pm_nl_set_limits $ns2 0 3
+               pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow
+@@ -3729,12 +3765,28 @@ endpoint_tests()
+               mptcp_lib_kill_wait $tests_pid
++              kill_events_pids
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_LISTENER_CREATED 1
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_CREATED 1
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_ESTABLISHED 1
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_ANNOUNCED 0
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_REMOVED 4
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_SUB_ESTABLISHED 6
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_SUB_CLOSED 4
++
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_CREATED 1
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_ANNOUNCED 0
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_REMOVED 0
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_ESTABLISHED 6
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_CLOSED 5 # one has been closed before estab
++
+               chk_join_nr 6 6 6
+               chk_rm_nr 4 4
+       fi
+       # remove and re-add
+-      if reset "delete re-add signal" &&
++      if reset_with_events "delete re-add signal" &&
+          mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then
+               pm_nl_set_limits $ns1 0 3
+               pm_nl_set_limits $ns2 3 3
+@@ -3775,6 +3827,22 @@ endpoint_tests()
+               chk_mptcp_info subflows 3 subflows 3
+               mptcp_lib_kill_wait $tests_pid
++              kill_events_pids
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_LISTENER_CREATED 1
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_CREATED 1
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_ESTABLISHED 1
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_ANNOUNCED 0
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_REMOVED 0
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_SUB_ESTABLISHED 4
++              chk_evt_nr ns1 MPTCP_LIB_EVENT_SUB_CLOSED 2
++
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_CREATED 1
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_ANNOUNCED 5
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_REMOVED 3
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_ESTABLISHED 4
++              chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_CLOSED 2
++
+               chk_join_nr 4 4 4
+               chk_add_nr 5 5
+               chk_rm_nr 3 2 invert
+--- a/tools/testing/selftests/net/mptcp/mptcp_lib.sh
++++ b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
+@@ -19,6 +19,21 @@ declare -rx MPTCP_LIB_EVENT_LISTENER_CLO
+ declare -rx MPTCP_LIB_AF_INET=2
+ declare -rx MPTCP_LIB_AF_INET6=10
++# These variables are used in some selftests, read-only
++declare -rx MPTCP_LIB_EVENT_CREATED=1           # MPTCP_EVENT_CREATED
++declare -rx MPTCP_LIB_EVENT_ESTABLISHED=2       # MPTCP_EVENT_ESTABLISHED
++declare -rx MPTCP_LIB_EVENT_CLOSED=3            # MPTCP_EVENT_CLOSED
++declare -rx MPTCP_LIB_EVENT_ANNOUNCED=6         # MPTCP_EVENT_ANNOUNCED
++declare -rx MPTCP_LIB_EVENT_REMOVED=7           # MPTCP_EVENT_REMOVED
++declare -rx MPTCP_LIB_EVENT_SUB_ESTABLISHED=10  # MPTCP_EVENT_SUB_ESTABLISHED
++declare -rx MPTCP_LIB_EVENT_SUB_CLOSED=11       # MPTCP_EVENT_SUB_CLOSED
++declare -rx MPTCP_LIB_EVENT_SUB_PRIORITY=13     # MPTCP_EVENT_SUB_PRIORITY
++declare -rx MPTCP_LIB_EVENT_LISTENER_CREATED=15 # MPTCP_EVENT_LISTENER_CREATED
++declare -rx MPTCP_LIB_EVENT_LISTENER_CLOSED=16  # MPTCP_EVENT_LISTENER_CLOSED
++
++declare -rx MPTCP_LIB_AF_INET=2
++declare -rx MPTCP_LIB_AF_INET6=10
++
+ MPTCP_LIB_SUBTESTS=()
+ # only if supported (or forced) and not disabled, see no-color.org
index be4b7dac3c627136356cea0652c29f2fcadd9e9c..3e85d059ead28c103687bbdd43a44bf498784002 100644 (file)
@@ -29,3 +29,11 @@ selftests-mptcp-join-cannot-rm-sf-if-closed.patch
 selftests-mptcp-add-explicit-test-case-for-remove-re.patch
 selftests-mptcp-join-check-re-using-id-of-unused-add.patch
 selftests-mptcp-join-check-re-adding-init-endp-with-.patch
+selftests-mptcp-add-mptcp_lib_events-helper.patch
+selftests-mptcp-join-validate-event-numbers.patch
+selftests-mptcp-join-check-re-re-adding-id-0-signal.patch
+selftests-mptcp-join-test-for-flush-re-add-endpoints.patch
+selftests-mptcp-join-disable-get-and-dump-addr-checks.patch
+selftests-mptcp-join-stop-transfer-when-check-is-done-part-2.2.patch
+mptcp-avoid-duplicated-sub_closed-events.patch
+mptcp-pr_debug-add-missing-n-at-the-end.patch