[PATCH net-next 3/4] selftests: mptcp: convert iptables to nftables for mptcp_sockopt.sh
From: Matthieu Baerts (NGI0)
Date: Tue Oct 13 2026 - 15:29:01 EST
From: Hangbin Liu <liuhangbin@xxxxxxxxxx>
During the conversion, we retain the same filter and chain names previously
used by iptables/ip6tables. Counters are not added to accept rules because
the test does not inspect them. The syn mark rule is removed as it is
only for debugging, which could be added easily when needed.
After conversion, the generated output matches the original
iptables/ip6tables behavior.
Signed-off-by: Hangbin Liu <liuhangbin@xxxxxxxxxx>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@xxxxxxxxxx>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@xxxxxxxxxx>
---
To: Shuah Khan <shuah@xxxxxxxxxx>
Cc: linux-kselftest@xxxxxxxxxxxxxxx
v2:
- Use nft --version + JSON to support old/weird versions. (Clashiko)
- Remove syn mark rule. (Clashiko)
---
tools/testing/selftests/net/mptcp/mptcp_lib.sh | 9 +++-
tools/testing/selftests/net/mptcp/mptcp_sockopt.sh | 53 ++++++++++++----------
2 files changed, 36 insertions(+), 26 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_lib.sh b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
index b9d14647f401..20853d0198ff 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_lib.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_lib.sh
@@ -528,7 +528,14 @@ mptcp_lib_check_tools() {
exit ${KSFT_SKIP}
fi
;;
- "iptables"* | "ip6tables"*)
+ "nft")
+ if ! nft --version &> /dev/null || \
+ ! nft -j list ruleset &> /dev/null; then
+ mptcp_lib_pr_skip "Could not run all tests without nft -j"
+ exit ${KSFT_SKIP}
+ fi
+ ;;
+ "iptables"* | "ip6tables"* | "jq")
if ! "${tool}" -V &> /dev/null; then
mptcp_lib_pr_skip "Could not run all tests without ${tool}"
exit ${KSFT_SKIP}
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
index e850a87429b6..ef2738720e24 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
@@ -15,8 +15,6 @@ cin=""
cout=""
timeout_poll=30
timeout_test=$((timeout_poll * 2 + 1))
-iptables="iptables"
-ip6tables="ip6tables"
ns1=""
ns2=""
@@ -49,16 +47,22 @@ add_mark_rules()
local ns=$1
local m=$2
- local t
- for t in ${iptables} ${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
+ local table
+ for table in ip ip6; do
+ ip netns exec "$ns" nft -f - <<-EOF
+ add table $table filter
+ add chain $table filter OUTPUT \
+ { type filter hook output priority 0; policy 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 --mark 0 -j ACCEPT
+ # RST packets might be handled by a internal dummy socket
+ add rule $table filter OUTPUT \
+ tcp flags & rst == rst meta mark 0x0 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
+ add rule $table filter OUTPUT \
+ meta l4proto tcp meta mark $m accept
+ add rule $table filter OUTPUT \
+ meta l4proto tcp meta mark 0 counter drop
+ EOF
done
}
@@ -105,32 +109,31 @@ cleanup()
mptcp_lib_check_mptcp
mptcp_lib_check_kallsyms
-mptcp_lib_check_tools ip "${iptables}" "${ip6tables}"
+mptcp_lib_check_tools ip nft jq
check_mark()
{
local ns=$1
local af=$2
- local tables=${iptables}
+ local tables="ip"
if [ $af -eq 6 ];then
- tables=${ip6tables}
+ tables="ip6"
fi
- local counters values
- counters=$(ip netns exec $ns $tables -v -L OUTPUT | grep DROP)
- values=${counters%DROP*}
+ local drops
+ drops=$(ip netns exec "$ns" nft -j list table "$tables" filter | \
+ jq '.nftables[] | select(has("rule")) | .rule |
+ select (.chain=="OUTPUT" and any(.expr[]; has("drop"))) |
+ .expr[] | select(has("counter")) | .counter.packets')
- local v
- for v in $values; do
- if [ $v -ne 0 ]; then
- mptcp_lib_pr_fail "got $tables $values in ns $ns," \
- "not 0 - not all expected packets marked"
- ret=${KSFT_FAIL}
- return 1
- fi
- done
+ if [ -z "$drops" ] || [ "$drops" -ne 0 ]; then
+ mptcp_lib_pr_fail "got $tables $drops in ns $ns," \
+ "not 0 - not all expected packets marked"
+ ret=${KSFT_FAIL}
+ return 1
+ fi
return 0
}
--
2.55.0