--- /dev/null
+From dc97251bf0b70549c76ba261516c01b8096771c5 Mon Sep 17 00:00:00 2001
+From: Matthieu Baerts <matthieu.baerts@tessares.net>
+Date: Thu, 8 Jun 2023 18:38:47 +0200
+Subject: selftests: mptcp: diag: skip listen tests if not supported
+
+From: Matthieu Baerts <matthieu.baerts@tessares.net>
+
+commit dc97251bf0b70549c76ba261516c01b8096771c5 upstream.
+
+Selftests are supposed to run on any kernels, including the old ones not
+supporting all MPTCP features.
+
+One of them is the listen diag dump support introduced by
+commit 4fa39b701ce9 ("mptcp: listen diag dump support").
+
+It looks like there is no good pre-check to do here, i.e. dedicated
+function available in kallsyms. Instead, we try to get info if nothing
+is returned, the test is marked as skipped.
+
+That's not ideal because something could be wrong with the feature and
+instead of reporting an error, the test could be marked as skipped. If
+we know in advanced that the feature is supposed to be supported, the
+tester can set SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES env var to 1: in
+this case the test will report an error instead of marking the test as
+skipped if nothing is returned.
+
+Link: https://github.com/multipath-tcp/mptcp_net-next/issues/368
+Fixes: f2ae0fa68e28 ("selftests/mptcp: add diag listen tests")
+Cc: stable@vger.kernel.org
+Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ tools/testing/selftests/net/mptcp/diag.sh | 47 +++++++++++++++---------------
+ 1 file changed, 24 insertions(+), 23 deletions(-)
+
+--- a/tools/testing/selftests/net/mptcp/diag.sh
++++ b/tools/testing/selftests/net/mptcp/diag.sh
+@@ -42,27 +42,39 @@ fi
+
+ __chk_nr()
+ {
+- local condition="$1"
++ local command="$1"
+ local expected=$2
+- local msg nr
++ local msg="$3"
++ local skip="${4:-SKIP}"
++ local nr
+
+- shift 2
+- msg=$*
+- nr=$(ss -inmHMN $ns | $condition)
++ nr=$(eval $command)
+
+ printf "%-50s" "$msg"
+ if [ $nr != $expected ]; then
+- echo "[ fail ] expected $expected found $nr"
+- ret=$test_cnt
++ if [ $nr = "$skip" ] && ! mptcp_lib_expect_all_features; then
++ echo "[ skip ] Feature probably not supported"
++ else
++ echo "[ fail ] expected $expected found $nr"
++ ret=$test_cnt
++ fi
+ else
+ echo "[ ok ]"
+ fi
+ test_cnt=$((test_cnt+1))
+ }
+
++__chk_msk_nr()
++{
++ local condition=$1
++ shift 1
++
++ __chk_nr "ss -inmHMN $ns | $condition" "$@"
++}
++
+ chk_msk_nr()
+ {
+- __chk_nr "grep -c token:" $*
++ __chk_msk_nr "grep -c token:" "$@"
+ }
+
+ wait_msk_nr()
+@@ -100,37 +112,26 @@ wait_msk_nr()
+
+ chk_msk_fallback_nr()
+ {
+- __chk_nr "grep -c fallback" $*
++ __chk_msk_nr "grep -c fallback" "$@"
+ }
+
+ chk_msk_remote_key_nr()
+ {
+- __chk_nr "grep -c remote_key" $*
++ __chk_msk_nr "grep -c remote_key" "$@"
+ }
+
+ __chk_listen()
+ {
+ local filter="$1"
+ local expected=$2
++ local msg="$3"
+
+- shift 2
+- msg=$*
+-
+- nr=$(ss -N $ns -Ml "$filter" | grep -c LISTEN)
+- printf "%-50s" "$msg"
+-
+- if [ $nr != $expected ]; then
+- echo "[ fail ] expected $expected found $nr"
+- ret=$test_cnt
+- else
+- echo "[ ok ]"
+- fi
++ __chk_nr "ss -N $ns -Ml '$filter' | grep -c LISTEN" "$expected" "$msg" 0
+ }
+
+ chk_msk_listen()
+ {
+ lport=$1
+- local msg="check for listen socket"
+
+ # destination port search should always return empty list
+ __chk_listen "dport $lport" 0 "listen match for dport $lport"