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