117dd52dfSMark Johnston# 24d846d26SWarner Losh# SPDX-License-Identifier: BSD-2-Clause 317dd52dfSMark Johnston# 417dd52dfSMark Johnston# Copyright (c) 2020 Mark Johnston <markj@FreeBSD.org> 517dd52dfSMark Johnston# 617dd52dfSMark Johnston# Redistribution and use in source and binary forms, with or without 717dd52dfSMark Johnston# modification, are permitted provided that the following conditions 817dd52dfSMark Johnston# are met: 917dd52dfSMark Johnston# 1. Redistributions of source code must retain the above copyright 1017dd52dfSMark Johnston# notice, this list of conditions and the following disclaimer. 1117dd52dfSMark Johnston# 2. Redistributions in binary form must reproduce the above copyright 1217dd52dfSMark Johnston# notice, this list of conditions and the following disclaimer in the 1317dd52dfSMark Johnston# documentation and/or other materials provided with the distribution. 1417dd52dfSMark Johnston# 1517dd52dfSMark Johnston# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1617dd52dfSMark Johnston# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1717dd52dfSMark Johnston# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1817dd52dfSMark Johnston# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1917dd52dfSMark Johnston# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2017dd52dfSMark Johnston# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2117dd52dfSMark Johnston# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2217dd52dfSMark Johnston# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2317dd52dfSMark Johnston# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2417dd52dfSMark Johnston# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2517dd52dfSMark Johnston# SUCH DAMAGE. 2617dd52dfSMark Johnston 2717dd52dfSMark Johnston. $(atf_get_srcdir)/utils.subr 2817dd52dfSMark Johnston 2917dd52dfSMark JohnstonTABLE_STATS_ZERO_REGEXP='Packets: 0[[:space:]]*Bytes: 0[[:space:]]' 3017dd52dfSMark JohnstonTABLE_STATS_NONZERO_REGEXP='Packets: [1-9][0-9]*[[:space:]]*Bytes: [1-9][0-9]*[[:space:]]' 3117dd52dfSMark Johnston 3217dd52dfSMark Johnstonatf_test_case "v4_counters" "cleanup" 3317dd52dfSMark Johnstonv4_counters_head() 3417dd52dfSMark Johnston{ 3517dd52dfSMark Johnston atf_set descr 'Verify per-address counters for v4' 3617dd52dfSMark Johnston atf_set require.user root 3717dd52dfSMark Johnston} 3817dd52dfSMark Johnston 3917dd52dfSMark Johnstonv4_counters_body() 4017dd52dfSMark Johnston{ 4117dd52dfSMark Johnston pft_init 4217dd52dfSMark Johnston 4317dd52dfSMark Johnston epair_send=$(vnet_mkepair) 4417dd52dfSMark Johnston ifconfig ${epair_send}a 192.0.2.1/24 up 4517dd52dfSMark Johnston 4617dd52dfSMark Johnston vnet_mkjail alcatraz ${epair_send}b 4717dd52dfSMark Johnston jexec alcatraz ifconfig ${epair_send}b 192.0.2.2/24 up 4817dd52dfSMark Johnston jexec alcatraz pfctl -e 4917dd52dfSMark Johnston 5017dd52dfSMark Johnston pft_set_rules alcatraz \ 5117dd52dfSMark Johnston "table <foo> counters { 192.0.2.1 }" \ 5217dd52dfSMark Johnston "block all" \ 5317dd52dfSMark Johnston "pass in from <foo> to any" \ 543a1f834bSDoug Rabson "pass out from any to <foo>" \ 553a1f834bSDoug Rabson "set skip on lo" 5617dd52dfSMark Johnston 5717dd52dfSMark Johnston atf_check -s exit:0 -o ignore ping -c 3 192.0.2.2 5817dd52dfSMark Johnston 5917dd52dfSMark Johnston atf_check -s exit:0 -e ignore \ 6017dd52dfSMark Johnston -o match:'In/Block:.*'"$TABLE_STATS_ZERO_REGEXP" \ 6117dd52dfSMark Johnston -o match:'In/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 6217dd52dfSMark Johnston -o match:'Out/Block:.*'"$TABLE_STATS_ZERO_REGEXP" \ 6317dd52dfSMark Johnston -o match:'Out/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 6417dd52dfSMark Johnston jexec alcatraz pfctl -t foo -T show -vv 6517dd52dfSMark Johnston} 6617dd52dfSMark Johnston 6717dd52dfSMark Johnstonv4_counters_cleanup() 6817dd52dfSMark Johnston{ 6917dd52dfSMark Johnston pft_cleanup 7017dd52dfSMark Johnston} 7117dd52dfSMark Johnston 7217dd52dfSMark Johnstonatf_test_case "v6_counters" "cleanup" 7317dd52dfSMark Johnstonv6_counters_head() 7417dd52dfSMark Johnston{ 7517dd52dfSMark Johnston atf_set descr 'Verify per-address counters for v6' 7617dd52dfSMark Johnston atf_set require.user root 7717dd52dfSMark Johnston} 7817dd52dfSMark Johnston 7917dd52dfSMark Johnstonv6_counters_body() 8017dd52dfSMark Johnston{ 8117dd52dfSMark Johnston pft_init 8217dd52dfSMark Johnston 8317dd52dfSMark Johnston epair_send=$(vnet_mkepair) 8417dd52dfSMark Johnston ifconfig ${epair_send}a inet6 2001:db8:42::1/64 up no_dad -ifdisabled 8517dd52dfSMark Johnston 8617dd52dfSMark Johnston vnet_mkjail alcatraz ${epair_send}b 8717dd52dfSMark Johnston jexec alcatraz ifconfig ${epair_send}b inet6 2001:db8:42::2/64 up no_dad 8817dd52dfSMark Johnston jexec alcatraz pfctl -e 8917dd52dfSMark Johnston 9017dd52dfSMark Johnston pft_set_rules alcatraz \ 9117dd52dfSMark Johnston "table <foo6> counters { 2001:db8:42::1 }" \ 9217dd52dfSMark Johnston "block all" \ 9317dd52dfSMark Johnston "pass in from <foo6> to any" \ 943a1f834bSDoug Rabson "pass out from any to <foo6>" \ 953a1f834bSDoug Rabson "set skip on lo" 9617dd52dfSMark Johnston 9701f3f354SAlan Somers atf_check -s exit:0 -o ignore ping -6 -c 3 2001:db8:42::2 9817dd52dfSMark Johnston 9917dd52dfSMark Johnston atf_check -s exit:0 -e ignore \ 10017dd52dfSMark Johnston -o match:'In/Block:.*'"$TABLE_STATS_ZERO_REGEXP" \ 10117dd52dfSMark Johnston -o match:'In/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 10217dd52dfSMark Johnston -o match:'Out/Block:.*'"$TABLE_STATS_ZERO_REGEXP" \ 10317dd52dfSMark Johnston -o match:'Out/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 10417dd52dfSMark Johnston jexec alcatraz pfctl -t foo6 -T show -vv 10517dd52dfSMark Johnston} 10617dd52dfSMark Johnston 10717dd52dfSMark Johnstonv6_counters_cleanup() 10817dd52dfSMark Johnston{ 10917dd52dfSMark Johnston pft_cleanup 11017dd52dfSMark Johnston} 11117dd52dfSMark Johnston 112d11a1965SKristof Provostatf_test_case "match_counters" "cleanup" 113d11a1965SKristof Provostmatch_counters_head() 114d11a1965SKristof Provost{ 115d11a1965SKristof Provost atf_set descr 'Test that counters for tables in match rules work' 116d11a1965SKristof Provost atf_set require.user root 117d11a1965SKristof Provost} 118d11a1965SKristof Provost 119d11a1965SKristof Provostmatch_counters_body() 120d11a1965SKristof Provost{ 121d11a1965SKristof Provost pft_init 122d11a1965SKristof Provost 123d11a1965SKristof Provost epair_send=$(vnet_mkepair) 124d11a1965SKristof Provost ifconfig ${epair_send}a 192.0.2.1/24 up 125d11a1965SKristof Provost 126d11a1965SKristof Provost vnet_mkjail alcatraz ${epair_send}b 127d11a1965SKristof Provost jexec alcatraz ifconfig ${epair_send}b 192.0.2.2/24 up 128d11a1965SKristof Provost jexec alcatraz pfctl -e 129d11a1965SKristof Provost 130d11a1965SKristof Provost pft_set_rules alcatraz \ 131d11a1965SKristof Provost "table <foo> counters { 192.0.2.1 }" \ 132d11a1965SKristof Provost "pass all" \ 133d11a1965SKristof Provost "match in from <foo> to any" \ 134d11a1965SKristof Provost "match out from any to <foo>" \ 135d11a1965SKristof Provost "set skip on lo" 136d11a1965SKristof Provost 137d11a1965SKristof Provost atf_check -s exit:0 -o ignore ping -c 3 192.0.2.2 138d11a1965SKristof Provost 139d11a1965SKristof Provost atf_check -s exit:0 -e ignore \ 140d11a1965SKristof Provost -o match:'In/Block:.*'"$TABLE_STATS_ZERO_REGEXP" \ 141d11a1965SKristof Provost -o match:'In/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 142d11a1965SKristof Provost -o match:'Out/Block:.*'"$TABLE_STATS_ZERO_REGEXP" \ 143d11a1965SKristof Provost -o match:'Out/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 144d11a1965SKristof Provost jexec alcatraz pfctl -t foo -T show -vv 145d11a1965SKristof Provost} 146d11a1965SKristof Provost 147d11a1965SKristof Provostmatch_counters_cleanup() 148d11a1965SKristof Provost{ 149d11a1965SKristof Provost pft_cleanup 150d11a1965SKristof Provost} 151d11a1965SKristof Provost 1526463b6b5SKristof Provostatf_test_case "zero_one" "cleanup" 1536463b6b5SKristof Provostzero_one_head() 1546463b6b5SKristof Provost{ 1556463b6b5SKristof Provost atf_set descr 'Test zeroing a single address in a table' 1566463b6b5SKristof Provost atf_set require.user root 1576463b6b5SKristof Provost} 1586463b6b5SKristof Provost 1590749d813SLeonid Evdokimovpft_cleared_ctime() 1600749d813SLeonid Evdokimov{ 1610749d813SLeonid Evdokimov jexec "$1" pfctl -t "$2" -vvT show | awk -v ip="$3" ' 1620749d813SLeonid Evdokimov ($1 == ip) { m = 1 } 1630749d813SLeonid Evdokimov ($1 == "Cleared:" && m) { 1640749d813SLeonid Evdokimov sub("[[:space:]]*Cleared:[[:space:]]*", ""); print; exit }' 1650749d813SLeonid Evdokimov} 1660749d813SLeonid Evdokimov 1670749d813SLeonid Evdokimovctime_to_unixtime() 1680749d813SLeonid Evdokimov{ 1690749d813SLeonid Evdokimov # NB: it's not TZ=UTC, it's TZ=/etc/localtime 1700749d813SLeonid Evdokimov date -jf '%a %b %d %H:%M:%S %Y' "$1" '+%s' 1710749d813SLeonid Evdokimov} 1720749d813SLeonid Evdokimov 1736463b6b5SKristof Provostzero_one_body() 1746463b6b5SKristof Provost{ 175e736f6dfSKristof Provost pft_init 176e736f6dfSKristof Provost 1776463b6b5SKristof Provost epair_send=$(vnet_mkepair) 1786463b6b5SKristof Provost ifconfig ${epair_send}a 192.0.2.1/24 up 1796463b6b5SKristof Provost ifconfig ${epair_send}a inet alias 192.0.2.3/24 1806463b6b5SKristof Provost 1816463b6b5SKristof Provost vnet_mkjail alcatraz ${epair_send}b 1826463b6b5SKristof Provost jexec alcatraz ifconfig ${epair_send}b 192.0.2.2/24 up 1836463b6b5SKristof Provost jexec alcatraz pfctl -e 1846463b6b5SKristof Provost 1856463b6b5SKristof Provost pft_set_rules alcatraz \ 1866463b6b5SKristof Provost "table <foo> counters { 192.0.2.1, 192.0.2.3 }" \ 1876463b6b5SKristof Provost "block all" \ 1886463b6b5SKristof Provost "pass in from <foo> to any" \ 1896463b6b5SKristof Provost "pass out from any to <foo>" \ 1906463b6b5SKristof Provost "set skip on lo" 1916463b6b5SKristof Provost 1926463b6b5SKristof Provost atf_check -s exit:0 -o ignore ping -c 3 -S 192.0.2.1 192.0.2.2 1936463b6b5SKristof Provost atf_check -s exit:0 -o ignore ping -c 3 -S 192.0.2.3 192.0.2.2 1946463b6b5SKristof Provost 1956463b6b5SKristof Provost jexec alcatraz pfctl -t foo -T show -vv 1966463b6b5SKristof Provost 1976463b6b5SKristof Provost atf_check -s exit:0 -e ignore \ 1986463b6b5SKristof Provost -o match:'In/Block:.*'"$TABLE_STATS_ZERO_REGEXP" \ 1996463b6b5SKristof Provost -o match:'In/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 2006463b6b5SKristof Provost -o match:'Out/Block:.*'"$TABLE_STATS_ZERO_REGEXP" \ 2016463b6b5SKristof Provost -o match:'Out/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 2026463b6b5SKristof Provost jexec alcatraz pfctl -t foo -T show -vv 2036463b6b5SKristof Provost 2040749d813SLeonid Evdokimov local uniq base ts1 ts3 2050749d813SLeonid Evdokimov uniq=`jexec alcatraz pfctl -t foo -vvT show | sort -u | grep -c Cleared` 2060749d813SLeonid Evdokimov atf_check_equal 1 "$uniq" # time they were added 2070749d813SLeonid Evdokimov 2080749d813SLeonid Evdokimov base=`pft_cleared_ctime alcatraz foo 192.0.2.1` 2090749d813SLeonid Evdokimov 2106463b6b5SKristof Provost atf_check -s exit:0 -e ignore \ 2116463b6b5SKristof Provost jexec alcatraz pfctl -t foo -T zero 192.0.2.3 2126463b6b5SKristof Provost 2130749d813SLeonid Evdokimov ts1=`pft_cleared_ctime alcatraz foo 192.0.2.1` 2140749d813SLeonid Evdokimov atf_check_equal "$base" "$ts1" 2150749d813SLeonid Evdokimov 2160749d813SLeonid Evdokimov ts3=`pft_cleared_ctime alcatraz foo 192.0.2.3` 2170749d813SLeonid Evdokimov atf_check test "$ts1" != "$ts3" 2180749d813SLeonid Evdokimov 2190749d813SLeonid Evdokimov ts1=`ctime_to_unixtime "$ts1"` 2200749d813SLeonid Evdokimov ts3=`ctime_to_unixtime "$ts3"` 2210749d813SLeonid Evdokimov atf_check test $(( "$ts3" - "$ts1" )) -lt 10 # (3 pings * 2) + epsilon 2220749d813SLeonid Evdokimov atf_check test "$ts1" -lt "$ts3" 2230749d813SLeonid Evdokimov 2246463b6b5SKristof Provost # We now have a zeroed and a non-zeroed counter, so both patterns 2256463b6b5SKristof Provost # should match 2266463b6b5SKristof Provost atf_check -s exit:0 -e ignore \ 2276463b6b5SKristof Provost -o match:'In/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 2286463b6b5SKristof Provost -o match:'Out/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 2296463b6b5SKristof Provost -o match:'In/Pass:.*'"$TABLE_STATS_ZERO_REGEXP" \ 2306463b6b5SKristof Provost -o match:'Out/Pass:.*'"$TABLE_STATS_ZERO_REGEXP" \ 2316463b6b5SKristof Provost jexec alcatraz pfctl -t foo -T show -vv 2326463b6b5SKristof Provost} 2336463b6b5SKristof Provost 2346463b6b5SKristof Provostzero_one_cleanup() 2356463b6b5SKristof Provost{ 2366463b6b5SKristof Provost pft_cleanup 2376463b6b5SKristof Provost} 2386463b6b5SKristof Provost 239*fd52a9e1SKristof Provostatf_test_case "zero_all" "cleanup" 240*fd52a9e1SKristof Provostzero_all_head() 241*fd52a9e1SKristof Provost{ 242*fd52a9e1SKristof Provost atf_set descr 'Test zeroing all table entries' 243*fd52a9e1SKristof Provost atf_set require.user root 244*fd52a9e1SKristof Provost} 245*fd52a9e1SKristof Provost 246*fd52a9e1SKristof Provostzero_all_body() 247*fd52a9e1SKristof Provost{ 248*fd52a9e1SKristof Provost pft_init 249*fd52a9e1SKristof Provost 250*fd52a9e1SKristof Provost epair_send=$(vnet_mkepair) 251*fd52a9e1SKristof Provost ifconfig ${epair_send}a 192.0.2.1/24 up 252*fd52a9e1SKristof Provost ifconfig ${epair_send}a inet alias 192.0.2.3/24 253*fd52a9e1SKristof Provost 254*fd52a9e1SKristof Provost vnet_mkjail alcatraz ${epair_send}b 255*fd52a9e1SKristof Provost jexec alcatraz ifconfig ${epair_send}b 192.0.2.2/24 up 256*fd52a9e1SKristof Provost jexec alcatraz pfctl -e 257*fd52a9e1SKristof Provost 258*fd52a9e1SKristof Provost pft_set_rules alcatraz \ 259*fd52a9e1SKristof Provost "table <foo> counters { 192.0.2.1, 192.0.2.3 }" \ 260*fd52a9e1SKristof Provost "block all" \ 261*fd52a9e1SKristof Provost "pass in from <foo> to any" \ 262*fd52a9e1SKristof Provost "pass out from any to <foo>" \ 263*fd52a9e1SKristof Provost "set skip on lo" 264*fd52a9e1SKristof Provost 265*fd52a9e1SKristof Provost atf_check -s exit:0 -o ignore ping -c 3 -S 192.0.2.1 192.0.2.2 266*fd52a9e1SKristof Provost atf_check -s exit:0 -o ignore ping -c 3 -S 192.0.2.3 192.0.2.2 267*fd52a9e1SKristof Provost 268*fd52a9e1SKristof Provost jexec alcatraz pfctl -t foo -T show -vv 269*fd52a9e1SKristof Provost atf_check -s exit:0 -e ignore \ 270*fd52a9e1SKristof Provost -o match:'In/Block:.*'"$TABLE_STATS_ZERO_REGEXP" \ 271*fd52a9e1SKristof Provost -o match:'In/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 272*fd52a9e1SKristof Provost -o match:'Out/Block:.*'"$TABLE_STATS_ZERO_REGEXP" \ 273*fd52a9e1SKristof Provost -o match:'Out/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 274*fd52a9e1SKristof Provost jexec alcatraz pfctl -t foo -T show -vv 275*fd52a9e1SKristof Provost 276*fd52a9e1SKristof Provost atf_check -s exit:0 -e ignore \ 277*fd52a9e1SKristof Provost jexec alcatraz pfctl -t foo -T zero 278*fd52a9e1SKristof Provost 279*fd52a9e1SKristof Provost jexec alcatraz pfctl -t foo -T show -vv 280*fd52a9e1SKristof Provost atf_check -s exit:0 -e ignore \ 281*fd52a9e1SKristof Provost -o match:'In/Pass:.*'"$TABLE_STATS_ZERO_REGEXP" \ 282*fd52a9e1SKristof Provost -o match:'Out/Pass:.*'"$TABLE_STATS_ZERO_REGEXP" \ 283*fd52a9e1SKristof Provost -o match:'In/Pass:.*'"$TABLE_STATS_ZERO_REGEXP" \ 284*fd52a9e1SKristof Provost -o match:'Out/Pass:.*'"$TABLE_STATS_ZERO_REGEXP" \ 285*fd52a9e1SKristof Provost jexec alcatraz pfctl -t foo -T show -vv 286*fd52a9e1SKristof Provost} 287*fd52a9e1SKristof Provost 288*fd52a9e1SKristof Provostzero_all_cleanup() 289*fd52a9e1SKristof Provost{ 290*fd52a9e1SKristof Provost pft_cleanup 291*fd52a9e1SKristof Provost} 292*fd52a9e1SKristof Provost 2935b59b0c6SLeonid Evdokimovatf_test_case "reset_nonzero" "cleanup" 2945b59b0c6SLeonid Evdokimovreset_nonzero_head() 2955b59b0c6SLeonid Evdokimov{ 2965b59b0c6SLeonid Evdokimov atf_set descr 'Test zeroing an address with non-zero counters' 2975b59b0c6SLeonid Evdokimov atf_set require.user root 2985b59b0c6SLeonid Evdokimov} 2995b59b0c6SLeonid Evdokimov 3005b59b0c6SLeonid Evdokimovreset_nonzero_body() 3015b59b0c6SLeonid Evdokimov{ 302e736f6dfSKristof Provost pft_init 303e736f6dfSKristof Provost 3045b59b0c6SLeonid Evdokimov epair_send=$(vnet_mkepair) 3055b59b0c6SLeonid Evdokimov ifconfig ${epair_send}a 192.0.2.1/24 up 3065b59b0c6SLeonid Evdokimov ifconfig ${epair_send}a inet alias 192.0.2.3/24 3075b59b0c6SLeonid Evdokimov 3085b59b0c6SLeonid Evdokimov vnet_mkjail alcatraz ${epair_send}b 3095b59b0c6SLeonid Evdokimov jexec alcatraz ifconfig ${epair_send}b 192.0.2.2/24 up 3105b59b0c6SLeonid Evdokimov jexec alcatraz pfctl -e 3115b59b0c6SLeonid Evdokimov 3125b59b0c6SLeonid Evdokimov pft_set_rules alcatraz \ 3135b59b0c6SLeonid Evdokimov "table <foo> counters { 192.0.2.1, 192.0.2.3 }" \ 3145b59b0c6SLeonid Evdokimov "table <bar> counters { }" \ 3155b59b0c6SLeonid Evdokimov "block all" \ 3165b59b0c6SLeonid Evdokimov "pass in from <foo> to any" \ 3175b59b0c6SLeonid Evdokimov "pass out from any to <foo>" \ 3185b59b0c6SLeonid Evdokimov "pass on notReallyAnIf from <bar> to <bar>" \ 3195b59b0c6SLeonid Evdokimov "set skip on lo" 3205b59b0c6SLeonid Evdokimov 3215b59b0c6SLeonid Evdokimov # Nonexisting table can't be reset, following `-T show`. 3225b59b0c6SLeonid Evdokimov atf_check -o ignore \ 3235b59b0c6SLeonid Evdokimov -s not-exit:0 \ 3245b59b0c6SLeonid Evdokimov -e inline:"pfctl: Table does not exist.\n" \ 3255b59b0c6SLeonid Evdokimov jexec alcatraz pfctl -t nonexistent -T reset 3265b59b0c6SLeonid Evdokimov 3275b59b0c6SLeonid Evdokimov atf_check -o ignore \ 3285b59b0c6SLeonid Evdokimov -s exit:0 \ 3295b59b0c6SLeonid Evdokimov -e inline:"0/0 stats cleared.\n" \ 3305b59b0c6SLeonid Evdokimov jexec alcatraz pfctl -t bar -T reset 3315b59b0c6SLeonid Evdokimov 3325b59b0c6SLeonid Evdokimov # No-op is a valid operation. 3335b59b0c6SLeonid Evdokimov atf_check -s exit:0 \ 3345b59b0c6SLeonid Evdokimov -e inline:"0/2 stats cleared.\n" \ 3355b59b0c6SLeonid Evdokimov jexec alcatraz pfctl -t foo -T reset 3365b59b0c6SLeonid Evdokimov 3375b59b0c6SLeonid Evdokimov atf_check -s exit:0 -o ignore ping -c 3 -S 192.0.2.3 192.0.2.2 3385b59b0c6SLeonid Evdokimov 3395b59b0c6SLeonid Evdokimov atf_check -s exit:0 -e ignore \ 3405b59b0c6SLeonid Evdokimov -o match:'In/Pass:.*'"$TABLE_STATS_ZERO_REGEXP" \ 3415b59b0c6SLeonid Evdokimov -o match:'In/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 3425b59b0c6SLeonid Evdokimov -o match:'Out/Pass:.*'"$TABLE_STATS_ZERO_REGEXP" \ 3435b59b0c6SLeonid Evdokimov -o match:'Out/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 3445b59b0c6SLeonid Evdokimov jexec alcatraz pfctl -t foo -vvT show 3455b59b0c6SLeonid Evdokimov 3465b59b0c6SLeonid Evdokimov local clrd uniq 3475b59b0c6SLeonid Evdokimov clrd=`jexec alcatraz pfctl -t foo -vvT show | grep -c Cleared` 3485b59b0c6SLeonid Evdokimov uniq=`jexec alcatraz pfctl -t foo -vvT show | sort -u | grep -c Cleared` 3495b59b0c6SLeonid Evdokimov atf_check_equal "$clrd" 2 3505b59b0c6SLeonid Evdokimov atf_check_equal "$uniq" 1 # time they were added 3515b59b0c6SLeonid Evdokimov 3525b59b0c6SLeonid Evdokimov atf_check -s exit:0 -e ignore \ 3535b59b0c6SLeonid Evdokimov -e inline:"1/2 stats cleared.\n" \ 3545b59b0c6SLeonid Evdokimov jexec alcatraz pfctl -t foo -T reset 3555b59b0c6SLeonid Evdokimov 3565b59b0c6SLeonid Evdokimov clrd=`jexec alcatraz pfctl -t foo -vvT show | grep -c Cleared` 3575b59b0c6SLeonid Evdokimov uniq=`jexec alcatraz pfctl -t foo -vvT show | sort -u | grep -c Cleared` 3585b59b0c6SLeonid Evdokimov atf_check_equal "$clrd" 2 3595b59b0c6SLeonid Evdokimov atf_check_equal "$uniq" 2 # 192.0.2.3 should get new timestamp 3605b59b0c6SLeonid Evdokimov 3615b59b0c6SLeonid Evdokimov atf_check -s exit:0 -e ignore \ 3625b59b0c6SLeonid Evdokimov -o not-match:'In/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 3635b59b0c6SLeonid Evdokimov -o not-match:'Out/Pass:.*'"$TABLE_STATS_NONZERO_REGEXP" \ 3645b59b0c6SLeonid Evdokimov -o match:'In/Pass:.*'"$TABLE_STATS_ZERO_REGEXP" \ 3655b59b0c6SLeonid Evdokimov -o match:'Out/Pass:.*'"$TABLE_STATS_ZERO_REGEXP" \ 3665b59b0c6SLeonid Evdokimov jexec alcatraz pfctl -t foo -vvT show 3675b59b0c6SLeonid Evdokimov} 3685b59b0c6SLeonid Evdokimov 3695b59b0c6SLeonid Evdokimovreset_nonzero_cleanup() 3705b59b0c6SLeonid Evdokimov{ 3715b59b0c6SLeonid Evdokimov pft_cleanup 3725b59b0c6SLeonid Evdokimov} 3735b59b0c6SLeonid Evdokimov 374e997614fSKristof Provostatf_test_case "pr251414" "cleanup" 375e997614fSKristof Provostpr251414_head() 376e997614fSKristof Provost{ 377e997614fSKristof Provost atf_set descr 'Test PR 251414' 378e997614fSKristof Provost atf_set require.user root 379e997614fSKristof Provost} 380e997614fSKristof Provost 381e997614fSKristof Provostpr251414_body() 382e997614fSKristof Provost{ 383e997614fSKristof Provost pft_init 384e997614fSKristof Provost 385e997614fSKristof Provost epair_send=$(vnet_mkepair) 386e997614fSKristof Provost ifconfig ${epair_send}a 192.0.2.1/24 up 387e997614fSKristof Provost 388e997614fSKristof Provost vnet_mkjail alcatraz ${epair_send}b 389e997614fSKristof Provost jexec alcatraz ifconfig ${epair_send}b 192.0.2.2/24 up 390e997614fSKristof Provost jexec alcatraz pfctl -e 391e997614fSKristof Provost 392e997614fSKristof Provost pft_set_rules alcatraz \ 393e997614fSKristof Provost "pass all" \ 394e997614fSKristof Provost "table <tab> { self }" \ 395e997614fSKristof Provost "pass in log to <tab>" 396e997614fSKristof Provost 397e997614fSKristof Provost pft_set_rules noflush alcatraz \ 398e997614fSKristof Provost "pass all" \ 399e997614fSKristof Provost "table <tab> counters { self }" \ 400e997614fSKristof Provost "pass in log to <tab>" 401e997614fSKristof Provost 402e997614fSKristof Provost atf_check -s exit:0 -o ignore ping -c 3 192.0.2.2 403e997614fSKristof Provost 404e997614fSKristof Provost jexec alcatraz pfctl -t tab -T show -vv 405e997614fSKristof Provost} 406e997614fSKristof Provost 407e997614fSKristof Provostpr251414_cleanup() 408e997614fSKristof Provost{ 409e997614fSKristof Provost pft_cleanup 410e997614fSKristof Provost} 411e997614fSKristof Provost 41208d77308SKristof Provostatf_test_case "automatic" "cleanup" 41308d77308SKristof Provostautomatic_head() 41408d77308SKristof Provost{ 41508d77308SKristof Provost atf_set descr "Test automatic - optimizer generated - tables" 41608d77308SKristof Provost atf_set require.user root 41708d77308SKristof Provost} 41808d77308SKristof Provost 41908d77308SKristof Provostautomatic_body() 42008d77308SKristof Provost{ 42108d77308SKristof Provost pft_init 42208d77308SKristof Provost 42308d77308SKristof Provost epair=$(vnet_mkepair) 42408d77308SKristof Provost ifconfig ${epair}a 192.0.2.1/24 up 42508d77308SKristof Provost 42608d77308SKristof Provost vnet_mkjail alcatraz ${epair}b 42708d77308SKristof Provost jexec alcatraz ifconfig ${epair}b 192.0.2.2/24 up 42808d77308SKristof Provost jexec alcatraz pfctl -e 42908d77308SKristof Provost 43008d77308SKristof Provost pft_set_rules alcatraz \ 43108d77308SKristof Provost "block in" \ 43208d77308SKristof Provost "pass in proto icmp from 192.0.2.1" \ 43308d77308SKristof Provost "pass in proto icmp from 192.0.2.3" \ 43408d77308SKristof Provost "pass in proto icmp from 192.0.2.4" \ 43508d77308SKristof Provost "pass in proto icmp from 192.0.2.5" \ 43608d77308SKristof Provost "pass in proto icmp from 192.0.2.6" \ 43708d77308SKristof Provost "pass in proto icmp from 192.0.2.7" \ 43808d77308SKristof Provost "pass in proto icmp from 192.0.2.8" \ 43908d77308SKristof Provost "pass in proto icmp from 192.0.2.9" 44008d77308SKristof Provost 44108d77308SKristof Provost atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2 44208d77308SKristof Provost} 44308d77308SKristof Provost 44408d77308SKristof Provostautomatic_cleanup() 44508d77308SKristof Provost{ 44608d77308SKristof Provost pft_cleanup 44708d77308SKristof Provost} 44808d77308SKristof Provost 449daa5350dSKristof Provostatf_test_case "network" "cleanup" 450daa5350dSKristof Provostnetwork_head() 451daa5350dSKristof Provost{ 452daa5350dSKristof Provost atf_set descr 'Test <ifgroup>:network' 453daa5350dSKristof Provost atf_set require.user root 454daa5350dSKristof Provost} 455daa5350dSKristof Provost 456daa5350dSKristof Provostnetwork_body() 457daa5350dSKristof Provost{ 458daa5350dSKristof Provost pft_init 459daa5350dSKristof Provost 460daa5350dSKristof Provost epair=$(vnet_mkepair) 461daa5350dSKristof Provost ifconfig ${epair}a 192.0.2.1/24 up 462daa5350dSKristof Provost 463daa5350dSKristof Provost vnet_mkjail alcatraz ${epair}b 464daa5350dSKristof Provost jexec alcatraz ifconfig ${epair}b 192.0.2.2/24 up 465daa5350dSKristof Provost jexec alcatraz pfctl -e 466daa5350dSKristof Provost 467daa5350dSKristof Provost pft_set_rules alcatraz \ 468daa5350dSKristof Provost "table <allow> const { epair:network }"\ 469daa5350dSKristof Provost "block in" \ 470daa5350dSKristof Provost "pass in from <allow>" 471daa5350dSKristof Provost 472daa5350dSKristof Provost atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2 473daa5350dSKristof Provost} 474daa5350dSKristof Provost 475daa5350dSKristof Provostnetwork_cleanup() 476daa5350dSKristof Provost{ 477daa5350dSKristof Provost pft_cleanup 478daa5350dSKristof Provost} 479daa5350dSKristof Provost 4802de49deeSKristof Provostatf_test_case "pr259689" "cleanup" 4812de49deeSKristof Provostpr259689_head() 4822de49deeSKristof Provost{ 4832de49deeSKristof Provost atf_set descr 'Test PR 259689' 4842de49deeSKristof Provost atf_set require.user root 4852de49deeSKristof Provost} 4862de49deeSKristof Provost 4872de49deeSKristof Provostpr259689_body() 4882de49deeSKristof Provost{ 4892de49deeSKristof Provost pft_init 4902de49deeSKristof Provost 4912de49deeSKristof Provost vnet_mkjail alcatraz 4922de49deeSKristof Provost jexec alcatraz pfctl -e 4932de49deeSKristof Provost 4942de49deeSKristof Provost pft_set_rules alcatraz \ 4952de49deeSKristof Provost "pass in" \ 4962de49deeSKristof Provost "block in inet from { 1.1.1.1, 1.1.1.2, 2.2.2.2, 2.2.2.3, 4.4.4.4, 4.4.4.5 }" 4972de49deeSKristof Provost 4982de49deeSKristof Provost atf_check -o match:'block drop in inet from <__automatic_.*:6> to any' \ 4992de49deeSKristof Provost -e ignore \ 5002de49deeSKristof Provost jexec alcatraz pfctl -sr -vv 5012de49deeSKristof Provost} 5022de49deeSKristof Provost 5032de49deeSKristof Provostpr259689_cleanup() 5042de49deeSKristof Provost{ 5052de49deeSKristof Provost pft_cleanup 5062de49deeSKristof Provost} 5072de49deeSKristof Provost 50810941899SKristof Provostatf_test_case "precreate" "cleanup" 50910941899SKristof Provostprecreate_head() 51010941899SKristof Provost{ 51110941899SKristof Provost atf_set descr 'Test creating a table without counters, then loading rules that add counters' 51210941899SKristof Provost atf_set require.user root 51310941899SKristof Provost} 51410941899SKristof Provost 51510941899SKristof Provostprecreate_body() 51610941899SKristof Provost{ 51710941899SKristof Provost pft_init 51810941899SKristof Provost 51910941899SKristof Provost vnet_mkjail alcatraz 52010941899SKristof Provost 52110941899SKristof Provost jexec alcatraz pfctl -t foo -T add 192.0.2.1 52210941899SKristof Provost jexec alcatraz pfctl -t foo -T show 52310941899SKristof Provost 52410941899SKristof Provost pft_set_rules noflush alcatraz \ 52510941899SKristof Provost "table <foo> counters persist" \ 52610941899SKristof Provost "pass in from <foo>" 52710941899SKristof Provost 52810941899SKristof Provost # Expect all counters to be zero 52910941899SKristof Provost atf_check -s exit:0 -e ignore \ 53010941899SKristof Provost -o match:'In/Block:.*'"$TABLE_STATS_ZERO_REGEXP" \ 53110941899SKristof Provost -o match:'In/Pass:.*'"$TABLE_STATS_ZERO_REGEXP" \ 53210941899SKristof Provost -o match:'Out/Block:.*'"$TABLE_STATS_ZERO_REGEXP" \ 53310941899SKristof Provost -o match:'Out/Pass:.*'"$TABLE_STATS_ZERO_REGEXP" \ 53410941899SKristof Provost jexec alcatraz pfctl -t foo -T show -vv 53510941899SKristof Provost 53610941899SKristof Provost} 53710941899SKristof Provost 53810941899SKristof Provostprecreate_cleanup() 53910941899SKristof Provost{ 54010941899SKristof Provost pft_cleanup 54110941899SKristof Provost} 54210941899SKristof Provost 5437d3fc84bSKristof Provostatf_test_case "anchor" "cleanup" 5447d3fc84bSKristof Provostanchor_head() 5457d3fc84bSKristof Provost{ 5467d3fc84bSKristof Provost atf_set descr 'Test tables in anchors' 5477d3fc84bSKristof Provost atf_set require.user root 5487d3fc84bSKristof Provost} 5497d3fc84bSKristof Provost 5507d3fc84bSKristof Provostanchor_body() 5517d3fc84bSKristof Provost{ 5527d3fc84bSKristof Provost pft_init 5537d3fc84bSKristof Provost 5547d3fc84bSKristof Provost epair=$(vnet_mkepair) 5557d3fc84bSKristof Provost ifconfig ${epair}a 192.0.2.1/24 up 5567d3fc84bSKristof Provost 5577d3fc84bSKristof Provost vnet_mkjail alcatraz ${epair}b 5587d3fc84bSKristof Provost jexec alcatraz ifconfig ${epair}b 192.0.2.2/24 up 5597d3fc84bSKristof Provost jexec alcatraz pfctl -e 5607d3fc84bSKristof Provost 5617d3fc84bSKristof Provost (echo "table <testtable> persist" 5627d3fc84bSKristof Provost echo "block in quick from <testtable> to any" 5637d3fc84bSKristof Provost ) | jexec alcatraz pfctl -a anchorage -f - 5647d3fc84bSKristof Provost 5657d3fc84bSKristof Provost pft_set_rules noflush alcatraz \ 5667d3fc84bSKristof Provost "pass" \ 5677d3fc84bSKristof Provost "anchor anchorage" 5687d3fc84bSKristof Provost 5697d3fc84bSKristof Provost atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2 5707d3fc84bSKristof Provost 5717d3fc84bSKristof Provost # Tables belong to anchors, so this is a different table and won't affect anything 5727d3fc84bSKristof Provost jexec alcatraz pfctl -t testtable -T add 192.0.2.1 5737d3fc84bSKristof Provost atf_check -s exit:0 -o ignore ping -c 1 192.0.2.2 5747d3fc84bSKristof Provost 5757d3fc84bSKristof Provost # But when we add the address to the table in the anchor it does block traffic 5767d3fc84bSKristof Provost jexec alcatraz pfctl -a anchorage -t testtable -T add 192.0.2.1 5777d3fc84bSKristof Provost atf_check -s exit:2 -o ignore ping -c 1 192.0.2.2 5787d3fc84bSKristof Provost} 5797d3fc84bSKristof Provost 5807d3fc84bSKristof Provostanchor_cleanup() 5817d3fc84bSKristof Provost{ 5827d3fc84bSKristof Provost pft_cleanup 5837d3fc84bSKristof Provost} 5847d3fc84bSKristof Provost 58517dd52dfSMark Johnstonatf_init_test_cases() 58617dd52dfSMark Johnston{ 58717dd52dfSMark Johnston atf_add_test_case "v4_counters" 58817dd52dfSMark Johnston atf_add_test_case "v6_counters" 589d11a1965SKristof Provost atf_add_test_case "match_counters" 5906463b6b5SKristof Provost atf_add_test_case "zero_one" 591*fd52a9e1SKristof Provost atf_add_test_case "zero_all" 5925b59b0c6SLeonid Evdokimov atf_add_test_case "reset_nonzero" 593e997614fSKristof Provost atf_add_test_case "pr251414" 59408d77308SKristof Provost atf_add_test_case "automatic" 595daa5350dSKristof Provost atf_add_test_case "network" 5962de49deeSKristof Provost atf_add_test_case "pr259689" 59710941899SKristof Provost atf_add_test_case "precreate" 5987d3fc84bSKristof Provost atf_add_test_case "anchor" 59917dd52dfSMark Johnston} 600