xref: /freebsd/tests/sys/netpfil/pf/ioctl/validation.c (revision 4ca41937606064c78a4f5725bb0b2ba021cfd7c3)
198c5f988SKristof Provost /*-
298c5f988SKristof Provost  * Copyright (c) 2018	Kristof Provost <kp@FreeBSD.org>
398c5f988SKristof Provost  *
498c5f988SKristof Provost  * Redistribution and use in source and binary forms, with or without
598c5f988SKristof Provost  * modification, are permitted provided that the following conditions
698c5f988SKristof Provost  * are met:
798c5f988SKristof Provost  * 1. Redistributions of source code must retain the above copyright
898c5f988SKristof Provost  *    notice, this list of conditions and the following disclaimer.
998c5f988SKristof Provost  * 2. Redistributions in binary form must reproduce the above copyright
1098c5f988SKristof Provost  *    notice, this list of conditions and the following disclaimer in the
1198c5f988SKristof Provost  *    documentation and/or other materials provided with the distribution.
1298c5f988SKristof Provost  *
1398c5f988SKristof Provost  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1498c5f988SKristof Provost  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1598c5f988SKristof Provost  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1698c5f988SKristof Provost  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1798c5f988SKristof Provost  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1898c5f988SKristof Provost  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1998c5f988SKristof Provost  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2098c5f988SKristof Provost  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2198c5f988SKristof Provost  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2298c5f988SKristof Provost  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2398c5f988SKristof Provost  * SUCH DAMAGE.
2498c5f988SKristof Provost  *
2598c5f988SKristof Provost  * $FreeBSD$
2698c5f988SKristof Provost  */
2798c5f988SKristof Provost 
2898c5f988SKristof Provost #include <sys/param.h>
2998c5f988SKristof Provost #include <sys/module.h>
3098c5f988SKristof Provost #include <sys/types.h>
3198c5f988SKristof Provost #include <sys/ioctl.h>
3298c5f988SKristof Provost #include <sys/socket.h>
3398c5f988SKristof Provost 
3498c5f988SKristof Provost #include <net/if.h>
3598c5f988SKristof Provost #include <net/pfvar.h>
3698c5f988SKristof Provost 
3798c5f988SKristof Provost #include <fcntl.h>
3898c5f988SKristof Provost #include <stdio.h>
3998c5f988SKristof Provost 
4098c5f988SKristof Provost #include <atf-c.h>
4198c5f988SKristof Provost 
4298c5f988SKristof Provost static int dev;
4398c5f988SKristof Provost 
4498c5f988SKristof Provost #define COMMON_HEAD() \
4598c5f988SKristof Provost 	if (modfind("pf") == -1) \
4698c5f988SKristof Provost 		atf_tc_skip("pf not loaded"); \
4798c5f988SKristof Provost 	dev = open("/dev/pf", O_RDWR); \
4898c5f988SKristof Provost 	if (dev == -1) \
4998c5f988SKristof Provost 		atf_tc_skip("Failed to open /dev/pf");
5098c5f988SKristof Provost 
5198c5f988SKristof Provost #define COMMON_CLEANUP() \
5298c5f988SKristof Provost 	close(dev);
5398c5f988SKristof Provost 
541d2e31afSKyle Evans static void
551ff545d6SKristof Provost common_init_tbl(struct pfr_table *tbl)
561ff545d6SKristof Provost {
571ff545d6SKristof Provost 	bzero(tbl, sizeof(struct pfr_table));
581ff545d6SKristof Provost 	strcpy(tbl->pfrt_anchor, "anchor");
591ff545d6SKristof Provost 	strcpy(tbl->pfrt_name, "name");
601ff545d6SKristof Provost 	tbl->pfrt_flags = 0;
611ff545d6SKristof Provost 	tbl->pfrt_fback = 0;
621ff545d6SKristof Provost }
631ff545d6SKristof Provost 
64d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(addtables);
6587c7063cSKristof Provost ATF_TC_HEAD(addtables, tc)
6687c7063cSKristof Provost {
6787c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
6887c7063cSKristof Provost }
6987c7063cSKristof Provost 
7098c5f988SKristof Provost ATF_TC_BODY(addtables, tc)
7198c5f988SKristof Provost {
7298c5f988SKristof Provost 	struct pfioc_table io;
7398c5f988SKristof Provost 	struct pfr_table tbl;
741bb72c29SKristof Provost 	struct pfr_table tbls[4];
7598c5f988SKristof Provost 	int flags;
7698c5f988SKristof Provost 
7798c5f988SKristof Provost 	COMMON_HEAD();
7898c5f988SKristof Provost 
7998c5f988SKristof Provost 	flags = 0;
8098c5f988SKristof Provost 
8198c5f988SKristof Provost 	bzero(&io, sizeof(io));
8298c5f988SKristof Provost 	io.pfrio_flags = flags;
8398c5f988SKristof Provost 	io.pfrio_buffer = &tbl;
8498c5f988SKristof Provost 	io.pfrio_esize = sizeof(tbl);
8598c5f988SKristof Provost 
8698c5f988SKristof Provost 	/* Negative size */
8798c5f988SKristof Provost 	io.pfrio_size = -1;
8898c5f988SKristof Provost 	if (ioctl(dev, DIOCRADDTABLES, &io) == 0)
8998c5f988SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
9098c5f988SKristof Provost 
9198c5f988SKristof Provost 	/* Overly large size */
9298c5f988SKristof Provost 	io.pfrio_size = 1 << 24;
9398c5f988SKristof Provost 	if (ioctl(dev, DIOCRADDTABLES, &io) == 0)
9498c5f988SKristof Provost 		atf_tc_fail("Request with size 1 << 24 succeeded");
9598c5f988SKristof Provost 
9698c5f988SKristof Provost 	/* NULL buffer */
9798c5f988SKristof Provost 	io.pfrio_size = 1;
9898c5f988SKristof Provost 	io.pfrio_buffer = NULL;
9998c5f988SKristof Provost 	if (ioctl(dev, DIOCRADDTABLES, &io) == 0)
10098c5f988SKristof Provost 		atf_tc_fail("Request with NULL buffer succeeded");
10198c5f988SKristof Provost 
1021bb72c29SKristof Provost 	/* This can provoke a memory leak, see r331225. */
1031bb72c29SKristof Provost 	io.pfrio_size = 4;
1041bb72c29SKristof Provost 	for (int i = 0; i < io.pfrio_size; i++)
1051bb72c29SKristof Provost 		common_init_tbl(&tbls[i]);
1061bb72c29SKristof Provost 
1071bb72c29SKristof Provost 	io.pfrio_buffer = &tbls;
1081bb72c29SKristof Provost 	ioctl(dev, DIOCRADDTABLES, &io);
109d3cc4030SKristof Provost }
1101bb72c29SKristof Provost 
111d3cc4030SKristof Provost ATF_TC_CLEANUP(addtables, tc)
112d3cc4030SKristof Provost {
11398c5f988SKristof Provost 	COMMON_CLEANUP();
11498c5f988SKristof Provost }
11598c5f988SKristof Provost 
116d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(deltables);
11787c7063cSKristof Provost ATF_TC_HEAD(deltables, tc)
11887c7063cSKristof Provost {
11987c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
12087c7063cSKristof Provost }
12187c7063cSKristof Provost 
12298c5f988SKristof Provost ATF_TC_BODY(deltables, tc)
12398c5f988SKristof Provost {
12498c5f988SKristof Provost 	struct pfioc_table io;
12598c5f988SKristof Provost 	struct pfr_table tbl;
12698c5f988SKristof Provost 	int flags;
12798c5f988SKristof Provost 
12898c5f988SKristof Provost 	COMMON_HEAD();
12998c5f988SKristof Provost 
13098c5f988SKristof Provost 	flags = 0;
13198c5f988SKristof Provost 
13298c5f988SKristof Provost 	bzero(&io, sizeof(io));
13398c5f988SKristof Provost 	io.pfrio_flags = flags;
13498c5f988SKristof Provost 	io.pfrio_buffer = &tbl;
13598c5f988SKristof Provost 	io.pfrio_esize = sizeof(tbl);
13698c5f988SKristof Provost 
13798c5f988SKristof Provost 	/* Negative size */
13898c5f988SKristof Provost 	io.pfrio_size = -1;
13998c5f988SKristof Provost 	if (ioctl(dev, DIOCRDELTABLES, &io) == 0)
14098c5f988SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
14198c5f988SKristof Provost 
14298c5f988SKristof Provost 	/* Overly large size */
14398c5f988SKristof Provost 	io.pfrio_size = 1 << 24;
14498c5f988SKristof Provost 	if (ioctl(dev, DIOCRDELTABLES, &io) == 0)
14598c5f988SKristof Provost 		atf_tc_fail("Request with size 1 << 24 succeeded");
14698c5f988SKristof Provost 
14798c5f988SKristof Provost 	/* NULL buffer */
14898c5f988SKristof Provost 	io.pfrio_size = 1;
14998c5f988SKristof Provost 	io.pfrio_buffer = NULL;
15098c5f988SKristof Provost 	if (ioctl(dev, DIOCRDELTABLES, &io) == 0)
15198c5f988SKristof Provost 		atf_tc_fail("Request with NULL buffer succeeded");
152d3cc4030SKristof Provost }
15398c5f988SKristof Provost 
154d3cc4030SKristof Provost ATF_TC_CLEANUP(deltables, tc)
155d3cc4030SKristof Provost {
15698c5f988SKristof Provost 	COMMON_CLEANUP();
15798c5f988SKristof Provost }
15898c5f988SKristof Provost 
159d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(gettables);
16087c7063cSKristof Provost ATF_TC_HEAD(gettables, tc)
16187c7063cSKristof Provost {
16287c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
16387c7063cSKristof Provost }
16487c7063cSKristof Provost 
1651ff545d6SKristof Provost ATF_TC_BODY(gettables, tc)
1661ff545d6SKristof Provost {
1671ff545d6SKristof Provost 	struct pfioc_table io;
1681ff545d6SKristof Provost 	struct pfr_table tbl;
1691ff545d6SKristof Provost 	int flags;
1701ff545d6SKristof Provost 
1711ff545d6SKristof Provost 	COMMON_HEAD();
1721ff545d6SKristof Provost 
1731ff545d6SKristof Provost 	flags = 0;
1741ff545d6SKristof Provost 
1751ff545d6SKristof Provost 	bzero(&io, sizeof(io));
1761ff545d6SKristof Provost 	io.pfrio_flags = flags;
1771ff545d6SKristof Provost 	io.pfrio_buffer = &tbl;
1781ff545d6SKristof Provost 	io.pfrio_esize = sizeof(tbl);
1791ff545d6SKristof Provost 
1801ff545d6SKristof Provost 	/* Negative size. This will succeed, because the kernel will not copy
1811ff545d6SKristof Provost 	 * tables than it has. */
1821ff545d6SKristof Provost 	io.pfrio_size = -1;
1831ff545d6SKristof Provost 	if (ioctl(dev, DIOCRGETTABLES, &io) != 0)
1841ff545d6SKristof Provost 		atf_tc_fail("Request with size -1 failed");
1851ff545d6SKristof Provost 
1861ff545d6SKristof Provost 	/* Overly large size. See above. */
1871ff545d6SKristof Provost 	io.pfrio_size = 1 << 24;
1881ff545d6SKristof Provost 	if (ioctl(dev, DIOCRGETTABLES, &io) != 0)
1891ff545d6SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
190d3cc4030SKristof Provost }
1911ff545d6SKristof Provost 
192d3cc4030SKristof Provost ATF_TC_CLEANUP(gettables, tc)
193d3cc4030SKristof Provost {
1941ff545d6SKristof Provost 	COMMON_CLEANUP();
1951ff545d6SKristof Provost }
1961ff545d6SKristof Provost 
197d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(gettstats);
19887c7063cSKristof Provost ATF_TC_HEAD(gettstats, tc)
19987c7063cSKristof Provost {
20087c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
20187c7063cSKristof Provost }
20287c7063cSKristof Provost 
2031ff545d6SKristof Provost ATF_TC_BODY(gettstats, tc)
2041ff545d6SKristof Provost {
2051ff545d6SKristof Provost 	struct pfioc_table io;
2061ff545d6SKristof Provost 	struct pfr_tstats stats;
2071ff545d6SKristof Provost 	int flags;
2081ff545d6SKristof Provost 
2091ff545d6SKristof Provost 	COMMON_HEAD();
2101ff545d6SKristof Provost 
2111ff545d6SKristof Provost 	flags = 0;
2121ff545d6SKristof Provost 
2131ff545d6SKristof Provost 	bzero(&io, sizeof(io));
2141ff545d6SKristof Provost 	io.pfrio_flags = flags;
2151ff545d6SKristof Provost 	io.pfrio_buffer = &stats;
2161ff545d6SKristof Provost 	io.pfrio_esize = sizeof(stats);
2171ff545d6SKristof Provost 
2181ff545d6SKristof Provost 	/* Negative size. This will succeed, because the kernel will not copy
2191ff545d6SKristof Provost 	 * tables than it has. */
2201ff545d6SKristof Provost 	io.pfrio_size = -1;
2211ff545d6SKristof Provost 	if (ioctl(dev, DIOCRGETTSTATS, &io) != 0)
2221ff545d6SKristof Provost 		atf_tc_fail("Request with size -1 failed");
2231ff545d6SKristof Provost 
2241ff545d6SKristof Provost 	/* Overly large size. See above. */
2251ff545d6SKristof Provost 	io.pfrio_size = 1 << 24;
2261ff545d6SKristof Provost 	if (ioctl(dev, DIOCRGETTSTATS, &io) != 0)
2271ff545d6SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
228d3cc4030SKristof Provost }
2291ff545d6SKristof Provost 
230d3cc4030SKristof Provost ATF_TC_CLEANUP(gettstats, tc)
231d3cc4030SKristof Provost {
2321ff545d6SKristof Provost 	COMMON_CLEANUP();
2331ff545d6SKristof Provost }
2341ff545d6SKristof Provost 
235d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(clrtstats);
23687c7063cSKristof Provost ATF_TC_HEAD(clrtstats, tc)
23787c7063cSKristof Provost {
23887c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
23987c7063cSKristof Provost }
24087c7063cSKristof Provost 
2411ff545d6SKristof Provost ATF_TC_BODY(clrtstats, tc)
2421ff545d6SKristof Provost {
2431ff545d6SKristof Provost 	struct pfioc_table io;
2441ff545d6SKristof Provost 	struct pfr_table tbl;
2451ff545d6SKristof Provost 	int flags;
2461ff545d6SKristof Provost 
2471ff545d6SKristof Provost 	COMMON_HEAD();
2481ff545d6SKristof Provost 
2491ff545d6SKristof Provost 	flags = 0;
2501ff545d6SKristof Provost 
2511ff545d6SKristof Provost 	common_init_tbl(&tbl);
2521ff545d6SKristof Provost 
2531ff545d6SKristof Provost 	bzero(&io, sizeof(io));
2541ff545d6SKristof Provost 	io.pfrio_flags = flags;
2551ff545d6SKristof Provost 	io.pfrio_buffer = &tbl;
2561ff545d6SKristof Provost 	io.pfrio_esize = sizeof(tbl);
2571ff545d6SKristof Provost 
2581ff545d6SKristof Provost 	/* Negative size. This will succeed, because the kernel will not copy
2591ff545d6SKristof Provost 	 * tables than it has. */
2601ff545d6SKristof Provost 	io.pfrio_size = -1;
2611ff545d6SKristof Provost 	if (ioctl(dev, DIOCRCLRTSTATS, &io) != 0)
2621ff545d6SKristof Provost 		atf_tc_fail("Request with size -1 failed ");
2631ff545d6SKristof Provost 
2641ff545d6SKristof Provost 	/* Overly large size. See above. */
2651ff545d6SKristof Provost 	io.pfrio_size = 1 << 24;
2661ff545d6SKristof Provost 	if (ioctl(dev, DIOCRCLRTSTATS, &io) != 0)
2671ff545d6SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
26844117554SKristof Provost 
26944117554SKristof Provost 	io.pfrio_size = sizeof(tbl);
27044117554SKristof Provost 	io.pfrio_buffer = NULL;
27144117554SKristof Provost 	if (ioctl(dev, DIOCRCLRTSTATS, &io) == 0)
27244117554SKristof Provost 		atf_tc_fail("Request with NULL buffer succeeded");
273d3cc4030SKristof Provost }
2741ff545d6SKristof Provost 
275d3cc4030SKristof Provost ATF_TC_CLEANUP(clrtstats, tc)
276d3cc4030SKristof Provost {
2771ff545d6SKristof Provost 	COMMON_CLEANUP();
2781ff545d6SKristof Provost }
2791ff545d6SKristof Provost 
280d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(settflags);
28187c7063cSKristof Provost ATF_TC_HEAD(settflags, tc)
28287c7063cSKristof Provost {
28387c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
28487c7063cSKristof Provost }
28587c7063cSKristof Provost 
2861ff545d6SKristof Provost ATF_TC_BODY(settflags, tc)
2871ff545d6SKristof Provost {
2881ff545d6SKristof Provost 	struct pfioc_table io;
2891ff545d6SKristof Provost 	struct pfr_table tbl;
2901ff545d6SKristof Provost 	int flags;
2911ff545d6SKristof Provost 
2921ff545d6SKristof Provost 	COMMON_HEAD();
2931ff545d6SKristof Provost 
2941ff545d6SKristof Provost 	flags = 0;
2951ff545d6SKristof Provost 
2961ff545d6SKristof Provost 	common_init_tbl(&tbl);
2971ff545d6SKristof Provost 
2981ff545d6SKristof Provost 	bzero(&io, sizeof(io));
2991ff545d6SKristof Provost 	io.pfrio_flags = flags;
3001ff545d6SKristof Provost 	io.pfrio_buffer = &tbl;
3011ff545d6SKristof Provost 	io.pfrio_esize = sizeof(tbl);
3021ff545d6SKristof Provost 
3031ff545d6SKristof Provost 	/* Negative size. This will succeed, because the kernel will not copy
3041ff545d6SKristof Provost 	 * tables than it has. */
3051ff545d6SKristof Provost 	io.pfrio_size = -1;
3061ff545d6SKristof Provost 	if (ioctl(dev, DIOCRSETTFLAGS, &io) != 0)
3071ff545d6SKristof Provost 		atf_tc_fail("Request with size -1 failed");
3081ff545d6SKristof Provost 
3091ff545d6SKristof Provost 	/* Overly large size. See above. */
3101ff545d6SKristof Provost 	io.pfrio_size = 1 << 28;
3111ff545d6SKristof Provost 	if (ioctl(dev, DIOCRSETTFLAGS, &io) != 0)
3121ff545d6SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
313246e18b2SKristof Provost 
314246e18b2SKristof Provost 	/* NULL buffer */
315246e18b2SKristof Provost 	io.pfrio_buffer = NULL;
316246e18b2SKristof Provost 	if (ioctl(dev, DIOCRSETTFLAGS, &io) != -1)
317246e18b2SKristof Provost 		atf_tc_fail("Request with NULL buffer succeeded");
318d3cc4030SKristof Provost }
3191ff545d6SKristof Provost 
320d3cc4030SKristof Provost ATF_TC_CLEANUP(settflags, tc)
321d3cc4030SKristof Provost {
3221ff545d6SKristof Provost 	COMMON_CLEANUP();
3231ff545d6SKristof Provost }
3241ff545d6SKristof Provost 
325d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(addaddrs);
32687c7063cSKristof Provost ATF_TC_HEAD(addaddrs, tc)
32787c7063cSKristof Provost {
32887c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
32987c7063cSKristof Provost }
33087c7063cSKristof Provost 
33162d28676SKristof Provost ATF_TC_BODY(addaddrs, tc)
33262d28676SKristof Provost {
33362d28676SKristof Provost 	struct pfioc_table io;
33462d28676SKristof Provost 	struct pfr_addr addr;
33562d28676SKristof Provost 
33662d28676SKristof Provost 	COMMON_HEAD();
33762d28676SKristof Provost 
33862d28676SKristof Provost 	bzero(&addr, sizeof(addr));
33962d28676SKristof Provost 	bzero(&io, sizeof(io));
34062d28676SKristof Provost 	io.pfrio_flags = 0;
34162d28676SKristof Provost 	io.pfrio_buffer = &addr;
34262d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
34362d28676SKristof Provost 
34462d28676SKristof Provost 	/* Negative size. */
34562d28676SKristof Provost 	io.pfrio_size = -1;
34662d28676SKristof Provost 	if (ioctl(dev, DIOCRADDADDRS, &io) == 0)
34762d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
34862d28676SKristof Provost 
34962d28676SKristof Provost 	/* Overly large size. */
35062d28676SKristof Provost 	io.pfrio_size = 1 << 28;
35162d28676SKristof Provost 	if (ioctl(dev, DIOCRADDADDRS, &io) == 0)
35262d28676SKristof Provost 		atf_tc_fail("Reuqest with size 1 << 28 failed");
353d3cc4030SKristof Provost }
35462d28676SKristof Provost 
355d3cc4030SKristof Provost ATF_TC_CLEANUP(addaddrs, tc)
356d3cc4030SKristof Provost {
35762d28676SKristof Provost 	COMMON_CLEANUP();
35862d28676SKristof Provost }
35962d28676SKristof Provost 
360d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(deladdrs);
36187c7063cSKristof Provost ATF_TC_HEAD(deladdrs, tc)
36287c7063cSKristof Provost {
36387c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
36487c7063cSKristof Provost }
36587c7063cSKristof Provost 
36662d28676SKristof Provost ATF_TC_BODY(deladdrs, tc)
36762d28676SKristof Provost {
36862d28676SKristof Provost 	struct pfioc_table io;
36962d28676SKristof Provost 	struct pfr_addr addr;
37062d28676SKristof Provost 
37162d28676SKristof Provost 	COMMON_HEAD();
37262d28676SKristof Provost 
37362d28676SKristof Provost 	bzero(&addr, sizeof(addr));
37462d28676SKristof Provost 	bzero(&io, sizeof(io));
37562d28676SKristof Provost 	io.pfrio_flags = 0;
37662d28676SKristof Provost 	io.pfrio_buffer = &addr;
37762d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
37862d28676SKristof Provost 
37962d28676SKristof Provost 	/* Negative size. */
38062d28676SKristof Provost 	io.pfrio_size = -1;
38162d28676SKristof Provost 	if (ioctl(dev, DIOCRDELADDRS, &io) == 0)
38262d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
38362d28676SKristof Provost 
38462d28676SKristof Provost 	/* Overly large size. */
38562d28676SKristof Provost 	io.pfrio_size = 1 << 28;
38662d28676SKristof Provost 	if (ioctl(dev, DIOCRDELADDRS, &io) == 0)
38762d28676SKristof Provost 		atf_tc_fail("Reuqest with size 1 << 28 failed");
388d3cc4030SKristof Provost }
38962d28676SKristof Provost 
390d3cc4030SKristof Provost ATF_TC_CLEANUP(deladdrs, tc)
391d3cc4030SKristof Provost {
39262d28676SKristof Provost 	COMMON_CLEANUP();
39362d28676SKristof Provost }
39462d28676SKristof Provost 
395d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(setaddrs);
39687c7063cSKristof Provost ATF_TC_HEAD(setaddrs, tc)
39787c7063cSKristof Provost {
39887c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
39987c7063cSKristof Provost }
40087c7063cSKristof Provost 
40162d28676SKristof Provost ATF_TC_BODY(setaddrs, tc)
40262d28676SKristof Provost {
40362d28676SKristof Provost 	struct pfioc_table io;
40462d28676SKristof Provost 	struct pfr_addr addr;
40562d28676SKristof Provost 
40662d28676SKristof Provost 	COMMON_HEAD();
40762d28676SKristof Provost 
40862d28676SKristof Provost 	bzero(&addr, sizeof(addr));
40962d28676SKristof Provost 	bzero(&io, sizeof(io));
41062d28676SKristof Provost 	io.pfrio_flags = 0;
41162d28676SKristof Provost 	io.pfrio_buffer = &addr;
41262d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
41362d28676SKristof Provost 
41462d28676SKristof Provost 	/* Negative size. */
41562d28676SKristof Provost 	io.pfrio_size = -1;
41662d28676SKristof Provost 	if (ioctl(dev, DIOCRSETADDRS, &io) == 0)
41762d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
41862d28676SKristof Provost 
41962d28676SKristof Provost 	/* Overly large size. */
42062d28676SKristof Provost 	io.pfrio_size = 1 << 28;
42162d28676SKristof Provost 	if (ioctl(dev, DIOCRSETADDRS, &io) == 0)
42262d28676SKristof Provost 		atf_tc_fail("Reuqest with size 1 << 28 failed");
423d3cc4030SKristof Provost }
42462d28676SKristof Provost 
425d3cc4030SKristof Provost ATF_TC_CLEANUP(setaddrs, tc)
426d3cc4030SKristof Provost {
42762d28676SKristof Provost 	COMMON_CLEANUP();
42862d28676SKristof Provost }
42962d28676SKristof Provost 
430d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(getaddrs);
43187c7063cSKristof Provost ATF_TC_HEAD(getaddrs, tc)
43287c7063cSKristof Provost {
43387c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
43487c7063cSKristof Provost }
43587c7063cSKristof Provost 
43662d28676SKristof Provost ATF_TC_BODY(getaddrs, tc)
43762d28676SKristof Provost {
43862d28676SKristof Provost 	struct pfioc_table io;
43962d28676SKristof Provost 	struct pfr_addr addr;
44062d28676SKristof Provost 
44162d28676SKristof Provost 	COMMON_HEAD();
44262d28676SKristof Provost 
44362d28676SKristof Provost 	bzero(&addr, sizeof(addr));
44462d28676SKristof Provost 	bzero(&io, sizeof(io));
44562d28676SKristof Provost 	io.pfrio_flags = 0;
44662d28676SKristof Provost 	io.pfrio_buffer = &addr;
44762d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
44862d28676SKristof Provost 
44962d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
45062d28676SKristof Provost 
45162d28676SKristof Provost 	/* Negative size. */
45262d28676SKristof Provost 	io.pfrio_size = -1;
45362d28676SKristof Provost 	if (ioctl(dev, DIOCRGETADDRS, &io) == 0)
45462d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
45562d28676SKristof Provost 
45662d28676SKristof Provost 	/* Overly large size. */
45762d28676SKristof Provost 	io.pfrio_size = 1 << 24;
45862d28676SKristof Provost 	if (ioctl(dev, DIOCRGETADDRS, &io) == 0)
45962d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
460d3cc4030SKristof Provost }
46162d28676SKristof Provost 
462d3cc4030SKristof Provost ATF_TC_CLEANUP(getaddrs, tc)
463d3cc4030SKristof Provost {
46462d28676SKristof Provost 	COMMON_CLEANUP();
46562d28676SKristof Provost }
46662d28676SKristof Provost 
467d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(getastats);
46887c7063cSKristof Provost ATF_TC_HEAD(getastats, tc)
46987c7063cSKristof Provost {
47087c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
47187c7063cSKristof Provost }
47287c7063cSKristof Provost 
47362d28676SKristof Provost ATF_TC_BODY(getastats, tc)
47462d28676SKristof Provost {
47562d28676SKristof Provost 	struct pfioc_table io;
47662d28676SKristof Provost 	struct pfr_astats astats;
47762d28676SKristof Provost 
47862d28676SKristof Provost 	COMMON_HEAD();
47962d28676SKristof Provost 
48062d28676SKristof Provost 	bzero(&astats, sizeof(astats));
48162d28676SKristof Provost 	bzero(&io, sizeof(io));
48262d28676SKristof Provost 	io.pfrio_flags = 0;
48362d28676SKristof Provost 	io.pfrio_buffer = &astats;
48462d28676SKristof Provost 	io.pfrio_esize = sizeof(astats);
48562d28676SKristof Provost 
48662d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
48762d28676SKristof Provost 
48862d28676SKristof Provost 	/* Negative size. */
48962d28676SKristof Provost 	io.pfrio_size = -1;
49062d28676SKristof Provost 	if (ioctl(dev, DIOCRGETASTATS, &io) == 0)
49162d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
49262d28676SKristof Provost 
49362d28676SKristof Provost 	/* Overly large size. */
49462d28676SKristof Provost 	io.pfrio_size = 1 << 24;
49562d28676SKristof Provost 	if (ioctl(dev, DIOCRGETASTATS, &io) == 0)
49662d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
497d3cc4030SKristof Provost }
49862d28676SKristof Provost 
499d3cc4030SKristof Provost ATF_TC_CLEANUP(getastats, tc)
500d3cc4030SKristof Provost {
50162d28676SKristof Provost 	COMMON_CLEANUP();
50262d28676SKristof Provost }
50362d28676SKristof Provost 
504d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(clrastats);
50587c7063cSKristof Provost ATF_TC_HEAD(clrastats, tc)
50687c7063cSKristof Provost {
50787c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
50887c7063cSKristof Provost }
50987c7063cSKristof Provost 
51062d28676SKristof Provost ATF_TC_BODY(clrastats, tc)
51162d28676SKristof Provost {
51262d28676SKristof Provost 	struct pfioc_table io;
51362d28676SKristof Provost 	struct pfr_addr addr;
51462d28676SKristof Provost 
51562d28676SKristof Provost 	COMMON_HEAD();
51662d28676SKristof Provost 
51762d28676SKristof Provost 	bzero(&addr, sizeof(addr));
51862d28676SKristof Provost 	bzero(&io, sizeof(io));
51962d28676SKristof Provost 	io.pfrio_flags = 0;
52062d28676SKristof Provost 	io.pfrio_buffer = &addr;
52162d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
52262d28676SKristof Provost 
52362d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
52462d28676SKristof Provost 
52562d28676SKristof Provost 	/* Negative size. */
52662d28676SKristof Provost 	io.pfrio_size = -1;
52762d28676SKristof Provost 	if (ioctl(dev, DIOCRCLRASTATS, &io) == 0)
52862d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
52962d28676SKristof Provost 
53062d28676SKristof Provost 	/* Overly large size. */
53162d28676SKristof Provost 	io.pfrio_size = 1 << 24;
53262d28676SKristof Provost 	if (ioctl(dev, DIOCRCLRASTATS, &io) == 0)
53362d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
534d3cc4030SKristof Provost }
53562d28676SKristof Provost 
536d3cc4030SKristof Provost ATF_TC_CLEANUP(clrastats, tc)
537d3cc4030SKristof Provost {
53862d28676SKristof Provost 	COMMON_CLEANUP();
53962d28676SKristof Provost }
54062d28676SKristof Provost 
541d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(tstaddrs);
54287c7063cSKristof Provost ATF_TC_HEAD(tstaddrs, tc)
54387c7063cSKristof Provost {
54487c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
54587c7063cSKristof Provost }
54687c7063cSKristof Provost 
54762d28676SKristof Provost ATF_TC_BODY(tstaddrs, tc)
54862d28676SKristof Provost {
54962d28676SKristof Provost 	struct pfioc_table io;
55062d28676SKristof Provost 	struct pfr_addr addr;
55162d28676SKristof Provost 
55262d28676SKristof Provost 	COMMON_HEAD();
55362d28676SKristof Provost 
55462d28676SKristof Provost 	bzero(&addr, sizeof(addr));
55562d28676SKristof Provost 	bzero(&io, sizeof(io));
55662d28676SKristof Provost 	io.pfrio_flags = 0;
55762d28676SKristof Provost 	io.pfrio_buffer = &addr;
55862d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
55962d28676SKristof Provost 
56062d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
56162d28676SKristof Provost 
56262d28676SKristof Provost 	/* Negative size. */
56362d28676SKristof Provost 	io.pfrio_size = -1;
56462d28676SKristof Provost 	if (ioctl(dev, DIOCRTSTADDRS, &io) == 0)
56562d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
56662d28676SKristof Provost 
56762d28676SKristof Provost 	/* Overly large size. */
56862d28676SKristof Provost 	io.pfrio_size = 1 << 24;
56962d28676SKristof Provost 	if (ioctl(dev, DIOCRTSTADDRS, &io) == 0)
57062d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
571d3cc4030SKristof Provost }
57262d28676SKristof Provost 
573d3cc4030SKristof Provost ATF_TC_CLEANUP(tstaddrs, tc)
574d3cc4030SKristof Provost {
57562d28676SKristof Provost 	COMMON_CLEANUP();
57662d28676SKristof Provost }
57762d28676SKristof Provost 
578d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(inadefine);
57987c7063cSKristof Provost ATF_TC_HEAD(inadefine, tc)
58087c7063cSKristof Provost {
58187c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
58287c7063cSKristof Provost }
58387c7063cSKristof Provost 
58462d28676SKristof Provost ATF_TC_BODY(inadefine, tc)
58562d28676SKristof Provost {
58662d28676SKristof Provost 	struct pfioc_table io;
58762d28676SKristof Provost 	struct pfr_addr addr;
58862d28676SKristof Provost 
58962d28676SKristof Provost 	COMMON_HEAD();
59062d28676SKristof Provost 
59162d28676SKristof Provost 	bzero(&addr, sizeof(addr));
59262d28676SKristof Provost 	bzero(&io, sizeof(io));
59362d28676SKristof Provost 	io.pfrio_flags = 0;
59462d28676SKristof Provost 	io.pfrio_buffer = &addr;
59562d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
59662d28676SKristof Provost 
59762d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
59862d28676SKristof Provost 
59962d28676SKristof Provost 	/* Negative size. */
60062d28676SKristof Provost 	io.pfrio_size = -1;
60162d28676SKristof Provost 	if (ioctl(dev, DIOCRINADEFINE, &io) == 0)
60262d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
60362d28676SKristof Provost 
60462d28676SKristof Provost 	/* Overly large size. */
60562d28676SKristof Provost 	io.pfrio_size = 1 << 24;
60662d28676SKristof Provost 	if (ioctl(dev, DIOCRINADEFINE, &io) == 0)
60762d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
608d3cc4030SKristof Provost }
60962d28676SKristof Provost 
610d3cc4030SKristof Provost ATF_TC_CLEANUP(inadefine, tc)
611d3cc4030SKristof Provost {
61262d28676SKristof Provost 	COMMON_CLEANUP();
61362d28676SKristof Provost }
61462d28676SKristof Provost 
615d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(igetifaces);
61687c7063cSKristof Provost ATF_TC_HEAD(igetifaces, tc)
61787c7063cSKristof Provost {
61887c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
61987c7063cSKristof Provost }
62087c7063cSKristof Provost 
6218e748b94SKristof Provost ATF_TC_BODY(igetifaces, tc)
6228e748b94SKristof Provost {
6238e748b94SKristof Provost 	struct pfioc_iface io;
6248e748b94SKristof Provost 	struct pfi_kif kif;
6258e748b94SKristof Provost 
6268e748b94SKristof Provost 	COMMON_HEAD();
6278e748b94SKristof Provost 
6288e748b94SKristof Provost 	bzero(&io, sizeof(io));
6298e748b94SKristof Provost 	io.pfiio_flags = 0;
6308e748b94SKristof Provost 	io.pfiio_buffer = &kif;
6318e748b94SKristof Provost 	io.pfiio_esize = sizeof(kif);
6328e748b94SKristof Provost 
6338e748b94SKristof Provost 	/* Negative size */
6348e748b94SKristof Provost 	io.pfiio_size = -1;
6358e748b94SKristof Provost 	if (ioctl(dev, DIOCIGETIFACES, &io) == 0)
6368e748b94SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
6378e748b94SKristof Provost 
6388e748b94SKristof Provost 	/* Overflow size */
6398e748b94SKristof Provost 	io.pfiio_size = 1 << 31;
6408e748b94SKristof Provost 	if (ioctl(dev, DIOCIGETIFACES, &io) == 0)
6418e748b94SKristof Provost 		atf_tc_fail("request with size 1 << 31 succeeded");
642d3cc4030SKristof Provost }
6438e748b94SKristof Provost 
644d3cc4030SKristof Provost ATF_TC_CLEANUP(igetifaces, tc)
645d3cc4030SKristof Provost {
6468e748b94SKristof Provost 	COMMON_CLEANUP();
6478e748b94SKristof Provost }
6488e748b94SKristof Provost 
649d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(cxbegin);
65087c7063cSKristof Provost ATF_TC_HEAD(cxbegin, tc)
65187c7063cSKristof Provost {
65287c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
65387c7063cSKristof Provost }
65487c7063cSKristof Provost 
65562d28676SKristof Provost ATF_TC_BODY(cxbegin, tc)
65662d28676SKristof Provost {
65762d28676SKristof Provost 	struct pfioc_trans io;
65862d28676SKristof Provost 	struct pfioc_trans_e ioe;
65962d28676SKristof Provost 
66062d28676SKristof Provost 	COMMON_HEAD();
66162d28676SKristof Provost 
66262d28676SKristof Provost 	bzero(&io, sizeof(io));
66362d28676SKristof Provost 	io.esize = sizeof(ioe);
66462d28676SKristof Provost 	io.array = &ioe;
66562d28676SKristof Provost 
66662d28676SKristof Provost 	/* Negative size */
66762d28676SKristof Provost 	io.size = -1;
66862d28676SKristof Provost 	if (ioctl(dev, DIOCXBEGIN, &io) == 0)
66962d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
67062d28676SKristof Provost 
67162d28676SKristof Provost 	/* Overflow size */
67262d28676SKristof Provost 	io.size = 1 << 30;
67362d28676SKristof Provost 	if (ioctl(dev, DIOCXBEGIN, &io) == 0)
67462d28676SKristof Provost 		atf_tc_fail("request with size 1 << 30 succeeded");
67562d28676SKristof Provost 
67662d28676SKristof Provost 	/* NULL buffer */
67762d28676SKristof Provost 	io.size = 1;
67862d28676SKristof Provost 	io.array = NULL;
67962d28676SKristof Provost 	if (ioctl(dev, DIOCXBEGIN, &io) == 0)
68062d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
681d3cc4030SKristof Provost }
68262d28676SKristof Provost 
683d3cc4030SKristof Provost ATF_TC_CLEANUP(cxbegin, tc)
684d3cc4030SKristof Provost {
68562d28676SKristof Provost 	COMMON_CLEANUP();
68662d28676SKristof Provost }
68762d28676SKristof Provost 
688d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(cxrollback);
68987c7063cSKristof Provost ATF_TC_HEAD(cxrollback, tc)
69087c7063cSKristof Provost {
69187c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
69287c7063cSKristof Provost }
69387c7063cSKristof Provost 
69462d28676SKristof Provost ATF_TC_BODY(cxrollback, tc)
69562d28676SKristof Provost {
69662d28676SKristof Provost 	struct pfioc_trans io;
69762d28676SKristof Provost 	struct pfioc_trans_e ioe;
69862d28676SKristof Provost 
69962d28676SKristof Provost 	COMMON_HEAD();
70062d28676SKristof Provost 
70162d28676SKristof Provost 	bzero(&io, sizeof(io));
70262d28676SKristof Provost 	io.esize = sizeof(ioe);
70362d28676SKristof Provost 	io.array = &ioe;
70462d28676SKristof Provost 
70562d28676SKristof Provost 	/* Negative size */
70662d28676SKristof Provost 	io.size = -1;
70762d28676SKristof Provost 	if (ioctl(dev, DIOCXROLLBACK, &io) == 0)
70862d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
70962d28676SKristof Provost 
71062d28676SKristof Provost 	/* Overflow size */
71162d28676SKristof Provost 	io.size = 1 << 30;
71262d28676SKristof Provost 	if (ioctl(dev, DIOCXROLLBACK, &io) == 0)
71362d28676SKristof Provost 		atf_tc_fail("request with size 1 << 30 succeeded");
71462d28676SKristof Provost 
71562d28676SKristof Provost 	/* NULL buffer */
71662d28676SKristof Provost 	io.size = 1;
71762d28676SKristof Provost 	io.array = NULL;
71862d28676SKristof Provost 	if (ioctl(dev, DIOCXROLLBACK, &io) == 0)
71962d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
720d3cc4030SKristof Provost }
72162d28676SKristof Provost 
722d3cc4030SKristof Provost ATF_TC_CLEANUP(cxrollback, tc)
723d3cc4030SKristof Provost {
72462d28676SKristof Provost 	COMMON_CLEANUP();
72562d28676SKristof Provost }
72662d28676SKristof Provost 
727d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(commit);
72887c7063cSKristof Provost ATF_TC_HEAD(commit, tc)
72987c7063cSKristof Provost {
73087c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
73187c7063cSKristof Provost }
73287c7063cSKristof Provost 
7338e748b94SKristof Provost ATF_TC_BODY(commit, tc)
7348e748b94SKristof Provost {
7358e748b94SKristof Provost 	struct pfioc_trans io;
7368e748b94SKristof Provost 	struct pfioc_trans_e ioe;
7378e748b94SKristof Provost 
7388e748b94SKristof Provost 	COMMON_HEAD();
7398e748b94SKristof Provost 
7408e748b94SKristof Provost 	bzero(&io, sizeof(io));
7418e748b94SKristof Provost 	io.esize = sizeof(ioe);
7428e748b94SKristof Provost 	io.array = &ioe;
7438e748b94SKristof Provost 
7448e748b94SKristof Provost 	/* Negative size */
7458e748b94SKristof Provost 	io.size = -1;
7468e748b94SKristof Provost 	if (ioctl(dev, DIOCXCOMMIT, &io) == 0)
7478e748b94SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
7488e748b94SKristof Provost 
7498e748b94SKristof Provost 	/* Overflow size */
7508e748b94SKristof Provost 	io.size = 1 << 30;
7518e748b94SKristof Provost 	if (ioctl(dev, DIOCXCOMMIT, &io) == 0)
7528e748b94SKristof Provost 		atf_tc_fail("request with size 1 << 30 succeeded");
7538e748b94SKristof Provost 
7548e748b94SKristof Provost 	/* NULL buffer */
7558e748b94SKristof Provost 	io.size = 1;
7568e748b94SKristof Provost 	io.array = NULL;
7578e748b94SKristof Provost 	if (ioctl(dev, DIOCXCOMMIT, &io) == 0)
7588e748b94SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
759d3cc4030SKristof Provost }
7608e748b94SKristof Provost 
761d3cc4030SKristof Provost ATF_TC_CLEANUP(commit, tc)
762d3cc4030SKristof Provost {
7638e748b94SKristof Provost 	COMMON_CLEANUP();
7648e748b94SKristof Provost }
7658e748b94SKristof Provost 
766fe5a065dSKristof Provost ATF_TC_WITH_CLEANUP(getsrcnodes);
767fe5a065dSKristof Provost ATF_TC_HEAD(getsrcnodes, tc)
768fe5a065dSKristof Provost {
769fe5a065dSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
770fe5a065dSKristof Provost }
771fe5a065dSKristof Provost 
772fe5a065dSKristof Provost ATF_TC_BODY(getsrcnodes, tc)
773fe5a065dSKristof Provost {
774fe5a065dSKristof Provost 	struct pfioc_src_nodes psn;
775fe5a065dSKristof Provost 
776fe5a065dSKristof Provost 	COMMON_HEAD();
777fe5a065dSKristof Provost 
778fe5a065dSKristof Provost 	bzero(&psn, sizeof(psn));
779fe5a065dSKristof Provost 
780fe5a065dSKristof Provost 	psn.psn_len = -1;
781fe5a065dSKristof Provost 	if (ioctl(dev, DIOCGETSRCNODES, &psn) != 0)
782fe5a065dSKristof Provost 		atf_tc_fail("request with size -1 failed");
783fe5a065dSKristof Provost 
784fe5a065dSKristof Provost 	psn.psn_len = 1 << 30;
785fe5a065dSKristof Provost 	if (ioctl(dev, DIOCGETSRCNODES, &psn) != 0)
786fe5a065dSKristof Provost 		atf_tc_fail("request with size << 30 failed");
787fe5a065dSKristof Provost 
788fe5a065dSKristof Provost 	psn.psn_len = 1 << 31;
789fe5a065dSKristof Provost 	if (ioctl(dev, DIOCGETSRCNODES, &psn) != 0)
790fe5a065dSKristof Provost 		atf_tc_fail("request with size << 30 failed");
791fe5a065dSKristof Provost }
792fe5a065dSKristof Provost 
793fe5a065dSKristof Provost ATF_TC_CLEANUP(getsrcnodes, tc)
794fe5a065dSKristof Provost {
795fe5a065dSKristof Provost 	COMMON_CLEANUP();
796fe5a065dSKristof Provost }
797fe5a065dSKristof Provost 
798d5325f2fSKristof Provost ATF_TC_WITH_CLEANUP(tag);
799d5325f2fSKristof Provost ATF_TC_HEAD(tag, tc)
800d5325f2fSKristof Provost {
801d5325f2fSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
802d5325f2fSKristof Provost }
803d5325f2fSKristof Provost 
804d5325f2fSKristof Provost ATF_TC_BODY(tag, tc)
805d5325f2fSKristof Provost {
806d5325f2fSKristof Provost 	struct pfioc_rule rule;
807d5325f2fSKristof Provost 
808d5325f2fSKristof Provost 	COMMON_HEAD();
809d5325f2fSKristof Provost 
810d5325f2fSKristof Provost 	memset(&rule, 0x42, sizeof(rule));
811d5325f2fSKristof Provost 
812d5325f2fSKristof Provost 	rule.ticket = 0;
813d5325f2fSKristof Provost 	rule.pool_ticket = 0;
814d5325f2fSKristof Provost 	rule.anchor[0] = 0;
815d5325f2fSKristof Provost 
816d5325f2fSKristof Provost 	rule.rule.return_icmp = 0;
817d5325f2fSKristof Provost 	bzero(&rule.rule.src, sizeof(rule.rule.src));
818d5325f2fSKristof Provost 	bzero(&rule.rule.dst, sizeof(rule.rule.dst));
819d5325f2fSKristof Provost 
820d5325f2fSKristof Provost 	rule.rule.ifname[0] = 0;
821d5325f2fSKristof Provost 	rule.rule.action = 0;
822d5325f2fSKristof Provost 	rule.rule.rtableid = 0;
823d5325f2fSKristof Provost 
824d5325f2fSKristof Provost 	rule.rule.tagname[0] = 0;
825d5325f2fSKristof Provost 
826d5325f2fSKristof Provost 	for (int i = 0; i < 10; i++)
827d5325f2fSKristof Provost 		ioctl(dev, DIOCADDRULE, &rule);
828d5325f2fSKristof Provost }
829d5325f2fSKristof Provost 
830d5325f2fSKristof Provost ATF_TC_CLEANUP(tag, tc)
831d5325f2fSKristof Provost {
832d5325f2fSKristof Provost 	COMMON_CLEANUP();
833d5325f2fSKristof Provost }
834d5325f2fSKristof Provost 
835*4ca41937SKristof Provost ATF_TC_WITH_CLEANUP(rpool_mtx);
836*4ca41937SKristof Provost ATF_TC_HEAD(rpool_mtx, tc)
837*4ca41937SKristof Provost {
838*4ca41937SKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
839*4ca41937SKristof Provost }
840*4ca41937SKristof Provost 
841*4ca41937SKristof Provost ATF_TC_BODY(rpool_mtx, tc)
842*4ca41937SKristof Provost {
843*4ca41937SKristof Provost 	struct pfioc_rule rule;
844*4ca41937SKristof Provost 
845*4ca41937SKristof Provost 	COMMON_HEAD();
846*4ca41937SKristof Provost 
847*4ca41937SKristof Provost 	memset(&rule, 0, sizeof(rule));
848*4ca41937SKristof Provost 
849*4ca41937SKristof Provost 	rule.ticket = 0;
850*4ca41937SKristof Provost 	rule.pool_ticket = 0;
851*4ca41937SKristof Provost 	rule.anchor[0] = 0;
852*4ca41937SKristof Provost 
853*4ca41937SKristof Provost 	rule.rule.return_icmp = 0;
854*4ca41937SKristof Provost 	bzero(&rule.rule.src, sizeof(rule.rule.src));
855*4ca41937SKristof Provost 	bzero(&rule.rule.dst, sizeof(rule.rule.dst));
856*4ca41937SKristof Provost 
857*4ca41937SKristof Provost 	rule.rule.ifname[0] = 0;
858*4ca41937SKristof Provost 	rule.rule.action = 0;
859*4ca41937SKristof Provost 	rule.rule.rtableid = 0;
860*4ca41937SKristof Provost 
861*4ca41937SKristof Provost 	rule.rule.tagname[0] = 0;
862*4ca41937SKristof Provost 	rule.rule.action = 42;
863*4ca41937SKristof Provost 
864*4ca41937SKristof Provost 	ioctl(dev, DIOCADDRULE, &rule);
865*4ca41937SKristof Provost }
866*4ca41937SKristof Provost 
867*4ca41937SKristof Provost ATF_TC_CLEANUP(rpool_mtx, tc)
868*4ca41937SKristof Provost {
869*4ca41937SKristof Provost 	COMMON_CLEANUP();
870*4ca41937SKristof Provost }
871*4ca41937SKristof Provost 
872*4ca41937SKristof Provost 
87398c5f988SKristof Provost ATF_TP_ADD_TCS(tp)
87498c5f988SKristof Provost {
87598c5f988SKristof Provost 	ATF_TP_ADD_TC(tp, addtables);
87698c5f988SKristof Provost 	ATF_TP_ADD_TC(tp, deltables);
8771ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, gettables);
8781d2e31afSKyle Evans 	ATF_TP_ADD_TC(tp, getastats);
8791ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, gettstats);
8801ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, clrtstats);
8811ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, settflags);
88262d28676SKristof Provost 	ATF_TP_ADD_TC(tp, addaddrs);
88362d28676SKristof Provost 	ATF_TP_ADD_TC(tp, deladdrs);
88462d28676SKristof Provost 	ATF_TP_ADD_TC(tp, setaddrs);
88562d28676SKristof Provost 	ATF_TP_ADD_TC(tp, getaddrs);
88662d28676SKristof Provost 	ATF_TP_ADD_TC(tp, clrastats);
88762d28676SKristof Provost 	ATF_TP_ADD_TC(tp, tstaddrs);
88862d28676SKristof Provost 	ATF_TP_ADD_TC(tp, inadefine);
8898e748b94SKristof Provost 	ATF_TP_ADD_TC(tp, igetifaces);
89062d28676SKristof Provost 	ATF_TP_ADD_TC(tp, cxbegin);
89162d28676SKristof Provost 	ATF_TP_ADD_TC(tp, cxrollback);
8928e748b94SKristof Provost 	ATF_TP_ADD_TC(tp, commit);
893fe5a065dSKristof Provost 	ATF_TP_ADD_TC(tp, getsrcnodes);
894d5325f2fSKristof Provost 	ATF_TP_ADD_TC(tp, tag);
895*4ca41937SKristof Provost 	ATF_TP_ADD_TC(tp, rpool_mtx);
89698c5f988SKristof Provost 
89798c5f988SKristof Provost 	return (atf_no_error());
89898c5f988SKristof Provost }
899