xref: /xnu-8796.101.5/bsd/net/pfvar.h (revision aca3beaa3dfbd42498b42c5e5ce20a938e6554e5)
1*aca3beaaSApple OSS Distributions /*
2*aca3beaaSApple OSS Distributions  * Copyright (c) 2007-2021 Apple Inc. All rights reserved.
3*aca3beaaSApple OSS Distributions  *
4*aca3beaaSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*aca3beaaSApple OSS Distributions  *
6*aca3beaaSApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*aca3beaaSApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*aca3beaaSApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*aca3beaaSApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*aca3beaaSApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*aca3beaaSApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*aca3beaaSApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*aca3beaaSApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*aca3beaaSApple OSS Distributions  *
15*aca3beaaSApple OSS Distributions  * Please obtain a copy of the License at
16*aca3beaaSApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*aca3beaaSApple OSS Distributions  *
18*aca3beaaSApple OSS Distributions  * The Original Code and all software distributed under the License are
19*aca3beaaSApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*aca3beaaSApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*aca3beaaSApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*aca3beaaSApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*aca3beaaSApple OSS Distributions  * Please see the License for the specific language governing rights and
24*aca3beaaSApple OSS Distributions  * limitations under the License.
25*aca3beaaSApple OSS Distributions  *
26*aca3beaaSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*aca3beaaSApple OSS Distributions  */
28*aca3beaaSApple OSS Distributions 
29*aca3beaaSApple OSS Distributions /*	$apfw: git commit b6bf13f8321283cd7ee82b1795e86506084b1b95 $ */
30*aca3beaaSApple OSS Distributions /*	$OpenBSD: pfvar.h,v 1.259 2007/12/02 12:08:04 pascoe Exp $ */
31*aca3beaaSApple OSS Distributions 
32*aca3beaaSApple OSS Distributions /*
33*aca3beaaSApple OSS Distributions  * Copyright (c) 2001 Daniel Hartmeier
34*aca3beaaSApple OSS Distributions  * NAT64 - Copyright (c) 2010 Viagenie Inc. (http://www.viagenie.ca)
35*aca3beaaSApple OSS Distributions  * All rights reserved.
36*aca3beaaSApple OSS Distributions  *
37*aca3beaaSApple OSS Distributions  * Redistribution and use in source and binary forms, with or without
38*aca3beaaSApple OSS Distributions  * modification, are permitted provided that the following conditions
39*aca3beaaSApple OSS Distributions  * are met:
40*aca3beaaSApple OSS Distributions  *
41*aca3beaaSApple OSS Distributions  *    - Redistributions of source code must retain the above copyright
42*aca3beaaSApple OSS Distributions  *      notice, this list of conditions and the following disclaimer.
43*aca3beaaSApple OSS Distributions  *    - Redistributions in binary form must reproduce the above
44*aca3beaaSApple OSS Distributions  *      copyright notice, this list of conditions and the following
45*aca3beaaSApple OSS Distributions  *      disclaimer in the documentation and/or other materials provided
46*aca3beaaSApple OSS Distributions  *      with the distribution.
47*aca3beaaSApple OSS Distributions  *
48*aca3beaaSApple OSS Distributions  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
49*aca3beaaSApple OSS Distributions  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
50*aca3beaaSApple OSS Distributions  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
51*aca3beaaSApple OSS Distributions  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
52*aca3beaaSApple OSS Distributions  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
53*aca3beaaSApple OSS Distributions  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
54*aca3beaaSApple OSS Distributions  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
55*aca3beaaSApple OSS Distributions  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
56*aca3beaaSApple OSS Distributions  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57*aca3beaaSApple OSS Distributions  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
58*aca3beaaSApple OSS Distributions  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
59*aca3beaaSApple OSS Distributions  * POSSIBILITY OF SUCH DAMAGE.
60*aca3beaaSApple OSS Distributions  *
61*aca3beaaSApple OSS Distributions  */
62*aca3beaaSApple OSS Distributions 
63*aca3beaaSApple OSS Distributions #ifndef _NET_PFVAR_H_
64*aca3beaaSApple OSS Distributions #define _NET_PFVAR_H_
65*aca3beaaSApple OSS Distributions 
66*aca3beaaSApple OSS Distributions #ifdef PRIVATE
67*aca3beaaSApple OSS Distributions /*
68*aca3beaaSApple OSS Distributions  * XXX
69*aca3beaaSApple OSS Distributions  * XXX Private interfaces.  Do not include this file; use pfctl(8) instead.
70*aca3beaaSApple OSS Distributions  * XXX
71*aca3beaaSApple OSS Distributions  */
72*aca3beaaSApple OSS Distributions #if PF || !defined(KERNEL)
73*aca3beaaSApple OSS Distributions 
74*aca3beaaSApple OSS Distributions #ifdef  __cplusplus
75*aca3beaaSApple OSS Distributions extern "C" {
76*aca3beaaSApple OSS Distributions #endif
77*aca3beaaSApple OSS Distributions 
78*aca3beaaSApple OSS Distributions #include <stdbool.h>
79*aca3beaaSApple OSS Distributions #include <sys/param.h>
80*aca3beaaSApple OSS Distributions #include <sys/types.h>
81*aca3beaaSApple OSS Distributions #include <sys/queue.h>
82*aca3beaaSApple OSS Distributions #include <libkern/tree.h>
83*aca3beaaSApple OSS Distributions 
84*aca3beaaSApple OSS Distributions #include <net/radix.h>
85*aca3beaaSApple OSS Distributions #include <netinet/in.h>
86*aca3beaaSApple OSS Distributions #include <net/if_var.h>
87*aca3beaaSApple OSS Distributions #ifdef KERNEL
88*aca3beaaSApple OSS Distributions #include <kern/kern_types.h>
89*aca3beaaSApple OSS Distributions #include <kern/zalloc.h>
90*aca3beaaSApple OSS Distributions #include <kern/locks.h>
91*aca3beaaSApple OSS Distributions 
92*aca3beaaSApple OSS Distributions #include <machine/endian.h>
93*aca3beaaSApple OSS Distributions #include <sys/systm.h>
94*aca3beaaSApple OSS Distributions #include <net/pf_pbuf.h>
95*aca3beaaSApple OSS Distributions 
96*aca3beaaSApple OSS Distributions #if SKYWALK
97*aca3beaaSApple OSS Distributions #include <netinet/in_pcb.h>
98*aca3beaaSApple OSS Distributions #include <skywalk/namespace/netns.h>
99*aca3beaaSApple OSS Distributions #endif
100*aca3beaaSApple OSS Distributions 
101*aca3beaaSApple OSS Distributions #if BYTE_ORDER == BIG_ENDIAN
102*aca3beaaSApple OSS Distributions #define htobe64(x)      (x)
103*aca3beaaSApple OSS Distributions #else /* LITTLE ENDIAN */
104*aca3beaaSApple OSS Distributions #define htobe64(x)      __DARWIN_OSSwapInt64(x)
105*aca3beaaSApple OSS Distributions #endif /* LITTLE_ENDIAN */
106*aca3beaaSApple OSS Distributions 
107*aca3beaaSApple OSS Distributions #define be64toh(x)      htobe64(x)
108*aca3beaaSApple OSS Distributions 
109*aca3beaaSApple OSS Distributions extern lck_rw_t pf_perim_lock;
110*aca3beaaSApple OSS Distributions extern lck_mtx_t pf_lock;
111*aca3beaaSApple OSS Distributions 
112*aca3beaaSApple OSS Distributions struct pool {
113*aca3beaaSApple OSS Distributions 	struct zone     *pool_zone;     /* pointer to backend zone */
114*aca3beaaSApple OSS Distributions 	const char      *pool_name;     /* name of pool */
115*aca3beaaSApple OSS Distributions 	unsigned int    pool_count;     /* # of outstanding elements */
116*aca3beaaSApple OSS Distributions 	unsigned int    pool_hiwat;     /* high watermark */
117*aca3beaaSApple OSS Distributions 	unsigned int    pool_limit;     /* hard limit */
118*aca3beaaSApple OSS Distributions 	unsigned int    pool_fails;     /* # of failed allocs due to limit */
119*aca3beaaSApple OSS Distributions };
120*aca3beaaSApple OSS Distributions 
121*aca3beaaSApple OSS Distributions #define PR_NOWAIT       FALSE
122*aca3beaaSApple OSS Distributions #define PR_WAITOK       TRUE
123*aca3beaaSApple OSS Distributions 
124*aca3beaaSApple OSS Distributions __private_extern__ void pool_init(struct pool *, size_t, unsigned int,
125*aca3beaaSApple OSS Distributions     unsigned int, int, const char *, void *);
126*aca3beaaSApple OSS Distributions __private_extern__ void pool_destroy(struct pool *);
127*aca3beaaSApple OSS Distributions __private_extern__ void pool_sethiwat(struct pool *, int);
128*aca3beaaSApple OSS Distributions __private_extern__ void pool_sethardlimit(struct pool *, int,
129*aca3beaaSApple OSS Distributions     const char *, int);
130*aca3beaaSApple OSS Distributions __private_extern__ void *pool_get(struct pool *, int);
131*aca3beaaSApple OSS Distributions __private_extern__ void pool_put(struct pool *, void *);
132*aca3beaaSApple OSS Distributions __private_extern__ u_int64_t pf_time_second(void);
133*aca3beaaSApple OSS Distributions __private_extern__ u_int64_t pf_calendar_time_second(void);
134*aca3beaaSApple OSS Distributions #endif /* KERNEL */
135*aca3beaaSApple OSS Distributions 
136*aca3beaaSApple OSS Distributions union sockaddr_union {
137*aca3beaaSApple OSS Distributions 	struct sockaddr         sa;
138*aca3beaaSApple OSS Distributions 	struct sockaddr_in      sin;
139*aca3beaaSApple OSS Distributions 	struct sockaddr_in6     sin6;
140*aca3beaaSApple OSS Distributions };
141*aca3beaaSApple OSS Distributions 
142*aca3beaaSApple OSS Distributions #define PF_TCPS_PROXY_SRC       ((TCP_NSTATES)+0)
143*aca3beaaSApple OSS Distributions #define PF_TCPS_PROXY_DST       ((TCP_NSTATES)+1)
144*aca3beaaSApple OSS Distributions 
145*aca3beaaSApple OSS Distributions #define PF_MD5_DIGEST_LENGTH    16
146*aca3beaaSApple OSS Distributions #ifdef MD5_DIGEST_LENGTH
147*aca3beaaSApple OSS Distributions #if PF_MD5_DIGEST_LENGTH != MD5_DIGEST_LENGTH
148*aca3beaaSApple OSS Distributions #error
149*aca3beaaSApple OSS Distributions #endif /* PF_MD5_DIGEST_LENGTH != MD5_DIGEST_LENGTH */
150*aca3beaaSApple OSS Distributions #endif /* MD5_DIGEST_LENGTH */
151*aca3beaaSApple OSS Distributions 
152*aca3beaaSApple OSS Distributions #ifdef KERNEL
153*aca3beaaSApple OSS Distributions struct ip;
154*aca3beaaSApple OSS Distributions struct ip6_hdr;
155*aca3beaaSApple OSS Distributions struct tcphdr;
156*aca3beaaSApple OSS Distributions struct pf_grev1_hdr;
157*aca3beaaSApple OSS Distributions struct pf_esp_hdr;
158*aca3beaaSApple OSS Distributions #endif /* KERNEL */
159*aca3beaaSApple OSS Distributions 
160*aca3beaaSApple OSS Distributions #define PF_GRE_PPTP_VARIANT     0x01
161*aca3beaaSApple OSS Distributions 
162*aca3beaaSApple OSS Distributions enum    { PF_INOUT, PF_IN, PF_OUT };
163*aca3beaaSApple OSS Distributions enum    { PF_PASS, PF_DROP, PF_SCRUB, PF_NOSCRUB, PF_NAT, PF_NONAT,
164*aca3beaaSApple OSS Distributions 	  PF_BINAT, PF_NOBINAT, PF_RDR, PF_NORDR, PF_SYNPROXY_DROP,
165*aca3beaaSApple OSS Distributions 	  PF_DUMMYNET, PF_NODUMMYNET, PF_NAT64, PF_NONAT64 };
166*aca3beaaSApple OSS Distributions enum    { PF_RULESET_SCRUB, PF_RULESET_FILTER, PF_RULESET_NAT,
167*aca3beaaSApple OSS Distributions 	  PF_RULESET_BINAT, PF_RULESET_RDR, PF_RULESET_DUMMYNET,
168*aca3beaaSApple OSS Distributions 	  PF_RULESET_MAX };
169*aca3beaaSApple OSS Distributions enum    { PF_OP_NONE, PF_OP_IRG, PF_OP_EQ, PF_OP_NE, PF_OP_LT,
170*aca3beaaSApple OSS Distributions 	  PF_OP_LE, PF_OP_GT, PF_OP_GE, PF_OP_XRG, PF_OP_RRG };
171*aca3beaaSApple OSS Distributions enum    { PF_DEBUG_NONE, PF_DEBUG_URGENT, PF_DEBUG_MISC, PF_DEBUG_NOISY };
172*aca3beaaSApple OSS Distributions enum    { PF_CHANGE_NONE, PF_CHANGE_ADD_HEAD, PF_CHANGE_ADD_TAIL,
173*aca3beaaSApple OSS Distributions 	  PF_CHANGE_ADD_BEFORE, PF_CHANGE_ADD_AFTER,
174*aca3beaaSApple OSS Distributions 	  PF_CHANGE_REMOVE, PF_CHANGE_GET_TICKET };
175*aca3beaaSApple OSS Distributions enum    { PF_GET_NONE, PF_GET_CLR_CNTR };
176*aca3beaaSApple OSS Distributions 
177*aca3beaaSApple OSS Distributions /*
178*aca3beaaSApple OSS Distributions  * Note about PFTM_*: real indices into pf_rule.timeout[] come before
179*aca3beaaSApple OSS Distributions  * PFTM_MAX, special cases afterwards. See pf_state_expires().
180*aca3beaaSApple OSS Distributions  */
181*aca3beaaSApple OSS Distributions enum    { PFTM_TCP_FIRST_PACKET, PFTM_TCP_OPENING, PFTM_TCP_ESTABLISHED,
182*aca3beaaSApple OSS Distributions 	  PFTM_TCP_CLOSING, PFTM_TCP_FIN_WAIT, PFTM_TCP_CLOSED,
183*aca3beaaSApple OSS Distributions 	  PFTM_UDP_FIRST_PACKET, PFTM_UDP_SINGLE, PFTM_UDP_MULTIPLE,
184*aca3beaaSApple OSS Distributions 	  PFTM_ICMP_FIRST_PACKET, PFTM_ICMP_ERROR_REPLY,
185*aca3beaaSApple OSS Distributions 	  PFTM_GREv1_FIRST_PACKET, PFTM_GREv1_INITIATING,
186*aca3beaaSApple OSS Distributions 	  PFTM_GREv1_ESTABLISHED, PFTM_ESP_FIRST_PACKET, PFTM_ESP_INITIATING,
187*aca3beaaSApple OSS Distributions 	  PFTM_ESP_ESTABLISHED, PFTM_OTHER_FIRST_PACKET, PFTM_OTHER_SINGLE,
188*aca3beaaSApple OSS Distributions 	  PFTM_OTHER_MULTIPLE, PFTM_FRAG, PFTM_INTERVAL,
189*aca3beaaSApple OSS Distributions 	  PFTM_ADAPTIVE_START, PFTM_ADAPTIVE_END, PFTM_SRC_NODE,
190*aca3beaaSApple OSS Distributions 	  PFTM_TS_DIFF, PFTM_MAX, PFTM_PURGE, PFTM_UNLINKED };
191*aca3beaaSApple OSS Distributions 
192*aca3beaaSApple OSS Distributions /* PFTM default values */
193*aca3beaaSApple OSS Distributions #define PFTM_TCP_FIRST_PACKET_VAL       120     /* First TCP packet */
194*aca3beaaSApple OSS Distributions #define PFTM_TCP_OPENING_VAL            30      /* No response yet */
195*aca3beaaSApple OSS Distributions #define PFTM_TCP_ESTABLISHED_VAL        (24 * 60 * 60)  /* Established */
196*aca3beaaSApple OSS Distributions #define PFTM_TCP_CLOSING_VAL            (15 * 60)       /* Half closed */
197*aca3beaaSApple OSS Distributions #define PFTM_TCP_FIN_WAIT_VAL           45      /* Got both FINs */
198*aca3beaaSApple OSS Distributions #define PFTM_TCP_CLOSED_VAL             90      /* Got a RST */
199*aca3beaaSApple OSS Distributions #define PFTM_UDP_FIRST_PACKET_VAL       60      /* First UDP packet */
200*aca3beaaSApple OSS Distributions #define PFTM_UDP_SINGLE_VAL             30      /* Unidirectional */
201*aca3beaaSApple OSS Distributions #define PFTM_UDP_MULTIPLE_VAL           60      /* Bidirectional */
202*aca3beaaSApple OSS Distributions #define PFTM_ICMP_FIRST_PACKET_VAL      20      /* First ICMP packet */
203*aca3beaaSApple OSS Distributions #define PFTM_ICMP_ERROR_REPLY_VAL       10      /* Got error response */
204*aca3beaaSApple OSS Distributions #define PFTM_GREv1_FIRST_PACKET_VAL     120
205*aca3beaaSApple OSS Distributions #define PFTM_GREv1_INITIATING_VAL       30
206*aca3beaaSApple OSS Distributions #define PFTM_GREv1_ESTABLISHED_VAL      1800
207*aca3beaaSApple OSS Distributions #define PFTM_ESP_FIRST_PACKET_VAL       120
208*aca3beaaSApple OSS Distributions #define PFTM_ESP_INITIATING_VAL         30
209*aca3beaaSApple OSS Distributions #define PFTM_ESP_ESTABLISHED_VAL        900
210*aca3beaaSApple OSS Distributions #define PFTM_OTHER_FIRST_PACKET_VAL     60      /* First packet */
211*aca3beaaSApple OSS Distributions #define PFTM_OTHER_SINGLE_VAL           30      /* Unidirectional */
212*aca3beaaSApple OSS Distributions #define PFTM_OTHER_MULTIPLE_VAL         60      /* Bidirectional */
213*aca3beaaSApple OSS Distributions #define PFTM_FRAG_VAL                   30      /* Fragment expire */
214*aca3beaaSApple OSS Distributions #define PFTM_INTERVAL_VAL               10      /* Expire interval */
215*aca3beaaSApple OSS Distributions #define PFTM_SRC_NODE_VAL               0       /* Source tracking */
216*aca3beaaSApple OSS Distributions #define PFTM_TS_DIFF_VAL                30      /* Allowed TS diff */
217*aca3beaaSApple OSS Distributions 
218*aca3beaaSApple OSS Distributions enum    { PF_NOPFROUTE, PF_FASTROUTE, PF_ROUTETO, PF_DUPTO, PF_REPLYTO };
219*aca3beaaSApple OSS Distributions enum    { PF_LIMIT_STATES,
220*aca3beaaSApple OSS Distributions 	  PF_LIMIT_APP_STATES,
221*aca3beaaSApple OSS Distributions 	  PF_LIMIT_SRC_NODES, PF_LIMIT_FRAGS,
222*aca3beaaSApple OSS Distributions 	  PF_LIMIT_TABLES, PF_LIMIT_TABLE_ENTRIES, PF_LIMIT_MAX };
223*aca3beaaSApple OSS Distributions #define PF_POOL_IDMASK          0x0f
224*aca3beaaSApple OSS Distributions enum    { PF_POOL_NONE, PF_POOL_BITMASK, PF_POOL_RANDOM,
225*aca3beaaSApple OSS Distributions 	  PF_POOL_SRCHASH, PF_POOL_ROUNDROBIN };
226*aca3beaaSApple OSS Distributions enum    { PF_ADDR_ADDRMASK, PF_ADDR_NOROUTE, PF_ADDR_DYNIFTL,
227*aca3beaaSApple OSS Distributions 	  PF_ADDR_TABLE, PF_ADDR_RTLABEL, PF_ADDR_URPFFAILED,
228*aca3beaaSApple OSS Distributions 	  PF_ADDR_RANGE };
229*aca3beaaSApple OSS Distributions #define PF_POOL_TYPEMASK        0x0f
230*aca3beaaSApple OSS Distributions #define PF_POOL_STICKYADDR      0x20
231*aca3beaaSApple OSS Distributions #define PF_WSCALE_FLAG          0x80
232*aca3beaaSApple OSS Distributions #define PF_WSCALE_MASK          0x0f
233*aca3beaaSApple OSS Distributions 
234*aca3beaaSApple OSS Distributions #define PF_LOG                  0x01
235*aca3beaaSApple OSS Distributions #define PF_LOG_ALL              0x02
236*aca3beaaSApple OSS Distributions #define PF_LOG_SOCKET_LOOKUP    0x04
237*aca3beaaSApple OSS Distributions 
238*aca3beaaSApple OSS Distributions struct pf_addr {
239*aca3beaaSApple OSS Distributions 	union {
240*aca3beaaSApple OSS Distributions 		struct in_addr          _v4addr;
241*aca3beaaSApple OSS Distributions 		struct in6_addr         _v6addr;
242*aca3beaaSApple OSS Distributions 		u_int8_t                _addr8[16];
243*aca3beaaSApple OSS Distributions 		u_int16_t               _addr16[8];
244*aca3beaaSApple OSS Distributions 		u_int32_t               _addr32[4];
245*aca3beaaSApple OSS Distributions 	} pfa;              /* 128-bit address */
246*aca3beaaSApple OSS Distributions #define v4addr  pfa._v4addr
247*aca3beaaSApple OSS Distributions #define v6addr  pfa._v6addr
248*aca3beaaSApple OSS Distributions #define addr8   pfa._addr8
249*aca3beaaSApple OSS Distributions #define addr16  pfa._addr16
250*aca3beaaSApple OSS Distributions #define addr32  pfa._addr32
251*aca3beaaSApple OSS Distributions };
252*aca3beaaSApple OSS Distributions 
253*aca3beaaSApple OSS Distributions #define PF_TABLE_NAME_SIZE       32
254*aca3beaaSApple OSS Distributions 
255*aca3beaaSApple OSS Distributions #define PFI_AFLAG_NETWORK       0x01
256*aca3beaaSApple OSS Distributions #define PFI_AFLAG_BROADCAST     0x02
257*aca3beaaSApple OSS Distributions #define PFI_AFLAG_PEER          0x04
258*aca3beaaSApple OSS Distributions #define PFI_AFLAG_MODEMASK      0x07
259*aca3beaaSApple OSS Distributions #define PFI_AFLAG_NOALIAS       0x08
260*aca3beaaSApple OSS Distributions 
261*aca3beaaSApple OSS Distributions #ifndef RTLABEL_LEN
262*aca3beaaSApple OSS Distributions #define RTLABEL_LEN 32
263*aca3beaaSApple OSS Distributions #endif
264*aca3beaaSApple OSS Distributions 
265*aca3beaaSApple OSS Distributions struct pf_addr_wrap {
266*aca3beaaSApple OSS Distributions 	union {
267*aca3beaaSApple OSS Distributions 		struct {
268*aca3beaaSApple OSS Distributions 			struct pf_addr           addr;
269*aca3beaaSApple OSS Distributions 			struct pf_addr           mask;
270*aca3beaaSApple OSS Distributions 		}                        a;
271*aca3beaaSApple OSS Distributions 		char                     ifname[IFNAMSIZ];
272*aca3beaaSApple OSS Distributions 		char                     tblname[PF_TABLE_NAME_SIZE];
273*aca3beaaSApple OSS Distributions 		char                     rtlabelname[RTLABEL_LEN];
274*aca3beaaSApple OSS Distributions 		u_int32_t                rtlabel;
275*aca3beaaSApple OSS Distributions 	}                        v;
276*aca3beaaSApple OSS Distributions 	union {
277*aca3beaaSApple OSS Distributions #ifdef KERNEL
278*aca3beaaSApple OSS Distributions 		struct pfi_dynaddr      *dyn    __attribute__((aligned(8)));
279*aca3beaaSApple OSS Distributions 		struct pfr_ktable       *tbl    __attribute__((aligned(8)));
280*aca3beaaSApple OSS Distributions #else /* !KERNEL */
281*aca3beaaSApple OSS Distributions 		void                    *dyn    __attribute__((aligned(8)));
282*aca3beaaSApple OSS Distributions 		void                    *tbl    __attribute__((aligned(8)));
283*aca3beaaSApple OSS Distributions #endif /* !KERNEL */
284*aca3beaaSApple OSS Distributions 		int                      dyncnt __attribute__((aligned(8)));
285*aca3beaaSApple OSS Distributions 		int                      tblcnt __attribute__((aligned(8)));
286*aca3beaaSApple OSS Distributions 	}                        p __attribute__((aligned(8)));
287*aca3beaaSApple OSS Distributions 	u_int8_t                 type;          /* PF_ADDR_* */
288*aca3beaaSApple OSS Distributions 	u_int8_t                 iflags;        /* PFI_AFLAG_* */
289*aca3beaaSApple OSS Distributions };
290*aca3beaaSApple OSS Distributions 
291*aca3beaaSApple OSS Distributions struct pf_port_range {
292*aca3beaaSApple OSS Distributions 	u_int16_t                       port[2];
293*aca3beaaSApple OSS Distributions 	u_int8_t                        op;
294*aca3beaaSApple OSS Distributions };
295*aca3beaaSApple OSS Distributions 
296*aca3beaaSApple OSS Distributions union pf_rule_xport {
297*aca3beaaSApple OSS Distributions 	struct pf_port_range    range;
298*aca3beaaSApple OSS Distributions 	u_int16_t               call_id;
299*aca3beaaSApple OSS Distributions 	u_int32_t               spi;
300*aca3beaaSApple OSS Distributions };
301*aca3beaaSApple OSS Distributions 
302*aca3beaaSApple OSS Distributions #ifdef KERNEL
303*aca3beaaSApple OSS Distributions struct pfi_dynaddr {
304*aca3beaaSApple OSS Distributions 	TAILQ_ENTRY(pfi_dynaddr)         entry;
305*aca3beaaSApple OSS Distributions 	struct pf_addr                   pfid_addr4;
306*aca3beaaSApple OSS Distributions 	struct pf_addr                   pfid_mask4;
307*aca3beaaSApple OSS Distributions 	struct pf_addr                   pfid_addr6;
308*aca3beaaSApple OSS Distributions 	struct pf_addr                   pfid_mask6;
309*aca3beaaSApple OSS Distributions 	struct pfr_ktable               *pfid_kt;
310*aca3beaaSApple OSS Distributions 	struct pfi_kif                  *pfid_kif;
311*aca3beaaSApple OSS Distributions 	void                            *pfid_hook_cookie;
312*aca3beaaSApple OSS Distributions 	uint8_t                          pfid_net;      /* mask or 128 */
313*aca3beaaSApple OSS Distributions 	int                              pfid_acnt4;    /* address count IPv4 */
314*aca3beaaSApple OSS Distributions 	int                              pfid_acnt6;    /* address count IPv6 */
315*aca3beaaSApple OSS Distributions 	sa_family_t                      pfid_af;       /* rule af */
316*aca3beaaSApple OSS Distributions 	u_int8_t                         pfid_iflags;   /* PFI_AFLAG_* */
317*aca3beaaSApple OSS Distributions };
318*aca3beaaSApple OSS Distributions 
319*aca3beaaSApple OSS Distributions /*
320*aca3beaaSApple OSS Distributions  * Address manipulation macros
321*aca3beaaSApple OSS Distributions  */
322*aca3beaaSApple OSS Distributions 
323*aca3beaaSApple OSS Distributions #if INET
324*aca3beaaSApple OSS Distributions #endif /* INET */
325*aca3beaaSApple OSS Distributions 
326*aca3beaaSApple OSS Distributions #if !INET
327*aca3beaaSApple OSS Distributions #define PF_INET6_ONLY
328*aca3beaaSApple OSS Distributions #endif /* ! INET */
329*aca3beaaSApple OSS Distributions 
330*aca3beaaSApple OSS Distributions #if INET
331*aca3beaaSApple OSS Distributions #define PF_INET_INET6
332*aca3beaaSApple OSS Distributions #endif /* INET */
333*aca3beaaSApple OSS Distributions 
334*aca3beaaSApple OSS Distributions #else /* !KERNEL */
335*aca3beaaSApple OSS Distributions 
336*aca3beaaSApple OSS Distributions #define PF_INET_INET6
337*aca3beaaSApple OSS Distributions 
338*aca3beaaSApple OSS Distributions #endif /* !KERNEL */
339*aca3beaaSApple OSS Distributions 
340*aca3beaaSApple OSS Distributions /* Both IPv4 and IPv6 */
341*aca3beaaSApple OSS Distributions #ifdef PF_INET_INET6
342*aca3beaaSApple OSS Distributions 
343*aca3beaaSApple OSS Distributions #define PF_AEQ(a, b, c) \
344*aca3beaaSApple OSS Distributions 	((c == AF_INET && (a)->addr32[0] == (b)->addr32[0]) || \
345*aca3beaaSApple OSS Distributions 	((a)->addr32[3] == (b)->addr32[3] && \
346*aca3beaaSApple OSS Distributions 	(a)->addr32[2] == (b)->addr32[2] && \
347*aca3beaaSApple OSS Distributions 	(a)->addr32[1] == (b)->addr32[1] && \
348*aca3beaaSApple OSS Distributions 	(a)->addr32[0] == (b)->addr32[0])) \
349*aca3beaaSApple OSS Distributions 
350*aca3beaaSApple OSS Distributions #define PF_ANEQ(a, b, c) \
351*aca3beaaSApple OSS Distributions 	((c == AF_INET && (a)->addr32[0] != (b)->addr32[0]) || \
352*aca3beaaSApple OSS Distributions 	((a)->addr32[3] != (b)->addr32[3] || \
353*aca3beaaSApple OSS Distributions 	(a)->addr32[2] != (b)->addr32[2] || \
354*aca3beaaSApple OSS Distributions 	(a)->addr32[1] != (b)->addr32[1] || \
355*aca3beaaSApple OSS Distributions 	(a)->addr32[0] != (b)->addr32[0])) \
356*aca3beaaSApple OSS Distributions 
357*aca3beaaSApple OSS Distributions #define PF_ALEQ(a, b, c) \
358*aca3beaaSApple OSS Distributions 	((c == AF_INET && (a)->addr32[0] <= (b)->addr32[0]) || \
359*aca3beaaSApple OSS Distributions 	((a)->addr32[3] <= (b)->addr32[3] && \
360*aca3beaaSApple OSS Distributions 	(a)->addr32[2] <= (b)->addr32[2] && \
361*aca3beaaSApple OSS Distributions 	(a)->addr32[1] <= (b)->addr32[1] && \
362*aca3beaaSApple OSS Distributions 	(a)->addr32[0] <= (b)->addr32[0])) \
363*aca3beaaSApple OSS Distributions 
364*aca3beaaSApple OSS Distributions #define PF_AZERO(a, c) \
365*aca3beaaSApple OSS Distributions 	((c == AF_INET && !(a)->addr32[0]) || \
366*aca3beaaSApple OSS Distributions 	(!(a)->addr32[0] && !(a)->addr32[1] && \
367*aca3beaaSApple OSS Distributions 	!(a)->addr32[2] && !(a)->addr32[3])) \
368*aca3beaaSApple OSS Distributions 
369*aca3beaaSApple OSS Distributions #define PF_MATCHA(n, a, m, b, f) \
370*aca3beaaSApple OSS Distributions 	pf_match_addr(n, a, m, b, f)
371*aca3beaaSApple OSS Distributions 
372*aca3beaaSApple OSS Distributions #define PF_ACPY(a, b, f) \
373*aca3beaaSApple OSS Distributions 	pf_addrcpy(a, b, f)
374*aca3beaaSApple OSS Distributions 
375*aca3beaaSApple OSS Distributions #define PF_AINC(a, f) \
376*aca3beaaSApple OSS Distributions 	pf_addr_inc(a, f)
377*aca3beaaSApple OSS Distributions 
378*aca3beaaSApple OSS Distributions #define PF_POOLMASK(a, b, c, d, f) \
379*aca3beaaSApple OSS Distributions 	pf_poolmask(a, b, c, d, f)
380*aca3beaaSApple OSS Distributions 
381*aca3beaaSApple OSS Distributions #else
382*aca3beaaSApple OSS Distributions 
383*aca3beaaSApple OSS Distributions /* Just IPv6 */
384*aca3beaaSApple OSS Distributions 
385*aca3beaaSApple OSS Distributions #ifdef PF_INET6_ONLY
386*aca3beaaSApple OSS Distributions 
387*aca3beaaSApple OSS Distributions #define PF_AEQ(a, b, c) \
388*aca3beaaSApple OSS Distributions 	((a)->addr32[3] == (b)->addr32[3] && \
389*aca3beaaSApple OSS Distributions 	(a)->addr32[2] == (b)->addr32[2] && \
390*aca3beaaSApple OSS Distributions 	(a)->addr32[1] == (b)->addr32[1] && \
391*aca3beaaSApple OSS Distributions 	(a)->addr32[0] == (b)->addr32[0]) \
392*aca3beaaSApple OSS Distributions 
393*aca3beaaSApple OSS Distributions #define PF_ANEQ(a, b, c) \
394*aca3beaaSApple OSS Distributions 	((a)->addr32[3] != (b)->addr32[3] || \
395*aca3beaaSApple OSS Distributions 	(a)->addr32[2] != (b)->addr32[2] || \
396*aca3beaaSApple OSS Distributions 	(a)->addr32[1] != (b)->addr32[1] || \
397*aca3beaaSApple OSS Distributions 	(a)->addr32[0] != (b)->addr32[0]) \
398*aca3beaaSApple OSS Distributions 
399*aca3beaaSApple OSS Distributions #define PF_ALEQ(a, b, c) \
400*aca3beaaSApple OSS Distributions 	((a)->addr32[3] <= (b)->addr32[3] && \
401*aca3beaaSApple OSS Distributions 	(a)->addr32[2] <= (b)->addr32[2] && \
402*aca3beaaSApple OSS Distributions 	(a)->addr32[1] <= (b)->addr32[1] && \
403*aca3beaaSApple OSS Distributions 	(a)->addr32[0] <= (b)->addr32[0]) \
404*aca3beaaSApple OSS Distributions 
405*aca3beaaSApple OSS Distributions #define PF_AZERO(a, c) \
406*aca3beaaSApple OSS Distributions 	(!(a)->addr32[0] && \
407*aca3beaaSApple OSS Distributions 	!(a)->addr32[1] && \
408*aca3beaaSApple OSS Distributions 	!(a)->addr32[2] && \
409*aca3beaaSApple OSS Distributions 	!(a)->addr32[3]) \
410*aca3beaaSApple OSS Distributions 
411*aca3beaaSApple OSS Distributions #define PF_MATCHA(n, a, m, b, f) \
412*aca3beaaSApple OSS Distributions 	pf_match_addr(n, a, m, b, f)
413*aca3beaaSApple OSS Distributions 
414*aca3beaaSApple OSS Distributions #define PF_ACPY(a, b, f) \
415*aca3beaaSApple OSS Distributions 	pf_addrcpy(a, b, f)
416*aca3beaaSApple OSS Distributions 
417*aca3beaaSApple OSS Distributions #define PF_AINC(a, f) \
418*aca3beaaSApple OSS Distributions 	pf_addr_inc(a, f)
419*aca3beaaSApple OSS Distributions 
420*aca3beaaSApple OSS Distributions #define PF_POOLMASK(a, b, c, d, f) \
421*aca3beaaSApple OSS Distributions 	pf_poolmask(a, b, c, d, f)
422*aca3beaaSApple OSS Distributions 
423*aca3beaaSApple OSS Distributions #else
424*aca3beaaSApple OSS Distributions 
425*aca3beaaSApple OSS Distributions /* Just IPv4 */
426*aca3beaaSApple OSS Distributions #ifdef PF_INET_ONLY
427*aca3beaaSApple OSS Distributions 
428*aca3beaaSApple OSS Distributions #define PF_AEQ(a, b, c) \
429*aca3beaaSApple OSS Distributions 	((a)->addr32[0] == (b)->addr32[0])
430*aca3beaaSApple OSS Distributions 
431*aca3beaaSApple OSS Distributions #define PF_ANEQ(a, b, c) \
432*aca3beaaSApple OSS Distributions 	((a)->addr32[0] != (b)->addr32[0])
433*aca3beaaSApple OSS Distributions 
434*aca3beaaSApple OSS Distributions #define PF_ALEQ(a, b, c) \
435*aca3beaaSApple OSS Distributions 	((a)->addr32[0] <= (b)->addr32[0])
436*aca3beaaSApple OSS Distributions 
437*aca3beaaSApple OSS Distributions #define PF_AZERO(a, c) \
438*aca3beaaSApple OSS Distributions 	(!(a)->addr32[0])
439*aca3beaaSApple OSS Distributions 
440*aca3beaaSApple OSS Distributions #define PF_MATCHA(n, a, m, b, f) \
441*aca3beaaSApple OSS Distributions 	pf_match_addr(n, a, m, b, f)
442*aca3beaaSApple OSS Distributions 
443*aca3beaaSApple OSS Distributions #define PF_ACPY(a, b, f) \
444*aca3beaaSApple OSS Distributions 	(a)->v4.s_addr = (b)->v4.s_addr
445*aca3beaaSApple OSS Distributions 
446*aca3beaaSApple OSS Distributions #define PF_AINC(a, f) \
447*aca3beaaSApple OSS Distributions 	do { \
448*aca3beaaSApple OSS Distributions 	        (a)->addr32[0] = htonl(ntohl((a)->addr32[0]) + 1); \
449*aca3beaaSApple OSS Distributions 	} while (0)
450*aca3beaaSApple OSS Distributions 
451*aca3beaaSApple OSS Distributions #define PF_POOLMASK(a, b, c, d, f) \
452*aca3beaaSApple OSS Distributions 	do { \
453*aca3beaaSApple OSS Distributions 	        (a)->addr32[0] = ((b)->addr32[0] & (c)->addr32[0]) | \
454*aca3beaaSApple OSS Distributions 	        (((c)->addr32[0] ^ 0xffffffff) & (d)->addr32[0]); \
455*aca3beaaSApple OSS Distributions 	} while (0)
456*aca3beaaSApple OSS Distributions 
457*aca3beaaSApple OSS Distributions #endif /* PF_INET_ONLY */
458*aca3beaaSApple OSS Distributions #endif /* PF_INET6_ONLY */
459*aca3beaaSApple OSS Distributions #endif /* PF_INET_INET6 */
460*aca3beaaSApple OSS Distributions 
461*aca3beaaSApple OSS Distributions #ifdef KERNEL
462*aca3beaaSApple OSS Distributions #define PF_MISMATCHAW(aw, x, af, neg, ifp)                              \
463*aca3beaaSApple OSS Distributions 	(                                                               \
464*aca3beaaSApple OSS Distributions 	        (((aw)->type == PF_ADDR_NOROUTE &&                      \
465*aca3beaaSApple OSS Distributions 	            pf_routable((x), (af), NULL)) ||                    \
466*aca3beaaSApple OSS Distributions 	        (((aw)->type == PF_ADDR_URPFFAILED && (ifp) != NULL &&  \
467*aca3beaaSApple OSS Distributions 	            pf_routable((x), (af), (ifp))) ||                   \
468*aca3beaaSApple OSS Distributions 	        ((aw)->type == PF_ADDR_RTLABEL &&                       \
469*aca3beaaSApple OSS Distributions 	            !pf_rtlabel_match((x), (af), (aw))) ||              \
470*aca3beaaSApple OSS Distributions 	        ((aw)->type == PF_ADDR_TABLE &&                         \
471*aca3beaaSApple OSS Distributions 	            !pfr_match_addr((aw)->p.tbl, (x), (af))) ||         \
472*aca3beaaSApple OSS Distributions 	        ((aw)->type == PF_ADDR_DYNIFTL &&                       \
473*aca3beaaSApple OSS Distributions 	            !pfi_match_addr((aw)->p.dyn, (x), (af))) ||         \
474*aca3beaaSApple OSS Distributions 	        ((aw)->type == PF_ADDR_RANGE &&                         \
475*aca3beaaSApple OSS Distributions 	            !pf_match_addr_range(&(aw)->v.a.addr,               \
476*aca3beaaSApple OSS Distributions 	            &(aw)->v.a.mask, (x), (af))) ||                     \
477*aca3beaaSApple OSS Distributions 	        ((aw)->type == PF_ADDR_ADDRMASK &&                      \
478*aca3beaaSApple OSS Distributions 	            !PF_AZERO(&(aw)->v.a.mask, (af)) &&                 \
479*aca3beaaSApple OSS Distributions 	            !PF_MATCHA(0, &(aw)->v.a.addr,                      \
480*aca3beaaSApple OSS Distributions 	            &(aw)->v.a.mask, (x), (af))))) !=                   \
481*aca3beaaSApple OSS Distributions 	        (neg)                                                   \
482*aca3beaaSApple OSS Distributions 	)
483*aca3beaaSApple OSS Distributions #endif /* KERNEL */
484*aca3beaaSApple OSS Distributions 
485*aca3beaaSApple OSS Distributions struct pf_rule_uid {
486*aca3beaaSApple OSS Distributions 	uid_t            uid[2];
487*aca3beaaSApple OSS Distributions 	u_int8_t         op;
488*aca3beaaSApple OSS Distributions 	u_int8_t         _pad[3];
489*aca3beaaSApple OSS Distributions };
490*aca3beaaSApple OSS Distributions 
491*aca3beaaSApple OSS Distributions struct pf_rule_gid {
492*aca3beaaSApple OSS Distributions 	uid_t            gid[2];
493*aca3beaaSApple OSS Distributions 	u_int8_t         op;
494*aca3beaaSApple OSS Distributions 	u_int8_t         _pad[3];
495*aca3beaaSApple OSS Distributions };
496*aca3beaaSApple OSS Distributions 
497*aca3beaaSApple OSS Distributions struct pf_rule_addr {
498*aca3beaaSApple OSS Distributions 	struct pf_addr_wrap      addr;
499*aca3beaaSApple OSS Distributions 	union pf_rule_xport      xport;
500*aca3beaaSApple OSS Distributions 	u_int8_t                 neg;
501*aca3beaaSApple OSS Distributions };
502*aca3beaaSApple OSS Distributions 
503*aca3beaaSApple OSS Distributions struct pf_pooladdr {
504*aca3beaaSApple OSS Distributions 	struct pf_addr_wrap              addr;
505*aca3beaaSApple OSS Distributions 	TAILQ_ENTRY(pf_pooladdr)         entries;
506*aca3beaaSApple OSS Distributions #if !defined(__LP64__)
507*aca3beaaSApple OSS Distributions 	u_int32_t                        _pad[2];
508*aca3beaaSApple OSS Distributions #endif /* !__LP64__ */
509*aca3beaaSApple OSS Distributions 	char                             ifname[IFNAMSIZ];
510*aca3beaaSApple OSS Distributions #ifdef KERNEL
511*aca3beaaSApple OSS Distributions 	struct pfi_kif                  *kif    __attribute__((aligned(8)));
512*aca3beaaSApple OSS Distributions #else /* !KERNEL */
513*aca3beaaSApple OSS Distributions 	void                            *kif    __attribute__((aligned(8)));
514*aca3beaaSApple OSS Distributions #endif /* !KERNEL */
515*aca3beaaSApple OSS Distributions };
516*aca3beaaSApple OSS Distributions 
517*aca3beaaSApple OSS Distributions TAILQ_HEAD(pf_palist, pf_pooladdr);
518*aca3beaaSApple OSS Distributions 
519*aca3beaaSApple OSS Distributions struct pf_poolhashkey {
520*aca3beaaSApple OSS Distributions 	union {
521*aca3beaaSApple OSS Distributions 		u_int8_t                key8[16];
522*aca3beaaSApple OSS Distributions 		u_int16_t               key16[8];
523*aca3beaaSApple OSS Distributions 		u_int32_t               key32[4];
524*aca3beaaSApple OSS Distributions 	} pfk;              /* 128-bit hash key */
525*aca3beaaSApple OSS Distributions #define key8    pfk.key8
526*aca3beaaSApple OSS Distributions #define key16   pfk.key16
527*aca3beaaSApple OSS Distributions #define key32   pfk.key32
528*aca3beaaSApple OSS Distributions };
529*aca3beaaSApple OSS Distributions 
530*aca3beaaSApple OSS Distributions struct pf_pool {
531*aca3beaaSApple OSS Distributions 	struct pf_palist         list;
532*aca3beaaSApple OSS Distributions #if !defined(__LP64__)
533*aca3beaaSApple OSS Distributions 	u_int32_t                _pad[2];
534*aca3beaaSApple OSS Distributions #endif /* !__LP64__ */
535*aca3beaaSApple OSS Distributions #ifdef KERNEL
536*aca3beaaSApple OSS Distributions 	struct pf_pooladdr      *cur            __attribute__((aligned(8)));
537*aca3beaaSApple OSS Distributions #else /* !KERNEL */
538*aca3beaaSApple OSS Distributions 	void                    *cur            __attribute__((aligned(8)));
539*aca3beaaSApple OSS Distributions #endif /* !KERNEL */
540*aca3beaaSApple OSS Distributions 	struct pf_poolhashkey    key            __attribute__((aligned(8)));
541*aca3beaaSApple OSS Distributions 	struct pf_addr           counter;
542*aca3beaaSApple OSS Distributions 	int                      tblidx;
543*aca3beaaSApple OSS Distributions 	u_int16_t                proxy_port[2];
544*aca3beaaSApple OSS Distributions 	u_int8_t                 port_op;
545*aca3beaaSApple OSS Distributions 	u_int8_t                 opts;
546*aca3beaaSApple OSS Distributions 	sa_family_t              af;
547*aca3beaaSApple OSS Distributions };
548*aca3beaaSApple OSS Distributions 
549*aca3beaaSApple OSS Distributions 
550*aca3beaaSApple OSS Distributions /* A packed Operating System description for fingerprinting */
551*aca3beaaSApple OSS Distributions typedef u_int32_t pf_osfp_t;
552*aca3beaaSApple OSS Distributions #define PF_OSFP_ANY     ((pf_osfp_t)0)
553*aca3beaaSApple OSS Distributions #define PF_OSFP_UNKNOWN ((pf_osfp_t)-1)
554*aca3beaaSApple OSS Distributions #define PF_OSFP_NOMATCH ((pf_osfp_t)-2)
555*aca3beaaSApple OSS Distributions 
556*aca3beaaSApple OSS Distributions struct pf_osfp_entry {
557*aca3beaaSApple OSS Distributions 	SLIST_ENTRY(pf_osfp_entry) fp_entry;
558*aca3beaaSApple OSS Distributions #if !defined(__LP64__)
559*aca3beaaSApple OSS Distributions 	u_int32_t               _pad;
560*aca3beaaSApple OSS Distributions #endif /* !__LP64__ */
561*aca3beaaSApple OSS Distributions 	pf_osfp_t               fp_os;
562*aca3beaaSApple OSS Distributions 	int                     fp_enflags;
563*aca3beaaSApple OSS Distributions #define PF_OSFP_EXPANDED        0x001           /* expanded entry */
564*aca3beaaSApple OSS Distributions #define PF_OSFP_GENERIC         0x002           /* generic signature */
565*aca3beaaSApple OSS Distributions #define PF_OSFP_NODETAIL        0x004           /* no p0f details */
566*aca3beaaSApple OSS Distributions #define PF_OSFP_LEN     32
567*aca3beaaSApple OSS Distributions 	char                    fp_class_nm[PF_OSFP_LEN];
568*aca3beaaSApple OSS Distributions 	char                    fp_version_nm[PF_OSFP_LEN];
569*aca3beaaSApple OSS Distributions 	char                    fp_subtype_nm[PF_OSFP_LEN];
570*aca3beaaSApple OSS Distributions };
571*aca3beaaSApple OSS Distributions #define PF_OSFP_ENTRY_EQ(a, b) \
572*aca3beaaSApple OSS Distributions     ((a)->fp_os == (b)->fp_os && \
573*aca3beaaSApple OSS Distributions     memcmp((a)->fp_class_nm, (b)->fp_class_nm, PF_OSFP_LEN) == 0 && \
574*aca3beaaSApple OSS Distributions     memcmp((a)->fp_version_nm, (b)->fp_version_nm, PF_OSFP_LEN) == 0 && \
575*aca3beaaSApple OSS Distributions     memcmp((a)->fp_subtype_nm, (b)->fp_subtype_nm, PF_OSFP_LEN) == 0)
576*aca3beaaSApple OSS Distributions 
577*aca3beaaSApple OSS Distributions /* handle pf_osfp_t packing */
578*aca3beaaSApple OSS Distributions #define _FP_RESERVED_BIT        1  /* For the special negative #defines */
579*aca3beaaSApple OSS Distributions #define _FP_UNUSED_BITS         1
580*aca3beaaSApple OSS Distributions #define _FP_CLASS_BITS          10 /* OS Class (Windows, Linux) */
581*aca3beaaSApple OSS Distributions #define _FP_VERSION_BITS        10 /* OS version (95, 98, NT, 2.4.54, 3.2) */
582*aca3beaaSApple OSS Distributions #define _FP_SUBTYPE_BITS        10 /* patch level (NT SP4, SP3, ECN patch) */
583*aca3beaaSApple OSS Distributions #define PF_OSFP_UNPACK(osfp, class, version, subtype) do { \
584*aca3beaaSApple OSS Distributions 	(class) = ((osfp) >> (_FP_VERSION_BITS+_FP_SUBTYPE_BITS)) & \
585*aca3beaaSApple OSS Distributions 	    ((1 << _FP_CLASS_BITS) - 1); \
586*aca3beaaSApple OSS Distributions 	(version) = ((osfp) >> _FP_SUBTYPE_BITS) & \
587*aca3beaaSApple OSS Distributions 	    ((1 << _FP_VERSION_BITS) - 1);\
588*aca3beaaSApple OSS Distributions 	(subtype) = (osfp) & ((1 << _FP_SUBTYPE_BITS) - 1); \
589*aca3beaaSApple OSS Distributions } while (0)
590*aca3beaaSApple OSS Distributions #define PF_OSFP_PACK(osfp, class, version, subtype) do { \
591*aca3beaaSApple OSS Distributions 	(osfp) = ((class) & ((1 << _FP_CLASS_BITS) - 1)) << (_FP_VERSION_BITS \
592*aca3beaaSApple OSS Distributions 	    + _FP_SUBTYPE_BITS); \
593*aca3beaaSApple OSS Distributions 	(osfp) |= ((version) & ((1 << _FP_VERSION_BITS) - 1)) << \
594*aca3beaaSApple OSS Distributions 	    _FP_SUBTYPE_BITS; \
595*aca3beaaSApple OSS Distributions 	(osfp) |= (subtype) & ((1 << _FP_SUBTYPE_BITS) - 1); \
596*aca3beaaSApple OSS Distributions } while (0)
597*aca3beaaSApple OSS Distributions 
598*aca3beaaSApple OSS Distributions /* the fingerprint of an OSes TCP SYN packet */
599*aca3beaaSApple OSS Distributions typedef u_int64_t       pf_tcpopts_t;
600*aca3beaaSApple OSS Distributions struct pf_os_fingerprint {
601*aca3beaaSApple OSS Distributions 	SLIST_HEAD(pf_osfp_enlist, pf_osfp_entry) fp_oses; /* list of matches */
602*aca3beaaSApple OSS Distributions 	pf_tcpopts_t            fp_tcpopts;     /* packed TCP options */
603*aca3beaaSApple OSS Distributions 	u_int16_t               fp_wsize;       /* TCP window size */
604*aca3beaaSApple OSS Distributions 	u_int16_t               fp_psize;       /* ip->ip_len */
605*aca3beaaSApple OSS Distributions 	u_int16_t               fp_mss;         /* TCP MSS */
606*aca3beaaSApple OSS Distributions 	u_int16_t               fp_flags;
607*aca3beaaSApple OSS Distributions #define PF_OSFP_WSIZE_MOD       0x0001          /* Window modulus */
608*aca3beaaSApple OSS Distributions #define PF_OSFP_WSIZE_DC        0x0002          /* Window don't care */
609*aca3beaaSApple OSS Distributions #define PF_OSFP_WSIZE_MSS       0x0004          /* Window multiple of MSS */
610*aca3beaaSApple OSS Distributions #define PF_OSFP_WSIZE_MTU       0x0008          /* Window multiple of MTU */
611*aca3beaaSApple OSS Distributions #define PF_OSFP_PSIZE_MOD       0x0010          /* packet size modulus */
612*aca3beaaSApple OSS Distributions #define PF_OSFP_PSIZE_DC        0x0020          /* packet size don't care */
613*aca3beaaSApple OSS Distributions #define PF_OSFP_WSCALE          0x0040          /* TCP window scaling */
614*aca3beaaSApple OSS Distributions #define PF_OSFP_WSCALE_MOD      0x0080          /* TCP window scale modulus */
615*aca3beaaSApple OSS Distributions #define PF_OSFP_WSCALE_DC       0x0100          /* TCP window scale dont-care */
616*aca3beaaSApple OSS Distributions #define PF_OSFP_MSS             0x0200          /* TCP MSS */
617*aca3beaaSApple OSS Distributions #define PF_OSFP_MSS_MOD         0x0400          /* TCP MSS modulus */
618*aca3beaaSApple OSS Distributions #define PF_OSFP_MSS_DC          0x0800          /* TCP MSS dont-care */
619*aca3beaaSApple OSS Distributions #define PF_OSFP_DF              0x1000          /* IPv4 don't fragment bit */
620*aca3beaaSApple OSS Distributions #define PF_OSFP_TS0             0x2000          /* Zero timestamp */
621*aca3beaaSApple OSS Distributions #define PF_OSFP_INET6           0x4000          /* IPv6 */
622*aca3beaaSApple OSS Distributions 	u_int8_t                fp_optcnt;      /* TCP option count */
623*aca3beaaSApple OSS Distributions 	u_int8_t                fp_wscale;      /* TCP window scaling */
624*aca3beaaSApple OSS Distributions 	u_int8_t                fp_ttl;         /* IPv4 TTL */
625*aca3beaaSApple OSS Distributions #define PF_OSFP_MAXTTL_OFFSET   40
626*aca3beaaSApple OSS Distributions /* TCP options packing */
627*aca3beaaSApple OSS Distributions #define PF_OSFP_TCPOPT_NOP      0x0             /* TCP NOP option */
628*aca3beaaSApple OSS Distributions #define PF_OSFP_TCPOPT_WSCALE   0x1             /* TCP window scaling option */
629*aca3beaaSApple OSS Distributions #define PF_OSFP_TCPOPT_MSS      0x2             /* TCP max segment size opt */
630*aca3beaaSApple OSS Distributions #define PF_OSFP_TCPOPT_SACK     0x3             /* TCP SACK OK option */
631*aca3beaaSApple OSS Distributions #define PF_OSFP_TCPOPT_TS       0x4             /* TCP timestamp option */
632*aca3beaaSApple OSS Distributions #define PF_OSFP_TCPOPT_BITS     3               /* bits used by each option */
633*aca3beaaSApple OSS Distributions #define PF_OSFP_MAX_OPTS \
634*aca3beaaSApple OSS Distributions     ((sizeof(pf_tcpopts_t) * 8) \
635*aca3beaaSApple OSS Distributions     / PF_OSFP_TCPOPT_BITS)
636*aca3beaaSApple OSS Distributions 
637*aca3beaaSApple OSS Distributions 	SLIST_ENTRY(pf_os_fingerprint)  fp_next;
638*aca3beaaSApple OSS Distributions };
639*aca3beaaSApple OSS Distributions 
640*aca3beaaSApple OSS Distributions struct pf_osfp_ioctl {
641*aca3beaaSApple OSS Distributions 	struct pf_osfp_entry    fp_os;
642*aca3beaaSApple OSS Distributions 	pf_tcpopts_t            fp_tcpopts;     /* packed TCP options */
643*aca3beaaSApple OSS Distributions 	u_int16_t               fp_wsize;       /* TCP window size */
644*aca3beaaSApple OSS Distributions 	u_int16_t               fp_psize;       /* ip->ip_len */
645*aca3beaaSApple OSS Distributions 	u_int16_t               fp_mss;         /* TCP MSS */
646*aca3beaaSApple OSS Distributions 	u_int16_t               fp_flags;
647*aca3beaaSApple OSS Distributions 	u_int8_t                fp_optcnt;      /* TCP option count */
648*aca3beaaSApple OSS Distributions 	u_int8_t                fp_wscale;      /* TCP window scaling */
649*aca3beaaSApple OSS Distributions 	u_int8_t                fp_ttl;         /* IPv4 TTL */
650*aca3beaaSApple OSS Distributions 
651*aca3beaaSApple OSS Distributions 	int                     fp_getnum;      /* DIOCOSFPGET number */
652*aca3beaaSApple OSS Distributions };
653*aca3beaaSApple OSS Distributions 
654*aca3beaaSApple OSS Distributions 
655*aca3beaaSApple OSS Distributions union pf_rule_ptr {
656*aca3beaaSApple OSS Distributions 	struct pf_rule          *ptr            __attribute__((aligned(8)));
657*aca3beaaSApple OSS Distributions 	u_int32_t                nr             __attribute__((aligned(8)));
658*aca3beaaSApple OSS Distributions } __attribute__((aligned(8)));
659*aca3beaaSApple OSS Distributions 
660*aca3beaaSApple OSS Distributions #define PF_ANCHOR_NAME_SIZE      64
661*aca3beaaSApple OSS Distributions 
662*aca3beaaSApple OSS Distributions struct pf_rule {
663*aca3beaaSApple OSS Distributions 	struct pf_rule_addr      src;
664*aca3beaaSApple OSS Distributions 	struct pf_rule_addr      dst;
665*aca3beaaSApple OSS Distributions #define PF_SKIP_IFP             0
666*aca3beaaSApple OSS Distributions #define PF_SKIP_DIR             1
667*aca3beaaSApple OSS Distributions #define PF_SKIP_AF              2
668*aca3beaaSApple OSS Distributions #define PF_SKIP_PROTO           3
669*aca3beaaSApple OSS Distributions #define PF_SKIP_SRC_ADDR        4
670*aca3beaaSApple OSS Distributions #define PF_SKIP_SRC_PORT        5
671*aca3beaaSApple OSS Distributions #define PF_SKIP_DST_ADDR        6
672*aca3beaaSApple OSS Distributions #define PF_SKIP_DST_PORT        7
673*aca3beaaSApple OSS Distributions #define PF_SKIP_COUNT           8
674*aca3beaaSApple OSS Distributions 	union pf_rule_ptr        skip[PF_SKIP_COUNT];
675*aca3beaaSApple OSS Distributions #define PF_RULE_LABEL_SIZE       64
676*aca3beaaSApple OSS Distributions 	char                     label[PF_RULE_LABEL_SIZE];
677*aca3beaaSApple OSS Distributions #define PF_QNAME_SIZE            64
678*aca3beaaSApple OSS Distributions 	char                     ifname[IFNAMSIZ];
679*aca3beaaSApple OSS Distributions 	char                     qname[PF_QNAME_SIZE];
680*aca3beaaSApple OSS Distributions 	char                     pqname[PF_QNAME_SIZE];
681*aca3beaaSApple OSS Distributions #define PF_TAG_NAME_SIZE         64
682*aca3beaaSApple OSS Distributions 	char                     tagname[PF_TAG_NAME_SIZE];
683*aca3beaaSApple OSS Distributions 	char                     match_tagname[PF_TAG_NAME_SIZE];
684*aca3beaaSApple OSS Distributions 
685*aca3beaaSApple OSS Distributions 	char                     overload_tblname[PF_TABLE_NAME_SIZE];
686*aca3beaaSApple OSS Distributions 
687*aca3beaaSApple OSS Distributions 	TAILQ_ENTRY(pf_rule)     entries;
688*aca3beaaSApple OSS Distributions #if !defined(__LP64__)
689*aca3beaaSApple OSS Distributions 	u_int32_t                _pad[2];
690*aca3beaaSApple OSS Distributions #endif /* !__LP64__ */
691*aca3beaaSApple OSS Distributions 	struct pf_pool           rpool;
692*aca3beaaSApple OSS Distributions 
693*aca3beaaSApple OSS Distributions 	u_int64_t                evaluations;
694*aca3beaaSApple OSS Distributions 	u_int64_t                packets[2];
695*aca3beaaSApple OSS Distributions 	u_int64_t                bytes[2];
696*aca3beaaSApple OSS Distributions 
697*aca3beaaSApple OSS Distributions 	u_int64_t                ticket;
698*aca3beaaSApple OSS Distributions #define PF_OWNER_NAME_SIZE       64
699*aca3beaaSApple OSS Distributions 	char                     owner[PF_OWNER_NAME_SIZE];
700*aca3beaaSApple OSS Distributions 	u_int32_t                priority;
701*aca3beaaSApple OSS Distributions 
702*aca3beaaSApple OSS Distributions #ifdef KERNEL
703*aca3beaaSApple OSS Distributions 	struct pfi_kif          *kif            __attribute__((aligned(8)));
704*aca3beaaSApple OSS Distributions #else /* !KERNEL */
705*aca3beaaSApple OSS Distributions 	void                    *kif            __attribute__((aligned(8)));
706*aca3beaaSApple OSS Distributions #endif /* !KERNEL */
707*aca3beaaSApple OSS Distributions 	struct pf_anchor        *anchor         __attribute__((aligned(8)));
708*aca3beaaSApple OSS Distributions #ifdef KERNEL
709*aca3beaaSApple OSS Distributions 	struct pfr_ktable       *overload_tbl   __attribute__((aligned(8)));
710*aca3beaaSApple OSS Distributions #else /* !KERNEL */
711*aca3beaaSApple OSS Distributions 	void                    *overload_tbl   __attribute__((aligned(8)));
712*aca3beaaSApple OSS Distributions #endif /* !KERNEL */
713*aca3beaaSApple OSS Distributions 
714*aca3beaaSApple OSS Distributions 	pf_osfp_t                os_fingerprint __attribute__((aligned(8)));
715*aca3beaaSApple OSS Distributions 
716*aca3beaaSApple OSS Distributions 	unsigned int             rtableid;
717*aca3beaaSApple OSS Distributions 	u_int32_t                timeout[PFTM_MAX];
718*aca3beaaSApple OSS Distributions 	u_int32_t                states;
719*aca3beaaSApple OSS Distributions 	u_int32_t                max_states;
720*aca3beaaSApple OSS Distributions 	u_int32_t                src_nodes;
721*aca3beaaSApple OSS Distributions 	u_int32_t                max_src_nodes;
722*aca3beaaSApple OSS Distributions 	u_int32_t                max_src_states;
723*aca3beaaSApple OSS Distributions 	u_int32_t                max_src_conn;
724*aca3beaaSApple OSS Distributions 	struct {
725*aca3beaaSApple OSS Distributions 		u_int32_t               limit;
726*aca3beaaSApple OSS Distributions 		u_int32_t               seconds;
727*aca3beaaSApple OSS Distributions 	}                        max_src_conn_rate;
728*aca3beaaSApple OSS Distributions 	u_int32_t                qid;
729*aca3beaaSApple OSS Distributions 	u_int32_t                pqid;
730*aca3beaaSApple OSS Distributions 	u_int32_t                rt_listid;
731*aca3beaaSApple OSS Distributions 	u_int32_t                nr;
732*aca3beaaSApple OSS Distributions 	u_int32_t                prob;
733*aca3beaaSApple OSS Distributions 	uid_t                    cuid;
734*aca3beaaSApple OSS Distributions 	pid_t                    cpid;
735*aca3beaaSApple OSS Distributions 
736*aca3beaaSApple OSS Distributions 	u_int16_t                return_icmp;
737*aca3beaaSApple OSS Distributions 	u_int16_t                return_icmp6;
738*aca3beaaSApple OSS Distributions 	u_int16_t                max_mss;
739*aca3beaaSApple OSS Distributions 	u_int16_t                tag;
740*aca3beaaSApple OSS Distributions 	u_int16_t                match_tag;
741*aca3beaaSApple OSS Distributions 
742*aca3beaaSApple OSS Distributions 	struct pf_rule_uid       uid;
743*aca3beaaSApple OSS Distributions 	struct pf_rule_gid       gid;
744*aca3beaaSApple OSS Distributions 
745*aca3beaaSApple OSS Distributions 	u_int32_t                rule_flag;
746*aca3beaaSApple OSS Distributions 	u_int8_t                 action;
747*aca3beaaSApple OSS Distributions 	u_int8_t                 direction;
748*aca3beaaSApple OSS Distributions 	u_int8_t                 log;
749*aca3beaaSApple OSS Distributions 	u_int8_t                 logif;
750*aca3beaaSApple OSS Distributions 	u_int8_t                 quick;
751*aca3beaaSApple OSS Distributions 	u_int8_t                 ifnot;
752*aca3beaaSApple OSS Distributions 	u_int8_t                 match_tag_not;
753*aca3beaaSApple OSS Distributions 	u_int8_t                 natpass;
754*aca3beaaSApple OSS Distributions 
755*aca3beaaSApple OSS Distributions #define PF_STATE_NORMAL         0x1
756*aca3beaaSApple OSS Distributions #define PF_STATE_MODULATE       0x2
757*aca3beaaSApple OSS Distributions #define PF_STATE_SYNPROXY       0x3
758*aca3beaaSApple OSS Distributions 	u_int8_t                 keep_state;
759*aca3beaaSApple OSS Distributions 	sa_family_t              af;
760*aca3beaaSApple OSS Distributions 	u_int8_t                 proto;
761*aca3beaaSApple OSS Distributions 	u_int8_t                 type;
762*aca3beaaSApple OSS Distributions 	u_int8_t                 code;
763*aca3beaaSApple OSS Distributions 	u_int8_t                 flags;
764*aca3beaaSApple OSS Distributions 	u_int8_t                 flagset;
765*aca3beaaSApple OSS Distributions 	u_int8_t                 min_ttl;
766*aca3beaaSApple OSS Distributions 	u_int8_t                 allow_opts;
767*aca3beaaSApple OSS Distributions 	u_int8_t                 rt;
768*aca3beaaSApple OSS Distributions 	u_int8_t                 return_ttl;
769*aca3beaaSApple OSS Distributions 
770*aca3beaaSApple OSS Distributions /* service class categories */
771*aca3beaaSApple OSS Distributions #define SCIDX_MASK              0x0f
772*aca3beaaSApple OSS Distributions #define SC_BE                   0x10
773*aca3beaaSApple OSS Distributions #define SC_BK_SYS               0x11
774*aca3beaaSApple OSS Distributions #define SC_BK                   0x12
775*aca3beaaSApple OSS Distributions #define SC_RD                   0x13
776*aca3beaaSApple OSS Distributions #define SC_OAM                  0x14
777*aca3beaaSApple OSS Distributions #define SC_AV                   0x15
778*aca3beaaSApple OSS Distributions #define SC_RV                   0x16
779*aca3beaaSApple OSS Distributions #define SC_VI                   0x17
780*aca3beaaSApple OSS Distributions #define SC_SIG                  0x17
781*aca3beaaSApple OSS Distributions #define SC_VO                   0x18
782*aca3beaaSApple OSS Distributions #define SC_CTL                  0x19
783*aca3beaaSApple OSS Distributions 
784*aca3beaaSApple OSS Distributions /* diffserve code points */
785*aca3beaaSApple OSS Distributions #define DSCP_MASK               0xfc
786*aca3beaaSApple OSS Distributions #define DSCP_CUMASK             0x03
787*aca3beaaSApple OSS Distributions #define DSCP_EF                 0xb8
788*aca3beaaSApple OSS Distributions #define DSCP_AF11               0x28
789*aca3beaaSApple OSS Distributions #define DSCP_AF12               0x30
790*aca3beaaSApple OSS Distributions #define DSCP_AF13               0x38
791*aca3beaaSApple OSS Distributions #define DSCP_AF21               0x48
792*aca3beaaSApple OSS Distributions #define DSCP_AF22               0x50
793*aca3beaaSApple OSS Distributions #define DSCP_AF23               0x58
794*aca3beaaSApple OSS Distributions #define DSCP_AF31               0x68
795*aca3beaaSApple OSS Distributions #define DSCP_AF32               0x70
796*aca3beaaSApple OSS Distributions #define DSCP_AF33               0x78
797*aca3beaaSApple OSS Distributions #define DSCP_AF41               0x88
798*aca3beaaSApple OSS Distributions #define DSCP_AF42               0x90
799*aca3beaaSApple OSS Distributions #define DSCP_AF43               0x98
800*aca3beaaSApple OSS Distributions #define AF_CLASSMASK            0xe0
801*aca3beaaSApple OSS Distributions #define AF_DROPPRECMASK         0x18
802*aca3beaaSApple OSS Distributions 	u_int8_t                 tos;
803*aca3beaaSApple OSS Distributions 	u_int8_t                 anchor_relative;
804*aca3beaaSApple OSS Distributions 	u_int8_t                 anchor_wildcard;
805*aca3beaaSApple OSS Distributions 
806*aca3beaaSApple OSS Distributions #define PF_FLUSH                0x01
807*aca3beaaSApple OSS Distributions #define PF_FLUSH_GLOBAL         0x02
808*aca3beaaSApple OSS Distributions 	u_int8_t                 flush;
809*aca3beaaSApple OSS Distributions 
810*aca3beaaSApple OSS Distributions 	u_int8_t                proto_variant;
811*aca3beaaSApple OSS Distributions 	u_int8_t                extfilter; /* Filter mode [PF_EXTFILTER_xxx] */
812*aca3beaaSApple OSS Distributions 	u_int8_t                extmap;    /* Mapping mode [PF_EXTMAP_xxx] */
813*aca3beaaSApple OSS Distributions 	u_int32_t               dnpipe;
814*aca3beaaSApple OSS Distributions 	u_int32_t               dntype;
815*aca3beaaSApple OSS Distributions };
816*aca3beaaSApple OSS Distributions 
817*aca3beaaSApple OSS Distributions /* pf device identifiers */
818*aca3beaaSApple OSS Distributions #define PFDEV_PF                0
819*aca3beaaSApple OSS Distributions #define PFDEV_PFM               1
820*aca3beaaSApple OSS Distributions #define PFDEV_MAX               2
821*aca3beaaSApple OSS Distributions 
822*aca3beaaSApple OSS Distributions /* rule flags */
823*aca3beaaSApple OSS Distributions #define PFRULE_DROP             0x0000
824*aca3beaaSApple OSS Distributions #define PFRULE_RETURNRST        0x0001
825*aca3beaaSApple OSS Distributions #define PFRULE_FRAGMENT         0x0002
826*aca3beaaSApple OSS Distributions #define PFRULE_RETURNICMP       0x0004
827*aca3beaaSApple OSS Distributions #define PFRULE_RETURN           0x0008
828*aca3beaaSApple OSS Distributions #define PFRULE_NOSYNC           0x0010
829*aca3beaaSApple OSS Distributions #define PFRULE_SRCTRACK         0x0020  /* track source states */
830*aca3beaaSApple OSS Distributions #define PFRULE_RULESRCTRACK     0x0040  /* per rule */
831*aca3beaaSApple OSS Distributions 
832*aca3beaaSApple OSS Distributions /* scrub flags */
833*aca3beaaSApple OSS Distributions #define PFRULE_NODF             0x0100
834*aca3beaaSApple OSS Distributions #define PFRULE_FRAGCROP         0x0200  /* non-buffering frag cache */
835*aca3beaaSApple OSS Distributions #define PFRULE_FRAGDROP         0x0400  /* drop funny fragments */
836*aca3beaaSApple OSS Distributions #define PFRULE_RANDOMID         0x0800
837*aca3beaaSApple OSS Distributions #define PFRULE_REASSEMBLE_TCP   0x1000
838*aca3beaaSApple OSS Distributions 
839*aca3beaaSApple OSS Distributions /* rule flags for TOS/DSCP/service class differentiation */
840*aca3beaaSApple OSS Distributions #define PFRULE_TOS              0x2000
841*aca3beaaSApple OSS Distributions #define PFRULE_DSCP             0x4000
842*aca3beaaSApple OSS Distributions #define PFRULE_SC               0x8000
843*aca3beaaSApple OSS Distributions 
844*aca3beaaSApple OSS Distributions /* rule flags again */
845*aca3beaaSApple OSS Distributions #define PFRULE_IFBOUND          0x00010000      /* if-bound */
846*aca3beaaSApple OSS Distributions #define PFRULE_PFM              0x00020000      /* created by pfm device */
847*aca3beaaSApple OSS Distributions 
848*aca3beaaSApple OSS Distributions #define PFSTATE_HIWAT           10000   /* default state table size */
849*aca3beaaSApple OSS Distributions #define PFSTATE_ADAPT_START     6000    /* default adaptive timeout start */
850*aca3beaaSApple OSS Distributions #define PFSTATE_ADAPT_END       12000   /* default adaptive timeout end */
851*aca3beaaSApple OSS Distributions 
852*aca3beaaSApple OSS Distributions #define PFAPPSTATE_HIWAT        10000   /* default same as state table */
853*aca3beaaSApple OSS Distributions 
854*aca3beaaSApple OSS Distributions /* PF reserved special purpose tags */
855*aca3beaaSApple OSS Distributions #define PF_TAG_NAME_SYSTEM_SERVICE    "com.apple.pf.system_service_tag"
856*aca3beaaSApple OSS Distributions #define PF_TAG_NAME_STACK_DROP        "com.apple.pf.stack_drop_tag"
857*aca3beaaSApple OSS Distributions 
858*aca3beaaSApple OSS Distributions enum pf_extmap {
859*aca3beaaSApple OSS Distributions 	PF_EXTMAP_APD   = 1,    /* Address-port-dependent mapping */
860*aca3beaaSApple OSS Distributions 	PF_EXTMAP_AD,           /* Address-dependent mapping */
861*aca3beaaSApple OSS Distributions 	PF_EXTMAP_EI            /* Endpoint-independent mapping */
862*aca3beaaSApple OSS Distributions };
863*aca3beaaSApple OSS Distributions 
864*aca3beaaSApple OSS Distributions enum pf_extfilter {
865*aca3beaaSApple OSS Distributions 	PF_EXTFILTER_APD = 1,   /* Address-port-dependent filtering */
866*aca3beaaSApple OSS Distributions 	PF_EXTFILTER_AD,        /* Address-dependent filtering */
867*aca3beaaSApple OSS Distributions 	PF_EXTFILTER_EI         /* Endpoint-independent filtering */
868*aca3beaaSApple OSS Distributions };
869*aca3beaaSApple OSS Distributions 
870*aca3beaaSApple OSS Distributions struct pf_threshold {
871*aca3beaaSApple OSS Distributions 	u_int32_t       limit;
872*aca3beaaSApple OSS Distributions #define PF_THRESHOLD_MULT       1000
873*aca3beaaSApple OSS Distributions #define PF_THRESHOLD_MAX        0xffffffff / PF_THRESHOLD_MULT
874*aca3beaaSApple OSS Distributions 	u_int32_t       seconds;
875*aca3beaaSApple OSS Distributions 	u_int32_t       count;
876*aca3beaaSApple OSS Distributions 	u_int32_t       last;
877*aca3beaaSApple OSS Distributions };
878*aca3beaaSApple OSS Distributions 
879*aca3beaaSApple OSS Distributions struct pf_src_node {
880*aca3beaaSApple OSS Distributions 	RB_ENTRY(pf_src_node) entry;
881*aca3beaaSApple OSS Distributions 	struct pf_addr   addr;
882*aca3beaaSApple OSS Distributions 	struct pf_addr   raddr;
883*aca3beaaSApple OSS Distributions 	union pf_rule_ptr rule;
884*aca3beaaSApple OSS Distributions #ifdef KERNEL
885*aca3beaaSApple OSS Distributions 	struct pfi_kif  *kif;
886*aca3beaaSApple OSS Distributions #else /* !KERNEL */
887*aca3beaaSApple OSS Distributions 	void            *kif;
888*aca3beaaSApple OSS Distributions #endif /* !KERNEL */
889*aca3beaaSApple OSS Distributions 	u_int64_t        bytes[2];
890*aca3beaaSApple OSS Distributions 	u_int64_t        packets[2];
891*aca3beaaSApple OSS Distributions 	u_int32_t        states;
892*aca3beaaSApple OSS Distributions 	u_int32_t        conn;
893*aca3beaaSApple OSS Distributions 	struct pf_threshold     conn_rate;
894*aca3beaaSApple OSS Distributions 	u_int64_t        creation;
895*aca3beaaSApple OSS Distributions 	u_int64_t        expire;
896*aca3beaaSApple OSS Distributions 	sa_family_t      af;
897*aca3beaaSApple OSS Distributions 	u_int8_t         ruletype;
898*aca3beaaSApple OSS Distributions };
899*aca3beaaSApple OSS Distributions 
900*aca3beaaSApple OSS Distributions #define PFSNODE_HIWAT           10000   /* default source node table size */
901*aca3beaaSApple OSS Distributions 
902*aca3beaaSApple OSS Distributions #ifdef KERNEL
903*aca3beaaSApple OSS Distributions struct pf_state_scrub {
904*aca3beaaSApple OSS Distributions 	struct timeval  pfss_last;      /* time received last packet	*/
905*aca3beaaSApple OSS Distributions 	u_int32_t       pfss_tsecr;     /* last echoed timestamp	*/
906*aca3beaaSApple OSS Distributions 	u_int32_t       pfss_tsval;     /* largest timestamp		*/
907*aca3beaaSApple OSS Distributions 	u_int32_t       pfss_tsval0;    /* original timestamp		*/
908*aca3beaaSApple OSS Distributions 	u_int16_t       pfss_flags;
909*aca3beaaSApple OSS Distributions #define PFSS_TIMESTAMP  0x0001          /* modulate timestamp		*/
910*aca3beaaSApple OSS Distributions #define PFSS_PAWS       0x0010          /* stricter PAWS checks		*/
911*aca3beaaSApple OSS Distributions #define PFSS_PAWS_IDLED 0x0020          /* was idle too long.  no PAWS	*/
912*aca3beaaSApple OSS Distributions #define PFSS_DATA_TS    0x0040          /* timestamp on data packets	*/
913*aca3beaaSApple OSS Distributions #define PFSS_DATA_NOTS  0x0080          /* no timestamp on data packets	*/
914*aca3beaaSApple OSS Distributions 	u_int8_t        pfss_ttl;       /* stashed TTL			*/
915*aca3beaaSApple OSS Distributions 	u_int8_t        pad;
916*aca3beaaSApple OSS Distributions 	u_int32_t       pfss_ts_mod;    /* timestamp modulation		*/
917*aca3beaaSApple OSS Distributions };
918*aca3beaaSApple OSS Distributions #endif /* KERNEL */
919*aca3beaaSApple OSS Distributions 
920*aca3beaaSApple OSS Distributions union pf_state_xport {
921*aca3beaaSApple OSS Distributions 	u_int16_t       port;
922*aca3beaaSApple OSS Distributions 	u_int16_t       call_id;
923*aca3beaaSApple OSS Distributions 	u_int32_t       spi;
924*aca3beaaSApple OSS Distributions };
925*aca3beaaSApple OSS Distributions 
926*aca3beaaSApple OSS Distributions struct pf_state_host {
927*aca3beaaSApple OSS Distributions 	struct pf_addr          addr;
928*aca3beaaSApple OSS Distributions 	union pf_state_xport    xport;
929*aca3beaaSApple OSS Distributions };
930*aca3beaaSApple OSS Distributions 
931*aca3beaaSApple OSS Distributions #ifdef KERNEL
932*aca3beaaSApple OSS Distributions struct pf_state_peer {
933*aca3beaaSApple OSS Distributions 	u_int32_t       seqlo;          /* Max sequence number sent	*/
934*aca3beaaSApple OSS Distributions 	u_int32_t       seqhi;          /* Max the other end ACKd + win	*/
935*aca3beaaSApple OSS Distributions 	u_int32_t       seqdiff;        /* Sequence number modulator	*/
936*aca3beaaSApple OSS Distributions 	u_int16_t       max_win;        /* largest window (pre scaling)	*/
937*aca3beaaSApple OSS Distributions 	u_int8_t        state;          /* active state level		*/
938*aca3beaaSApple OSS Distributions 	u_int8_t        wscale;         /* window scaling factor	*/
939*aca3beaaSApple OSS Distributions 	u_int16_t       mss;            /* Maximum segment size option	*/
940*aca3beaaSApple OSS Distributions 	u_int8_t        tcp_est;        /* Did we reach TCPS_ESTABLISHED */
941*aca3beaaSApple OSS Distributions 	struct pf_state_scrub   *scrub; /* state is scrubbed		*/
942*aca3beaaSApple OSS Distributions 	u_int8_t        pad[3];
943*aca3beaaSApple OSS Distributions };
944*aca3beaaSApple OSS Distributions 
945*aca3beaaSApple OSS Distributions TAILQ_HEAD(pf_state_queue, pf_state);
946*aca3beaaSApple OSS Distributions 
947*aca3beaaSApple OSS Distributions struct pf_state;
948*aca3beaaSApple OSS Distributions struct pf_pdesc;
949*aca3beaaSApple OSS Distributions struct pf_app_state;
950*aca3beaaSApple OSS Distributions 
951*aca3beaaSApple OSS Distributions typedef void (*pf_app_handler)(struct pf_state *, int, int, struct pf_pdesc *,
952*aca3beaaSApple OSS Distributions     struct pfi_kif *);
953*aca3beaaSApple OSS Distributions 
954*aca3beaaSApple OSS Distributions typedef int (*pf_app_compare)(struct pf_app_state *, struct pf_app_state *);
955*aca3beaaSApple OSS Distributions 
956*aca3beaaSApple OSS Distributions struct pf_pptp_state {
957*aca3beaaSApple OSS Distributions 	struct pf_state *grev1_state;
958*aca3beaaSApple OSS Distributions };
959*aca3beaaSApple OSS Distributions 
960*aca3beaaSApple OSS Distributions struct pf_grev1_state {
961*aca3beaaSApple OSS Distributions 	struct pf_state *pptp_state;
962*aca3beaaSApple OSS Distributions };
963*aca3beaaSApple OSS Distributions 
964*aca3beaaSApple OSS Distributions struct pf_ike_state {
965*aca3beaaSApple OSS Distributions 	u_int64_t cookie;
966*aca3beaaSApple OSS Distributions };
967*aca3beaaSApple OSS Distributions 
968*aca3beaaSApple OSS Distributions struct pf_app_state {
969*aca3beaaSApple OSS Distributions 	pf_app_handler  handler;
970*aca3beaaSApple OSS Distributions 	pf_app_compare  compare_lan_ext;
971*aca3beaaSApple OSS Distributions 	pf_app_compare  compare_ext_gwy;
972*aca3beaaSApple OSS Distributions 	union {
973*aca3beaaSApple OSS Distributions 		struct pf_pptp_state pptp;
974*aca3beaaSApple OSS Distributions 		struct pf_grev1_state grev1;
975*aca3beaaSApple OSS Distributions 		struct pf_ike_state ike;
976*aca3beaaSApple OSS Distributions 	} u;
977*aca3beaaSApple OSS Distributions };
978*aca3beaaSApple OSS Distributions 
979*aca3beaaSApple OSS Distributions /* keep synced with struct pf_state, used in RB_FIND */
980*aca3beaaSApple OSS Distributions struct pf_state_key_cmp {
981*aca3beaaSApple OSS Distributions 	struct pf_state_host lan;
982*aca3beaaSApple OSS Distributions 	struct pf_state_host gwy;
983*aca3beaaSApple OSS Distributions 	struct pf_state_host ext_lan;
984*aca3beaaSApple OSS Distributions 	struct pf_state_host ext_gwy;
985*aca3beaaSApple OSS Distributions 	sa_family_t      af_lan;
986*aca3beaaSApple OSS Distributions 	sa_family_t      af_gwy;
987*aca3beaaSApple OSS Distributions 	u_int8_t         proto;
988*aca3beaaSApple OSS Distributions 	u_int8_t         direction;
989*aca3beaaSApple OSS Distributions 	u_int8_t         proto_variant;
990*aca3beaaSApple OSS Distributions 	struct pf_app_state     *app_state;
991*aca3beaaSApple OSS Distributions };
992*aca3beaaSApple OSS Distributions 
993*aca3beaaSApple OSS Distributions TAILQ_HEAD(pf_statelist, pf_state);
994*aca3beaaSApple OSS Distributions 
995*aca3beaaSApple OSS Distributions struct pf_state_key {
996*aca3beaaSApple OSS Distributions 	struct pf_state_host lan;
997*aca3beaaSApple OSS Distributions 	struct pf_state_host gwy;
998*aca3beaaSApple OSS Distributions 	struct pf_state_host ext_lan;
999*aca3beaaSApple OSS Distributions 	struct pf_state_host ext_gwy;
1000*aca3beaaSApple OSS Distributions 	sa_family_t      af_lan;
1001*aca3beaaSApple OSS Distributions 	sa_family_t      af_gwy;
1002*aca3beaaSApple OSS Distributions 	u_int8_t         proto;
1003*aca3beaaSApple OSS Distributions 	u_int8_t         direction;
1004*aca3beaaSApple OSS Distributions 	u_int8_t         proto_variant;
1005*aca3beaaSApple OSS Distributions 	struct pf_app_state     *app_state;
1006*aca3beaaSApple OSS Distributions 	u_int32_t        flowsrc;
1007*aca3beaaSApple OSS Distributions 	u_int32_t        flowhash;
1008*aca3beaaSApple OSS Distributions 
1009*aca3beaaSApple OSS Distributions 	RB_ENTRY(pf_state_key)   entry_lan_ext;
1010*aca3beaaSApple OSS Distributions 	RB_ENTRY(pf_state_key)   entry_ext_gwy;
1011*aca3beaaSApple OSS Distributions 	struct pf_statelist      states;
1012*aca3beaaSApple OSS Distributions 	u_int32_t        refcnt;
1013*aca3beaaSApple OSS Distributions };
1014*aca3beaaSApple OSS Distributions 
1015*aca3beaaSApple OSS Distributions 
1016*aca3beaaSApple OSS Distributions /* keep synced with struct pf_state, used in RB_FIND */
1017*aca3beaaSApple OSS Distributions struct pf_state_cmp {
1018*aca3beaaSApple OSS Distributions 	u_int64_t        id;
1019*aca3beaaSApple OSS Distributions 	u_int32_t        creatorid;
1020*aca3beaaSApple OSS Distributions 	u_int32_t        pad;
1021*aca3beaaSApple OSS Distributions };
1022*aca3beaaSApple OSS Distributions 
1023*aca3beaaSApple OSS Distributions /* flowhash key (12-bytes multiple for performance) */
1024*aca3beaaSApple OSS Distributions struct pf_flowhash_key {
1025*aca3beaaSApple OSS Distributions 	struct pf_state_host    ap1;    /* address+port blob 1 */
1026*aca3beaaSApple OSS Distributions 	struct pf_state_host    ap2;    /* address+port blob 2 */
1027*aca3beaaSApple OSS Distributions 	u_int32_t               af;
1028*aca3beaaSApple OSS Distributions 	u_int32_t               proto;
1029*aca3beaaSApple OSS Distributions };
1030*aca3beaaSApple OSS Distributions #endif /* KERNEL */
1031*aca3beaaSApple OSS Distributions 
1032*aca3beaaSApple OSS Distributions struct hook_desc;
1033*aca3beaaSApple OSS Distributions TAILQ_HEAD(hook_desc_head, hook_desc);
1034*aca3beaaSApple OSS Distributions 
1035*aca3beaaSApple OSS Distributions #ifdef KERNEL
1036*aca3beaaSApple OSS Distributions struct pf_state {
1037*aca3beaaSApple OSS Distributions 	u_int64_t                id;
1038*aca3beaaSApple OSS Distributions 	u_int32_t                creatorid;
1039*aca3beaaSApple OSS Distributions 	u_int32_t                pad;
1040*aca3beaaSApple OSS Distributions 
1041*aca3beaaSApple OSS Distributions 	TAILQ_ENTRY(pf_state)    entry_list;
1042*aca3beaaSApple OSS Distributions 	TAILQ_ENTRY(pf_state)    next;
1043*aca3beaaSApple OSS Distributions 	RB_ENTRY(pf_state)       entry_id;
1044*aca3beaaSApple OSS Distributions 	struct pf_state_peer     src;
1045*aca3beaaSApple OSS Distributions 	struct pf_state_peer     dst;
1046*aca3beaaSApple OSS Distributions 	union pf_rule_ptr        rule;
1047*aca3beaaSApple OSS Distributions 	union pf_rule_ptr        anchor;
1048*aca3beaaSApple OSS Distributions 	union pf_rule_ptr        nat_rule;
1049*aca3beaaSApple OSS Distributions 	struct pf_addr           rt_addr;
1050*aca3beaaSApple OSS Distributions 	struct hook_desc_head    unlink_hooks;
1051*aca3beaaSApple OSS Distributions 	struct pf_state_key     *state_key;
1052*aca3beaaSApple OSS Distributions 	struct pfi_kif          *kif;
1053*aca3beaaSApple OSS Distributions 	struct pfi_kif          *rt_kif;
1054*aca3beaaSApple OSS Distributions 	struct pf_src_node      *src_node;
1055*aca3beaaSApple OSS Distributions 	struct pf_src_node      *nat_src_node;
1056*aca3beaaSApple OSS Distributions 	u_int64_t                packets[2];
1057*aca3beaaSApple OSS Distributions 	u_int64_t                bytes[2];
1058*aca3beaaSApple OSS Distributions 	u_int64_t                creation;
1059*aca3beaaSApple OSS Distributions 	u_int64_t                expire;
1060*aca3beaaSApple OSS Distributions 	u_int64_t                pfsync_time;
1061*aca3beaaSApple OSS Distributions 	u_int16_t                tag;
1062*aca3beaaSApple OSS Distributions 	u_int8_t                 log;
1063*aca3beaaSApple OSS Distributions 	u_int8_t                 allow_opts;
1064*aca3beaaSApple OSS Distributions 	u_int8_t                 timeout;
1065*aca3beaaSApple OSS Distributions 	u_int8_t                 sync_flags;
1066*aca3beaaSApple OSS Distributions #if SKYWALK
1067*aca3beaaSApple OSS Distributions 	netns_token              nstoken;
1068*aca3beaaSApple OSS Distributions #endif
1069*aca3beaaSApple OSS Distributions };
1070*aca3beaaSApple OSS Distributions #endif /* KERNEL */
1071*aca3beaaSApple OSS Distributions 
1072*aca3beaaSApple OSS Distributions #define PFSTATE_NOSYNC   0x01
1073*aca3beaaSApple OSS Distributions #define PFSTATE_FROMSYNC 0x02
1074*aca3beaaSApple OSS Distributions #define PFSTATE_STALE    0x04
1075*aca3beaaSApple OSS Distributions 
1076*aca3beaaSApple OSS Distributions #define __packed        __attribute__((__packed__))
1077*aca3beaaSApple OSS Distributions 
1078*aca3beaaSApple OSS Distributions /*
1079*aca3beaaSApple OSS Distributions  * Unified state structures for pulling states out of the kernel
1080*aca3beaaSApple OSS Distributions  * used by pfsync(4) and the pf(4) ioctl.
1081*aca3beaaSApple OSS Distributions  */
1082*aca3beaaSApple OSS Distributions struct pfsync_state_scrub {
1083*aca3beaaSApple OSS Distributions 	u_int16_t       pfss_flags;
1084*aca3beaaSApple OSS Distributions 	u_int8_t        pfss_ttl;       /* stashed TTL		*/
1085*aca3beaaSApple OSS Distributions #define PFSYNC_SCRUB_FLAG_VALID         0x01
1086*aca3beaaSApple OSS Distributions 	u_int8_t        scrub_flag;
1087*aca3beaaSApple OSS Distributions 	u_int32_t       pfss_ts_mod;    /* timestamp modulation	*/
1088*aca3beaaSApple OSS Distributions } __packed;
1089*aca3beaaSApple OSS Distributions 
1090*aca3beaaSApple OSS Distributions struct pfsync_state_host {
1091*aca3beaaSApple OSS Distributions 	struct pf_addr          addr;
1092*aca3beaaSApple OSS Distributions 	union pf_state_xport    xport;
1093*aca3beaaSApple OSS Distributions 	u_int16_t               pad[2];
1094*aca3beaaSApple OSS Distributions } __packed;
1095*aca3beaaSApple OSS Distributions 
1096*aca3beaaSApple OSS Distributions struct pfsync_state_peer {
1097*aca3beaaSApple OSS Distributions 	struct pfsync_state_scrub scrub;        /* state is scrubbed	*/
1098*aca3beaaSApple OSS Distributions 	u_int32_t       seqlo;          /* Max sequence number sent	*/
1099*aca3beaaSApple OSS Distributions 	u_int32_t       seqhi;          /* Max the other end ACKd + win	*/
1100*aca3beaaSApple OSS Distributions 	u_int32_t       seqdiff;        /* Sequence number modulator	*/
1101*aca3beaaSApple OSS Distributions 	u_int16_t       max_win;        /* largest window (pre scaling)	*/
1102*aca3beaaSApple OSS Distributions 	u_int16_t       mss;            /* Maximum segment size option	*/
1103*aca3beaaSApple OSS Distributions 	u_int8_t        state;          /* active state level		*/
1104*aca3beaaSApple OSS Distributions 	u_int8_t        wscale;         /* window scaling factor	*/
1105*aca3beaaSApple OSS Distributions 	u_int8_t        pad[6];
1106*aca3beaaSApple OSS Distributions } __packed;
1107*aca3beaaSApple OSS Distributions 
1108*aca3beaaSApple OSS Distributions struct pfsync_state {
1109*aca3beaaSApple OSS Distributions 	u_int32_t        id[2];
1110*aca3beaaSApple OSS Distributions 	char             ifname[IFNAMSIZ];
1111*aca3beaaSApple OSS Distributions 	struct pfsync_state_host lan;
1112*aca3beaaSApple OSS Distributions 	struct pfsync_state_host gwy;
1113*aca3beaaSApple OSS Distributions 	struct pfsync_state_host ext_lan;
1114*aca3beaaSApple OSS Distributions 	struct pfsync_state_host ext_gwy;
1115*aca3beaaSApple OSS Distributions 	struct pfsync_state_peer src;
1116*aca3beaaSApple OSS Distributions 	struct pfsync_state_peer dst;
1117*aca3beaaSApple OSS Distributions 	struct pf_addr   rt_addr;
1118*aca3beaaSApple OSS Distributions 	struct hook_desc_head unlink_hooks;
1119*aca3beaaSApple OSS Distributions #if !defined(__LP64__)
1120*aca3beaaSApple OSS Distributions 	u_int32_t       _pad[2];
1121*aca3beaaSApple OSS Distributions #endif /* !__LP64__ */
1122*aca3beaaSApple OSS Distributions 	u_int32_t        rule;
1123*aca3beaaSApple OSS Distributions 	u_int32_t        anchor;
1124*aca3beaaSApple OSS Distributions 	u_int32_t        nat_rule;
1125*aca3beaaSApple OSS Distributions 	u_int64_t        creation;
1126*aca3beaaSApple OSS Distributions 	u_int64_t        expire;
1127*aca3beaaSApple OSS Distributions 	u_int32_t        packets[2][2];
1128*aca3beaaSApple OSS Distributions 	u_int32_t        bytes[2][2];
1129*aca3beaaSApple OSS Distributions 	u_int32_t        creatorid;
1130*aca3beaaSApple OSS Distributions 	u_int16_t        tag;
1131*aca3beaaSApple OSS Distributions 	sa_family_t      af_lan;
1132*aca3beaaSApple OSS Distributions 	sa_family_t      af_gwy;
1133*aca3beaaSApple OSS Distributions 	u_int8_t         proto;
1134*aca3beaaSApple OSS Distributions 	u_int8_t         direction;
1135*aca3beaaSApple OSS Distributions 	u_int8_t         log;
1136*aca3beaaSApple OSS Distributions 	u_int8_t         allow_opts;
1137*aca3beaaSApple OSS Distributions 	u_int8_t         timeout;
1138*aca3beaaSApple OSS Distributions 	u_int8_t         sync_flags;
1139*aca3beaaSApple OSS Distributions 	u_int8_t         updates;
1140*aca3beaaSApple OSS Distributions 	u_int8_t         proto_variant;
1141*aca3beaaSApple OSS Distributions 	u_int8_t         __pad;
1142*aca3beaaSApple OSS Distributions 	u_int32_t        flowhash;
1143*aca3beaaSApple OSS Distributions } __packed;
1144*aca3beaaSApple OSS Distributions 
1145*aca3beaaSApple OSS Distributions #define PFSYNC_FLAG_COMPRESS    0x01
1146*aca3beaaSApple OSS Distributions #define PFSYNC_FLAG_STALE       0x02
1147*aca3beaaSApple OSS Distributions #define PFSYNC_FLAG_SRCNODE     0x04
1148*aca3beaaSApple OSS Distributions #define PFSYNC_FLAG_NATSRCNODE  0x08
1149*aca3beaaSApple OSS Distributions 
1150*aca3beaaSApple OSS Distributions #ifdef KERNEL
1151*aca3beaaSApple OSS Distributions /* for copies to/from userland via pf_ioctl() */
1152*aca3beaaSApple OSS Distributions #define pf_state_peer_to_pfsync(s, d) do {      \
1153*aca3beaaSApple OSS Distributions 	(d)->seqlo = (s)->seqlo;                \
1154*aca3beaaSApple OSS Distributions 	(d)->seqhi = (s)->seqhi;                \
1155*aca3beaaSApple OSS Distributions 	(d)->seqdiff = (s)->seqdiff;            \
1156*aca3beaaSApple OSS Distributions 	(d)->max_win = (s)->max_win;            \
1157*aca3beaaSApple OSS Distributions 	(d)->mss = (s)->mss;                    \
1158*aca3beaaSApple OSS Distributions 	(d)->state = (s)->state;                \
1159*aca3beaaSApple OSS Distributions 	(d)->wscale = (s)->wscale;              \
1160*aca3beaaSApple OSS Distributions 	if ((s)->scrub) {                                               \
1161*aca3beaaSApple OSS Distributions 	        (d)->scrub.pfss_flags =                                 \
1162*aca3beaaSApple OSS Distributions 	            (s)->scrub->pfss_flags & PFSS_TIMESTAMP;            \
1163*aca3beaaSApple OSS Distributions 	        (d)->scrub.pfss_ttl = (s)->scrub->pfss_ttl;             \
1164*aca3beaaSApple OSS Distributions 	        (d)->scrub.pfss_ts_mod = (s)->scrub->pfss_ts_mod;       \
1165*aca3beaaSApple OSS Distributions 	        (d)->scrub.scrub_flag = PFSYNC_SCRUB_FLAG_VALID;        \
1166*aca3beaaSApple OSS Distributions 	}                                                               \
1167*aca3beaaSApple OSS Distributions } while (0)
1168*aca3beaaSApple OSS Distributions 
1169*aca3beaaSApple OSS Distributions #define pf_state_peer_from_pfsync(s, d) do {    \
1170*aca3beaaSApple OSS Distributions 	(d)->seqlo = (s)->seqlo;                \
1171*aca3beaaSApple OSS Distributions 	(d)->seqhi = (s)->seqhi;                \
1172*aca3beaaSApple OSS Distributions 	(d)->seqdiff = (s)->seqdiff;            \
1173*aca3beaaSApple OSS Distributions 	(d)->max_win = (s)->max_win;            \
1174*aca3beaaSApple OSS Distributions 	(d)->mss = ntohs((s)->mss);             \
1175*aca3beaaSApple OSS Distributions 	(d)->state = (s)->state;                \
1176*aca3beaaSApple OSS Distributions 	(d)->wscale = (s)->wscale;              \
1177*aca3beaaSApple OSS Distributions 	if ((s)->scrub.scrub_flag == PFSYNC_SCRUB_FLAG_VALID &&         \
1178*aca3beaaSApple OSS Distributions 	    (d)->scrub != NULL) {                                       \
1179*aca3beaaSApple OSS Distributions 	        (d)->scrub->pfss_flags =                                \
1180*aca3beaaSApple OSS Distributions 	            ntohs((s)->scrub.pfss_flags) & PFSS_TIMESTAMP;      \
1181*aca3beaaSApple OSS Distributions 	        (d)->scrub->pfss_ttl = (s)->scrub.pfss_ttl;             \
1182*aca3beaaSApple OSS Distributions 	        (d)->scrub->pfss_ts_mod = (s)->scrub.pfss_ts_mod;       \
1183*aca3beaaSApple OSS Distributions 	}                                                               \
1184*aca3beaaSApple OSS Distributions } while (0)
1185*aca3beaaSApple OSS Distributions #endif /* KERNEL */
1186*aca3beaaSApple OSS Distributions 
1187*aca3beaaSApple OSS Distributions #define pf_state_counter_to_pfsync(s, d) do {                   \
1188*aca3beaaSApple OSS Distributions 	d[0] = (s>>32)&0xffffffff;                              \
1189*aca3beaaSApple OSS Distributions 	d[1] = s&0xffffffff;                                    \
1190*aca3beaaSApple OSS Distributions } while (0)
1191*aca3beaaSApple OSS Distributions 
1192*aca3beaaSApple OSS Distributions #define pf_state_counter_from_pfsync(s)         \
1193*aca3beaaSApple OSS Distributions 	(((u_int64_t)(s[0])<<32) | (u_int64_t)(s[1]))
1194*aca3beaaSApple OSS Distributions 
1195*aca3beaaSApple OSS Distributions 
1196*aca3beaaSApple OSS Distributions 
1197*aca3beaaSApple OSS Distributions TAILQ_HEAD(pf_rulequeue, pf_rule);
1198*aca3beaaSApple OSS Distributions 
1199*aca3beaaSApple OSS Distributions struct pf_anchor;
1200*aca3beaaSApple OSS Distributions 
1201*aca3beaaSApple OSS Distributions struct pf_ruleset {
1202*aca3beaaSApple OSS Distributions 	struct {
1203*aca3beaaSApple OSS Distributions 		struct pf_rulequeue      queues[2];
1204*aca3beaaSApple OSS Distributions 		struct {
1205*aca3beaaSApple OSS Distributions 			struct pf_rulequeue     *ptr;
1206*aca3beaaSApple OSS Distributions 			struct pf_rule          **ptr_array;
1207*aca3beaaSApple OSS Distributions 			u_int32_t                rcount;
1208*aca3beaaSApple OSS Distributions 			u_int32_t                rsize;
1209*aca3beaaSApple OSS Distributions 			u_int32_t                ticket;
1210*aca3beaaSApple OSS Distributions 			int                      open;
1211*aca3beaaSApple OSS Distributions 		}                        active, inactive;
1212*aca3beaaSApple OSS Distributions 	}                        rules[PF_RULESET_MAX];
1213*aca3beaaSApple OSS Distributions 	struct pf_anchor        *anchor;
1214*aca3beaaSApple OSS Distributions 	u_int32_t                tticket;
1215*aca3beaaSApple OSS Distributions 	int                      tables;
1216*aca3beaaSApple OSS Distributions 	int                      topen;
1217*aca3beaaSApple OSS Distributions };
1218*aca3beaaSApple OSS Distributions 
1219*aca3beaaSApple OSS Distributions RB_HEAD(pf_anchor_global, pf_anchor);
1220*aca3beaaSApple OSS Distributions RB_HEAD(pf_anchor_node, pf_anchor);
1221*aca3beaaSApple OSS Distributions struct pf_anchor {
1222*aca3beaaSApple OSS Distributions 	RB_ENTRY(pf_anchor)      entry_global;
1223*aca3beaaSApple OSS Distributions 	RB_ENTRY(pf_anchor)      entry_node;
1224*aca3beaaSApple OSS Distributions 	struct pf_anchor        *parent;
1225*aca3beaaSApple OSS Distributions 	struct pf_anchor_node    children;
1226*aca3beaaSApple OSS Distributions 	char                     name[PF_ANCHOR_NAME_SIZE];
1227*aca3beaaSApple OSS Distributions 	char                     path[MAXPATHLEN];
1228*aca3beaaSApple OSS Distributions 	struct pf_ruleset        ruleset;
1229*aca3beaaSApple OSS Distributions 	int                      refcnt;        /* anchor rules */
1230*aca3beaaSApple OSS Distributions 	int                      match;
1231*aca3beaaSApple OSS Distributions 	char                     owner[PF_OWNER_NAME_SIZE];
1232*aca3beaaSApple OSS Distributions };
1233*aca3beaaSApple OSS Distributions #ifdef KERNEL
1234*aca3beaaSApple OSS Distributions RB_PROTOTYPE_SC(__private_extern__, pf_anchor_global, pf_anchor, entry_global,
1235*aca3beaaSApple OSS Distributions     pf_anchor_compare);
1236*aca3beaaSApple OSS Distributions RB_PROTOTYPE_SC(__private_extern__, pf_anchor_node, pf_anchor, entry_node,
1237*aca3beaaSApple OSS Distributions     pf_anchor_compare);
1238*aca3beaaSApple OSS Distributions #else /* !KERNEL */
1239*aca3beaaSApple OSS Distributions RB_PROTOTYPE(pf_anchor_global, pf_anchor, entry_global, pf_anchor_compare);
1240*aca3beaaSApple OSS Distributions RB_PROTOTYPE(pf_anchor_node, pf_anchor, entry_node, pf_anchor_compare);
1241*aca3beaaSApple OSS Distributions #endif /* !KERNEL */
1242*aca3beaaSApple OSS Distributions 
1243*aca3beaaSApple OSS Distributions #define PF_RESERVED_ANCHOR      "_pf"
1244*aca3beaaSApple OSS Distributions 
1245*aca3beaaSApple OSS Distributions #define PFR_TFLAG_PERSIST       0x00000001
1246*aca3beaaSApple OSS Distributions #define PFR_TFLAG_CONST         0x00000002
1247*aca3beaaSApple OSS Distributions #define PFR_TFLAG_ACTIVE        0x00000004
1248*aca3beaaSApple OSS Distributions #define PFR_TFLAG_INACTIVE      0x00000008
1249*aca3beaaSApple OSS Distributions #define PFR_TFLAG_REFERENCED    0x00000010
1250*aca3beaaSApple OSS Distributions #define PFR_TFLAG_REFDANCHOR    0x00000020
1251*aca3beaaSApple OSS Distributions #define PFR_TFLAG_USRMASK       0x00000003
1252*aca3beaaSApple OSS Distributions #define PFR_TFLAG_SETMASK       0x0000003C
1253*aca3beaaSApple OSS Distributions #define PFR_TFLAG_ALLMASK       0x0000003F
1254*aca3beaaSApple OSS Distributions 
1255*aca3beaaSApple OSS Distributions struct pfr_table {
1256*aca3beaaSApple OSS Distributions 	char                     pfrt_anchor[MAXPATHLEN];
1257*aca3beaaSApple OSS Distributions 	char                     pfrt_name[PF_TABLE_NAME_SIZE];
1258*aca3beaaSApple OSS Distributions 	uint32_t                 pfrt_flags;
1259*aca3beaaSApple OSS Distributions 	uint8_t                  pfrt_fback;
1260*aca3beaaSApple OSS Distributions };
1261*aca3beaaSApple OSS Distributions 
1262*aca3beaaSApple OSS Distributions enum { PFR_FB_NONE, PFR_FB_MATCH, PFR_FB_ADDED, PFR_FB_DELETED,
1263*aca3beaaSApple OSS Distributions        PFR_FB_CHANGED, PFR_FB_CLEARED, PFR_FB_DUPLICATE,
1264*aca3beaaSApple OSS Distributions        PFR_FB_NOTMATCH, PFR_FB_CONFLICT, PFR_FB_MAX };
1265*aca3beaaSApple OSS Distributions 
1266*aca3beaaSApple OSS Distributions struct pfr_addr {
1267*aca3beaaSApple OSS Distributions 	union {
1268*aca3beaaSApple OSS Distributions 		struct in_addr   _pfra_ip4addr;
1269*aca3beaaSApple OSS Distributions 		struct in6_addr  _pfra_ip6addr;
1270*aca3beaaSApple OSS Distributions 	}                pfra_u;
1271*aca3beaaSApple OSS Distributions 	uint8_t          pfra_af;
1272*aca3beaaSApple OSS Distributions 	uint8_t          pfra_net;
1273*aca3beaaSApple OSS Distributions 	uint8_t          pfra_not;
1274*aca3beaaSApple OSS Distributions 	uint8_t          pfra_fback;
1275*aca3beaaSApple OSS Distributions };
1276*aca3beaaSApple OSS Distributions #define pfra_ip4addr    pfra_u._pfra_ip4addr
1277*aca3beaaSApple OSS Distributions #define pfra_ip6addr    pfra_u._pfra_ip6addr
1278*aca3beaaSApple OSS Distributions 
1279*aca3beaaSApple OSS Distributions enum { PFR_DIR_IN, PFR_DIR_OUT, PFR_DIR_MAX };
1280*aca3beaaSApple OSS Distributions enum { PFR_OP_BLOCK, PFR_OP_PASS, PFR_OP_ADDR_MAX, PFR_OP_TABLE_MAX };
1281*aca3beaaSApple OSS Distributions #define PFR_OP_XPASS    PFR_OP_ADDR_MAX
1282*aca3beaaSApple OSS Distributions 
1283*aca3beaaSApple OSS Distributions struct pfr_astats {
1284*aca3beaaSApple OSS Distributions 	struct pfr_addr  pfras_a;
1285*aca3beaaSApple OSS Distributions #if !defined(__LP64__)
1286*aca3beaaSApple OSS Distributions 	uint32_t         _pad;
1287*aca3beaaSApple OSS Distributions #endif /* !__LP64__ */
1288*aca3beaaSApple OSS Distributions 	uint64_t         pfras_packets[PFR_DIR_MAX][PFR_OP_ADDR_MAX];
1289*aca3beaaSApple OSS Distributions 	uint64_t         pfras_bytes[PFR_DIR_MAX][PFR_OP_ADDR_MAX];
1290*aca3beaaSApple OSS Distributions 	uint64_t         pfras_tzero;
1291*aca3beaaSApple OSS Distributions };
1292*aca3beaaSApple OSS Distributions 
1293*aca3beaaSApple OSS Distributions enum { PFR_REFCNT_RULE, PFR_REFCNT_ANCHOR, PFR_REFCNT_MAX };
1294*aca3beaaSApple OSS Distributions 
1295*aca3beaaSApple OSS Distributions struct pfr_tstats {
1296*aca3beaaSApple OSS Distributions 	struct pfr_table pfrts_t;
1297*aca3beaaSApple OSS Distributions 	u_int64_t        pfrts_packets[PFR_DIR_MAX][PFR_OP_TABLE_MAX];
1298*aca3beaaSApple OSS Distributions 	u_int64_t        pfrts_bytes[PFR_DIR_MAX][PFR_OP_TABLE_MAX];
1299*aca3beaaSApple OSS Distributions 	u_int64_t        pfrts_match;
1300*aca3beaaSApple OSS Distributions 	u_int64_t        pfrts_nomatch;
1301*aca3beaaSApple OSS Distributions 	u_int64_t        pfrts_tzero;
1302*aca3beaaSApple OSS Distributions 	int              pfrts_cnt;
1303*aca3beaaSApple OSS Distributions 	int              pfrts_refcnt[PFR_REFCNT_MAX];
1304*aca3beaaSApple OSS Distributions #if !defined(__LP64__)
1305*aca3beaaSApple OSS Distributions 	u_int32_t        _pad;
1306*aca3beaaSApple OSS Distributions #endif /* !__LP64__ */
1307*aca3beaaSApple OSS Distributions };
1308*aca3beaaSApple OSS Distributions #define pfrts_name      pfrts_t.pfrt_name
1309*aca3beaaSApple OSS Distributions #define pfrts_flags     pfrts_t.pfrt_flags
1310*aca3beaaSApple OSS Distributions 
1311*aca3beaaSApple OSS Distributions #ifdef KERNEL
1312*aca3beaaSApple OSS Distributions SLIST_HEAD(pfr_kentryworkq, pfr_kentry);
1313*aca3beaaSApple OSS Distributions struct pfr_kentry {
1314*aca3beaaSApple OSS Distributions 	struct radix_node        pfrke_node[2];
1315*aca3beaaSApple OSS Distributions 	union sockaddr_union     pfrke_sa;
1316*aca3beaaSApple OSS Distributions 	u_int64_t                pfrke_packets[PFR_DIR_MAX][PFR_OP_ADDR_MAX];
1317*aca3beaaSApple OSS Distributions 	u_int64_t                pfrke_bytes[PFR_DIR_MAX][PFR_OP_ADDR_MAX];
1318*aca3beaaSApple OSS Distributions 	SLIST_ENTRY(pfr_kentry)  pfrke_workq;
1319*aca3beaaSApple OSS Distributions 	u_int64_t                pfrke_tzero;
1320*aca3beaaSApple OSS Distributions 	u_int8_t                 pfrke_af;
1321*aca3beaaSApple OSS Distributions 	u_int8_t                 pfrke_net;
1322*aca3beaaSApple OSS Distributions 	u_int8_t                 pfrke_not;
1323*aca3beaaSApple OSS Distributions 	u_int8_t                 pfrke_mark;
1324*aca3beaaSApple OSS Distributions 	u_int8_t                 pfrke_intrpool;
1325*aca3beaaSApple OSS Distributions };
1326*aca3beaaSApple OSS Distributions 
1327*aca3beaaSApple OSS Distributions SLIST_HEAD(pfr_ktableworkq, pfr_ktable);
1328*aca3beaaSApple OSS Distributions RB_HEAD(pfr_ktablehead, pfr_ktable);
1329*aca3beaaSApple OSS Distributions struct pfr_ktable {
1330*aca3beaaSApple OSS Distributions 	struct pfr_tstats        pfrkt_ts;
1331*aca3beaaSApple OSS Distributions 	RB_ENTRY(pfr_ktable)     pfrkt_tree;
1332*aca3beaaSApple OSS Distributions 	SLIST_ENTRY(pfr_ktable)  pfrkt_workq;
1333*aca3beaaSApple OSS Distributions 	struct radix_node_head  *pfrkt_ip4;
1334*aca3beaaSApple OSS Distributions 	struct radix_node_head  *pfrkt_ip6;
1335*aca3beaaSApple OSS Distributions 	struct pfr_ktable       *pfrkt_shadow;
1336*aca3beaaSApple OSS Distributions 	struct pfr_ktable       *pfrkt_root;
1337*aca3beaaSApple OSS Distributions 	struct pf_ruleset       *pfrkt_rs;
1338*aca3beaaSApple OSS Distributions 	u_int64_t                pfrkt_larg;
1339*aca3beaaSApple OSS Distributions 	u_int32_t                pfrkt_nflags;
1340*aca3beaaSApple OSS Distributions };
1341*aca3beaaSApple OSS Distributions #define pfrkt_t         pfrkt_ts.pfrts_t
1342*aca3beaaSApple OSS Distributions #define pfrkt_name      pfrkt_t.pfrt_name
1343*aca3beaaSApple OSS Distributions #define pfrkt_anchor    pfrkt_t.pfrt_anchor
1344*aca3beaaSApple OSS Distributions #define pfrkt_ruleset   pfrkt_t.pfrt_ruleset
1345*aca3beaaSApple OSS Distributions #define pfrkt_flags     pfrkt_t.pfrt_flags
1346*aca3beaaSApple OSS Distributions #define pfrkt_cnt       pfrkt_ts.pfrts_cnt
1347*aca3beaaSApple OSS Distributions #define pfrkt_refcnt    pfrkt_ts.pfrts_refcnt
1348*aca3beaaSApple OSS Distributions #define pfrkt_packets   pfrkt_ts.pfrts_packets
1349*aca3beaaSApple OSS Distributions #define pfrkt_bytes     pfrkt_ts.pfrts_bytes
1350*aca3beaaSApple OSS Distributions #define pfrkt_match     pfrkt_ts.pfrts_match
1351*aca3beaaSApple OSS Distributions #define pfrkt_nomatch   pfrkt_ts.pfrts_nomatch
1352*aca3beaaSApple OSS Distributions #define pfrkt_tzero     pfrkt_ts.pfrts_tzero
1353*aca3beaaSApple OSS Distributions 
1354*aca3beaaSApple OSS Distributions RB_HEAD(pf_state_tree_lan_ext, pf_state_key);
1355*aca3beaaSApple OSS Distributions RB_PROTOTYPE_SC(__private_extern__, pf_state_tree_lan_ext, pf_state_key,
1356*aca3beaaSApple OSS Distributions     entry_lan_ext, pf_state_compare_lan_ext);
1357*aca3beaaSApple OSS Distributions 
1358*aca3beaaSApple OSS Distributions RB_HEAD(pf_state_tree_ext_gwy, pf_state_key);
1359*aca3beaaSApple OSS Distributions RB_PROTOTYPE_SC(__private_extern__, pf_state_tree_ext_gwy, pf_state_key,
1360*aca3beaaSApple OSS Distributions     entry_ext_gwy, pf_state_compare_ext_gwy);
1361*aca3beaaSApple OSS Distributions 
1362*aca3beaaSApple OSS Distributions RB_HEAD(pfi_ifhead, pfi_kif);
1363*aca3beaaSApple OSS Distributions 
1364*aca3beaaSApple OSS Distributions /* state tables */
1365*aca3beaaSApple OSS Distributions extern struct pf_state_tree_lan_ext      pf_statetbl_lan_ext;
1366*aca3beaaSApple OSS Distributions extern struct pf_state_tree_ext_gwy      pf_statetbl_ext_gwy;
1367*aca3beaaSApple OSS Distributions 
1368*aca3beaaSApple OSS Distributions struct pfi_kif {
1369*aca3beaaSApple OSS Distributions 	char                             pfik_name[IFNAMSIZ];
1370*aca3beaaSApple OSS Distributions 	RB_ENTRY(pfi_kif)                pfik_tree;
1371*aca3beaaSApple OSS Distributions 	u_int64_t                        pfik_packets[2][2][2];
1372*aca3beaaSApple OSS Distributions 	u_int64_t                        pfik_bytes[2][2][2];
1373*aca3beaaSApple OSS Distributions 	u_int64_t                        pfik_tzero;
1374*aca3beaaSApple OSS Distributions 	int                              pfik_flags;
1375*aca3beaaSApple OSS Distributions 	void                            *pfik_ah_cookie;
1376*aca3beaaSApple OSS Distributions 	struct ifnet                    *pfik_ifp;
1377*aca3beaaSApple OSS Distributions 	int                              pfik_states;
1378*aca3beaaSApple OSS Distributions 	int                              pfik_rules;
1379*aca3beaaSApple OSS Distributions 	TAILQ_HEAD(, pfi_dynaddr)        pfik_dynaddrs;
1380*aca3beaaSApple OSS Distributions };
1381*aca3beaaSApple OSS Distributions 
1382*aca3beaaSApple OSS Distributions enum pfi_kif_refs {
1383*aca3beaaSApple OSS Distributions 	PFI_KIF_REF_NONE,
1384*aca3beaaSApple OSS Distributions 	PFI_KIF_REF_STATE,
1385*aca3beaaSApple OSS Distributions 	PFI_KIF_REF_RULE
1386*aca3beaaSApple OSS Distributions };
1387*aca3beaaSApple OSS Distributions 
1388*aca3beaaSApple OSS Distributions struct pfi_uif {
1389*aca3beaaSApple OSS Distributions #else /* !KERNEL */
1390*aca3beaaSApple OSS Distributions struct pfi_kif {
1391*aca3beaaSApple OSS Distributions #endif /* !KERNEL */
1392*aca3beaaSApple OSS Distributions 	char                             pfik_name[IFNAMSIZ];
1393*aca3beaaSApple OSS Distributions 	u_int64_t                        pfik_packets[2][2][2];
1394*aca3beaaSApple OSS Distributions 	u_int64_t                        pfik_bytes[2][2][2];
1395*aca3beaaSApple OSS Distributions 	u_int64_t                        pfik_tzero;
1396*aca3beaaSApple OSS Distributions 	int                              pfik_flags;
1397*aca3beaaSApple OSS Distributions 	int                              pfik_states;
1398*aca3beaaSApple OSS Distributions 	int                              pfik_rules;
1399*aca3beaaSApple OSS Distributions #if !defined(__LP64__)
1400*aca3beaaSApple OSS Distributions 	u_int32_t                        _pad;
1401*aca3beaaSApple OSS Distributions #endif /* !__LP64__ */
1402*aca3beaaSApple OSS Distributions };
1403*aca3beaaSApple OSS Distributions 
1404*aca3beaaSApple OSS Distributions #define PFI_IFLAG_SKIP          0x0100  /* skip filtering on interface */
1405*aca3beaaSApple OSS Distributions 
1406*aca3beaaSApple OSS Distributions #ifdef KERNEL
1407*aca3beaaSApple OSS Distributions struct pf_pdesc {
1408*aca3beaaSApple OSS Distributions 	struct {
1409*aca3beaaSApple OSS Distributions 		int      done;
1410*aca3beaaSApple OSS Distributions 		uid_t    uid;
1411*aca3beaaSApple OSS Distributions 		gid_t    gid;
1412*aca3beaaSApple OSS Distributions 		pid_t    pid;
1413*aca3beaaSApple OSS Distributions 	}                lookup;
1414*aca3beaaSApple OSS Distributions 	u_int64_t        tot_len;       /* Make Mickey money */
1415*aca3beaaSApple OSS Distributions 	union {
1416*aca3beaaSApple OSS Distributions 		struct tcphdr           *tcp;
1417*aca3beaaSApple OSS Distributions 		struct udphdr           *udp;
1418*aca3beaaSApple OSS Distributions 		struct icmp             *icmp;
1419*aca3beaaSApple OSS Distributions 		struct icmp6_hdr        *icmp6;
1420*aca3beaaSApple OSS Distributions 		struct pf_grev1_hdr     *grev1;
1421*aca3beaaSApple OSS Distributions 		struct pf_esp_hdr       *esp;
1422*aca3beaaSApple OSS Distributions 		void                    *any;
1423*aca3beaaSApple OSS Distributions 	} hdr;
1424*aca3beaaSApple OSS Distributions 
1425*aca3beaaSApple OSS Distributions 	/* XXX TODO: Change baddr and naddr to *saddr */
1426*aca3beaaSApple OSS Distributions 	struct pf_addr   baddr;         /* src address before translation */
1427*aca3beaaSApple OSS Distributions 	struct pf_addr   bdaddr;        /* dst address before translation */
1428*aca3beaaSApple OSS Distributions 	struct pf_addr   naddr;         /* src address after translation */
1429*aca3beaaSApple OSS Distributions 	struct pf_addr   ndaddr;        /* dst address after translation */
1430*aca3beaaSApple OSS Distributions 	struct pf_rule  *nat_rule;      /* nat/rdr rule applied to packet */
1431*aca3beaaSApple OSS Distributions 	struct pf_addr  *src;
1432*aca3beaaSApple OSS Distributions 	struct pf_addr  *dst;
1433*aca3beaaSApple OSS Distributions 	struct ether_header     *eh;
1434*aca3beaaSApple OSS Distributions 	pbuf_t          *mp;
1435*aca3beaaSApple OSS Distributions 	int             lmw;            /* lazy writable offset */
1436*aca3beaaSApple OSS Distributions 	struct pf_mtag  *pf_mtag;
1437*aca3beaaSApple OSS Distributions 	u_int16_t       *ip_sum;
1438*aca3beaaSApple OSS Distributions 	u_int32_t        off;           /* protocol header offset */
1439*aca3beaaSApple OSS Distributions 	u_int32_t        hdrlen;        /* protocol header length */
1440*aca3beaaSApple OSS Distributions 	u_int32_t        p_len;         /* total length of payload */
1441*aca3beaaSApple OSS Distributions 	u_int16_t        flags;         /* Let SCRUB trigger behavior in */
1442*aca3beaaSApple OSS Distributions 	                                /* state code. Easier than tags */
1443*aca3beaaSApple OSS Distributions #define PFDESC_TCP_NORM 0x0001          /* TCP shall be statefully scrubbed */
1444*aca3beaaSApple OSS Distributions #define PFDESC_IP_REAS  0x0002          /* IP frags would've been reassembled */
1445*aca3beaaSApple OSS Distributions #define PFDESC_IP_FRAG  0x0004          /* This is a fragment */
1446*aca3beaaSApple OSS Distributions 	sa_family_t      af;
1447*aca3beaaSApple OSS Distributions 	sa_family_t      naf;           /*  address family after translation */
1448*aca3beaaSApple OSS Distributions 	u_int8_t         proto;
1449*aca3beaaSApple OSS Distributions 	u_int8_t         tos;
1450*aca3beaaSApple OSS Distributions 	u_int8_t         ttl;
1451*aca3beaaSApple OSS Distributions 	u_int8_t         proto_variant;
1452*aca3beaaSApple OSS Distributions 	mbuf_svc_class_t sc;            /* mbuf service class (MBUF_SVC) */
1453*aca3beaaSApple OSS Distributions 	u_int32_t        pktflags;      /* mbuf packet flags (PKTF) */
1454*aca3beaaSApple OSS Distributions 	u_int32_t        flowsrc;       /* flow source (FLOWSRC) */
1455*aca3beaaSApple OSS Distributions 	u_int32_t        flowhash;      /* flow hash to identify the sender */
1456*aca3beaaSApple OSS Distributions };
1457*aca3beaaSApple OSS Distributions #endif /* KERNEL */
1458*aca3beaaSApple OSS Distributions 
1459*aca3beaaSApple OSS Distributions /* flags for RDR options */
1460*aca3beaaSApple OSS Distributions #define PF_DPORT_RANGE  0x01            /* Dest port uses range */
1461*aca3beaaSApple OSS Distributions #define PF_RPORT_RANGE  0x02            /* RDR'ed port uses range */
1462*aca3beaaSApple OSS Distributions 
1463*aca3beaaSApple OSS Distributions /* Reasons code for passing/dropping a packet */
1464*aca3beaaSApple OSS Distributions #define PFRES_MATCH     0               /* Explicit match of a rule */
1465*aca3beaaSApple OSS Distributions #define PFRES_BADOFF    1               /* Bad offset for pull_hdr */
1466*aca3beaaSApple OSS Distributions #define PFRES_FRAG      2               /* Dropping following fragment */
1467*aca3beaaSApple OSS Distributions #define PFRES_SHORT     3               /* Dropping short packet */
1468*aca3beaaSApple OSS Distributions #define PFRES_NORM      4               /* Dropping by normalizer */
1469*aca3beaaSApple OSS Distributions #define PFRES_MEMORY    5               /* Dropped due to lacking mem */
1470*aca3beaaSApple OSS Distributions #define PFRES_TS        6               /* Bad TCP Timestamp (RFC1323) */
1471*aca3beaaSApple OSS Distributions #define PFRES_CONGEST   7               /* Congestion (of ipintrq) */
1472*aca3beaaSApple OSS Distributions #define PFRES_IPOPTIONS 8               /* IP option */
1473*aca3beaaSApple OSS Distributions #define PFRES_PROTCKSUM 9               /* Protocol checksum invalid */
1474*aca3beaaSApple OSS Distributions #define PFRES_BADSTATE  10              /* State mismatch */
1475*aca3beaaSApple OSS Distributions #define PFRES_STATEINS  11              /* State insertion failure */
1476*aca3beaaSApple OSS Distributions #define PFRES_MAXSTATES 12              /* State limit */
1477*aca3beaaSApple OSS Distributions #define PFRES_SRCLIMIT  13              /* Source node/conn limit */
1478*aca3beaaSApple OSS Distributions #define PFRES_SYNPROXY  14              /* SYN proxy */
1479*aca3beaaSApple OSS Distributions #define PFRES_DUMMYNET  15              /* Dummynet */
1480*aca3beaaSApple OSS Distributions #define PFRES_INVPORT   16              /* Invalid TCP/UDP port */
1481*aca3beaaSApple OSS Distributions #define PFRES_MAX       17              /* total+1 */
1482*aca3beaaSApple OSS Distributions 
1483*aca3beaaSApple OSS Distributions #define PFRES_NAMES { \
1484*aca3beaaSApple OSS Distributions 	"match", \
1485*aca3beaaSApple OSS Distributions 	"bad-offset", \
1486*aca3beaaSApple OSS Distributions 	"fragment", \
1487*aca3beaaSApple OSS Distributions 	"short", \
1488*aca3beaaSApple OSS Distributions 	"normalize", \
1489*aca3beaaSApple OSS Distributions 	"memory", \
1490*aca3beaaSApple OSS Distributions 	"bad-timestamp", \
1491*aca3beaaSApple OSS Distributions 	"congestion", \
1492*aca3beaaSApple OSS Distributions 	"ip-option", \
1493*aca3beaaSApple OSS Distributions 	"proto-cksum", \
1494*aca3beaaSApple OSS Distributions 	"state-mismatch", \
1495*aca3beaaSApple OSS Distributions 	"state-insert", \
1496*aca3beaaSApple OSS Distributions 	"state-limit", \
1497*aca3beaaSApple OSS Distributions 	"src-limit", \
1498*aca3beaaSApple OSS Distributions 	"synproxy", \
1499*aca3beaaSApple OSS Distributions 	"dummynet", \
1500*aca3beaaSApple OSS Distributions 	"invalid-port", \
1501*aca3beaaSApple OSS Distributions 	NULL \
1502*aca3beaaSApple OSS Distributions }
1503*aca3beaaSApple OSS Distributions 
1504*aca3beaaSApple OSS Distributions /* Counters for other things we want to keep track of */
1505*aca3beaaSApple OSS Distributions #define LCNT_STATES             0       /* states */
1506*aca3beaaSApple OSS Distributions #define LCNT_SRCSTATES          1       /* max-src-states */
1507*aca3beaaSApple OSS Distributions #define LCNT_SRCNODES           2       /* max-src-nodes */
1508*aca3beaaSApple OSS Distributions #define LCNT_SRCCONN            3       /* max-src-conn */
1509*aca3beaaSApple OSS Distributions #define LCNT_SRCCONNRATE        4       /* max-src-conn-rate */
1510*aca3beaaSApple OSS Distributions #define LCNT_OVERLOAD_TABLE     5       /* entry added to overload table */
1511*aca3beaaSApple OSS Distributions #define LCNT_OVERLOAD_FLUSH     6       /* state entries flushed */
1512*aca3beaaSApple OSS Distributions #define LCNT_MAX                7       /* total+1 */
1513*aca3beaaSApple OSS Distributions 
1514*aca3beaaSApple OSS Distributions #define LCNT_NAMES { \
1515*aca3beaaSApple OSS Distributions 	"max states per rule", \
1516*aca3beaaSApple OSS Distributions 	"max-src-states", \
1517*aca3beaaSApple OSS Distributions 	"max-src-nodes", \
1518*aca3beaaSApple OSS Distributions 	"max-src-conn", \
1519*aca3beaaSApple OSS Distributions 	"max-src-conn-rate", \
1520*aca3beaaSApple OSS Distributions 	"overload table insertion", \
1521*aca3beaaSApple OSS Distributions 	"overload flush states", \
1522*aca3beaaSApple OSS Distributions 	NULL \
1523*aca3beaaSApple OSS Distributions }
1524*aca3beaaSApple OSS Distributions 
1525*aca3beaaSApple OSS Distributions /* UDP state enumeration */
1526*aca3beaaSApple OSS Distributions #define PFUDPS_NO_TRAFFIC       0
1527*aca3beaaSApple OSS Distributions #define PFUDPS_SINGLE           1
1528*aca3beaaSApple OSS Distributions #define PFUDPS_MULTIPLE         2
1529*aca3beaaSApple OSS Distributions 
1530*aca3beaaSApple OSS Distributions #define PFUDPS_NSTATES          3       /* number of state levels */
1531*aca3beaaSApple OSS Distributions 
1532*aca3beaaSApple OSS Distributions #define PFUDPS_NAMES { \
1533*aca3beaaSApple OSS Distributions 	"NO_TRAFFIC", \
1534*aca3beaaSApple OSS Distributions 	"SINGLE", \
1535*aca3beaaSApple OSS Distributions 	"MULTIPLE", \
1536*aca3beaaSApple OSS Distributions 	NULL \
1537*aca3beaaSApple OSS Distributions }
1538*aca3beaaSApple OSS Distributions 
1539*aca3beaaSApple OSS Distributions /* GREv1 protocol state enumeration */
1540*aca3beaaSApple OSS Distributions #define PFGRE1S_NO_TRAFFIC              0
1541*aca3beaaSApple OSS Distributions #define PFGRE1S_INITIATING              1
1542*aca3beaaSApple OSS Distributions #define PFGRE1S_ESTABLISHED             2
1543*aca3beaaSApple OSS Distributions 
1544*aca3beaaSApple OSS Distributions #define PFGRE1S_NSTATES                 3       /* number of state levels */
1545*aca3beaaSApple OSS Distributions 
1546*aca3beaaSApple OSS Distributions #define PFGRE1S_NAMES { \
1547*aca3beaaSApple OSS Distributions 	"NO_TRAFFIC", \
1548*aca3beaaSApple OSS Distributions 	"INITIATING", \
1549*aca3beaaSApple OSS Distributions 	"ESTABLISHED", \
1550*aca3beaaSApple OSS Distributions 	NULL \
1551*aca3beaaSApple OSS Distributions }
1552*aca3beaaSApple OSS Distributions 
1553*aca3beaaSApple OSS Distributions #define PFESPS_NO_TRAFFIC       0
1554*aca3beaaSApple OSS Distributions #define PFESPS_INITIATING       1
1555*aca3beaaSApple OSS Distributions #define PFESPS_ESTABLISHED      2
1556*aca3beaaSApple OSS Distributions 
1557*aca3beaaSApple OSS Distributions #define PFESPS_NSTATES          3       /* number of state levels */
1558*aca3beaaSApple OSS Distributions 
1559*aca3beaaSApple OSS Distributions #define PFESPS_NAMES { "NO_TRAFFIC", "INITIATING", "ESTABLISHED", NULL }
1560*aca3beaaSApple OSS Distributions 
1561*aca3beaaSApple OSS Distributions /* Other protocol state enumeration */
1562*aca3beaaSApple OSS Distributions #define PFOTHERS_NO_TRAFFIC     0
1563*aca3beaaSApple OSS Distributions #define PFOTHERS_SINGLE         1
1564*aca3beaaSApple OSS Distributions #define PFOTHERS_MULTIPLE       2
1565*aca3beaaSApple OSS Distributions 
1566*aca3beaaSApple OSS Distributions #define PFOTHERS_NSTATES        3       /* number of state levels */
1567*aca3beaaSApple OSS Distributions 
1568*aca3beaaSApple OSS Distributions #define PFOTHERS_NAMES { \
1569*aca3beaaSApple OSS Distributions 	"NO_TRAFFIC", \
1570*aca3beaaSApple OSS Distributions 	"SINGLE", \
1571*aca3beaaSApple OSS Distributions 	"MULTIPLE", \
1572*aca3beaaSApple OSS Distributions 	NULL \
1573*aca3beaaSApple OSS Distributions }
1574*aca3beaaSApple OSS Distributions 
1575*aca3beaaSApple OSS Distributions #define FCNT_STATE_SEARCH       0
1576*aca3beaaSApple OSS Distributions #define FCNT_STATE_INSERT       1
1577*aca3beaaSApple OSS Distributions #define FCNT_STATE_REMOVALS     2
1578*aca3beaaSApple OSS Distributions #define FCNT_MAX                3
1579*aca3beaaSApple OSS Distributions 
1580*aca3beaaSApple OSS Distributions #define SCNT_SRC_NODE_SEARCH    0
1581*aca3beaaSApple OSS Distributions #define SCNT_SRC_NODE_INSERT    1
1582*aca3beaaSApple OSS Distributions #define SCNT_SRC_NODE_REMOVALS  2
1583*aca3beaaSApple OSS Distributions #define SCNT_MAX                3
1584*aca3beaaSApple OSS Distributions 
1585*aca3beaaSApple OSS Distributions #ifdef KERNEL
1586*aca3beaaSApple OSS Distributions #define ACTION_SET(a, x) \
1587*aca3beaaSApple OSS Distributions 	do { \
1588*aca3beaaSApple OSS Distributions 	        if ((a) != NULL) \
1589*aca3beaaSApple OSS Distributions 	                *(a) = (x); \
1590*aca3beaaSApple OSS Distributions 	} while (0)
1591*aca3beaaSApple OSS Distributions 
1592*aca3beaaSApple OSS Distributions #define REASON_SET(a, x) \
1593*aca3beaaSApple OSS Distributions 	do { \
1594*aca3beaaSApple OSS Distributions 	        if ((a) != NULL) \
1595*aca3beaaSApple OSS Distributions 	                *(a) = (x); \
1596*aca3beaaSApple OSS Distributions 	        if (x < PFRES_MAX) \
1597*aca3beaaSApple OSS Distributions 	                pf_status.counters[x]++; \
1598*aca3beaaSApple OSS Distributions 	} while (0)
1599*aca3beaaSApple OSS Distributions #endif /* KERNEL */
1600*aca3beaaSApple OSS Distributions 
1601*aca3beaaSApple OSS Distributions struct pf_status {
1602*aca3beaaSApple OSS Distributions 	u_int64_t       counters[PFRES_MAX];
1603*aca3beaaSApple OSS Distributions 	u_int64_t       lcounters[LCNT_MAX];    /* limit counters */
1604*aca3beaaSApple OSS Distributions 	u_int64_t       fcounters[FCNT_MAX];
1605*aca3beaaSApple OSS Distributions 	u_int64_t       scounters[SCNT_MAX];
1606*aca3beaaSApple OSS Distributions 	u_int64_t       pcounters[2][2][3];
1607*aca3beaaSApple OSS Distributions 	u_int64_t       bcounters[2][2];
1608*aca3beaaSApple OSS Distributions 	u_int64_t       stateid;
1609*aca3beaaSApple OSS Distributions 	u_int32_t       running;
1610*aca3beaaSApple OSS Distributions 	u_int32_t       states;
1611*aca3beaaSApple OSS Distributions 	u_int32_t       src_nodes;
1612*aca3beaaSApple OSS Distributions 	u_int64_t       since                   __attribute__((aligned(8)));
1613*aca3beaaSApple OSS Distributions 	u_int32_t       debug;
1614*aca3beaaSApple OSS Distributions 	u_int32_t       hostid;
1615*aca3beaaSApple OSS Distributions 	char            ifname[IFNAMSIZ];
1616*aca3beaaSApple OSS Distributions 	u_int8_t        pf_chksum[PF_MD5_DIGEST_LENGTH];
1617*aca3beaaSApple OSS Distributions };
1618*aca3beaaSApple OSS Distributions 
1619*aca3beaaSApple OSS Distributions struct cbq_opts {
1620*aca3beaaSApple OSS Distributions 	u_int32_t       minburst;
1621*aca3beaaSApple OSS Distributions 	u_int32_t       maxburst;
1622*aca3beaaSApple OSS Distributions 	u_int32_t       pktsize;
1623*aca3beaaSApple OSS Distributions 	u_int32_t       maxpktsize;
1624*aca3beaaSApple OSS Distributions 	u_int32_t       ns_per_byte;
1625*aca3beaaSApple OSS Distributions 	u_int32_t       maxidle;
1626*aca3beaaSApple OSS Distributions 	int32_t         minidle;
1627*aca3beaaSApple OSS Distributions 	u_int32_t       offtime;
1628*aca3beaaSApple OSS Distributions 	u_int32_t       flags;
1629*aca3beaaSApple OSS Distributions };
1630*aca3beaaSApple OSS Distributions 
1631*aca3beaaSApple OSS Distributions struct priq_opts {
1632*aca3beaaSApple OSS Distributions 	u_int32_t       flags;
1633*aca3beaaSApple OSS Distributions };
1634*aca3beaaSApple OSS Distributions 
1635*aca3beaaSApple OSS Distributions struct hfsc_opts {
1636*aca3beaaSApple OSS Distributions 	/* real-time service curve */
1637*aca3beaaSApple OSS Distributions 	u_int64_t       rtsc_m1;        /* slope of the 1st segment in bps */
1638*aca3beaaSApple OSS Distributions 	u_int64_t       rtsc_d;         /* the x-projection of m1 in msec */
1639*aca3beaaSApple OSS Distributions 	u_int64_t       rtsc_m2;        /* slope of the 2nd segment in bps */
1640*aca3beaaSApple OSS Distributions 	u_int32_t       rtsc_fl;        /* service curve flags */
1641*aca3beaaSApple OSS Distributions #if !defined(__LP64__)
1642*aca3beaaSApple OSS Distributions 	u_int32_t       _pad;
1643*aca3beaaSApple OSS Distributions #endif /* !__LP64__ */
1644*aca3beaaSApple OSS Distributions 	/* link-sharing service curve */
1645*aca3beaaSApple OSS Distributions 	u_int64_t       lssc_m1;
1646*aca3beaaSApple OSS Distributions 	u_int64_t       lssc_d;
1647*aca3beaaSApple OSS Distributions 	u_int64_t       lssc_m2;
1648*aca3beaaSApple OSS Distributions 	u_int32_t       lssc_fl;
1649*aca3beaaSApple OSS Distributions #if !defined(__LP64__)
1650*aca3beaaSApple OSS Distributions 	u_int32_t       __pad;
1651*aca3beaaSApple OSS Distributions #endif /* !__LP64__ */
1652*aca3beaaSApple OSS Distributions 	/* upper-limit service curve */
1653*aca3beaaSApple OSS Distributions 	u_int64_t       ulsc_m1;
1654*aca3beaaSApple OSS Distributions 	u_int64_t       ulsc_d;
1655*aca3beaaSApple OSS Distributions 	u_int64_t       ulsc_m2;
1656*aca3beaaSApple OSS Distributions 	u_int32_t       ulsc_fl;
1657*aca3beaaSApple OSS Distributions 	u_int32_t       flags;          /* scheduler flags */
1658*aca3beaaSApple OSS Distributions };
1659*aca3beaaSApple OSS Distributions 
1660*aca3beaaSApple OSS Distributions struct fairq_opts {
1661*aca3beaaSApple OSS Distributions 	u_int32_t       nbuckets;       /* hash buckets */
1662*aca3beaaSApple OSS Distributions 	u_int32_t       flags;
1663*aca3beaaSApple OSS Distributions 	u_int64_t       hogs_m1;        /* hog detection bandwidth */
1664*aca3beaaSApple OSS Distributions 
1665*aca3beaaSApple OSS Distributions 	/* link-sharing service curve */
1666*aca3beaaSApple OSS Distributions 	u_int64_t       lssc_m1;
1667*aca3beaaSApple OSS Distributions 	u_int64_t       lssc_d;
1668*aca3beaaSApple OSS Distributions 	u_int64_t       lssc_m2;
1669*aca3beaaSApple OSS Distributions };
1670*aca3beaaSApple OSS Distributions 
1671*aca3beaaSApple OSS Distributions /* bandwidth types */
1672*aca3beaaSApple OSS Distributions #define PF_ALTQ_BW_ABSOLUTE     1       /* bw in absolute value (bps) */
1673*aca3beaaSApple OSS Distributions #define PF_ALTQ_BW_PERCENT      2       /* bandwidth in percentage */
1674*aca3beaaSApple OSS Distributions 
1675*aca3beaaSApple OSS Distributions /* ALTQ rule flags */
1676*aca3beaaSApple OSS Distributions #define PF_ALTQF_TBR            0x1     /* enable Token Bucket Regulator */
1677*aca3beaaSApple OSS Distributions 
1678*aca3beaaSApple OSS Distributions /* queue rule flags */
1679*aca3beaaSApple OSS Distributions #define PF_ALTQ_QRF_WEIGHT      0x1     /* weight instead of priority */
1680*aca3beaaSApple OSS Distributions 
1681*aca3beaaSApple OSS Distributions struct pf_altq {
1682*aca3beaaSApple OSS Distributions 	char                     ifname[IFNAMSIZ];
1683*aca3beaaSApple OSS Distributions 
1684*aca3beaaSApple OSS Distributions 	/* discipline-specific state */
1685*aca3beaaSApple OSS Distributions 	void                    *altq_disc __attribute__((aligned(8)));
1686*aca3beaaSApple OSS Distributions 	TAILQ_ENTRY(pf_altq)     entries __attribute__((aligned(8)));
1687*aca3beaaSApple OSS Distributions #if !defined(__LP64__)
1688*aca3beaaSApple OSS Distributions 	u_int32_t               _pad[2];
1689*aca3beaaSApple OSS Distributions #endif /* !__LP64__ */
1690*aca3beaaSApple OSS Distributions 
1691*aca3beaaSApple OSS Distributions 	u_int32_t                aflags;        /* ALTQ rule flags */
1692*aca3beaaSApple OSS Distributions 	u_int32_t                bwtype;        /* bandwidth type */
1693*aca3beaaSApple OSS Distributions 
1694*aca3beaaSApple OSS Distributions 	/* scheduler spec */
1695*aca3beaaSApple OSS Distributions 	u_int32_t                scheduler;     /* scheduler type */
1696*aca3beaaSApple OSS Distributions 	u_int32_t                tbrsize;       /* tokenbucket regulator size */
1697*aca3beaaSApple OSS Distributions 	u_int64_t                ifbandwidth;   /* interface bandwidth */
1698*aca3beaaSApple OSS Distributions 
1699*aca3beaaSApple OSS Distributions 	/* queue spec */
1700*aca3beaaSApple OSS Distributions 	char                     qname[PF_QNAME_SIZE];  /* queue name */
1701*aca3beaaSApple OSS Distributions 	char                     parent[PF_QNAME_SIZE]; /* parent name */
1702*aca3beaaSApple OSS Distributions 	u_int32_t                parent_qid;    /* parent queue id */
1703*aca3beaaSApple OSS Distributions 	u_int32_t                qrflags;       /* queue rule flags */
1704*aca3beaaSApple OSS Distributions 	union {
1705*aca3beaaSApple OSS Distributions 		u_int32_t        priority;      /* priority */
1706*aca3beaaSApple OSS Distributions 		u_int32_t        weight;        /* weight */
1707*aca3beaaSApple OSS Distributions 	};
1708*aca3beaaSApple OSS Distributions 	u_int32_t                qlimit;        /* queue size limit */
1709*aca3beaaSApple OSS Distributions 	u_int32_t                flags;         /* misc flags */
1710*aca3beaaSApple OSS Distributions #if !defined(__LP64__)
1711*aca3beaaSApple OSS Distributions 	u_int32_t               __pad;
1712*aca3beaaSApple OSS Distributions #endif /* !__LP64__ */
1713*aca3beaaSApple OSS Distributions 	u_int64_t                bandwidth;     /* queue bandwidth */
1714*aca3beaaSApple OSS Distributions 	union {
1715*aca3beaaSApple OSS Distributions 		struct cbq_opts          cbq_opts;
1716*aca3beaaSApple OSS Distributions 		struct priq_opts         priq_opts;
1717*aca3beaaSApple OSS Distributions 		struct hfsc_opts         hfsc_opts;
1718*aca3beaaSApple OSS Distributions 		struct fairq_opts        fairq_opts;
1719*aca3beaaSApple OSS Distributions 	} pq_u;
1720*aca3beaaSApple OSS Distributions 
1721*aca3beaaSApple OSS Distributions 	u_int32_t                qid;           /* return value */
1722*aca3beaaSApple OSS Distributions };
1723*aca3beaaSApple OSS Distributions 
1724*aca3beaaSApple OSS Distributions struct pf_tagname {
1725*aca3beaaSApple OSS Distributions 	TAILQ_ENTRY(pf_tagname) entries;
1726*aca3beaaSApple OSS Distributions 	char                    name[PF_TAG_NAME_SIZE];
1727*aca3beaaSApple OSS Distributions 	u_int16_t               tag;
1728*aca3beaaSApple OSS Distributions 	int                     ref;
1729*aca3beaaSApple OSS Distributions };
1730*aca3beaaSApple OSS Distributions 
1731*aca3beaaSApple OSS Distributions #define PFFRAG_FRENT_HIWAT      5000    /* Number of fragment entries */
1732*aca3beaaSApple OSS Distributions #define PFFRAG_FRAG_HIWAT       1000    /* Number of fragmented packets */
1733*aca3beaaSApple OSS Distributions #define PFFRAG_FRCENT_HIWAT     50000   /* Number of fragment cache entries */
1734*aca3beaaSApple OSS Distributions #define PFFRAG_FRCACHE_HIWAT    10000   /* Number of fragment descriptors */
1735*aca3beaaSApple OSS Distributions 
1736*aca3beaaSApple OSS Distributions #define PFR_KTABLE_HIWAT        1000    /* Number of tables */
1737*aca3beaaSApple OSS Distributions #define PFR_KENTRY_HIWAT        200000  /* Number of table entries */
1738*aca3beaaSApple OSS Distributions #define PFR_KENTRY_HIWAT_SMALL  100000  /* Number of table entries (tiny hosts) */
1739*aca3beaaSApple OSS Distributions 
1740*aca3beaaSApple OSS Distributions /*
1741*aca3beaaSApple OSS Distributions  * ioctl parameter structures
1742*aca3beaaSApple OSS Distributions  */
1743*aca3beaaSApple OSS Distributions 
1744*aca3beaaSApple OSS Distributions struct pfioc_pooladdr {
1745*aca3beaaSApple OSS Distributions 	u_int32_t                action;
1746*aca3beaaSApple OSS Distributions 	u_int32_t                ticket;
1747*aca3beaaSApple OSS Distributions 	u_int32_t                nr;
1748*aca3beaaSApple OSS Distributions 	u_int32_t                r_num;
1749*aca3beaaSApple OSS Distributions 	u_int8_t                 r_action;
1750*aca3beaaSApple OSS Distributions 	u_int8_t                 r_last;
1751*aca3beaaSApple OSS Distributions 	u_int8_t                 af;
1752*aca3beaaSApple OSS Distributions 	char                     anchor[MAXPATHLEN];
1753*aca3beaaSApple OSS Distributions 	struct pf_pooladdr       addr;
1754*aca3beaaSApple OSS Distributions };
1755*aca3beaaSApple OSS Distributions 
1756*aca3beaaSApple OSS Distributions struct pfioc_rule {
1757*aca3beaaSApple OSS Distributions 	u_int32_t        action;
1758*aca3beaaSApple OSS Distributions 	u_int32_t        ticket;
1759*aca3beaaSApple OSS Distributions 	u_int32_t        pool_ticket;
1760*aca3beaaSApple OSS Distributions 	u_int32_t        nr;
1761*aca3beaaSApple OSS Distributions 	char             anchor[MAXPATHLEN];
1762*aca3beaaSApple OSS Distributions 	char             anchor_call[MAXPATHLEN];
1763*aca3beaaSApple OSS Distributions 	struct pf_rule   rule;
1764*aca3beaaSApple OSS Distributions };
1765*aca3beaaSApple OSS Distributions 
1766*aca3beaaSApple OSS Distributions struct pfioc_natlook {
1767*aca3beaaSApple OSS Distributions 	struct pf_addr   saddr;
1768*aca3beaaSApple OSS Distributions 	struct pf_addr   daddr;
1769*aca3beaaSApple OSS Distributions 	struct pf_addr   rsaddr;
1770*aca3beaaSApple OSS Distributions 	struct pf_addr   rdaddr;
1771*aca3beaaSApple OSS Distributions 	union pf_state_xport    sxport;
1772*aca3beaaSApple OSS Distributions 	union pf_state_xport    dxport;
1773*aca3beaaSApple OSS Distributions 	union pf_state_xport    rsxport;
1774*aca3beaaSApple OSS Distributions 	union pf_state_xport    rdxport;
1775*aca3beaaSApple OSS Distributions 	sa_family_t      af;
1776*aca3beaaSApple OSS Distributions 	u_int8_t         proto;
1777*aca3beaaSApple OSS Distributions 	u_int8_t         proto_variant;
1778*aca3beaaSApple OSS Distributions 	u_int8_t         direction;
1779*aca3beaaSApple OSS Distributions };
1780*aca3beaaSApple OSS Distributions 
1781*aca3beaaSApple OSS Distributions struct pfioc_state {
1782*aca3beaaSApple OSS Distributions 	struct pfsync_state     state;
1783*aca3beaaSApple OSS Distributions };
1784*aca3beaaSApple OSS Distributions 
1785*aca3beaaSApple OSS Distributions struct pfioc_src_node_kill {
1786*aca3beaaSApple OSS Distributions 	/* XXX returns the number of src nodes killed in psnk_af */
1787*aca3beaaSApple OSS Distributions 	sa_family_t psnk_af;
1788*aca3beaaSApple OSS Distributions 	struct pf_rule_addr psnk_src;
1789*aca3beaaSApple OSS Distributions 	struct pf_rule_addr psnk_dst;
1790*aca3beaaSApple OSS Distributions };
1791*aca3beaaSApple OSS Distributions 
1792*aca3beaaSApple OSS Distributions struct pfioc_state_addr_kill {
1793*aca3beaaSApple OSS Distributions 	struct pf_addr_wrap             addr;
1794*aca3beaaSApple OSS Distributions 	u_int8_t                        reserved_[3];
1795*aca3beaaSApple OSS Distributions 	u_int8_t                        neg;
1796*aca3beaaSApple OSS Distributions 	union pf_rule_xport             xport;
1797*aca3beaaSApple OSS Distributions };
1798*aca3beaaSApple OSS Distributions 
1799*aca3beaaSApple OSS Distributions struct pfioc_state_kill {
1800*aca3beaaSApple OSS Distributions 	/* XXX returns the number of states killed in psk_af */
1801*aca3beaaSApple OSS Distributions 	sa_family_t             psk_af;
1802*aca3beaaSApple OSS Distributions 	u_int8_t                psk_proto;
1803*aca3beaaSApple OSS Distributions 	u_int8_t                psk_proto_variant;
1804*aca3beaaSApple OSS Distributions 	u_int8_t                _pad;
1805*aca3beaaSApple OSS Distributions 	struct pfioc_state_addr_kill    psk_src;
1806*aca3beaaSApple OSS Distributions 	struct pfioc_state_addr_kill    psk_dst;
1807*aca3beaaSApple OSS Distributions 	char                    psk_ifname[IFNAMSIZ];
1808*aca3beaaSApple OSS Distributions 	char                    psk_ownername[PF_OWNER_NAME_SIZE];
1809*aca3beaaSApple OSS Distributions };
1810*aca3beaaSApple OSS Distributions 
1811*aca3beaaSApple OSS Distributions struct pfioc_states {
1812*aca3beaaSApple OSS Distributions 	int     ps_len;
1813*aca3beaaSApple OSS Distributions 	union {
1814*aca3beaaSApple OSS Distributions 		caddr_t                  psu_buf;
1815*aca3beaaSApple OSS Distributions 		struct pfsync_state     *psu_states;
1816*aca3beaaSApple OSS Distributions 	} ps_u __attribute__((aligned(8)));
1817*aca3beaaSApple OSS Distributions #define ps_buf          ps_u.psu_buf
1818*aca3beaaSApple OSS Distributions #define ps_states       ps_u.psu_states
1819*aca3beaaSApple OSS Distributions };
1820*aca3beaaSApple OSS Distributions 
1821*aca3beaaSApple OSS Distributions #ifdef KERNEL
1822*aca3beaaSApple OSS Distributions struct pfioc_states_32 {
1823*aca3beaaSApple OSS Distributions 	int     ps_len;
1824*aca3beaaSApple OSS Distributions 	union {
1825*aca3beaaSApple OSS Distributions 		user32_addr_t           psu_buf;
1826*aca3beaaSApple OSS Distributions 		user32_addr_t           psu_states;
1827*aca3beaaSApple OSS Distributions 	} ps_u __attribute__((aligned(8)));
1828*aca3beaaSApple OSS Distributions };
1829*aca3beaaSApple OSS Distributions 
1830*aca3beaaSApple OSS Distributions struct pfioc_states_64 {
1831*aca3beaaSApple OSS Distributions 	int     ps_len;
1832*aca3beaaSApple OSS Distributions 	union {
1833*aca3beaaSApple OSS Distributions 		user64_addr_t           psu_buf;
1834*aca3beaaSApple OSS Distributions 		user64_addr_t           psu_states;
1835*aca3beaaSApple OSS Distributions 	} ps_u __attribute__((aligned(8)));
1836*aca3beaaSApple OSS Distributions };
1837*aca3beaaSApple OSS Distributions #endif /* KERNEL */
1838*aca3beaaSApple OSS Distributions 
1839*aca3beaaSApple OSS Distributions #define PFTOK_PROCNAME_LEN    64
1840*aca3beaaSApple OSS Distributions #pragma pack(1)
1841*aca3beaaSApple OSS Distributions struct pfioc_token {
1842*aca3beaaSApple OSS Distributions 	u_int64_t                       token_value;
1843*aca3beaaSApple OSS Distributions 	u_int64_t                       timestamp;
1844*aca3beaaSApple OSS Distributions 	pid_t                           pid;
1845*aca3beaaSApple OSS Distributions 	char                            proc_name[PFTOK_PROCNAME_LEN];
1846*aca3beaaSApple OSS Distributions };
1847*aca3beaaSApple OSS Distributions #pragma pack()
1848*aca3beaaSApple OSS Distributions 
1849*aca3beaaSApple OSS Distributions struct pfioc_kernel_token {
1850*aca3beaaSApple OSS Distributions 	SLIST_ENTRY(pfioc_kernel_token) next;
1851*aca3beaaSApple OSS Distributions 	struct pfioc_token              token;
1852*aca3beaaSApple OSS Distributions };
1853*aca3beaaSApple OSS Distributions 
1854*aca3beaaSApple OSS Distributions struct pfioc_remove_token {
1855*aca3beaaSApple OSS Distributions 	u_int64_t                token_value;
1856*aca3beaaSApple OSS Distributions 	u_int64_t                refcount;
1857*aca3beaaSApple OSS Distributions };
1858*aca3beaaSApple OSS Distributions 
1859*aca3beaaSApple OSS Distributions struct pfioc_tokens {
1860*aca3beaaSApple OSS Distributions 	int     size;
1861*aca3beaaSApple OSS Distributions 	union {
1862*aca3beaaSApple OSS Distributions 		caddr_t                         pgtu_buf;
1863*aca3beaaSApple OSS Distributions 		struct pfioc_token              *pgtu_tokens;
1864*aca3beaaSApple OSS Distributions 	} pgt_u __attribute__((aligned(8)));
1865*aca3beaaSApple OSS Distributions #define pgt_buf         pgt_u.pgtu_buf
1866*aca3beaaSApple OSS Distributions #define pgt_tokens      pgt_u.pgtu_tokens
1867*aca3beaaSApple OSS Distributions };
1868*aca3beaaSApple OSS Distributions 
1869*aca3beaaSApple OSS Distributions #ifdef KERNEL
1870*aca3beaaSApple OSS Distributions struct pfioc_tokens_32 {
1871*aca3beaaSApple OSS Distributions 	int     size;
1872*aca3beaaSApple OSS Distributions 	union {
1873*aca3beaaSApple OSS Distributions 		user32_addr_t           pgtu_buf;
1874*aca3beaaSApple OSS Distributions 		user32_addr_t           pgtu_tokens;
1875*aca3beaaSApple OSS Distributions 	} pgt_u __attribute__((aligned(8)));
1876*aca3beaaSApple OSS Distributions };
1877*aca3beaaSApple OSS Distributions 
1878*aca3beaaSApple OSS Distributions struct pfioc_tokens_64 {
1879*aca3beaaSApple OSS Distributions 	int     size;
1880*aca3beaaSApple OSS Distributions 	union {
1881*aca3beaaSApple OSS Distributions 		user64_addr_t           pgtu_buf;
1882*aca3beaaSApple OSS Distributions 		user64_addr_t           pgtu_tokens;
1883*aca3beaaSApple OSS Distributions 	} pgt_u __attribute__((aligned(8)));
1884*aca3beaaSApple OSS Distributions };
1885*aca3beaaSApple OSS Distributions #endif /* KERNEL */
1886*aca3beaaSApple OSS Distributions 
1887*aca3beaaSApple OSS Distributions 
1888*aca3beaaSApple OSS Distributions struct pfioc_src_nodes {
1889*aca3beaaSApple OSS Distributions 	int     psn_len;
1890*aca3beaaSApple OSS Distributions 	union {
1891*aca3beaaSApple OSS Distributions 		caddr_t                 psu_buf;
1892*aca3beaaSApple OSS Distributions 		struct pf_src_node      *psu_src_nodes;
1893*aca3beaaSApple OSS Distributions 	} psn_u __attribute__((aligned(8)));
1894*aca3beaaSApple OSS Distributions #define psn_buf         psn_u.psu_buf
1895*aca3beaaSApple OSS Distributions #define psn_src_nodes   psn_u.psu_src_nodes
1896*aca3beaaSApple OSS Distributions };
1897*aca3beaaSApple OSS Distributions 
1898*aca3beaaSApple OSS Distributions #ifdef KERNEL
1899*aca3beaaSApple OSS Distributions struct pfioc_src_nodes_32 {
1900*aca3beaaSApple OSS Distributions 	int     psn_len;
1901*aca3beaaSApple OSS Distributions 	union {
1902*aca3beaaSApple OSS Distributions 		user32_addr_t           psu_buf;
1903*aca3beaaSApple OSS Distributions 		user32_addr_t           psu_src_nodes;
1904*aca3beaaSApple OSS Distributions 	} psn_u __attribute__((aligned(8)));
1905*aca3beaaSApple OSS Distributions };
1906*aca3beaaSApple OSS Distributions 
1907*aca3beaaSApple OSS Distributions struct pfioc_src_nodes_64 {
1908*aca3beaaSApple OSS Distributions 	int     psn_len;
1909*aca3beaaSApple OSS Distributions 	union {
1910*aca3beaaSApple OSS Distributions 		user64_addr_t           psu_buf;
1911*aca3beaaSApple OSS Distributions 		user64_addr_t           psu_src_nodes;
1912*aca3beaaSApple OSS Distributions 	} psn_u __attribute__((aligned(8)));
1913*aca3beaaSApple OSS Distributions };
1914*aca3beaaSApple OSS Distributions #endif /* KERNEL */
1915*aca3beaaSApple OSS Distributions 
1916*aca3beaaSApple OSS Distributions struct pfioc_if {
1917*aca3beaaSApple OSS Distributions 	char             ifname[IFNAMSIZ];
1918*aca3beaaSApple OSS Distributions };
1919*aca3beaaSApple OSS Distributions 
1920*aca3beaaSApple OSS Distributions struct pfioc_tm {
1921*aca3beaaSApple OSS Distributions 	int              timeout;
1922*aca3beaaSApple OSS Distributions 	int              seconds;
1923*aca3beaaSApple OSS Distributions };
1924*aca3beaaSApple OSS Distributions 
1925*aca3beaaSApple OSS Distributions struct pfioc_limit {
1926*aca3beaaSApple OSS Distributions 	int              index;
1927*aca3beaaSApple OSS Distributions 	unsigned         limit;
1928*aca3beaaSApple OSS Distributions };
1929*aca3beaaSApple OSS Distributions 
1930*aca3beaaSApple OSS Distributions struct pfioc_altq {
1931*aca3beaaSApple OSS Distributions 	u_int32_t        action;
1932*aca3beaaSApple OSS Distributions 	u_int32_t        ticket;
1933*aca3beaaSApple OSS Distributions 	u_int32_t        nr;
1934*aca3beaaSApple OSS Distributions 	struct pf_altq   altq                   __attribute__((aligned(8)));
1935*aca3beaaSApple OSS Distributions };
1936*aca3beaaSApple OSS Distributions 
1937*aca3beaaSApple OSS Distributions struct pfioc_qstats {
1938*aca3beaaSApple OSS Distributions 	u_int32_t        ticket;
1939*aca3beaaSApple OSS Distributions 	u_int32_t        nr;
1940*aca3beaaSApple OSS Distributions 	void            *buf                    __attribute__((aligned(8)));
1941*aca3beaaSApple OSS Distributions 	int              nbytes                 __attribute__((aligned(8)));
1942*aca3beaaSApple OSS Distributions 	u_int8_t         scheduler;
1943*aca3beaaSApple OSS Distributions };
1944*aca3beaaSApple OSS Distributions 
1945*aca3beaaSApple OSS Distributions struct pfioc_ruleset {
1946*aca3beaaSApple OSS Distributions 	u_int32_t        nr;
1947*aca3beaaSApple OSS Distributions 	char             path[MAXPATHLEN];
1948*aca3beaaSApple OSS Distributions 	char             name[PF_ANCHOR_NAME_SIZE];
1949*aca3beaaSApple OSS Distributions };
1950*aca3beaaSApple OSS Distributions 
1951*aca3beaaSApple OSS Distributions #define PF_RULESET_ALTQ         (PF_RULESET_MAX)
1952*aca3beaaSApple OSS Distributions #define PF_RULESET_TABLE        (PF_RULESET_MAX+1)
1953*aca3beaaSApple OSS Distributions struct pfioc_trans {
1954*aca3beaaSApple OSS Distributions 	int              size;  /* number of elements */
1955*aca3beaaSApple OSS Distributions 	int              esize; /* size of each element in bytes */
1956*aca3beaaSApple OSS Distributions 	struct pfioc_trans_e {
1957*aca3beaaSApple OSS Distributions 		int             rs_num;
1958*aca3beaaSApple OSS Distributions 		char            anchor[MAXPATHLEN];
1959*aca3beaaSApple OSS Distributions 		u_int32_t       ticket;
1960*aca3beaaSApple OSS Distributions 	} *array __attribute__((aligned(8)));
1961*aca3beaaSApple OSS Distributions };
1962*aca3beaaSApple OSS Distributions 
1963*aca3beaaSApple OSS Distributions #ifdef KERNEL
1964*aca3beaaSApple OSS Distributions struct pfioc_trans_32 {
1965*aca3beaaSApple OSS Distributions 	int              size;  /* number of elements */
1966*aca3beaaSApple OSS Distributions 	int              esize; /* size of each element in bytes */
1967*aca3beaaSApple OSS Distributions 	user32_addr_t    array __attribute__((aligned(8)));
1968*aca3beaaSApple OSS Distributions };
1969*aca3beaaSApple OSS Distributions 
1970*aca3beaaSApple OSS Distributions struct pfioc_trans_64 {
1971*aca3beaaSApple OSS Distributions 	int              size;  /* number of elements */
1972*aca3beaaSApple OSS Distributions 	int              esize; /* size of each element in bytes */
1973*aca3beaaSApple OSS Distributions 	user64_addr_t    array __attribute__((aligned(8)));
1974*aca3beaaSApple OSS Distributions };
1975*aca3beaaSApple OSS Distributions #endif /* KERNEL */
1976*aca3beaaSApple OSS Distributions 
1977*aca3beaaSApple OSS Distributions 
1978*aca3beaaSApple OSS Distributions #define PFR_FLAG_ATOMIC         0x00000001
1979*aca3beaaSApple OSS Distributions #define PFR_FLAG_DUMMY          0x00000002
1980*aca3beaaSApple OSS Distributions #define PFR_FLAG_FEEDBACK       0x00000004
1981*aca3beaaSApple OSS Distributions #define PFR_FLAG_CLSTATS        0x00000008
1982*aca3beaaSApple OSS Distributions #define PFR_FLAG_ADDRSTOO       0x00000010
1983*aca3beaaSApple OSS Distributions #define PFR_FLAG_REPLACE        0x00000020
1984*aca3beaaSApple OSS Distributions #define PFR_FLAG_ALLRSETS       0x00000040
1985*aca3beaaSApple OSS Distributions #define PFR_FLAG_ALLMASK        0x0000007F
1986*aca3beaaSApple OSS Distributions #ifdef KERNEL
1987*aca3beaaSApple OSS Distributions #define PFR_FLAG_USERIOCTL      0x10000000
1988*aca3beaaSApple OSS Distributions #endif /* KERNEL */
1989*aca3beaaSApple OSS Distributions 
1990*aca3beaaSApple OSS Distributions struct pfioc_table {
1991*aca3beaaSApple OSS Distributions 	struct pfr_table         pfrio_table;
1992*aca3beaaSApple OSS Distributions 	void                    *pfrio_buffer   __attribute__((aligned(8)));
1993*aca3beaaSApple OSS Distributions 	int                      pfrio_esize    __attribute__((aligned(8)));
1994*aca3beaaSApple OSS Distributions 	int                      pfrio_size;
1995*aca3beaaSApple OSS Distributions 	int                      pfrio_size2;
1996*aca3beaaSApple OSS Distributions 	int                      pfrio_nadd;
1997*aca3beaaSApple OSS Distributions 	int                      pfrio_ndel;
1998*aca3beaaSApple OSS Distributions 	int                      pfrio_nchange;
1999*aca3beaaSApple OSS Distributions 	int                      pfrio_flags;
2000*aca3beaaSApple OSS Distributions 	u_int32_t                pfrio_ticket;
2001*aca3beaaSApple OSS Distributions };
2002*aca3beaaSApple OSS Distributions #define pfrio_exists    pfrio_nadd
2003*aca3beaaSApple OSS Distributions #define pfrio_nzero     pfrio_nadd
2004*aca3beaaSApple OSS Distributions #define pfrio_nmatch    pfrio_nadd
2005*aca3beaaSApple OSS Distributions #define pfrio_naddr     pfrio_size2
2006*aca3beaaSApple OSS Distributions #define pfrio_setflag   pfrio_size2
2007*aca3beaaSApple OSS Distributions #define pfrio_clrflag   pfrio_nadd
2008*aca3beaaSApple OSS Distributions 
2009*aca3beaaSApple OSS Distributions #ifdef KERNEL
2010*aca3beaaSApple OSS Distributions struct pfioc_table_32 {
2011*aca3beaaSApple OSS Distributions 	struct pfr_table         pfrio_table;
2012*aca3beaaSApple OSS Distributions 	user32_addr_t            pfrio_buffer   __attribute__((aligned(8)));
2013*aca3beaaSApple OSS Distributions 	int                      pfrio_esize    __attribute__((aligned(8)));
2014*aca3beaaSApple OSS Distributions 	int                      pfrio_size;
2015*aca3beaaSApple OSS Distributions 	int                      pfrio_size2;
2016*aca3beaaSApple OSS Distributions 	int                      pfrio_nadd;
2017*aca3beaaSApple OSS Distributions 	int                      pfrio_ndel;
2018*aca3beaaSApple OSS Distributions 	int                      pfrio_nchange;
2019*aca3beaaSApple OSS Distributions 	int                      pfrio_flags;
2020*aca3beaaSApple OSS Distributions 	u_int32_t                pfrio_ticket;
2021*aca3beaaSApple OSS Distributions };
2022*aca3beaaSApple OSS Distributions 
2023*aca3beaaSApple OSS Distributions struct pfioc_table_64 {
2024*aca3beaaSApple OSS Distributions 	struct pfr_table         pfrio_table;
2025*aca3beaaSApple OSS Distributions 	user64_addr_t            pfrio_buffer   __attribute__((aligned(8)));
2026*aca3beaaSApple OSS Distributions 	int                      pfrio_esize    __attribute__((aligned(8)));
2027*aca3beaaSApple OSS Distributions 	int                      pfrio_size;
2028*aca3beaaSApple OSS Distributions 	int                      pfrio_size2;
2029*aca3beaaSApple OSS Distributions 	int                      pfrio_nadd;
2030*aca3beaaSApple OSS Distributions 	int                      pfrio_ndel;
2031*aca3beaaSApple OSS Distributions 	int                      pfrio_nchange;
2032*aca3beaaSApple OSS Distributions 	int                      pfrio_flags;
2033*aca3beaaSApple OSS Distributions 	u_int32_t                pfrio_ticket;
2034*aca3beaaSApple OSS Distributions };
2035*aca3beaaSApple OSS Distributions #endif /* KERNEL */
2036*aca3beaaSApple OSS Distributions 
2037*aca3beaaSApple OSS Distributions struct pfioc_iface {
2038*aca3beaaSApple OSS Distributions 	char     pfiio_name[IFNAMSIZ];
2039*aca3beaaSApple OSS Distributions 	void    *pfiio_buffer                   __attribute__((aligned(8)));
2040*aca3beaaSApple OSS Distributions 	int      pfiio_esize                    __attribute__((aligned(8)));
2041*aca3beaaSApple OSS Distributions 	int      pfiio_size;
2042*aca3beaaSApple OSS Distributions 	int      pfiio_nzero;
2043*aca3beaaSApple OSS Distributions 	int      pfiio_flags;
2044*aca3beaaSApple OSS Distributions };
2045*aca3beaaSApple OSS Distributions 
2046*aca3beaaSApple OSS Distributions #ifdef KERNEL
2047*aca3beaaSApple OSS Distributions struct pfioc_iface_32 {
2048*aca3beaaSApple OSS Distributions 	char     pfiio_name[IFNAMSIZ];
2049*aca3beaaSApple OSS Distributions 	user32_addr_t pfiio_buffer              __attribute__((aligned(8)));
2050*aca3beaaSApple OSS Distributions 	int      pfiio_esize                    __attribute__((aligned(8)));
2051*aca3beaaSApple OSS Distributions 	int      pfiio_size;
2052*aca3beaaSApple OSS Distributions 	int      pfiio_nzero;
2053*aca3beaaSApple OSS Distributions 	int      pfiio_flags;
2054*aca3beaaSApple OSS Distributions };
2055*aca3beaaSApple OSS Distributions 
2056*aca3beaaSApple OSS Distributions struct pfioc_iface_64 {
2057*aca3beaaSApple OSS Distributions 	char     pfiio_name[IFNAMSIZ];
2058*aca3beaaSApple OSS Distributions 	user64_addr_t pfiio_buffer              __attribute__((aligned(8)));
2059*aca3beaaSApple OSS Distributions 	int      pfiio_esize                    __attribute__((aligned(8)));
2060*aca3beaaSApple OSS Distributions 	int      pfiio_size;
2061*aca3beaaSApple OSS Distributions 	int      pfiio_nzero;
2062*aca3beaaSApple OSS Distributions 	int      pfiio_flags;
2063*aca3beaaSApple OSS Distributions };
2064*aca3beaaSApple OSS Distributions #endif /* KERNEL */
2065*aca3beaaSApple OSS Distributions 
2066*aca3beaaSApple OSS Distributions struct pf_ifspeed {
2067*aca3beaaSApple OSS Distributions 	char                    ifname[IFNAMSIZ];
2068*aca3beaaSApple OSS Distributions 	u_int64_t               baudrate;
2069*aca3beaaSApple OSS Distributions };
2070*aca3beaaSApple OSS Distributions 
2071*aca3beaaSApple OSS Distributions /*
2072*aca3beaaSApple OSS Distributions  * ioctl operations
2073*aca3beaaSApple OSS Distributions  */
2074*aca3beaaSApple OSS Distributions 
2075*aca3beaaSApple OSS Distributions #define DIOCSTART       _IO  ('D',  1)
2076*aca3beaaSApple OSS Distributions #define DIOCSTOP        _IO  ('D',  2)
2077*aca3beaaSApple OSS Distributions #define DIOCADDRULE     _IOWR('D',  4, struct pfioc_rule)
2078*aca3beaaSApple OSS Distributions #define DIOCGETSTARTERS _IOWR('D',  5, struct pfioc_tokens)
2079*aca3beaaSApple OSS Distributions #define DIOCGETRULES    _IOWR('D',  6, struct pfioc_rule)
2080*aca3beaaSApple OSS Distributions #define DIOCGETRULE     _IOWR('D',  7, struct pfioc_rule)
2081*aca3beaaSApple OSS Distributions #define DIOCSTARTREF    _IOR ('D',  8, u_int64_t)
2082*aca3beaaSApple OSS Distributions #define DIOCSTOPREF     _IOWR('D',  9, struct pfioc_remove_token)
2083*aca3beaaSApple OSS Distributions /* XXX cut 10 - 17 */
2084*aca3beaaSApple OSS Distributions #define DIOCCLRSTATES   _IOWR('D', 18, struct pfioc_state_kill)
2085*aca3beaaSApple OSS Distributions #define DIOCGETSTATE    _IOWR('D', 19, struct pfioc_state)
2086*aca3beaaSApple OSS Distributions #define DIOCSETSTATUSIF _IOWR('D', 20, struct pfioc_if)
2087*aca3beaaSApple OSS Distributions #define DIOCGETSTATUS   _IOWR('D', 21, struct pf_status)
2088*aca3beaaSApple OSS Distributions #define DIOCCLRSTATUS   _IO  ('D', 22)
2089*aca3beaaSApple OSS Distributions #define DIOCNATLOOK     _IOWR('D', 23, struct pfioc_natlook)
2090*aca3beaaSApple OSS Distributions #define DIOCSETDEBUG    _IOWR('D', 24, u_int32_t)
2091*aca3beaaSApple OSS Distributions #define DIOCGETSTATES   _IOWR('D', 25, struct pfioc_states)
2092*aca3beaaSApple OSS Distributions #define DIOCCHANGERULE  _IOWR('D', 26, struct pfioc_rule)
2093*aca3beaaSApple OSS Distributions #define DIOCINSERTRULE  _IOWR('D',  27, struct pfioc_rule)
2094*aca3beaaSApple OSS Distributions #define DIOCDELETERULE  _IOWR('D',  28, struct pfioc_rule)
2095*aca3beaaSApple OSS Distributions #define DIOCSETTIMEOUT  _IOWR('D', 29, struct pfioc_tm)
2096*aca3beaaSApple OSS Distributions #define DIOCGETTIMEOUT  _IOWR('D', 30, struct pfioc_tm)
2097*aca3beaaSApple OSS Distributions #define DIOCADDSTATE    _IOWR('D', 37, struct pfioc_state)
2098*aca3beaaSApple OSS Distributions #define DIOCCLRRULECTRS _IO  ('D', 38)
2099*aca3beaaSApple OSS Distributions #define DIOCGETLIMIT    _IOWR('D', 39, struct pfioc_limit)
2100*aca3beaaSApple OSS Distributions #define DIOCSETLIMIT    _IOWR('D', 40, struct pfioc_limit)
2101*aca3beaaSApple OSS Distributions #define DIOCKILLSTATES  _IOWR('D', 41, struct pfioc_state_kill)
2102*aca3beaaSApple OSS Distributions #define DIOCSTARTALTQ   _IO  ('D', 42)
2103*aca3beaaSApple OSS Distributions #define DIOCSTOPALTQ    _IO  ('D', 43)
2104*aca3beaaSApple OSS Distributions #define DIOCADDALTQ     _IOWR('D', 45, struct pfioc_altq)
2105*aca3beaaSApple OSS Distributions #define DIOCGETALTQS    _IOWR('D', 47, struct pfioc_altq)
2106*aca3beaaSApple OSS Distributions #define DIOCGETALTQ     _IOWR('D', 48, struct pfioc_altq)
2107*aca3beaaSApple OSS Distributions #define DIOCCHANGEALTQ  _IOWR('D', 49, struct pfioc_altq)
2108*aca3beaaSApple OSS Distributions #define DIOCGETQSTATS   _IOWR('D', 50, struct pfioc_qstats)
2109*aca3beaaSApple OSS Distributions #define DIOCBEGINADDRS  _IOWR('D', 51, struct pfioc_pooladdr)
2110*aca3beaaSApple OSS Distributions #define DIOCADDADDR     _IOWR('D', 52, struct pfioc_pooladdr)
2111*aca3beaaSApple OSS Distributions #define DIOCGETADDRS    _IOWR('D', 53, struct pfioc_pooladdr)
2112*aca3beaaSApple OSS Distributions #define DIOCGETADDR     _IOWR('D', 54, struct pfioc_pooladdr)
2113*aca3beaaSApple OSS Distributions #define DIOCCHANGEADDR  _IOWR('D', 55, struct pfioc_pooladdr)
2114*aca3beaaSApple OSS Distributions /* XXX cut 55 - 57 */
2115*aca3beaaSApple OSS Distributions #define DIOCGETRULESETS _IOWR('D', 58, struct pfioc_ruleset)
2116*aca3beaaSApple OSS Distributions #define DIOCGETRULESET  _IOWR('D', 59, struct pfioc_ruleset)
2117*aca3beaaSApple OSS Distributions #define DIOCRCLRTABLES  _IOWR('D', 60, struct pfioc_table)
2118*aca3beaaSApple OSS Distributions #define DIOCRADDTABLES  _IOWR('D', 61, struct pfioc_table)
2119*aca3beaaSApple OSS Distributions #define DIOCRDELTABLES  _IOWR('D', 62, struct pfioc_table)
2120*aca3beaaSApple OSS Distributions #define DIOCRGETTABLES  _IOWR('D', 63, struct pfioc_table)
2121*aca3beaaSApple OSS Distributions #define DIOCRGETTSTATS  _IOWR('D', 64, struct pfioc_table)
2122*aca3beaaSApple OSS Distributions #define DIOCRCLRTSTATS  _IOWR('D', 65, struct pfioc_table)
2123*aca3beaaSApple OSS Distributions #define DIOCRCLRADDRS   _IOWR('D', 66, struct pfioc_table)
2124*aca3beaaSApple OSS Distributions #define DIOCRADDADDRS   _IOWR('D', 67, struct pfioc_table)
2125*aca3beaaSApple OSS Distributions #define DIOCRDELADDRS   _IOWR('D', 68, struct pfioc_table)
2126*aca3beaaSApple OSS Distributions #define DIOCRSETADDRS   _IOWR('D', 69, struct pfioc_table)
2127*aca3beaaSApple OSS Distributions #define DIOCRGETADDRS   _IOWR('D', 70, struct pfioc_table)
2128*aca3beaaSApple OSS Distributions #define DIOCRGETASTATS  _IOWR('D', 71, struct pfioc_table)
2129*aca3beaaSApple OSS Distributions #define DIOCRCLRASTATS  _IOWR('D', 72, struct pfioc_table)
2130*aca3beaaSApple OSS Distributions #define DIOCRTSTADDRS   _IOWR('D', 73, struct pfioc_table)
2131*aca3beaaSApple OSS Distributions #define DIOCRSETTFLAGS  _IOWR('D', 74, struct pfioc_table)
2132*aca3beaaSApple OSS Distributions #define DIOCRINADEFINE  _IOWR('D', 77, struct pfioc_table)
2133*aca3beaaSApple OSS Distributions #define DIOCOSFPFLUSH   _IO('D', 78)
2134*aca3beaaSApple OSS Distributions #define DIOCOSFPADD     _IOWR('D', 79, struct pf_osfp_ioctl)
2135*aca3beaaSApple OSS Distributions #define DIOCOSFPGET     _IOWR('D', 80, struct pf_osfp_ioctl)
2136*aca3beaaSApple OSS Distributions #define DIOCXBEGIN      _IOWR('D', 81, struct pfioc_trans)
2137*aca3beaaSApple OSS Distributions #define DIOCXCOMMIT     _IOWR('D', 82, struct pfioc_trans)
2138*aca3beaaSApple OSS Distributions #define DIOCXROLLBACK   _IOWR('D', 83, struct pfioc_trans)
2139*aca3beaaSApple OSS Distributions #define DIOCGETSRCNODES _IOWR('D', 84, struct pfioc_src_nodes)
2140*aca3beaaSApple OSS Distributions #define DIOCCLRSRCNODES _IO('D', 85)
2141*aca3beaaSApple OSS Distributions #define DIOCSETHOSTID   _IOWR('D', 86, u_int32_t)
2142*aca3beaaSApple OSS Distributions #define DIOCIGETIFACES  _IOWR('D', 87, struct pfioc_iface)
2143*aca3beaaSApple OSS Distributions #define DIOCSETIFFLAG   _IOWR('D', 89, struct pfioc_iface)
2144*aca3beaaSApple OSS Distributions #define DIOCCLRIFFLAG   _IOWR('D', 90, struct pfioc_iface)
2145*aca3beaaSApple OSS Distributions #define DIOCKILLSRCNODES _IOWR('D', 91, struct pfioc_src_node_kill)
2146*aca3beaaSApple OSS Distributions #define DIOCGIFSPEED    _IOWR('D', 92, struct pf_ifspeed)
2147*aca3beaaSApple OSS Distributions 
2148*aca3beaaSApple OSS Distributions #ifdef KERNEL
2149*aca3beaaSApple OSS Distributions RB_HEAD(pf_src_tree, pf_src_node);
2150*aca3beaaSApple OSS Distributions RB_PROTOTYPE_SC(__private_extern__, pf_src_tree, pf_src_node, entry,
2151*aca3beaaSApple OSS Distributions     pf_src_compare);
2152*aca3beaaSApple OSS Distributions extern struct pf_src_tree tree_src_tracking;
2153*aca3beaaSApple OSS Distributions 
2154*aca3beaaSApple OSS Distributions RB_HEAD(pf_state_tree_id, pf_state);
2155*aca3beaaSApple OSS Distributions RB_PROTOTYPE_SC(__private_extern__, pf_state_tree_id, pf_state,
2156*aca3beaaSApple OSS Distributions     entry_id, pf_state_compare_id);
2157*aca3beaaSApple OSS Distributions extern struct pf_state_tree_id tree_id;
2158*aca3beaaSApple OSS Distributions extern struct pf_state_queue state_list;
2159*aca3beaaSApple OSS Distributions 
2160*aca3beaaSApple OSS Distributions TAILQ_HEAD(pf_poolqueue, pf_pool);
2161*aca3beaaSApple OSS Distributions extern struct pf_poolqueue      pf_pools[2];
2162*aca3beaaSApple OSS Distributions extern struct pf_palist pf_pabuf;
2163*aca3beaaSApple OSS Distributions extern u_int32_t                ticket_pabuf;
2164*aca3beaaSApple OSS Distributions extern struct pf_poolqueue      *pf_pools_active;
2165*aca3beaaSApple OSS Distributions extern struct pf_poolqueue      *pf_pools_inactive;
2166*aca3beaaSApple OSS Distributions 
2167*aca3beaaSApple OSS Distributions __private_extern__ int pf_tbladdr_setup(struct pf_ruleset *,
2168*aca3beaaSApple OSS Distributions     struct pf_addr_wrap *);
2169*aca3beaaSApple OSS Distributions __private_extern__ void pf_tbladdr_remove(struct pf_addr_wrap *);
2170*aca3beaaSApple OSS Distributions __private_extern__ void pf_tbladdr_copyout(struct pf_addr_wrap *);
2171*aca3beaaSApple OSS Distributions __private_extern__ void pf_calc_skip_steps(struct pf_rulequeue *);
2172*aca3beaaSApple OSS Distributions __private_extern__ u_int32_t pf_calc_state_key_flowhash(struct pf_state_key *);
2173*aca3beaaSApple OSS Distributions 
2174*aca3beaaSApple OSS Distributions extern struct pool pf_src_tree_pl, pf_rule_pl;
2175*aca3beaaSApple OSS Distributions extern struct pool pf_state_pl, pf_state_key_pl, pf_pooladdr_pl;
2176*aca3beaaSApple OSS Distributions extern struct pool pf_state_scrub_pl;
2177*aca3beaaSApple OSS Distributions extern struct pool pf_app_state_pl;
2178*aca3beaaSApple OSS Distributions 
2179*aca3beaaSApple OSS Distributions extern struct thread *pf_purge_thread;
2180*aca3beaaSApple OSS Distributions 
2181*aca3beaaSApple OSS Distributions __private_extern__ void pfinit(void);
2182*aca3beaaSApple OSS Distributions __private_extern__ void pf_purge_thread_fn(void *, wait_result_t) __dead2;
2183*aca3beaaSApple OSS Distributions __private_extern__ void pf_purge_expired_src_nodes(void);
2184*aca3beaaSApple OSS Distributions __private_extern__ void pf_purge_expired_states(u_int32_t);
2185*aca3beaaSApple OSS Distributions __private_extern__ void pf_unlink_state(struct pf_state *);
2186*aca3beaaSApple OSS Distributions __private_extern__ void pf_free_state(struct pf_state *);
2187*aca3beaaSApple OSS Distributions __private_extern__ int pf_insert_state(struct pfi_kif *, struct pf_state *);
2188*aca3beaaSApple OSS Distributions __private_extern__ int pf_insert_src_node(struct pf_src_node **,
2189*aca3beaaSApple OSS Distributions     struct pf_rule *, struct pf_addr *, sa_family_t);
2190*aca3beaaSApple OSS Distributions __private_extern__ void pf_src_tree_remove_state(struct pf_state *);
2191*aca3beaaSApple OSS Distributions __private_extern__ struct pf_state *pf_find_state_byid(struct pf_state_cmp *);
2192*aca3beaaSApple OSS Distributions __private_extern__ struct pf_state *pf_find_state_all(struct pf_state_key_cmp *,
2193*aca3beaaSApple OSS Distributions     u_int, int *);
2194*aca3beaaSApple OSS Distributions __private_extern__ void pf_print_state(struct pf_state *);
2195*aca3beaaSApple OSS Distributions __private_extern__ void pf_print_flags(u_int8_t);
2196*aca3beaaSApple OSS Distributions __private_extern__ u_int16_t pf_cksum_fixup(u_int16_t, u_int16_t, u_int16_t,
2197*aca3beaaSApple OSS Distributions     u_int8_t);
2198*aca3beaaSApple OSS Distributions 
2199*aca3beaaSApple OSS Distributions extern struct ifnet *sync_ifp;
2200*aca3beaaSApple OSS Distributions extern struct pf_rule pf_default_rule;
2201*aca3beaaSApple OSS Distributions __private_extern__ void pf_addrcpy(struct pf_addr *, struct pf_addr *,
2202*aca3beaaSApple OSS Distributions     u_int8_t);
2203*aca3beaaSApple OSS Distributions __private_extern__ void pf_rm_rule(struct pf_rulequeue *, struct pf_rule *);
2204*aca3beaaSApple OSS Distributions 
2205*aca3beaaSApple OSS Distributions struct ip_fw_args;
2206*aca3beaaSApple OSS Distributions 
2207*aca3beaaSApple OSS Distributions extern boolean_t is_nlc_enabled_glb;
2208*aca3beaaSApple OSS Distributions 
2209*aca3beaaSApple OSS Distributions #if INET
2210*aca3beaaSApple OSS Distributions __private_extern__ int pf_test_mbuf(int, struct ifnet *, struct mbuf **,
2211*aca3beaaSApple OSS Distributions     struct ether_header *, struct ip_fw_args *);
2212*aca3beaaSApple OSS Distributions #endif /* INET */
2213*aca3beaaSApple OSS Distributions 
2214*aca3beaaSApple OSS Distributions __private_extern__ int pf_test6_mbuf(int, struct ifnet *, struct mbuf **,
2215*aca3beaaSApple OSS Distributions     struct ether_header *, struct ip_fw_args *);
2216*aca3beaaSApple OSS Distributions __private_extern__ void pf_poolmask(struct pf_addr *, struct pf_addr *,
2217*aca3beaaSApple OSS Distributions     struct pf_addr *, struct pf_addr *, u_int8_t);
2218*aca3beaaSApple OSS Distributions __private_extern__ void pf_addr_inc(struct pf_addr *, sa_family_t);
2219*aca3beaaSApple OSS Distributions __private_extern__ int pf_normalize_ip6(pbuf_t *, int, struct pfi_kif *,
2220*aca3beaaSApple OSS Distributions     u_short *, struct pf_pdesc *);
2221*aca3beaaSApple OSS Distributions __private_extern__ int pf_refragment6(struct ifnet *, pbuf_t **,
2222*aca3beaaSApple OSS Distributions     struct pf_fragment_tag *);
2223*aca3beaaSApple OSS Distributions 
2224*aca3beaaSApple OSS Distributions __private_extern__ void *pf_lazy_makewritable(struct pf_pdesc *,
2225*aca3beaaSApple OSS Distributions     pbuf_t *, int);
2226*aca3beaaSApple OSS Distributions __private_extern__ void *pf_pull_hdr(pbuf_t *, int, void *, int,
2227*aca3beaaSApple OSS Distributions     u_short *, u_short *, sa_family_t);
2228*aca3beaaSApple OSS Distributions __private_extern__ void pf_change_a(void *, u_int16_t *, u_int32_t, u_int8_t);
2229*aca3beaaSApple OSS Distributions __private_extern__ int pflog_packet(struct pfi_kif *, pbuf_t *,
2230*aca3beaaSApple OSS Distributions     sa_family_t, u_int8_t, u_int8_t, struct pf_rule *, struct pf_rule *,
2231*aca3beaaSApple OSS Distributions     struct pf_ruleset *, struct pf_pdesc *);
2232*aca3beaaSApple OSS Distributions __private_extern__ int pf_match_addr(u_int8_t, struct pf_addr *,
2233*aca3beaaSApple OSS Distributions     struct pf_addr *, struct pf_addr *, sa_family_t);
2234*aca3beaaSApple OSS Distributions __private_extern__ int pf_match_addr_range(struct pf_addr *, struct pf_addr *,
2235*aca3beaaSApple OSS Distributions     struct pf_addr *, sa_family_t);
2236*aca3beaaSApple OSS Distributions __private_extern__ int pf_match(u_int8_t, u_int32_t, u_int32_t, u_int32_t);
2237*aca3beaaSApple OSS Distributions __private_extern__ int pf_match_port(u_int8_t, u_int16_t, u_int16_t, u_int16_t);
2238*aca3beaaSApple OSS Distributions __private_extern__ int pf_match_xport(u_int8_t, u_int8_t, union pf_rule_xport *,
2239*aca3beaaSApple OSS Distributions     union pf_state_xport *);
2240*aca3beaaSApple OSS Distributions __private_extern__ int pf_match_uid(u_int8_t, uid_t, uid_t, uid_t);
2241*aca3beaaSApple OSS Distributions __private_extern__ int pf_match_gid(u_int8_t, gid_t, gid_t, gid_t);
2242*aca3beaaSApple OSS Distributions 
2243*aca3beaaSApple OSS Distributions __private_extern__ void pf_normalize_init(void);
2244*aca3beaaSApple OSS Distributions __private_extern__ int pf_normalize_isempty(void);
2245*aca3beaaSApple OSS Distributions __private_extern__ int pf_normalize_ip(pbuf_t *, int, struct pfi_kif *,
2246*aca3beaaSApple OSS Distributions     u_short *, struct pf_pdesc *);
2247*aca3beaaSApple OSS Distributions __private_extern__ int pf_normalize_tcp(int, struct pfi_kif *, pbuf_t *,
2248*aca3beaaSApple OSS Distributions     int, int, void *, struct pf_pdesc *);
2249*aca3beaaSApple OSS Distributions __private_extern__ void pf_normalize_tcp_cleanup(struct pf_state *);
2250*aca3beaaSApple OSS Distributions __private_extern__ int pf_normalize_tcp_init(pbuf_t *, int,
2251*aca3beaaSApple OSS Distributions     struct pf_pdesc *, struct tcphdr *, struct pf_state_peer *,
2252*aca3beaaSApple OSS Distributions     struct pf_state_peer *);
2253*aca3beaaSApple OSS Distributions __private_extern__ int pf_normalize_tcp_stateful(pbuf_t *, int,
2254*aca3beaaSApple OSS Distributions     struct pf_pdesc *, u_short *, struct tcphdr *, struct pf_state *,
2255*aca3beaaSApple OSS Distributions     struct pf_state_peer *, struct pf_state_peer *, int *);
2256*aca3beaaSApple OSS Distributions __private_extern__ u_int64_t pf_state_expires(const struct pf_state *);
2257*aca3beaaSApple OSS Distributions __private_extern__ void pf_purge_expired_fragments(void);
2258*aca3beaaSApple OSS Distributions __private_extern__ int pf_routable(struct pf_addr *addr, sa_family_t af,
2259*aca3beaaSApple OSS Distributions     struct pfi_kif *);
2260*aca3beaaSApple OSS Distributions __private_extern__ int pf_rtlabel_match(struct pf_addr *, sa_family_t,
2261*aca3beaaSApple OSS Distributions     struct pf_addr_wrap *);
2262*aca3beaaSApple OSS Distributions __private_extern__ int pf_socket_lookup(int, struct pf_pdesc *);
2263*aca3beaaSApple OSS Distributions __private_extern__ struct pf_state_key *pf_alloc_state_key(struct pf_state *,
2264*aca3beaaSApple OSS Distributions     struct pf_state_key *);
2265*aca3beaaSApple OSS Distributions __private_extern__ void pf_detach_state(struct pf_state *, int);
2266*aca3beaaSApple OSS Distributions __private_extern__ void pfr_initialize(void);
2267*aca3beaaSApple OSS Distributions __private_extern__ int pfr_match_addr(struct pfr_ktable *, struct pf_addr *,
2268*aca3beaaSApple OSS Distributions     sa_family_t);
2269*aca3beaaSApple OSS Distributions __private_extern__ void pfr_update_stats(struct pfr_ktable *, struct pf_addr *,
2270*aca3beaaSApple OSS Distributions     sa_family_t, u_int64_t, int, int, int);
2271*aca3beaaSApple OSS Distributions __private_extern__ int pfr_pool_get(struct pfr_ktable *, int *,
2272*aca3beaaSApple OSS Distributions     struct pf_addr *, struct pf_addr **, struct pf_addr **, sa_family_t);
2273*aca3beaaSApple OSS Distributions __private_extern__ void pfr_dynaddr_update(struct pfr_ktable *,
2274*aca3beaaSApple OSS Distributions     struct pfi_dynaddr *);
2275*aca3beaaSApple OSS Distributions __private_extern__ void pfr_table_copyin_cleanup(struct pfr_table *);
2276*aca3beaaSApple OSS Distributions __private_extern__ struct pfr_ktable *pfr_attach_table(struct pf_ruleset *,
2277*aca3beaaSApple OSS Distributions     char *);
2278*aca3beaaSApple OSS Distributions __private_extern__ void pfr_detach_table(struct pfr_ktable *);
2279*aca3beaaSApple OSS Distributions __private_extern__ int pfr_clr_tables(struct pfr_table *, int *, int);
2280*aca3beaaSApple OSS Distributions __private_extern__ int pfr_add_tables(user_addr_t, int, int *, int);
2281*aca3beaaSApple OSS Distributions __private_extern__ int pfr_del_tables(user_addr_t, int, int *, int);
2282*aca3beaaSApple OSS Distributions __private_extern__ int pfr_get_tables(struct pfr_table *, user_addr_t,
2283*aca3beaaSApple OSS Distributions     int *, int);
2284*aca3beaaSApple OSS Distributions __private_extern__ int pfr_get_tstats(struct pfr_table *, user_addr_t,
2285*aca3beaaSApple OSS Distributions     int *, int);
2286*aca3beaaSApple OSS Distributions __private_extern__ int pfr_clr_tstats(user_addr_t, int, int *, int);
2287*aca3beaaSApple OSS Distributions __private_extern__ int pfr_set_tflags(user_addr_t, int, int, int, int *,
2288*aca3beaaSApple OSS Distributions     int *, int);
2289*aca3beaaSApple OSS Distributions __private_extern__ int pfr_clr_addrs(struct pfr_table *, int *, int);
2290*aca3beaaSApple OSS Distributions __private_extern__ int pfr_insert_kentry(struct pfr_ktable *, struct pfr_addr *,
2291*aca3beaaSApple OSS Distributions     u_int64_t);
2292*aca3beaaSApple OSS Distributions __private_extern__ int pfr_add_addrs(struct pfr_table *, user_addr_t,
2293*aca3beaaSApple OSS Distributions     int, int *, int);
2294*aca3beaaSApple OSS Distributions __private_extern__ int pfr_del_addrs(struct pfr_table *, user_addr_t,
2295*aca3beaaSApple OSS Distributions     int, int *, int);
2296*aca3beaaSApple OSS Distributions __private_extern__ int pfr_set_addrs(struct pfr_table *, user_addr_t,
2297*aca3beaaSApple OSS Distributions     int, int *, int *, int *, int *, int, u_int32_t);
2298*aca3beaaSApple OSS Distributions __private_extern__ int pfr_get_addrs(struct pfr_table *, user_addr_t,
2299*aca3beaaSApple OSS Distributions     int *, int);
2300*aca3beaaSApple OSS Distributions __private_extern__ int pfr_get_astats(struct pfr_table *, user_addr_t,
2301*aca3beaaSApple OSS Distributions     int *, int);
2302*aca3beaaSApple OSS Distributions __private_extern__ int pfr_clr_astats(struct pfr_table *, user_addr_t,
2303*aca3beaaSApple OSS Distributions     int, int *, int);
2304*aca3beaaSApple OSS Distributions __private_extern__ int pfr_tst_addrs(struct pfr_table *, user_addr_t,
2305*aca3beaaSApple OSS Distributions     int, int *, int);
2306*aca3beaaSApple OSS Distributions __private_extern__ int pfr_ina_begin(struct pfr_table *, u_int32_t *, int *,
2307*aca3beaaSApple OSS Distributions     int);
2308*aca3beaaSApple OSS Distributions __private_extern__ int pfr_ina_rollback(struct pfr_table *, u_int32_t, int *,
2309*aca3beaaSApple OSS Distributions     int);
2310*aca3beaaSApple OSS Distributions __private_extern__ int pfr_ina_commit(struct pfr_table *, u_int32_t, int *,
2311*aca3beaaSApple OSS Distributions     int *, int);
2312*aca3beaaSApple OSS Distributions __private_extern__ int pfr_ina_define(struct pfr_table *, user_addr_t,
2313*aca3beaaSApple OSS Distributions     int, int *, int *, u_int32_t, int);
2314*aca3beaaSApple OSS Distributions 
2315*aca3beaaSApple OSS Distributions extern struct pfi_kif *pfi_all;
2316*aca3beaaSApple OSS Distributions 
2317*aca3beaaSApple OSS Distributions __private_extern__ void pfi_initialize(void);
2318*aca3beaaSApple OSS Distributions __private_extern__ struct pfi_kif *pfi_kif_get(const char *);
2319*aca3beaaSApple OSS Distributions __private_extern__ void pfi_kif_ref(struct pfi_kif *, enum pfi_kif_refs);
2320*aca3beaaSApple OSS Distributions __private_extern__ void pfi_kif_unref(struct pfi_kif *, enum pfi_kif_refs);
2321*aca3beaaSApple OSS Distributions __private_extern__ int pfi_kif_match(struct pfi_kif *, struct pfi_kif *);
2322*aca3beaaSApple OSS Distributions __private_extern__ void pfi_attach_ifnet(struct ifnet *);
2323*aca3beaaSApple OSS Distributions __private_extern__ void pfi_detach_ifnet(struct ifnet *);
2324*aca3beaaSApple OSS Distributions __private_extern__ int pfi_match_addr(struct pfi_dynaddr *, struct pf_addr *,
2325*aca3beaaSApple OSS Distributions     sa_family_t);
2326*aca3beaaSApple OSS Distributions __private_extern__ int pfi_dynaddr_setup(struct pf_addr_wrap *, sa_family_t);
2327*aca3beaaSApple OSS Distributions __private_extern__ void pfi_dynaddr_remove(struct pf_addr_wrap *);
2328*aca3beaaSApple OSS Distributions __private_extern__ void pfi_dynaddr_copyout(struct pf_addr_wrap *);
2329*aca3beaaSApple OSS Distributions __private_extern__ void pfi_update_status(const char *, struct pf_status *);
2330*aca3beaaSApple OSS Distributions __private_extern__ int pfi_get_ifaces(const char *, user_addr_t, int *);
2331*aca3beaaSApple OSS Distributions __private_extern__ int pfi_set_flags(const char *, int);
2332*aca3beaaSApple OSS Distributions __private_extern__ int pfi_clear_flags(const char *, int);
2333*aca3beaaSApple OSS Distributions 
2334*aca3beaaSApple OSS Distributions __private_extern__ u_int16_t pf_tagname2tag(char *);
2335*aca3beaaSApple OSS Distributions __private_extern__ u_int16_t pf_tagname2tag_ext(char *);
2336*aca3beaaSApple OSS Distributions __private_extern__ void pf_tag_ref(u_int16_t);
2337*aca3beaaSApple OSS Distributions __private_extern__ void pf_tag_unref(u_int16_t);
2338*aca3beaaSApple OSS Distributions __private_extern__ int pf_tag_packet(pbuf_t *, struct pf_mtag *,
2339*aca3beaaSApple OSS Distributions     int, unsigned int, struct pf_pdesc *);
2340*aca3beaaSApple OSS Distributions __private_extern__ void pf_step_into_anchor(int *, struct pf_ruleset **, int,
2341*aca3beaaSApple OSS Distributions     struct pf_rule **, struct pf_rule **, int *);
2342*aca3beaaSApple OSS Distributions __private_extern__ int pf_step_out_of_anchor(int *, struct pf_ruleset **, int,
2343*aca3beaaSApple OSS Distributions     struct pf_rule **, struct pf_rule **, int *);
2344*aca3beaaSApple OSS Distributions __private_extern__ u_int32_t pf_qname2qid(char *);
2345*aca3beaaSApple OSS Distributions __private_extern__ void pf_qid2qname(u_int32_t, char *);
2346*aca3beaaSApple OSS Distributions __private_extern__ void pf_qid_unref(u_int32_t);
2347*aca3beaaSApple OSS Distributions 
2348*aca3beaaSApple OSS Distributions extern struct pf_status pf_status;
2349*aca3beaaSApple OSS Distributions extern struct pool pf_frent_pl, pf_frag_pl;
2350*aca3beaaSApple OSS Distributions 
2351*aca3beaaSApple OSS Distributions struct pf_pool_limit {
2352*aca3beaaSApple OSS Distributions 	void            *pp;
2353*aca3beaaSApple OSS Distributions 	unsigned         limit;
2354*aca3beaaSApple OSS Distributions };
2355*aca3beaaSApple OSS Distributions extern struct pf_pool_limit     pf_pool_limits[PF_LIMIT_MAX];
2356*aca3beaaSApple OSS Distributions 
2357*aca3beaaSApple OSS Distributions __private_extern__ int pf_af_hook(struct ifnet *, struct mbuf **,
2358*aca3beaaSApple OSS Distributions     struct mbuf **, unsigned int, int, struct ip_fw_args *);
2359*aca3beaaSApple OSS Distributions __private_extern__ int pf_ifaddr_hook(struct ifnet *);
2360*aca3beaaSApple OSS Distributions __private_extern__ void pf_ifnet_hook(struct ifnet *, int);
2361*aca3beaaSApple OSS Distributions 
2362*aca3beaaSApple OSS Distributions /*
2363*aca3beaaSApple OSS Distributions  * The following are defined with "private extern" storage class for
2364*aca3beaaSApple OSS Distributions  * kernel, and "extern" for user-space.
2365*aca3beaaSApple OSS Distributions  */
2366*aca3beaaSApple OSS Distributions extern struct pf_anchor_global pf_anchors;
2367*aca3beaaSApple OSS Distributions extern struct pf_anchor pf_main_anchor;
2368*aca3beaaSApple OSS Distributions #define pf_main_ruleset pf_main_anchor.ruleset
2369*aca3beaaSApple OSS Distributions 
2370*aca3beaaSApple OSS Distributions extern int pf_is_enabled;
2371*aca3beaaSApple OSS Distributions extern int16_t pf_nat64_configured;
2372*aca3beaaSApple OSS Distributions #define PF_IS_ENABLED (pf_is_enabled != 0)
2373*aca3beaaSApple OSS Distributions extern u_int32_t pf_hash_seed;
2374*aca3beaaSApple OSS Distributions 
2375*aca3beaaSApple OSS Distributions __private_extern__ int pf_get_ruleset_number(u_int8_t);
2376*aca3beaaSApple OSS Distributions __private_extern__ void pf_init_ruleset(struct pf_ruleset *);
2377*aca3beaaSApple OSS Distributions __private_extern__ int pf_anchor_setup(struct pf_rule *,
2378*aca3beaaSApple OSS Distributions     const struct pf_ruleset *, const char *);
2379*aca3beaaSApple OSS Distributions __private_extern__ int pf_anchor_copyout(const struct pf_ruleset *,
2380*aca3beaaSApple OSS Distributions     const struct pf_rule *, struct pfioc_rule *);
2381*aca3beaaSApple OSS Distributions __private_extern__ void pf_anchor_remove(struct pf_rule *);
2382*aca3beaaSApple OSS Distributions __private_extern__ void pf_remove_if_empty_ruleset(struct pf_ruleset *);
2383*aca3beaaSApple OSS Distributions __private_extern__ struct pf_anchor *pf_find_anchor(const char *);
2384*aca3beaaSApple OSS Distributions __private_extern__ int pf_reference_anchor(struct pf_anchor *a);
2385*aca3beaaSApple OSS Distributions __private_extern__ int pf_release_anchor(struct pf_anchor *a);
2386*aca3beaaSApple OSS Distributions __private_extern__ int pf_release_ruleset(struct pf_ruleset *r);
2387*aca3beaaSApple OSS Distributions __private_extern__ struct pf_ruleset *pf_find_ruleset(const char *);
2388*aca3beaaSApple OSS Distributions __private_extern__ struct pf_ruleset *pf_find_ruleset_with_owner(const char *,
2389*aca3beaaSApple OSS Distributions     const char *, int, int *);
2390*aca3beaaSApple OSS Distributions __private_extern__ struct pf_ruleset *pf_find_or_create_ruleset(const char *);
2391*aca3beaaSApple OSS Distributions __private_extern__ void pf_rs_initialize(void);
2392*aca3beaaSApple OSS Distributions 
2393*aca3beaaSApple OSS Distributions __private_extern__ int pf_osfp_add(struct pf_osfp_ioctl *);
2394*aca3beaaSApple OSS Distributions __private_extern__ struct pf_osfp_enlist *pf_osfp_fingerprint(struct pf_pdesc *,
2395*aca3beaaSApple OSS Distributions     pbuf_t *, int, const struct tcphdr *);
2396*aca3beaaSApple OSS Distributions __private_extern__ struct pf_osfp_enlist *pf_osfp_fingerprint_hdr(
2397*aca3beaaSApple OSS Distributions 	const struct ip *, const struct ip6_hdr *, const struct tcphdr *);
2398*aca3beaaSApple OSS Distributions __private_extern__ void pf_osfp_flush(void);
2399*aca3beaaSApple OSS Distributions __private_extern__ int pf_osfp_get(struct pf_osfp_ioctl *);
2400*aca3beaaSApple OSS Distributions __private_extern__ void pf_osfp_initialize(void);
2401*aca3beaaSApple OSS Distributions __private_extern__ int pf_osfp_match(struct pf_osfp_enlist *, pf_osfp_t);
2402*aca3beaaSApple OSS Distributions __private_extern__ struct pf_os_fingerprint *pf_osfp_validate(void);
2403*aca3beaaSApple OSS Distributions __private_extern__ struct pf_mtag *pf_find_mtag(struct mbuf *);
2404*aca3beaaSApple OSS Distributions __private_extern__ struct pf_mtag *pf_find_mtag_pbuf(pbuf_t *);
2405*aca3beaaSApple OSS Distributions __private_extern__ struct pf_mtag *pf_get_mtag(struct mbuf *);
2406*aca3beaaSApple OSS Distributions __private_extern__ struct pf_mtag *pf_get_mtag_pbuf(pbuf_t *);
2407*aca3beaaSApple OSS Distributions __private_extern__ struct pf_fragment_tag * pf_find_fragment_tag_pbuf(pbuf_t *);
2408*aca3beaaSApple OSS Distributions __private_extern__ struct pf_fragment_tag * pf_find_fragment_tag(struct mbuf *);
2409*aca3beaaSApple OSS Distributions __private_extern__ struct pf_fragment_tag * pf_copy_fragment_tag(struct mbuf *,
2410*aca3beaaSApple OSS Distributions     struct pf_fragment_tag *, int);
2411*aca3beaaSApple OSS Distributions #if SKYWALK && defined(XNU_TARGET_OS_OSX)
2412*aca3beaaSApple OSS Distributions #define PF_COMPATIBLE_FLAGS_PF_ENABLED 0x00000001
2413*aca3beaaSApple OSS Distributions #define PF_COMPATIBLE_FLAGS_CUSTOM_ANCHORS_PRESENT 0x00000002
2414*aca3beaaSApple OSS Distributions #define PF_COMPATIBLE_FLAGS_CUSTOM_RULES_PRESENT 0x00000004
2415*aca3beaaSApple OSS Distributions 
2416*aca3beaaSApple OSS Distributions __private_extern__ uint32_t pf_check_compatible_rules(void);
2417*aca3beaaSApple OSS Distributions #endif // SKYWALK && defined(XNU_TARGET_OS_OSX)
2418*aca3beaaSApple OSS Distributions #else /* !KERNEL */
2419*aca3beaaSApple OSS Distributions extern struct pf_anchor_global pf_anchors;
2420*aca3beaaSApple OSS Distributions extern struct pf_anchor pf_main_anchor;
2421*aca3beaaSApple OSS Distributions #define pf_main_ruleset pf_main_anchor.ruleset
2422*aca3beaaSApple OSS Distributions 
2423*aca3beaaSApple OSS Distributions /* these ruleset functions can be linked into userland programs (pfctl) */
2424*aca3beaaSApple OSS Distributions extern int pf_get_ruleset_number(u_int8_t);
2425*aca3beaaSApple OSS Distributions extern void pf_init_ruleset(struct pf_ruleset *);
2426*aca3beaaSApple OSS Distributions extern int pf_anchor_setup(struct pf_rule *, const struct pf_ruleset *,
2427*aca3beaaSApple OSS Distributions     const char *);
2428*aca3beaaSApple OSS Distributions extern int pf_anchor_copyout(const struct pf_ruleset *, const struct pf_rule *,
2429*aca3beaaSApple OSS Distributions     struct pfioc_rule *);
2430*aca3beaaSApple OSS Distributions extern void pf_anchor_remove(struct pf_rule *);
2431*aca3beaaSApple OSS Distributions extern void pf_remove_if_empty_ruleset(struct pf_ruleset *);
2432*aca3beaaSApple OSS Distributions extern struct pf_anchor *pf_find_anchor(const char *);
2433*aca3beaaSApple OSS Distributions extern struct pf_ruleset *pf_find_ruleset(const char *);
2434*aca3beaaSApple OSS Distributions extern struct pf_ruleset *pf_find_ruleset_with_owner(const char *,
2435*aca3beaaSApple OSS Distributions     const char *, int, int *);
2436*aca3beaaSApple OSS Distributions extern struct pf_ruleset *pf_find_or_create_ruleset(const char *);
2437*aca3beaaSApple OSS Distributions extern void pf_rs_initialize(void);
2438*aca3beaaSApple OSS Distributions #endif /* !KERNEL */
2439*aca3beaaSApple OSS Distributions 
2440*aca3beaaSApple OSS Distributions #ifdef  __cplusplus
2441*aca3beaaSApple OSS Distributions }
2442*aca3beaaSApple OSS Distributions #endif
2443*aca3beaaSApple OSS Distributions #endif /* PF || !KERNEL */
2444*aca3beaaSApple OSS Distributions #endif /* PRIVATE */
2445*aca3beaaSApple OSS Distributions #endif /* _NET_PFVAR_H_ */
2446