]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests: netfilter: nft_concat_range.sh: add check for double-create bug
authorFlorian Westphal <fw@strlen.de>
Tue, 9 Sep 2025 23:39:48 +0000 (01:39 +0200)
committerFlorian Westphal <fw@strlen.de>
Wed, 24 Sep 2025 09:50:28 +0000 (11:50 +0200)
Add a test case for bug resolved with:
'netfilter: nft_set_pipapo_avx2: fix skip of expired entries'.

It passes on nf.git (it uses the generic/C version for insertion
duplicate check) but fails on unpatched nf-next if AVX2 is supported:

  cannot create same element twice      0s                        [FAIL]
Could create element twice in same transaction
table inet filter { # handle 8
[..]
  elements = { 1.2.3.4 . 1.2.4.1 counter packets 0 bytes 0,
               1.2.4.1 . 1.2.3.4 counter packets 0 bytes 0,
               1.2.3.4 . 1.2.4.1 counter packets 0 bytes 0,
               1.2.4.1 . 1.2.3.4 counter packets 0 bytes 0 }

Reviewed-by: Stefano Brivio <sbrivio@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
tools/testing/selftests/net/netfilter/nft_concat_range.sh

index 20e76b395c855d08d4578919f8ee7900c1b4b64b..ad97c6227f351526c2fb6d7fef4bbd3e8f678b35 100755 (executable)
@@ -29,7 +29,7 @@ TYPES="net_port port_net net6_port port_proto net6_port_mac net6_port_mac_proto
        net6_port_net6_port net_port_mac_proto_net"
 
 # Reported bugs, also described by TYPE_ variables below
-BUGS="flush_remove_add reload net_port_proto_match avx2_mismatch"
+BUGS="flush_remove_add reload net_port_proto_match avx2_mismatch doublecreate"
 
 # List of possible paths to pktgen script from kernel tree for performance tests
 PKTGEN_SCRIPT_PATHS="
@@ -408,6 +408,18 @@ perf_duration      0
 "
 
 
+TYPE_doublecreate="
+display                cannot create same element twice
+type_spec      ipv4_addr . ipv4_addr
+chain_spec     ip saddr . ip daddr
+dst            addr4
+proto          icmp
+
+race_repeat    0
+
+perf_duration  0
+"
+
 # Set template for all tests, types and rules are filled in depending on test
 set_template='
 flush ruleset
@@ -1900,6 +1912,48 @@ test_bug_avx2_mismatch()
        fi
 }
 
+test_bug_doublecreate()
+{
+       local elements="1.2.3.4 . 1.2.4.1, 1.2.4.1 . 1.2.3.4"
+       local ret=1
+       local i
+
+       setup veth send_"${proto}" set || return ${ksft_skip}
+
+       add "{ $elements }" || return 1
+       # expected to work: 'add' on existing should be no-op.
+       add "{ $elements }" || return 1
+
+       # 'create' should return an error.
+       if nft create element inet filter test "{ $elements }" 2>/dev/null; then
+               err "Could create an existing element"
+               return 1
+       fi
+nft -f - <<EOF 2>/dev/null
+flush set inet filter test
+create element inet filter test { $elements }
+create element inet filter test { $elements }
+EOF
+       ret=$?
+       if [ $ret -eq 0 ]; then
+               err "Could create element twice in one transaction"
+               err "$(nft -a list ruleset)"
+               return 1
+       fi
+
+nft -f - <<EOF 2>/dev/null
+flush set inet filter test
+create element inet filter test { $elements }
+EOF
+       ret=$?
+       if [ $ret -ne 0 ]; then
+               err "Could not flush and re-create element in one transaction"
+               return 1
+       fi
+
+       return 0
+}
+
 test_reported_issues() {
        eval test_bug_"${subtest}"
 }