Skip to content

Commit 0935ee6

Browse files
Florian Westphalummakynes
authored andcommitted
selftests: netfilter: add test case for recent mismatch bug
Without 'netfilter: nf_set_pipapo: fix initial map fill' this fails: TEST: reported issues Add two elements, flush, re-add 1s [ OK ] net,mac with reload 1s [ OK ] net,port,proto 1s [FAIL] post-add: should have returned 10.5.8.0/24 . 51-60 . 6-17 but got table inet filter { set test { type ipv4_addr . inet_service . inet_proto flags interval,timeout elements = { 10.5.7.0/24 . 51-60 . 6-17 } } } The other sets defined in the selftest do not trigger this bug, it only occurs if the first field group bitsize is smaller than the largest group bitsize. For each added element, check 'get' works and actually returns the requested range. After map has been filled, check all added ranges can still be retrieved. For each deleted element, check that 'get' fails. Based on a reproducer script from Yi Chen. Signed-off-by: Florian Westphal <[email protected]> Reviewed-by: Stefano Brivio <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]>
1 parent 791a615 commit 0935ee6

File tree

1 file changed

+75
-1
lines changed

1 file changed

+75
-1
lines changed

tools/testing/selftests/net/netfilter/nft_concat_range.sh

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ TYPES="net_port port_net net6_port port_proto net6_port_mac net6_port_mac_proto
2727
net6_port_net6_port net_port_mac_proto_net"
2828

2929
# Reported bugs, also described by TYPE_ variables below
30-
BUGS="flush_remove_add reload"
30+
BUGS="flush_remove_add reload net_port_proto_match"
3131

3232
# List of possible paths to pktgen script from kernel tree for performance tests
3333
PKTGEN_SCRIPT_PATHS="
@@ -371,6 +371,22 @@ race_repeat 0
371371
perf_duration 0
372372
"
373373

374+
TYPE_net_port_proto_match="
375+
display net,port,proto
376+
type_spec ipv4_addr . inet_service . inet_proto
377+
chain_spec ip daddr . udp dport . meta l4proto
378+
dst addr4 port proto
379+
src
380+
start 1
381+
count 9
382+
src_delta 9
383+
tools sendip bash
384+
proto udp
385+
386+
race_repeat 0
387+
388+
perf_duration 0
389+
"
374390
# Set template for all tests, types and rules are filled in depending on test
375391
set_template='
376392
flush ruleset
@@ -1555,6 +1571,64 @@ test_bug_reload() {
15551571
nft flush ruleset
15561572
}
15571573

1574+
# - add ranged element, check that packets match it
1575+
# - delete element again, check it is gone
1576+
test_bug_net_port_proto_match() {
1577+
setup veth send_"${proto}" set || return ${ksft_skip}
1578+
rstart=${start}
1579+
1580+
range_size=1
1581+
for i in $(seq 1 10); do
1582+
for j in $(seq 1 20) ; do
1583+
elem=$(printf "10.%d.%d.0/24 . %d1-%d0 . 6-17 " ${i} ${j} ${i} "$((i+1))")
1584+
1585+
nft "add element inet filter test { $elem }" || return 1
1586+
nft "get element inet filter test { $elem }" | grep -q "$elem"
1587+
if [ $? -ne 0 ];then
1588+
local got=$(nft "get element inet filter test { $elem }")
1589+
err "post-add: should have returned $elem but got $got"
1590+
return 1
1591+
fi
1592+
done
1593+
done
1594+
1595+
# recheck after set was filled
1596+
for i in $(seq 1 10); do
1597+
for j in $(seq 1 20) ; do
1598+
elem=$(printf "10.%d.%d.0/24 . %d1-%d0 . 6-17 " ${i} ${j} ${i} "$((i+1))")
1599+
1600+
nft "get element inet filter test { $elem }" | grep -q "$elem"
1601+
if [ $? -ne 0 ];then
1602+
local got=$(nft "get element inet filter test { $elem }")
1603+
err "post-fill: should have returned $elem but got $got"
1604+
return 1
1605+
fi
1606+
done
1607+
done
1608+
1609+
# random del and re-fetch
1610+
for i in $(seq 1 10); do
1611+
for j in $(seq 1 20) ; do
1612+
local rnd=$((RANDOM%10))
1613+
local got=""
1614+
1615+
elem=$(printf "10.%d.%d.0/24 . %d1-%d0 . 6-17 " ${i} ${j} ${i} "$((i+1))")
1616+
if [ $rnd -gt 0 ];then
1617+
continue
1618+
fi
1619+
1620+
nft "delete element inet filter test { $elem }"
1621+
got=$(nft "get element inet filter test { $elem }" 2>/dev/null)
1622+
if [ $? -eq 0 ];then
1623+
err "post-delete: query for $elem returned $got instead of error."
1624+
return 1
1625+
fi
1626+
done
1627+
done
1628+
1629+
nft flush ruleset
1630+
}
1631+
15581632
test_reported_issues() {
15591633
eval test_bug_"${subtest}"
15601634
}

0 commit comments

Comments
 (0)