From nobody Sun Jul 5 05:52:03 2026 Received: from out-183.mta0.migadu.com (out-183.mta0.migadu.com [91.218.175.183]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DCD4C288D0 for ; Wed, 17 Jun 2026 14:46:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.183 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707593; cv=none; b=P5eyFGJ/FEfwsboogoqHxnOrM0Q8HhaHIvDIngwe0umsttOjLLpjHzE+PSgISxoLlgXozBFWuMAhJyLvQjjGPdtLs7OZ8Mo4cOcJWU3HtCqIjgXFmJjdyUUPF2tXYEHHEZCZVG4pcPpI9K479m7F07JiLPJRfaNlf7vrG/jx8fQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707593; c=relaxed/simple; bh=KWb2JQk5EFkysNAREoJt8zHVoaRkclnVuU3n8IGiqaw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VrwSTwZqt53p66LrAnDj8WQmeC7Nnfxdn/t6kH15yuAaOgYHRPU5C0jXM/kPQpUpu6G94yJ7G5E4mOg9zrbpSag5VW31febUvRj5fAFcoeBO8iinV+0fX7nDxCtFXFgocSHqdQaMIWgWc8xD8Qa+iOv3+u9AcW9JZ04sZ2nMPlk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=SVAjdPYj; arc=none smtp.client-ip=91.218.175.183 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="SVAjdPYj" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1781707590; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=znAyoSmtjwInbXZhUuS96a8SBg46sFtEoPBd6T7itWk=; b=SVAjdPYjE2tDZ3m60Y8/KeItyYFtuq3zA+Gcae6BiflNEukRGMZeOXQB7LSICoNE5QBpU8 tZ6eICBKOJL/huuyn6OuCM5n0coi7MQonVhyRJk6VEtpbHP0ei+E+EmJUwlrVRStRbXy1J kDE9Nvkb8JDGyyou0TALQKV5DKeeWe0= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v2 1/9] DO-NOT-MERGE: mptcp: test IPV6=m in docker-virtme Date: Wed, 17 Jun 2026 22:46:08 +0800 Message-ID: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan This is a helper commit for maintainer review of the preceding MPTCP selftests patches that teach the test scripts to gracefully skip IPv6 subtests when the running kernel has no CONFIG_MPTCP_IPV6. Signed-off-by: Gang Yan --- tools/testing/selftests/net/mptcp/config | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/config b/tools/testing/selft= ests/net/mptcp/config index 59051ee2a986..616fee329e22 100644 --- a/tools/testing/selftests/net/mptcp/config +++ b/tools/testing/selftests/net/mptcp/config @@ -7,11 +7,10 @@ CONFIG_IP_MULTIPLE_TABLES=3Dy CONFIG_IP_NF_FILTER=3Dm CONFIG_IP_NF_MANGLE=3Dm CONFIG_IP_NF_TARGET_REJECT=3Dm -CONFIG_IPV6=3Dy +CONFIG_IPV6=3Dm CONFIG_IPV6_MULTIPLE_TABLES=3Dy CONFIG_KALLSYMS=3Dy CONFIG_MPTCP=3Dy -CONFIG_MPTCP_IPV6=3Dy CONFIG_NET_ACT_CSUM=3Dm CONFIG_NET_ACT_PEDIT=3Dm CONFIG_NET_CLS_ACT=3Dy @@ -34,3 +33,5 @@ CONFIG_NFT_SOCKET=3Dm CONFIG_NFT_TPROXY=3Dm CONFIG_SYN_COOKIES=3Dy CONFIG_VETH=3Dy + +CONFIG_NF_TABLES_IPV4=3Dy --=20 2.43.0 From nobody Sun Jul 5 05:52:03 2026 Received: from out-170.mta0.migadu.com (out-170.mta0.migadu.com [91.218.175.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5929638E10F for ; Wed, 17 Jun 2026 14:46:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707597; cv=none; b=fDsu1zQoocve5qlUC+ombBkHsNdBufi/qH43BOdNJCREj2vOyM0wEpRUvzmUapwaFAZ464PRRVMwg2YtmwBc4cmxnPYlFWGXTE5iu+7tm+1yoXJ/1wIeW4auIMtPlvIRBgWSQ/bQEWvAK6MxWGom5hEQHWKtqLsDSxiOsgjCdrs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707597; c=relaxed/simple; bh=d8vrMG/9funhGJf2xJfcD2NEQIn7d/JG/6l9OLAGtNk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fCDoKPgk2N+LnDSESPF78swartJt/t3nLQFjbEplnIMzHWl/ce8YvafJdwqM5rlzxu7it30ArZrgkKXoDQSwE/rabpTPnOfGDLTn0odpetzQPGH/oU1IqrVyV470mYsorvttqcTqFXjnSSsPHIxH1HIha7EVbqV5Yzxqu0TJYmI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=fm2v+Y59; arc=none smtp.client-ip=91.218.175.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="fm2v+Y59" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1781707593; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=CNGJrkvhnxwHDa0tp1Hfkla/TXDCh9TiofXC800+WtE=; b=fm2v+Y59cZzSbGVV8GaaqgKO5pB62vxWvzdY84vtIey64jNMKPIoHrRSv02DSZFZWpUdi+ jA9tAuH/lwPkyh6/sKbLfaTmkPf4psbnO4aAkBJhVsaxH0xSCfKi6ze75VBuyqgO7NPDWO eKIHVpmhAcNsZfCi8Tek6Wl0Ck4jXso= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v2 2/9] selftests: mptcp: mptcp_lib add runtime IPv6 availability detection helper Date: Wed, 17 Jun 2026 22:46:09 +0800 Message-ID: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan This patch introduce a minimal, non-fatal detection helper that subsequent patches will use to guard the v6 paths: - MPTCP_LIB_IPV6_AVAILABLE: cached flag, default 1 (optimistic). - mptcp_lib_check_ipv6(): looks for "mptcpv6_init(\.|$)" in /proc/kallsyms. That symbol is registered by subsys_initcall() in net/mptcp/ctrl.c only when both CONFIG_IPV6=3Dy and CONFIG_MPTCP_IPV6=3Dy, so it is a precise runtime proxy. - mptcp_lib_is_v6_enabled(): cheap accessor wrapping the flag. No existing caller is changed. Assisted-by: GLM:5.1 Z.ai Signed-off-by: Gang Yan --- .../testing/selftests/net/mptcp/mptcp_lib.sh | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/mptcp_lib.sh b/tools/testing= /selftests/net/mptcp/mptcp_lib.sh index 5ef6033775c8..67545cd70cc5 100644 --- a/tools/testing/selftests/net/mptcp/mptcp_lib.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_lib.sh @@ -32,6 +32,7 @@ MPTCP_LIB_SUBTESTS_LAST_TS_NS=3D MPTCP_LIB_TEST_COUNTER=3D0 MPTCP_LIB_TEST_FORMAT=3D"%02u %-50s" MPTCP_LIB_IP_MPTCP=3D0 +MPTCP_LIB_IPV6_AVAILABLE=3D1 =20 # only if supported (or forced) and not disabled, see no-color.org if { [ -t 1 ] || [ "${SELFTESTS_MPTCP_LIB_COLOR_FORCE:-}" =3D "1" ]; } && @@ -178,6 +179,23 @@ mptcp_lib_check_kallsyms() { fi } =20 +# Detect whether the MPTCP IPv6 subsystem is available in the running kern= el. +mptcp_lib_check_ipv6() { + if ! mptcp_lib_has_file "/proc/kallsyms"; then + MPTCP_LIB_IPV6_AVAILABLE=3D0 + return 1 + fi + + if ! grep -qE " mptcpv6_init(\.|$)" /proc/kallsyms; then + MPTCP_LIB_IPV6_AVAILABLE=3D0 + mptcp_lib_pr_skip "MPTCP IPv6 support is not available" + return 1 + fi + + MPTCP_LIB_IPV6_AVAILABLE=3D1 + return 0 +} + # Internal: use mptcp_lib_kallsyms_has() instead __mptcp_lib_kallsyms_has() { local sym=3D"${1}" @@ -398,6 +416,11 @@ mptcp_lib_is_v6() { [ -z "${1##*:*}" ] } =20 +# Returns 0 (true) if the kernel has MPTCP IPv6 support, 1 (false) otherwi= se. +mptcp_lib_is_v6_enabled() { + [ "${MPTCP_LIB_IPV6_AVAILABLE}" =3D "1" ] +} + mptcp_lib_nstat_init() { local ns=3D"${1}" =20 --=20 2.43.0 From nobody Sun Jul 5 05:52:03 2026 Received: from out-170.mta0.migadu.com (out-170.mta0.migadu.com [91.218.175.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 024D91D5ADE for ; Wed, 17 Jun 2026 14:46:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707598; cv=none; b=Au+6GjKOybGqMSTj+gEZLz6gAJ+WSACqAtbmDVUE+TkhKEmNR+9RYbKlvro0ZDQAkNJy2iwKfY7Uwsypd8rDRAQWS8gepB3oNnb86U1V2NhfU7dhnJ7dbyNm6vzzWClQ1h+8cV+x+q+uBj4mQc6kstGoRlsL0h4ULDBFTWIFY4w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707598; c=relaxed/simple; bh=I9c1mfUknIX0WCm2b/fDww+oELlKfiR8RrnfRjXc1oM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aftAR0p/agwXDhkD+57Vl1o56R/uWPTlud7rzG/hLb/Bfz1B6Doxowx1srb4rEXHFG8yu1BhEa8wmiF7/ZEIxcT7RC+SS7vkftzMZe3DclveGXhL/hzrfBbzTAMY4AWaSL7uSTOh1QeRkSyQiJgRtfsQfhiQuO9eroc1K9b64Ec= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=Z9Qm0FQw; arc=none smtp.client-ip=91.218.175.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="Z9Qm0FQw" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1781707595; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wkGwGkhf48ODkoYY7Is1VdayqvPpE1l5TX8BJN565+A=; b=Z9Qm0FQwkeYJTImkDqQOjxu1SJ6tv401VqHr52m7rVjEt6ltonDXDrGKbPXPd6Z0jhJGbs hEoTw/TVkzk4dGDMmG+viTIxOuhaKHzyrS3nFI1aCAA0mpmY0jBs+TIfmTXWewqWb4Zh93 9Pj8027KJyeZHjebLA+tmemdpCc8chE= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v2 3/9] selftests: mptcp: mptcp_connect.sh degrades to v4-only when MPTCP IPv6 is missing Date: Wed, 17 Jun 2026 22:46:10 +0800 Message-ID: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan Make the IPv6 path optional at runtime: - Right after the existing mptcp_lib_check_* calls, query the new mptcp_lib_check_ipv6() helper. If the kernel does not support MPTCP/IPv6 and the user did not already pass -4 on the command line, transparently flip the internal ${ipv6} flag to false and print one informational line so the user knows v4-only mode kicked in. - Guard every "ip -6 addr add", "ip -6 route add" and the v6 forwarding sysctl with "if $ipv6; then ... fi". The -4 command-line option (handled earlier in the same script) keeps priority: when the user explicitly asks for v4-only mode the new check is a no-op. In a fully featured kernel ${ipv6} stays true and the script behaves exactly as before. Assisted-by: GLM:5.1 Z.ai Signed-off-by: Gang Yan --- .../selftests/net/mptcp/mptcp_connect.sh | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.sh b/tools/tes= ting/selftests/net/mptcp/mptcp_connect.sh index 7a2a851fa0ad..0e5690d6f68c 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_connect.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_connect.sh @@ -149,6 +149,14 @@ mptcp_lib_check_mptcp mptcp_lib_check_kallsyms mptcp_lib_check_tools ip tc =20 +# If MPTCP IPv6 is not available in the running kernel, transparently +# downgrade to v4-only mode (unless the user already passed -4). +# This keeps v4 tests running in IPV6=3Dm / MPTCP_IPV6=3Dn kernels. +if ! mptcp_lib_check_ipv6 && ${ipv6}; then + ipv6=3Dfalse + mptcp_lib_pr_info "MPTCP IPv6 not available, running IPv4-only tests" +fi + sin=3D$(mktemp) sout=3D$(mktemp) cin=3D$(mktemp) @@ -169,41 +177,51 @@ ip link add ns2eth3 netns "$ns2" type veth peer name = ns3eth2 netns "$ns3" ip link add ns3eth4 netns "$ns3" type veth peer name ns4eth3 netns "$ns4" =20 ip -net "$ns1" addr add 10.0.1.1/24 dev ns1eth2 -ip -net "$ns1" addr add dead:beef:1::1/64 dev ns1eth2 nodad =20 ip -net "$ns1" link set ns1eth2 up ip -net "$ns1" route add default via 10.0.1.2 -ip -net "$ns1" route add default via dead:beef:1::2 =20 ip -net "$ns2" addr add 10.0.1.2/24 dev ns2eth1 -ip -net "$ns2" addr add dead:beef:1::2/64 dev ns2eth1 nodad ip -net "$ns2" link set ns2eth1 up =20 ip -net "$ns2" addr add 10.0.2.1/24 dev ns2eth3 -ip -net "$ns2" addr add dead:beef:2::1/64 dev ns2eth3 nodad ip -net "$ns2" link set ns2eth3 up ip -net "$ns2" route add default via 10.0.2.2 -ip -net "$ns2" route add default via dead:beef:2::2 ip netns exec "$ns2" sysctl -q net.ipv4.ip_forward=3D1 -ip netns exec "$ns2" sysctl -q net.ipv6.conf.all.forwarding=3D1 =20 ip -net "$ns3" addr add 10.0.2.2/24 dev ns3eth2 -ip -net "$ns3" addr add dead:beef:2::2/64 dev ns3eth2 nodad ip -net "$ns3" link set ns3eth2 up =20 ip -net "$ns3" addr add 10.0.3.2/24 dev ns3eth4 -ip -net "$ns3" addr add dead:beef:3::2/64 dev ns3eth4 nodad ip -net "$ns3" link set ns3eth4 up ip -net "$ns3" route add default via 10.0.2.1 -ip -net "$ns3" route add default via dead:beef:2::1 ip netns exec "$ns3" sysctl -q net.ipv4.ip_forward=3D1 -ip netns exec "$ns3" sysctl -q net.ipv6.conf.all.forwarding=3D1 =20 ip -net "$ns4" addr add 10.0.3.1/24 dev ns4eth3 -ip -net "$ns4" addr add dead:beef:3::1/64 dev ns4eth3 nodad ip -net "$ns4" link set ns4eth3 up ip -net "$ns4" route add default via 10.0.3.2 -ip -net "$ns4" route add default via dead:beef:3::2 + +# IPv6 topology: only configured if MPTCP IPv6 is supported by the +# running kernel (CONFIG_MPTCP_IPV6=3Dy). On a kernel without it, "ip -6 +# addr add" and the v6 forwarding sysctl would fail and abort the +# script, taking the v4 tests down with them. +if $ipv6; then + ip -net "$ns1" addr add dead:beef:1::1/64 dev ns1eth2 nodad + ip -net "$ns1" route add default via dead:beef:1::2 + + ip -net "$ns2" addr add dead:beef:1::2/64 dev ns2eth1 nodad + ip -net "$ns2" addr add dead:beef:2::1/64 dev ns2eth3 nodad + ip -net "$ns2" route add default via dead:beef:2::2 + ip netns exec "$ns2" sysctl -q net.ipv6.conf.all.forwarding=3D1 + + ip -net "$ns3" addr add dead:beef:2::2/64 dev ns3eth2 nodad + ip -net "$ns3" addr add dead:beef:3::2/64 dev ns3eth4 nodad + ip -net "$ns3" route add default via dead:beef:2::1 + ip netns exec "$ns3" sysctl -q net.ipv6.conf.all.forwarding=3D1 + + ip -net "$ns4" addr add dead:beef:3::1/64 dev ns4eth3 nodad + ip -net "$ns4" route add default via dead:beef:3::2 +fi =20 if $checksum; then for i in "$ns1" "$ns2" "$ns3" "$ns4";do --=20 2.43.0 From nobody Sun Jul 5 05:52:03 2026 Received: from out-172.mta0.migadu.com (out-172.mta0.migadu.com [91.218.175.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AA43C1D5ADE for ; Wed, 17 Jun 2026 14:46:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707600; cv=none; b=kysOLSutUGE4PjAZwsYamdXe7XaL1oWoLKIBoCejvI6RGaFlIPARKLLtNWtCpCpiisy/eI/e72zNDE88eOL78nyelU6oy966IEoYcpVsXvFRl6hjJ6eX/aStf3hAh2YMYhYC4xA79beY4qsW6o1fEb7FlcuiFd9IFpIq9C3fVIA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707600; c=relaxed/simple; bh=QYhjw/BbutWjzo0+pEM7YYnL4IWZRv52hANYJCpWPpw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aipPTMD1o+WxBlxAQ3riWFs9bPetybHUkhcCeINlbBB/lfVGHRPb4mzL0NXQuJon8bwdPm59Ss7KxrlsjQhKT0X6bLwoNl2NXHmJT1wSm2Sr3QAFCsr/77whaUUOEOtQsUDK1iHnVTxj1v5on1aJJvrT4fJPmIRdXf5i71KIBDs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=DOqTbwtY; arc=none smtp.client-ip=91.218.175.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="DOqTbwtY" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1781707597; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qKdLzQbqeINFajb+iibVD6DQwWf+FO44jmisQXV3r4E=; b=DOqTbwtYyDNMokLGqFDwTCRyBfJFXgDMHwP7TrNupufEJy1su/TnsBkTPaaWQ7CwQ1tH+X jAqjEBWwdQ9r1hwMGBnKn1jKdwBa10Oh/TjtV0nAVP1KbgCEHEwEThw+DOq/j920E007h9 xqsFEGtqbQs4n726UKprWtC70dTCr0k= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v2 4/9] selftests: mptcp: mptcp_connect.sh don't fail because of nft rules in IPV6-less kernel Date: Wed, 17 Jun 2026 22:46:11 +0800 Message-ID: <05c44c050ed5b0ab0761bd1ca5a8d277fdb9e13e.1781707101.git.yangang@kylinos.cn> In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan run_test_transparent() loads an nft "table inet mangle" ruleset to tproxy matching traffic to the listener. "table inet" requires CONFIG_NF_TABLES_IPV6, which in turn depends on CONFIG_IPV6=3Dy. In a kernel with full MPTCP IPv6 support, mptcp_lib_is_v6_enabled returns true and the original CI hard-fail behaviour is preserved (this is what makes a real "nft is broken on a full kernel" bug visible to EXPECT_ALL_FEATURES CI). In a CONFIG_IPV6=3Dm kernel the test is reported as a SKIP and mptcp_connect.sh continues with the rest of its v4 tests. Signed-off-by: Gang Yan --- tools/testing/selftests/net/mptcp/mptcp_connect.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.sh b/tools/tes= ting/selftests/net/mptcp/mptcp_connect.sh index 0e5690d6f68c..9f93924c5d91 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_connect.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_connect.sh @@ -714,7 +714,11 @@ table inet mangle { EOF then mptcp_lib_pr_skip "$msg, could not load nft ruleset" - mptcp_lib_fail_if_expected_feature "nft rules" + if mptcp_lib_is_v6_enabled; then + mptcp_lib_fail_if_expected_feature "nft rules" + else + mptcp_lib_pr_info "nft inet table needs CONFIG_IPV6=3Dy" + fi mptcp_lib_result_skip "${TEST_GROUP}" return fi --=20 2.43.0 From nobody Sun Jul 5 05:52:03 2026 Received: from out-174.mta0.migadu.com (out-174.mta0.migadu.com [91.218.175.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 78CF42E06EF for ; Wed, 17 Jun 2026 14:46:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707606; cv=none; b=bFj9JDlVQ4mUwrFyXEcC12cfwE1i0uJ8qG2tfqiqkhjc3W0Uu4Xem9p8GqYAk1bYJZZ5eUQdiuAJwqaipAhc43Vl4J+wgsaxU4MmgQzdPojXVEHJIFEBkNjO2w+FXWUGQch5bIxdcPyGZZcqysUWr3KY7ub//W5ErjdOXMt4TjM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707606; c=relaxed/simple; bh=lTM3DfL3oUhWd1RoUuzDcxm3NLsQEnFXUeEqfrwiums=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YLaI5vXDHtF+vsf5nxvdZnAKknNPfhEXfKtAv+sRHHFItjH9hyodEkrb3Q8gt0z6HBexi71vchk1ZmLrAldwZEiGi+3ixRskap0zbcl/ADmIRGZS3UiUNSPQILq0ahKxr1hv6jLGpT6THzRMenjWfg6AJxCbMMliRHtEat+Opvs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=P/UqaB++; arc=none smtp.client-ip=91.218.175.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="P/UqaB++" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1781707602; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=G8UCH6/+PGE9a8CP4RVqJStBlLndJquRmDb3vDsoN9g=; b=P/UqaB++TWxSwDuvYofJs/Ri5mbBzZEWHjZJkVWMmInrQfPhTxL8ruIF1vEGhZmCplEWMO P0Lf8BC63ClLXgxcrDZhX9eDfPmt+TYnILgteLD4c1sPAJ0zSxeu+pvHM9lynm2XudMvn+ TfxMcjtunvUDjgBdTmWOF1Y5rjqejLQ= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v2 5/9] selftests: mptcp: mptcp_sockopt.sh skips v6 paths when MPTCP IPv6 is missing Date: Wed, 17 Jun 2026 22:46:12 +0800 Message-ID: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan Confine all of ipv6-related commands to mptcp_lib_is_v6_enabled: - call mptcp_lib_check_ipv6() once after the existing init-time mptcp_lib_check_*() calls to populate the cached flag; - guard the ip6tables loop in add_mark_rules() and every v6 "ip addr add" / mptcp_lib_pm_nl_add_endpoint() in init(); - in do_mptcp_sockopt_tests(), do_tcpinq_tests() and the top-level run_tests dispatcher, emit a SKIP TAP line for each v6 subtest instead of running it. v4 transfers, v4 mark checks and the AF_INET sockopt / TCP_INQ tests are untouched. In a full-featured kernel the new guards always take their v6 branch and the test set runs as before. Assisted-by: GLM:5.1 Z.ai Signed-off-by: Gang Yan --- .../selftests/net/mptcp/mptcp_sockopt.sh | 94 +++++++++++++++---- 1 file changed, 75 insertions(+), 19 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/tes= ting/selftests/net/mptcp/mptcp_sockopt.sh index e850a87429b6..ae7776b17c33 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh @@ -50,7 +50,7 @@ add_mark_rules() local m=3D$2 =20 local t - for t in ${iptables} ${ip6tables}; do + for t in ${iptables}; do # just to debug: check we have multiple subflows connection requests ip netns exec $ns $t -A OUTPUT -p tcp --syn -m mark --mark $m -j ACCEPT =20 @@ -60,6 +60,21 @@ add_mark_rules() ip netns exec $ns $t -A OUTPUT -p tcp -m mark --mark $m -j ACCEPT ip netns exec $ns $t -A OUTPUT -p tcp -m mark --mark 0 -j DROP done + # ip6tables rules require MPTCP IPv6 support in the kernel, otherwise + # ip6tables will reject them (or, in some environments, the binary itself + # may behave oddly without IPv6 available). + if mptcp_lib_is_v6_enabled; then + for t in ${ip6tables}; do + # just to debug: check we have multiple subflows connection requests + ip netns exec $ns $t -A OUTPUT -p tcp --syn -m mark --mark $m -j ACCEPT + + # RST packets might be handled by a internal dummy socket + ip netns exec $ns $t -A OUTPUT -p tcp --tcp-flags RST RST -m mark --mar= k 0 -j ACCEPT + + ip netns exec $ns $t -A OUTPUT -p tcp -m mark --mark $m -j ACCEPT + ip netns exec $ns $t -A OUTPUT -p tcp -m mark --mark 0 -j DROP + done + fi } =20 init() @@ -70,21 +85,29 @@ init() for i in $(seq 1 4); do ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$n= s2" ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i - ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad + if mptcp_lib_is_v6_enabled; then + ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad + fi ip -net "$ns1" link set ns1eth$i up =20 ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i - ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad + if mptcp_lib_is_v6_enabled; then + ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad + fi ip -net "$ns2" link set ns2eth$i up =20 # let $ns2 reach any $ns1 address from any interface ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i =20 mptcp_lib_pm_nl_add_endpoint "${ns1}" "10.0.${i}.1" flags signal - mptcp_lib_pm_nl_add_endpoint "${ns1}" "dead:beef:${i}::1" flags signal + if mptcp_lib_is_v6_enabled; then + mptcp_lib_pm_nl_add_endpoint "${ns1}" "dead:beef:${i}::1" flags signal + fi =20 mptcp_lib_pm_nl_add_endpoint "${ns2}" "10.0.${i}.2" flags signal - mptcp_lib_pm_nl_add_endpoint "${ns2}" "dead:beef:${i}::2" flags signal + if mptcp_lib_is_v6_enabled; then + mptcp_lib_pm_nl_add_endpoint "${ns2}" "dead:beef:${i}::2" flags signal + fi done =20 mptcp_lib_pm_nl_set_limits "${ns1}" 8 8 @@ -106,6 +129,7 @@ cleanup() mptcp_lib_check_mptcp mptcp_lib_check_kallsyms mptcp_lib_check_tools ip "${iptables}" "${ip6tables}" +mptcp_lib_check_ipv6 =20 check_mark() { @@ -164,6 +188,20 @@ do_transfer() ip=3Dipv4 fi =20 + # Skip v6 subtests when the running kernel has no MPTCP IPv6 support. + # Reuses the same ${ip}/${ip:2} naming as the normal path below so the + # console counter (MPTCP_LIB_TEST_COUNTER, bumped by print_title) and + # the TAP index (bumped by mptcp_lib_result_skip) stay in lock-step. + if [ "${ip}" =3D "ipv6" ] && ! mptcp_lib_is_v6_enabled; then + print_title "Transfer ${ip:2}" + mptcp_lib_pr_skip "MPTCP IPv6 not available" + mptcp_lib_result_skip "transfer ${ip}" + print_title "Mark ${ip:2}" + mptcp_lib_pr_skip "MPTCP IPv6 not available" + mptcp_lib_result_skip "mark ${ip}" + return 0 + fi + cmsg=3D"TIMESTAMPNS" if mptcp_lib_kallsyms_has "mptcp_ioctl$"; then cmsg+=3D",TCPINQ" @@ -274,18 +312,23 @@ do_mptcp_sockopt_tests() mptcp_lib_pr_ok mptcp_lib_result_pass "sockopt v4" =20 - ip netns exec "$ns_sbox" ./mptcp_sockopt -6 - lret=3D$? - print_title "SOL_MPTCP sockopt v6" - if [ $lret -ne 0 ]; then - mptcp_lib_pr_fail - mptcp_lib_result_fail "sockopt v6" - ret=3D$lret - return + if ! mptcp_lib_is_v6_enabled; then + mptcp_lib_pr_skip "MPTCP IPv6 not available" + mptcp_lib_result_skip "sockopt v6" + else + ip netns exec "$ns_sbox" ./mptcp_sockopt -6 + lret=3D$? + + if [ $lret -ne 0 ]; then + mptcp_lib_pr_fail + mptcp_lib_result_fail "sockopt v6" + ret=3D$lret + return + fi + mptcp_lib_pr_ok + mptcp_lib_result_pass "sockopt v6" fi - mptcp_lib_pr_ok - mptcp_lib_result_pass "sockopt v6" } =20 run_tests() @@ -308,6 +351,13 @@ run_tests() do_tcpinq_test() { print_title "TCP_INQ cmsg/ioctl $*" + + if [ "${1}" =3D "-6" ] && ! mptcp_lib_is_v6_enabled; then + mptcp_lib_pr_skip "MPTCP IPv6 not available" + mptcp_lib_result_skip "TCP_INQ: $*" + return 0 + fi + ip netns exec "$ns_sbox" ./mptcp_inq "$@" local lret=3D$? if [ $lret -ne 0 ];then @@ -339,10 +389,16 @@ do_tcpinq_tests() if [ $lret -ne 0 ] ; then return $lret fi - do_tcpinq_test -6 $args - lret=3D$? - if [ $lret -ne 0 ] ; then - return $lret + if mptcp_lib_is_v6_enabled; then + do_tcpinq_test -6 $args + lret=3D$? + if [ $lret -ne 0 ] ; then + return $lret + fi + else + print_title "TCP_INQ cmsg/ioctl -6 $args" + mptcp_lib_pr_skip "MPTCP IPv6 not available" + mptcp_lib_result_skip "TCP_INQ: -6 $args" fi done =20 --=20 2.43.0 From nobody Sun Jul 5 05:52:03 2026 Received: from out-184.mta0.migadu.com (out-184.mta0.migadu.com [91.218.175.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3A0FE259C82 for ; Wed, 17 Jun 2026 14:46:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.184 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707611; cv=none; b=H49K1ZBE2LORsw/grtLnqYwYSX7KFUTHcNN7Oy3iiTtJjLrDXMkbmojBhhaHwUMbSYEU9Yb0kK33xU7NraOqAnxt9uMnLV0N82NYOkzwAfi223hl35P9biuTDQmk6XDvLWe5j9IGKfJ5uuB9UTwx1B56Vi+zp4JGkpO3nS+hBBo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707611; c=relaxed/simple; bh=FF4d0j9OfSIaqr0YAjW6J0dX7/TDLI9R/YbWQqsuDkM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EDUI8tQ8T05nGLZVVEycmNXLxIT7SwMP/dWNV4B3WHVQg56bqc+flpC8O9iUFMtlhwASqqZfMPfqYapNbXDsrEAhLzLv0TG4ZsLbgjR2RcqOSP10jLElQbRL8ANirNmfWPOPID5cpYdczB/U8jlylJsmZcRbLgOPixOvypf6qtE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=sgpJNEu6; arc=none smtp.client-ip=91.218.175.184 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="sgpJNEu6" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1781707606; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RGLvp62Fftnws7EJ9+10vqfFfYuGZbUiNpDY85REsDU=; b=sgpJNEu6FA6sCasmQucA2OLQnKBaK5PSpSzUQ/Q6owK+gdqXhJdje9zvSBwWpZaeynaudb 5GQGhymr+SWm1x3IPYyDC9B//V3BrrlPz1wiDFHJdYgHxnBanORkN4yDYuTL3X7LZQPSI1 wK6EL0GlhG8v3t8S6M8pGSqxSfDLgJA= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v2 6/9] selftests: mptcp: simult_flows.sh skips v6 setup when MPTCP IPv6 is missing Date: Wed, 17 Jun 2026 22:46:13 +0800 Message-ID: <5cb4514f9496d810a265c877828b318cfdce97c5.1781707101.git.yangang@kylinos.cn> In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan On a CONFIG_IPV6=3Dm kernel (which forces CONFIG_MPTCP_IPV6=3Dn) every v6 setup step errors out, setup() exits non-zero and all subtests report spurious failures. Call mptcp_lib_check_ipv6() at script init, then collect the entire v6 setup into a single "if mptcp_lib_is_v6_enabled; then ... fi" block at the end of setup(). v4 topology and run_test invocations are untouched; in a full-featured kernel the block is always taken and the script runs as before. Assisted-by: GLM:5.1 Z.ai Signed-off-by: Gang Yan --- .../selftests/net/mptcp/simult_flows.sh | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/simult_flows.sh b/tools/test= ing/selftests/net/mptcp/simult_flows.sh index 3ea3d1efe32e..07caa34ef191 100755 --- a/tools/testing/selftests/net/mptcp/simult_flows.sh +++ b/tools/testing/selftests/net/mptcp/simult_flows.sh @@ -48,6 +48,7 @@ cleanup() =20 mptcp_lib_check_mptcp mptcp_lib_check_tools ip tc +mptcp_lib_check_ipv6 =20 # "$ns1" ns2 ns3 # ns1eth1 ns2eth1 ns2eth3 ns3eth1 @@ -81,39 +82,46 @@ setup() ip link add ns2eth3 netns "$ns2" type veth peer name ns3eth1 netns "$ns3" =20 ip -net "$ns1" addr add 10.0.1.1/24 dev ns1eth1 - ip -net "$ns1" addr add dead:beef:1::1/64 dev ns1eth1 nodad ip -net "$ns1" link set ns1eth1 up mtu 1500 gso_max_segs 0 ip -net "$ns1" route add default via 10.0.1.2 - ip -net "$ns1" route add default via dead:beef:1::2 =20 ip -net "$ns1" addr add 10.0.2.1/24 dev ns1eth2 - ip -net "$ns1" addr add dead:beef:2::1/64 dev ns1eth2 nodad ip -net "$ns1" link set ns1eth2 up mtu 1500 gso_max_segs 0 ip -net "$ns1" route add default via 10.0.2.2 metric 101 - ip -net "$ns1" route add default via dead:beef:2::2 metric 101 =20 mptcp_lib_pm_nl_set_limits "${ns1}" 1 1 mptcp_lib_pm_nl_add_endpoint "${ns1}" 10.0.2.1 dev ns1eth2 flags subflow =20 ip -net "$ns2" addr add 10.0.1.2/24 dev ns2eth1 - ip -net "$ns2" addr add dead:beef:1::2/64 dev ns2eth1 nodad ip -net "$ns2" link set ns2eth1 up mtu 1500 gso_max_segs 0 =20 ip -net "$ns2" addr add 10.0.2.2/24 dev ns2eth2 - ip -net "$ns2" addr add dead:beef:2::2/64 dev ns2eth2 nodad ip -net "$ns2" link set ns2eth2 up mtu 1500 gso_max_segs 0 =20 ip -net "$ns2" addr add 10.0.3.2/24 dev ns2eth3 - ip -net "$ns2" addr add dead:beef:3::2/64 dev ns2eth3 nodad ip -net "$ns2" link set ns2eth3 up mtu 1500 gso_max_segs 0 ip netns exec "$ns2" sysctl -q net.ipv4.ip_forward=3D1 - ip netns exec "$ns2" sysctl -q net.ipv6.conf.all.forwarding=3D1 =20 ip -net "$ns3" addr add 10.0.3.3/24 dev ns3eth1 - ip -net "$ns3" addr add dead:beef:3::3/64 dev ns3eth1 nodad ip -net "$ns3" link set ns3eth1 up mtu 1500 gso_max_segs 0 ip -net "$ns3" route add default via 10.0.3.2 - ip -net "$ns3" route add default via dead:beef:3::2 + + # IPv6 topology: only configured if MPTCP IPv6 is supported by the + # running kernel (CONFIG_MPTCP_IPV6=3Dy). + if mptcp_lib_is_v6_enabled; then + ip -net "$ns1" addr add dead:beef:1::1/64 dev ns1eth1 nodad + ip -net "$ns1" route add default via dead:beef:1::2 + ip -net "$ns1" addr add dead:beef:2::1/64 dev ns1eth2 nodad + ip -net "$ns1" route add default via dead:beef:2::2 metric 101 + + ip -net "$ns2" addr add dead:beef:1::2/64 dev ns2eth1 nodad + ip -net "$ns2" addr add dead:beef:2::2/64 dev ns2eth2 nodad + ip -net "$ns2" addr add dead:beef:3::2/64 dev ns2eth3 nodad + ip netns exec "$ns2" sysctl -q net.ipv6.conf.all.forwarding=3D1 + + ip -net "$ns3" addr add dead:beef:3::3/64 dev ns3eth1 nodad + ip -net "$ns3" route add default via dead:beef:3::2 + fi =20 mptcp_lib_pm_nl_set_limits "${ns3}" 1 1 =20 --=20 2.43.0 From nobody Sun Jul 5 05:52:03 2026 Received: from out-184.mta0.migadu.com (out-184.mta0.migadu.com [91.218.175.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 92DF7449EC2 for ; Wed, 17 Jun 2026 14:46:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.184 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707617; cv=none; b=j5C/5d4v68m6+hqJ0RUAbaBfvbKR2qx9o5I9mil6B3hiIU2Mbexp3FN8nUB5bgWJ8fijUewT9mkFqTL8KTZAwTvJ/Hr1TNF3Weh0N+CV0zbkx36E5lsUBtFUVvVj8aXDMkz9f+eB3LMHc0IC8lwOQqv2lgaCgOSNg9IGPj2qLk0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707617; c=relaxed/simple; bh=aQoKz+CskS08sa9eYpWRhiJYleQKVb6RQ4Lcvlv7DBU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=KlLUOitx3Bc8yL0X4KBQREi9TXkoYEdj/+0QKly2O3p5sic1Xf1UUZ/mRdd0VxY18ikQyDppbWtTpxxqVitEGVNP83BkTUqFE136EAcg3ZkcozkF18CNcD9HVX9usuaspQNZ+hL8ASiYQsUYvrd8259UFcc+Q3OryfMevykSNjk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=KcihYzsj; arc=none smtp.client-ip=91.218.175.184 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="KcihYzsj" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1781707612; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4pZLxsmq+aJt6EP95KFc25HA6t9bAu1d+8Dpc+32FMY=; b=KcihYzsj/VEmI6aoEXZKVLIOnbAYcUcEsN9iwNOZ/ZmKg7cNRNAaIigTcSs6EerlQET8Ky LkAr/RndBKK25Z88olAi3NQ55T2lIF38a8S/Oun6pxEkB9jxpkghdt6bLKzlWwu5ykVXFj j27mzDRzn/D0Krjz/9vITZVUzt1zJGs= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v2 7/9] selftests: mptcp: mptcp_join.sh: pick v4 bind default when MPTCP IPv6 is missing Date: Wed, 17 Jun 2026 22:46:14 +0800 Message-ID: <728b4ff36484969dcc969178db304af1f6111796.1781707101.git.yangang@kylinos.cn> In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT From: Gang Yan do_transfer() defaults bind_addr to "::", and mptcp_connect.c auto-selects the protocol family from the bind string (a ':' forces AF_INET6). On a kernel without CONFIG_MPTCP_IPV6 the listener becomes socket(AF_INET6, SOCK_STREAM, IPPROTO_MPTCP), which the kernel rejects with -EAFNOSUPPORT and every subtest that does not override bind_addr reports "client exit code 2, server 1" =E2=80=94 starting with "001 no JOIN= " =E2=80=94 even though nothing v6-specific is being tested. Pick the default from the mptcp_lib_is_v6_enabled flag when v6 is available, "0.0.0.0" otherwise. Callers that explicitly set bind_addr are unaffected. Assisted-by: GLM:5.1 Z.ai Signed-off-by: Gang Yan --- tools/testing/selftests/net/mptcp/mptcp_join.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testin= g/selftests/net/mptcp/mptcp_join.sh index 550a6b6117a9..26fb5e433384 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh @@ -1004,7 +1004,14 @@ do_transfer() local FAILING_LINKS=3D${FAILING_LINKS:-""} local fastclose=3D${fastclose:-""} local speed=3D${speed:-"fast"} - local bind_addr=3D${bind_addr:-"::"} + local bind_addr=3D${bind_addr:-} + if [ -z "${bind_addr}" ]; then + if mptcp_lib_is_v6_enabled; then + bind_addr=3D"::" + else + bind_addr=3D"0.0.0.0" + fi + fi local listener_in=3D"${sin}" local connector_in=3D"${cin}" port=3D$(get_port) --=20 2.43.0 From nobody Sun Jul 5 05:52:03 2026 Received: from out-185.mta0.migadu.com (out-185.mta0.migadu.com [91.218.175.185]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5D8A544BC82 for ; Wed, 17 Jun 2026 14:46:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.185 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707621; cv=none; b=OvCME3uqVkoqrPSCvqvggk5YnasD0Dsm1qyWeoihOeUcpKluoT1cB8MeeLTkJI4/prgpZufvvZx0MnogvSq6wQSxwMMHOoKXanlADziryCxd7m6EobDNfPTp0N14UorrTCACnTm5bibkYr2GHfkhzLHQmL6SirwsA8EA7MHT4BY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707621; c=relaxed/simple; bh=VyYRpUHaIpvsBj5mdIpC874ih3bjUuaF2bafTYHo3jU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ur4pCrM41CvCnWa82X6h+ZzehDLvdKOuoKzjvOTl1rEByPMRF6qw6Y274WG7u+EnVqyLij2d8j0S9pDhZ9PruaX2tgIJKBxB7ZmLdAB6VE46RutqREEuNyEXvZpVifwafs/+xdxsfzsP7tcIPGOxUTkbB6hyaUaxskLDFJWrh+o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=TN3z7iHs; arc=none smtp.client-ip=91.218.175.185 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="TN3z7iHs" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1781707614; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OiiFqevuOCRUrCsCr0zChZy/RosJQh8zITH0hfwZ2XA=; b=TN3z7iHsBskc3eshkyYfe0KjrLubgpQArGiNi6bqLWiP0AXVFP/cqGJisHxzA4JnNSZ+xW gVduK/cFa9yGv3TvAiDYkuNiMYAAvIXvpGl4TN+M+RfBYqYV/yvJMG0sbFcl5+15PkXio2 iY2FVILrVYCKysCkjEAfTMwRkB3EPGQ= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v2 8/9] selftests: mptcp: mptcp_join.sh skips v6 subtests when MPTCP IPv6 is missing Date: Wed, 17 Jun 2026 22:46:15 +0800 Message-ID: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan mptcp_join.sh configures dedicated dead:beef:*::1/2 IPv6 addresses and IPv6 default routes inside init_partial(). A large number of subtest groups rely on IPv6 or IPv4-mapped IPv6 endpoints: ipv6_tests, v4mapped_tests, mixed_tests, add_addr_timeout_tests, laminar_endp_tests, plus one v4-mapped case in userspace_tests. All these IPv6-related routines fail on kernels built with CONFIG_IPV6=3Dm, which implicitly disables CONFIG_MPTCP_IPV6. This patch adds a helper named 'skip_if' which doesn't call mptcp_lib_fail_if_expected_feature, and can be used for guarding the v6 subtests in userspace_tests. Assisted-by: GLM:5.1 Z.ai Signed-off-by: Gang Yan --- .../testing/selftests/net/mptcp/mptcp_join.sh | 102 +++++++++++++----- 1 file changed, 78 insertions(+), 24 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testin= g/selftests/net/mptcp/mptcp_join.sh index 26fb5e433384..f8ba4677740a 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh @@ -154,16 +154,22 @@ init_partial() for i in $(seq 1 "${ifaces_nr:-4}"); do ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$n= s2" ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i - ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad + if mptcp_lib_is_v6_enabled; then + ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad + fi ip -net "$ns1" link set ns1eth$i up =20 ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i - ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad + if mptcp_lib_is_v6_enabled; then + ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad + fi ip -net "$ns2" link set ns2eth$i up =20 # let $ns2 reach any $ns1 address from any interface ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i - ip -net "$ns2" route add default via dead:beef:$i::1 dev ns2eth$i metric= 10$i + if mptcp_lib_is_v6_enabled; then + ip -net "$ns2" route add default via dead:beef:$i::1 dev ns2eth$i metri= c 10$i + fi done } =20 @@ -281,6 +287,19 @@ continue_if() fi } =20 +# $@: condition +# Like continue_if(), but the skip is unconditional: it never calls +# mptcp_lib_fail_if_expected_feature(). +skip_if() +{ + if ! "${@}"; then + print_check "MPTCP IPv6 support is not available" + print_skip + last_test_skipped=3D1 + return 1 + fi +} + skip_test() { if [ "${#only_tests_ids[@]}" -eq 0 ] && [ "${#only_tests_names[@]}" -eq 0= ]; then @@ -379,6 +398,9 @@ reset_with_add_addr_timeout() =20 tables=3D"${iptables}" if [ $ip -eq 6 ]; then + if ! mptcp_lib_is_v6_enabled; then + return 0 + fi tables=3D"${ip6tables}" fi =20 @@ -2396,6 +2418,7 @@ laminar_endp_tests() =20 # laminar endpoints: these endpoints are used if reset_with_tcp_filter "with multiple laminar endpoints" ns1 10.0.2.2 R= EJECT && + skip_if mptcp_lib_is_v6_enabled && continue_if mptcp_lib_kallsyms_has "mptcp_pm_get_endp_laminar_max$"; t= hen pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns2 2 2 @@ -2538,7 +2561,8 @@ add_addr_timeout_tests() fi =20 # add_addr timeout IPv6 - if reset_with_add_addr_timeout "signal address, ADD_ADDR6 timeout" 6; then + if reset_with_add_addr_timeout "signal address, ADD_ADDR6 timeout" 6 && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 1 1 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal @@ -2818,7 +2842,8 @@ add_tests() fi =20 # add multiple subflows IPv6 - if reset "add multiple subflows IPv6"; then + if reset "add multiple subflows IPv6" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns2 0 2 addr_nr_ns2=3D2 speed=3Dslow cestab_ns2=3D1 \ @@ -2828,7 +2853,8 @@ add_tests() fi =20 # add multiple addresses IPv6 - if reset "add multiple addresses IPv6"; then + if reset "add multiple addresses IPv6" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns2 2 2 addr_nr_ns1=3D2 speed=3Dslow cestab_ns1=3D1 \ @@ -2842,7 +2868,8 @@ add_tests() ipv6_tests() { # subflow IPv6 - if reset "single subflow IPv6"; then + if reset "single subflow IPv6" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 0 1 pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow @@ -2852,7 +2879,8 @@ ipv6_tests() fi =20 # add_address, unused IPv6 - if reset "unused signal address IPv6"; then + if reset "unused signal address IPv6" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal speed=3Dslow \ run_tests $ns1 $ns2 dead:beef:1::1 @@ -2861,7 +2889,8 @@ ipv6_tests() fi =20 # signal address IPv6 - if reset "single address IPv6"; then + if reset "single address IPv6" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 1 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal pm_nl_set_limits $ns2 1 1 @@ -2872,7 +2901,8 @@ ipv6_tests() fi =20 # single address IPv6, remove - if reset "remove single address IPv6"; then + if reset "remove single address IPv6" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 1 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal pm_nl_set_limits $ns2 1 1 @@ -2884,7 +2914,8 @@ ipv6_tests() fi =20 # subflow and signal IPv6, remove - if reset "remove subflow and signal IPv6"; then + if reset "remove subflow and signal IPv6" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 2 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal pm_nl_set_limits $ns2 1 2 @@ -2900,7 +2931,8 @@ ipv6_tests() v4mapped_tests() { # subflow IPv4-mapped to IPv4-mapped - if reset "single subflow IPv4-mapped"; then + if reset "single subflow IPv4-mapped" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 0 1 pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow @@ -2909,7 +2941,8 @@ v4mapped_tests() fi =20 # signal address IPv4-mapped with IPv4-mapped sk - if reset "signal address IPv4-mapped"; then + if reset "signal address IPv4-mapped" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 1 1 pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal @@ -2919,7 +2952,8 @@ v4mapped_tests() fi =20 # subflow v4-map-v6 - if reset "single subflow v4-map-v6"; then + if reset "single subflow v4-map-v6" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 0 1 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow @@ -2928,7 +2962,8 @@ v4mapped_tests() fi =20 # signal address v4-map-v6 - if reset "signal address v4-map-v6"; then + if reset "signal address v4-map-v6" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 1 1 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal @@ -2938,7 +2973,8 @@ v4mapped_tests() fi =20 # subflow v6-map-v4 - if reset "single subflow v6-map-v4"; then + if reset "single subflow v6-map-v4" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 0 1 pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow @@ -2947,7 +2983,8 @@ v4mapped_tests() fi =20 # signal address v6-map-v4 - if reset "signal address v6-map-v4"; then + if reset "signal address v6-map-v4" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 1 1 pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal @@ -2957,7 +2994,8 @@ v4mapped_tests() fi =20 # no subflow IPv6 to v4 address - if reset "no JOIN with diff families v4-v6"; then + if reset "no JOIN with diff families v4-v6" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 0 1 pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow @@ -2966,7 +3004,8 @@ v4mapped_tests() fi =20 # no subflow IPv6 to v4 address even if v6 has a valid v4 at the end - if reset "no JOIN with diff families v4-v6-2"; then + if reset "no JOIN with diff families v4-v6-2" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 0 1 pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow @@ -2975,7 +3014,8 @@ v4mapped_tests() fi =20 # no subflow IPv4 to v6 address, no need to slow down too then - if reset "no JOIN with diff families v6-v4"; then + if reset "no JOIN with diff families v6-v4" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 0 1 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow @@ -2987,6 +3027,7 @@ v4mapped_tests() mixed_tests() { if reset "IPv4 sockets do not use IPv6 addresses" && + skip_if mptcp_lib_is_v6_enabled && continue_if mptcp_lib_kversion_ge 6.3; then pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 1 1 @@ -2998,6 +3039,7 @@ mixed_tests() =20 # Need an IPv6 mptcp socket to allow subflows of both families if reset "simult IPv4 and IPv6 subflows" && + skip_if mptcp_lib_is_v6_enabled && continue_if mptcp_lib_kversion_ge 6.3; then pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 1 1 @@ -3009,6 +3051,7 @@ mixed_tests() =20 # cross families subflows will not be created even in fullmesh mode if reset "simult IPv4 and IPv6 subflows, fullmesh 1x1" && + skip_if mptcp_lib_is_v6_enabled && continue_if mptcp_lib_kversion_ge 6.3; then pm_nl_set_limits $ns1 0 4 pm_nl_set_limits $ns2 1 4 @@ -3026,6 +3069,7 @@ mixed_tests() # fullmesh still tries to create all the possibly subflows with # matching family if reset "simult IPv4 and IPv6 subflows, fullmesh 2x2" && + skip_if mptcp_lib_is_v6_enabled && continue_if mptcp_lib_kversion_ge 6.3; then pm_nl_set_limits $ns1 0 4 pm_nl_set_limits $ns2 2 4 @@ -3207,6 +3251,7 @@ add_addr_ports_tests() =20 # signal address v6 with port if reset "signal address v6 with port" && + skip_if mptcp_lib_is_v6_enabled && continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/add_addr_v6_port_d= rop_ts'; then pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 1 1 @@ -3312,7 +3357,8 @@ add_addr_ports_tests() fi =20 # first signal address drops, second one still progresses - if reset "signal addr list progresses after tx drop"; then + if reset "signal addr list progresses after tx drop" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns2 1 0 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_v6_port_drop_ts=3D0 2>/d= ev/null || true @@ -3342,7 +3388,8 @@ bind_tests() fi =20 # bind to one address should not allow extra subflows to other addresses - if reset "bind main address v6, no join v6"; then + if reset "bind main address v6, no join v6" && + skip_if mptcp_lib_is_v6_enabled; then pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns2 2 2 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal @@ -3376,7 +3423,8 @@ bind_tests() fi =20 # multiple binds to allow extra subflows to other addresses - if reset "multiple bind to allow joins v6"; then + if reset "multiple bind to allow joins v6" && + skip_if mptcp_lib_is_v6_enabled; then local extra_bind =20 pm_nl_set_limits $ns1 0 2 @@ -3398,7 +3446,8 @@ bind_tests() fi =20 # multiple binds to allow extra subflows to other addresses: v6 LL case - if reset "multiple bind to allow joins v6 link-local routing"; then + if reset "multiple bind to allow joins v6 link-local routing" && + skip_if mptcp_lib_is_v6_enabled; then local extra_bind ns1ll1 ns1ll2 =20 ns1ll1=3D"$(get_ll_addr $ns1 ns1eth1)" @@ -3427,6 +3476,7 @@ bind_tests() =20 # multiple binds to allow extra subflows to v6 LL addresses: laminar if reset "multiple bind to allow joins v6 link-local laminar" && + skip_if mptcp_lib_is_v6_enabled && continue_if mptcp_lib_kallsyms_has "mptcp_pm_get_endp_laminar_max$"; t= hen local extra_bind ns1ll1 ns1ll2 ns2ll2 =20 @@ -4072,7 +4122,10 @@ userspace_tests() fi =20 # userspace pm add & remove address + # The test uses the v4-mapped address "::ffff:10.0.2.1" in + # userspace_pm_rm_sf, which requires CONFIG_MPTCP_IPV6=3Dy in the kernel. if reset_with_events "userspace pm add & remove address" && + skip_if mptcp_lib_is_v6_enabled && continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then set_userspace_pm $ns1 pm_nl_set_limits $ns2 2 2 @@ -4584,6 +4637,7 @@ if [ ${#tests[@]} -eq 0 ]; then tests=3D("${all_tests_names[@]}") fi =20 +mptcp_lib_check_ipv6 mptcp_lib_subtests_last_ts_reset for subtests in "${tests[@]}"; do "${subtests}" --=20 2.43.0 From nobody Sun Jul 5 05:52:03 2026 Received: from out-177.mta0.migadu.com (out-177.mta0.migadu.com [91.218.175.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 219B644E049 for ; Wed, 17 Jun 2026 14:47:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707631; cv=none; b=FI2G5Std9WSqzsJgbWMoko42v7+YXhHlZQNBL8v/VUKoCb90xSba0TgYubfWaGKNQ23bqEKAzEi7/ts7rHpR0zH5MffnQNsurf8wBziCwLe+aq6N21ywK+jkC/q3I8pHompNispERLr5Uhju0nsejbLC+Pfhe8EWg6VG8y6B9dE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781707631; c=relaxed/simple; bh=lOMlQmL0dAx3NiXg85QwLb254phiDReQpuE4KJs+/bo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=HQ9VRfJ8Iyj7XWJkZpNymgdldJcvIW8FKrI4NfU27lr9TXlE4frkSSXRAv+f+k363OBRl6l7fDGHzoLvwvoHxtTvaUY6r/lflwgBMYQLJ7Di0LVC7dPixtCLfH3yPHwAKaQiVkCjfyc4wLZdFpsUxQdzkUmjfDCYpwuQ4eEj6qc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=X4neUvQl; arc=none smtp.client-ip=91.218.175.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="X4neUvQl" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1781707621; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pe5YYoD6Fg90VeZo1zk5teJ0cgyxsSuMrjMzTwZq540=; b=X4neUvQlvb80OPZ51H5VzLq8dwHY+Tv3i3PmfODY8EOsBy+QEP8vi4r/Tn+U7ZZqW7U0Ah Yis/BH2NYFuzCYyItAPoo/iR/gxAUdXzIjz9xOrCn61vmsRk8C83UovXCZqhlYqw6eQRqq At5iS1UrQvmyAZfIgui/bPs+nxK9S40= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v2 9/9] selftests: mptcp: userspace_pm.sh skips v6 paths when MPTCP IPv6 is missing Date: Wed, 17 Jun 2026 22:46:16 +0800 Message-ID: <08a86e9d1eedf80576d791c03165f772db5eca11.1781707101.git.yangang@kylinos.cn> In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT From: Gang Yan Call mptcp_lib_check_ipv6() at script init, then guard every v6 step =E2=80=94 the init-time dead:beef:* assignments, the v6 PM sequences inside test_announce()/test_remove()/test_subflows(), and the top-level make_connection "v6" / test_subflows_v4_v6_mix() calls =E2=80=94 with mptcp_lib_is_v6_enabled. Each v6-only subtest emits a SKIP TAP line under its existing name when v6 is unavailable. v4 paths and the pass/fail behaviour on a full-featured kernel are unchanged. Assisted-by: GLM:5.1 Z.ai Signed-off-by: Gang Yan --- .../selftests/net/mptcp/userspace_pm.sh | 257 ++++++++++-------- 1 file changed, 151 insertions(+), 106 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/userspace_pm.sh b/tools/test= ing/selftests/net/mptcp/userspace_pm.sh index e9ae1806ab07..c0d68a1620b0 100755 --- a/tools/testing/selftests/net/mptcp/userspace_pm.sh +++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh @@ -18,6 +18,7 @@ if ! mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; th= en exit ${KSFT_SKIP} fi mptcp_lib_check_tools ip +mptcp_lib_check_ipv6 =20 ANNOUNCED=3D${MPTCP_LIB_EVENT_ANNOUNCED} REMOVED=3D${MPTCP_LIB_EVENT_REMOVED} @@ -159,14 +160,18 @@ ip link add ns1eth2 netns "$ns1" type veth peer name = ns2eth1 netns "$ns2" # Add IPv4/v6 addresses to the namespaces ip -net "$ns1" addr add 10.0.1.1/24 dev ns1eth2 ip -net "$ns1" addr add 10.0.2.1/24 dev ns1eth2 -ip -net "$ns1" addr add dead:beef:1::1/64 dev ns1eth2 nodad -ip -net "$ns1" addr add dead:beef:2::1/64 dev ns1eth2 nodad +if mptcp_lib_is_v6_enabled; then + ip -net "$ns1" addr add dead:beef:1::1/64 dev ns1eth2 nodad + ip -net "$ns1" addr add dead:beef:2::1/64 dev ns1eth2 nodad +fi ip -net "$ns1" link set ns1eth2 up =20 ip -net "$ns2" addr add 10.0.1.2/24 dev ns2eth1 ip -net "$ns2" addr add 10.0.2.2/24 dev ns2eth1 -ip -net "$ns2" addr add dead:beef:1::2/64 dev ns2eth1 nodad -ip -net "$ns2" addr add dead:beef:2::2/64 dev ns2eth1 nodad +if mptcp_lib_is_v6_enabled; then + ip -net "$ns2" addr add dead:beef:1::2/64 dev ns2eth1 nodad + ip -net "$ns2" addr add dead:beef:2::2/64 dev ns2eth1 nodad +fi ip -net "$ns2" link set ns2eth1 up =20 file=3D$(mktemp) @@ -344,13 +349,18 @@ test_announce() "$client4_port" =20 # ADD_ADDR6 from the client to server machine reusing the subflow port - :>"$server_evts" - ip netns exec "$ns2" ./pm_nl_ctl ann\ - dead:beef:2::2 token "$client6_token" id $client_addr_id dev ns2eth1 - print_test "ADD_ADDR6 id:client dead:beef:2::2 (ns2) =3D> ns1, reuse port" - sleep 0.5 - verify_announce_event "$server_evts" "$ANNOUNCED" "$server6_token" "dead:= beef:2::2"\ - "$client_addr_id" "$client6_port" "v6" + if mptcp_lib_is_v6_enabled; then + :>"$server_evts" + ip netns exec "$ns2" ./pm_nl_ctl ann\ + dead:beef:2::2 token "$client6_token" id $client_addr_id dev ns2eth1 + print_test "ADD_ADDR6 id:client dead:beef:2::2 (ns2) =3D> ns1, reuse por= t" + sleep 0.5 + verify_announce_event "$server_evts" "$ANNOUNCED" "$server6_token" "dead= :beef:2::2"\ + "$client_addr_id" "$client6_port" "v6" + else + print_test "ADD_ADDR6 id:client dead:beef:2::2 (ns2) =3D> ns1, reuse por= t" + test_skip + fi =20 # ADD_ADDR from the client to server machine using a new port :>"$server_evts" @@ -374,13 +384,18 @@ test_announce() "$server_addr_id" "$app4_port" =20 # ADD_ADDR6 from the server to client machine reusing the subflow port - :>"$client_evts" - ip netns exec "$ns1" ./pm_nl_ctl ann dead:beef:2::1 token "$server6_token= " id\ - $server_addr_id dev ns1eth2 - print_test "ADD_ADDR6 id:server dead:beef:2::1 (ns1) =3D> ns2, reuse port" - sleep 0.5 - verify_announce_event "$client_evts" "$ANNOUNCED" "$client6_token" "dead:= beef:2::1"\ - "$server_addr_id" "$app6_port" "v6" + if mptcp_lib_is_v6_enabled; then + :>"$client_evts" + ip netns exec "$ns1" ./pm_nl_ctl ann dead:beef:2::1 token "$server6_toke= n" id\ + $server_addr_id dev ns1eth2 + print_test "ADD_ADDR6 id:server dead:beef:2::1 (ns1) =3D> ns2, reuse por= t" + sleep 0.5 + verify_announce_event "$client_evts" "$ANNOUNCED" "$client6_token" "dead= :beef:2::1"\ + "$server_addr_id" "$app6_port" "v6" + else + print_test "ADD_ADDR6 id:server dead:beef:2::1 (ns1) =3D> ns2, reuse por= t" + test_skip + fi =20 # ADD_ADDR from the server to client machine using a new port :>"$client_evts" @@ -462,12 +477,17 @@ test_remove() verify_remove_event "$server_evts" "$REMOVED" "$server4_token" "$client_a= ddr_id" =20 # RM_ADDR6 from the client to server machine - :>"$server_evts" - ip netns exec "$ns2" ./pm_nl_ctl rem token "$client6_token" id\ - $client_addr_id - print_test "RM_ADDR6 id:client-1 ns2 =3D> ns1" - sleep 0.5 - verify_remove_event "$server_evts" "$REMOVED" "$server6_token" "$client_a= ddr_id" + if mptcp_lib_is_v6_enabled; then + :>"$server_evts" + ip netns exec "$ns2" ./pm_nl_ctl rem token "$client6_token" id\ + $client_addr_id + print_test "RM_ADDR6 id:client-1 ns2 =3D> ns1" + sleep 0.5 + verify_remove_event "$server_evts" "$REMOVED" "$server6_token" "$client_= addr_id" + else + print_test "RM_ADDR6 id:client-1 ns2 =3D> ns1" + test_skip + fi =20 # Capture events on the network namespace running the client :>"$client_evts" @@ -489,12 +509,17 @@ test_remove() verify_remove_event "$client_evts" "$REMOVED" "$client4_token" "$server_a= ddr_id" =20 # RM_ADDR6 from the server to client machine - :>"$client_evts" - ip netns exec "$ns1" ./pm_nl_ctl rem token "$server6_token" id\ - $server_addr_id - print_test "RM_ADDR6 id:server-1 ns1 =3D> ns2" - sleep 0.5 - verify_remove_event "$client_evts" "$REMOVED" "$client6_token" "$server_a= ddr_id" + if mptcp_lib_is_v6_enabled; then + :>"$client_evts" + ip netns exec "$ns1" ./pm_nl_ctl rem token "$server6_token" id\ + $server_addr_id + print_test "RM_ADDR6 id:server-1 ns1 =3D> ns2" + sleep 0.5 + verify_remove_event "$client_evts" "$REMOVED" "$client6_token" "$server_= addr_id" + else + print_test "RM_ADDR6 id:server-1 ns1 =3D> ns2" + test_skip + fi } =20 verify_subflow_events() @@ -609,43 +634,48 @@ test_subflows() sleep 0.5 =20 # Attempt to add a listener at dead:beef:2::2: - ip netns exec "$ns2" ./pm_nl_ctl listen dead:beef:2::2\ - "$client6_port" & - listener_pid=3D$! - - # ADD_ADDR6 from client to server machine reusing the subflow port - :>"$server_evts" - ip netns exec "$ns2" ./pm_nl_ctl ann dead:beef:2::2 token "$client6_token= " id\ - $client_addr_id - sleep 0.5 - - # CREATE_SUBFLOW6 from server to client machine - :>"$server_evts" - ip netns exec "$ns1" ./pm_nl_ctl csf lip dead:beef:2::1 lid 23 rip\ - dead:beef:2::2 rport "$client6_port" token "$server6_token" - sleep 0.5 - verify_subflow_events "$server_evts" "$SUB_ESTABLISHED" "$server6_token" = "$AF_INET6"\ - "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23"\ - "$client_addr_id" "ns1" "ns2" - - # Delete the listener from the client ns, if one was created - mptcp_lib_kill_wait $listener_pid - - sport=3D$(mptcp_lib_evts_get_info sport "$server_evts" $SUB_ESTABLISHED) - - # DESTROY_SUBFLOW6 from server to client machine - :>"$server_evts" - ip netns exec "$ns1" ./pm_nl_ctl dsf lip dead:beef:2::1 lport "$sport" ri= p\ - dead:beef:2::2 rport "$client6_port" token "$server6_token" - sleep 0.5 - verify_subflow_events "$server_evts" "$SUB_CLOSED" "$server6_token" "$AF_= INET6"\ - "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23"\ - "$client_addr_id" "ns1" "ns2" - - # RM_ADDR from client to server machine - ip netns exec "$ns2" ./pm_nl_ctl rem id $client_addr_id token\ - "$client6_token" - sleep 0.5 + if mptcp_lib_is_v6_enabled; then + ip netns exec "$ns2" ./pm_nl_ctl listen dead:beef:2::2\ + "$client6_port" & + listener_pid=3D$! + + # ADD_ADDR6 from client to server machine reusing the subflow port + :>"$server_evts" + ip netns exec "$ns2" ./pm_nl_ctl ann dead:beef:2::2 token "$client6_toke= n" id\ + $client_addr_id + sleep 0.5 + + # CREATE_SUBFLOW6 from server to client machine + :>"$server_evts" + ip netns exec "$ns1" ./pm_nl_ctl csf lip dead:beef:2::1 lid 23 rip\ + dead:beef:2::2 rport "$client6_port" token "$server6_token" + sleep 0.5 + verify_subflow_events "$server_evts" "$SUB_ESTABLISHED" "$server6_token"= "$AF_INET6"\ + "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23"\ + "$client_addr_id" "ns1" "ns2" + + # Delete the listener from the client ns, if one was created + mptcp_lib_kill_wait $listener_pid + + sport=3D$(mptcp_lib_evts_get_info sport "$server_evts" $SUB_ESTABLISHED) + + # DESTROY_SUBFLOW6 from server to client machine + :>"$server_evts" + ip netns exec "$ns1" ./pm_nl_ctl dsf lip dead:beef:2::1 lport "$sport" r= ip\ + dead:beef:2::2 rport "$client6_port" token "$server6_token" + sleep 0.5 + verify_subflow_events "$server_evts" "$SUB_CLOSED" "$server6_token" "$AF= _INET6"\ + "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23"\ + "$client_addr_id" "ns1" "ns2" + + # RM_ADDR from client to server machine + ip netns exec "$ns2" ./pm_nl_ctl rem id $client_addr_id token\ + "$client6_token" + sleep 0.5 + else + print_test "subflow v6 client to server" + test_skip + fi =20 # Attempt to add a listener at 10.0.2.2: ip netns exec "$ns2" ./pm_nl_ctl listen 10.0.2.2\ @@ -724,43 +754,48 @@ test_subflows() sleep 0.5 =20 # Attempt to add a listener at dead:beef:2::1: - ip netns exec "$ns1" ./pm_nl_ctl listen dead:beef:2::1\ - $app6_port & - listener_pid=3D$! - - # ADD_ADDR6 from server to client machine reusing the subflow port - :>"$client_evts" - ip netns exec "$ns1" ./pm_nl_ctl ann dead:beef:2::1 token "$server6_token= " id\ - $server_addr_id - sleep 0.5 - - # CREATE_SUBFLOW6 from client to server machine - :>"$client_evts" - ip netns exec "$ns2" ./pm_nl_ctl csf lip dead:beef:2::2 lid 23 rip\ - dead:beef:2::1 rport $app6_port token "$client6_token" - sleep 0.5 - verify_subflow_events "$client_evts" "$SUB_ESTABLISHED" "$client6_token"\ - "$AF_INET6" "dead:beef:2::2"\ - "dead:beef:2::1" "$app6_port" "23"\ - "$server_addr_id" "ns2" "ns1" - - # Delete the listener from the server ns, if one was created - mptcp_lib_kill_wait $listener_pid - - sport=3D$(mptcp_lib_evts_get_info sport "$client_evts" $SUB_ESTABLISHED) - - # DESTROY_SUBFLOW6 from client to server machine - :>"$client_evts" - ip netns exec "$ns2" ./pm_nl_ctl dsf lip dead:beef:2::2 lport "$sport" ri= p\ - dead:beef:2::1 rport $app6_port token "$client6_token" - sleep 0.5 - verify_subflow_events $client_evts $SUB_CLOSED $client6_token $AF_INET6 "= dead:beef:2::2"\ - "dead:beef:2::1" "$app6_port" "23" "$server_addr_id" "ns2" "ns1" - - # RM_ADDR6 from server to client machine - ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ - "$server6_token" - sleep 0.5 + if mptcp_lib_is_v6_enabled; then + ip netns exec "$ns1" ./pm_nl_ctl listen dead:beef:2::1\ + $app6_port & + listener_pid=3D$! + + # ADD_ADDR6 from server to client machine reusing the subflow port + :>"$client_evts" + ip netns exec "$ns1" ./pm_nl_ctl ann dead:beef:2::1 token "$server6_toke= n" id\ + $server_addr_id + sleep 0.5 + + # CREATE_SUBFLOW6 from client to server machine + :>"$client_evts" + ip netns exec "$ns2" ./pm_nl_ctl csf lip dead:beef:2::2 lid 23 rip\ + dead:beef:2::1 rport $app6_port token "$client6_token" + sleep 0.5 + verify_subflow_events "$client_evts" "$SUB_ESTABLISHED" "$client6_token"\ + "$AF_INET6" "dead:beef:2::2"\ + "dead:beef:2::1" "$app6_port" "23"\ + "$server_addr_id" "ns2" "ns1" + + # Delete the listener from the server ns, if one was created + mptcp_lib_kill_wait $listener_pid + + sport=3D$(mptcp_lib_evts_get_info sport "$client_evts" $SUB_ESTABLISHED) + + # DESTROY_SUBFLOW6 from client to server machine + :>"$client_evts" + ip netns exec "$ns2" ./pm_nl_ctl dsf lip dead:beef:2::2 lport "$sport" r= ip\ + dead:beef:2::1 rport $app6_port token "$client6_token" + sleep 0.5 + verify_subflow_events $client_evts $SUB_CLOSED $client6_token $AF_INET6 = "dead:beef:2::2"\ + "dead:beef:2::1" "$app6_port" "23" "$server_addr_id" "ns2" "ns1" + + # RM_ADDR6 from server to client machine + ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ + "$server6_token" + sleep 0.5 + else + print_test "subflow v6 server to client" + test_skip + fi =20 # Attempt to add a listener at 10.0.2.1: ip netns exec "$ns1" ./pm_nl_ctl listen 10.0.2.1\ @@ -931,13 +966,23 @@ test_listener() =20 print_title "Make connections" make_connection -make_connection "v6" +if mptcp_lib_is_v6_enabled; then + make_connection "v6" +else + print_test "Established IPv6 MPTCP Connection ns2 =3D> ns1" + test_skip +fi print_title "Will be using address IDs ${client_addr_id} (client) and ${se= rver_addr_id} (server)" =20 test_announce test_remove test_subflows -test_subflows_v4_v6_mix +if mptcp_lib_is_v6_enabled; then + test_subflows_v4_v6_mix +else + print_test "subflows v4 v6 mix" + test_skip +fi test_prio test_listener =20 --=20 2.43.0