xref: /freebsd/tests/sys/netpfil/pf/ioctl/validation.c (revision d5325f2f3cc37996115e051d37ace36275184f20)
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");
268d3cc4030SKristof Provost }
2691ff545d6SKristof Provost 
270d3cc4030SKristof Provost ATF_TC_CLEANUP(clrtstats, tc)
271d3cc4030SKristof Provost {
2721ff545d6SKristof Provost 	COMMON_CLEANUP();
2731ff545d6SKristof Provost }
2741ff545d6SKristof Provost 
275d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(settflags);
27687c7063cSKristof Provost ATF_TC_HEAD(settflags, tc)
27787c7063cSKristof Provost {
27887c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
27987c7063cSKristof Provost }
28087c7063cSKristof Provost 
2811ff545d6SKristof Provost ATF_TC_BODY(settflags, tc)
2821ff545d6SKristof Provost {
2831ff545d6SKristof Provost 	struct pfioc_table io;
2841ff545d6SKristof Provost 	struct pfr_table tbl;
2851ff545d6SKristof Provost 	int flags;
2861ff545d6SKristof Provost 
2871ff545d6SKristof Provost 	COMMON_HEAD();
2881ff545d6SKristof Provost 
2891ff545d6SKristof Provost 	flags = 0;
2901ff545d6SKristof Provost 
2911ff545d6SKristof Provost 	common_init_tbl(&tbl);
2921ff545d6SKristof Provost 
2931ff545d6SKristof Provost 	bzero(&io, sizeof(io));
2941ff545d6SKristof Provost 	io.pfrio_flags = flags;
2951ff545d6SKristof Provost 	io.pfrio_buffer = &tbl;
2961ff545d6SKristof Provost 	io.pfrio_esize = sizeof(tbl);
2971ff545d6SKristof Provost 
2981ff545d6SKristof Provost 	/* Negative size. This will succeed, because the kernel will not copy
2991ff545d6SKristof Provost 	 * tables than it has. */
3001ff545d6SKristof Provost 	io.pfrio_size = -1;
3011ff545d6SKristof Provost 	if (ioctl(dev, DIOCRSETTFLAGS, &io) != 0)
3021ff545d6SKristof Provost 		atf_tc_fail("Request with size -1 failed");
3031ff545d6SKristof Provost 
3041ff545d6SKristof Provost 	/* Overly large size. See above. */
3051ff545d6SKristof Provost 	io.pfrio_size = 1 << 28;
3061ff545d6SKristof Provost 	if (ioctl(dev, DIOCRSETTFLAGS, &io) != 0)
3071ff545d6SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
308246e18b2SKristof Provost 
309246e18b2SKristof Provost 	/* NULL buffer */
310246e18b2SKristof Provost 	io.pfrio_buffer = NULL;
311246e18b2SKristof Provost 	if (ioctl(dev, DIOCRSETTFLAGS, &io) != -1)
312246e18b2SKristof Provost 		atf_tc_fail("Request with NULL buffer succeeded");
313d3cc4030SKristof Provost }
3141ff545d6SKristof Provost 
315d3cc4030SKristof Provost ATF_TC_CLEANUP(settflags, tc)
316d3cc4030SKristof Provost {
3171ff545d6SKristof Provost 	COMMON_CLEANUP();
3181ff545d6SKristof Provost }
3191ff545d6SKristof Provost 
320d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(addaddrs);
32187c7063cSKristof Provost ATF_TC_HEAD(addaddrs, tc)
32287c7063cSKristof Provost {
32387c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
32487c7063cSKristof Provost }
32587c7063cSKristof Provost 
32662d28676SKristof Provost ATF_TC_BODY(addaddrs, tc)
32762d28676SKristof Provost {
32862d28676SKristof Provost 	struct pfioc_table io;
32962d28676SKristof Provost 	struct pfr_addr addr;
33062d28676SKristof Provost 
33162d28676SKristof Provost 	COMMON_HEAD();
33262d28676SKristof Provost 
33362d28676SKristof Provost 	bzero(&addr, sizeof(addr));
33462d28676SKristof Provost 	bzero(&io, sizeof(io));
33562d28676SKristof Provost 	io.pfrio_flags = 0;
33662d28676SKristof Provost 	io.pfrio_buffer = &addr;
33762d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
33862d28676SKristof Provost 
33962d28676SKristof Provost 	/* Negative size. */
34062d28676SKristof Provost 	io.pfrio_size = -1;
34162d28676SKristof Provost 	if (ioctl(dev, DIOCRADDADDRS, &io) == 0)
34262d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
34362d28676SKristof Provost 
34462d28676SKristof Provost 	/* Overly large size. */
34562d28676SKristof Provost 	io.pfrio_size = 1 << 28;
34662d28676SKristof Provost 	if (ioctl(dev, DIOCRADDADDRS, &io) == 0)
34762d28676SKristof Provost 		atf_tc_fail("Reuqest with size 1 << 28 failed");
348d3cc4030SKristof Provost }
34962d28676SKristof Provost 
350d3cc4030SKristof Provost ATF_TC_CLEANUP(addaddrs, tc)
351d3cc4030SKristof Provost {
35262d28676SKristof Provost 	COMMON_CLEANUP();
35362d28676SKristof Provost }
35462d28676SKristof Provost 
355d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(deladdrs);
35687c7063cSKristof Provost ATF_TC_HEAD(deladdrs, tc)
35787c7063cSKristof Provost {
35887c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
35987c7063cSKristof Provost }
36087c7063cSKristof Provost 
36162d28676SKristof Provost ATF_TC_BODY(deladdrs, tc)
36262d28676SKristof Provost {
36362d28676SKristof Provost 	struct pfioc_table io;
36462d28676SKristof Provost 	struct pfr_addr addr;
36562d28676SKristof Provost 
36662d28676SKristof Provost 	COMMON_HEAD();
36762d28676SKristof Provost 
36862d28676SKristof Provost 	bzero(&addr, sizeof(addr));
36962d28676SKristof Provost 	bzero(&io, sizeof(io));
37062d28676SKristof Provost 	io.pfrio_flags = 0;
37162d28676SKristof Provost 	io.pfrio_buffer = &addr;
37262d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
37362d28676SKristof Provost 
37462d28676SKristof Provost 	/* Negative size. */
37562d28676SKristof Provost 	io.pfrio_size = -1;
37662d28676SKristof Provost 	if (ioctl(dev, DIOCRDELADDRS, &io) == 0)
37762d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
37862d28676SKristof Provost 
37962d28676SKristof Provost 	/* Overly large size. */
38062d28676SKristof Provost 	io.pfrio_size = 1 << 28;
38162d28676SKristof Provost 	if (ioctl(dev, DIOCRDELADDRS, &io) == 0)
38262d28676SKristof Provost 		atf_tc_fail("Reuqest with size 1 << 28 failed");
383d3cc4030SKristof Provost }
38462d28676SKristof Provost 
385d3cc4030SKristof Provost ATF_TC_CLEANUP(deladdrs, tc)
386d3cc4030SKristof Provost {
38762d28676SKristof Provost 	COMMON_CLEANUP();
38862d28676SKristof Provost }
38962d28676SKristof Provost 
390d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(setaddrs);
39187c7063cSKristof Provost ATF_TC_HEAD(setaddrs, tc)
39287c7063cSKristof Provost {
39387c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
39487c7063cSKristof Provost }
39587c7063cSKristof Provost 
39662d28676SKristof Provost ATF_TC_BODY(setaddrs, tc)
39762d28676SKristof Provost {
39862d28676SKristof Provost 	struct pfioc_table io;
39962d28676SKristof Provost 	struct pfr_addr addr;
40062d28676SKristof Provost 
40162d28676SKristof Provost 	COMMON_HEAD();
40262d28676SKristof Provost 
40362d28676SKristof Provost 	bzero(&addr, sizeof(addr));
40462d28676SKristof Provost 	bzero(&io, sizeof(io));
40562d28676SKristof Provost 	io.pfrio_flags = 0;
40662d28676SKristof Provost 	io.pfrio_buffer = &addr;
40762d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
40862d28676SKristof Provost 
40962d28676SKristof Provost 	/* Negative size. */
41062d28676SKristof Provost 	io.pfrio_size = -1;
41162d28676SKristof Provost 	if (ioctl(dev, DIOCRSETADDRS, &io) == 0)
41262d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
41362d28676SKristof Provost 
41462d28676SKristof Provost 	/* Overly large size. */
41562d28676SKristof Provost 	io.pfrio_size = 1 << 28;
41662d28676SKristof Provost 	if (ioctl(dev, DIOCRSETADDRS, &io) == 0)
41762d28676SKristof Provost 		atf_tc_fail("Reuqest with size 1 << 28 failed");
418d3cc4030SKristof Provost }
41962d28676SKristof Provost 
420d3cc4030SKristof Provost ATF_TC_CLEANUP(setaddrs, tc)
421d3cc4030SKristof Provost {
42262d28676SKristof Provost 	COMMON_CLEANUP();
42362d28676SKristof Provost }
42462d28676SKristof Provost 
425d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(getaddrs);
42687c7063cSKristof Provost ATF_TC_HEAD(getaddrs, tc)
42787c7063cSKristof Provost {
42887c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
42987c7063cSKristof Provost }
43087c7063cSKristof Provost 
43162d28676SKristof Provost ATF_TC_BODY(getaddrs, tc)
43262d28676SKristof Provost {
43362d28676SKristof Provost 	struct pfioc_table io;
43462d28676SKristof Provost 	struct pfr_addr addr;
43562d28676SKristof Provost 
43662d28676SKristof Provost 	COMMON_HEAD();
43762d28676SKristof Provost 
43862d28676SKristof Provost 	bzero(&addr, sizeof(addr));
43962d28676SKristof Provost 	bzero(&io, sizeof(io));
44062d28676SKristof Provost 	io.pfrio_flags = 0;
44162d28676SKristof Provost 	io.pfrio_buffer = &addr;
44262d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
44362d28676SKristof Provost 
44462d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
44562d28676SKristof Provost 
44662d28676SKristof Provost 	/* Negative size. */
44762d28676SKristof Provost 	io.pfrio_size = -1;
44862d28676SKristof Provost 	if (ioctl(dev, DIOCRGETADDRS, &io) == 0)
44962d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
45062d28676SKristof Provost 
45162d28676SKristof Provost 	/* Overly large size. */
45262d28676SKristof Provost 	io.pfrio_size = 1 << 24;
45362d28676SKristof Provost 	if (ioctl(dev, DIOCRGETADDRS, &io) == 0)
45462d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
455d3cc4030SKristof Provost }
45662d28676SKristof Provost 
457d3cc4030SKristof Provost ATF_TC_CLEANUP(getaddrs, tc)
458d3cc4030SKristof Provost {
45962d28676SKristof Provost 	COMMON_CLEANUP();
46062d28676SKristof Provost }
46162d28676SKristof Provost 
462d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(getastats);
46387c7063cSKristof Provost ATF_TC_HEAD(getastats, tc)
46487c7063cSKristof Provost {
46587c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
46687c7063cSKristof Provost }
46787c7063cSKristof Provost 
46862d28676SKristof Provost ATF_TC_BODY(getastats, tc)
46962d28676SKristof Provost {
47062d28676SKristof Provost 	struct pfioc_table io;
47162d28676SKristof Provost 	struct pfr_astats astats;
47262d28676SKristof Provost 
47362d28676SKristof Provost 	COMMON_HEAD();
47462d28676SKristof Provost 
47562d28676SKristof Provost 	bzero(&astats, sizeof(astats));
47662d28676SKristof Provost 	bzero(&io, sizeof(io));
47762d28676SKristof Provost 	io.pfrio_flags = 0;
47862d28676SKristof Provost 	io.pfrio_buffer = &astats;
47962d28676SKristof Provost 	io.pfrio_esize = sizeof(astats);
48062d28676SKristof Provost 
48162d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
48262d28676SKristof Provost 
48362d28676SKristof Provost 	/* Negative size. */
48462d28676SKristof Provost 	io.pfrio_size = -1;
48562d28676SKristof Provost 	if (ioctl(dev, DIOCRGETASTATS, &io) == 0)
48662d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
48762d28676SKristof Provost 
48862d28676SKristof Provost 	/* Overly large size. */
48962d28676SKristof Provost 	io.pfrio_size = 1 << 24;
49062d28676SKristof Provost 	if (ioctl(dev, DIOCRGETASTATS, &io) == 0)
49162d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
492d3cc4030SKristof Provost }
49362d28676SKristof Provost 
494d3cc4030SKristof Provost ATF_TC_CLEANUP(getastats, tc)
495d3cc4030SKristof Provost {
49662d28676SKristof Provost 	COMMON_CLEANUP();
49762d28676SKristof Provost }
49862d28676SKristof Provost 
499d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(clrastats);
50087c7063cSKristof Provost ATF_TC_HEAD(clrastats, tc)
50187c7063cSKristof Provost {
50287c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
50387c7063cSKristof Provost }
50487c7063cSKristof Provost 
50562d28676SKristof Provost ATF_TC_BODY(clrastats, tc)
50662d28676SKristof Provost {
50762d28676SKristof Provost 	struct pfioc_table io;
50862d28676SKristof Provost 	struct pfr_addr addr;
50962d28676SKristof Provost 
51062d28676SKristof Provost 	COMMON_HEAD();
51162d28676SKristof Provost 
51262d28676SKristof Provost 	bzero(&addr, sizeof(addr));
51362d28676SKristof Provost 	bzero(&io, sizeof(io));
51462d28676SKristof Provost 	io.pfrio_flags = 0;
51562d28676SKristof Provost 	io.pfrio_buffer = &addr;
51662d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
51762d28676SKristof Provost 
51862d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
51962d28676SKristof Provost 
52062d28676SKristof Provost 	/* Negative size. */
52162d28676SKristof Provost 	io.pfrio_size = -1;
52262d28676SKristof Provost 	if (ioctl(dev, DIOCRCLRASTATS, &io) == 0)
52362d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
52462d28676SKristof Provost 
52562d28676SKristof Provost 	/* Overly large size. */
52662d28676SKristof Provost 	io.pfrio_size = 1 << 24;
52762d28676SKristof Provost 	if (ioctl(dev, DIOCRCLRASTATS, &io) == 0)
52862d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
529d3cc4030SKristof Provost }
53062d28676SKristof Provost 
531d3cc4030SKristof Provost ATF_TC_CLEANUP(clrastats, tc)
532d3cc4030SKristof Provost {
53362d28676SKristof Provost 	COMMON_CLEANUP();
53462d28676SKristof Provost }
53562d28676SKristof Provost 
536d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(tstaddrs);
53787c7063cSKristof Provost ATF_TC_HEAD(tstaddrs, tc)
53887c7063cSKristof Provost {
53987c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
54087c7063cSKristof Provost }
54187c7063cSKristof Provost 
54262d28676SKristof Provost ATF_TC_BODY(tstaddrs, tc)
54362d28676SKristof Provost {
54462d28676SKristof Provost 	struct pfioc_table io;
54562d28676SKristof Provost 	struct pfr_addr addr;
54662d28676SKristof Provost 
54762d28676SKristof Provost 	COMMON_HEAD();
54862d28676SKristof Provost 
54962d28676SKristof Provost 	bzero(&addr, sizeof(addr));
55062d28676SKristof Provost 	bzero(&io, sizeof(io));
55162d28676SKristof Provost 	io.pfrio_flags = 0;
55262d28676SKristof Provost 	io.pfrio_buffer = &addr;
55362d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
55462d28676SKristof Provost 
55562d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
55662d28676SKristof Provost 
55762d28676SKristof Provost 	/* Negative size. */
55862d28676SKristof Provost 	io.pfrio_size = -1;
55962d28676SKristof Provost 	if (ioctl(dev, DIOCRTSTADDRS, &io) == 0)
56062d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
56162d28676SKristof Provost 
56262d28676SKristof Provost 	/* Overly large size. */
56362d28676SKristof Provost 	io.pfrio_size = 1 << 24;
56462d28676SKristof Provost 	if (ioctl(dev, DIOCRTSTADDRS, &io) == 0)
56562d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
566d3cc4030SKristof Provost }
56762d28676SKristof Provost 
568d3cc4030SKristof Provost ATF_TC_CLEANUP(tstaddrs, tc)
569d3cc4030SKristof Provost {
57062d28676SKristof Provost 	COMMON_CLEANUP();
57162d28676SKristof Provost }
57262d28676SKristof Provost 
573d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(inadefine);
57487c7063cSKristof Provost ATF_TC_HEAD(inadefine, tc)
57587c7063cSKristof Provost {
57687c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
57787c7063cSKristof Provost }
57887c7063cSKristof Provost 
57962d28676SKristof Provost ATF_TC_BODY(inadefine, tc)
58062d28676SKristof Provost {
58162d28676SKristof Provost 	struct pfioc_table io;
58262d28676SKristof Provost 	struct pfr_addr addr;
58362d28676SKristof Provost 
58462d28676SKristof Provost 	COMMON_HEAD();
58562d28676SKristof Provost 
58662d28676SKristof Provost 	bzero(&addr, sizeof(addr));
58762d28676SKristof Provost 	bzero(&io, sizeof(io));
58862d28676SKristof Provost 	io.pfrio_flags = 0;
58962d28676SKristof Provost 	io.pfrio_buffer = &addr;
59062d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
59162d28676SKristof Provost 
59262d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
59362d28676SKristof Provost 
59462d28676SKristof Provost 	/* Negative size. */
59562d28676SKristof Provost 	io.pfrio_size = -1;
59662d28676SKristof Provost 	if (ioctl(dev, DIOCRINADEFINE, &io) == 0)
59762d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
59862d28676SKristof Provost 
59962d28676SKristof Provost 	/* Overly large size. */
60062d28676SKristof Provost 	io.pfrio_size = 1 << 24;
60162d28676SKristof Provost 	if (ioctl(dev, DIOCRINADEFINE, &io) == 0)
60262d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
603d3cc4030SKristof Provost }
60462d28676SKristof Provost 
605d3cc4030SKristof Provost ATF_TC_CLEANUP(inadefine, tc)
606d3cc4030SKristof Provost {
60762d28676SKristof Provost 	COMMON_CLEANUP();
60862d28676SKristof Provost }
60962d28676SKristof Provost 
610d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(igetifaces);
61187c7063cSKristof Provost ATF_TC_HEAD(igetifaces, tc)
61287c7063cSKristof Provost {
61387c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
61487c7063cSKristof Provost }
61587c7063cSKristof Provost 
6168e748b94SKristof Provost ATF_TC_BODY(igetifaces, tc)
6178e748b94SKristof Provost {
6188e748b94SKristof Provost 	struct pfioc_iface io;
6198e748b94SKristof Provost 	struct pfi_kif kif;
6208e748b94SKristof Provost 
6218e748b94SKristof Provost 	COMMON_HEAD();
6228e748b94SKristof Provost 
6238e748b94SKristof Provost 	bzero(&io, sizeof(io));
6248e748b94SKristof Provost 	io.pfiio_flags = 0;
6258e748b94SKristof Provost 	io.pfiio_buffer = &kif;
6268e748b94SKristof Provost 	io.pfiio_esize = sizeof(kif);
6278e748b94SKristof Provost 
6288e748b94SKristof Provost 	/* Negative size */
6298e748b94SKristof Provost 	io.pfiio_size = -1;
6308e748b94SKristof Provost 	if (ioctl(dev, DIOCIGETIFACES, &io) == 0)
6318e748b94SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
6328e748b94SKristof Provost 
6338e748b94SKristof Provost 	/* Overflow size */
6348e748b94SKristof Provost 	io.pfiio_size = 1 << 31;
6358e748b94SKristof Provost 	if (ioctl(dev, DIOCIGETIFACES, &io) == 0)
6368e748b94SKristof Provost 		atf_tc_fail("request with size 1 << 31 succeeded");
637d3cc4030SKristof Provost }
6388e748b94SKristof Provost 
639d3cc4030SKristof Provost ATF_TC_CLEANUP(igetifaces, tc)
640d3cc4030SKristof Provost {
6418e748b94SKristof Provost 	COMMON_CLEANUP();
6428e748b94SKristof Provost }
6438e748b94SKristof Provost 
644d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(cxbegin);
64587c7063cSKristof Provost ATF_TC_HEAD(cxbegin, tc)
64687c7063cSKristof Provost {
64787c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
64887c7063cSKristof Provost }
64987c7063cSKristof Provost 
65062d28676SKristof Provost ATF_TC_BODY(cxbegin, tc)
65162d28676SKristof Provost {
65262d28676SKristof Provost 	struct pfioc_trans io;
65362d28676SKristof Provost 	struct pfioc_trans_e ioe;
65462d28676SKristof Provost 
65562d28676SKristof Provost 	COMMON_HEAD();
65662d28676SKristof Provost 
65762d28676SKristof Provost 	bzero(&io, sizeof(io));
65862d28676SKristof Provost 	io.esize = sizeof(ioe);
65962d28676SKristof Provost 	io.array = &ioe;
66062d28676SKristof Provost 
66162d28676SKristof Provost 	/* Negative size */
66262d28676SKristof Provost 	io.size = -1;
66362d28676SKristof Provost 	if (ioctl(dev, DIOCXBEGIN, &io) == 0)
66462d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
66562d28676SKristof Provost 
66662d28676SKristof Provost 	/* Overflow size */
66762d28676SKristof Provost 	io.size = 1 << 30;
66862d28676SKristof Provost 	if (ioctl(dev, DIOCXBEGIN, &io) == 0)
66962d28676SKristof Provost 		atf_tc_fail("request with size 1 << 30 succeeded");
67062d28676SKristof Provost 
67162d28676SKristof Provost 	/* NULL buffer */
67262d28676SKristof Provost 	io.size = 1;
67362d28676SKristof Provost 	io.array = NULL;
67462d28676SKristof Provost 	if (ioctl(dev, DIOCXBEGIN, &io) == 0)
67562d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
676d3cc4030SKristof Provost }
67762d28676SKristof Provost 
678d3cc4030SKristof Provost ATF_TC_CLEANUP(cxbegin, tc)
679d3cc4030SKristof Provost {
68062d28676SKristof Provost 	COMMON_CLEANUP();
68162d28676SKristof Provost }
68262d28676SKristof Provost 
683d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(cxrollback);
68487c7063cSKristof Provost ATF_TC_HEAD(cxrollback, tc)
68587c7063cSKristof Provost {
68687c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
68787c7063cSKristof Provost }
68887c7063cSKristof Provost 
68962d28676SKristof Provost ATF_TC_BODY(cxrollback, tc)
69062d28676SKristof Provost {
69162d28676SKristof Provost 	struct pfioc_trans io;
69262d28676SKristof Provost 	struct pfioc_trans_e ioe;
69362d28676SKristof Provost 
69462d28676SKristof Provost 	COMMON_HEAD();
69562d28676SKristof Provost 
69662d28676SKristof Provost 	bzero(&io, sizeof(io));
69762d28676SKristof Provost 	io.esize = sizeof(ioe);
69862d28676SKristof Provost 	io.array = &ioe;
69962d28676SKristof Provost 
70062d28676SKristof Provost 	/* Negative size */
70162d28676SKristof Provost 	io.size = -1;
70262d28676SKristof Provost 	if (ioctl(dev, DIOCXROLLBACK, &io) == 0)
70362d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
70462d28676SKristof Provost 
70562d28676SKristof Provost 	/* Overflow size */
70662d28676SKristof Provost 	io.size = 1 << 30;
70762d28676SKristof Provost 	if (ioctl(dev, DIOCXROLLBACK, &io) == 0)
70862d28676SKristof Provost 		atf_tc_fail("request with size 1 << 30 succeeded");
70962d28676SKristof Provost 
71062d28676SKristof Provost 	/* NULL buffer */
71162d28676SKristof Provost 	io.size = 1;
71262d28676SKristof Provost 	io.array = NULL;
71362d28676SKristof Provost 	if (ioctl(dev, DIOCXROLLBACK, &io) == 0)
71462d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
715d3cc4030SKristof Provost }
71662d28676SKristof Provost 
717d3cc4030SKristof Provost ATF_TC_CLEANUP(cxrollback, tc)
718d3cc4030SKristof Provost {
71962d28676SKristof Provost 	COMMON_CLEANUP();
72062d28676SKristof Provost }
72162d28676SKristof Provost 
722d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(commit);
72387c7063cSKristof Provost ATF_TC_HEAD(commit, tc)
72487c7063cSKristof Provost {
72587c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
72687c7063cSKristof Provost }
72787c7063cSKristof Provost 
7288e748b94SKristof Provost ATF_TC_BODY(commit, tc)
7298e748b94SKristof Provost {
7308e748b94SKristof Provost 	struct pfioc_trans io;
7318e748b94SKristof Provost 	struct pfioc_trans_e ioe;
7328e748b94SKristof Provost 
7338e748b94SKristof Provost 	COMMON_HEAD();
7348e748b94SKristof Provost 
7358e748b94SKristof Provost 	bzero(&io, sizeof(io));
7368e748b94SKristof Provost 	io.esize = sizeof(ioe);
7378e748b94SKristof Provost 	io.array = &ioe;
7388e748b94SKristof Provost 
7398e748b94SKristof Provost 	/* Negative size */
7408e748b94SKristof Provost 	io.size = -1;
7418e748b94SKristof Provost 	if (ioctl(dev, DIOCXCOMMIT, &io) == 0)
7428e748b94SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
7438e748b94SKristof Provost 
7448e748b94SKristof Provost 	/* Overflow size */
7458e748b94SKristof Provost 	io.size = 1 << 30;
7468e748b94SKristof Provost 	if (ioctl(dev, DIOCXCOMMIT, &io) == 0)
7478e748b94SKristof Provost 		atf_tc_fail("request with size 1 << 30 succeeded");
7488e748b94SKristof Provost 
7498e748b94SKristof Provost 	/* NULL buffer */
7508e748b94SKristof Provost 	io.size = 1;
7518e748b94SKristof Provost 	io.array = NULL;
7528e748b94SKristof Provost 	if (ioctl(dev, DIOCXCOMMIT, &io) == 0)
7538e748b94SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
754d3cc4030SKristof Provost }
7558e748b94SKristof Provost 
756d3cc4030SKristof Provost ATF_TC_CLEANUP(commit, tc)
757d3cc4030SKristof Provost {
7588e748b94SKristof Provost 	COMMON_CLEANUP();
7598e748b94SKristof Provost }
7608e748b94SKristof Provost 
761fe5a065dSKristof Provost ATF_TC_WITH_CLEANUP(getsrcnodes);
762fe5a065dSKristof Provost ATF_TC_HEAD(getsrcnodes, tc)
763fe5a065dSKristof Provost {
764fe5a065dSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
765fe5a065dSKristof Provost }
766fe5a065dSKristof Provost 
767fe5a065dSKristof Provost ATF_TC_BODY(getsrcnodes, tc)
768fe5a065dSKristof Provost {
769fe5a065dSKristof Provost 	struct pfioc_src_nodes psn;
770fe5a065dSKristof Provost 
771fe5a065dSKristof Provost 	COMMON_HEAD();
772fe5a065dSKristof Provost 
773fe5a065dSKristof Provost 	bzero(&psn, sizeof(psn));
774fe5a065dSKristof Provost 
775fe5a065dSKristof Provost 	psn.psn_len = -1;
776fe5a065dSKristof Provost 	if (ioctl(dev, DIOCGETSRCNODES, &psn) != 0)
777fe5a065dSKristof Provost 		atf_tc_fail("request with size -1 failed");
778fe5a065dSKristof Provost 
779fe5a065dSKristof Provost 	psn.psn_len = 1 << 30;
780fe5a065dSKristof Provost 	if (ioctl(dev, DIOCGETSRCNODES, &psn) != 0)
781fe5a065dSKristof Provost 		atf_tc_fail("request with size << 30 failed");
782fe5a065dSKristof Provost 
783fe5a065dSKristof Provost 	psn.psn_len = 1 << 31;
784fe5a065dSKristof Provost 	if (ioctl(dev, DIOCGETSRCNODES, &psn) != 0)
785fe5a065dSKristof Provost 		atf_tc_fail("request with size << 30 failed");
786fe5a065dSKristof Provost }
787fe5a065dSKristof Provost 
788fe5a065dSKristof Provost ATF_TC_CLEANUP(getsrcnodes, tc)
789fe5a065dSKristof Provost {
790fe5a065dSKristof Provost 	COMMON_CLEANUP();
791fe5a065dSKristof Provost }
792fe5a065dSKristof Provost 
793*d5325f2fSKristof Provost ATF_TC_WITH_CLEANUP(tag);
794*d5325f2fSKristof Provost ATF_TC_HEAD(tag, tc)
795*d5325f2fSKristof Provost {
796*d5325f2fSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
797*d5325f2fSKristof Provost }
798*d5325f2fSKristof Provost 
799*d5325f2fSKristof Provost ATF_TC_BODY(tag, tc)
800*d5325f2fSKristof Provost {
801*d5325f2fSKristof Provost 	struct pfioc_rule rule;
802*d5325f2fSKristof Provost 
803*d5325f2fSKristof Provost 	COMMON_HEAD();
804*d5325f2fSKristof Provost 
805*d5325f2fSKristof Provost 	memset(&rule, 0x42, sizeof(rule));
806*d5325f2fSKristof Provost 
807*d5325f2fSKristof Provost 	rule.ticket = 0;
808*d5325f2fSKristof Provost 	rule.pool_ticket = 0;
809*d5325f2fSKristof Provost 	rule.anchor[0] = 0;
810*d5325f2fSKristof Provost 
811*d5325f2fSKristof Provost 	rule.rule.return_icmp = 0;
812*d5325f2fSKristof Provost 	bzero(&rule.rule.src, sizeof(rule.rule.src));
813*d5325f2fSKristof Provost 	bzero(&rule.rule.dst, sizeof(rule.rule.dst));
814*d5325f2fSKristof Provost 
815*d5325f2fSKristof Provost 	rule.rule.ifname[0] = 0;
816*d5325f2fSKristof Provost 	rule.rule.action = 0;
817*d5325f2fSKristof Provost 	rule.rule.rtableid = 0;
818*d5325f2fSKristof Provost 
819*d5325f2fSKristof Provost 	rule.rule.tagname[0] = 0;
820*d5325f2fSKristof Provost 
821*d5325f2fSKristof Provost 	for (int i = 0; i < 10; i++)
822*d5325f2fSKristof Provost 		ioctl(dev, DIOCADDRULE, &rule);
823*d5325f2fSKristof Provost }
824*d5325f2fSKristof Provost 
825*d5325f2fSKristof Provost ATF_TC_CLEANUP(tag, tc)
826*d5325f2fSKristof Provost {
827*d5325f2fSKristof Provost 	COMMON_CLEANUP();
828*d5325f2fSKristof Provost }
829*d5325f2fSKristof Provost 
83098c5f988SKristof Provost ATF_TP_ADD_TCS(tp)
83198c5f988SKristof Provost {
83298c5f988SKristof Provost 	ATF_TP_ADD_TC(tp, addtables);
83398c5f988SKristof Provost 	ATF_TP_ADD_TC(tp, deltables);
8341ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, gettables);
8351d2e31afSKyle Evans 	ATF_TP_ADD_TC(tp, getastats);
8361ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, gettstats);
8371ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, clrtstats);
8381ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, settflags);
83962d28676SKristof Provost 	ATF_TP_ADD_TC(tp, addaddrs);
84062d28676SKristof Provost 	ATF_TP_ADD_TC(tp, deladdrs);
84162d28676SKristof Provost 	ATF_TP_ADD_TC(tp, setaddrs);
84262d28676SKristof Provost 	ATF_TP_ADD_TC(tp, getaddrs);
84362d28676SKristof Provost 	ATF_TP_ADD_TC(tp, clrastats);
84462d28676SKristof Provost 	ATF_TP_ADD_TC(tp, tstaddrs);
84562d28676SKristof Provost 	ATF_TP_ADD_TC(tp, inadefine);
8468e748b94SKristof Provost 	ATF_TP_ADD_TC(tp, igetifaces);
84762d28676SKristof Provost 	ATF_TP_ADD_TC(tp, cxbegin);
84862d28676SKristof Provost 	ATF_TP_ADD_TC(tp, cxrollback);
8498e748b94SKristof Provost 	ATF_TP_ADD_TC(tp, commit);
850fe5a065dSKristof Provost 	ATF_TP_ADD_TC(tp, getsrcnodes);
851*d5325f2fSKristof Provost 	ATF_TP_ADD_TC(tp, tag);
85298c5f988SKristof Provost 
85398c5f988SKristof Provost 	return (atf_no_error());
85498c5f988SKristof Provost }
855