Extend nft_fib.sh using its existing namespaces and counter helper to check that suppress_prefixlength 0 suppresses a default route while retaining a more-specific route. Check that blackhole, unreachable and prohibit routes remain terminal despite a usable route in a later table. Include a blackhole nexthop object to distinguish result reject flags from flags on the FIB entry. Require a positive packet counter for the expected nftables FIB result and compare it with an ordinary route lookup. Install the router's logging RPF rules after these checks and their policy-rule cleanup, so neighbour advertisements cannot be logged and dropped while intentionally different reverse routes are installed. Assisted-by: LLM Signed-off-by: Leonard Lausen --- .../selftests/net/netfilter/nft_fib.sh | 63 ++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/netfilter/nft_fib.sh b/tools/testing/selftests/net/netfilter/nft_fib.sh index 04544905c216..65d4687622e2 100755 --- a/tools/testing/selftests/net/netfilter/nft_fib.sh +++ b/tools/testing/selftests/net/netfilter/nft_fib.sh @@ -202,7 +202,38 @@ check_fib_counter() { return 0 } -load_ruleset "$nsrouter" +# Count probes matching the expected FIB result, then drop them. +test_fib_suppress() { + local label="$1" expected="$2" + local result="${3:-oifname}" err=0 + + ip netns exec "$nsrouter" nft -f /dev/stdin < /dev/null 2>&1 + if [ "$result" = type ]; then + ip -net "$nsrouter" -6 route get dead:1::99 from dead:1::1 > /dev/null 2>&1 && err=1 + else + ip -net "$nsrouter" -6 route get dead:1::99 from dead:1::1 | + grep -q "dev $expected " || err=1 + fi + if check_fib_type_counter_family ip6 1 "$nsrouter" prerouting "$result" "$label" && + [ "$err" -eq 0 ]; then + echo "PASS: $label" + else + echo "FAIL: $label" + ret=1 + return 1 + fi +} + load_ruleset "$ns1" load_ruleset "$ns2" @@ -724,6 +755,36 @@ test_fib_vrf() check_fib_veth_vrf_type "fib expression address types match (iif in vrf)" } +# Test prefix suppression before installing the router's logging RPF rules. +# Neighbour discovery must remain usable even when reverse routes differ. +ip -net "$nsrouter" -6 route add table 128 default dev veth1 || exit 1 +ip -net "$nsrouter" -6 route add table 129 dead:1::/64 dev veth0 || exit 1 +ip -net "$nsrouter" -6 rule add pref 100 to dead:1::99 table 128 suppress_prefixlength 0 || exit 1 +ip -net "$nsrouter" -6 rule add pref 101 to dead:1::99 table 129 || exit 1 +ip netns exec "$nsrouter" nft add table ip6 filter || exit 1 + +test_fib_suppress "suppress default route" veth0 || ret=1 +ip -net "$nsrouter" -6 route add table 128 dead:1::/64 dev veth1 || exit 1 +test_fib_suppress "retain non-default route" veth1 || ret=1 +ip -net "$nsrouter" -6 route del table 128 dead:1::/64 dev veth1 || exit 1 + +for type in blackhole unreachable prohibit; do + ip -net "$nsrouter" -6 route replace "$type" default table 128 || exit 1 + test_fib_suppress "retain $type" "$type" type || ret=1 +done + +ip -net "$nsrouter" -6 nexthop add id 1 blackhole || exit 1 +ip -net "$nsrouter" -6 route replace default nhid 1 table 128 || exit 1 +test_fib_suppress "retain blackhole nexthop" blackhole type || ret=1 + +ip -net "$nsrouter" -6 rule del pref 100 +ip -net "$nsrouter" -6 rule del pref 101 +ip -net "$nsrouter" -6 route del table 128 default +ip -net "$nsrouter" -6 route flush table 129 +ip -net "$nsrouter" -6 nexthop del id 1 +ip netns exec "$nsrouter" nft delete table ip6 filter +load_ruleset "$nsrouter" + ip netns exec "$nsrouter" sysctl net.ipv6.conf.all.forwarding=1 > /dev/null ip netns exec "$nsrouter" sysctl net.ipv4.conf.veth0.forwarding=1 > /dev/null ip netns exec "$nsrouter" sysctl net.ipv4.conf.veth1.forwarding=1 > /dev/null -- 2.55.0