xref: /freebsd/tests/sys/netpfil/pf/ioctl/validation.c (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
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 
2698c5f988SKristof Provost #include <sys/param.h>
2798c5f988SKristof Provost #include <sys/module.h>
2898c5f988SKristof Provost #include <sys/types.h>
2998c5f988SKristof Provost #include <sys/ioctl.h>
3098c5f988SKristof Provost #include <sys/socket.h>
3198c5f988SKristof Provost 
3298c5f988SKristof Provost #include <net/if.h>
3398c5f988SKristof Provost #include <net/pfvar.h>
3498c5f988SKristof Provost 
3598c5f988SKristof Provost #include <fcntl.h>
3698c5f988SKristof Provost #include <stdio.h>
3798c5f988SKristof Provost 
3898c5f988SKristof Provost #include <atf-c.h>
3998c5f988SKristof Provost 
4098c5f988SKristof Provost static int dev;
4198c5f988SKristof Provost 
4298c5f988SKristof Provost #define COMMON_HEAD() \
4398c5f988SKristof Provost 	if (modfind("pf") == -1) \
4498c5f988SKristof Provost 		atf_tc_skip("pf not loaded"); \
4598c5f988SKristof Provost 	dev = open("/dev/pf", O_RDWR); \
4698c5f988SKristof Provost 	if (dev == -1) \
4798c5f988SKristof Provost 		atf_tc_skip("Failed to open /dev/pf");
4898c5f988SKristof Provost 
4998c5f988SKristof Provost #define COMMON_CLEANUP() \
5098c5f988SKristof Provost 	close(dev);
5198c5f988SKristof Provost 
521d2e31afSKyle Evans static void
common_init_tbl(struct pfr_table * tbl)531ff545d6SKristof Provost common_init_tbl(struct pfr_table *tbl)
541ff545d6SKristof Provost {
551ff545d6SKristof Provost 	bzero(tbl, sizeof(struct pfr_table));
561ff545d6SKristof Provost 	strcpy(tbl->pfrt_anchor, "anchor");
571ff545d6SKristof Provost 	strcpy(tbl->pfrt_name, "name");
581ff545d6SKristof Provost 	tbl->pfrt_flags = 0;
591ff545d6SKristof Provost 	tbl->pfrt_fback = 0;
601ff545d6SKristof Provost }
611ff545d6SKristof Provost 
62d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(addtables);
ATF_TC_HEAD(addtables,tc)6387c7063cSKristof Provost ATF_TC_HEAD(addtables, tc)
6487c7063cSKristof Provost {
6587c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
6687c7063cSKristof Provost }
6787c7063cSKristof Provost 
ATF_TC_BODY(addtables,tc)6898c5f988SKristof Provost ATF_TC_BODY(addtables, tc)
6998c5f988SKristof Provost {
7098c5f988SKristof Provost 	struct pfioc_table io;
7198c5f988SKristof Provost 	struct pfr_table tbl;
721bb72c29SKristof Provost 	struct pfr_table tbls[4];
7398c5f988SKristof Provost 	int flags;
7498c5f988SKristof Provost 
7598c5f988SKristof Provost 	COMMON_HEAD();
7698c5f988SKristof Provost 
7798c5f988SKristof Provost 	flags = 0;
7898c5f988SKristof Provost 
7998c5f988SKristof Provost 	bzero(&io, sizeof(io));
8098c5f988SKristof Provost 	io.pfrio_flags = flags;
8198c5f988SKristof Provost 	io.pfrio_buffer = &tbl;
8298c5f988SKristof Provost 	io.pfrio_esize = sizeof(tbl);
8398c5f988SKristof Provost 
8498c5f988SKristof Provost 	/* Negative size */
8598c5f988SKristof Provost 	io.pfrio_size = -1;
8698c5f988SKristof Provost 	if (ioctl(dev, DIOCRADDTABLES, &io) == 0)
8798c5f988SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
8898c5f988SKristof Provost 
8998c5f988SKristof Provost 	/* Overly large size */
9098c5f988SKristof Provost 	io.pfrio_size = 1 << 24;
9198c5f988SKristof Provost 	if (ioctl(dev, DIOCRADDTABLES, &io) == 0)
9298c5f988SKristof Provost 		atf_tc_fail("Request with size 1 << 24 succeeded");
9398c5f988SKristof Provost 
9498c5f988SKristof Provost 	/* NULL buffer */
9598c5f988SKristof Provost 	io.pfrio_size = 1;
9698c5f988SKristof Provost 	io.pfrio_buffer = NULL;
9798c5f988SKristof Provost 	if (ioctl(dev, DIOCRADDTABLES, &io) == 0)
9898c5f988SKristof Provost 		atf_tc_fail("Request with NULL buffer succeeded");
9998c5f988SKristof Provost 
1001bb72c29SKristof Provost 	/* This can provoke a memory leak, see r331225. */
1011bb72c29SKristof Provost 	io.pfrio_size = 4;
1021bb72c29SKristof Provost 	for (int i = 0; i < io.pfrio_size; i++)
1031bb72c29SKristof Provost 		common_init_tbl(&tbls[i]);
1041bb72c29SKristof Provost 
1051bb72c29SKristof Provost 	io.pfrio_buffer = &tbls;
1061bb72c29SKristof Provost 	ioctl(dev, DIOCRADDTABLES, &io);
107d3cc4030SKristof Provost }
1081bb72c29SKristof Provost 
ATF_TC_CLEANUP(addtables,tc)109d3cc4030SKristof Provost ATF_TC_CLEANUP(addtables, tc)
110d3cc4030SKristof Provost {
11198c5f988SKristof Provost 	COMMON_CLEANUP();
11298c5f988SKristof Provost }
11398c5f988SKristof Provost 
114d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(deltables);
ATF_TC_HEAD(deltables,tc)11587c7063cSKristof Provost ATF_TC_HEAD(deltables, tc)
11687c7063cSKristof Provost {
11787c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
11887c7063cSKristof Provost }
11987c7063cSKristof Provost 
ATF_TC_BODY(deltables,tc)12098c5f988SKristof Provost ATF_TC_BODY(deltables, tc)
12198c5f988SKristof Provost {
12298c5f988SKristof Provost 	struct pfioc_table io;
12398c5f988SKristof Provost 	struct pfr_table tbl;
12498c5f988SKristof Provost 	int flags;
12598c5f988SKristof Provost 
12698c5f988SKristof Provost 	COMMON_HEAD();
12798c5f988SKristof Provost 
12898c5f988SKristof Provost 	flags = 0;
12998c5f988SKristof Provost 
13098c5f988SKristof Provost 	bzero(&io, sizeof(io));
13198c5f988SKristof Provost 	io.pfrio_flags = flags;
13298c5f988SKristof Provost 	io.pfrio_buffer = &tbl;
13398c5f988SKristof Provost 	io.pfrio_esize = sizeof(tbl);
13498c5f988SKristof Provost 
13598c5f988SKristof Provost 	/* Negative size */
13698c5f988SKristof Provost 	io.pfrio_size = -1;
13798c5f988SKristof Provost 	if (ioctl(dev, DIOCRDELTABLES, &io) == 0)
13898c5f988SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
13998c5f988SKristof Provost 
14098c5f988SKristof Provost 	/* Overly large size */
14198c5f988SKristof Provost 	io.pfrio_size = 1 << 24;
14298c5f988SKristof Provost 	if (ioctl(dev, DIOCRDELTABLES, &io) == 0)
14398c5f988SKristof Provost 		atf_tc_fail("Request with size 1 << 24 succeeded");
14498c5f988SKristof Provost 
14598c5f988SKristof Provost 	/* NULL buffer */
14698c5f988SKristof Provost 	io.pfrio_size = 1;
14798c5f988SKristof Provost 	io.pfrio_buffer = NULL;
14898c5f988SKristof Provost 	if (ioctl(dev, DIOCRDELTABLES, &io) == 0)
14998c5f988SKristof Provost 		atf_tc_fail("Request with NULL buffer succeeded");
150d3cc4030SKristof Provost }
15198c5f988SKristof Provost 
ATF_TC_CLEANUP(deltables,tc)152d3cc4030SKristof Provost ATF_TC_CLEANUP(deltables, tc)
153d3cc4030SKristof Provost {
15498c5f988SKristof Provost 	COMMON_CLEANUP();
15598c5f988SKristof Provost }
15698c5f988SKristof Provost 
157d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(gettables);
ATF_TC_HEAD(gettables,tc)15887c7063cSKristof Provost ATF_TC_HEAD(gettables, tc)
15987c7063cSKristof Provost {
16087c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
16187c7063cSKristof Provost }
16287c7063cSKristof Provost 
ATF_TC_BODY(gettables,tc)1631ff545d6SKristof Provost ATF_TC_BODY(gettables, tc)
1641ff545d6SKristof Provost {
1651ff545d6SKristof Provost 	struct pfioc_table io;
1661ff545d6SKristof Provost 	struct pfr_table tbl;
1671ff545d6SKristof Provost 	int flags;
1681ff545d6SKristof Provost 
1691ff545d6SKristof Provost 	COMMON_HEAD();
1701ff545d6SKristof Provost 
1711ff545d6SKristof Provost 	flags = 0;
1721ff545d6SKristof Provost 
1731ff545d6SKristof Provost 	bzero(&io, sizeof(io));
1741ff545d6SKristof Provost 	io.pfrio_flags = flags;
1751ff545d6SKristof Provost 	io.pfrio_buffer = &tbl;
1761ff545d6SKristof Provost 	io.pfrio_esize = sizeof(tbl);
1771ff545d6SKristof Provost 
1781ff545d6SKristof Provost 	/* Negative size. This will succeed, because the kernel will not copy
1791ff545d6SKristof Provost 	 * tables than it has. */
1801ff545d6SKristof Provost 	io.pfrio_size = -1;
1811ff545d6SKristof Provost 	if (ioctl(dev, DIOCRGETTABLES, &io) != 0)
1821ff545d6SKristof Provost 		atf_tc_fail("Request with size -1 failed");
1831ff545d6SKristof Provost 
1841ff545d6SKristof Provost 	/* Overly large size. See above. */
1851ff545d6SKristof Provost 	io.pfrio_size = 1 << 24;
1861ff545d6SKristof Provost 	if (ioctl(dev, DIOCRGETTABLES, &io) != 0)
1871ff545d6SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
188d3cc4030SKristof Provost }
1891ff545d6SKristof Provost 
ATF_TC_CLEANUP(gettables,tc)190d3cc4030SKristof Provost ATF_TC_CLEANUP(gettables, tc)
191d3cc4030SKristof Provost {
1921ff545d6SKristof Provost 	COMMON_CLEANUP();
1931ff545d6SKristof Provost }
1941ff545d6SKristof Provost 
195d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(gettstats);
ATF_TC_HEAD(gettstats,tc)19687c7063cSKristof Provost ATF_TC_HEAD(gettstats, tc)
19787c7063cSKristof Provost {
19887c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
19987c7063cSKristof Provost }
20087c7063cSKristof Provost 
ATF_TC_BODY(gettstats,tc)2011ff545d6SKristof Provost ATF_TC_BODY(gettstats, tc)
2021ff545d6SKristof Provost {
2031ff545d6SKristof Provost 	struct pfioc_table io;
2041ff545d6SKristof Provost 	struct pfr_tstats stats;
2051ff545d6SKristof Provost 	int flags;
2061ff545d6SKristof Provost 
2071ff545d6SKristof Provost 	COMMON_HEAD();
2081ff545d6SKristof Provost 
2091ff545d6SKristof Provost 	flags = 0;
2101ff545d6SKristof Provost 
2111ff545d6SKristof Provost 	bzero(&io, sizeof(io));
2121ff545d6SKristof Provost 	io.pfrio_flags = flags;
2131ff545d6SKristof Provost 	io.pfrio_buffer = &stats;
2141ff545d6SKristof Provost 	io.pfrio_esize = sizeof(stats);
2151ff545d6SKristof Provost 
2161ff545d6SKristof Provost 	/* Negative size. This will succeed, because the kernel will not copy
2171ff545d6SKristof Provost 	 * tables than it has. */
2181ff545d6SKristof Provost 	io.pfrio_size = -1;
2191ff545d6SKristof Provost 	if (ioctl(dev, DIOCRGETTSTATS, &io) != 0)
2201ff545d6SKristof Provost 		atf_tc_fail("Request with size -1 failed");
2211ff545d6SKristof Provost 
2221ff545d6SKristof Provost 	/* Overly large size. See above. */
2231ff545d6SKristof Provost 	io.pfrio_size = 1 << 24;
2241ff545d6SKristof Provost 	if (ioctl(dev, DIOCRGETTSTATS, &io) != 0)
2251ff545d6SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
226d3cc4030SKristof Provost }
2271ff545d6SKristof Provost 
ATF_TC_CLEANUP(gettstats,tc)228d3cc4030SKristof Provost ATF_TC_CLEANUP(gettstats, tc)
229d3cc4030SKristof Provost {
2301ff545d6SKristof Provost 	COMMON_CLEANUP();
2311ff545d6SKristof Provost }
2321ff545d6SKristof Provost 
233d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(clrtstats);
ATF_TC_HEAD(clrtstats,tc)23487c7063cSKristof Provost ATF_TC_HEAD(clrtstats, tc)
23587c7063cSKristof Provost {
23687c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
23787c7063cSKristof Provost }
23887c7063cSKristof Provost 
ATF_TC_BODY(clrtstats,tc)2391ff545d6SKristof Provost ATF_TC_BODY(clrtstats, tc)
2401ff545d6SKristof Provost {
2411ff545d6SKristof Provost 	struct pfioc_table io;
2421ff545d6SKristof Provost 	struct pfr_table tbl;
2431ff545d6SKristof Provost 	int flags;
2441ff545d6SKristof Provost 
2451ff545d6SKristof Provost 	COMMON_HEAD();
2461ff545d6SKristof Provost 
2471ff545d6SKristof Provost 	flags = 0;
2481ff545d6SKristof Provost 
2491ff545d6SKristof Provost 	common_init_tbl(&tbl);
2501ff545d6SKristof Provost 
2511ff545d6SKristof Provost 	bzero(&io, sizeof(io));
2521ff545d6SKristof Provost 	io.pfrio_flags = flags;
2531ff545d6SKristof Provost 	io.pfrio_buffer = &tbl;
2541ff545d6SKristof Provost 	io.pfrio_esize = sizeof(tbl);
2551ff545d6SKristof Provost 
2561ff545d6SKristof Provost 	/* Negative size. This will succeed, because the kernel will not copy
2571ff545d6SKristof Provost 	 * tables than it has. */
2581ff545d6SKristof Provost 	io.pfrio_size = -1;
2591ff545d6SKristof Provost 	if (ioctl(dev, DIOCRCLRTSTATS, &io) != 0)
2601ff545d6SKristof Provost 		atf_tc_fail("Request with size -1 failed ");
2611ff545d6SKristof Provost 
2621ff545d6SKristof Provost 	/* Overly large size. See above. */
2631ff545d6SKristof Provost 	io.pfrio_size = 1 << 24;
2641ff545d6SKristof Provost 	if (ioctl(dev, DIOCRCLRTSTATS, &io) != 0)
2651ff545d6SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
26644117554SKristof Provost 
26744117554SKristof Provost 	io.pfrio_size = sizeof(tbl);
26844117554SKristof Provost 	io.pfrio_buffer = NULL;
26944117554SKristof Provost 	if (ioctl(dev, DIOCRCLRTSTATS, &io) == 0)
27044117554SKristof Provost 		atf_tc_fail("Request with NULL buffer succeeded");
271d3cc4030SKristof Provost }
2721ff545d6SKristof Provost 
ATF_TC_CLEANUP(clrtstats,tc)273d3cc4030SKristof Provost ATF_TC_CLEANUP(clrtstats, tc)
274d3cc4030SKristof Provost {
2751ff545d6SKristof Provost 	COMMON_CLEANUP();
2761ff545d6SKristof Provost }
2771ff545d6SKristof Provost 
278d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(settflags);
ATF_TC_HEAD(settflags,tc)27987c7063cSKristof Provost ATF_TC_HEAD(settflags, tc)
28087c7063cSKristof Provost {
28187c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
28287c7063cSKristof Provost }
28387c7063cSKristof Provost 
ATF_TC_BODY(settflags,tc)2841ff545d6SKristof Provost ATF_TC_BODY(settflags, tc)
2851ff545d6SKristof Provost {
2861ff545d6SKristof Provost 	struct pfioc_table io;
2871ff545d6SKristof Provost 	struct pfr_table tbl;
2881ff545d6SKristof Provost 	int flags;
2891ff545d6SKristof Provost 
2901ff545d6SKristof Provost 	COMMON_HEAD();
2911ff545d6SKristof Provost 
2921ff545d6SKristof Provost 	flags = 0;
2931ff545d6SKristof Provost 
2941ff545d6SKristof Provost 	common_init_tbl(&tbl);
2951ff545d6SKristof Provost 
2961ff545d6SKristof Provost 	bzero(&io, sizeof(io));
2971ff545d6SKristof Provost 	io.pfrio_flags = flags;
2981ff545d6SKristof Provost 	io.pfrio_buffer = &tbl;
2991ff545d6SKristof Provost 	io.pfrio_esize = sizeof(tbl);
3001ff545d6SKristof Provost 
3011ff545d6SKristof Provost 	/* Negative size. This will succeed, because the kernel will not copy
3021ff545d6SKristof Provost 	 * tables than it has. */
3031ff545d6SKristof Provost 	io.pfrio_size = -1;
3041ff545d6SKristof Provost 	if (ioctl(dev, DIOCRSETTFLAGS, &io) != 0)
3051ff545d6SKristof Provost 		atf_tc_fail("Request with size -1 failed");
3061ff545d6SKristof Provost 
3071ff545d6SKristof Provost 	/* Overly large size. See above. */
3081ff545d6SKristof Provost 	io.pfrio_size = 1 << 28;
3091ff545d6SKristof Provost 	if (ioctl(dev, DIOCRSETTFLAGS, &io) != 0)
3101ff545d6SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
311246e18b2SKristof Provost 
312246e18b2SKristof Provost 	/* NULL buffer */
313246e18b2SKristof Provost 	io.pfrio_buffer = NULL;
314246e18b2SKristof Provost 	if (ioctl(dev, DIOCRSETTFLAGS, &io) != -1)
315246e18b2SKristof Provost 		atf_tc_fail("Request with NULL buffer succeeded");
316d3cc4030SKristof Provost }
3171ff545d6SKristof Provost 
ATF_TC_CLEANUP(settflags,tc)318d3cc4030SKristof Provost ATF_TC_CLEANUP(settflags, tc)
319d3cc4030SKristof Provost {
3201ff545d6SKristof Provost 	COMMON_CLEANUP();
3211ff545d6SKristof Provost }
3221ff545d6SKristof Provost 
323d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(addaddrs);
ATF_TC_HEAD(addaddrs,tc)32487c7063cSKristof Provost ATF_TC_HEAD(addaddrs, tc)
32587c7063cSKristof Provost {
32687c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
32787c7063cSKristof Provost }
32887c7063cSKristof Provost 
ATF_TC_BODY(addaddrs,tc)32962d28676SKristof Provost ATF_TC_BODY(addaddrs, tc)
33062d28676SKristof Provost {
33162d28676SKristof Provost 	struct pfioc_table io;
33262d28676SKristof Provost 	struct pfr_addr addr;
33362d28676SKristof Provost 
33462d28676SKristof Provost 	COMMON_HEAD();
33562d28676SKristof Provost 
33662d28676SKristof Provost 	bzero(&addr, sizeof(addr));
33762d28676SKristof Provost 	bzero(&io, sizeof(io));
33862d28676SKristof Provost 	io.pfrio_flags = 0;
33962d28676SKristof Provost 	io.pfrio_buffer = &addr;
34062d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
34162d28676SKristof Provost 
34262d28676SKristof Provost 	/* Negative size. */
34362d28676SKristof Provost 	io.pfrio_size = -1;
34462d28676SKristof Provost 	if (ioctl(dev, DIOCRADDADDRS, &io) == 0)
34562d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
34662d28676SKristof Provost 
34762d28676SKristof Provost 	/* Overly large size. */
34862d28676SKristof Provost 	io.pfrio_size = 1 << 28;
34962d28676SKristof Provost 	if (ioctl(dev, DIOCRADDADDRS, &io) == 0)
35062d28676SKristof Provost 		atf_tc_fail("Reuqest with size 1 << 28 failed");
351d3cc4030SKristof Provost }
35262d28676SKristof Provost 
ATF_TC_CLEANUP(addaddrs,tc)353d3cc4030SKristof Provost ATF_TC_CLEANUP(addaddrs, tc)
354d3cc4030SKristof Provost {
35562d28676SKristof Provost 	COMMON_CLEANUP();
35662d28676SKristof Provost }
35762d28676SKristof Provost 
358d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(deladdrs);
ATF_TC_HEAD(deladdrs,tc)35987c7063cSKristof Provost ATF_TC_HEAD(deladdrs, tc)
36087c7063cSKristof Provost {
36187c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
36287c7063cSKristof Provost }
36387c7063cSKristof Provost 
ATF_TC_BODY(deladdrs,tc)36462d28676SKristof Provost ATF_TC_BODY(deladdrs, tc)
36562d28676SKristof Provost {
36662d28676SKristof Provost 	struct pfioc_table io;
36762d28676SKristof Provost 	struct pfr_addr addr;
36862d28676SKristof Provost 
36962d28676SKristof Provost 	COMMON_HEAD();
37062d28676SKristof Provost 
37162d28676SKristof Provost 	bzero(&addr, sizeof(addr));
37262d28676SKristof Provost 	bzero(&io, sizeof(io));
37362d28676SKristof Provost 	io.pfrio_flags = 0;
37462d28676SKristof Provost 	io.pfrio_buffer = &addr;
37562d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
37662d28676SKristof Provost 
37762d28676SKristof Provost 	/* Negative size. */
37862d28676SKristof Provost 	io.pfrio_size = -1;
37962d28676SKristof Provost 	if (ioctl(dev, DIOCRDELADDRS, &io) == 0)
38062d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
38162d28676SKristof Provost 
38262d28676SKristof Provost 	/* Overly large size. */
38362d28676SKristof Provost 	io.pfrio_size = 1 << 28;
38462d28676SKristof Provost 	if (ioctl(dev, DIOCRDELADDRS, &io) == 0)
38562d28676SKristof Provost 		atf_tc_fail("Reuqest with size 1 << 28 failed");
386d3cc4030SKristof Provost }
38762d28676SKristof Provost 
ATF_TC_CLEANUP(deladdrs,tc)388d3cc4030SKristof Provost ATF_TC_CLEANUP(deladdrs, tc)
389d3cc4030SKristof Provost {
39062d28676SKristof Provost 	COMMON_CLEANUP();
39162d28676SKristof Provost }
39262d28676SKristof Provost 
393d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(setaddrs);
ATF_TC_HEAD(setaddrs,tc)39487c7063cSKristof Provost ATF_TC_HEAD(setaddrs, tc)
39587c7063cSKristof Provost {
39687c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
39787c7063cSKristof Provost }
39887c7063cSKristof Provost 
ATF_TC_BODY(setaddrs,tc)39962d28676SKristof Provost ATF_TC_BODY(setaddrs, tc)
40062d28676SKristof Provost {
40162d28676SKristof Provost 	struct pfioc_table io;
40262d28676SKristof Provost 	struct pfr_addr addr;
40362d28676SKristof Provost 
40462d28676SKristof Provost 	COMMON_HEAD();
40562d28676SKristof Provost 
40662d28676SKristof Provost 	bzero(&addr, sizeof(addr));
40762d28676SKristof Provost 	bzero(&io, sizeof(io));
40862d28676SKristof Provost 	io.pfrio_flags = 0;
40962d28676SKristof Provost 	io.pfrio_buffer = &addr;
41062d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
41162d28676SKristof Provost 
41262d28676SKristof Provost 	/* Negative size. */
41362d28676SKristof Provost 	io.pfrio_size = -1;
41462d28676SKristof Provost 	if (ioctl(dev, DIOCRSETADDRS, &io) == 0)
41562d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
41662d28676SKristof Provost 
41762d28676SKristof Provost 	/* Overly large size. */
41862d28676SKristof Provost 	io.pfrio_size = 1 << 28;
41962d28676SKristof Provost 	if (ioctl(dev, DIOCRSETADDRS, &io) == 0)
42062d28676SKristof Provost 		atf_tc_fail("Reuqest with size 1 << 28 failed");
421d3cc4030SKristof Provost }
42262d28676SKristof Provost 
ATF_TC_CLEANUP(setaddrs,tc)423d3cc4030SKristof Provost ATF_TC_CLEANUP(setaddrs, tc)
424d3cc4030SKristof Provost {
42562d28676SKristof Provost 	COMMON_CLEANUP();
42662d28676SKristof Provost }
42762d28676SKristof Provost 
428d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(getaddrs);
ATF_TC_HEAD(getaddrs,tc)42987c7063cSKristof Provost ATF_TC_HEAD(getaddrs, tc)
43087c7063cSKristof Provost {
43187c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
43287c7063cSKristof Provost }
43387c7063cSKristof Provost 
ATF_TC_BODY(getaddrs,tc)43462d28676SKristof Provost ATF_TC_BODY(getaddrs, tc)
43562d28676SKristof Provost {
43662d28676SKristof Provost 	struct pfioc_table io;
43762d28676SKristof Provost 	struct pfr_addr addr;
43862d28676SKristof Provost 
43962d28676SKristof Provost 	COMMON_HEAD();
44062d28676SKristof Provost 
44162d28676SKristof Provost 	bzero(&addr, sizeof(addr));
44262d28676SKristof Provost 	bzero(&io, sizeof(io));
44362d28676SKristof Provost 	io.pfrio_flags = 0;
44462d28676SKristof Provost 	io.pfrio_buffer = &addr;
44562d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
44662d28676SKristof Provost 
44762d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
44862d28676SKristof Provost 
44962d28676SKristof Provost 	/* Negative size. */
45062d28676SKristof Provost 	io.pfrio_size = -1;
45162d28676SKristof Provost 	if (ioctl(dev, DIOCRGETADDRS, &io) == 0)
45262d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
45362d28676SKristof Provost 
45462d28676SKristof Provost 	/* Overly large size. */
45562d28676SKristof Provost 	io.pfrio_size = 1 << 24;
45662d28676SKristof Provost 	if (ioctl(dev, DIOCRGETADDRS, &io) == 0)
45762d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
458d3cc4030SKristof Provost }
45962d28676SKristof Provost 
ATF_TC_CLEANUP(getaddrs,tc)460d3cc4030SKristof Provost ATF_TC_CLEANUP(getaddrs, tc)
461d3cc4030SKristof Provost {
46262d28676SKristof Provost 	COMMON_CLEANUP();
46362d28676SKristof Provost }
46462d28676SKristof Provost 
465d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(getastats);
ATF_TC_HEAD(getastats,tc)46687c7063cSKristof Provost ATF_TC_HEAD(getastats, tc)
46787c7063cSKristof Provost {
46887c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
46987c7063cSKristof Provost }
47087c7063cSKristof Provost 
ATF_TC_BODY(getastats,tc)47162d28676SKristof Provost ATF_TC_BODY(getastats, tc)
47262d28676SKristof Provost {
47362d28676SKristof Provost 	struct pfioc_table io;
47462d28676SKristof Provost 	struct pfr_astats astats;
47562d28676SKristof Provost 
47662d28676SKristof Provost 	COMMON_HEAD();
47762d28676SKristof Provost 
47862d28676SKristof Provost 	bzero(&astats, sizeof(astats));
47962d28676SKristof Provost 	bzero(&io, sizeof(io));
48062d28676SKristof Provost 	io.pfrio_flags = 0;
48162d28676SKristof Provost 	io.pfrio_buffer = &astats;
48262d28676SKristof Provost 	io.pfrio_esize = sizeof(astats);
48362d28676SKristof Provost 
48462d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
48562d28676SKristof Provost 
48662d28676SKristof Provost 	/* Negative size. */
48762d28676SKristof Provost 	io.pfrio_size = -1;
48862d28676SKristof Provost 	if (ioctl(dev, DIOCRGETASTATS, &io) == 0)
48962d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
49062d28676SKristof Provost 
49162d28676SKristof Provost 	/* Overly large size. */
49262d28676SKristof Provost 	io.pfrio_size = 1 << 24;
49362d28676SKristof Provost 	if (ioctl(dev, DIOCRGETASTATS, &io) == 0)
49462d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
495d3cc4030SKristof Provost }
49662d28676SKristof Provost 
ATF_TC_CLEANUP(getastats,tc)497d3cc4030SKristof Provost ATF_TC_CLEANUP(getastats, tc)
498d3cc4030SKristof Provost {
49962d28676SKristof Provost 	COMMON_CLEANUP();
50062d28676SKristof Provost }
50162d28676SKristof Provost 
502d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(clrastats);
ATF_TC_HEAD(clrastats,tc)50387c7063cSKristof Provost ATF_TC_HEAD(clrastats, tc)
50487c7063cSKristof Provost {
50587c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
50687c7063cSKristof Provost }
50787c7063cSKristof Provost 
ATF_TC_BODY(clrastats,tc)50862d28676SKristof Provost ATF_TC_BODY(clrastats, tc)
50962d28676SKristof Provost {
51062d28676SKristof Provost 	struct pfioc_table io;
51162d28676SKristof Provost 	struct pfr_addr addr;
51262d28676SKristof Provost 
51362d28676SKristof Provost 	COMMON_HEAD();
51462d28676SKristof Provost 
51562d28676SKristof Provost 	bzero(&addr, sizeof(addr));
51662d28676SKristof Provost 	bzero(&io, sizeof(io));
51762d28676SKristof Provost 	io.pfrio_flags = 0;
51862d28676SKristof Provost 	io.pfrio_buffer = &addr;
51962d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
52062d28676SKristof Provost 
52162d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
52262d28676SKristof Provost 
52362d28676SKristof Provost 	/* Negative size. */
52462d28676SKristof Provost 	io.pfrio_size = -1;
52562d28676SKristof Provost 	if (ioctl(dev, DIOCRCLRASTATS, &io) == 0)
52662d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
52762d28676SKristof Provost 
52862d28676SKristof Provost 	/* Overly large size. */
52962d28676SKristof Provost 	io.pfrio_size = 1 << 24;
53062d28676SKristof Provost 	if (ioctl(dev, DIOCRCLRASTATS, &io) == 0)
53162d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
532d3cc4030SKristof Provost }
53362d28676SKristof Provost 
ATF_TC_CLEANUP(clrastats,tc)534d3cc4030SKristof Provost ATF_TC_CLEANUP(clrastats, tc)
535d3cc4030SKristof Provost {
53662d28676SKristof Provost 	COMMON_CLEANUP();
53762d28676SKristof Provost }
53862d28676SKristof Provost 
539d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(tstaddrs);
ATF_TC_HEAD(tstaddrs,tc)54087c7063cSKristof Provost ATF_TC_HEAD(tstaddrs, tc)
54187c7063cSKristof Provost {
54287c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
54387c7063cSKristof Provost }
54487c7063cSKristof Provost 
ATF_TC_BODY(tstaddrs,tc)54562d28676SKristof Provost ATF_TC_BODY(tstaddrs, tc)
54662d28676SKristof Provost {
54762d28676SKristof Provost 	struct pfioc_table io;
54862d28676SKristof Provost 	struct pfr_addr addr;
54962d28676SKristof Provost 
55062d28676SKristof Provost 	COMMON_HEAD();
55162d28676SKristof Provost 
55262d28676SKristof Provost 	bzero(&addr, sizeof(addr));
55362d28676SKristof Provost 	bzero(&io, sizeof(io));
55462d28676SKristof Provost 	io.pfrio_flags = 0;
55562d28676SKristof Provost 	io.pfrio_buffer = &addr;
55662d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
55762d28676SKristof Provost 
55862d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
55962d28676SKristof Provost 
56062d28676SKristof Provost 	/* Negative size. */
56162d28676SKristof Provost 	io.pfrio_size = -1;
56262d28676SKristof Provost 	if (ioctl(dev, DIOCRTSTADDRS, &io) == 0)
56362d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
56462d28676SKristof Provost 
56562d28676SKristof Provost 	/* Overly large size. */
56662d28676SKristof Provost 	io.pfrio_size = 1 << 24;
56762d28676SKristof Provost 	if (ioctl(dev, DIOCRTSTADDRS, &io) == 0)
56862d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
569d3cc4030SKristof Provost }
57062d28676SKristof Provost 
ATF_TC_CLEANUP(tstaddrs,tc)571d3cc4030SKristof Provost ATF_TC_CLEANUP(tstaddrs, tc)
572d3cc4030SKristof Provost {
57362d28676SKristof Provost 	COMMON_CLEANUP();
57462d28676SKristof Provost }
57562d28676SKristof Provost 
576d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(inadefine);
ATF_TC_HEAD(inadefine,tc)57787c7063cSKristof Provost ATF_TC_HEAD(inadefine, tc)
57887c7063cSKristof Provost {
57987c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
58087c7063cSKristof Provost }
58187c7063cSKristof Provost 
ATF_TC_BODY(inadefine,tc)58262d28676SKristof Provost ATF_TC_BODY(inadefine, tc)
58362d28676SKristof Provost {
58462d28676SKristof Provost 	struct pfioc_table io;
58562d28676SKristof Provost 	struct pfr_addr addr;
58662d28676SKristof Provost 
58762d28676SKristof Provost 	COMMON_HEAD();
58862d28676SKristof Provost 
58962d28676SKristof Provost 	bzero(&addr, sizeof(addr));
59062d28676SKristof Provost 	bzero(&io, sizeof(io));
59162d28676SKristof Provost 	io.pfrio_flags = 0;
59262d28676SKristof Provost 	io.pfrio_buffer = &addr;
59362d28676SKristof Provost 	io.pfrio_esize = sizeof(addr);
59462d28676SKristof Provost 
59562d28676SKristof Provost 	common_init_tbl(&io.pfrio_table);
59662d28676SKristof Provost 
59762d28676SKristof Provost 	/* Negative size. */
59862d28676SKristof Provost 	io.pfrio_size = -1;
59962d28676SKristof Provost 	if (ioctl(dev, DIOCRINADEFINE, &io) == 0)
60062d28676SKristof Provost 		atf_tc_fail("Request with size -1 succeeded");
60162d28676SKristof Provost 
60262d28676SKristof Provost 	/* Overly large size. */
60362d28676SKristof Provost 	io.pfrio_size = 1 << 24;
60462d28676SKristof Provost 	if (ioctl(dev, DIOCRINADEFINE, &io) == 0)
60562d28676SKristof Provost 		atf_tc_fail("Request with size 1 << 24 failed");
606d3cc4030SKristof Provost }
60762d28676SKristof Provost 
ATF_TC_CLEANUP(inadefine,tc)608d3cc4030SKristof Provost ATF_TC_CLEANUP(inadefine, tc)
609d3cc4030SKristof Provost {
61062d28676SKristof Provost 	COMMON_CLEANUP();
61162d28676SKristof Provost }
61262d28676SKristof Provost 
613d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(igetifaces);
ATF_TC_HEAD(igetifaces,tc)61487c7063cSKristof Provost ATF_TC_HEAD(igetifaces, tc)
61587c7063cSKristof Provost {
61687c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
61787c7063cSKristof Provost }
61887c7063cSKristof Provost 
ATF_TC_BODY(igetifaces,tc)6198e748b94SKristof Provost ATF_TC_BODY(igetifaces, tc)
6208e748b94SKristof Provost {
6218e748b94SKristof Provost 	struct pfioc_iface io;
6228e748b94SKristof Provost 	struct pfi_kif kif;
6238e748b94SKristof Provost 
6248e748b94SKristof Provost 	COMMON_HEAD();
6258e748b94SKristof Provost 
6268e748b94SKristof Provost 	bzero(&io, sizeof(io));
6278e748b94SKristof Provost 	io.pfiio_flags = 0;
6288e748b94SKristof Provost 	io.pfiio_buffer = &kif;
6298e748b94SKristof Provost 	io.pfiio_esize = sizeof(kif);
6308e748b94SKristof Provost 
6318e748b94SKristof Provost 	/* Negative size */
6328e748b94SKristof Provost 	io.pfiio_size = -1;
6338e748b94SKristof Provost 	if (ioctl(dev, DIOCIGETIFACES, &io) == 0)
6348e748b94SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
6358e748b94SKristof Provost 
6368e748b94SKristof Provost 	/* Overflow size */
6378e748b94SKristof Provost 	io.pfiio_size = 1 << 31;
6388e748b94SKristof Provost 	if (ioctl(dev, DIOCIGETIFACES, &io) == 0)
6398e748b94SKristof Provost 		atf_tc_fail("request with size 1 << 31 succeeded");
640d3cc4030SKristof Provost }
6418e748b94SKristof Provost 
ATF_TC_CLEANUP(igetifaces,tc)642d3cc4030SKristof Provost ATF_TC_CLEANUP(igetifaces, tc)
643d3cc4030SKristof Provost {
6448e748b94SKristof Provost 	COMMON_CLEANUP();
6458e748b94SKristof Provost }
6468e748b94SKristof Provost 
647d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(cxbegin);
ATF_TC_HEAD(cxbegin,tc)64887c7063cSKristof Provost ATF_TC_HEAD(cxbegin, tc)
64987c7063cSKristof Provost {
65087c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
65187c7063cSKristof Provost }
65287c7063cSKristof Provost 
ATF_TC_BODY(cxbegin,tc)65362d28676SKristof Provost ATF_TC_BODY(cxbegin, tc)
65462d28676SKristof Provost {
65562d28676SKristof Provost 	struct pfioc_trans io;
65662d28676SKristof Provost 	struct pfioc_trans_e ioe;
65762d28676SKristof Provost 
65862d28676SKristof Provost 	COMMON_HEAD();
65962d28676SKristof Provost 
66062d28676SKristof Provost 	bzero(&io, sizeof(io));
66162d28676SKristof Provost 	io.esize = sizeof(ioe);
66262d28676SKristof Provost 	io.array = &ioe;
66362d28676SKristof Provost 
66462d28676SKristof Provost 	/* Negative size */
66562d28676SKristof Provost 	io.size = -1;
66662d28676SKristof Provost 	if (ioctl(dev, DIOCXBEGIN, &io) == 0)
66762d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
66862d28676SKristof Provost 
66962d28676SKristof Provost 	/* Overflow size */
67062d28676SKristof Provost 	io.size = 1 << 30;
67162d28676SKristof Provost 	if (ioctl(dev, DIOCXBEGIN, &io) == 0)
67262d28676SKristof Provost 		atf_tc_fail("request with size 1 << 30 succeeded");
67362d28676SKristof Provost 
67462d28676SKristof Provost 	/* NULL buffer */
67562d28676SKristof Provost 	io.size = 1;
67662d28676SKristof Provost 	io.array = NULL;
67762d28676SKristof Provost 	if (ioctl(dev, DIOCXBEGIN, &io) == 0)
67862d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
679d3cc4030SKristof Provost }
68062d28676SKristof Provost 
ATF_TC_CLEANUP(cxbegin,tc)681d3cc4030SKristof Provost ATF_TC_CLEANUP(cxbegin, tc)
682d3cc4030SKristof Provost {
68362d28676SKristof Provost 	COMMON_CLEANUP();
68462d28676SKristof Provost }
68562d28676SKristof Provost 
686d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(cxrollback);
ATF_TC_HEAD(cxrollback,tc)68787c7063cSKristof Provost ATF_TC_HEAD(cxrollback, tc)
68887c7063cSKristof Provost {
68987c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
69087c7063cSKristof Provost }
69187c7063cSKristof Provost 
ATF_TC_BODY(cxrollback,tc)69262d28676SKristof Provost ATF_TC_BODY(cxrollback, tc)
69362d28676SKristof Provost {
69462d28676SKristof Provost 	struct pfioc_trans io;
69562d28676SKristof Provost 	struct pfioc_trans_e ioe;
69662d28676SKristof Provost 
69762d28676SKristof Provost 	COMMON_HEAD();
69862d28676SKristof Provost 
69962d28676SKristof Provost 	bzero(&io, sizeof(io));
70062d28676SKristof Provost 	io.esize = sizeof(ioe);
70162d28676SKristof Provost 	io.array = &ioe;
70262d28676SKristof Provost 
70362d28676SKristof Provost 	/* Negative size */
70462d28676SKristof Provost 	io.size = -1;
70562d28676SKristof Provost 	if (ioctl(dev, DIOCXROLLBACK, &io) == 0)
70662d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
70762d28676SKristof Provost 
70862d28676SKristof Provost 	/* Overflow size */
70962d28676SKristof Provost 	io.size = 1 << 30;
71062d28676SKristof Provost 	if (ioctl(dev, DIOCXROLLBACK, &io) == 0)
71162d28676SKristof Provost 		atf_tc_fail("request with size 1 << 30 succeeded");
71262d28676SKristof Provost 
71362d28676SKristof Provost 	/* NULL buffer */
71462d28676SKristof Provost 	io.size = 1;
71562d28676SKristof Provost 	io.array = NULL;
71662d28676SKristof Provost 	if (ioctl(dev, DIOCXROLLBACK, &io) == 0)
71762d28676SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
718d3cc4030SKristof Provost }
71962d28676SKristof Provost 
ATF_TC_CLEANUP(cxrollback,tc)720d3cc4030SKristof Provost ATF_TC_CLEANUP(cxrollback, tc)
721d3cc4030SKristof Provost {
72262d28676SKristof Provost 	COMMON_CLEANUP();
72362d28676SKristof Provost }
72462d28676SKristof Provost 
725d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(commit);
ATF_TC_HEAD(commit,tc)72687c7063cSKristof Provost ATF_TC_HEAD(commit, tc)
72787c7063cSKristof Provost {
72887c7063cSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
72987c7063cSKristof Provost }
73087c7063cSKristof Provost 
ATF_TC_BODY(commit,tc)7318e748b94SKristof Provost ATF_TC_BODY(commit, tc)
7328e748b94SKristof Provost {
7338e748b94SKristof Provost 	struct pfioc_trans io;
7348e748b94SKristof Provost 	struct pfioc_trans_e ioe;
7358e748b94SKristof Provost 
7368e748b94SKristof Provost 	COMMON_HEAD();
7378e748b94SKristof Provost 
7388e748b94SKristof Provost 	bzero(&io, sizeof(io));
7398e748b94SKristof Provost 	io.esize = sizeof(ioe);
7408e748b94SKristof Provost 	io.array = &ioe;
7418e748b94SKristof Provost 
7428e748b94SKristof Provost 	/* Negative size */
7438e748b94SKristof Provost 	io.size = -1;
7448e748b94SKristof Provost 	if (ioctl(dev, DIOCXCOMMIT, &io) == 0)
7458e748b94SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
7468e748b94SKristof Provost 
7478e748b94SKristof Provost 	/* Overflow size */
7488e748b94SKristof Provost 	io.size = 1 << 30;
7498e748b94SKristof Provost 	if (ioctl(dev, DIOCXCOMMIT, &io) == 0)
7508e748b94SKristof Provost 		atf_tc_fail("request with size 1 << 30 succeeded");
7518e748b94SKristof Provost 
7528e748b94SKristof Provost 	/* NULL buffer */
7538e748b94SKristof Provost 	io.size = 1;
7548e748b94SKristof Provost 	io.array = NULL;
7558e748b94SKristof Provost 	if (ioctl(dev, DIOCXCOMMIT, &io) == 0)
7568e748b94SKristof Provost 		atf_tc_fail("request with size -1 succeeded");
757d3cc4030SKristof Provost }
7588e748b94SKristof Provost 
ATF_TC_CLEANUP(commit,tc)759d3cc4030SKristof Provost ATF_TC_CLEANUP(commit, tc)
760d3cc4030SKristof Provost {
7618e748b94SKristof Provost 	COMMON_CLEANUP();
7628e748b94SKristof Provost }
7638e748b94SKristof Provost 
764fe5a065dSKristof Provost ATF_TC_WITH_CLEANUP(getsrcnodes);
ATF_TC_HEAD(getsrcnodes,tc)765fe5a065dSKristof Provost ATF_TC_HEAD(getsrcnodes, tc)
766fe5a065dSKristof Provost {
767fe5a065dSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
768fe5a065dSKristof Provost }
769fe5a065dSKristof Provost 
ATF_TC_BODY(getsrcnodes,tc)770fe5a065dSKristof Provost ATF_TC_BODY(getsrcnodes, tc)
771fe5a065dSKristof Provost {
772fe5a065dSKristof Provost 	struct pfioc_src_nodes psn;
773fe5a065dSKristof Provost 
774fe5a065dSKristof Provost 	COMMON_HEAD();
775fe5a065dSKristof Provost 
776fe5a065dSKristof Provost 	bzero(&psn, sizeof(psn));
777fe5a065dSKristof Provost 
778fe5a065dSKristof Provost 	psn.psn_len = -1;
779fe5a065dSKristof Provost 	if (ioctl(dev, DIOCGETSRCNODES, &psn) != 0)
780fe5a065dSKristof Provost 		atf_tc_fail("request with size -1 failed");
781fe5a065dSKristof Provost 
782fe5a065dSKristof Provost 	psn.psn_len = 1 << 30;
783fe5a065dSKristof Provost 	if (ioctl(dev, DIOCGETSRCNODES, &psn) != 0)
784fe5a065dSKristof Provost 		atf_tc_fail("request with size << 30 failed");
785fe5a065dSKristof Provost 
786fe5a065dSKristof Provost 	psn.psn_len = 1 << 31;
787fe5a065dSKristof Provost 	if (ioctl(dev, DIOCGETSRCNODES, &psn) != 0)
788fe5a065dSKristof Provost 		atf_tc_fail("request with size << 30 failed");
789fe5a065dSKristof Provost }
790fe5a065dSKristof Provost 
ATF_TC_CLEANUP(getsrcnodes,tc)791fe5a065dSKristof Provost ATF_TC_CLEANUP(getsrcnodes, tc)
792fe5a065dSKristof Provost {
793fe5a065dSKristof Provost 	COMMON_CLEANUP();
794fe5a065dSKristof Provost }
795fe5a065dSKristof Provost 
796d5325f2fSKristof Provost ATF_TC_WITH_CLEANUP(tag);
ATF_TC_HEAD(tag,tc)797d5325f2fSKristof Provost ATF_TC_HEAD(tag, tc)
798d5325f2fSKristof Provost {
799d5325f2fSKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
800d5325f2fSKristof Provost }
801d5325f2fSKristof Provost 
ATF_TC_BODY(tag,tc)802d5325f2fSKristof Provost ATF_TC_BODY(tag, tc)
803d5325f2fSKristof Provost {
804d5325f2fSKristof Provost 	struct pfioc_rule rule;
805d5325f2fSKristof Provost 
806d5325f2fSKristof Provost 	COMMON_HEAD();
807d5325f2fSKristof Provost 
808d5325f2fSKristof Provost 	memset(&rule, 0x42, sizeof(rule));
809d5325f2fSKristof Provost 
810d5325f2fSKristof Provost 	rule.ticket = 0;
811d5325f2fSKristof Provost 	rule.pool_ticket = 0;
812d5325f2fSKristof Provost 	rule.anchor[0] = 0;
813d5325f2fSKristof Provost 
814d5325f2fSKristof Provost 	rule.rule.return_icmp = 0;
815d5325f2fSKristof Provost 	bzero(&rule.rule.src, sizeof(rule.rule.src));
816d5325f2fSKristof Provost 	bzero(&rule.rule.dst, sizeof(rule.rule.dst));
817d5325f2fSKristof Provost 
818d5325f2fSKristof Provost 	rule.rule.ifname[0] = 0;
819d5325f2fSKristof Provost 	rule.rule.action = 0;
820d5325f2fSKristof Provost 	rule.rule.rtableid = 0;
821d5325f2fSKristof Provost 
822d5325f2fSKristof Provost 	rule.rule.tagname[0] = 0;
823d5325f2fSKristof Provost 
824d5325f2fSKristof Provost 	for (int i = 0; i < 10; i++)
825d5325f2fSKristof Provost 		ioctl(dev, DIOCADDRULE, &rule);
826d5325f2fSKristof Provost }
827d5325f2fSKristof Provost 
ATF_TC_CLEANUP(tag,tc)828d5325f2fSKristof Provost ATF_TC_CLEANUP(tag, tc)
829d5325f2fSKristof Provost {
830d5325f2fSKristof Provost 	COMMON_CLEANUP();
831d5325f2fSKristof Provost }
832d5325f2fSKristof Provost 
8334ca41937SKristof Provost ATF_TC_WITH_CLEANUP(rpool_mtx);
ATF_TC_HEAD(rpool_mtx,tc)8344ca41937SKristof Provost ATF_TC_HEAD(rpool_mtx, tc)
8354ca41937SKristof Provost {
8364ca41937SKristof Provost 	atf_tc_set_md_var(tc, "require.user", "root");
8374ca41937SKristof Provost }
8384ca41937SKristof Provost 
ATF_TC_BODY(rpool_mtx,tc)8394ca41937SKristof Provost ATF_TC_BODY(rpool_mtx, tc)
8404ca41937SKristof Provost {
8414ca41937SKristof Provost 	struct pfioc_rule rule;
8424ca41937SKristof Provost 
8434ca41937SKristof Provost 	COMMON_HEAD();
8444ca41937SKristof Provost 
8454ca41937SKristof Provost 	memset(&rule, 0, sizeof(rule));
8464ca41937SKristof Provost 
8474ca41937SKristof Provost 	rule.ticket = 0;
8484ca41937SKristof Provost 	rule.pool_ticket = 0;
8494ca41937SKristof Provost 	rule.anchor[0] = 0;
8504ca41937SKristof Provost 
8514ca41937SKristof Provost 	rule.rule.return_icmp = 0;
8524ca41937SKristof Provost 	bzero(&rule.rule.src, sizeof(rule.rule.src));
8534ca41937SKristof Provost 	bzero(&rule.rule.dst, sizeof(rule.rule.dst));
8544ca41937SKristof Provost 
8554ca41937SKristof Provost 	rule.rule.ifname[0] = 0;
8564ca41937SKristof Provost 	rule.rule.action = 0;
8574ca41937SKristof Provost 	rule.rule.rtableid = 0;
8584ca41937SKristof Provost 
8594ca41937SKristof Provost 	rule.rule.tagname[0] = 0;
8604ca41937SKristof Provost 	rule.rule.action = 42;
8614ca41937SKristof Provost 
8624ca41937SKristof Provost 	ioctl(dev, DIOCADDRULE, &rule);
8634ca41937SKristof Provost }
8644ca41937SKristof Provost 
ATF_TC_CLEANUP(rpool_mtx,tc)8654ca41937SKristof Provost ATF_TC_CLEANUP(rpool_mtx, tc)
8664ca41937SKristof Provost {
8674ca41937SKristof Provost 	COMMON_CLEANUP();
8684ca41937SKristof Provost }
8694ca41937SKristof Provost 
870*773e3a71SMark Johnston ATF_TC_WITH_CLEANUP(rpool_mtx2);
ATF_TC_HEAD(rpool_mtx2,tc)871*773e3a71SMark Johnston ATF_TC_HEAD(rpool_mtx2, tc)
872*773e3a71SMark Johnston {
873*773e3a71SMark Johnston 	atf_tc_set_md_var(tc, "require.user", "root");
874*773e3a71SMark Johnston }
875*773e3a71SMark Johnston 
ATF_TC_BODY(rpool_mtx2,tc)876*773e3a71SMark Johnston ATF_TC_BODY(rpool_mtx2, tc)
877*773e3a71SMark Johnston {
878*773e3a71SMark Johnston 	struct pfioc_rule rule;
879*773e3a71SMark Johnston 
880*773e3a71SMark Johnston 	COMMON_HEAD();
881*773e3a71SMark Johnston 
882*773e3a71SMark Johnston 	memset(&rule, 0, sizeof(rule));
883*773e3a71SMark Johnston 
884*773e3a71SMark Johnston 	rule.pool_ticket = 1000000;
885*773e3a71SMark Johnston 	rule.action = PF_CHANGE_ADD_HEAD;
886*773e3a71SMark Johnston 	rule.rule.af = AF_INET;
887*773e3a71SMark Johnston 
888*773e3a71SMark Johnston 	ioctl(dev, DIOCCHANGERULE, &rule);
889*773e3a71SMark Johnston }
890*773e3a71SMark Johnston 
ATF_TC_CLEANUP(rpool_mtx2,tc)891*773e3a71SMark Johnston ATF_TC_CLEANUP(rpool_mtx2, tc)
892*773e3a71SMark Johnston {
893*773e3a71SMark Johnston 	COMMON_CLEANUP();
894*773e3a71SMark Johnston }
895*773e3a71SMark Johnston 
8964ca41937SKristof Provost 
ATF_TP_ADD_TCS(tp)89798c5f988SKristof Provost ATF_TP_ADD_TCS(tp)
89898c5f988SKristof Provost {
89998c5f988SKristof Provost 	ATF_TP_ADD_TC(tp, addtables);
90098c5f988SKristof Provost 	ATF_TP_ADD_TC(tp, deltables);
9011ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, gettables);
9021d2e31afSKyle Evans 	ATF_TP_ADD_TC(tp, getastats);
9031ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, gettstats);
9041ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, clrtstats);
9051ff545d6SKristof Provost 	ATF_TP_ADD_TC(tp, settflags);
90662d28676SKristof Provost 	ATF_TP_ADD_TC(tp, addaddrs);
90762d28676SKristof Provost 	ATF_TP_ADD_TC(tp, deladdrs);
90862d28676SKristof Provost 	ATF_TP_ADD_TC(tp, setaddrs);
90962d28676SKristof Provost 	ATF_TP_ADD_TC(tp, getaddrs);
91062d28676SKristof Provost 	ATF_TP_ADD_TC(tp, clrastats);
91162d28676SKristof Provost 	ATF_TP_ADD_TC(tp, tstaddrs);
91262d28676SKristof Provost 	ATF_TP_ADD_TC(tp, inadefine);
9138e748b94SKristof Provost 	ATF_TP_ADD_TC(tp, igetifaces);
91462d28676SKristof Provost 	ATF_TP_ADD_TC(tp, cxbegin);
91562d28676SKristof Provost 	ATF_TP_ADD_TC(tp, cxrollback);
9168e748b94SKristof Provost 	ATF_TP_ADD_TC(tp, commit);
917fe5a065dSKristof Provost 	ATF_TP_ADD_TC(tp, getsrcnodes);
918d5325f2fSKristof Provost 	ATF_TP_ADD_TC(tp, tag);
9194ca41937SKristof Provost 	ATF_TP_ADD_TC(tp, rpool_mtx);
920*773e3a71SMark Johnston 	ATF_TP_ADD_TC(tp, rpool_mtx2);
92198c5f988SKristof Provost 
92298c5f988SKristof Provost 	return (atf_no_error());
92398c5f988SKristof Provost }
924