1*42a2f8b7Sdlg /* $OpenBSD: pfctl_parser.h,v 1.121 2024/11/12 04:14:51 dlg Exp $ */ 214a9b182Skjell 314a9b182Skjell /* 4fd3c3a0cSderaadt * Copyright (c) 2001 Daniel Hartmeier 5f8d11d7cShenning * Copyright (c) 2002 - 2013 Henning Brauer <henning@openbsd.org> 614a9b182Skjell * All rights reserved. 714a9b182Skjell * 814a9b182Skjell * Redistribution and use in source and binary forms, with or without 914a9b182Skjell * modification, are permitted provided that the following conditions 1014a9b182Skjell * are met: 1114a9b182Skjell * 1214a9b182Skjell * - Redistributions of source code must retain the above copyright 1314a9b182Skjell * notice, this list of conditions and the following disclaimer. 1414a9b182Skjell * - Redistributions in binary form must reproduce the above 1514a9b182Skjell * copyright notice, this list of conditions and the following 1614a9b182Skjell * disclaimer in the documentation and/or other materials provided 1714a9b182Skjell * with the distribution. 1814a9b182Skjell * 1914a9b182Skjell * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2014a9b182Skjell * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2114a9b182Skjell * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 2214a9b182Skjell * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 235974bd37Sdhartmei * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 2414a9b182Skjell * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 2514a9b182Skjell * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 2614a9b182Skjell * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 2714a9b182Skjell * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2814a9b182Skjell * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 2914a9b182Skjell * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3014a9b182Skjell * POSSIBILITY OF SUCH DAMAGE. 3114a9b182Skjell * 3214a9b182Skjell */ 3314a9b182Skjell 34a6d3c168Sdhartmei #ifndef _PFCTL_PARSER_H_ 35a6d3c168Sdhartmei #define _PFCTL_PARSER_H_ 3614a9b182Skjell 3764b4b616Sfrantzen #define PF_OSFP_FILE "/etc/pf.os" 3864b4b616Sfrantzen 39ae711728Ssashan #define PF_OPT_DISABLE 0x00001 40ae711728Ssashan #define PF_OPT_ENABLE 0x00002 41ae711728Ssashan #define PF_OPT_VERBOSE 0x00004 42ae711728Ssashan #define PF_OPT_NOACTION 0x00008 43ae711728Ssashan #define PF_OPT_QUIET 0x00010 44ae711728Ssashan #define PF_OPT_CLRRULECTRS 0x00020 45ae711728Ssashan #define PF_OPT_USEDNS 0x00040 46ae711728Ssashan #define PF_OPT_VERBOSE2 0x00080 47ae711728Ssashan #define PF_OPT_DUMMYACTION 0x00100 48ae711728Ssashan #define PF_OPT_DEBUG 0x00200 49ae711728Ssashan #define PF_OPT_SHOWALL 0x00400 50ae711728Ssashan #define PF_OPT_OPTIMIZE 0x00800 51ae711728Ssashan #define PF_OPT_NODNS 0x01000 52ae711728Ssashan #define PF_OPT_RECURSE 0x04000 53ae711728Ssashan #define PF_OPT_PORTNAMES 0x08000 54ae711728Ssashan #define PF_OPT_IGNFAIL 0x10000 553898e353Ssashan #define PF_OPT_CALLSHOW 0x20000 56533ca421Smarkus 57bc795af0Shugh #define PF_TH_ALL 0xFF 58bc795af0Shugh 59e4b04189Sdhartmei #define PF_NAT_PROXY_PORT_LOW 50001 60e4b04189Sdhartmei #define PF_NAT_PROXY_PORT_HIGH 65535 61e4b04189Sdhartmei 62ac877e75Smcbride #define PF_OPTIMIZE_BASIC 0x0001 63ac877e75Smcbride #define PF_OPTIMIZE_PROFILE 0x0002 64ac877e75Smcbride 65c474e331Shenning #define FCNT_NAMES { \ 66c474e331Shenning "searches", \ 67c474e331Shenning "inserts", \ 68c474e331Shenning "removals", \ 69c474e331Shenning NULL \ 70c474e331Shenning } 71c474e331Shenning 72ab648bf6Sfrantzen struct pfr_buffer; /* forward definition */ 73ab648bf6Sfrantzen 74ab648bf6Sfrantzen 75ff352a37Smarkus struct pfctl { 76ff352a37Smarkus int dev; 77ff352a37Smarkus int opts; 78ac877e75Smcbride int optimize; 79305ca21dSmcbride int asd; /* anchor stack depth */ 80305ca21dSmcbride int bn; /* brace number */ 81305ca21dSmcbride int brace; 821cc45128Scedric int tdirty; /* kernel dirty */ 83305ca21dSmcbride #define PFCTL_ANCHOR_STACK_DEPTH 64 84305ca21dSmcbride struct pf_anchor *astack[PFCTL_ANCHOR_STACK_DEPTH]; 8578e1d2a6Shenning struct pfioc_queue *pqueue; 8679cc0068Scedric struct pfr_buffer *trans; 87305ca21dSmcbride struct pf_anchor *anchor, *alast; 8830269bc3Ssashan struct pfr_ktablehead pfr_ktlast; 893e963a2eScedric const char *ruleset; 90b6ba38e2Smcbride 91b6ba38e2Smcbride /* 'set foo' options */ 92b6ba38e2Smcbride u_int32_t timeout[PFTM_MAX]; 93b6ba38e2Smcbride u_int32_t limit[PF_LIMIT_MAX]; 94b6ba38e2Smcbride u_int32_t debug; 95b6ba38e2Smcbride u_int32_t hostid; 96e9953237Shenning u_int32_t reassemble; 976dce935dShenning u_int8_t syncookies; 984ee64aa9Shenning u_int8_t syncookieswat[2]; /* lowat, hiwat */ 99b6ba38e2Smcbride char *ifname; 100b6ba38e2Smcbride 101b6ba38e2Smcbride u_int8_t timeout_set[PFTM_MAX]; 102b6ba38e2Smcbride u_int8_t limit_set[PF_LIMIT_MAX]; 103b6ba38e2Smcbride u_int8_t debug_set; 104b6ba38e2Smcbride u_int8_t hostid_set; 105b6ba38e2Smcbride u_int8_t ifname_set; 106e9953237Shenning u_int8_t reass_set; 1076dce935dShenning u_int8_t syncookies_set; 1084ee64aa9Shenning u_int8_t syncookieswat_set; 109ff352a37Smarkus }; 110ff352a37Smarkus 11194e9410bShenning struct node_if { 11294e9410bShenning char ifname[IFNAMSIZ]; 11394e9410bShenning u_int8_t not; 114941498dbScedric u_int8_t dynamic; /* antispoof */ 1159e70289eSclaudio u_int8_t use_rdomain; 11694e9410bShenning u_int ifa_flags; 1179e70289eSclaudio int rdomain; 11894e9410bShenning struct node_if *next; 11994e9410bShenning struct node_if *tail; 12094e9410bShenning }; 12194e9410bShenning 12294e9410bShenning struct node_host { 12394e9410bShenning struct pf_addr_wrap addr; 12494e9410bShenning struct pf_addr bcast; 125ec359bd5Scedric struct pf_addr peer; 12694e9410bShenning sa_family_t af; 12794e9410bShenning u_int8_t not; 12894e9410bShenning u_int32_t ifindex; /* link-local IPv6 addrs */ 129cbdc262eSmcbride u_int16_t weight; /* load balancing weight */ 13094e9410bShenning char *ifname; 13194e9410bShenning u_int ifa_flags; 13294e9410bShenning struct node_host *next; 13394e9410bShenning struct node_host *tail; 13494e9410bShenning }; 135e3b4bc25Sderaadt void freehostlist(struct node_host *); 13694e9410bShenning 13764b4b616Sfrantzen struct node_os { 13864b4b616Sfrantzen char *os; 13964b4b616Sfrantzen pf_osfp_t fingerprint; 14064b4b616Sfrantzen struct node_os *next; 14164b4b616Sfrantzen struct node_os *tail; 14264b4b616Sfrantzen }; 14364b4b616Sfrantzen 14426025fd6Shenning struct node_queue_bw { 145*42a2f8b7Sdlg u_int64_t bw_absolute; 14626025fd6Shenning u_int16_t bw_percent; 14726025fd6Shenning }; 14826025fd6Shenning 14926025fd6Shenning struct node_hfsc_sc { 15026025fd6Shenning struct node_queue_bw m1; /* slope of 1st segment; bps */ 15126025fd6Shenning u_int d; /* x-projection of m1; msec */ 15226025fd6Shenning struct node_queue_bw m2; /* slope of 2nd segment; bps */ 15326025fd6Shenning u_int8_t used; 15426025fd6Shenning }; 15526025fd6Shenning 15626025fd6Shenning struct node_hfsc_opts { 15726025fd6Shenning struct node_hfsc_sc realtime; 15826025fd6Shenning struct node_hfsc_sc linkshare; 15926025fd6Shenning struct node_hfsc_sc upperlimit; 16026025fd6Shenning int flags; 16126025fd6Shenning }; 16226025fd6Shenning 163643bebe0Shenning struct node_queue_opt { 164643bebe0Shenning int qtype; 165643bebe0Shenning union { 166643bebe0Shenning struct priq_opts priq_opts; 16726025fd6Shenning struct node_hfsc_opts hfsc_opts; 168643bebe0Shenning } data; 169643bebe0Shenning }; 170643bebe0Shenning 1715b6c447dScedric SIMPLEQ_HEAD(node_tinithead, node_tinit); 1725b6c447dScedric struct node_tinit { /* table initializer */ 1735b6c447dScedric SIMPLEQ_ENTRY(node_tinit) entries; 1745b6c447dScedric struct node_host *host; 1755b6c447dScedric char *file; 1765b6c447dScedric }; 1775b6c447dScedric 178ab648bf6Sfrantzen 179ab648bf6Sfrantzen /* optimizer created tables */ 180ab648bf6Sfrantzen struct pf_opt_tbl { 181ab648bf6Sfrantzen char pt_name[PF_TABLE_NAME_SIZE]; 182ab648bf6Sfrantzen int pt_rulecount; 183ab648bf6Sfrantzen int pt_generated; 184bcb11948Szinke u_int32_t pt_flags; 18543d70b83Ssashan u_int32_t pt_refcnt; 186ab648bf6Sfrantzen struct node_tinithead pt_nodes; 187ab648bf6Sfrantzen struct pfr_buffer *pt_buf; 188ab648bf6Sfrantzen }; 189ab648bf6Sfrantzen 190ab648bf6Sfrantzen /* optimizer pf_rule container */ 191ab648bf6Sfrantzen struct pf_opt_rule { 192ab648bf6Sfrantzen struct pf_rule por_rule; 193ab648bf6Sfrantzen struct pf_opt_tbl *por_src_tbl; 194ab648bf6Sfrantzen struct pf_opt_tbl *por_dst_tbl; 195ab648bf6Sfrantzen u_int64_t por_profile_count; 196ab648bf6Sfrantzen TAILQ_ENTRY(pf_opt_rule) por_entry; 197ab648bf6Sfrantzen TAILQ_ENTRY(pf_opt_rule) por_skip_entry[PF_SKIP_COUNT]; 198ab648bf6Sfrantzen }; 199ab648bf6Sfrantzen 200305ca21dSmcbride TAILQ_HEAD(pf_opt_queue, pf_opt_rule); 2015b6c447dScedric 202b2e3e909Spelikan extern TAILQ_HEAD(pf_qihead, pfctl_qsitem) qspecs, rootqs; 203b2e3e909Spelikan struct pfctl_qsitem { 204b2e3e909Spelikan TAILQ_ENTRY(pfctl_qsitem) entries; 205b2e3e909Spelikan struct pf_queuespec qs; 206b2e3e909Spelikan struct pf_qihead children; 207b2e3e909Spelikan int matches; 208b2e3e909Spelikan }; 209b2e3e909Spelikan 2106af76811Shenning struct pfctl_watermarks { 2116af76811Shenning u_int32_t hi; 2126af76811Shenning u_int32_t lo; 2136af76811Shenning }; 214b2e3e909Spelikan 21530269bc3Ssashan struct pfr_uktable; 21630269bc3Ssashan 2170ff82421Skn void copy_satopfaddr(struct pf_addr *, struct sockaddr *); 2180ff82421Skn 21920741916Sderaadt int pfctl_rules(int, char *, int, int, char *, struct pfr_buffer *); 220305ca21dSmcbride int pfctl_optimize_ruleset(struct pfctl *, struct pf_ruleset *); 22136754172Smcbride int pf_opt_create_table(struct pfctl *, struct pf_opt_tbl *); 22236754172Smcbride int add_opt_table(struct pfctl *, struct pf_opt_tbl **, sa_family_t, 22336754172Smcbride struct pf_rule_addr *, char *); 2244ad19872Shenning 2256da84b37Skn void pfctl_add_rule(struct pfctl *, struct pf_rule *); 226ff352a37Smarkus 2277829bedfShenning int pfctl_set_timeout(struct pfctl *, const char *, int, int); 228e9953237Shenning int pfctl_set_reassembly(struct pfctl *, int, int); 2294ee64aa9Shenning int pfctl_set_syncookies(struct pfctl *, u_int8_t, 2304ee64aa9Shenning struct pfctl_watermarks *); 23141d03d6aShenning int pfctl_set_optimization(struct pfctl *, const char *); 23241d03d6aShenning int pfctl_set_limit(struct pfctl *, const char *, unsigned int); 23341d03d6aShenning int pfctl_set_logif(struct pfctl *, char *); 2349ac6101fSmcbride void pfctl_set_hostid(struct pfctl *, u_int32_t); 23550141adaShenning int pfctl_set_debug(struct pfctl *, char *); 2361a41552dSdhartmei int pfctl_set_interface_flags(struct pfctl *, char *, int, int); 23741d03d6aShenning 23820741916Sderaadt int parse_config(char *, struct pfctl *); 239ff352a37Smarkus int parse_flags(char *); 24030269bc3Ssashan int pfctl_load_anchors(int, struct pfctl *); 241ff352a37Smarkus 242f8d11d7cShenning int pfctl_load_queues(struct pfctl *); 243f8d11d7cShenning int pfctl_add_queue(struct pfctl *, struct pf_queuespec *); 244b2e3e909Spelikan struct pfctl_qsitem * pfctl_find_queue(char *, struct pf_qihead *); 245f8d11d7cShenning 24636754172Smcbride void print_pool(struct pf_pool *, u_int16_t, u_int16_t, sa_family_t, int, int); 247fd777407Smcbride void print_src_node(struct pf_src_node *, int); 248d9ad7941Sdhartmei void print_rule(struct pf_rule *, const char *, int); 2495b6c447dScedric void print_tabledef(const char *, int, int, struct node_tinithead *); 2506af76811Shenning void print_status(struct pf_status *, struct pfctl_watermarks *, int); 251f8d11d7cShenning void print_queuespec(struct pf_queuespec *); 25214a9b182Skjell 253d9ad7941Sdhartmei int pfctl_define_table(char *, int, int, const char *, struct pfr_buffer *, 25430269bc3Ssashan u_int32_t, struct pfr_uktable *); 2556edf764cSsashan void pfctl_expand_label_nr(struct pf_rule *, unsigned int); 256c06aa877Scedric 25764b4b616Sfrantzen void pfctl_clear_fingerprints(int, int); 25864b4b616Sfrantzen int pfctl_file_fingerprints(int, int, const char *); 25964b4b616Sfrantzen pf_osfp_t pfctl_get_fingerprint(const char *); 26064b4b616Sfrantzen int pfctl_load_fingerprints(int, int); 26164b4b616Sfrantzen char *pfctl_lookup_fingerprint(pf_osfp_t, char *, size_t); 26264b4b616Sfrantzen void pfctl_show_fingerprints(int); 26364b4b616Sfrantzen 264ff352a37Smarkus struct icmptypeent { 265132c30ccShenning const char *name; 266ff352a37Smarkus u_int8_t type; 267ff352a37Smarkus }; 268ff352a37Smarkus 269ff352a37Smarkus struct icmpcodeent { 270132c30ccShenning const char *name; 271ff352a37Smarkus u_int8_t type; 272ff352a37Smarkus u_int8_t code; 273ff352a37Smarkus }; 274ff352a37Smarkus 2757d27d81aSdhartmei const struct icmptypeent *geticmptypebynumber(u_int8_t, u_int8_t); 2767d27d81aSdhartmei const struct icmptypeent *geticmptypebyname(char *, u_int8_t); 2777d27d81aSdhartmei const struct icmpcodeent *geticmpcodebynumber(u_int8_t, u_int8_t, u_int8_t); 2787d27d81aSdhartmei const struct icmpcodeent *geticmpcodebyname(u_long, char *, u_int8_t); 279ff352a37Smarkus 280a2fdc13dSmcbride int string_to_loglevel(const char *); 281a2fdc13dSmcbride const char *loglevel_to_string(int); 282a2fdc13dSmcbride 283cc5f0329Sdhartmei struct pf_timeout { 284cc5f0329Sdhartmei const char *name; 285cc5f0329Sdhartmei int timeout; 286cc5f0329Sdhartmei }; 287cc5f0329Sdhartmei 288cc5f0329Sdhartmei extern const struct pf_timeout pf_timeouts[]; 289cc5f0329Sdhartmei 290c04427ddSkn void set_ipmask(struct node_host *, int); 29152f4a4a4Shenning int check_netmask(struct node_host *, sa_family_t); 292f0bb6ca5Skn int unmask(struct pf_addr *); 293c64927a6Smikeb struct node_host *gen_dynnode(struct node_host *, sa_family_t); 29494e9410bShenning void ifa_load(void); 295918dda86Smikeb unsigned int ifa_nametoindex(const char *); 296918dda86Smikeb char *ifa_indextoname(unsigned int, char *); 2976c3582faShenning struct node_host *ifa_exists(const char *); 298ec359bd5Scedric struct node_host *ifa_lookup(const char *, int); 2997c8726d4Sbenno struct node_host *host(const char *, int); 30094e9410bShenning 3017c8726d4Sbenno int append_addr(struct pfr_buffer *, char *, int, int); 3025b6c447dScedric int append_addr_host(struct pfr_buffer *, 3035b6c447dScedric struct node_host *, int, int); 30430269bc3Ssashan int pfr_ktable_compare(struct pfr_ktable *, 30530269bc3Ssashan struct pfr_ktable *); 30630269bc3Ssashan RB_PROTOTYPE(pfr_ktablehead, pfr_ktable, pfrkt_tree, pfr_ktable_compare); 30742e05679Scedric 308a6d3c168Sdhartmei #endif /* _PFCTL_PARSER_H_ */ 309