@@ -378,7 +378,7 @@ display net,port,proto
378
378
type_spec ipv4_addr . inet_service . inet_proto
379
379
chain_spec ip daddr . udp dport . meta l4proto
380
380
dst addr4 port proto
381
- src
381
+ src
382
382
start 1
383
383
count 9
384
384
src_delta 9
@@ -419,6 +419,7 @@ table inet filter {
419
419
420
420
set test {
421
421
type ${type_spec}
422
+ counter
422
423
flags interval,timeout
423
424
}
424
425
@@ -1158,8 +1159,17 @@ del() {
1158
1159
fi
1159
1160
}
1160
1161
1161
- # Return packet count from 'test' counter in 'inet filter' table
1162
+ # Return packet count for elem $1 from 'test' counter in 'inet filter' table
1162
1163
count_packets () {
1164
+ found=0
1165
+ for token in $( nft reset element inet filter test " ${1} " ) ; do
1166
+ [ ${found} -eq 1 ] && echo " ${token} " && return
1167
+ [ " ${token} " = " packets" ] && found=1
1168
+ done
1169
+ }
1170
+
1171
+ # Return packet count from 'test' counter in 'inet filter' table
1172
+ count_packets_nomatch () {
1163
1173
found=0
1164
1174
for token in $( nft list counter inet filter test) ; do
1165
1175
[ ${found} -eq 1 ] && echo " ${token} " && return
@@ -1206,6 +1216,10 @@ perf() {
1206
1216
1207
1217
# Set MAC addresses, send single packet, check that it matches, reset counter
1208
1218
send_match () {
1219
+ local elem=" $1 "
1220
+
1221
+ shift
1222
+
1209
1223
ip link set veth_a address " $( format_mac " ${1} " ) "
1210
1224
ip -n B link set veth_b address " $( format_mac " ${2} " ) "
1211
1225
@@ -1216,7 +1230,7 @@ send_match() {
1216
1230
eval src_" $f " =\$\( format_\$ f " ${2} " \)
1217
1231
done
1218
1232
eval send_\$ proto
1219
- if [ " $( count_packets) " != " 1" ]; then
1233
+ if [ " $( count_packets " $elem " ) " != " 1" ]; then
1220
1234
err " ${proto} packet to:"
1221
1235
err " $( for f in ${dst} ; do
1222
1236
eval format_\$ f " ${1} " ; printf ' ' ; done) "
@@ -1242,7 +1256,7 @@ send_nomatch() {
1242
1256
eval src_" $f " =\$\( format_\$ f " ${2} " \)
1243
1257
done
1244
1258
eval send_\$ proto
1245
- if [ " $( count_packets ) " != " 0" ]; then
1259
+ if [ " $( count_packets_nomatch ) " != " 0" ]; then
1246
1260
err " ${proto} packet to:"
1247
1261
err " $( for f in ${dst} ; do
1248
1262
eval format_\$ f " ${1} " ; printf ' ' ; done) "
@@ -1255,13 +1269,51 @@ send_nomatch() {
1255
1269
fi
1256
1270
}
1257
1271
1272
+ maybe_send_nomatch () {
1273
+ local elem=" $1 "
1274
+ local what=" $4 "
1275
+
1276
+ [ $(( RANDOM% 20 )) -gt 0 ] && return
1277
+
1278
+ dst_addr4=" $2 "
1279
+ dst_port=" $3 "
1280
+ send_udp
1281
+
1282
+ if [ " $( count_packets_nomatch) " != " 0" ]; then
1283
+ err " Packet to $dst_addr4 :$dst_port did match $what "
1284
+ err " $( nft -a list ruleset) "
1285
+ return 1
1286
+ fi
1287
+ }
1288
+
1289
+ maybe_send_match () {
1290
+ local elem=" $1 "
1291
+ local what=" $4 "
1292
+
1293
+ [ $(( RANDOM% 20 )) -gt 0 ] && return
1294
+
1295
+ dst_addr4=" $2 "
1296
+ dst_port=" $3 "
1297
+ send_udp
1298
+
1299
+ if [ " $( count_packets " { $elem }" ) " != " 1" ]; then
1300
+ err " Packet to $dst_addr4 :$dst_port did not match $what "
1301
+ err " $( nft -a list ruleset) "
1302
+ return 1
1303
+ fi
1304
+ nft reset counter inet filter test > /dev/null
1305
+ nft reset element inet filter test " { $elem }" > /dev/null
1306
+ }
1307
+
1258
1308
# Correctness test template:
1259
1309
# - add ranged element, check that packets match it
1260
1310
# - check that packets outside range don't match it
1261
1311
# - remove some elements, check that packets don't match anymore
1262
1312
test_correctness_main () {
1263
1313
range_size=1
1264
1314
for i in $( seq " ${start} " $(( start + count)) ) ; do
1315
+ local elem=" "
1316
+
1265
1317
end=$(( start + range_size))
1266
1318
1267
1319
# Avoid negative or zero-sized port ranges
@@ -1272,15 +1324,16 @@ test_correctness_main() {
1272
1324
srcstart=$(( start + src_delta))
1273
1325
srcend=$(( end + src_delta))
1274
1326
1275
- add " $( format) " || return 1
1327
+ elem=" $( format) "
1328
+ add " $elem " || return 1
1276
1329
for j in $( seq " $start " $(( range_size / 2 + 1 )) ${end} ) ; do
1277
- send_match " ${j} " $(( j + src_delta)) || return 1
1330
+ send_match " $elem " " $ {j}" $(( j + src_delta)) || return 1
1278
1331
done
1279
1332
send_nomatch $(( end + 1 )) $(( end + 1 + src_delta)) || return 1
1280
1333
1281
1334
# Delete elements now and then
1282
1335
if [ $(( i % 3 )) -eq 0 ]; then
1283
- del " $( format ) " || return 1
1336
+ del " $elem " || return 1
1284
1337
for j in $( seq " $start " \
1285
1338
$(( range_size / 2 + 1 )) ${end} ) ; do
1286
1339
send_nomatch " ${j} " $(( j + src_delta)) \
@@ -1572,14 +1625,17 @@ test_timeout() {
1572
1625
1573
1626
range_size=1
1574
1627
for i in $( seq " $start " $(( start + count)) ) ; do
1628
+ local elem=" "
1629
+
1575
1630
end=$(( start + range_size))
1576
1631
srcstart=$(( start + src_delta))
1577
1632
srcend=$(( end + src_delta))
1578
1633
1579
- add " $( format) " || return 1
1634
+ elem=" $( format) "
1635
+ add " $elem " || return 1
1580
1636
1581
1637
for j in $( seq " $start " $(( range_size / 2 + 1 )) ${end} ) ; do
1582
- send_match " ${j} " $(( j + src_delta)) || return 1
1638
+ send_match " $elem " " $ {j}" $(( j + src_delta)) || return 1
1583
1639
done
1584
1640
1585
1641
range_size=$(( range_size + 1 ))
@@ -1737,7 +1793,7 @@ test_bug_reload() {
1737
1793
srcend=$(( end + src_delta))
1738
1794
1739
1795
for j in $( seq " $start " $(( range_size / 2 + 1 )) ${end} ) ; do
1740
- send_match " ${j} " $(( j + src_delta)) || return 1
1796
+ send_match " $( format ) " " $ {j}" $(( j + src_delta)) || return 1
1741
1797
done
1742
1798
1743
1799
range_size=$(( range_size + 1 ))
@@ -1756,39 +1812,55 @@ test_bug_net_port_proto_match() {
1756
1812
range_size=1
1757
1813
for i in $( seq 1 10) ; do
1758
1814
for j in $( seq 1 20) ; do
1759
- elem=$( printf " 10.%d.%d.0/24 . %d1-%d0 . 6-17 " ${i} ${j} ${i} " $(( i+ 1 )) " )
1815
+ local dport=$j
1816
+
1817
+ elem=$( printf " 10.%d.%d.0/24 . %d-%d0 . 6-17 " ${i} ${j} ${dport} " $(( dport+ 1 )) " )
1818
+
1819
+ # too slow, do not test all addresses
1820
+ maybe_send_nomatch " $elem " $( printf " 10.%d.%d.1" $i $j ) $( printf " %d1" $(( dport+ 1 )) ) " before add" || return 1
1760
1821
1761
1822
nft " add element inet filter test { $elem }" || return 1
1823
+
1824
+ maybe_send_match " $elem " $( printf " 10.%d.%d.1" $i $j ) $( printf " %d" $dport ) " after add" || return 1
1825
+
1762
1826
nft " get element inet filter test { $elem }" | grep -q " $elem "
1763
1827
if [ $? -ne 0 ]; then
1764
1828
local got=$( nft " get element inet filter test { $elem }" )
1765
1829
err " post-add: should have returned $elem but got $got "
1766
1830
return 1
1767
1831
fi
1832
+
1833
+ maybe_send_nomatch " $elem " $( printf " 10.%d.%d.1" $i $j ) $( printf " %d1" $(( dport+ 1 )) ) " out-of-range" || return 1
1768
1834
done
1769
1835
done
1770
1836
1771
1837
# recheck after set was filled
1772
1838
for i in $( seq 1 10) ; do
1773
1839
for j in $( seq 1 20) ; do
1774
- elem=$( printf " 10.%d.%d.0/24 . %d1-%d0 . 6-17 " ${i} ${j} ${i} " $(( i+ 1 )) " )
1840
+ local dport=$j
1841
+
1842
+ elem=$( printf " 10.%d.%d.0/24 . %d-%d0 . 6-17 " ${i} ${j} ${dport} " $(( dport+ 1 )) " )
1775
1843
1776
1844
nft " get element inet filter test { $elem }" | grep -q " $elem "
1777
1845
if [ $? -ne 0 ]; then
1778
1846
local got=$( nft " get element inet filter test { $elem }" )
1779
1847
err " post-fill: should have returned $elem but got $got "
1780
1848
return 1
1781
1849
fi
1850
+
1851
+ maybe_send_match " $elem " $( printf " 10.%d.%d.1" $i $j ) $( printf " %d" $dport ) " recheck" || return 1
1852
+ maybe_send_nomatch " $elem " $( printf " 10.%d.%d.1" $i $j ) $( printf " %d1" $(( dport+ 1 )) ) " recheck out-of-range" || return 1
1782
1853
done
1783
1854
done
1784
1855
1785
1856
# random del and re-fetch
1786
1857
for i in $( seq 1 10) ; do
1787
1858
for j in $( seq 1 20) ; do
1788
1859
local rnd=$(( RANDOM% 10 ))
1860
+ local dport=$j
1789
1861
local got=" "
1790
1862
1791
- elem=$( printf " 10.%d.%d.0/24 . %d1 -%d0 . 6-17 " ${i} ${j} ${i } " $(( i + 1 )) " )
1863
+ elem=$( printf " 10.%d.%d.0/24 . %d -%d0 . 6-17 " ${i} ${j} ${dport } " $(( dport + 1 )) " )
1792
1864
if [ $rnd -gt 0 ]; then
1793
1865
continue
1794
1866
fi
@@ -1799,6 +1871,8 @@ test_bug_net_port_proto_match() {
1799
1871
err " post-delete: query for $elem returned $got instead of error."
1800
1872
return 1
1801
1873
fi
1874
+
1875
+ maybe_send_nomatch " $elem " $( printf " 10.%d.%d.1" $i $j ) $( printf " %d" $dport ) " match after deletion" || return 1
1802
1876
done
1803
1877
done
1804
1878
@@ -1817,7 +1891,7 @@ test_bug_avx2_mismatch()
1817
1891
dst_addr6=" $a2 "
1818
1892
send_icmp6
1819
1893
1820
- if [ " $( count_packets) " -gt " 0" ]; then
1894
+ if [ " $( count_packets " { icmpv6 . $a1 } " ) " -gt " 0" ]; then
1821
1895
err " False match for $a2 "
1822
1896
return 1
1823
1897
fi
0 commit comments