xref: /freebsd/tests/sys/netpfil/pf/table.sh (revision fd52a9e11c5250c196f5ec7fd2cefa64094621c4)
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