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*d3cc4030SKristof 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); 109*d3cc4030SKristof Provost } 1101bb72c29SKristof Provost 111*d3cc4030SKristof Provost ATF_TC_CLEANUP(addtables, tc) 112*d3cc4030SKristof Provost { 11398c5f988SKristof Provost COMMON_CLEANUP(); 11498c5f988SKristof Provost } 11598c5f988SKristof Provost 116*d3cc4030SKristof 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"); 152*d3cc4030SKristof Provost } 15398c5f988SKristof Provost 154*d3cc4030SKristof Provost ATF_TC_CLEANUP(deltables, tc) 155*d3cc4030SKristof Provost { 15698c5f988SKristof Provost COMMON_CLEANUP(); 15798c5f988SKristof Provost } 15898c5f988SKristof Provost 159*d3cc4030SKristof 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"); 190*d3cc4030SKristof Provost } 1911ff545d6SKristof Provost 192*d3cc4030SKristof Provost ATF_TC_CLEANUP(gettables, tc) 193*d3cc4030SKristof Provost { 1941ff545d6SKristof Provost COMMON_CLEANUP(); 1951ff545d6SKristof Provost } 1961ff545d6SKristof Provost 197*d3cc4030SKristof 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"); 228*d3cc4030SKristof Provost } 2291ff545d6SKristof Provost 230*d3cc4030SKristof Provost ATF_TC_CLEANUP(gettstats, tc) 231*d3cc4030SKristof Provost { 2321ff545d6SKristof Provost COMMON_CLEANUP(); 2331ff545d6SKristof Provost } 2341ff545d6SKristof Provost 235*d3cc4030SKristof 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"); 268*d3cc4030SKristof Provost } 2691ff545d6SKristof Provost 270*d3cc4030SKristof Provost ATF_TC_CLEANUP(clrtstats, tc) 271*d3cc4030SKristof Provost { 2721ff545d6SKristof Provost COMMON_CLEANUP(); 2731ff545d6SKristof Provost } 2741ff545d6SKristof Provost 275*d3cc4030SKristof 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"); 308*d3cc4030SKristof Provost } 3091ff545d6SKristof Provost 310*d3cc4030SKristof Provost ATF_TC_CLEANUP(settflags, tc) 311*d3cc4030SKristof Provost { 3121ff545d6SKristof Provost COMMON_CLEANUP(); 3131ff545d6SKristof Provost } 3141ff545d6SKristof Provost 315*d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(addaddrs); 31687c7063cSKristof Provost ATF_TC_HEAD(addaddrs, tc) 31787c7063cSKristof Provost { 31887c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 31987c7063cSKristof Provost } 32087c7063cSKristof Provost 32162d28676SKristof Provost ATF_TC_BODY(addaddrs, tc) 32262d28676SKristof Provost { 32362d28676SKristof Provost struct pfioc_table io; 32462d28676SKristof Provost struct pfr_addr addr; 32562d28676SKristof Provost 32662d28676SKristof Provost COMMON_HEAD(); 32762d28676SKristof Provost 32862d28676SKristof Provost bzero(&addr, sizeof(addr)); 32962d28676SKristof Provost bzero(&io, sizeof(io)); 33062d28676SKristof Provost io.pfrio_flags = 0; 33162d28676SKristof Provost io.pfrio_buffer = &addr; 33262d28676SKristof Provost io.pfrio_esize = sizeof(addr); 33362d28676SKristof Provost 33462d28676SKristof Provost /* Negative size. */ 33562d28676SKristof Provost io.pfrio_size = -1; 33662d28676SKristof Provost if (ioctl(dev, DIOCRADDADDRS, &io) == 0) 33762d28676SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 33862d28676SKristof Provost 33962d28676SKristof Provost /* Overly large size. */ 34062d28676SKristof Provost io.pfrio_size = 1 << 28; 34162d28676SKristof Provost if (ioctl(dev, DIOCRADDADDRS, &io) == 0) 34262d28676SKristof Provost atf_tc_fail("Reuqest with size 1 << 28 failed"); 343*d3cc4030SKristof Provost } 34462d28676SKristof Provost 345*d3cc4030SKristof Provost ATF_TC_CLEANUP(addaddrs, tc) 346*d3cc4030SKristof Provost { 34762d28676SKristof Provost COMMON_CLEANUP(); 34862d28676SKristof Provost } 34962d28676SKristof Provost 350*d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(deladdrs); 35187c7063cSKristof Provost ATF_TC_HEAD(deladdrs, tc) 35287c7063cSKristof Provost { 35387c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 35487c7063cSKristof Provost } 35587c7063cSKristof Provost 35662d28676SKristof Provost ATF_TC_BODY(deladdrs, tc) 35762d28676SKristof Provost { 35862d28676SKristof Provost struct pfioc_table io; 35962d28676SKristof Provost struct pfr_addr addr; 36062d28676SKristof Provost 36162d28676SKristof Provost COMMON_HEAD(); 36262d28676SKristof Provost 36362d28676SKristof Provost bzero(&addr, sizeof(addr)); 36462d28676SKristof Provost bzero(&io, sizeof(io)); 36562d28676SKristof Provost io.pfrio_flags = 0; 36662d28676SKristof Provost io.pfrio_buffer = &addr; 36762d28676SKristof Provost io.pfrio_esize = sizeof(addr); 36862d28676SKristof Provost 36962d28676SKristof Provost /* Negative size. */ 37062d28676SKristof Provost io.pfrio_size = -1; 37162d28676SKristof Provost if (ioctl(dev, DIOCRDELADDRS, &io) == 0) 37262d28676SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 37362d28676SKristof Provost 37462d28676SKristof Provost /* Overly large size. */ 37562d28676SKristof Provost io.pfrio_size = 1 << 28; 37662d28676SKristof Provost if (ioctl(dev, DIOCRDELADDRS, &io) == 0) 37762d28676SKristof Provost atf_tc_fail("Reuqest with size 1 << 28 failed"); 378*d3cc4030SKristof Provost } 37962d28676SKristof Provost 380*d3cc4030SKristof Provost ATF_TC_CLEANUP(deladdrs, tc) 381*d3cc4030SKristof Provost { 38262d28676SKristof Provost COMMON_CLEANUP(); 38362d28676SKristof Provost } 38462d28676SKristof Provost 385*d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(setaddrs); 38687c7063cSKristof Provost ATF_TC_HEAD(setaddrs, tc) 38787c7063cSKristof Provost { 38887c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 38987c7063cSKristof Provost } 39087c7063cSKristof Provost 39162d28676SKristof Provost ATF_TC_BODY(setaddrs, tc) 39262d28676SKristof Provost { 39362d28676SKristof Provost struct pfioc_table io; 39462d28676SKristof Provost struct pfr_addr addr; 39562d28676SKristof Provost 39662d28676SKristof Provost COMMON_HEAD(); 39762d28676SKristof Provost 39862d28676SKristof Provost bzero(&addr, sizeof(addr)); 39962d28676SKristof Provost bzero(&io, sizeof(io)); 40062d28676SKristof Provost io.pfrio_flags = 0; 40162d28676SKristof Provost io.pfrio_buffer = &addr; 40262d28676SKristof Provost io.pfrio_esize = sizeof(addr); 40362d28676SKristof Provost 40462d28676SKristof Provost /* Negative size. */ 40562d28676SKristof Provost io.pfrio_size = -1; 40662d28676SKristof Provost if (ioctl(dev, DIOCRSETADDRS, &io) == 0) 40762d28676SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 40862d28676SKristof Provost 40962d28676SKristof Provost /* Overly large size. */ 41062d28676SKristof Provost io.pfrio_size = 1 << 28; 41162d28676SKristof Provost if (ioctl(dev, DIOCRSETADDRS, &io) == 0) 41262d28676SKristof Provost atf_tc_fail("Reuqest with size 1 << 28 failed"); 413*d3cc4030SKristof Provost } 41462d28676SKristof Provost 415*d3cc4030SKristof Provost ATF_TC_CLEANUP(setaddrs, tc) 416*d3cc4030SKristof Provost { 41762d28676SKristof Provost COMMON_CLEANUP(); 41862d28676SKristof Provost } 41962d28676SKristof Provost 420*d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(getaddrs); 42187c7063cSKristof Provost ATF_TC_HEAD(getaddrs, tc) 42287c7063cSKristof Provost { 42387c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 42487c7063cSKristof Provost } 42587c7063cSKristof Provost 42662d28676SKristof Provost ATF_TC_BODY(getaddrs, tc) 42762d28676SKristof Provost { 42862d28676SKristof Provost struct pfioc_table io; 42962d28676SKristof Provost struct pfr_addr addr; 43062d28676SKristof Provost 43162d28676SKristof Provost COMMON_HEAD(); 43262d28676SKristof Provost 43362d28676SKristof Provost bzero(&addr, sizeof(addr)); 43462d28676SKristof Provost bzero(&io, sizeof(io)); 43562d28676SKristof Provost io.pfrio_flags = 0; 43662d28676SKristof Provost io.pfrio_buffer = &addr; 43762d28676SKristof Provost io.pfrio_esize = sizeof(addr); 43862d28676SKristof Provost 43962d28676SKristof Provost common_init_tbl(&io.pfrio_table); 44062d28676SKristof Provost 44162d28676SKristof Provost /* Negative size. */ 44262d28676SKristof Provost io.pfrio_size = -1; 44362d28676SKristof Provost if (ioctl(dev, DIOCRGETADDRS, &io) == 0) 44462d28676SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 44562d28676SKristof Provost 44662d28676SKristof Provost /* Overly large size. */ 44762d28676SKristof Provost io.pfrio_size = 1 << 24; 44862d28676SKristof Provost if (ioctl(dev, DIOCRGETADDRS, &io) == 0) 44962d28676SKristof Provost atf_tc_fail("Request with size 1 << 24 failed"); 450*d3cc4030SKristof Provost } 45162d28676SKristof Provost 452*d3cc4030SKristof Provost ATF_TC_CLEANUP(getaddrs, tc) 453*d3cc4030SKristof Provost { 45462d28676SKristof Provost COMMON_CLEANUP(); 45562d28676SKristof Provost } 45662d28676SKristof Provost 457*d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(getastats); 45887c7063cSKristof Provost ATF_TC_HEAD(getastats, tc) 45987c7063cSKristof Provost { 46087c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 46187c7063cSKristof Provost } 46287c7063cSKristof Provost 46362d28676SKristof Provost ATF_TC_BODY(getastats, tc) 46462d28676SKristof Provost { 46562d28676SKristof Provost struct pfioc_table io; 46662d28676SKristof Provost struct pfr_astats astats; 46762d28676SKristof Provost 46862d28676SKristof Provost COMMON_HEAD(); 46962d28676SKristof Provost 47062d28676SKristof Provost bzero(&astats, sizeof(astats)); 47162d28676SKristof Provost bzero(&io, sizeof(io)); 47262d28676SKristof Provost io.pfrio_flags = 0; 47362d28676SKristof Provost io.pfrio_buffer = &astats; 47462d28676SKristof Provost io.pfrio_esize = sizeof(astats); 47562d28676SKristof Provost 47662d28676SKristof Provost common_init_tbl(&io.pfrio_table); 47762d28676SKristof Provost 47862d28676SKristof Provost /* Negative size. */ 47962d28676SKristof Provost io.pfrio_size = -1; 48062d28676SKristof Provost if (ioctl(dev, DIOCRGETASTATS, &io) == 0) 48162d28676SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 48262d28676SKristof Provost 48362d28676SKristof Provost /* Overly large size. */ 48462d28676SKristof Provost io.pfrio_size = 1 << 24; 48562d28676SKristof Provost if (ioctl(dev, DIOCRGETASTATS, &io) == 0) 48662d28676SKristof Provost atf_tc_fail("Request with size 1 << 24 failed"); 487*d3cc4030SKristof Provost } 48862d28676SKristof Provost 489*d3cc4030SKristof Provost ATF_TC_CLEANUP(getastats, tc) 490*d3cc4030SKristof Provost { 49162d28676SKristof Provost COMMON_CLEANUP(); 49262d28676SKristof Provost } 49362d28676SKristof Provost 494*d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(clrastats); 49587c7063cSKristof Provost ATF_TC_HEAD(clrastats, tc) 49687c7063cSKristof Provost { 49787c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 49887c7063cSKristof Provost } 49987c7063cSKristof Provost 50062d28676SKristof Provost ATF_TC_BODY(clrastats, tc) 50162d28676SKristof Provost { 50262d28676SKristof Provost struct pfioc_table io; 50362d28676SKristof Provost struct pfr_addr addr; 50462d28676SKristof Provost 50562d28676SKristof Provost COMMON_HEAD(); 50662d28676SKristof Provost 50762d28676SKristof Provost bzero(&addr, sizeof(addr)); 50862d28676SKristof Provost bzero(&io, sizeof(io)); 50962d28676SKristof Provost io.pfrio_flags = 0; 51062d28676SKristof Provost io.pfrio_buffer = &addr; 51162d28676SKristof Provost io.pfrio_esize = sizeof(addr); 51262d28676SKristof Provost 51362d28676SKristof Provost common_init_tbl(&io.pfrio_table); 51462d28676SKristof Provost 51562d28676SKristof Provost /* Negative size. */ 51662d28676SKristof Provost io.pfrio_size = -1; 51762d28676SKristof Provost if (ioctl(dev, DIOCRCLRASTATS, &io) == 0) 51862d28676SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 51962d28676SKristof Provost 52062d28676SKristof Provost /* Overly large size. */ 52162d28676SKristof Provost io.pfrio_size = 1 << 24; 52262d28676SKristof Provost if (ioctl(dev, DIOCRCLRASTATS, &io) == 0) 52362d28676SKristof Provost atf_tc_fail("Request with size 1 << 24 failed"); 524*d3cc4030SKristof Provost } 52562d28676SKristof Provost 526*d3cc4030SKristof Provost ATF_TC_CLEANUP(clrastats, tc) 527*d3cc4030SKristof Provost { 52862d28676SKristof Provost COMMON_CLEANUP(); 52962d28676SKristof Provost } 53062d28676SKristof Provost 531*d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(tstaddrs); 53287c7063cSKristof Provost ATF_TC_HEAD(tstaddrs, tc) 53387c7063cSKristof Provost { 53487c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 53587c7063cSKristof Provost } 53687c7063cSKristof Provost 53762d28676SKristof Provost ATF_TC_BODY(tstaddrs, tc) 53862d28676SKristof Provost { 53962d28676SKristof Provost struct pfioc_table io; 54062d28676SKristof Provost struct pfr_addr addr; 54162d28676SKristof Provost 54262d28676SKristof Provost COMMON_HEAD(); 54362d28676SKristof Provost 54462d28676SKristof Provost bzero(&addr, sizeof(addr)); 54562d28676SKristof Provost bzero(&io, sizeof(io)); 54662d28676SKristof Provost io.pfrio_flags = 0; 54762d28676SKristof Provost io.pfrio_buffer = &addr; 54862d28676SKristof Provost io.pfrio_esize = sizeof(addr); 54962d28676SKristof Provost 55062d28676SKristof Provost common_init_tbl(&io.pfrio_table); 55162d28676SKristof Provost 55262d28676SKristof Provost /* Negative size. */ 55362d28676SKristof Provost io.pfrio_size = -1; 55462d28676SKristof Provost if (ioctl(dev, DIOCRTSTADDRS, &io) == 0) 55562d28676SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 55662d28676SKristof Provost 55762d28676SKristof Provost /* Overly large size. */ 55862d28676SKristof Provost io.pfrio_size = 1 << 24; 55962d28676SKristof Provost if (ioctl(dev, DIOCRTSTADDRS, &io) == 0) 56062d28676SKristof Provost atf_tc_fail("Request with size 1 << 24 failed"); 561*d3cc4030SKristof Provost } 56262d28676SKristof Provost 563*d3cc4030SKristof Provost ATF_TC_CLEANUP(tstaddrs, tc) 564*d3cc4030SKristof Provost { 56562d28676SKristof Provost COMMON_CLEANUP(); 56662d28676SKristof Provost } 56762d28676SKristof Provost 568*d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(inadefine); 56987c7063cSKristof Provost ATF_TC_HEAD(inadefine, tc) 57087c7063cSKristof Provost { 57187c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 57287c7063cSKristof Provost } 57387c7063cSKristof Provost 57462d28676SKristof Provost ATF_TC_BODY(inadefine, tc) 57562d28676SKristof Provost { 57662d28676SKristof Provost struct pfioc_table io; 57762d28676SKristof Provost struct pfr_addr addr; 57862d28676SKristof Provost 57962d28676SKristof Provost COMMON_HEAD(); 58062d28676SKristof Provost 58162d28676SKristof Provost bzero(&addr, sizeof(addr)); 58262d28676SKristof Provost bzero(&io, sizeof(io)); 58362d28676SKristof Provost io.pfrio_flags = 0; 58462d28676SKristof Provost io.pfrio_buffer = &addr; 58562d28676SKristof Provost io.pfrio_esize = sizeof(addr); 58662d28676SKristof Provost 58762d28676SKristof Provost common_init_tbl(&io.pfrio_table); 58862d28676SKristof Provost 58962d28676SKristof Provost /* Negative size. */ 59062d28676SKristof Provost io.pfrio_size = -1; 59162d28676SKristof Provost if (ioctl(dev, DIOCRINADEFINE, &io) == 0) 59262d28676SKristof Provost atf_tc_fail("Request with size -1 succeeded"); 59362d28676SKristof Provost 59462d28676SKristof Provost /* Overly large size. */ 59562d28676SKristof Provost io.pfrio_size = 1 << 24; 59662d28676SKristof Provost if (ioctl(dev, DIOCRINADEFINE, &io) == 0) 59762d28676SKristof Provost atf_tc_fail("Request with size 1 << 24 failed"); 598*d3cc4030SKristof Provost } 59962d28676SKristof Provost 600*d3cc4030SKristof Provost ATF_TC_CLEANUP(inadefine, tc) 601*d3cc4030SKristof Provost { 60262d28676SKristof Provost COMMON_CLEANUP(); 60362d28676SKristof Provost } 60462d28676SKristof Provost 605*d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(igetifaces); 60687c7063cSKristof Provost ATF_TC_HEAD(igetifaces, tc) 60787c7063cSKristof Provost { 60887c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 60987c7063cSKristof Provost } 61087c7063cSKristof Provost 6118e748b94SKristof Provost ATF_TC_BODY(igetifaces, tc) 6128e748b94SKristof Provost { 6138e748b94SKristof Provost struct pfioc_iface io; 6148e748b94SKristof Provost struct pfi_kif kif; 6158e748b94SKristof Provost 6168e748b94SKristof Provost COMMON_HEAD(); 6178e748b94SKristof Provost 6188e748b94SKristof Provost bzero(&io, sizeof(io)); 6198e748b94SKristof Provost io.pfiio_flags = 0; 6208e748b94SKristof Provost io.pfiio_buffer = &kif; 6218e748b94SKristof Provost io.pfiio_esize = sizeof(kif); 6228e748b94SKristof Provost 6238e748b94SKristof Provost /* Negative size */ 6248e748b94SKristof Provost io.pfiio_size = -1; 6258e748b94SKristof Provost if (ioctl(dev, DIOCIGETIFACES, &io) == 0) 6268e748b94SKristof Provost atf_tc_fail("request with size -1 succeeded"); 6278e748b94SKristof Provost 6288e748b94SKristof Provost /* Overflow size */ 6298e748b94SKristof Provost io.pfiio_size = 1 << 31; 6308e748b94SKristof Provost if (ioctl(dev, DIOCIGETIFACES, &io) == 0) 6318e748b94SKristof Provost atf_tc_fail("request with size 1 << 31 succeeded"); 632*d3cc4030SKristof Provost } 6338e748b94SKristof Provost 634*d3cc4030SKristof Provost ATF_TC_CLEANUP(igetifaces, tc) 635*d3cc4030SKristof Provost { 6368e748b94SKristof Provost COMMON_CLEANUP(); 6378e748b94SKristof Provost } 6388e748b94SKristof Provost 639*d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(cxbegin); 64087c7063cSKristof Provost ATF_TC_HEAD(cxbegin, tc) 64187c7063cSKristof Provost { 64287c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 64387c7063cSKristof Provost } 64487c7063cSKristof Provost 64562d28676SKristof Provost ATF_TC_BODY(cxbegin, tc) 64662d28676SKristof Provost { 64762d28676SKristof Provost struct pfioc_trans io; 64862d28676SKristof Provost struct pfioc_trans_e ioe; 64962d28676SKristof Provost 65062d28676SKristof Provost COMMON_HEAD(); 65162d28676SKristof Provost 65262d28676SKristof Provost bzero(&io, sizeof(io)); 65362d28676SKristof Provost io.esize = sizeof(ioe); 65462d28676SKristof Provost io.array = &ioe; 65562d28676SKristof Provost 65662d28676SKristof Provost /* Negative size */ 65762d28676SKristof Provost io.size = -1; 65862d28676SKristof Provost if (ioctl(dev, DIOCXBEGIN, &io) == 0) 65962d28676SKristof Provost atf_tc_fail("request with size -1 succeeded"); 66062d28676SKristof Provost 66162d28676SKristof Provost /* Overflow size */ 66262d28676SKristof Provost io.size = 1 << 30; 66362d28676SKristof Provost if (ioctl(dev, DIOCXBEGIN, &io) == 0) 66462d28676SKristof Provost atf_tc_fail("request with size 1 << 30 succeeded"); 66562d28676SKristof Provost 66662d28676SKristof Provost /* NULL buffer */ 66762d28676SKristof Provost io.size = 1; 66862d28676SKristof Provost io.array = NULL; 66962d28676SKristof Provost if (ioctl(dev, DIOCXBEGIN, &io) == 0) 67062d28676SKristof Provost atf_tc_fail("request with size -1 succeeded"); 671*d3cc4030SKristof Provost } 67262d28676SKristof Provost 673*d3cc4030SKristof Provost ATF_TC_CLEANUP(cxbegin, tc) 674*d3cc4030SKristof Provost { 67562d28676SKristof Provost COMMON_CLEANUP(); 67662d28676SKristof Provost } 67762d28676SKristof Provost 678*d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(cxrollback); 67987c7063cSKristof Provost ATF_TC_HEAD(cxrollback, tc) 68087c7063cSKristof Provost { 68187c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 68287c7063cSKristof Provost } 68387c7063cSKristof Provost 68462d28676SKristof Provost ATF_TC_BODY(cxrollback, tc) 68562d28676SKristof Provost { 68662d28676SKristof Provost struct pfioc_trans io; 68762d28676SKristof Provost struct pfioc_trans_e ioe; 68862d28676SKristof Provost 68962d28676SKristof Provost COMMON_HEAD(); 69062d28676SKristof Provost 69162d28676SKristof Provost bzero(&io, sizeof(io)); 69262d28676SKristof Provost io.esize = sizeof(ioe); 69362d28676SKristof Provost io.array = &ioe; 69462d28676SKristof Provost 69562d28676SKristof Provost /* Negative size */ 69662d28676SKristof Provost io.size = -1; 69762d28676SKristof Provost if (ioctl(dev, DIOCXROLLBACK, &io) == 0) 69862d28676SKristof Provost atf_tc_fail("request with size -1 succeeded"); 69962d28676SKristof Provost 70062d28676SKristof Provost /* Overflow size */ 70162d28676SKristof Provost io.size = 1 << 30; 70262d28676SKristof Provost if (ioctl(dev, DIOCXROLLBACK, &io) == 0) 70362d28676SKristof Provost atf_tc_fail("request with size 1 << 30 succeeded"); 70462d28676SKristof Provost 70562d28676SKristof Provost /* NULL buffer */ 70662d28676SKristof Provost io.size = 1; 70762d28676SKristof Provost io.array = NULL; 70862d28676SKristof Provost if (ioctl(dev, DIOCXROLLBACK, &io) == 0) 70962d28676SKristof Provost atf_tc_fail("request with size -1 succeeded"); 710*d3cc4030SKristof Provost } 71162d28676SKristof Provost 712*d3cc4030SKristof Provost ATF_TC_CLEANUP(cxrollback, tc) 713*d3cc4030SKristof Provost { 71462d28676SKristof Provost COMMON_CLEANUP(); 71562d28676SKristof Provost } 71662d28676SKristof Provost 717*d3cc4030SKristof Provost ATF_TC_WITH_CLEANUP(commit); 71887c7063cSKristof Provost ATF_TC_HEAD(commit, tc) 71987c7063cSKristof Provost { 72087c7063cSKristof Provost atf_tc_set_md_var(tc, "require.user", "root"); 72187c7063cSKristof Provost } 72287c7063cSKristof Provost 7238e748b94SKristof Provost ATF_TC_BODY(commit, tc) 7248e748b94SKristof Provost { 7258e748b94SKristof Provost struct pfioc_trans io; 7268e748b94SKristof Provost struct pfioc_trans_e ioe; 7278e748b94SKristof Provost 7288e748b94SKristof Provost COMMON_HEAD(); 7298e748b94SKristof Provost 7308e748b94SKristof Provost bzero(&io, sizeof(io)); 7318e748b94SKristof Provost io.esize = sizeof(ioe); 7328e748b94SKristof Provost io.array = &ioe; 7338e748b94SKristof Provost 7348e748b94SKristof Provost /* Negative size */ 7358e748b94SKristof Provost io.size = -1; 7368e748b94SKristof Provost if (ioctl(dev, DIOCXCOMMIT, &io) == 0) 7378e748b94SKristof Provost atf_tc_fail("request with size -1 succeeded"); 7388e748b94SKristof Provost 7398e748b94SKristof Provost /* Overflow size */ 7408e748b94SKristof Provost io.size = 1 << 30; 7418e748b94SKristof Provost if (ioctl(dev, DIOCXCOMMIT, &io) == 0) 7428e748b94SKristof Provost atf_tc_fail("request with size 1 << 30 succeeded"); 7438e748b94SKristof Provost 7448e748b94SKristof Provost /* NULL buffer */ 7458e748b94SKristof Provost io.size = 1; 7468e748b94SKristof Provost io.array = NULL; 7478e748b94SKristof Provost if (ioctl(dev, DIOCXCOMMIT, &io) == 0) 7488e748b94SKristof Provost atf_tc_fail("request with size -1 succeeded"); 749*d3cc4030SKristof Provost } 7508e748b94SKristof Provost 751*d3cc4030SKristof Provost ATF_TC_CLEANUP(commit, tc) 752*d3cc4030SKristof Provost { 7538e748b94SKristof Provost COMMON_CLEANUP(); 7548e748b94SKristof Provost } 7558e748b94SKristof Provost 75698c5f988SKristof Provost ATF_TP_ADD_TCS(tp) 75798c5f988SKristof Provost { 75898c5f988SKristof Provost ATF_TP_ADD_TC(tp, addtables); 75998c5f988SKristof Provost ATF_TP_ADD_TC(tp, deltables); 7601ff545d6SKristof Provost ATF_TP_ADD_TC(tp, gettables); 7611ff545d6SKristof Provost ATF_TP_ADD_TC(tp, gettstats); 7621ff545d6SKristof Provost ATF_TP_ADD_TC(tp, clrtstats); 7631ff545d6SKristof Provost ATF_TP_ADD_TC(tp, settflags); 76462d28676SKristof Provost ATF_TP_ADD_TC(tp, addaddrs); 76562d28676SKristof Provost ATF_TP_ADD_TC(tp, deladdrs); 76662d28676SKristof Provost ATF_TP_ADD_TC(tp, setaddrs); 76762d28676SKristof Provost ATF_TP_ADD_TC(tp, getaddrs); 76862d28676SKristof Provost ATF_TP_ADD_TC(tp, clrastats); 76962d28676SKristof Provost ATF_TP_ADD_TC(tp, tstaddrs); 77062d28676SKristof Provost ATF_TP_ADD_TC(tp, inadefine); 7718e748b94SKristof Provost ATF_TP_ADD_TC(tp, igetifaces); 77262d28676SKristof Provost ATF_TP_ADD_TC(tp, cxbegin); 77362d28676SKristof Provost ATF_TP_ADD_TC(tp, cxrollback); 7748e748b94SKristof Provost ATF_TP_ADD_TC(tp, commit); 77598c5f988SKristof Provost 77698c5f988SKristof Provost return (atf_no_error()); 77798c5f988SKristof Provost } 778