Commit a126ab6b authored by Florian Westphal's avatar Florian Westphal
Browse files

selftests: netfilter: nft_fib.sh: fix spurious test failures



Jakub reports spurious failure of nft_fib.sh test.
This is caused by a subtle bug inherited when i moved faulty ping
from one test case to another.

nft_fib.sh not only checks that the fib expression matched, it also
records the number of matches and then validates we have the expected
count.  When I did this it was under the assumption that we would
have 0 to n matching packets.  In case of the failure, the entry has
n+1 matching packets.

This happens because ping_unreachable helper uses "ping -c 1 -w 1",
instead of the intended "-W".  -w alters the meaning of -c (count),
namely, its then treated as number of wanted *replies* instead of
"number of packets to send".

So, in some cases, ping -c 1 -w 1 ends up sending two packets which then
makes the test fail due to the higher-than-expected packet count.

Fix the actual bug (s/-w/-W) and also change the error handling:
1. Show the number of expected packets in the error message
2. Always try to delete the key from the set.
   Else, later test that makes sure we don't have unexpected keys
   in there will always fail as well.

Reported-by: default avatarJakub Kicinski <kuba@kernel.org>
Closes: https://lore.kernel.org/netfilter-devel/20250927090709.0b3cd783@kernel.org/


Fixes: 98287045 ("selftests: netfilter: move fib vrf test to nft_fib.sh")
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
parent bbf0c98b
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -256,12 +256,12 @@ test_ping_unreachable() {
  local daddr4=$1
  local daddr6=$2

  if ip netns exec "$ns1" ping -c 1 -w 1 -q "$daddr4" > /dev/null; then
  if ip netns exec "$ns1" ping -c 1 -W 0.1 -q "$daddr4" > /dev/null; then
	echo "FAIL: ${ns1} could reach $daddr4" 1>&2
	return 1
  fi

  if ip netns exec "$ns1" ping -c 1 -w 1 -q "$daddr6" > /dev/null; then
  if ip netns exec "$ns1" ping -c 1 -W 0.1 -q "$daddr6" > /dev/null; then
	echo "FAIL: ${ns1} could reach $daddr6" 1>&2
	return 1
  fi
@@ -437,14 +437,17 @@ check_type()
	local addr="$3"
	local type="$4"
	local count="$5"
	local lret=0

	[ -z "$count" ] && count=1

	if ! ip netns exec "$nsrouter" nft get element inet t "$setname" { "$iifname" . "$addr" . "$type" } |grep -q "counter packets $count";then
		echo "FAIL: did not find $iifname . $addr . $type in $setname"
		echo "FAIL: did not find $iifname . $addr . $type in $setname with $count packets"
		ip netns exec "$nsrouter" nft list set inet t "$setname"
		ret=1
		return 1
		# do not fail right away, delete entry if it exists so later test that
		# checks for unwanted keys don't get confused by this *expected* key.
		lret=1
	fi

	# delete the entry, this allows to check if anything unexpected appeared
@@ -456,7 +459,7 @@ check_type()
		return 1
	fi

	return 0
	return $lret
}

check_local()