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 541ff545d6SKristof Provost 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 64*87c7063cSKristof Provost ATF_TC(addtables); 65*87c7063cSKristof Provost ATF_TC_HEAD(addtables, tc) 66*87c7063cSKristof Provost { 67*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 68*87c7063cSKristof Provost } 69*87c7063cSKristof 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); 1091bb72c29SKristof Provost 11098c5f988SKristof Provost COMMON_CLEANUP(); 11198c5f988SKristof Provost } 11298c5f988SKristof Provost 113*87c7063cSKristof Provost ATF_TC(deltables); 114*87c7063cSKristof Provost ATF_TC_HEAD(deltables, tc) 115*87c7063cSKristof Provost { 116*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 117*87c7063cSKristof Provost } 118*87c7063cSKristof Provost 11998c5f988SKristof Provost ATF_TC_BODY(deltables, tc) 12098c5f988SKristof Provost { 12198c5f988SKristof Provost struct pfioc_table io; 12298c5f988SKristof Provost struct pfr_table tbl; 12398c5f988SKristof Provost int flags; 12498c5f988SKristof Provost 12598c5f988SKristof Provost COMMON_HEAD(); 12698c5f988SKristof Provost 12798c5f988SKristof Provost flags = 0; 12898c5f988SKristof Provost 12998c5f988SKristof Provost bzero(&io, sizeof(io)); 13098c5f988SKristof Provost io.pfrio_flags = flags; 13198c5f988SKristof Provost io.pfrio_buffer = &tbl; 13298c5f988SKristof Provost io.pfrio_esize = sizeof(tbl); 13398c5f988SKristof Provost 13498c5f988SKristof Provost /* Negative size */ 13598c5f988SKristof Provost io.pfrio_size = -1; 13698c5f988SKristof Provost if (ioctl(dev, DIOCRDELTABLES, &io) == 0) 13798c5f988SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 13898c5f988SKristof Provost 13998c5f988SKristof Provost /* Overly large size */ 14098c5f988SKristof Provost io.pfrio_size = 1 << 24; 14198c5f988SKristof Provost if (ioctl(dev, DIOCRDELTABLES, &io) == 0) 14298c5f988SKristof Provost atf_tc_fail("Request with size 1 << 24 succeeded"); 14398c5f988SKristof Provost 14498c5f988SKristof Provost /* NULL buffer */ 14598c5f988SKristof Provost io.pfrio_size = 1; 14698c5f988SKristof Provost io.pfrio_buffer = NULL; 14798c5f988SKristof Provost if (ioctl(dev, DIOCRDELTABLES, &io) == 0) 14898c5f988SKristof Provost atf_tc_fail("Request with NULL buffer succeeded"); 14998c5f988SKristof Provost 15098c5f988SKristof Provost COMMON_CLEANUP(); 15198c5f988SKristof Provost } 15298c5f988SKristof Provost 153*87c7063cSKristof Provost ATF_TC(gettables); 154*87c7063cSKristof Provost ATF_TC_HEAD(gettables, tc) 155*87c7063cSKristof Provost { 156*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 157*87c7063cSKristof Provost } 158*87c7063cSKristof Provost 1591ff545d6SKristof Provost ATF_TC_BODY(gettables, tc) 1601ff545d6SKristof Provost { 1611ff545d6SKristof Provost struct pfioc_table io; 1621ff545d6SKristof Provost struct pfr_table tbl; 1631ff545d6SKristof Provost int flags; 1641ff545d6SKristof Provost 1651ff545d6SKristof Provost COMMON_HEAD(); 1661ff545d6SKristof Provost 1671ff545d6SKristof Provost flags = 0; 1681ff545d6SKristof Provost 1691ff545d6SKristof Provost bzero(&io, sizeof(io)); 1701ff545d6SKristof Provost io.pfrio_flags = flags; 1711ff545d6SKristof Provost io.pfrio_buffer = &tbl; 1721ff545d6SKristof Provost io.pfrio_esize = sizeof(tbl); 1731ff545d6SKristof Provost 1741ff545d6SKristof Provost /* Negative size. This will succeed, because the kernel will not copy 1751ff545d6SKristof Provost * tables than it has. */ 1761ff545d6SKristof Provost io.pfrio_size = -1; 1771ff545d6SKristof Provost if (ioctl(dev, DIOCRGETTABLES, &io) != 0) 1781ff545d6SKristof Provost atf_tc_fail("Request with size -1 failed"); 1791ff545d6SKristof Provost 1801ff545d6SKristof Provost /* Overly large size. See above. */ 1811ff545d6SKristof Provost io.pfrio_size = 1 << 24; 1821ff545d6SKristof Provost if (ioctl(dev, DIOCRGETTABLES, &io) != 0) 1831ff545d6SKristof Provost atf_tc_fail("Request with size 1 << 24 failed"); 1841ff545d6SKristof Provost 1851ff545d6SKristof Provost COMMON_CLEANUP(); 1861ff545d6SKristof Provost } 1871ff545d6SKristof Provost 188*87c7063cSKristof Provost ATF_TC(gettstats); 189*87c7063cSKristof Provost ATF_TC_HEAD(gettstats, tc) 190*87c7063cSKristof Provost { 191*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 192*87c7063cSKristof Provost } 193*87c7063cSKristof Provost 1941ff545d6SKristof Provost ATF_TC_BODY(gettstats, tc) 1951ff545d6SKristof Provost { 1961ff545d6SKristof Provost struct pfioc_table io; 1971ff545d6SKristof Provost struct pfr_tstats stats; 1981ff545d6SKristof Provost int flags; 1991ff545d6SKristof Provost 2001ff545d6SKristof Provost COMMON_HEAD(); 2011ff545d6SKristof Provost 2021ff545d6SKristof Provost flags = 0; 2031ff545d6SKristof Provost 2041ff545d6SKristof Provost bzero(&io, sizeof(io)); 2051ff545d6SKristof Provost io.pfrio_flags = flags; 2061ff545d6SKristof Provost io.pfrio_buffer = &stats; 2071ff545d6SKristof Provost io.pfrio_esize = sizeof(stats); 2081ff545d6SKristof Provost 2091ff545d6SKristof Provost /* Negative size. This will succeed, because the kernel will not copy 2101ff545d6SKristof Provost * tables than it has. */ 2111ff545d6SKristof Provost io.pfrio_size = -1; 2121ff545d6SKristof Provost if (ioctl(dev, DIOCRGETTSTATS, &io) != 0) 2131ff545d6SKristof Provost atf_tc_fail("Request with size -1 failed"); 2141ff545d6SKristof Provost 2151ff545d6SKristof Provost /* Overly large size. See above. */ 2161ff545d6SKristof Provost io.pfrio_size = 1 << 24; 2171ff545d6SKristof Provost if (ioctl(dev, DIOCRGETTSTATS, &io) != 0) 2181ff545d6SKristof Provost atf_tc_fail("Request with size 1 << 24 failed"); 2191ff545d6SKristof Provost 2201ff545d6SKristof Provost COMMON_CLEANUP(); 2211ff545d6SKristof Provost } 2221ff545d6SKristof Provost 223*87c7063cSKristof Provost ATF_TC(clrtstats); 224*87c7063cSKristof Provost ATF_TC_HEAD(clrtstats, tc) 225*87c7063cSKristof Provost { 226*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 227*87c7063cSKristof Provost } 228*87c7063cSKristof Provost 2291ff545d6SKristof Provost ATF_TC_BODY(clrtstats, tc) 2301ff545d6SKristof Provost { 2311ff545d6SKristof Provost struct pfioc_table io; 2321ff545d6SKristof Provost struct pfr_table tbl; 2331ff545d6SKristof Provost int flags; 2341ff545d6SKristof Provost 2351ff545d6SKristof Provost COMMON_HEAD(); 2361ff545d6SKristof Provost 2371ff545d6SKristof Provost flags = 0; 2381ff545d6SKristof Provost 2391ff545d6SKristof Provost common_init_tbl(&tbl); 2401ff545d6SKristof Provost 2411ff545d6SKristof Provost bzero(&io, sizeof(io)); 2421ff545d6SKristof Provost io.pfrio_flags = flags; 2431ff545d6SKristof Provost io.pfrio_buffer = &tbl; 2441ff545d6SKristof Provost io.pfrio_esize = sizeof(tbl); 2451ff545d6SKristof Provost 2461ff545d6SKristof Provost /* Negative size. This will succeed, because the kernel will not copy 2471ff545d6SKristof Provost * tables than it has. */ 2481ff545d6SKristof Provost io.pfrio_size = -1; 2491ff545d6SKristof Provost if (ioctl(dev, DIOCRCLRTSTATS, &io) != 0) 2501ff545d6SKristof Provost atf_tc_fail("Request with size -1 failed "); 2511ff545d6SKristof Provost 2521ff545d6SKristof Provost /* Overly large size. See above. */ 2531ff545d6SKristof Provost io.pfrio_size = 1 << 24; 2541ff545d6SKristof Provost if (ioctl(dev, DIOCRCLRTSTATS, &io) != 0) 2551ff545d6SKristof Provost atf_tc_fail("Request with size 1 << 24 failed"); 2561ff545d6SKristof Provost 2571ff545d6SKristof Provost COMMON_CLEANUP(); 2581ff545d6SKristof Provost } 2591ff545d6SKristof Provost 260*87c7063cSKristof Provost ATF_TC(settflags); 261*87c7063cSKristof Provost ATF_TC_HEAD(settflags, tc) 262*87c7063cSKristof Provost { 263*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 264*87c7063cSKristof Provost } 265*87c7063cSKristof Provost 2661ff545d6SKristof Provost ATF_TC_BODY(settflags, tc) 2671ff545d6SKristof Provost { 2681ff545d6SKristof Provost struct pfioc_table io; 2691ff545d6SKristof Provost struct pfr_table tbl; 2701ff545d6SKristof Provost int flags; 2711ff545d6SKristof Provost 2721ff545d6SKristof Provost COMMON_HEAD(); 2731ff545d6SKristof Provost 2741ff545d6SKristof Provost flags = 0; 2751ff545d6SKristof Provost 2761ff545d6SKristof Provost common_init_tbl(&tbl); 2771ff545d6SKristof Provost 2781ff545d6SKristof Provost bzero(&io, sizeof(io)); 2791ff545d6SKristof Provost io.pfrio_flags = flags; 2801ff545d6SKristof Provost io.pfrio_buffer = &tbl; 2811ff545d6SKristof Provost io.pfrio_esize = sizeof(tbl); 2821ff545d6SKristof Provost 2831ff545d6SKristof Provost /* Negative size. This will succeed, because the kernel will not copy 2841ff545d6SKristof Provost * tables than it has. */ 2851ff545d6SKristof Provost io.pfrio_size = -1; 2861ff545d6SKristof Provost if (ioctl(dev, DIOCRSETTFLAGS, &io) != 0) 2871ff545d6SKristof Provost atf_tc_fail("Request with size -1 failed"); 2881ff545d6SKristof Provost 2891ff545d6SKristof Provost /* Overly large size. See above. */ 2901ff545d6SKristof Provost io.pfrio_size = 1 << 28; 2911ff545d6SKristof Provost if (ioctl(dev, DIOCRSETTFLAGS, &io) != 0) 2921ff545d6SKristof Provost atf_tc_fail("Request with size 1 << 24 failed"); 2931ff545d6SKristof Provost 2941ff545d6SKristof Provost COMMON_CLEANUP(); 2951ff545d6SKristof Provost } 2961ff545d6SKristof Provost 297*87c7063cSKristof Provost ATF_TC(addaddrs); 298*87c7063cSKristof Provost ATF_TC_HEAD(addaddrs, tc) 299*87c7063cSKristof Provost { 300*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 301*87c7063cSKristof Provost } 302*87c7063cSKristof Provost 30362d28676SKristof Provost ATF_TC_BODY(addaddrs, tc) 30462d28676SKristof Provost { 30562d28676SKristof Provost struct pfioc_table io; 30662d28676SKristof Provost struct pfr_addr addr; 30762d28676SKristof Provost 30862d28676SKristof Provost COMMON_HEAD(); 30962d28676SKristof Provost 31062d28676SKristof Provost bzero(&addr, sizeof(addr)); 31162d28676SKristof Provost bzero(&io, sizeof(io)); 31262d28676SKristof Provost io.pfrio_flags = 0; 31362d28676SKristof Provost io.pfrio_buffer = &addr; 31462d28676SKristof Provost io.pfrio_esize = sizeof(addr); 31562d28676SKristof Provost 31662d28676SKristof Provost /* Negative size. */ 31762d28676SKristof Provost io.pfrio_size = -1; 31862d28676SKristof Provost if (ioctl(dev, DIOCRADDADDRS, &io) == 0) 31962d28676SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 32062d28676SKristof Provost 32162d28676SKristof Provost /* Overly large size. */ 32262d28676SKristof Provost io.pfrio_size = 1 << 28; 32362d28676SKristof Provost if (ioctl(dev, DIOCRADDADDRS, &io) == 0) 32462d28676SKristof Provost atf_tc_fail("Reuqest with size 1 << 28 failed"); 32562d28676SKristof Provost 32662d28676SKristof Provost COMMON_CLEANUP(); 32762d28676SKristof Provost } 32862d28676SKristof Provost 329*87c7063cSKristof Provost ATF_TC(deladdrs); 330*87c7063cSKristof Provost ATF_TC_HEAD(deladdrs, tc) 331*87c7063cSKristof Provost { 332*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 333*87c7063cSKristof Provost } 334*87c7063cSKristof Provost 33562d28676SKristof Provost ATF_TC_BODY(deladdrs, tc) 33662d28676SKristof Provost { 33762d28676SKristof Provost struct pfioc_table io; 33862d28676SKristof Provost struct pfr_addr addr; 33962d28676SKristof Provost 34062d28676SKristof Provost COMMON_HEAD(); 34162d28676SKristof Provost 34262d28676SKristof Provost bzero(&addr, sizeof(addr)); 34362d28676SKristof Provost bzero(&io, sizeof(io)); 34462d28676SKristof Provost io.pfrio_flags = 0; 34562d28676SKristof Provost io.pfrio_buffer = &addr; 34662d28676SKristof Provost io.pfrio_esize = sizeof(addr); 34762d28676SKristof Provost 34862d28676SKristof Provost /* Negative size. */ 34962d28676SKristof Provost io.pfrio_size = -1; 35062d28676SKristof Provost if (ioctl(dev, DIOCRDELADDRS, &io) == 0) 35162d28676SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 35262d28676SKristof Provost 35362d28676SKristof Provost /* Overly large size. */ 35462d28676SKristof Provost io.pfrio_size = 1 << 28; 35562d28676SKristof Provost if (ioctl(dev, DIOCRDELADDRS, &io) == 0) 35662d28676SKristof Provost atf_tc_fail("Reuqest with size 1 << 28 failed"); 35762d28676SKristof Provost 35862d28676SKristof Provost COMMON_CLEANUP(); 35962d28676SKristof Provost } 36062d28676SKristof Provost 361*87c7063cSKristof Provost ATF_TC(setaddrs); 362*87c7063cSKristof Provost ATF_TC_HEAD(setaddrs, tc) 363*87c7063cSKristof Provost { 364*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 365*87c7063cSKristof Provost } 366*87c7063cSKristof Provost 36762d28676SKristof Provost ATF_TC_BODY(setaddrs, tc) 36862d28676SKristof Provost { 36962d28676SKristof Provost struct pfioc_table io; 37062d28676SKristof Provost struct pfr_addr addr; 37162d28676SKristof Provost 37262d28676SKristof Provost COMMON_HEAD(); 37362d28676SKristof Provost 37462d28676SKristof Provost bzero(&addr, sizeof(addr)); 37562d28676SKristof Provost bzero(&io, sizeof(io)); 37662d28676SKristof Provost io.pfrio_flags = 0; 37762d28676SKristof Provost io.pfrio_buffer = &addr; 37862d28676SKristof Provost io.pfrio_esize = sizeof(addr); 37962d28676SKristof Provost 38062d28676SKristof Provost /* Negative size. */ 38162d28676SKristof Provost io.pfrio_size = -1; 38262d28676SKristof Provost if (ioctl(dev, DIOCRSETADDRS, &io) == 0) 38362d28676SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 38462d28676SKristof Provost 38562d28676SKristof Provost /* Overly large size. */ 38662d28676SKristof Provost io.pfrio_size = 1 << 28; 38762d28676SKristof Provost if (ioctl(dev, DIOCRSETADDRS, &io) == 0) 38862d28676SKristof Provost atf_tc_fail("Reuqest with size 1 << 28 failed"); 38962d28676SKristof Provost 39062d28676SKristof Provost COMMON_CLEANUP(); 39162d28676SKristof Provost } 39262d28676SKristof Provost 393*87c7063cSKristof Provost ATF_TC(getaddrs); 394*87c7063cSKristof Provost ATF_TC_HEAD(getaddrs, tc) 395*87c7063cSKristof Provost { 396*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 397*87c7063cSKristof Provost } 398*87c7063cSKristof Provost 39962d28676SKristof Provost ATF_TC_BODY(getaddrs, 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 common_init_tbl(&io.pfrio_table); 41362d28676SKristof Provost 41462d28676SKristof Provost /* Negative size. */ 41562d28676SKristof Provost io.pfrio_size = -1; 41662d28676SKristof Provost if (ioctl(dev, DIOCRGETADDRS, &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 << 24; 42162d28676SKristof Provost if (ioctl(dev, DIOCRGETADDRS, &io) == 0) 42262d28676SKristof Provost atf_tc_fail("Request with size 1 << 24 failed"); 42362d28676SKristof Provost 42462d28676SKristof Provost COMMON_CLEANUP(); 42562d28676SKristof Provost } 42662d28676SKristof Provost 427*87c7063cSKristof Provost ATF_TC(getastats); 428*87c7063cSKristof Provost ATF_TC_HEAD(getastats, tc) 429*87c7063cSKristof Provost { 430*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 431*87c7063cSKristof Provost } 432*87c7063cSKristof Provost 43362d28676SKristof Provost ATF_TC_BODY(getastats, tc) 43462d28676SKristof Provost { 43562d28676SKristof Provost struct pfioc_table io; 43662d28676SKristof Provost struct pfr_astats astats; 43762d28676SKristof Provost 43862d28676SKristof Provost COMMON_HEAD(); 43962d28676SKristof Provost 44062d28676SKristof Provost bzero(&astats, sizeof(astats)); 44162d28676SKristof Provost bzero(&io, sizeof(io)); 44262d28676SKristof Provost io.pfrio_flags = 0; 44362d28676SKristof Provost io.pfrio_buffer = &astats; 44462d28676SKristof Provost io.pfrio_esize = sizeof(astats); 44562d28676SKristof Provost 44662d28676SKristof Provost common_init_tbl(&io.pfrio_table); 44762d28676SKristof Provost 44862d28676SKristof Provost /* Negative size. */ 44962d28676SKristof Provost io.pfrio_size = -1; 45062d28676SKristof Provost if (ioctl(dev, DIOCRGETASTATS, &io) == 0) 45162d28676SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 45262d28676SKristof Provost 45362d28676SKristof Provost /* Overly large size. */ 45462d28676SKristof Provost io.pfrio_size = 1 << 24; 45562d28676SKristof Provost if (ioctl(dev, DIOCRGETASTATS, &io) == 0) 45662d28676SKristof Provost atf_tc_fail("Request with size 1 << 24 failed"); 45762d28676SKristof Provost 45862d28676SKristof Provost COMMON_CLEANUP(); 45962d28676SKristof Provost } 46062d28676SKristof Provost 461*87c7063cSKristof Provost ATF_TC(clrastats); 462*87c7063cSKristof Provost ATF_TC_HEAD(clrastats, tc) 463*87c7063cSKristof Provost { 464*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 465*87c7063cSKristof Provost } 466*87c7063cSKristof Provost 46762d28676SKristof Provost ATF_TC_BODY(clrastats, tc) 46862d28676SKristof Provost { 46962d28676SKristof Provost struct pfioc_table io; 47062d28676SKristof Provost struct pfr_addr addr; 47162d28676SKristof Provost 47262d28676SKristof Provost COMMON_HEAD(); 47362d28676SKristof Provost 47462d28676SKristof Provost bzero(&addr, sizeof(addr)); 47562d28676SKristof Provost bzero(&io, sizeof(io)); 47662d28676SKristof Provost io.pfrio_flags = 0; 47762d28676SKristof Provost io.pfrio_buffer = &addr; 47862d28676SKristof Provost io.pfrio_esize = sizeof(addr); 47962d28676SKristof Provost 48062d28676SKristof Provost common_init_tbl(&io.pfrio_table); 48162d28676SKristof Provost 48262d28676SKristof Provost /* Negative size. */ 48362d28676SKristof Provost io.pfrio_size = -1; 48462d28676SKristof Provost if (ioctl(dev, DIOCRCLRASTATS, &io) == 0) 48562d28676SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 48662d28676SKristof Provost 48762d28676SKristof Provost /* Overly large size. */ 48862d28676SKristof Provost io.pfrio_size = 1 << 24; 48962d28676SKristof Provost if (ioctl(dev, DIOCRCLRASTATS, &io) == 0) 49062d28676SKristof Provost atf_tc_fail("Request with size 1 << 24 failed"); 49162d28676SKristof Provost 49262d28676SKristof Provost COMMON_CLEANUP(); 49362d28676SKristof Provost } 49462d28676SKristof Provost 495*87c7063cSKristof Provost ATF_TC(tstaddrs); 496*87c7063cSKristof Provost ATF_TC_HEAD(tstaddrs, tc) 497*87c7063cSKristof Provost { 498*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 499*87c7063cSKristof Provost } 500*87c7063cSKristof Provost 50162d28676SKristof Provost ATF_TC_BODY(tstaddrs, tc) 50262d28676SKristof Provost { 50362d28676SKristof Provost struct pfioc_table io; 50462d28676SKristof Provost struct pfr_addr addr; 50562d28676SKristof Provost 50662d28676SKristof Provost COMMON_HEAD(); 50762d28676SKristof Provost 50862d28676SKristof Provost bzero(&addr, sizeof(addr)); 50962d28676SKristof Provost bzero(&io, sizeof(io)); 51062d28676SKristof Provost io.pfrio_flags = 0; 51162d28676SKristof Provost io.pfrio_buffer = &addr; 51262d28676SKristof Provost io.pfrio_esize = sizeof(addr); 51362d28676SKristof Provost 51462d28676SKristof Provost common_init_tbl(&io.pfrio_table); 51562d28676SKristof Provost 51662d28676SKristof Provost /* Negative size. */ 51762d28676SKristof Provost io.pfrio_size = -1; 51862d28676SKristof Provost if (ioctl(dev, DIOCRTSTADDRS, &io) == 0) 51962d28676SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 52062d28676SKristof Provost 52162d28676SKristof Provost /* Overly large size. */ 52262d28676SKristof Provost io.pfrio_size = 1 << 24; 52362d28676SKristof Provost if (ioctl(dev, DIOCRTSTADDRS, &io) == 0) 52462d28676SKristof Provost atf_tc_fail("Request with size 1 << 24 failed"); 52562d28676SKristof Provost 52662d28676SKristof Provost COMMON_CLEANUP(); 52762d28676SKristof Provost } 52862d28676SKristof Provost 529*87c7063cSKristof Provost ATF_TC(inadefine); 530*87c7063cSKristof Provost ATF_TC_HEAD(inadefine, tc) 531*87c7063cSKristof Provost { 532*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 533*87c7063cSKristof Provost } 534*87c7063cSKristof Provost 53562d28676SKristof Provost ATF_TC_BODY(inadefine, tc) 53662d28676SKristof Provost { 53762d28676SKristof Provost struct pfioc_table io; 53862d28676SKristof Provost struct pfr_addr addr; 53962d28676SKristof Provost 54062d28676SKristof Provost COMMON_HEAD(); 54162d28676SKristof Provost 54262d28676SKristof Provost bzero(&addr, sizeof(addr)); 54362d28676SKristof Provost bzero(&io, sizeof(io)); 54462d28676SKristof Provost io.pfrio_flags = 0; 54562d28676SKristof Provost io.pfrio_buffer = &addr; 54662d28676SKristof Provost io.pfrio_esize = sizeof(addr); 54762d28676SKristof Provost 54862d28676SKristof Provost common_init_tbl(&io.pfrio_table); 54962d28676SKristof Provost 55062d28676SKristof Provost /* Negative size. */ 55162d28676SKristof Provost io.pfrio_size = -1; 55262d28676SKristof Provost if (ioctl(dev, DIOCRINADEFINE, &io) == 0) 55362d28676SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 55462d28676SKristof Provost 55562d28676SKristof Provost /* Overly large size. */ 55662d28676SKristof Provost io.pfrio_size = 1 << 24; 55762d28676SKristof Provost if (ioctl(dev, DIOCRINADEFINE, &io) == 0) 55862d28676SKristof Provost atf_tc_fail("Request with size 1 << 24 failed"); 55962d28676SKristof Provost 56062d28676SKristof Provost COMMON_CLEANUP(); 56162d28676SKristof Provost } 56262d28676SKristof Provost 563*87c7063cSKristof Provost ATF_TC(igetifaces); 564*87c7063cSKristof Provost ATF_TC_HEAD(igetifaces, tc) 565*87c7063cSKristof Provost { 566*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 567*87c7063cSKristof Provost } 568*87c7063cSKristof Provost 5698e748b94SKristof Provost ATF_TC_BODY(igetifaces, tc) 5708e748b94SKristof Provost { 5718e748b94SKristof Provost struct pfioc_iface io; 5728e748b94SKristof Provost struct pfi_kif kif; 5738e748b94SKristof Provost 5748e748b94SKristof Provost COMMON_HEAD(); 5758e748b94SKristof Provost 5768e748b94SKristof Provost bzero(&io, sizeof(io)); 5778e748b94SKristof Provost io.pfiio_flags = 0; 5788e748b94SKristof Provost io.pfiio_buffer = &kif; 5798e748b94SKristof Provost io.pfiio_esize = sizeof(kif); 5808e748b94SKristof Provost 5818e748b94SKristof Provost /* Negative size */ 5828e748b94SKristof Provost io.pfiio_size = -1; 5838e748b94SKristof Provost if (ioctl(dev, DIOCIGETIFACES, &io) == 0) 5848e748b94SKristof Provost atf_tc_fail("request with size -1 succeeded"); 5858e748b94SKristof Provost 5868e748b94SKristof Provost /* Overflow size */ 5878e748b94SKristof Provost io.pfiio_size = 1 << 31; 5888e748b94SKristof Provost if (ioctl(dev, DIOCIGETIFACES, &io) == 0) 5898e748b94SKristof Provost atf_tc_fail("request with size 1 << 31 succeeded"); 5908e748b94SKristof Provost 5918e748b94SKristof Provost COMMON_CLEANUP(); 5928e748b94SKristof Provost } 5938e748b94SKristof Provost 594*87c7063cSKristof Provost ATF_TC(cxbegin); 595*87c7063cSKristof Provost ATF_TC_HEAD(cxbegin, tc) 596*87c7063cSKristof Provost { 597*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 598*87c7063cSKristof Provost } 599*87c7063cSKristof Provost 60062d28676SKristof Provost ATF_TC_BODY(cxbegin, tc) 60162d28676SKristof Provost { 60262d28676SKristof Provost struct pfioc_trans io; 60362d28676SKristof Provost struct pfioc_trans_e ioe; 60462d28676SKristof Provost 60562d28676SKristof Provost COMMON_HEAD(); 60662d28676SKristof Provost 60762d28676SKristof Provost bzero(&io, sizeof(io)); 60862d28676SKristof Provost io.esize = sizeof(ioe); 60962d28676SKristof Provost io.array = &ioe; 61062d28676SKristof Provost 61162d28676SKristof Provost /* Negative size */ 61262d28676SKristof Provost io.size = -1; 61362d28676SKristof Provost if (ioctl(dev, DIOCXBEGIN, &io) == 0) 61462d28676SKristof Provost atf_tc_fail("request with size -1 succeeded"); 61562d28676SKristof Provost 61662d28676SKristof Provost /* Overflow size */ 61762d28676SKristof Provost io.size = 1 << 30; 61862d28676SKristof Provost if (ioctl(dev, DIOCXBEGIN, &io) == 0) 61962d28676SKristof Provost atf_tc_fail("request with size 1 << 30 succeeded"); 62062d28676SKristof Provost 62162d28676SKristof Provost /* NULL buffer */ 62262d28676SKristof Provost io.size = 1; 62362d28676SKristof Provost io.array = NULL; 62462d28676SKristof Provost if (ioctl(dev, DIOCXBEGIN, &io) == 0) 62562d28676SKristof Provost atf_tc_fail("request with size -1 succeeded"); 62662d28676SKristof Provost 62762d28676SKristof Provost COMMON_CLEANUP(); 62862d28676SKristof Provost } 62962d28676SKristof Provost 630*87c7063cSKristof Provost ATF_TC(cxrollback); 631*87c7063cSKristof Provost ATF_TC_HEAD(cxrollback, tc) 632*87c7063cSKristof Provost { 633*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 634*87c7063cSKristof Provost } 635*87c7063cSKristof Provost 63662d28676SKristof Provost ATF_TC_BODY(cxrollback, tc) 63762d28676SKristof Provost { 63862d28676SKristof Provost struct pfioc_trans io; 63962d28676SKristof Provost struct pfioc_trans_e ioe; 64062d28676SKristof Provost 64162d28676SKristof Provost COMMON_HEAD(); 64262d28676SKristof Provost 64362d28676SKristof Provost bzero(&io, sizeof(io)); 64462d28676SKristof Provost io.esize = sizeof(ioe); 64562d28676SKristof Provost io.array = &ioe; 64662d28676SKristof Provost 64762d28676SKristof Provost /* Negative size */ 64862d28676SKristof Provost io.size = -1; 64962d28676SKristof Provost if (ioctl(dev, DIOCXROLLBACK, &io) == 0) 65062d28676SKristof Provost atf_tc_fail("request with size -1 succeeded"); 65162d28676SKristof Provost 65262d28676SKristof Provost /* Overflow size */ 65362d28676SKristof Provost io.size = 1 << 30; 65462d28676SKristof Provost if (ioctl(dev, DIOCXROLLBACK, &io) == 0) 65562d28676SKristof Provost atf_tc_fail("request with size 1 << 30 succeeded"); 65662d28676SKristof Provost 65762d28676SKristof Provost /* NULL buffer */ 65862d28676SKristof Provost io.size = 1; 65962d28676SKristof Provost io.array = NULL; 66062d28676SKristof Provost if (ioctl(dev, DIOCXROLLBACK, &io) == 0) 66162d28676SKristof Provost atf_tc_fail("request with size -1 succeeded"); 66262d28676SKristof Provost 66362d28676SKristof Provost COMMON_CLEANUP(); 66462d28676SKristof Provost } 66562d28676SKristof Provost 666*87c7063cSKristof Provost ATF_TC(commit); 667*87c7063cSKristof Provost ATF_TC_HEAD(commit, tc) 668*87c7063cSKristof Provost { 669*87c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 670*87c7063cSKristof Provost } 671*87c7063cSKristof Provost 6728e748b94SKristof Provost ATF_TC_BODY(commit, tc) 6738e748b94SKristof Provost { 6748e748b94SKristof Provost struct pfioc_trans io; 6758e748b94SKristof Provost struct pfioc_trans_e ioe; 6768e748b94SKristof Provost 6778e748b94SKristof Provost COMMON_HEAD(); 6788e748b94SKristof Provost 6798e748b94SKristof Provost bzero(&io, sizeof(io)); 6808e748b94SKristof Provost io.esize = sizeof(ioe); 6818e748b94SKristof Provost io.array = &ioe; 6828e748b94SKristof Provost 6838e748b94SKristof Provost /* Negative size */ 6848e748b94SKristof Provost io.size = -1; 6858e748b94SKristof Provost if (ioctl(dev, DIOCXCOMMIT, &io) == 0) 6868e748b94SKristof Provost atf_tc_fail("request with size -1 succeeded"); 6878e748b94SKristof Provost 6888e748b94SKristof Provost /* Overflow size */ 6898e748b94SKristof Provost io.size = 1 << 30; 6908e748b94SKristof Provost if (ioctl(dev, DIOCXCOMMIT, &io) == 0) 6918e748b94SKristof Provost atf_tc_fail("request with size 1 << 30 succeeded"); 6928e748b94SKristof Provost 6938e748b94SKristof Provost /* NULL buffer */ 6948e748b94SKristof Provost io.size = 1; 6958e748b94SKristof Provost io.array = NULL; 6968e748b94SKristof Provost if (ioctl(dev, DIOCXCOMMIT, &io) == 0) 6978e748b94SKristof Provost atf_tc_fail("request with size -1 succeeded"); 6988e748b94SKristof Provost 6998e748b94SKristof Provost COMMON_CLEANUP(); 7008e748b94SKristof Provost } 7018e748b94SKristof Provost 70298c5f988SKristof Provost ATF_TP_ADD_TCS(tp) 70398c5f988SKristof Provost { 70498c5f988SKristof Provost ATF_TP_ADD_TC(tp, addtables); 70598c5f988SKristof Provost ATF_TP_ADD_TC(tp, deltables); 7061ff545d6SKristof Provost ATF_TP_ADD_TC(tp, gettables); 7071ff545d6SKristof Provost ATF_TP_ADD_TC(tp, gettstats); 7081ff545d6SKristof Provost ATF_TP_ADD_TC(tp, clrtstats); 7091ff545d6SKristof Provost ATF_TP_ADD_TC(tp, settflags); 71062d28676SKristof Provost ATF_TP_ADD_TC(tp, addaddrs); 71162d28676SKristof Provost ATF_TP_ADD_TC(tp, deladdrs); 71262d28676SKristof Provost ATF_TP_ADD_TC(tp, setaddrs); 71362d28676SKristof Provost ATF_TP_ADD_TC(tp, getaddrs); 71462d28676SKristof Provost ATF_TP_ADD_TC(tp, clrastats); 71562d28676SKristof Provost ATF_TP_ADD_TC(tp, tstaddrs); 71662d28676SKristof Provost ATF_TP_ADD_TC(tp, inadefine); 7178e748b94SKristof Provost ATF_TP_ADD_TC(tp, igetifaces); 71862d28676SKristof Provost ATF_TP_ADD_TC(tp, cxbegin); 71962d28676SKristof Provost ATF_TP_ADD_TC(tp, cxrollback); 7208e748b94SKristof Provost ATF_TP_ADD_TC(tp, commit); 72198c5f988SKristof Provost 72298c5f988SKristof Provost return (atf_no_error()); 72398c5f988SKristof Provost } 724