[BACK]Return to pfvar.h CVS log [TXT][DIR] Up to [local] / sys / net

Annotation of sys/net/pfvar.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: pfvar.h,v 1.254 2007/07/13 09:17:48 markus Exp $ */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 2001 Daniel Hartmeier
        !             5:  * All rights reserved.
        !             6:  *
        !             7:  * Redistribution and use in source and binary forms, with or without
        !             8:  * modification, are permitted provided that the following conditions
        !             9:  * are met:
        !            10:  *
        !            11:  *    - Redistributions of source code must retain the above copyright
        !            12:  *      notice, this list of conditions and the following disclaimer.
        !            13:  *    - Redistributions in binary form must reproduce the above
        !            14:  *      copyright notice, this list of conditions and the following
        !            15:  *      disclaimer in the documentation and/or other materials provided
        !            16:  *      with the distribution.
        !            17:  *
        !            18:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        !            19:  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        !            20:  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
        !            21:  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
        !            22:  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            23:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
        !            24:  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
        !            25:  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
        !            26:  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            27:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
        !            28:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            29:  * POSSIBILITY OF SUCH DAMAGE.
        !            30:  *
        !            31:  */
        !            32:
        !            33: #ifndef _NET_PFVAR_H_
        !            34: #define _NET_PFVAR_H_
        !            35:
        !            36: #include <sys/param.h>
        !            37: #include <sys/types.h>
        !            38: #include <sys/queue.h>
        !            39: #include <sys/tree.h>
        !            40: #include <sys/rwlock.h>
        !            41:
        !            42: #include <net/radix.h>
        !            43: #include <net/route.h>
        !            44: #include <netinet/ip_ipsp.h>
        !            45: #include <netinet/tcp_fsm.h>
        !            46:
        !            47: struct ip;
        !            48: struct ip6_hdr;
        !            49:
        !            50: #define        PF_TCPS_PROXY_SRC       ((TCP_NSTATES)+0)
        !            51: #define        PF_TCPS_PROXY_DST       ((TCP_NSTATES)+1)
        !            52:
        !            53: #define        PF_MD5_DIGEST_LENGTH    16
        !            54: #ifdef MD5_DIGEST_LENGTH
        !            55: #if PF_MD5_DIGEST_LENGTH != MD5_DIGEST_LENGTH
        !            56: #error
        !            57: #endif
        !            58: #endif
        !            59:
        !            60: enum   { PF_INOUT, PF_IN, PF_OUT };
        !            61: enum   { PF_LAN_EXT, PF_EXT_GWY, PF_ID };
        !            62: enum   { PF_PASS, PF_DROP, PF_SCRUB, PF_NOSCRUB, PF_NAT, PF_NONAT,
        !            63:          PF_BINAT, PF_NOBINAT, PF_RDR, PF_NORDR, PF_SYNPROXY_DROP };
        !            64: enum   { PF_RULESET_SCRUB, PF_RULESET_FILTER, PF_RULESET_NAT,
        !            65:          PF_RULESET_BINAT, PF_RULESET_RDR, PF_RULESET_MAX };
        !            66: enum   { PF_OP_NONE, PF_OP_IRG, PF_OP_EQ, PF_OP_NE, PF_OP_LT,
        !            67:          PF_OP_LE, PF_OP_GT, PF_OP_GE, PF_OP_XRG, PF_OP_RRG };
        !            68: enum   { PF_DEBUG_NONE, PF_DEBUG_URGENT, PF_DEBUG_MISC, PF_DEBUG_NOISY };
        !            69: enum   { PF_CHANGE_NONE, PF_CHANGE_ADD_HEAD, PF_CHANGE_ADD_TAIL,
        !            70:          PF_CHANGE_ADD_BEFORE, PF_CHANGE_ADD_AFTER,
        !            71:          PF_CHANGE_REMOVE, PF_CHANGE_GET_TICKET };
        !            72: enum   { PF_GET_NONE, PF_GET_CLR_CNTR };
        !            73:
        !            74: /*
        !            75:  * Note about PFTM_*: real indices into pf_rule.timeout[] come before
        !            76:  * PFTM_MAX, special cases afterwards. See pf_state_expires().
        !            77:  */
        !            78: enum   { PFTM_TCP_FIRST_PACKET, PFTM_TCP_OPENING, PFTM_TCP_ESTABLISHED,
        !            79:          PFTM_TCP_CLOSING, PFTM_TCP_FIN_WAIT, PFTM_TCP_CLOSED,
        !            80:          PFTM_UDP_FIRST_PACKET, PFTM_UDP_SINGLE, PFTM_UDP_MULTIPLE,
        !            81:          PFTM_ICMP_FIRST_PACKET, PFTM_ICMP_ERROR_REPLY,
        !            82:          PFTM_OTHER_FIRST_PACKET, PFTM_OTHER_SINGLE,
        !            83:          PFTM_OTHER_MULTIPLE, PFTM_FRAG, PFTM_INTERVAL,
        !            84:          PFTM_ADAPTIVE_START, PFTM_ADAPTIVE_END, PFTM_SRC_NODE,
        !            85:          PFTM_TS_DIFF, PFTM_MAX, PFTM_PURGE, PFTM_UNLINKED,
        !            86:          PFTM_UNTIL_PACKET };
        !            87:
        !            88: /* PFTM default values */
        !            89: #define PFTM_TCP_FIRST_PACKET_VAL      120     /* First TCP packet */
        !            90: #define PFTM_TCP_OPENING_VAL           30      /* No response yet */
        !            91: #define PFTM_TCP_ESTABLISHED_VAL       24*60*60/* Established */
        !            92: #define PFTM_TCP_CLOSING_VAL           15 * 60 /* Half closed */
        !            93: #define PFTM_TCP_FIN_WAIT_VAL          45      /* Got both FINs */
        !            94: #define PFTM_TCP_CLOSED_VAL            90      /* Got a RST */
        !            95: #define PFTM_UDP_FIRST_PACKET_VAL      60      /* First UDP packet */
        !            96: #define PFTM_UDP_SINGLE_VAL            30      /* Unidirectional */
        !            97: #define PFTM_UDP_MULTIPLE_VAL          60      /* Bidirectional */
        !            98: #define PFTM_ICMP_FIRST_PACKET_VAL     20      /* First ICMP packet */
        !            99: #define PFTM_ICMP_ERROR_REPLY_VAL      10      /* Got error response */
        !           100: #define PFTM_OTHER_FIRST_PACKET_VAL    60      /* First packet */
        !           101: #define PFTM_OTHER_SINGLE_VAL          30      /* Unidirectional */
        !           102: #define PFTM_OTHER_MULTIPLE_VAL                60      /* Bidirectional */
        !           103: #define PFTM_FRAG_VAL                  30      /* Fragment expire */
        !           104: #define PFTM_INTERVAL_VAL              10      /* Expire interval */
        !           105: #define PFTM_SRC_NODE_VAL              0       /* Source tracking */
        !           106: #define PFTM_TS_DIFF_VAL               30      /* Allowed TS diff */
        !           107:
        !           108: enum   { PF_NOPFROUTE, PF_FASTROUTE, PF_ROUTETO, PF_DUPTO, PF_REPLYTO };
        !           109: enum   { PF_LIMIT_STATES, PF_LIMIT_SRC_NODES, PF_LIMIT_FRAGS,
        !           110:          PF_LIMIT_TABLES, PF_LIMIT_TABLE_ENTRIES, PF_LIMIT_MAX };
        !           111: #define PF_POOL_IDMASK         0x0f
        !           112: enum   { PF_POOL_NONE, PF_POOL_BITMASK, PF_POOL_RANDOM,
        !           113:          PF_POOL_SRCHASH, PF_POOL_ROUNDROBIN };
        !           114: enum   { PF_ADDR_ADDRMASK, PF_ADDR_NOROUTE, PF_ADDR_DYNIFTL,
        !           115:          PF_ADDR_TABLE, PF_ADDR_RTLABEL, PF_ADDR_URPFFAILED };
        !           116: #define PF_POOL_TYPEMASK       0x0f
        !           117: #define PF_POOL_STICKYADDR     0x20
        !           118: #define        PF_WSCALE_FLAG          0x80
        !           119: #define        PF_WSCALE_MASK          0x0f
        !           120:
        !           121: #define        PF_LOG                  0x01
        !           122: #define        PF_LOG_ALL              0x02
        !           123: #define        PF_LOG_SOCKET_LOOKUP    0x04
        !           124:
        !           125: struct pf_addr {
        !           126:        union {
        !           127:                struct in_addr          v4;
        !           128:                struct in6_addr         v6;
        !           129:                u_int8_t                addr8[16];
        !           130:                u_int16_t               addr16[8];
        !           131:                u_int32_t               addr32[4];
        !           132:        } pfa;              /* 128-bit address */
        !           133: #define v4     pfa.v4
        !           134: #define v6     pfa.v6
        !           135: #define addr8  pfa.addr8
        !           136: #define addr16 pfa.addr16
        !           137: #define addr32 pfa.addr32
        !           138: };
        !           139:
        !           140: #define        PF_TABLE_NAME_SIZE       32
        !           141:
        !           142: #define PFI_AFLAG_NETWORK      0x01
        !           143: #define PFI_AFLAG_BROADCAST    0x02
        !           144: #define PFI_AFLAG_PEER         0x04
        !           145: #define PFI_AFLAG_MODEMASK     0x07
        !           146: #define PFI_AFLAG_NOALIAS      0x08
        !           147:
        !           148: struct pf_addr_wrap {
        !           149:        union {
        !           150:                struct {
        !           151:                        struct pf_addr           addr;
        !           152:                        struct pf_addr           mask;
        !           153:                }                        a;
        !           154:                char                     ifname[IFNAMSIZ];
        !           155:                char                     tblname[PF_TABLE_NAME_SIZE];
        !           156:                char                     rtlabelname[RTLABEL_LEN];
        !           157:                u_int32_t                rtlabel;
        !           158:        }                        v;
        !           159:        union {
        !           160:                struct pfi_dynaddr      *dyn;
        !           161:                struct pfr_ktable       *tbl;
        !           162:                int                      dyncnt;
        !           163:                int                      tblcnt;
        !           164:        }                        p;
        !           165:        u_int8_t                 type;          /* PF_ADDR_* */
        !           166:        u_int8_t                 iflags;        /* PFI_AFLAG_* */
        !           167: };
        !           168:
        !           169: #ifdef _KERNEL
        !           170:
        !           171: struct pfi_dynaddr {
        !           172:        TAILQ_ENTRY(pfi_dynaddr)         entry;
        !           173:        struct pf_addr                   pfid_addr4;
        !           174:        struct pf_addr                   pfid_mask4;
        !           175:        struct pf_addr                   pfid_addr6;
        !           176:        struct pf_addr                   pfid_mask6;
        !           177:        struct pfr_ktable               *pfid_kt;
        !           178:        struct pfi_kif                  *pfid_kif;
        !           179:        void                            *pfid_hook_cookie;
        !           180:        int                              pfid_net;      /* mask or 128 */
        !           181:        int                              pfid_acnt4;    /* address count IPv4 */
        !           182:        int                              pfid_acnt6;    /* address count IPv6 */
        !           183:        sa_family_t                      pfid_af;       /* rule af */
        !           184:        u_int8_t                         pfid_iflags;   /* PFI_AFLAG_* */
        !           185: };
        !           186:
        !           187: /*
        !           188:  * Address manipulation macros
        !           189:  */
        !           190:
        !           191: #ifdef INET
        !           192: #ifndef INET6
        !           193: #define PF_INET_ONLY
        !           194: #endif /* ! INET6 */
        !           195: #endif /* INET */
        !           196:
        !           197: #ifdef INET6
        !           198: #ifndef INET
        !           199: #define PF_INET6_ONLY
        !           200: #endif /* ! INET */
        !           201: #endif /* INET6 */
        !           202:
        !           203: #ifdef INET
        !           204: #ifdef INET6
        !           205: #define PF_INET_INET6
        !           206: #endif /* INET6 */
        !           207: #endif /* INET */
        !           208:
        !           209: #else
        !           210:
        !           211: #define PF_INET_INET6
        !           212:
        !           213: #endif /* _KERNEL */
        !           214:
        !           215: /* Both IPv4 and IPv6 */
        !           216: #ifdef PF_INET_INET6
        !           217:
        !           218: #define PF_AEQ(a, b, c) \
        !           219:        ((c == AF_INET && (a)->addr32[0] == (b)->addr32[0]) || \
        !           220:        ((a)->addr32[3] == (b)->addr32[3] && \
        !           221:        (a)->addr32[2] == (b)->addr32[2] && \
        !           222:        (a)->addr32[1] == (b)->addr32[1] && \
        !           223:        (a)->addr32[0] == (b)->addr32[0])) \
        !           224:
        !           225: #define PF_ANEQ(a, b, c) \
        !           226:        ((c == AF_INET && (a)->addr32[0] != (b)->addr32[0]) || \
        !           227:        ((a)->addr32[3] != (b)->addr32[3] || \
        !           228:        (a)->addr32[2] != (b)->addr32[2] || \
        !           229:        (a)->addr32[1] != (b)->addr32[1] || \
        !           230:        (a)->addr32[0] != (b)->addr32[0])) \
        !           231:
        !           232: #define PF_AZERO(a, c) \
        !           233:        ((c == AF_INET && !(a)->addr32[0]) || \
        !           234:        (!(a)->addr32[0] && !(a)->addr32[1] && \
        !           235:        !(a)->addr32[2] && !(a)->addr32[3] )) \
        !           236:
        !           237: #define PF_MATCHA(n, a, m, b, f) \
        !           238:        pf_match_addr(n, a, m, b, f)
        !           239:
        !           240: #define PF_ACPY(a, b, f) \
        !           241:        pf_addrcpy(a, b, f)
        !           242:
        !           243: #define PF_AINC(a, f) \
        !           244:        pf_addr_inc(a, f)
        !           245:
        !           246: #define PF_POOLMASK(a, b, c, d, f) \
        !           247:        pf_poolmask(a, b, c, d, f)
        !           248:
        !           249: #else
        !           250:
        !           251: /* Just IPv6 */
        !           252:
        !           253: #ifdef PF_INET6_ONLY
        !           254:
        !           255: #define PF_AEQ(a, b, c) \
        !           256:        ((a)->addr32[3] == (b)->addr32[3] && \
        !           257:        (a)->addr32[2] == (b)->addr32[2] && \
        !           258:        (a)->addr32[1] == (b)->addr32[1] && \
        !           259:        (a)->addr32[0] == (b)->addr32[0]) \
        !           260:
        !           261: #define PF_ANEQ(a, b, c) \
        !           262:        ((a)->addr32[3] != (b)->addr32[3] || \
        !           263:        (a)->addr32[2] != (b)->addr32[2] || \
        !           264:        (a)->addr32[1] != (b)->addr32[1] || \
        !           265:        (a)->addr32[0] != (b)->addr32[0]) \
        !           266:
        !           267: #define PF_AZERO(a, c) \
        !           268:        (!(a)->addr32[0] && \
        !           269:        !(a)->addr32[1] && \
        !           270:        !(a)->addr32[2] && \
        !           271:        !(a)->addr32[3] ) \
        !           272:
        !           273: #define PF_MATCHA(n, a, m, b, f) \
        !           274:        pf_match_addr(n, a, m, b, f)
        !           275:
        !           276: #define PF_ACPY(a, b, f) \
        !           277:        pf_addrcpy(a, b, f)
        !           278:
        !           279: #define PF_AINC(a, f) \
        !           280:        pf_addr_inc(a, f)
        !           281:
        !           282: #define PF_POOLMASK(a, b, c, d, f) \
        !           283:        pf_poolmask(a, b, c, d, f)
        !           284:
        !           285: #else
        !           286:
        !           287: /* Just IPv4 */
        !           288: #ifdef PF_INET_ONLY
        !           289:
        !           290: #define PF_AEQ(a, b, c) \
        !           291:        ((a)->addr32[0] == (b)->addr32[0])
        !           292:
        !           293: #define PF_ANEQ(a, b, c) \
        !           294:        ((a)->addr32[0] != (b)->addr32[0])
        !           295:
        !           296: #define PF_AZERO(a, c) \
        !           297:        (!(a)->addr32[0])
        !           298:
        !           299: #define PF_MATCHA(n, a, m, b, f) \
        !           300:        pf_match_addr(n, a, m, b, f)
        !           301:
        !           302: #define PF_ACPY(a, b, f) \
        !           303:        (a)->v4.s_addr = (b)->v4.s_addr
        !           304:
        !           305: #define PF_AINC(a, f) \
        !           306:        do { \
        !           307:                (a)->addr32[0] = htonl(ntohl((a)->addr32[0]) + 1); \
        !           308:        } while (0)
        !           309:
        !           310: #define PF_POOLMASK(a, b, c, d, f) \
        !           311:        do { \
        !           312:                (a)->addr32[0] = ((b)->addr32[0] & (c)->addr32[0]) | \
        !           313:                (((c)->addr32[0] ^ 0xffffffff ) & (d)->addr32[0]); \
        !           314:        } while (0)
        !           315:
        !           316: #endif /* PF_INET_ONLY */
        !           317: #endif /* PF_INET6_ONLY */
        !           318: #endif /* PF_INET_INET6 */
        !           319:
        !           320: #define        PF_MISMATCHAW(aw, x, af, neg, ifp)                              \
        !           321:        (                                                               \
        !           322:                (((aw)->type == PF_ADDR_NOROUTE &&                      \
        !           323:                    pf_routable((x), (af), NULL)) ||                    \
        !           324:                (((aw)->type == PF_ADDR_URPFFAILED && (ifp) != NULL &&  \
        !           325:                    pf_routable((x), (af), (ifp))) ||                   \
        !           326:                ((aw)->type == PF_ADDR_RTLABEL &&                       \
        !           327:                    !pf_rtlabel_match((x), (af), (aw))) ||              \
        !           328:                ((aw)->type == PF_ADDR_TABLE &&                         \
        !           329:                    !pfr_match_addr((aw)->p.tbl, (x), (af))) ||         \
        !           330:                ((aw)->type == PF_ADDR_DYNIFTL &&                       \
        !           331:                    !pfi_match_addr((aw)->p.dyn, (x), (af))) ||         \
        !           332:                ((aw)->type == PF_ADDR_ADDRMASK &&                      \
        !           333:                    !PF_AZERO(&(aw)->v.a.mask, (af)) &&                 \
        !           334:                    !PF_MATCHA(0, &(aw)->v.a.addr,                      \
        !           335:                    &(aw)->v.a.mask, (x), (af))))) !=                   \
        !           336:                (neg)                                                   \
        !           337:        )
        !           338:
        !           339:
        !           340: struct pf_rule_uid {
        !           341:        uid_t            uid[2];
        !           342:        u_int8_t         op;
        !           343: };
        !           344:
        !           345: struct pf_rule_gid {
        !           346:        uid_t            gid[2];
        !           347:        u_int8_t         op;
        !           348: };
        !           349:
        !           350: struct pf_rule_addr {
        !           351:        struct pf_addr_wrap      addr;
        !           352:        u_int16_t                port[2];
        !           353:        u_int8_t                 neg;
        !           354:        u_int8_t                 port_op;
        !           355: };
        !           356:
        !           357: struct pf_pooladdr {
        !           358:        struct pf_addr_wrap              addr;
        !           359:        TAILQ_ENTRY(pf_pooladdr)         entries;
        !           360:        char                             ifname[IFNAMSIZ];
        !           361:        struct pfi_kif                  *kif;
        !           362: };
        !           363:
        !           364: TAILQ_HEAD(pf_palist, pf_pooladdr);
        !           365:
        !           366: struct pf_poolhashkey {
        !           367:        union {
        !           368:                u_int8_t                key8[16];
        !           369:                u_int16_t               key16[8];
        !           370:                u_int32_t               key32[4];
        !           371:        } pfk;              /* 128-bit hash key */
        !           372: #define key8   pfk.key8
        !           373: #define key16  pfk.key16
        !           374: #define key32  pfk.key32
        !           375: };
        !           376:
        !           377: struct pf_pool {
        !           378:        struct pf_palist         list;
        !           379:        struct pf_pooladdr      *cur;
        !           380:        struct pf_poolhashkey    key;
        !           381:        struct pf_addr           counter;
        !           382:        int                      tblidx;
        !           383:        u_int16_t                proxy_port[2];
        !           384:        u_int8_t                 port_op;
        !           385:        u_int8_t                 opts;
        !           386: };
        !           387:
        !           388:
        !           389: /* A packed Operating System description for fingerprinting */
        !           390: typedef u_int32_t pf_osfp_t;
        !           391: #define PF_OSFP_ANY    ((pf_osfp_t)0)
        !           392: #define PF_OSFP_UNKNOWN        ((pf_osfp_t)-1)
        !           393: #define PF_OSFP_NOMATCH        ((pf_osfp_t)-2)
        !           394:
        !           395: struct pf_osfp_entry {
        !           396:        SLIST_ENTRY(pf_osfp_entry) fp_entry;
        !           397:        pf_osfp_t               fp_os;
        !           398:        int                     fp_enflags;
        !           399: #define PF_OSFP_EXPANDED       0x001           /* expanded entry */
        !           400: #define PF_OSFP_GENERIC                0x002           /* generic signature */
        !           401: #define PF_OSFP_NODETAIL       0x004           /* no p0f details */
        !           402: #define PF_OSFP_LEN    32
        !           403:        char                    fp_class_nm[PF_OSFP_LEN];
        !           404:        char                    fp_version_nm[PF_OSFP_LEN];
        !           405:        char                    fp_subtype_nm[PF_OSFP_LEN];
        !           406: };
        !           407: #define PF_OSFP_ENTRY_EQ(a, b) \
        !           408:     ((a)->fp_os == (b)->fp_os && \
        !           409:     memcmp((a)->fp_class_nm, (b)->fp_class_nm, PF_OSFP_LEN) == 0 && \
        !           410:     memcmp((a)->fp_version_nm, (b)->fp_version_nm, PF_OSFP_LEN) == 0 && \
        !           411:     memcmp((a)->fp_subtype_nm, (b)->fp_subtype_nm, PF_OSFP_LEN) == 0)
        !           412:
        !           413: /* handle pf_osfp_t packing */
        !           414: #define _FP_RESERVED_BIT       1  /* For the special negative #defines */
        !           415: #define _FP_UNUSED_BITS                1
        !           416: #define _FP_CLASS_BITS         10 /* OS Class (Windows, Linux) */
        !           417: #define _FP_VERSION_BITS       10 /* OS version (95, 98, NT, 2.4.54, 3.2) */
        !           418: #define _FP_SUBTYPE_BITS       10 /* patch level (NT SP4, SP3, ECN patch) */
        !           419: #define PF_OSFP_UNPACK(osfp, class, version, subtype) do { \
        !           420:        (class) = ((osfp) >> (_FP_VERSION_BITS+_FP_SUBTYPE_BITS)) & \
        !           421:            ((1 << _FP_CLASS_BITS) - 1); \
        !           422:        (version) = ((osfp) >> _FP_SUBTYPE_BITS) & \
        !           423:            ((1 << _FP_VERSION_BITS) - 1);\
        !           424:        (subtype) = (osfp) & ((1 << _FP_SUBTYPE_BITS) - 1); \
        !           425: } while(0)
        !           426: #define PF_OSFP_PACK(osfp, class, version, subtype) do { \
        !           427:        (osfp) = ((class) & ((1 << _FP_CLASS_BITS) - 1)) << (_FP_VERSION_BITS \
        !           428:            + _FP_SUBTYPE_BITS); \
        !           429:        (osfp) |= ((version) & ((1 << _FP_VERSION_BITS) - 1)) << \
        !           430:            _FP_SUBTYPE_BITS; \
        !           431:        (osfp) |= (subtype) & ((1 << _FP_SUBTYPE_BITS) - 1); \
        !           432: } while(0)
        !           433:
        !           434: /* the fingerprint of an OSes TCP SYN packet */
        !           435: typedef u_int64_t      pf_tcpopts_t;
        !           436: struct pf_os_fingerprint {
        !           437:        SLIST_HEAD(pf_osfp_enlist, pf_osfp_entry) fp_oses; /* list of matches */
        !           438:        pf_tcpopts_t            fp_tcpopts;     /* packed TCP options */
        !           439:        u_int16_t               fp_wsize;       /* TCP window size */
        !           440:        u_int16_t               fp_psize;       /* ip->ip_len */
        !           441:        u_int16_t               fp_mss;         /* TCP MSS */
        !           442:        u_int16_t               fp_flags;
        !           443: #define PF_OSFP_WSIZE_MOD      0x0001          /* Window modulus */
        !           444: #define PF_OSFP_WSIZE_DC       0x0002          /* Window don't care */
        !           445: #define PF_OSFP_WSIZE_MSS      0x0004          /* Window multiple of MSS */
        !           446: #define PF_OSFP_WSIZE_MTU      0x0008          /* Window multiple of MTU */
        !           447: #define PF_OSFP_PSIZE_MOD      0x0010          /* packet size modulus */
        !           448: #define PF_OSFP_PSIZE_DC       0x0020          /* packet size don't care */
        !           449: #define PF_OSFP_WSCALE         0x0040          /* TCP window scaling */
        !           450: #define PF_OSFP_WSCALE_MOD     0x0080          /* TCP window scale modulus */
        !           451: #define PF_OSFP_WSCALE_DC      0x0100          /* TCP window scale dont-care */
        !           452: #define PF_OSFP_MSS            0x0200          /* TCP MSS */
        !           453: #define PF_OSFP_MSS_MOD                0x0400          /* TCP MSS modulus */
        !           454: #define PF_OSFP_MSS_DC         0x0800          /* TCP MSS dont-care */
        !           455: #define PF_OSFP_DF             0x1000          /* IPv4 don't fragment bit */
        !           456: #define PF_OSFP_TS0            0x2000          /* Zero timestamp */
        !           457: #define PF_OSFP_INET6          0x4000          /* IPv6 */
        !           458:        u_int8_t                fp_optcnt;      /* TCP option count */
        !           459:        u_int8_t                fp_wscale;      /* TCP window scaling */
        !           460:        u_int8_t                fp_ttl;         /* IPv4 TTL */
        !           461: #define PF_OSFP_MAXTTL_OFFSET  40
        !           462: /* TCP options packing */
        !           463: #define PF_OSFP_TCPOPT_NOP     0x0             /* TCP NOP option */
        !           464: #define PF_OSFP_TCPOPT_WSCALE  0x1             /* TCP window scaling option */
        !           465: #define PF_OSFP_TCPOPT_MSS     0x2             /* TCP max segment size opt */
        !           466: #define PF_OSFP_TCPOPT_SACK    0x3             /* TCP SACK OK option */
        !           467: #define PF_OSFP_TCPOPT_TS      0x4             /* TCP timestamp option */
        !           468: #define PF_OSFP_TCPOPT_BITS    3               /* bits used by each option */
        !           469: #define PF_OSFP_MAX_OPTS \
        !           470:     (sizeof(((struct pf_os_fingerprint *)0)->fp_tcpopts) * 8) \
        !           471:     / PF_OSFP_TCPOPT_BITS
        !           472:
        !           473:        SLIST_ENTRY(pf_os_fingerprint)  fp_next;
        !           474: };
        !           475:
        !           476: struct pf_osfp_ioctl {
        !           477:        struct pf_osfp_entry    fp_os;
        !           478:        pf_tcpopts_t            fp_tcpopts;     /* packed TCP options */
        !           479:        u_int16_t               fp_wsize;       /* TCP window size */
        !           480:        u_int16_t               fp_psize;       /* ip->ip_len */
        !           481:        u_int16_t               fp_mss;         /* TCP MSS */
        !           482:        u_int16_t               fp_flags;
        !           483:        u_int8_t                fp_optcnt;      /* TCP option count */
        !           484:        u_int8_t                fp_wscale;      /* TCP window scaling */
        !           485:        u_int8_t                fp_ttl;         /* IPv4 TTL */
        !           486:
        !           487:        int                     fp_getnum;      /* DIOCOSFPGET number */
        !           488: };
        !           489:
        !           490:
        !           491: union pf_rule_ptr {
        !           492:        struct pf_rule          *ptr;
        !           493:        u_int32_t                nr;
        !           494: };
        !           495:
        !           496: #define        PF_ANCHOR_NAME_SIZE      64
        !           497:
        !           498: struct pf_rule {
        !           499:        struct pf_rule_addr      src;
        !           500:        struct pf_rule_addr      dst;
        !           501: #define PF_SKIP_IFP            0
        !           502: #define PF_SKIP_DIR            1
        !           503: #define PF_SKIP_AF             2
        !           504: #define PF_SKIP_PROTO          3
        !           505: #define PF_SKIP_SRC_ADDR       4
        !           506: #define PF_SKIP_SRC_PORT       5
        !           507: #define PF_SKIP_DST_ADDR       6
        !           508: #define PF_SKIP_DST_PORT       7
        !           509: #define PF_SKIP_COUNT          8
        !           510:        union pf_rule_ptr        skip[PF_SKIP_COUNT];
        !           511: #define PF_RULE_LABEL_SIZE      64
        !           512:        char                     label[PF_RULE_LABEL_SIZE];
        !           513: #define PF_QNAME_SIZE           64
        !           514:        char                     ifname[IFNAMSIZ];
        !           515:        char                     qname[PF_QNAME_SIZE];
        !           516:        char                     pqname[PF_QNAME_SIZE];
        !           517: #define        PF_TAG_NAME_SIZE         64
        !           518:        char                     tagname[PF_TAG_NAME_SIZE];
        !           519:        char                     match_tagname[PF_TAG_NAME_SIZE];
        !           520:
        !           521:        char                     overload_tblname[PF_TABLE_NAME_SIZE];
        !           522:
        !           523:        TAILQ_ENTRY(pf_rule)     entries;
        !           524:        struct pf_pool           rpool;
        !           525:
        !           526:        u_int64_t                evaluations;
        !           527:        u_int64_t                packets[2];
        !           528:        u_int64_t                bytes[2];
        !           529:
        !           530:        struct pfi_kif          *kif;
        !           531:        struct pf_anchor        *anchor;
        !           532:        struct pfr_ktable       *overload_tbl;
        !           533:
        !           534:        pf_osfp_t                os_fingerprint;
        !           535:
        !           536:        int                      rtableid;
        !           537:        u_int32_t                timeout[PFTM_MAX];
        !           538:        u_int32_t                states;
        !           539:        u_int32_t                max_states;
        !           540:        u_int32_t                src_nodes;
        !           541:        u_int32_t                max_src_nodes;
        !           542:        u_int32_t                max_src_states;
        !           543:        u_int32_t                max_src_conn;
        !           544:        struct {
        !           545:                u_int32_t               limit;
        !           546:                u_int32_t               seconds;
        !           547:        }                        max_src_conn_rate;
        !           548:        u_int32_t                qid;
        !           549:        u_int32_t                pqid;
        !           550:        u_int32_t                rt_listid;
        !           551:        u_int32_t                nr;
        !           552:        u_int32_t                prob;
        !           553:        uid_t                    cuid;
        !           554:        pid_t                    cpid;
        !           555:
        !           556:        u_int16_t                return_icmp;
        !           557:        u_int16_t                return_icmp6;
        !           558:        u_int16_t                max_mss;
        !           559:        u_int16_t                tag;
        !           560:        u_int16_t                match_tag;
        !           561:
        !           562:        struct pf_rule_uid       uid;
        !           563:        struct pf_rule_gid       gid;
        !           564:
        !           565:        u_int32_t                rule_flag;
        !           566:        u_int8_t                 action;
        !           567:        u_int8_t                 direction;
        !           568:        u_int8_t                 log;
        !           569:        u_int8_t                 logif;
        !           570:        u_int8_t                 quick;
        !           571:        u_int8_t                 ifnot;
        !           572:        u_int8_t                 match_tag_not;
        !           573:        u_int8_t                 natpass;
        !           574:
        !           575: #define PF_STATE_NORMAL                0x1
        !           576: #define PF_STATE_MODULATE      0x2
        !           577: #define PF_STATE_SYNPROXY      0x3
        !           578:        u_int8_t                 keep_state;
        !           579:        sa_family_t              af;
        !           580:        u_int8_t                 proto;
        !           581:        u_int8_t                 type;
        !           582:        u_int8_t                 code;
        !           583:        u_int8_t                 flags;
        !           584:        u_int8_t                 flagset;
        !           585:        u_int8_t                 min_ttl;
        !           586:        u_int8_t                 allow_opts;
        !           587:        u_int8_t                 rt;
        !           588:        u_int8_t                 return_ttl;
        !           589:        u_int8_t                 tos;
        !           590:        u_int8_t                 anchor_relative;
        !           591:        u_int8_t                 anchor_wildcard;
        !           592:
        !           593: #define PF_FLUSH               0x01
        !           594: #define PF_FLUSH_GLOBAL                0x02
        !           595:        u_int8_t                 flush;
        !           596: };
        !           597:
        !           598: /* rule flags */
        !           599: #define        PFRULE_DROP             0x0000
        !           600: #define        PFRULE_RETURNRST        0x0001
        !           601: #define        PFRULE_FRAGMENT         0x0002
        !           602: #define        PFRULE_RETURNICMP       0x0004
        !           603: #define        PFRULE_RETURN           0x0008
        !           604: #define        PFRULE_NOSYNC           0x0010
        !           605: #define PFRULE_SRCTRACK                0x0020  /* track source states */
        !           606: #define PFRULE_RULESRCTRACK    0x0040  /* per rule */
        !           607:
        !           608: /* scrub flags */
        !           609: #define        PFRULE_NODF             0x0100
        !           610: #define        PFRULE_FRAGCROP         0x0200  /* non-buffering frag cache */
        !           611: #define        PFRULE_FRAGDROP         0x0400  /* drop funny fragments */
        !           612: #define PFRULE_RANDOMID                0x0800
        !           613: #define PFRULE_REASSEMBLE_TCP  0x1000
        !           614:
        !           615: /* rule flags again */
        !           616: #define PFRULE_IFBOUND         0x00010000      /* if-bound */
        !           617:
        !           618: #define PFSTATE_HIWAT          10000   /* default state table size */
        !           619: #define PFSTATE_ADAPT_START    6000    /* default adaptive timeout start */
        !           620: #define PFSTATE_ADAPT_END      12000   /* default adaptive timeout end */
        !           621:
        !           622:
        !           623: struct pf_threshold {
        !           624:        u_int32_t       limit;
        !           625: #define        PF_THRESHOLD_MULT       1000
        !           626: #define PF_THRESHOLD_MAX       0xffffffff / PF_THRESHOLD_MULT
        !           627:        u_int32_t       seconds;
        !           628:        u_int32_t       count;
        !           629:        u_int32_t       last;
        !           630: };
        !           631:
        !           632: struct pf_src_node {
        !           633:        RB_ENTRY(pf_src_node) entry;
        !           634:        struct pf_addr   addr;
        !           635:        struct pf_addr   raddr;
        !           636:        union pf_rule_ptr rule;
        !           637:        struct pfi_kif  *kif;
        !           638:        u_int64_t        bytes[2];
        !           639:        u_int64_t        packets[2];
        !           640:        u_int32_t        states;
        !           641:        u_int32_t        conn;
        !           642:        struct pf_threshold     conn_rate;
        !           643:        u_int32_t        creation;
        !           644:        u_int32_t        expire;
        !           645:        sa_family_t      af;
        !           646:        u_int8_t         ruletype;
        !           647: };
        !           648:
        !           649: #define PFSNODE_HIWAT          10000   /* default source node table size */
        !           650:
        !           651: struct pf_state_scrub {
        !           652:        struct timeval  pfss_last;      /* time received last packet    */
        !           653:        u_int32_t       pfss_tsecr;     /* last echoed timestamp        */
        !           654:        u_int32_t       pfss_tsval;     /* largest timestamp            */
        !           655:        u_int32_t       pfss_tsval0;    /* original timestamp           */
        !           656:        u_int16_t       pfss_flags;
        !           657: #define PFSS_TIMESTAMP 0x0001          /* modulate timestamp           */
        !           658: #define PFSS_PAWS      0x0010          /* stricter PAWS checks         */
        !           659: #define PFSS_PAWS_IDLED        0x0020          /* was idle too long.  no PAWS  */
        !           660: #define PFSS_DATA_TS   0x0040          /* timestamp on data packets    */
        !           661: #define PFSS_DATA_NOTS 0x0080          /* no timestamp on data packets */
        !           662:        u_int8_t        pfss_ttl;       /* stashed TTL                  */
        !           663:        u_int8_t        pad;
        !           664:        u_int32_t       pfss_ts_mod;    /* timestamp modulation         */
        !           665: };
        !           666:
        !           667: struct pf_state_host {
        !           668:        struct pf_addr  addr;
        !           669:        u_int16_t       port;
        !           670:        u_int16_t       pad;
        !           671: };
        !           672:
        !           673: struct pf_state_peer {
        !           674:        u_int32_t       seqlo;          /* Max sequence number sent     */
        !           675:        u_int32_t       seqhi;          /* Max the other end ACKd + win */
        !           676:        u_int32_t       seqdiff;        /* Sequence number modulator    */
        !           677:        u_int16_t       max_win;        /* largest window (pre scaling) */
        !           678:        u_int8_t        state;          /* active state level           */
        !           679:        u_int8_t        wscale;         /* window scaling factor        */
        !           680:        u_int16_t       mss;            /* Maximum segment size option  */
        !           681:        u_int8_t        tcp_est;        /* Did we reach TCPS_ESTABLISHED */
        !           682:        struct pf_state_scrub   *scrub; /* state is scrubbed            */
        !           683:        u_int8_t        pad[3];
        !           684: };
        !           685:
        !           686: TAILQ_HEAD(pf_state_queue, pf_state);
        !           687:
        !           688: /* keep synced with struct pf_state_key, used in RB_FIND */
        !           689: struct pf_state_key_cmp {
        !           690:        struct pf_state_host lan;
        !           691:        struct pf_state_host gwy;
        !           692:        struct pf_state_host ext;
        !           693:        sa_family_t      af;
        !           694:        u_int8_t         proto;
        !           695:        u_int8_t         direction;
        !           696:        u_int8_t         pad;
        !           697: };
        !           698:
        !           699: TAILQ_HEAD(pf_statelist, pf_state);
        !           700:
        !           701: struct pf_state_key {
        !           702:        struct pf_state_host lan;
        !           703:        struct pf_state_host gwy;
        !           704:        struct pf_state_host ext;
        !           705:        sa_family_t      af;
        !           706:        u_int8_t         proto;
        !           707:        u_int8_t         direction;
        !           708:        u_int8_t         pad;
        !           709:
        !           710:        RB_ENTRY(pf_state_key)   entry_lan_ext;
        !           711:        RB_ENTRY(pf_state_key)   entry_ext_gwy;
        !           712:        struct pf_statelist      states;
        !           713:        u_short          refcnt;        /* same size as if_index */
        !           714: };
        !           715:
        !           716:
        !           717: /* keep synced with struct pf_state, used in RB_FIND */
        !           718: struct pf_state_cmp {
        !           719:        u_int64_t        id;
        !           720:        u_int32_t        creatorid;
        !           721:        u_int32_t        pad;
        !           722: };
        !           723:
        !           724: struct pf_state {
        !           725:        u_int64_t                id;
        !           726:        u_int32_t                creatorid;
        !           727:        u_int32_t                pad;
        !           728:
        !           729:        TAILQ_ENTRY(pf_state)    entry_list;
        !           730:        TAILQ_ENTRY(pf_state)    next;
        !           731:        RB_ENTRY(pf_state)       entry_id;
        !           732:        struct pf_state_peer     src;
        !           733:        struct pf_state_peer     dst;
        !           734:        union pf_rule_ptr        rule;
        !           735:        union pf_rule_ptr        anchor;
        !           736:        union pf_rule_ptr        nat_rule;
        !           737:        struct pf_addr           rt_addr;
        !           738:        struct pf_state_key     *state_key;
        !           739:        struct pfi_kif          *kif;
        !           740:        struct pfi_kif          *rt_kif;
        !           741:        struct pf_src_node      *src_node;
        !           742:        struct pf_src_node      *nat_src_node;
        !           743:        u_int64_t                packets[2];
        !           744:        u_int64_t                bytes[2];
        !           745:        u_int32_t                creation;
        !           746:        u_int32_t                expire;
        !           747:        u_int32_t                pfsync_time;
        !           748:        u_int16_t                tag;
        !           749:        u_int8_t                 log;
        !           750:        u_int8_t                 allow_opts;
        !           751:        u_int8_t                 timeout;
        !           752:        u_int8_t                 sync_flags;
        !           753: #define        PFSTATE_NOSYNC   0x01
        !           754: #define        PFSTATE_FROMSYNC 0x02
        !           755: #define        PFSTATE_STALE    0x04
        !           756: };
        !           757:
        !           758: /*
        !           759:  * Unified state structures for pulling states out of the kernel
        !           760:  * used by pfsync(4) and the pf(4) ioctl.
        !           761:  */
        !           762: struct pfsync_state_scrub {
        !           763:        u_int16_t       pfss_flags;
        !           764:        u_int8_t        pfss_ttl;       /* stashed TTL          */
        !           765: #define PFSYNC_SCRUB_FLAG_VALID        0x01
        !           766:        u_int8_t        scrub_flag;
        !           767:        u_int32_t       pfss_ts_mod;    /* timestamp modulation */
        !           768: } __packed;
        !           769:
        !           770: struct pfsync_state_host {
        !           771:        struct pf_addr  addr;
        !           772:        u_int16_t       port;
        !           773:        u_int16_t       pad[3];
        !           774: } __packed;
        !           775:
        !           776: struct pfsync_state_peer {
        !           777:        struct pfsync_state_scrub scrub;        /* state is scrubbed    */
        !           778:        u_int32_t       seqlo;          /* Max sequence number sent     */
        !           779:        u_int32_t       seqhi;          /* Max the other end ACKd + win */
        !           780:        u_int32_t       seqdiff;        /* Sequence number modulator    */
        !           781:        u_int16_t       max_win;        /* largest window (pre scaling) */
        !           782:        u_int16_t       mss;            /* Maximum segment size option  */
        !           783:        u_int8_t        state;          /* active state level           */
        !           784:        u_int8_t        wscale;         /* window scaling factor        */
        !           785:        u_int8_t        pad[6];
        !           786: } __packed;
        !           787:
        !           788: struct pfsync_state {
        !           789:        u_int32_t        id[2];
        !           790:        char             ifname[IFNAMSIZ];
        !           791:        struct pfsync_state_host lan;
        !           792:        struct pfsync_state_host gwy;
        !           793:        struct pfsync_state_host ext;
        !           794:        struct pfsync_state_peer src;
        !           795:        struct pfsync_state_peer dst;
        !           796:        struct pf_addr   rt_addr;
        !           797:        u_int32_t        rule;
        !           798:        u_int32_t        anchor;
        !           799:        u_int32_t        nat_rule;
        !           800:        u_int32_t        creation;
        !           801:        u_int32_t        expire;
        !           802:        u_int32_t        packets[2][2];
        !           803:        u_int32_t        bytes[2][2];
        !           804:        u_int32_t        creatorid;
        !           805:        sa_family_t      af;
        !           806:        u_int8_t         proto;
        !           807:        u_int8_t         direction;
        !           808:        u_int8_t         log;
        !           809:        u_int8_t         allow_opts;
        !           810:        u_int8_t         timeout;
        !           811:        u_int8_t         sync_flags;
        !           812:        u_int8_t         updates;
        !           813: } __packed;
        !           814:
        !           815: #define PFSYNC_FLAG_COMPRESS   0x01
        !           816: #define PFSYNC_FLAG_STALE      0x02
        !           817: #define PFSYNC_FLAG_SRCNODE    0x04
        !           818: #define PFSYNC_FLAG_NATSRCNODE 0x08
        !           819:
        !           820: /* for copies to/from userland via pf_ioctl() */
        !           821: #define pf_state_peer_to_pfsync(s,d) do {      \
        !           822:        (d)->seqlo = (s)->seqlo;                \
        !           823:        (d)->seqhi = (s)->seqhi;                \
        !           824:        (d)->seqdiff = (s)->seqdiff;            \
        !           825:        (d)->max_win = (s)->max_win;            \
        !           826:        (d)->mss = (s)->mss;                    \
        !           827:        (d)->state = (s)->state;                \
        !           828:        (d)->wscale = (s)->wscale;              \
        !           829:        if ((s)->scrub) {                                               \
        !           830:                (d)->scrub.pfss_flags =                                 \
        !           831:                    (s)->scrub->pfss_flags & PFSS_TIMESTAMP;            \
        !           832:                (d)->scrub.pfss_ttl = (s)->scrub->pfss_ttl;             \
        !           833:                (d)->scrub.pfss_ts_mod = (s)->scrub->pfss_ts_mod;       \
        !           834:                (d)->scrub.scrub_flag = PFSYNC_SCRUB_FLAG_VALID;        \
        !           835:        }                                                               \
        !           836: } while (0)
        !           837:
        !           838: #define pf_state_peer_from_pfsync(s,d) do {    \
        !           839:        (d)->seqlo = (s)->seqlo;                \
        !           840:        (d)->seqhi = (s)->seqhi;                \
        !           841:        (d)->seqdiff = (s)->seqdiff;            \
        !           842:        (d)->max_win = (s)->max_win;            \
        !           843:        (d)->mss = ntohs((s)->mss);             \
        !           844:        (d)->state = (s)->state;                \
        !           845:        (d)->wscale = (s)->wscale;              \
        !           846:        if ((s)->scrub.scrub_flag == PFSYNC_SCRUB_FLAG_VALID &&         \
        !           847:            (d)->scrub != NULL) {                                       \
        !           848:                (d)->scrub->pfss_flags =                                \
        !           849:                    ntohs((s)->scrub.pfss_flags) & PFSS_TIMESTAMP;      \
        !           850:                (d)->scrub->pfss_ttl = (s)->scrub.pfss_ttl;             \
        !           851:                (d)->scrub->pfss_ts_mod = (s)->scrub.pfss_ts_mod;       \
        !           852:        }                                                               \
        !           853: } while (0)
        !           854:
        !           855: #define pf_state_counter_to_pfsync(s,d) do {                   \
        !           856:        d[0] = (s>>32)&0xffffffff;                              \
        !           857:        d[1] = s&0xffffffff;                                    \
        !           858: } while (0)
        !           859:
        !           860: #define pf_state_counter_from_pfsync(s)                \
        !           861:        (((u_int64_t)(s[0])<<32) | (u_int64_t)(s[1]))
        !           862:
        !           863:
        !           864:
        !           865: TAILQ_HEAD(pf_rulequeue, pf_rule);
        !           866:
        !           867: struct pf_anchor;
        !           868:
        !           869: struct pf_ruleset {
        !           870:        struct {
        !           871:                struct pf_rulequeue      queues[2];
        !           872:                struct {
        !           873:                        struct pf_rulequeue     *ptr;
        !           874:                        struct pf_rule          **ptr_array;
        !           875:                        u_int32_t                rcount;
        !           876:                        u_int32_t                ticket;
        !           877:                        int                      open;
        !           878:                }                        active, inactive;
        !           879:        }                        rules[PF_RULESET_MAX];
        !           880:        struct pf_anchor        *anchor;
        !           881:        u_int32_t                tticket;
        !           882:        int                      tables;
        !           883:        int                      topen;
        !           884: };
        !           885:
        !           886: RB_HEAD(pf_anchor_global, pf_anchor);
        !           887: RB_HEAD(pf_anchor_node, pf_anchor);
        !           888: struct pf_anchor {
        !           889:        RB_ENTRY(pf_anchor)      entry_global;
        !           890:        RB_ENTRY(pf_anchor)      entry_node;
        !           891:        struct pf_anchor        *parent;
        !           892:        struct pf_anchor_node    children;
        !           893:        char                     name[PF_ANCHOR_NAME_SIZE];
        !           894:        char                     path[MAXPATHLEN];
        !           895:        struct pf_ruleset        ruleset;
        !           896:        int                      refcnt;        /* anchor rules */
        !           897:        int                      match;
        !           898: };
        !           899: RB_PROTOTYPE(pf_anchor_global, pf_anchor, entry_global, pf_anchor_compare);
        !           900: RB_PROTOTYPE(pf_anchor_node, pf_anchor, entry_node, pf_anchor_compare);
        !           901:
        !           902: #define PF_RESERVED_ANCHOR     "_pf"
        !           903:
        !           904: #define PFR_TFLAG_PERSIST      0x00000001
        !           905: #define PFR_TFLAG_CONST                0x00000002
        !           906: #define PFR_TFLAG_ACTIVE       0x00000004
        !           907: #define PFR_TFLAG_INACTIVE     0x00000008
        !           908: #define PFR_TFLAG_REFERENCED   0x00000010
        !           909: #define PFR_TFLAG_REFDANCHOR   0x00000020
        !           910: #define PFR_TFLAG_USRMASK      0x00000003
        !           911: #define PFR_TFLAG_SETMASK      0x0000003C
        !           912: #define PFR_TFLAG_ALLMASK      0x0000003F
        !           913:
        !           914: struct pfr_table {
        !           915:        char                     pfrt_anchor[MAXPATHLEN];
        !           916:        char                     pfrt_name[PF_TABLE_NAME_SIZE];
        !           917:        u_int32_t                pfrt_flags;
        !           918:        u_int8_t                 pfrt_fback;
        !           919: };
        !           920:
        !           921: enum { PFR_FB_NONE, PFR_FB_MATCH, PFR_FB_ADDED, PFR_FB_DELETED,
        !           922:        PFR_FB_CHANGED, PFR_FB_CLEARED, PFR_FB_DUPLICATE,
        !           923:        PFR_FB_NOTMATCH, PFR_FB_CONFLICT, PFR_FB_MAX };
        !           924:
        !           925: struct pfr_addr {
        !           926:        union {
        !           927:                struct in_addr   _pfra_ip4addr;
        !           928:                struct in6_addr  _pfra_ip6addr;
        !           929:        }                pfra_u;
        !           930:        u_int8_t         pfra_af;
        !           931:        u_int8_t         pfra_net;
        !           932:        u_int8_t         pfra_not;
        !           933:        u_int8_t         pfra_fback;
        !           934: };
        !           935: #define        pfra_ip4addr    pfra_u._pfra_ip4addr
        !           936: #define        pfra_ip6addr    pfra_u._pfra_ip6addr
        !           937:
        !           938: enum { PFR_DIR_IN, PFR_DIR_OUT, PFR_DIR_MAX };
        !           939: enum { PFR_OP_BLOCK, PFR_OP_PASS, PFR_OP_ADDR_MAX, PFR_OP_TABLE_MAX };
        !           940: #define PFR_OP_XPASS   PFR_OP_ADDR_MAX
        !           941:
        !           942: struct pfr_astats {
        !           943:        struct pfr_addr  pfras_a;
        !           944:        u_int64_t        pfras_packets[PFR_DIR_MAX][PFR_OP_ADDR_MAX];
        !           945:        u_int64_t        pfras_bytes[PFR_DIR_MAX][PFR_OP_ADDR_MAX];
        !           946:        long             pfras_tzero;
        !           947: };
        !           948:
        !           949: enum { PFR_REFCNT_RULE, PFR_REFCNT_ANCHOR, PFR_REFCNT_MAX };
        !           950:
        !           951: struct pfr_tstats {
        !           952:        struct pfr_table pfrts_t;
        !           953:        u_int64_t        pfrts_packets[PFR_DIR_MAX][PFR_OP_TABLE_MAX];
        !           954:        u_int64_t        pfrts_bytes[PFR_DIR_MAX][PFR_OP_TABLE_MAX];
        !           955:        u_int64_t        pfrts_match;
        !           956:        u_int64_t        pfrts_nomatch;
        !           957:        long             pfrts_tzero;
        !           958:        int              pfrts_cnt;
        !           959:        int              pfrts_refcnt[PFR_REFCNT_MAX];
        !           960: };
        !           961: #define        pfrts_name      pfrts_t.pfrt_name
        !           962: #define pfrts_flags    pfrts_t.pfrt_flags
        !           963:
        !           964: SLIST_HEAD(pfr_kentryworkq, pfr_kentry);
        !           965: struct pfr_kentry {
        !           966:        struct radix_node        pfrke_node[2];
        !           967:        union sockaddr_union     pfrke_sa;
        !           968:        u_int64_t                pfrke_packets[PFR_DIR_MAX][PFR_OP_ADDR_MAX];
        !           969:        u_int64_t                pfrke_bytes[PFR_DIR_MAX][PFR_OP_ADDR_MAX];
        !           970:        SLIST_ENTRY(pfr_kentry)  pfrke_workq;
        !           971:        long                     pfrke_tzero;
        !           972:        u_int8_t                 pfrke_af;
        !           973:        u_int8_t                 pfrke_net;
        !           974:        u_int8_t                 pfrke_not;
        !           975:        u_int8_t                 pfrke_mark;
        !           976:        u_int8_t                 pfrke_intrpool;
        !           977: };
        !           978:
        !           979: SLIST_HEAD(pfr_ktableworkq, pfr_ktable);
        !           980: RB_HEAD(pfr_ktablehead, pfr_ktable);
        !           981: struct pfr_ktable {
        !           982:        struct pfr_tstats        pfrkt_ts;
        !           983:        RB_ENTRY(pfr_ktable)     pfrkt_tree;
        !           984:        SLIST_ENTRY(pfr_ktable)  pfrkt_workq;
        !           985:        struct radix_node_head  *pfrkt_ip4;
        !           986:        struct radix_node_head  *pfrkt_ip6;
        !           987:        struct pfr_ktable       *pfrkt_shadow;
        !           988:        struct pfr_ktable       *pfrkt_root;
        !           989:        struct pf_ruleset       *pfrkt_rs;
        !           990:        long                     pfrkt_larg;
        !           991:        int                      pfrkt_nflags;
        !           992: };
        !           993: #define pfrkt_t                pfrkt_ts.pfrts_t
        !           994: #define pfrkt_name     pfrkt_t.pfrt_name
        !           995: #define pfrkt_anchor   pfrkt_t.pfrt_anchor
        !           996: #define pfrkt_ruleset  pfrkt_t.pfrt_ruleset
        !           997: #define pfrkt_flags    pfrkt_t.pfrt_flags
        !           998: #define pfrkt_cnt      pfrkt_ts.pfrts_cnt
        !           999: #define pfrkt_refcnt   pfrkt_ts.pfrts_refcnt
        !          1000: #define pfrkt_packets  pfrkt_ts.pfrts_packets
        !          1001: #define pfrkt_bytes    pfrkt_ts.pfrts_bytes
        !          1002: #define pfrkt_match    pfrkt_ts.pfrts_match
        !          1003: #define pfrkt_nomatch  pfrkt_ts.pfrts_nomatch
        !          1004: #define pfrkt_tzero    pfrkt_ts.pfrts_tzero
        !          1005:
        !          1006: RB_HEAD(pf_state_tree_lan_ext, pf_state_key);
        !          1007: RB_PROTOTYPE(pf_state_tree_lan_ext, pf_state_key,
        !          1008:     entry_lan_ext, pf_state_compare_lan_ext);
        !          1009:
        !          1010: RB_HEAD(pf_state_tree_ext_gwy, pf_state_key);
        !          1011: RB_PROTOTYPE(pf_state_tree_ext_gwy, pf_state_key,
        !          1012:     entry_ext_gwy, pf_state_compare_ext_gwy);
        !          1013:
        !          1014: RB_HEAD(pfi_ifhead, pfi_kif);
        !          1015:
        !          1016: /* state tables */
        !          1017: extern struct pf_state_tree_lan_ext     pf_statetbl_lan_ext;
        !          1018: extern struct pf_state_tree_ext_gwy     pf_statetbl_ext_gwy;
        !          1019:
        !          1020: /* keep synced with pfi_kif, used in RB_FIND */
        !          1021: struct pfi_kif_cmp {
        !          1022:        char                             pfik_name[IFNAMSIZ];
        !          1023: };
        !          1024:
        !          1025: struct pfi_kif {
        !          1026:        char                             pfik_name[IFNAMSIZ];
        !          1027:        RB_ENTRY(pfi_kif)                pfik_tree;
        !          1028:        u_int64_t                        pfik_packets[2][2][2];
        !          1029:        u_int64_t                        pfik_bytes[2][2][2];
        !          1030:        u_int32_t                        pfik_tzero;
        !          1031:        int                              pfik_flags;
        !          1032:        void                            *pfik_ah_cookie;
        !          1033:        struct ifnet                    *pfik_ifp;
        !          1034:        struct ifg_group                *pfik_group;
        !          1035:        int                              pfik_states;
        !          1036:        int                              pfik_rules;
        !          1037:        TAILQ_HEAD(, pfi_dynaddr)        pfik_dynaddrs;
        !          1038: };
        !          1039:
        !          1040: enum pfi_kif_refs {
        !          1041:        PFI_KIF_REF_NONE,
        !          1042:        PFI_KIF_REF_STATE,
        !          1043:        PFI_KIF_REF_RULE
        !          1044: };
        !          1045:
        !          1046: #define PFI_IFLAG_SKIP         0x0100  /* skip filtering on interface */
        !          1047:
        !          1048: struct pf_pdesc {
        !          1049:        struct {
        !          1050:                int      done;
        !          1051:                uid_t    uid;
        !          1052:                gid_t    gid;
        !          1053:                pid_t    pid;
        !          1054:        }                lookup;
        !          1055:        u_int64_t        tot_len;       /* Make Mickey money */
        !          1056:        union {
        !          1057:                struct tcphdr           *tcp;
        !          1058:                struct udphdr           *udp;
        !          1059:                struct icmp             *icmp;
        !          1060: #ifdef INET6
        !          1061:                struct icmp6_hdr        *icmp6;
        !          1062: #endif /* INET6 */
        !          1063:                void                    *any;
        !          1064:        } hdr;
        !          1065:        struct pf_addr   baddr;         /* address before translation */
        !          1066:        struct pf_addr   naddr;         /* address after translation */
        !          1067:        struct pf_rule  *nat_rule;      /* nat/rdr rule applied to packet */
        !          1068:        struct pf_addr  *src;
        !          1069:        struct pf_addr  *dst;
        !          1070:        struct ether_header
        !          1071:                        *eh;
        !          1072:        u_int16_t       *ip_sum;
        !          1073:        u_int32_t        p_len;         /* total length of payload */
        !          1074:        u_int16_t        flags;         /* Let SCRUB trigger behavior in
        !          1075:                                         * state code. Easier than tags */
        !          1076: #define PFDESC_TCP_NORM        0x0001          /* TCP shall be statefully scrubbed */
        !          1077: #define PFDESC_IP_REAS 0x0002          /* IP frags would've been reassembled */
        !          1078:        sa_family_t      af;
        !          1079:        u_int8_t         proto;
        !          1080:        u_int8_t         tos;
        !          1081: };
        !          1082:
        !          1083: /* flags for RDR options */
        !          1084: #define PF_DPORT_RANGE 0x01            /* Dest port uses range */
        !          1085: #define PF_RPORT_RANGE 0x02            /* RDR'ed port uses range */
        !          1086:
        !          1087: /* Reasons code for passing/dropping a packet */
        !          1088: #define PFRES_MATCH    0               /* Explicit match of a rule */
        !          1089: #define PFRES_BADOFF   1               /* Bad offset for pull_hdr */
        !          1090: #define PFRES_FRAG     2               /* Dropping following fragment */
        !          1091: #define PFRES_SHORT    3               /* Dropping short packet */
        !          1092: #define PFRES_NORM     4               /* Dropping by normalizer */
        !          1093: #define PFRES_MEMORY   5               /* Dropped due to lacking mem */
        !          1094: #define PFRES_TS       6               /* Bad TCP Timestamp (RFC1323) */
        !          1095: #define PFRES_CONGEST  7               /* Congestion (of ipintrq) */
        !          1096: #define PFRES_IPOPTIONS 8              /* IP option */
        !          1097: #define PFRES_PROTCKSUM 9              /* Protocol checksum invalid */
        !          1098: #define PFRES_BADSTATE 10              /* State mismatch */
        !          1099: #define PFRES_STATEINS 11              /* State insertion failure */
        !          1100: #define PFRES_MAXSTATES        12              /* State limit */
        !          1101: #define PFRES_SRCLIMIT 13              /* Source node/conn limit */
        !          1102: #define PFRES_SYNPROXY 14              /* SYN proxy */
        !          1103: #define PFRES_MAX      15              /* total+1 */
        !          1104:
        !          1105: #define PFRES_NAMES { \
        !          1106:        "match", \
        !          1107:        "bad-offset", \
        !          1108:        "fragment", \
        !          1109:        "short", \
        !          1110:        "normalize", \
        !          1111:        "memory", \
        !          1112:        "bad-timestamp", \
        !          1113:        "congestion", \
        !          1114:        "ip-option", \
        !          1115:        "proto-cksum", \
        !          1116:        "state-mismatch", \
        !          1117:        "state-insert", \
        !          1118:        "state-limit", \
        !          1119:        "src-limit", \
        !          1120:        "synproxy", \
        !          1121:        NULL \
        !          1122: }
        !          1123:
        !          1124: /* Counters for other things we want to keep track of */
        !          1125: #define LCNT_STATES            0       /* states */
        !          1126: #define LCNT_SRCSTATES         1       /* max-src-states */
        !          1127: #define LCNT_SRCNODES          2       /* max-src-nodes */
        !          1128: #define LCNT_SRCCONN           3       /* max-src-conn */
        !          1129: #define LCNT_SRCCONNRATE       4       /* max-src-conn-rate */
        !          1130: #define LCNT_OVERLOAD_TABLE    5       /* entry added to overload table */
        !          1131: #define LCNT_OVERLOAD_FLUSH    6       /* state entries flushed */
        !          1132: #define LCNT_MAX               7       /* total+1 */
        !          1133:
        !          1134: #define LCNT_NAMES { \
        !          1135:        "max states per rule", \
        !          1136:        "max-src-states", \
        !          1137:        "max-src-nodes", \
        !          1138:        "max-src-conn", \
        !          1139:        "max-src-conn-rate", \
        !          1140:        "overload table insertion", \
        !          1141:        "overload flush states", \
        !          1142:        NULL \
        !          1143: }
        !          1144:
        !          1145: /* UDP state enumeration */
        !          1146: #define PFUDPS_NO_TRAFFIC      0
        !          1147: #define PFUDPS_SINGLE          1
        !          1148: #define PFUDPS_MULTIPLE                2
        !          1149:
        !          1150: #define PFUDPS_NSTATES         3       /* number of state levels */
        !          1151:
        !          1152: #define PFUDPS_NAMES { \
        !          1153:        "NO_TRAFFIC", \
        !          1154:        "SINGLE", \
        !          1155:        "MULTIPLE", \
        !          1156:        NULL \
        !          1157: }
        !          1158:
        !          1159: /* Other protocol state enumeration */
        !          1160: #define PFOTHERS_NO_TRAFFIC    0
        !          1161: #define PFOTHERS_SINGLE                1
        !          1162: #define PFOTHERS_MULTIPLE      2
        !          1163:
        !          1164: #define PFOTHERS_NSTATES       3       /* number of state levels */
        !          1165:
        !          1166: #define PFOTHERS_NAMES { \
        !          1167:        "NO_TRAFFIC", \
        !          1168:        "SINGLE", \
        !          1169:        "MULTIPLE", \
        !          1170:        NULL \
        !          1171: }
        !          1172:
        !          1173: #define FCNT_STATE_SEARCH      0
        !          1174: #define FCNT_STATE_INSERT      1
        !          1175: #define FCNT_STATE_REMOVALS    2
        !          1176: #define FCNT_MAX               3
        !          1177:
        !          1178: #define SCNT_SRC_NODE_SEARCH   0
        !          1179: #define SCNT_SRC_NODE_INSERT   1
        !          1180: #define SCNT_SRC_NODE_REMOVALS 2
        !          1181: #define SCNT_MAX               3
        !          1182:
        !          1183: #define ACTION_SET(a, x) \
        !          1184:        do { \
        !          1185:                if ((a) != NULL) \
        !          1186:                        *(a) = (x); \
        !          1187:        } while (0)
        !          1188:
        !          1189: #define REASON_SET(a, x) \
        !          1190:        do { \
        !          1191:                if ((a) != NULL) \
        !          1192:                        *(a) = (x); \
        !          1193:                if (x < PFRES_MAX) \
        !          1194:                        pf_status.counters[x]++; \
        !          1195:        } while (0)
        !          1196:
        !          1197: struct pf_status {
        !          1198:        u_int64_t       counters[PFRES_MAX];
        !          1199:        u_int64_t       lcounters[LCNT_MAX];    /* limit counters */
        !          1200:        u_int64_t       fcounters[FCNT_MAX];
        !          1201:        u_int64_t       scounters[SCNT_MAX];
        !          1202:        u_int64_t       pcounters[2][2][3];
        !          1203:        u_int64_t       bcounters[2][2];
        !          1204:        u_int64_t       stateid;
        !          1205:        u_int32_t       running;
        !          1206:        u_int32_t       states;
        !          1207:        u_int32_t       src_nodes;
        !          1208:        u_int32_t       since;
        !          1209:        u_int32_t       debug;
        !          1210:        u_int32_t       hostid;
        !          1211:        char            ifname[IFNAMSIZ];
        !          1212:        u_int8_t        pf_chksum[PF_MD5_DIGEST_LENGTH];
        !          1213: };
        !          1214:
        !          1215: struct cbq_opts {
        !          1216:        u_int           minburst;
        !          1217:        u_int           maxburst;
        !          1218:        u_int           pktsize;
        !          1219:        u_int           maxpktsize;
        !          1220:        u_int           ns_per_byte;
        !          1221:        u_int           maxidle;
        !          1222:        int             minidle;
        !          1223:        u_int           offtime;
        !          1224:        int             flags;
        !          1225: };
        !          1226:
        !          1227: struct priq_opts {
        !          1228:        int             flags;
        !          1229: };
        !          1230:
        !          1231: struct hfsc_opts {
        !          1232:        /* real-time service curve */
        !          1233:        u_int           rtsc_m1;        /* slope of the 1st segment in bps */
        !          1234:        u_int           rtsc_d;         /* the x-projection of m1 in msec */
        !          1235:        u_int           rtsc_m2;        /* slope of the 2nd segment in bps */
        !          1236:        /* link-sharing service curve */
        !          1237:        u_int           lssc_m1;
        !          1238:        u_int           lssc_d;
        !          1239:        u_int           lssc_m2;
        !          1240:        /* upper-limit service curve */
        !          1241:        u_int           ulsc_m1;
        !          1242:        u_int           ulsc_d;
        !          1243:        u_int           ulsc_m2;
        !          1244:        int             flags;
        !          1245: };
        !          1246:
        !          1247: struct pf_altq {
        !          1248:        char                     ifname[IFNAMSIZ];
        !          1249:
        !          1250:        void                    *altq_disc;     /* discipline-specific state */
        !          1251:        TAILQ_ENTRY(pf_altq)     entries;
        !          1252:
        !          1253:        /* scheduler spec */
        !          1254:        u_int8_t                 scheduler;     /* scheduler type */
        !          1255:        u_int16_t                tbrsize;       /* tokenbucket regulator size */
        !          1256:        u_int32_t                ifbandwidth;   /* interface bandwidth */
        !          1257:
        !          1258:        /* queue spec */
        !          1259:        char                     qname[PF_QNAME_SIZE];  /* queue name */
        !          1260:        char                     parent[PF_QNAME_SIZE]; /* parent name */
        !          1261:        u_int32_t                parent_qid;    /* parent queue id */
        !          1262:        u_int32_t                bandwidth;     /* queue bandwidth */
        !          1263:        u_int8_t                 priority;      /* priority */
        !          1264:        u_int16_t                qlimit;        /* queue size limit */
        !          1265:        u_int16_t                flags;         /* misc flags */
        !          1266:        union {
        !          1267:                struct cbq_opts          cbq_opts;
        !          1268:                struct priq_opts         priq_opts;
        !          1269:                struct hfsc_opts         hfsc_opts;
        !          1270:        } pq_u;
        !          1271:
        !          1272:        u_int32_t                qid;           /* return value */
        !          1273: };
        !          1274:
        !          1275: struct pf_tag {
        !          1276:        u_int16_t       tag;            /* tag id */
        !          1277: };
        !          1278:
        !          1279: struct pf_tagname {
        !          1280:        TAILQ_ENTRY(pf_tagname) entries;
        !          1281:        char                    name[PF_TAG_NAME_SIZE];
        !          1282:        u_int16_t               tag;
        !          1283:        int                     ref;
        !          1284: };
        !          1285:
        !          1286: #define PFFRAG_FRENT_HIWAT     5000    /* Number of fragment entries */
        !          1287: #define PFFRAG_FRAG_HIWAT      1000    /* Number of fragmented packets */
        !          1288: #define PFFRAG_FRCENT_HIWAT    50000   /* Number of fragment cache entries */
        !          1289: #define PFFRAG_FRCACHE_HIWAT   10000   /* Number of fragment descriptors */
        !          1290:
        !          1291: #define PFR_KTABLE_HIWAT       1000    /* Number of tables */
        !          1292: #define PFR_KENTRY_HIWAT       200000  /* Number of table entries */
        !          1293: #define PFR_KENTRY_HIWAT_SMALL 100000  /* Number of table entries (tiny hosts) */
        !          1294:
        !          1295: /*
        !          1296:  * ioctl parameter structures
        !          1297:  */
        !          1298:
        !          1299: struct pfioc_pooladdr {
        !          1300:        u_int32_t                action;
        !          1301:        u_int32_t                ticket;
        !          1302:        u_int32_t                nr;
        !          1303:        u_int32_t                r_num;
        !          1304:        u_int8_t                 r_action;
        !          1305:        u_int8_t                 r_last;
        !          1306:        u_int8_t                 af;
        !          1307:        char                     anchor[MAXPATHLEN];
        !          1308:        struct pf_pooladdr       addr;
        !          1309: };
        !          1310:
        !          1311: struct pfioc_rule {
        !          1312:        u_int32_t        action;
        !          1313:        u_int32_t        ticket;
        !          1314:        u_int32_t        pool_ticket;
        !          1315:        u_int32_t        nr;
        !          1316:        char             anchor[MAXPATHLEN];
        !          1317:        char             anchor_call[MAXPATHLEN];
        !          1318:        struct pf_rule   rule;
        !          1319: };
        !          1320:
        !          1321: struct pfioc_natlook {
        !          1322:        struct pf_addr   saddr;
        !          1323:        struct pf_addr   daddr;
        !          1324:        struct pf_addr   rsaddr;
        !          1325:        struct pf_addr   rdaddr;
        !          1326:        u_int16_t        sport;
        !          1327:        u_int16_t        dport;
        !          1328:        u_int16_t        rsport;
        !          1329:        u_int16_t        rdport;
        !          1330:        sa_family_t      af;
        !          1331:        u_int8_t         proto;
        !          1332:        u_int8_t         direction;
        !          1333: };
        !          1334:
        !          1335: struct pfioc_state {
        !          1336:        u_int32_t        nr;
        !          1337:        void            *state;
        !          1338: };
        !          1339:
        !          1340: struct pfioc_src_node_kill {
        !          1341:        /* XXX returns the number of src nodes killed in psnk_af */
        !          1342:        sa_family_t psnk_af;
        !          1343:        struct pf_rule_addr psnk_src;
        !          1344:        struct pf_rule_addr psnk_dst;
        !          1345: };
        !          1346:
        !          1347: struct pfioc_state_kill {
        !          1348:        /* XXX returns the number of states killed in psk_af */
        !          1349:        sa_family_t             psk_af;
        !          1350:        int                     psk_proto;
        !          1351:        struct pf_rule_addr     psk_src;
        !          1352:        struct pf_rule_addr     psk_dst;
        !          1353:        char                    psk_ifname[IFNAMSIZ];
        !          1354: };
        !          1355:
        !          1356: struct pfioc_states {
        !          1357:        int     ps_len;
        !          1358:        union {
        !          1359:                caddr_t                  psu_buf;
        !          1360:                struct pfsync_state     *psu_states;
        !          1361:        } ps_u;
        !          1362: #define ps_buf         ps_u.psu_buf
        !          1363: #define ps_states      ps_u.psu_states
        !          1364: };
        !          1365:
        !          1366: struct pfioc_src_nodes {
        !          1367:        int     psn_len;
        !          1368:        union {
        !          1369:                caddr_t          psu_buf;
        !          1370:                struct pf_src_node      *psu_src_nodes;
        !          1371:        } psn_u;
        !          1372: #define psn_buf                psn_u.psu_buf
        !          1373: #define psn_src_nodes  psn_u.psu_src_nodes
        !          1374: };
        !          1375:
        !          1376: struct pfioc_if {
        !          1377:        char             ifname[IFNAMSIZ];
        !          1378: };
        !          1379:
        !          1380: struct pfioc_tm {
        !          1381:        int              timeout;
        !          1382:        int              seconds;
        !          1383: };
        !          1384:
        !          1385: struct pfioc_limit {
        !          1386:        int              index;
        !          1387:        unsigned         limit;
        !          1388: };
        !          1389:
        !          1390: struct pfioc_altq {
        !          1391:        u_int32_t        action;
        !          1392:        u_int32_t        ticket;
        !          1393:        u_int32_t        nr;
        !          1394:        struct pf_altq   altq;
        !          1395: };
        !          1396:
        !          1397: struct pfioc_qstats {
        !          1398:        u_int32_t        ticket;
        !          1399:        u_int32_t        nr;
        !          1400:        void            *buf;
        !          1401:        int              nbytes;
        !          1402:        u_int8_t         scheduler;
        !          1403: };
        !          1404:
        !          1405: struct pfioc_ruleset {
        !          1406:        u_int32_t        nr;
        !          1407:        char             path[MAXPATHLEN];
        !          1408:        char             name[PF_ANCHOR_NAME_SIZE];
        !          1409: };
        !          1410:
        !          1411: #define PF_RULESET_ALTQ                (PF_RULESET_MAX)
        !          1412: #define PF_RULESET_TABLE       (PF_RULESET_MAX+1)
        !          1413: struct pfioc_trans {
        !          1414:        int              size;  /* number of elements */
        !          1415:        int              esize; /* size of each element in bytes */
        !          1416:        struct pfioc_trans_e {
        !          1417:                int             rs_num;
        !          1418:                char            anchor[MAXPATHLEN];
        !          1419:                u_int32_t       ticket;
        !          1420:        }               *array;
        !          1421: };
        !          1422:
        !          1423: #define PFR_FLAG_ATOMIC                0x00000001
        !          1424: #define PFR_FLAG_DUMMY         0x00000002
        !          1425: #define PFR_FLAG_FEEDBACK      0x00000004
        !          1426: #define PFR_FLAG_CLSTATS       0x00000008
        !          1427: #define PFR_FLAG_ADDRSTOO      0x00000010
        !          1428: #define PFR_FLAG_REPLACE       0x00000020
        !          1429: #define PFR_FLAG_ALLRSETS      0x00000040
        !          1430: #define PFR_FLAG_ALLMASK       0x0000007F
        !          1431: #ifdef _KERNEL
        !          1432: #define PFR_FLAG_USERIOCTL     0x10000000
        !          1433: #endif
        !          1434:
        !          1435: struct pfioc_table {
        !          1436:        struct pfr_table         pfrio_table;
        !          1437:        void                    *pfrio_buffer;
        !          1438:        int                      pfrio_esize;
        !          1439:        int                      pfrio_size;
        !          1440:        int                      pfrio_size2;
        !          1441:        int                      pfrio_nadd;
        !          1442:        int                      pfrio_ndel;
        !          1443:        int                      pfrio_nchange;
        !          1444:        int                      pfrio_flags;
        !          1445:        u_int32_t                pfrio_ticket;
        !          1446: };
        !          1447: #define        pfrio_exists    pfrio_nadd
        !          1448: #define        pfrio_nzero     pfrio_nadd
        !          1449: #define        pfrio_nmatch    pfrio_nadd
        !          1450: #define pfrio_naddr    pfrio_size2
        !          1451: #define pfrio_setflag  pfrio_size2
        !          1452: #define pfrio_clrflag  pfrio_nadd
        !          1453:
        !          1454: struct pfioc_iface {
        !          1455:        char     pfiio_name[IFNAMSIZ];
        !          1456:        void    *pfiio_buffer;
        !          1457:        int      pfiio_esize;
        !          1458:        int      pfiio_size;
        !          1459:        int      pfiio_nzero;
        !          1460:        int      pfiio_flags;
        !          1461: };
        !          1462:
        !          1463:
        !          1464: /*
        !          1465:  * ioctl operations
        !          1466:  */
        !          1467:
        !          1468: #define DIOCSTART      _IO  ('D',  1)
        !          1469: #define DIOCSTOP       _IO  ('D',  2)
        !          1470: #define DIOCADDRULE    _IOWR('D',  4, struct pfioc_rule)
        !          1471: #define DIOCGETRULES   _IOWR('D',  6, struct pfioc_rule)
        !          1472: #define DIOCGETRULE    _IOWR('D',  7, struct pfioc_rule)
        !          1473: /* XXX cut 8 - 17 */
        !          1474: #define DIOCCLRSTATES  _IOWR('D', 18, struct pfioc_state_kill)
        !          1475: #define DIOCGETSTATE   _IOWR('D', 19, struct pfioc_state)
        !          1476: #define DIOCSETSTATUSIF _IOWR('D', 20, struct pfioc_if)
        !          1477: #define DIOCGETSTATUS  _IOWR('D', 21, struct pf_status)
        !          1478: #define DIOCCLRSTATUS  _IO  ('D', 22)
        !          1479: #define DIOCNATLOOK    _IOWR('D', 23, struct pfioc_natlook)
        !          1480: #define DIOCSETDEBUG   _IOWR('D', 24, u_int32_t)
        !          1481: #define DIOCGETSTATES  _IOWR('D', 25, struct pfioc_states)
        !          1482: #define DIOCCHANGERULE _IOWR('D', 26, struct pfioc_rule)
        !          1483: /* XXX cut 26 - 28 */
        !          1484: #define DIOCSETTIMEOUT _IOWR('D', 29, struct pfioc_tm)
        !          1485: #define DIOCGETTIMEOUT _IOWR('D', 30, struct pfioc_tm)
        !          1486: #define DIOCADDSTATE   _IOWR('D', 37, struct pfioc_state)
        !          1487: #define DIOCCLRRULECTRS        _IO  ('D', 38)
        !          1488: #define DIOCGETLIMIT   _IOWR('D', 39, struct pfioc_limit)
        !          1489: #define DIOCSETLIMIT   _IOWR('D', 40, struct pfioc_limit)
        !          1490: #define DIOCKILLSTATES _IOWR('D', 41, struct pfioc_state_kill)
        !          1491: #define DIOCSTARTALTQ  _IO  ('D', 42)
        !          1492: #define DIOCSTOPALTQ   _IO  ('D', 43)
        !          1493: #define DIOCADDALTQ    _IOWR('D', 45, struct pfioc_altq)
        !          1494: #define DIOCGETALTQS   _IOWR('D', 47, struct pfioc_altq)
        !          1495: #define DIOCGETALTQ    _IOWR('D', 48, struct pfioc_altq)
        !          1496: #define DIOCCHANGEALTQ _IOWR('D', 49, struct pfioc_altq)
        !          1497: #define DIOCGETQSTATS  _IOWR('D', 50, struct pfioc_qstats)
        !          1498: #define DIOCBEGINADDRS _IOWR('D', 51, struct pfioc_pooladdr)
        !          1499: #define DIOCADDADDR    _IOWR('D', 52, struct pfioc_pooladdr)
        !          1500: #define DIOCGETADDRS   _IOWR('D', 53, struct pfioc_pooladdr)
        !          1501: #define DIOCGETADDR    _IOWR('D', 54, struct pfioc_pooladdr)
        !          1502: #define DIOCCHANGEADDR _IOWR('D', 55, struct pfioc_pooladdr)
        !          1503: /* XXX cut 55 - 57 */
        !          1504: #define        DIOCGETRULESETS _IOWR('D', 58, struct pfioc_ruleset)
        !          1505: #define        DIOCGETRULESET  _IOWR('D', 59, struct pfioc_ruleset)
        !          1506: #define        DIOCRCLRTABLES  _IOWR('D', 60, struct pfioc_table)
        !          1507: #define        DIOCRADDTABLES  _IOWR('D', 61, struct pfioc_table)
        !          1508: #define        DIOCRDELTABLES  _IOWR('D', 62, struct pfioc_table)
        !          1509: #define        DIOCRGETTABLES  _IOWR('D', 63, struct pfioc_table)
        !          1510: #define        DIOCRGETTSTATS  _IOWR('D', 64, struct pfioc_table)
        !          1511: #define DIOCRCLRTSTATS  _IOWR('D', 65, struct pfioc_table)
        !          1512: #define        DIOCRCLRADDRS   _IOWR('D', 66, struct pfioc_table)
        !          1513: #define        DIOCRADDADDRS   _IOWR('D', 67, struct pfioc_table)
        !          1514: #define        DIOCRDELADDRS   _IOWR('D', 68, struct pfioc_table)
        !          1515: #define        DIOCRSETADDRS   _IOWR('D', 69, struct pfioc_table)
        !          1516: #define        DIOCRGETADDRS   _IOWR('D', 70, struct pfioc_table)
        !          1517: #define        DIOCRGETASTATS  _IOWR('D', 71, struct pfioc_table)
        !          1518: #define DIOCRCLRASTATS  _IOWR('D', 72, struct pfioc_table)
        !          1519: #define        DIOCRTSTADDRS   _IOWR('D', 73, struct pfioc_table)
        !          1520: #define        DIOCRSETTFLAGS  _IOWR('D', 74, struct pfioc_table)
        !          1521: #define DIOCRINADEFINE _IOWR('D', 77, struct pfioc_table)
        !          1522: #define DIOCOSFPFLUSH  _IO('D', 78)
        !          1523: #define DIOCOSFPADD    _IOWR('D', 79, struct pf_osfp_ioctl)
        !          1524: #define DIOCOSFPGET    _IOWR('D', 80, struct pf_osfp_ioctl)
        !          1525: #define DIOCXBEGIN      _IOWR('D', 81, struct pfioc_trans)
        !          1526: #define DIOCXCOMMIT     _IOWR('D', 82, struct pfioc_trans)
        !          1527: #define DIOCXROLLBACK   _IOWR('D', 83, struct pfioc_trans)
        !          1528: #define DIOCGETSRCNODES        _IOWR('D', 84, struct pfioc_src_nodes)
        !          1529: #define DIOCCLRSRCNODES        _IO('D', 85)
        !          1530: #define DIOCSETHOSTID  _IOWR('D', 86, u_int32_t)
        !          1531: #define DIOCIGETIFACES _IOWR('D', 87, struct pfioc_iface)
        !          1532: #define DIOCSETIFFLAG  _IOWR('D', 89, struct pfioc_iface)
        !          1533: #define DIOCCLRIFFLAG  _IOWR('D', 90, struct pfioc_iface)
        !          1534: #define DIOCKILLSRCNODES       _IOWR('D', 91, struct pfioc_src_node_kill)
        !          1535:
        !          1536: #ifdef _KERNEL
        !          1537: RB_HEAD(pf_src_tree, pf_src_node);
        !          1538: RB_PROTOTYPE(pf_src_tree, pf_src_node, entry, pf_src_compare);
        !          1539: extern struct pf_src_tree tree_src_tracking;
        !          1540:
        !          1541: RB_HEAD(pf_state_tree_id, pf_state);
        !          1542: RB_PROTOTYPE(pf_state_tree_id, pf_state,
        !          1543:     entry_id, pf_state_compare_id);
        !          1544: extern struct pf_state_tree_id tree_id;
        !          1545: extern struct pf_state_queue state_list;
        !          1546:
        !          1547: TAILQ_HEAD(pf_poolqueue, pf_pool);
        !          1548: extern struct pf_poolqueue               pf_pools[2];
        !          1549: TAILQ_HEAD(pf_altqqueue, pf_altq);
        !          1550: extern struct pf_altqqueue               pf_altqs[2];
        !          1551: extern struct pf_palist                          pf_pabuf;
        !          1552:
        !          1553: extern u_int32_t                ticket_altqs_active;
        !          1554: extern u_int32_t                ticket_altqs_inactive;
        !          1555: extern int                      altqs_inactive_open;
        !          1556: extern u_int32_t                ticket_pabuf;
        !          1557: extern struct pf_altqqueue     *pf_altqs_active;
        !          1558: extern struct pf_altqqueue     *pf_altqs_inactive;
        !          1559: extern struct pf_poolqueue     *pf_pools_active;
        !          1560: extern struct pf_poolqueue     *pf_pools_inactive;
        !          1561: extern int                      pf_tbladdr_setup(struct pf_ruleset *,
        !          1562:                                    struct pf_addr_wrap *);
        !          1563: extern void                     pf_tbladdr_remove(struct pf_addr_wrap *);
        !          1564: extern void                     pf_tbladdr_copyout(struct pf_addr_wrap *);
        !          1565: extern void                     pf_calc_skip_steps(struct pf_rulequeue *);
        !          1566: extern struct pool              pf_src_tree_pl, pf_rule_pl;
        !          1567: extern struct pool              pf_state_pl, pf_state_key_pl, pf_altq_pl,
        !          1568:                                    pf_pooladdr_pl;
        !          1569: extern struct pool              pf_state_scrub_pl;
        !          1570: extern void                     pf_purge_thread(void *);
        !          1571: extern void                     pf_purge_expired_src_nodes(int);
        !          1572: extern void                     pf_purge_expired_states(u_int32_t);
        !          1573: extern void                     pf_unlink_state(struct pf_state *);
        !          1574: extern void                     pf_free_state(struct pf_state *);
        !          1575: extern int                      pf_insert_state(struct pfi_kif *,
        !          1576:                                    struct pf_state *);
        !          1577: extern int                      pf_insert_src_node(struct pf_src_node **,
        !          1578:                                    struct pf_rule *, struct pf_addr *,
        !          1579:                                    sa_family_t);
        !          1580: void                            pf_src_tree_remove_state(struct pf_state *);
        !          1581: extern struct pf_state         *pf_find_state_byid(struct pf_state_cmp *);
        !          1582: extern struct pf_state         *pf_find_state_all(struct pf_state_key_cmp *,
        !          1583:                                    u_int8_t, int *);
        !          1584: extern void                     pf_print_state(struct pf_state *);
        !          1585: extern void                     pf_print_flags(u_int8_t);
        !          1586: extern u_int16_t                pf_cksum_fixup(u_int16_t, u_int16_t, u_int16_t,
        !          1587:                                    u_int8_t);
        !          1588:
        !          1589: extern struct ifnet            *sync_ifp;
        !          1590: extern struct pf_rule           pf_default_rule;
        !          1591: extern void                     pf_addrcpy(struct pf_addr *, struct pf_addr *,
        !          1592:                                    u_int8_t);
        !          1593: void                            pf_rm_rule(struct pf_rulequeue *,
        !          1594:                                    struct pf_rule *);
        !          1595:
        !          1596: #ifdef INET
        !          1597: int    pf_test(int, struct ifnet *, struct mbuf **, struct ether_header *);
        !          1598: #endif /* INET */
        !          1599:
        !          1600: #ifdef INET6
        !          1601: int    pf_test6(int, struct ifnet *, struct mbuf **, struct ether_header *);
        !          1602: void   pf_poolmask(struct pf_addr *, struct pf_addr*,
        !          1603:            struct pf_addr *, struct pf_addr *, u_int8_t);
        !          1604: void   pf_addr_inc(struct pf_addr *, sa_family_t);
        !          1605: #endif /* INET6 */
        !          1606:
        !          1607: void   *pf_pull_hdr(struct mbuf *, int, void *, int, u_short *, u_short *,
        !          1608:            sa_family_t);
        !          1609: void   pf_change_a(void *, u_int16_t *, u_int32_t, u_int8_t);
        !          1610: int    pflog_packet(struct pfi_kif *, struct mbuf *, sa_family_t, u_int8_t,
        !          1611:            u_int8_t, struct pf_rule *, struct pf_rule *, struct pf_ruleset *,
        !          1612:            struct pf_pdesc *);
        !          1613: int    pf_match_addr(u_int8_t, struct pf_addr *, struct pf_addr *,
        !          1614:            struct pf_addr *, sa_family_t);
        !          1615: int    pf_match(u_int8_t, u_int32_t, u_int32_t, u_int32_t);
        !          1616: int    pf_match_port(u_int8_t, u_int16_t, u_int16_t, u_int16_t);
        !          1617: int    pf_match_uid(u_int8_t, uid_t, uid_t, uid_t);
        !          1618: int    pf_match_gid(u_int8_t, gid_t, gid_t, gid_t);
        !          1619:
        !          1620: void   pf_normalize_init(void);
        !          1621: int    pf_normalize_ip(struct mbuf **, int, struct pfi_kif *, u_short *,
        !          1622:            struct pf_pdesc *);
        !          1623: int    pf_normalize_ip6(struct mbuf **, int, struct pfi_kif *, u_short *,
        !          1624:            struct pf_pdesc *);
        !          1625: int    pf_normalize_tcp(int, struct pfi_kif *, struct mbuf *, int, int, void *,
        !          1626:            struct pf_pdesc *);
        !          1627: void   pf_normalize_tcp_cleanup(struct pf_state *);
        !          1628: int    pf_normalize_tcp_init(struct mbuf *, int, struct pf_pdesc *,
        !          1629:            struct tcphdr *, struct pf_state_peer *, struct pf_state_peer *);
        !          1630: int    pf_normalize_tcp_stateful(struct mbuf *, int, struct pf_pdesc *,
        !          1631:            u_short *, struct tcphdr *, struct pf_state *,
        !          1632:            struct pf_state_peer *, struct pf_state_peer *, int *);
        !          1633: u_int32_t
        !          1634:        pf_state_expires(const struct pf_state *);
        !          1635: void   pf_purge_expired_fragments(void);
        !          1636: int    pf_routable(struct pf_addr *addr, sa_family_t af, struct pfi_kif *);
        !          1637: int    pf_rtlabel_match(struct pf_addr *, sa_family_t, struct pf_addr_wrap *);
        !          1638: int    pf_socket_lookup(int, struct pf_pdesc *);
        !          1639: struct pf_state_key *
        !          1640:        pf_alloc_state_key(struct pf_state *);
        !          1641: void   pfr_initialize(void);
        !          1642: int    pfr_match_addr(struct pfr_ktable *, struct pf_addr *, sa_family_t);
        !          1643: void   pfr_update_stats(struct pfr_ktable *, struct pf_addr *, sa_family_t,
        !          1644:            u_int64_t, int, int, int);
        !          1645: int    pfr_pool_get(struct pfr_ktable *, int *, struct pf_addr *,
        !          1646:            struct pf_addr **, struct pf_addr **, sa_family_t);
        !          1647: void   pfr_dynaddr_update(struct pfr_ktable *, struct pfi_dynaddr *);
        !          1648: struct pfr_ktable *
        !          1649:        pfr_attach_table(struct pf_ruleset *, char *);
        !          1650: void   pfr_detach_table(struct pfr_ktable *);
        !          1651: int    pfr_clr_tables(struct pfr_table *, int *, int);
        !          1652: int    pfr_add_tables(struct pfr_table *, int, int *, int);
        !          1653: int    pfr_del_tables(struct pfr_table *, int, int *, int);
        !          1654: int    pfr_get_tables(struct pfr_table *, struct pfr_table *, int *, int);
        !          1655: int    pfr_get_tstats(struct pfr_table *, struct pfr_tstats *, int *, int);
        !          1656: int    pfr_clr_tstats(struct pfr_table *, int, int *, int);
        !          1657: int    pfr_set_tflags(struct pfr_table *, int, int, int, int *, int *, int);
        !          1658: int    pfr_clr_addrs(struct pfr_table *, int *, int);
        !          1659: int    pfr_insert_kentry(struct pfr_ktable *, struct pfr_addr *, long);
        !          1660: int    pfr_add_addrs(struct pfr_table *, struct pfr_addr *, int, int *,
        !          1661:            int);
        !          1662: int    pfr_del_addrs(struct pfr_table *, struct pfr_addr *, int, int *,
        !          1663:            int);
        !          1664: int    pfr_set_addrs(struct pfr_table *, struct pfr_addr *, int, int *,
        !          1665:            int *, int *, int *, int, u_int32_t);
        !          1666: int    pfr_get_addrs(struct pfr_table *, struct pfr_addr *, int *, int);
        !          1667: int    pfr_get_astats(struct pfr_table *, struct pfr_astats *, int *, int);
        !          1668: int    pfr_clr_astats(struct pfr_table *, struct pfr_addr *, int, int *,
        !          1669:            int);
        !          1670: int    pfr_tst_addrs(struct pfr_table *, struct pfr_addr *, int, int *,
        !          1671:            int);
        !          1672: int    pfr_ina_begin(struct pfr_table *, u_int32_t *, int *, int);
        !          1673: int    pfr_ina_rollback(struct pfr_table *, u_int32_t, int *, int);
        !          1674: int    pfr_ina_commit(struct pfr_table *, u_int32_t, int *, int *, int);
        !          1675: int    pfr_ina_define(struct pfr_table *, struct pfr_addr *, int, int *,
        !          1676:            int *, u_int32_t, int);
        !          1677:
        !          1678: extern struct pfi_kif          *pfi_all;
        !          1679:
        !          1680: void            pfi_initialize(void);
        !          1681: struct pfi_kif *pfi_kif_get(const char *);
        !          1682: void            pfi_kif_ref(struct pfi_kif *, enum pfi_kif_refs);
        !          1683: void            pfi_kif_unref(struct pfi_kif *, enum pfi_kif_refs);
        !          1684: int             pfi_kif_match(struct pfi_kif *, struct pfi_kif *);
        !          1685: void            pfi_attach_ifnet(struct ifnet *);
        !          1686: void            pfi_detach_ifnet(struct ifnet *);
        !          1687: void            pfi_attach_ifgroup(struct ifg_group *);
        !          1688: void            pfi_detach_ifgroup(struct ifg_group *);
        !          1689: void            pfi_group_change(const char *);
        !          1690: int             pfi_match_addr(struct pfi_dynaddr *, struct pf_addr *,
        !          1691:                    sa_family_t);
        !          1692: int             pfi_dynaddr_setup(struct pf_addr_wrap *, sa_family_t);
        !          1693: void            pfi_dynaddr_remove(struct pf_addr_wrap *);
        !          1694: void            pfi_dynaddr_copyout(struct pf_addr_wrap *);
        !          1695: void            pfi_fill_oldstatus(struct pf_status *);
        !          1696: int             pfi_clr_istats(const char *);
        !          1697: int             pfi_get_ifaces(const char *, struct pfi_kif *, int *);
        !          1698: int             pfi_set_flags(const char *, int);
        !          1699: int             pfi_clear_flags(const char *, int);
        !          1700:
        !          1701: u_int16_t       pf_tagname2tag(char *);
        !          1702: void            pf_tag2tagname(u_int16_t, char *);
        !          1703: void            pf_tag_ref(u_int16_t);
        !          1704: void            pf_tag_unref(u_int16_t);
        !          1705: int             pf_tag_packet(struct mbuf *, int, int);
        !          1706: u_int32_t       pf_qname2qid(char *);
        !          1707: void            pf_qid2qname(u_int32_t, char *);
        !          1708: void            pf_qid_unref(u_int32_t);
        !          1709:
        !          1710: extern struct pf_status        pf_status;
        !          1711: extern struct pool     pf_frent_pl, pf_frag_pl;
        !          1712: extern struct rwlock   pf_consistency_lock;
        !          1713:
        !          1714: struct pf_pool_limit {
        !          1715:        void            *pp;
        !          1716:        unsigned         limit;
        !          1717: };
        !          1718: extern struct pf_pool_limit    pf_pool_limits[PF_LIMIT_MAX];
        !          1719:
        !          1720: #endif /* _KERNEL */
        !          1721:
        !          1722: extern struct pf_anchor_global  pf_anchors;
        !          1723: extern struct pf_anchor        pf_main_anchor;
        !          1724: #define pf_main_ruleset        pf_main_anchor.ruleset
        !          1725:
        !          1726: /* these ruleset functions can be linked into userland programs (pfctl) */
        !          1727: int                     pf_get_ruleset_number(u_int8_t);
        !          1728: void                    pf_init_ruleset(struct pf_ruleset *);
        !          1729: int                     pf_anchor_setup(struct pf_rule *,
        !          1730:                            const struct pf_ruleset *, const char *);
        !          1731: int                     pf_anchor_copyout(const struct pf_ruleset *,
        !          1732:                            const struct pf_rule *, struct pfioc_rule *);
        !          1733: void                    pf_anchor_remove(struct pf_rule *);
        !          1734: void                    pf_remove_if_empty_ruleset(struct pf_ruleset *);
        !          1735: struct pf_anchor       *pf_find_anchor(const char *);
        !          1736: struct pf_ruleset      *pf_find_ruleset(const char *);
        !          1737: struct pf_ruleset      *pf_find_or_create_ruleset(const char *);
        !          1738: void                    pf_rs_initialize(void);
        !          1739:
        !          1740: #ifdef _KERNEL
        !          1741: int                     pf_anchor_copyout(const struct pf_ruleset *,
        !          1742:                            const struct pf_rule *, struct pfioc_rule *);
        !          1743: void                    pf_anchor_remove(struct pf_rule *);
        !          1744:
        !          1745: #endif /* _KERNEL */
        !          1746:
        !          1747: /* The fingerprint functions can be linked into userland programs (tcpdump) */
        !          1748: int    pf_osfp_add(struct pf_osfp_ioctl *);
        !          1749: #ifdef _KERNEL
        !          1750: struct pf_osfp_enlist *
        !          1751:        pf_osfp_fingerprint(struct pf_pdesc *, struct mbuf *, int,
        !          1752:            const struct tcphdr *);
        !          1753: #endif /* _KERNEL */
        !          1754: struct pf_osfp_enlist *
        !          1755:        pf_osfp_fingerprint_hdr(const struct ip *, const struct ip6_hdr *,
        !          1756:            const struct tcphdr *);
        !          1757: void   pf_osfp_flush(void);
        !          1758: int    pf_osfp_get(struct pf_osfp_ioctl *);
        !          1759: void   pf_osfp_initialize(void);
        !          1760: int    pf_osfp_match(struct pf_osfp_enlist *, pf_osfp_t);
        !          1761: struct pf_os_fingerprint *
        !          1762:        pf_osfp_validate(void);
        !          1763:
        !          1764:
        !          1765: #endif /* _NET_PFVAR_H_ */

CVSweb