xref: /f-stack/tools/compat/include/net/pfvar.h (revision d4a07e70)
1*d4a07e70Sfengbojiang /*-
2*d4a07e70Sfengbojiang  * SPDX-License-Identifier: BSD-2-Clause
3*d4a07e70Sfengbojiang  *
4df6ad731Slogwang  * Copyright (c) 2001 Daniel Hartmeier
5df6ad731Slogwang  * All rights reserved.
6df6ad731Slogwang  *
7df6ad731Slogwang  * Redistribution and use in source and binary forms, with or without
8df6ad731Slogwang  * modification, are permitted provided that the following conditions
9df6ad731Slogwang  * are met:
10df6ad731Slogwang  *
11df6ad731Slogwang  *    - Redistributions of source code must retain the above copyright
12df6ad731Slogwang  *      notice, this list of conditions and the following disclaimer.
13df6ad731Slogwang  *    - Redistributions in binary form must reproduce the above
14df6ad731Slogwang  *      copyright notice, this list of conditions and the following
15df6ad731Slogwang  *      disclaimer in the documentation and/or other materials provided
16df6ad731Slogwang  *      with the distribution.
17df6ad731Slogwang  *
18df6ad731Slogwang  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19df6ad731Slogwang  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20df6ad731Slogwang  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21df6ad731Slogwang  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22df6ad731Slogwang  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23df6ad731Slogwang  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24df6ad731Slogwang  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25df6ad731Slogwang  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26df6ad731Slogwang  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27df6ad731Slogwang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28df6ad731Slogwang  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29df6ad731Slogwang  * POSSIBILITY OF SUCH DAMAGE.
30df6ad731Slogwang  *
31df6ad731Slogwang  *	$OpenBSD: pfvar.h,v 1.282 2009/01/29 15:12:28 pyr Exp $
32df6ad731Slogwang  *	$FreeBSD$
33df6ad731Slogwang  */
34df6ad731Slogwang 
35df6ad731Slogwang #ifndef _NET_PFVAR_H_
36df6ad731Slogwang #define _NET_PFVAR_H_
37df6ad731Slogwang 
38df6ad731Slogwang #include <sys/counter.h>
39df6ad731Slogwang #include <sys/tree.h>
40df6ad731Slogwang #include <sys/queue.h>
41df6ad731Slogwang 
42df6ad731Slogwang #include <net/radix.h>
43df6ad731Slogwang #include <netinet/in.h>
44df6ad731Slogwang 
45df6ad731Slogwang #include <netpfil/pf/pf.h>
46df6ad731Slogwang #include <netpfil/pf/pf_altq.h>
47df6ad731Slogwang 
48df6ad731Slogwang #ifndef __packed
49df6ad731Slogwang #define __packed __attribute__((__packed__))
50df6ad731Slogwang #endif
51df6ad731Slogwang 
52df6ad731Slogwang /* Both IPv4 and IPv6 */
53df6ad731Slogwang #ifdef PF_INET_INET6
54df6ad731Slogwang 
55df6ad731Slogwang #define PF_AEQ(a, b, c) \
56df6ad731Slogwang 	((c == AF_INET && (a)->addr32[0] == (b)->addr32[0]) || \
57df6ad731Slogwang 	(c == AF_INET6 && (a)->addr32[3] == (b)->addr32[3] && \
58df6ad731Slogwang 	(a)->addr32[2] == (b)->addr32[2] && \
59df6ad731Slogwang 	(a)->addr32[1] == (b)->addr32[1] && \
60df6ad731Slogwang 	(a)->addr32[0] == (b)->addr32[0])) \
61df6ad731Slogwang 
62df6ad731Slogwang #define PF_ANEQ(a, b, c) \
63df6ad731Slogwang 	((c == AF_INET && (a)->addr32[0] != (b)->addr32[0]) || \
64df6ad731Slogwang 	(c == AF_INET6 && ((a)->addr32[0] != (b)->addr32[0] || \
65df6ad731Slogwang 	(a)->addr32[1] != (b)->addr32[1] || \
66df6ad731Slogwang 	(a)->addr32[2] != (b)->addr32[2] || \
67df6ad731Slogwang 	(a)->addr32[3] != (b)->addr32[3]))) \
68df6ad731Slogwang 
69df6ad731Slogwang #define PF_AZERO(a, c) \
70df6ad731Slogwang 	((c == AF_INET && !(a)->addr32[0]) || \
71df6ad731Slogwang 	(c == AF_INET6 && !(a)->addr32[0] && !(a)->addr32[1] && \
72df6ad731Slogwang 	!(a)->addr32[2] && !(a)->addr32[3] )) \
73df6ad731Slogwang 
74df6ad731Slogwang #define PF_MATCHA(n, a, m, b, f) \
75df6ad731Slogwang 	pf_match_addr(n, a, m, b, f)
76df6ad731Slogwang 
77df6ad731Slogwang #define PF_ACPY(a, b, f) \
78df6ad731Slogwang 	pf_addrcpy(a, b, f)
79df6ad731Slogwang 
80df6ad731Slogwang #define PF_AINC(a, f) \
81df6ad731Slogwang 	pf_addr_inc(a, f)
82df6ad731Slogwang 
83df6ad731Slogwang #define PF_POOLMASK(a, b, c, d, f) \
84df6ad731Slogwang 	pf_poolmask(a, b, c, d, f)
85df6ad731Slogwang 
86df6ad731Slogwang #else
87df6ad731Slogwang 
88df6ad731Slogwang /* Just IPv6 */
89df6ad731Slogwang 
90df6ad731Slogwang #ifdef PF_INET6_ONLY
91df6ad731Slogwang 
92df6ad731Slogwang #define PF_AEQ(a, b, c) \
93df6ad731Slogwang 	((a)->addr32[3] == (b)->addr32[3] && \
94df6ad731Slogwang 	(a)->addr32[2] == (b)->addr32[2] && \
95df6ad731Slogwang 	(a)->addr32[1] == (b)->addr32[1] && \
96df6ad731Slogwang 	(a)->addr32[0] == (b)->addr32[0]) \
97df6ad731Slogwang 
98df6ad731Slogwang #define PF_ANEQ(a, b, c) \
99df6ad731Slogwang 	((a)->addr32[3] != (b)->addr32[3] || \
100df6ad731Slogwang 	(a)->addr32[2] != (b)->addr32[2] || \
101df6ad731Slogwang 	(a)->addr32[1] != (b)->addr32[1] || \
102df6ad731Slogwang 	(a)->addr32[0] != (b)->addr32[0]) \
103df6ad731Slogwang 
104df6ad731Slogwang #define PF_AZERO(a, c) \
105df6ad731Slogwang 	(!(a)->addr32[0] && \
106df6ad731Slogwang 	!(a)->addr32[1] && \
107df6ad731Slogwang 	!(a)->addr32[2] && \
108df6ad731Slogwang 	!(a)->addr32[3] ) \
109df6ad731Slogwang 
110df6ad731Slogwang #define PF_MATCHA(n, a, m, b, f) \
111df6ad731Slogwang 	pf_match_addr(n, a, m, b, f)
112df6ad731Slogwang 
113df6ad731Slogwang #define PF_ACPY(a, b, f) \
114df6ad731Slogwang 	pf_addrcpy(a, b, f)
115df6ad731Slogwang 
116df6ad731Slogwang #define PF_AINC(a, f) \
117df6ad731Slogwang 	pf_addr_inc(a, f)
118df6ad731Slogwang 
119df6ad731Slogwang #define PF_POOLMASK(a, b, c, d, f) \
120df6ad731Slogwang 	pf_poolmask(a, b, c, d, f)
121df6ad731Slogwang 
122df6ad731Slogwang #else
123df6ad731Slogwang 
124df6ad731Slogwang /* Just IPv4 */
125df6ad731Slogwang #ifdef PF_INET_ONLY
126df6ad731Slogwang 
127df6ad731Slogwang #define PF_AEQ(a, b, c) \
128df6ad731Slogwang 	((a)->addr32[0] == (b)->addr32[0])
129df6ad731Slogwang 
130df6ad731Slogwang #define PF_ANEQ(a, b, c) \
131df6ad731Slogwang 	((a)->addr32[0] != (b)->addr32[0])
132df6ad731Slogwang 
133df6ad731Slogwang #define PF_AZERO(a, c) \
134df6ad731Slogwang 	(!(a)->addr32[0])
135df6ad731Slogwang 
136df6ad731Slogwang #define PF_MATCHA(n, a, m, b, f) \
137df6ad731Slogwang 	pf_match_addr(n, a, m, b, f)
138df6ad731Slogwang 
139df6ad731Slogwang #define PF_ACPY(a, b, f) \
140df6ad731Slogwang 	(a)->v4.s_addr = (b)->v4.s_addr
141df6ad731Slogwang 
142df6ad731Slogwang #define PF_AINC(a, f) \
143df6ad731Slogwang 	do { \
144df6ad731Slogwang 		(a)->addr32[0] = htonl(ntohl((a)->addr32[0]) + 1); \
145df6ad731Slogwang 	} while (0)
146df6ad731Slogwang 
147df6ad731Slogwang #define PF_POOLMASK(a, b, c, d, f) \
148df6ad731Slogwang 	do { \
149df6ad731Slogwang 		(a)->addr32[0] = ((b)->addr32[0] & (c)->addr32[0]) | \
150df6ad731Slogwang 		(((c)->addr32[0] ^ 0xffffffff ) & (d)->addr32[0]); \
151df6ad731Slogwang 	} while (0)
152df6ad731Slogwang 
153df6ad731Slogwang #endif /* PF_INET_ONLY */
154df6ad731Slogwang #endif /* PF_INET6_ONLY */
155df6ad731Slogwang #endif /* PF_INET_INET6 */
156df6ad731Slogwang 
157df6ad731Slogwang /*
158df6ad731Slogwang  * XXX callers not FIB-aware in our version of pf yet.
159df6ad731Slogwang  * OpenBSD fixed it later it seems, 2010/05/07 13:33:16 claudio.
160df6ad731Slogwang  */
161df6ad731Slogwang #define	PF_MISMATCHAW(aw, x, af, neg, ifp, rtid)			\
162df6ad731Slogwang 	(								\
163df6ad731Slogwang 		(((aw)->type == PF_ADDR_NOROUTE &&			\
164df6ad731Slogwang 		    pf_routable((x), (af), NULL, (rtid))) ||		\
165df6ad731Slogwang 		(((aw)->type == PF_ADDR_URPFFAILED && (ifp) != NULL &&	\
166df6ad731Slogwang 		    pf_routable((x), (af), (ifp), (rtid))) ||		\
167df6ad731Slogwang 		((aw)->type == PF_ADDR_TABLE &&				\
168df6ad731Slogwang 		    !pfr_match_addr((aw)->p.tbl, (x), (af))) ||		\
169df6ad731Slogwang 		((aw)->type == PF_ADDR_DYNIFTL &&			\
170df6ad731Slogwang 		    !pfi_match_addr((aw)->p.dyn, (x), (af))) ||		\
171df6ad731Slogwang 		((aw)->type == PF_ADDR_RANGE &&				\
172df6ad731Slogwang 		    !pf_match_addr_range(&(aw)->v.a.addr,		\
173df6ad731Slogwang 		    &(aw)->v.a.mask, (x), (af))) ||			\
174df6ad731Slogwang 		((aw)->type == PF_ADDR_ADDRMASK &&			\
175df6ad731Slogwang 		    !PF_AZERO(&(aw)->v.a.mask, (af)) &&			\
176df6ad731Slogwang 		    !PF_MATCHA(0, &(aw)->v.a.addr,			\
177df6ad731Slogwang 		    &(aw)->v.a.mask, (x), (af))))) !=			\
178df6ad731Slogwang 		(neg)							\
179df6ad731Slogwang 	)
180df6ad731Slogwang 
181*d4a07e70Sfengbojiang #define PF_ALGNMNT(off) (((off) % 2) == 0)
182df6ad731Slogwang 
183*d4a07e70Sfengbojiang #ifdef _KERNEL
184df6ad731Slogwang 
185*d4a07e70Sfengbojiang struct pf_kpooladdr {
186df6ad731Slogwang 	struct pf_addr_wrap		 addr;
187*d4a07e70Sfengbojiang 	TAILQ_ENTRY(pf_kpooladdr)	 entries;
188df6ad731Slogwang 	char				 ifname[IFNAMSIZ];
189*d4a07e70Sfengbojiang 	struct pfi_kkif			*kif;
190df6ad731Slogwang };
191df6ad731Slogwang 
192*d4a07e70Sfengbojiang TAILQ_HEAD(pf_kpalist, pf_kpooladdr);
193df6ad731Slogwang 
194*d4a07e70Sfengbojiang struct pf_kpool {
195*d4a07e70Sfengbojiang 	struct pf_kpalist	 list;
196*d4a07e70Sfengbojiang 	struct pf_kpooladdr	*cur;
197df6ad731Slogwang 	struct pf_poolhashkey	 key;
198df6ad731Slogwang 	struct pf_addr		 counter;
199df6ad731Slogwang 	int			 tblidx;
200df6ad731Slogwang 	u_int16_t		 proxy_port[2];
201df6ad731Slogwang 	u_int8_t		 opts;
202df6ad731Slogwang };
203df6ad731Slogwang 
204*d4a07e70Sfengbojiang union pf_krule_ptr {
205*d4a07e70Sfengbojiang 	struct pf_krule		*ptr;
206df6ad731Slogwang 	u_int32_t		 nr;
207df6ad731Slogwang };
208df6ad731Slogwang 
209*d4a07e70Sfengbojiang struct pf_krule {
210df6ad731Slogwang 	struct pf_rule_addr	 src;
211df6ad731Slogwang 	struct pf_rule_addr	 dst;
212*d4a07e70Sfengbojiang 	union pf_krule_ptr	 skip[PF_SKIP_COUNT];
213df6ad731Slogwang 	char			 label[PF_RULE_LABEL_SIZE];
214df6ad731Slogwang 	char			 ifname[IFNAMSIZ];
215df6ad731Slogwang 	char			 qname[PF_QNAME_SIZE];
216df6ad731Slogwang 	char			 pqname[PF_QNAME_SIZE];
217df6ad731Slogwang 	char			 tagname[PF_TAG_NAME_SIZE];
218df6ad731Slogwang 	char			 match_tagname[PF_TAG_NAME_SIZE];
219df6ad731Slogwang 
220df6ad731Slogwang 	char			 overload_tblname[PF_TABLE_NAME_SIZE];
221df6ad731Slogwang 
222*d4a07e70Sfengbojiang 	TAILQ_ENTRY(pf_krule)	 entries;
223*d4a07e70Sfengbojiang 	struct pf_kpool		 rpool;
224df6ad731Slogwang 
225*d4a07e70Sfengbojiang 	counter_u64_t		 evaluations;
226*d4a07e70Sfengbojiang 	counter_u64_t		 packets[2];
227*d4a07e70Sfengbojiang 	counter_u64_t		 bytes[2];
228df6ad731Slogwang 
229*d4a07e70Sfengbojiang 	struct pfi_kkif		*kif;
230*d4a07e70Sfengbojiang 	struct pf_kanchor	*anchor;
231df6ad731Slogwang 	struct pfr_ktable	*overload_tbl;
232df6ad731Slogwang 
233df6ad731Slogwang 	pf_osfp_t		 os_fingerprint;
234df6ad731Slogwang 
235df6ad731Slogwang 	int			 rtableid;
236df6ad731Slogwang 	u_int32_t		 timeout[PFTM_MAX];
237df6ad731Slogwang 	u_int32_t		 max_states;
238df6ad731Slogwang 	u_int32_t		 max_src_nodes;
239df6ad731Slogwang 	u_int32_t		 max_src_states;
240df6ad731Slogwang 	u_int32_t		 max_src_conn;
241df6ad731Slogwang 	struct {
242df6ad731Slogwang 		u_int32_t		limit;
243df6ad731Slogwang 		u_int32_t		seconds;
244df6ad731Slogwang 	}			 max_src_conn_rate;
245df6ad731Slogwang 	u_int32_t		 qid;
246df6ad731Slogwang 	u_int32_t		 pqid;
247df6ad731Slogwang 	u_int32_t		 rt_listid;
248df6ad731Slogwang 	u_int32_t		 nr;
249df6ad731Slogwang 	u_int32_t		 prob;
250df6ad731Slogwang 	uid_t			 cuid;
251df6ad731Slogwang 	pid_t			 cpid;
252df6ad731Slogwang 
253df6ad731Slogwang 	counter_u64_t		 states_cur;
254df6ad731Slogwang 	counter_u64_t		 states_tot;
255df6ad731Slogwang 	counter_u64_t		 src_nodes;
256df6ad731Slogwang 
257df6ad731Slogwang 	u_int16_t		 return_icmp;
258df6ad731Slogwang 	u_int16_t		 return_icmp6;
259df6ad731Slogwang 	u_int16_t		 max_mss;
260df6ad731Slogwang 	u_int16_t		 tag;
261df6ad731Slogwang 	u_int16_t		 match_tag;
262df6ad731Slogwang 	u_int16_t		 scrub_flags;
263df6ad731Slogwang 
264df6ad731Slogwang 	struct pf_rule_uid	 uid;
265df6ad731Slogwang 	struct pf_rule_gid	 gid;
266df6ad731Slogwang 
267df6ad731Slogwang 	u_int32_t		 rule_flag;
268df6ad731Slogwang 	u_int8_t		 action;
269df6ad731Slogwang 	u_int8_t		 direction;
270df6ad731Slogwang 	u_int8_t		 log;
271df6ad731Slogwang 	u_int8_t		 logif;
272df6ad731Slogwang 	u_int8_t		 quick;
273df6ad731Slogwang 	u_int8_t		 ifnot;
274df6ad731Slogwang 	u_int8_t		 match_tag_not;
275df6ad731Slogwang 	u_int8_t		 natpass;
276df6ad731Slogwang 
277df6ad731Slogwang 	u_int8_t		 keep_state;
278df6ad731Slogwang 	sa_family_t		 af;
279df6ad731Slogwang 	u_int8_t		 proto;
280df6ad731Slogwang 	u_int8_t		 type;
281df6ad731Slogwang 	u_int8_t		 code;
282df6ad731Slogwang 	u_int8_t		 flags;
283df6ad731Slogwang 	u_int8_t		 flagset;
284df6ad731Slogwang 	u_int8_t		 min_ttl;
285df6ad731Slogwang 	u_int8_t		 allow_opts;
286df6ad731Slogwang 	u_int8_t		 rt;
287df6ad731Slogwang 	u_int8_t		 return_ttl;
288df6ad731Slogwang 	u_int8_t		 tos;
289df6ad731Slogwang 	u_int8_t		 set_tos;
290df6ad731Slogwang 	u_int8_t		 anchor_relative;
291df6ad731Slogwang 	u_int8_t		 anchor_wildcard;
292df6ad731Slogwang 
293df6ad731Slogwang 	u_int8_t		 flush;
294df6ad731Slogwang 	u_int8_t		 prio;
295df6ad731Slogwang 	u_int8_t		 set_prio[2];
296df6ad731Slogwang 
297df6ad731Slogwang 	struct {
298df6ad731Slogwang 		struct pf_addr		addr;
299df6ad731Slogwang 		u_int16_t		port;
300df6ad731Slogwang 	}			divert;
301df6ad731Slogwang };
302df6ad731Slogwang 
303*d4a07e70Sfengbojiang struct pf_ksrc_node {
304*d4a07e70Sfengbojiang 	LIST_ENTRY(pf_ksrc_node) entry;
305df6ad731Slogwang 	struct pf_addr	 addr;
306df6ad731Slogwang 	struct pf_addr	 raddr;
307*d4a07e70Sfengbojiang 	union pf_krule_ptr rule;
308*d4a07e70Sfengbojiang 	struct pfi_kkif	*kif;
309*d4a07e70Sfengbojiang 	counter_u64_t	 bytes[2];
310*d4a07e70Sfengbojiang 	counter_u64_t	 packets[2];
311df6ad731Slogwang 	u_int32_t	 states;
312df6ad731Slogwang 	u_int32_t	 conn;
313df6ad731Slogwang 	struct pf_threshold	conn_rate;
314df6ad731Slogwang 	u_int32_t	 creation;
315df6ad731Slogwang 	u_int32_t	 expire;
316df6ad731Slogwang 	sa_family_t	 af;
317df6ad731Slogwang 	u_int8_t	 ruletype;
318df6ad731Slogwang };
319*d4a07e70Sfengbojiang #endif
320df6ad731Slogwang 
321df6ad731Slogwang struct pf_state_scrub {
322df6ad731Slogwang 	struct timeval	pfss_last;	/* time received last packet	*/
323df6ad731Slogwang 	u_int32_t	pfss_tsecr;	/* last echoed timestamp	*/
324df6ad731Slogwang 	u_int32_t	pfss_tsval;	/* largest timestamp		*/
325df6ad731Slogwang 	u_int32_t	pfss_tsval0;	/* original timestamp		*/
326df6ad731Slogwang 	u_int16_t	pfss_flags;
327df6ad731Slogwang #define PFSS_TIMESTAMP	0x0001		/* modulate timestamp		*/
328df6ad731Slogwang #define PFSS_PAWS	0x0010		/* stricter PAWS checks		*/
329df6ad731Slogwang #define PFSS_PAWS_IDLED	0x0020		/* was idle too long.  no PAWS	*/
330df6ad731Slogwang #define PFSS_DATA_TS	0x0040		/* timestamp on data packets	*/
331df6ad731Slogwang #define PFSS_DATA_NOTS	0x0080		/* no timestamp on data packets	*/
332df6ad731Slogwang 	u_int8_t	pfss_ttl;	/* stashed TTL			*/
333df6ad731Slogwang 	u_int8_t	pad;
334df6ad731Slogwang 	u_int32_t	pfss_ts_mod;	/* timestamp modulation		*/
335df6ad731Slogwang };
336df6ad731Slogwang 
337df6ad731Slogwang struct pf_state_host {
338df6ad731Slogwang 	struct pf_addr	addr;
339df6ad731Slogwang 	u_int16_t	port;
340df6ad731Slogwang 	u_int16_t	pad;
341df6ad731Slogwang };
342df6ad731Slogwang 
343df6ad731Slogwang struct pf_state_peer {
344df6ad731Slogwang 	struct pf_state_scrub	*scrub;	/* state is scrubbed		*/
345df6ad731Slogwang 	u_int32_t	seqlo;		/* Max sequence number sent	*/
346df6ad731Slogwang 	u_int32_t	seqhi;		/* Max the other end ACKd + win	*/
347df6ad731Slogwang 	u_int32_t	seqdiff;	/* Sequence number modulator	*/
348df6ad731Slogwang 	u_int16_t	max_win;	/* largest window (pre scaling)	*/
349df6ad731Slogwang 	u_int16_t	mss;		/* Maximum segment size option	*/
350df6ad731Slogwang 	u_int8_t	state;		/* active state level		*/
351df6ad731Slogwang 	u_int8_t	wscale;		/* window scaling factor	*/
352df6ad731Slogwang 	u_int8_t	tcp_est;	/* Did we reach TCPS_ESTABLISHED */
353df6ad731Slogwang 	u_int8_t	pad[1];
354df6ad731Slogwang };
355df6ad731Slogwang 
356df6ad731Slogwang /* Keep synced with struct pf_state_key. */
357df6ad731Slogwang struct pf_state_key_cmp {
358df6ad731Slogwang 	struct pf_addr	 addr[2];
359df6ad731Slogwang 	u_int16_t	 port[2];
360df6ad731Slogwang 	sa_family_t	 af;
361df6ad731Slogwang 	u_int8_t	 proto;
362df6ad731Slogwang 	u_int8_t	 pad[2];
363df6ad731Slogwang };
364df6ad731Slogwang 
365df6ad731Slogwang struct pf_state_key {
366df6ad731Slogwang 	struct pf_addr	 addr[2];
367df6ad731Slogwang 	u_int16_t	 port[2];
368df6ad731Slogwang 	sa_family_t	 af;
369df6ad731Slogwang 	u_int8_t	 proto;
370df6ad731Slogwang 	u_int8_t	 pad[2];
371df6ad731Slogwang 
372df6ad731Slogwang 	LIST_ENTRY(pf_state_key) entry;
373df6ad731Slogwang 	TAILQ_HEAD(, pf_state)	 states[2];
374df6ad731Slogwang };
375df6ad731Slogwang 
376df6ad731Slogwang /* Keep synced with struct pf_state. */
377df6ad731Slogwang struct pf_state_cmp {
378df6ad731Slogwang 	u_int64_t		 id;
379df6ad731Slogwang 	u_int32_t		 creatorid;
380df6ad731Slogwang 	u_int8_t		 direction;
381df6ad731Slogwang 	u_int8_t		 pad[3];
382df6ad731Slogwang };
383df6ad731Slogwang 
384*d4a07e70Sfengbojiang #define	PFSTATE_ALLOWOPTS	0x01
385*d4a07e70Sfengbojiang #define	PFSTATE_SLOPPY		0x02
386*d4a07e70Sfengbojiang /*  was	PFSTATE_PFLOW		0x04 */
387*d4a07e70Sfengbojiang #define	PFSTATE_NOSYNC		0x08
388*d4a07e70Sfengbojiang #define	PFSTATE_ACK		0x10
389*d4a07e70Sfengbojiang #define	PFSTATE_SETPRIO		0x0200
390*d4a07e70Sfengbojiang #define	PFSTATE_SETMASK   (PFSTATE_SETPRIO)
391*d4a07e70Sfengbojiang 
392*d4a07e70Sfengbojiang #ifdef _KERNEL
393df6ad731Slogwang struct pf_state {
394df6ad731Slogwang 	u_int64_t		 id;
395df6ad731Slogwang 	u_int32_t		 creatorid;
396df6ad731Slogwang 	u_int8_t		 direction;
397df6ad731Slogwang 	u_int8_t		 pad[3];
398df6ad731Slogwang 
399df6ad731Slogwang 	u_int			 refs;
400df6ad731Slogwang 	TAILQ_ENTRY(pf_state)	 sync_list;
401df6ad731Slogwang 	TAILQ_ENTRY(pf_state)	 key_list[2];
402df6ad731Slogwang 	LIST_ENTRY(pf_state)	 entry;
403df6ad731Slogwang 	struct pf_state_peer	 src;
404df6ad731Slogwang 	struct pf_state_peer	 dst;
405*d4a07e70Sfengbojiang 	union pf_krule_ptr	 rule;
406*d4a07e70Sfengbojiang 	union pf_krule_ptr	 anchor;
407*d4a07e70Sfengbojiang 	union pf_krule_ptr	 nat_rule;
408df6ad731Slogwang 	struct pf_addr		 rt_addr;
409df6ad731Slogwang 	struct pf_state_key	*key[2];	/* addresses stack and wire  */
410*d4a07e70Sfengbojiang 	struct pfi_kkif		*kif;
411*d4a07e70Sfengbojiang 	struct pfi_kkif		*rt_kif;
412*d4a07e70Sfengbojiang 	struct pf_ksrc_node	*src_node;
413*d4a07e70Sfengbojiang 	struct pf_ksrc_node	*nat_src_node;
414*d4a07e70Sfengbojiang 	counter_u64_t		 packets[2];
415*d4a07e70Sfengbojiang 	counter_u64_t		 bytes[2];
416df6ad731Slogwang 	u_int32_t		 creation;
417df6ad731Slogwang 	u_int32_t	 	 expire;
418df6ad731Slogwang 	u_int32_t		 pfsync_time;
419df6ad731Slogwang 	u_int16_t		 tag;
420df6ad731Slogwang 	u_int8_t		 log;
421df6ad731Slogwang 	u_int8_t		 state_flags;
422df6ad731Slogwang 	u_int8_t		 timeout;
423df6ad731Slogwang 	u_int8_t		 sync_state; /* PFSYNC_S_x */
424df6ad731Slogwang 
425df6ad731Slogwang 	/* XXX */
426df6ad731Slogwang 	u_int8_t		 sync_updates;
427df6ad731Slogwang 	u_int8_t		_tail[3];
428df6ad731Slogwang };
429*d4a07e70Sfengbojiang #endif
430df6ad731Slogwang 
431df6ad731Slogwang /*
432df6ad731Slogwang  * Unified state structures for pulling states out of the kernel
433df6ad731Slogwang  * used by pfsync(4) and the pf(4) ioctl.
434df6ad731Slogwang  */
435df6ad731Slogwang struct pfsync_state_scrub {
436df6ad731Slogwang 	u_int16_t	pfss_flags;
437df6ad731Slogwang 	u_int8_t	pfss_ttl;	/* stashed TTL		*/
438df6ad731Slogwang #define PFSYNC_SCRUB_FLAG_VALID		0x01
439df6ad731Slogwang 	u_int8_t	scrub_flag;
440df6ad731Slogwang 	u_int32_t	pfss_ts_mod;	/* timestamp modulation	*/
441df6ad731Slogwang } __packed;
442df6ad731Slogwang 
443df6ad731Slogwang struct pfsync_state_peer {
444df6ad731Slogwang 	struct pfsync_state_scrub scrub;	/* state is scrubbed	*/
445df6ad731Slogwang 	u_int32_t	seqlo;		/* Max sequence number sent	*/
446df6ad731Slogwang 	u_int32_t	seqhi;		/* Max the other end ACKd + win	*/
447df6ad731Slogwang 	u_int32_t	seqdiff;	/* Sequence number modulator	*/
448df6ad731Slogwang 	u_int16_t	max_win;	/* largest window (pre scaling)	*/
449df6ad731Slogwang 	u_int16_t	mss;		/* Maximum segment size option	*/
450df6ad731Slogwang 	u_int8_t	state;		/* active state level		*/
451df6ad731Slogwang 	u_int8_t	wscale;		/* window scaling factor	*/
452df6ad731Slogwang 	u_int8_t	pad[6];
453df6ad731Slogwang } __packed;
454df6ad731Slogwang 
455df6ad731Slogwang struct pfsync_state_key {
456df6ad731Slogwang 	struct pf_addr	 addr[2];
457df6ad731Slogwang 	u_int16_t	 port[2];
458df6ad731Slogwang };
459df6ad731Slogwang 
460df6ad731Slogwang struct pfsync_state {
461df6ad731Slogwang 	u_int64_t	 id;
462df6ad731Slogwang 	char		 ifname[IFNAMSIZ];
463df6ad731Slogwang 	struct pfsync_state_key	key[2];
464df6ad731Slogwang 	struct pfsync_state_peer src;
465df6ad731Slogwang 	struct pfsync_state_peer dst;
466df6ad731Slogwang 	struct pf_addr	 rt_addr;
467df6ad731Slogwang 	u_int32_t	 rule;
468df6ad731Slogwang 	u_int32_t	 anchor;
469df6ad731Slogwang 	u_int32_t	 nat_rule;
470df6ad731Slogwang 	u_int32_t	 creation;
471df6ad731Slogwang 	u_int32_t	 expire;
472df6ad731Slogwang 	u_int32_t	 packets[2][2];
473df6ad731Slogwang 	u_int32_t	 bytes[2][2];
474df6ad731Slogwang 	u_int32_t	 creatorid;
475df6ad731Slogwang 	sa_family_t	 af;
476df6ad731Slogwang 	u_int8_t	 proto;
477df6ad731Slogwang 	u_int8_t	 direction;
478df6ad731Slogwang 	u_int8_t	 __spare[2];
479df6ad731Slogwang 	u_int8_t	 log;
480df6ad731Slogwang 	u_int8_t	 state_flags;
481df6ad731Slogwang 	u_int8_t	 timeout;
482df6ad731Slogwang 	u_int8_t	 sync_flags;
483df6ad731Slogwang 	u_int8_t	 updates;
484df6ad731Slogwang } __packed;
485df6ad731Slogwang 
486df6ad731Slogwang #define	PFSYNC_FLAG_SRCNODE	0x04
487df6ad731Slogwang #define	PFSYNC_FLAG_NATSRCNODE	0x08
488df6ad731Slogwang 
489df6ad731Slogwang /* for copies to/from network byte order */
490df6ad731Slogwang /* ioctl interface also uses network byte order */
491df6ad731Slogwang #define pf_state_peer_hton(s,d) do {		\
492df6ad731Slogwang 	(d)->seqlo = htonl((s)->seqlo);		\
493df6ad731Slogwang 	(d)->seqhi = htonl((s)->seqhi);		\
494df6ad731Slogwang 	(d)->seqdiff = htonl((s)->seqdiff);	\
495df6ad731Slogwang 	(d)->max_win = htons((s)->max_win);	\
496df6ad731Slogwang 	(d)->mss = htons((s)->mss);		\
497df6ad731Slogwang 	(d)->state = (s)->state;		\
498df6ad731Slogwang 	(d)->wscale = (s)->wscale;		\
499df6ad731Slogwang 	if ((s)->scrub) {						\
500df6ad731Slogwang 		(d)->scrub.pfss_flags = 				\
501df6ad731Slogwang 		    htons((s)->scrub->pfss_flags & PFSS_TIMESTAMP);	\
502df6ad731Slogwang 		(d)->scrub.pfss_ttl = (s)->scrub->pfss_ttl;		\
503df6ad731Slogwang 		(d)->scrub.pfss_ts_mod = htonl((s)->scrub->pfss_ts_mod);\
504df6ad731Slogwang 		(d)->scrub.scrub_flag = PFSYNC_SCRUB_FLAG_VALID;	\
505df6ad731Slogwang 	}								\
506df6ad731Slogwang } while (0)
507df6ad731Slogwang 
508df6ad731Slogwang #define pf_state_peer_ntoh(s,d) do {		\
509df6ad731Slogwang 	(d)->seqlo = ntohl((s)->seqlo);		\
510df6ad731Slogwang 	(d)->seqhi = ntohl((s)->seqhi);		\
511df6ad731Slogwang 	(d)->seqdiff = ntohl((s)->seqdiff);	\
512df6ad731Slogwang 	(d)->max_win = ntohs((s)->max_win);	\
513df6ad731Slogwang 	(d)->mss = ntohs((s)->mss);		\
514df6ad731Slogwang 	(d)->state = (s)->state;		\
515df6ad731Slogwang 	(d)->wscale = (s)->wscale;		\
516df6ad731Slogwang 	if ((s)->scrub.scrub_flag == PFSYNC_SCRUB_FLAG_VALID && 	\
517df6ad731Slogwang 	    (d)->scrub != NULL) {					\
518df6ad731Slogwang 		(d)->scrub->pfss_flags =				\
519df6ad731Slogwang 		    ntohs((s)->scrub.pfss_flags) & PFSS_TIMESTAMP;	\
520df6ad731Slogwang 		(d)->scrub->pfss_ttl = (s)->scrub.pfss_ttl;		\
521df6ad731Slogwang 		(d)->scrub->pfss_ts_mod = ntohl((s)->scrub.pfss_ts_mod);\
522df6ad731Slogwang 	}								\
523df6ad731Slogwang } while (0)
524df6ad731Slogwang 
525df6ad731Slogwang #define pf_state_counter_hton(s,d) do {				\
526df6ad731Slogwang 	d[0] = htonl((s>>32)&0xffffffff);			\
527df6ad731Slogwang 	d[1] = htonl(s&0xffffffff);				\
528df6ad731Slogwang } while (0)
529df6ad731Slogwang 
530df6ad731Slogwang #define pf_state_counter_from_pfsync(s)				\
531df6ad731Slogwang 	(((u_int64_t)(s[0])<<32) | (u_int64_t)(s[1]))
532df6ad731Slogwang 
533df6ad731Slogwang #define pf_state_counter_ntoh(s,d) do {				\
534df6ad731Slogwang 	d = ntohl(s[0]);					\
535df6ad731Slogwang 	d = d<<32;						\
536df6ad731Slogwang 	d += ntohl(s[1]);					\
537df6ad731Slogwang } while (0)
538df6ad731Slogwang 
539*d4a07e70Sfengbojiang TAILQ_HEAD(pf_krulequeue, pf_krule);
540df6ad731Slogwang 
541*d4a07e70Sfengbojiang struct pf_kanchor;
542df6ad731Slogwang 
543*d4a07e70Sfengbojiang struct pf_kruleset {
544df6ad731Slogwang 	struct {
545*d4a07e70Sfengbojiang 		struct pf_krulequeue	 queues[2];
546df6ad731Slogwang 		struct {
547*d4a07e70Sfengbojiang 			struct pf_krulequeue	*ptr;
548*d4a07e70Sfengbojiang 			struct pf_krule		**ptr_array;
549df6ad731Slogwang 			u_int32_t		 rcount;
550df6ad731Slogwang 			u_int32_t		 ticket;
551df6ad731Slogwang 			int			 open;
552df6ad731Slogwang 		}			 active, inactive;
553df6ad731Slogwang 	}			 rules[PF_RULESET_MAX];
554*d4a07e70Sfengbojiang 	struct pf_kanchor	*anchor;
555df6ad731Slogwang 	u_int32_t		 tticket;
556df6ad731Slogwang 	int			 tables;
557df6ad731Slogwang 	int			 topen;
558df6ad731Slogwang };
559df6ad731Slogwang 
560*d4a07e70Sfengbojiang RB_HEAD(pf_kanchor_global, pf_kanchor);
561*d4a07e70Sfengbojiang RB_HEAD(pf_kanchor_node, pf_kanchor);
562*d4a07e70Sfengbojiang struct pf_kanchor {
563*d4a07e70Sfengbojiang 	RB_ENTRY(pf_kanchor)	 entry_global;
564*d4a07e70Sfengbojiang 	RB_ENTRY(pf_kanchor)	 entry_node;
565*d4a07e70Sfengbojiang 	struct pf_kanchor	*parent;
566*d4a07e70Sfengbojiang 	struct pf_kanchor_node	 children;
567df6ad731Slogwang 	char			 name[PF_ANCHOR_NAME_SIZE];
568df6ad731Slogwang 	char			 path[MAXPATHLEN];
569*d4a07e70Sfengbojiang 	struct pf_kruleset	 ruleset;
570df6ad731Slogwang 	int			 refcnt;	/* anchor rules */
571df6ad731Slogwang 	int			 match;	/* XXX: used for pfctl black magic */
572df6ad731Slogwang };
573*d4a07e70Sfengbojiang RB_PROTOTYPE(pf_kanchor_global, pf_kanchor, entry_global, pf_anchor_compare);
574*d4a07e70Sfengbojiang RB_PROTOTYPE(pf_kanchor_node, pf_kanchor, entry_node, pf_kanchor_compare);
575df6ad731Slogwang 
576df6ad731Slogwang #define PF_RESERVED_ANCHOR	"_pf"
577df6ad731Slogwang 
578df6ad731Slogwang #define PFR_TFLAG_PERSIST	0x00000001
579df6ad731Slogwang #define PFR_TFLAG_CONST		0x00000002
580df6ad731Slogwang #define PFR_TFLAG_ACTIVE	0x00000004
581df6ad731Slogwang #define PFR_TFLAG_INACTIVE	0x00000008
582df6ad731Slogwang #define PFR_TFLAG_REFERENCED	0x00000010
583df6ad731Slogwang #define PFR_TFLAG_REFDANCHOR	0x00000020
584df6ad731Slogwang #define PFR_TFLAG_COUNTERS	0x00000040
585df6ad731Slogwang /* Adjust masks below when adding flags. */
586df6ad731Slogwang #define PFR_TFLAG_USRMASK	(PFR_TFLAG_PERSIST	| \
587df6ad731Slogwang 				 PFR_TFLAG_CONST	| \
588df6ad731Slogwang 				 PFR_TFLAG_COUNTERS)
589df6ad731Slogwang #define PFR_TFLAG_SETMASK	(PFR_TFLAG_ACTIVE	| \
590df6ad731Slogwang 				 PFR_TFLAG_INACTIVE	| \
591df6ad731Slogwang 				 PFR_TFLAG_REFERENCED	| \
592df6ad731Slogwang 				 PFR_TFLAG_REFDANCHOR)
593df6ad731Slogwang #define PFR_TFLAG_ALLMASK	(PFR_TFLAG_PERSIST	| \
594df6ad731Slogwang 				 PFR_TFLAG_CONST	| \
595df6ad731Slogwang 				 PFR_TFLAG_ACTIVE	| \
596df6ad731Slogwang 				 PFR_TFLAG_INACTIVE	| \
597df6ad731Slogwang 				 PFR_TFLAG_REFERENCED	| \
598df6ad731Slogwang 				 PFR_TFLAG_REFDANCHOR	| \
599df6ad731Slogwang 				 PFR_TFLAG_COUNTERS)
600df6ad731Slogwang 
601*d4a07e70Sfengbojiang struct pf_kanchor_stackframe;
602df6ad731Slogwang 
603df6ad731Slogwang struct pfr_table {
604df6ad731Slogwang 	char			 pfrt_anchor[MAXPATHLEN];
605df6ad731Slogwang 	char			 pfrt_name[PF_TABLE_NAME_SIZE];
606df6ad731Slogwang 	u_int32_t		 pfrt_flags;
607df6ad731Slogwang 	u_int8_t		 pfrt_fback;
608df6ad731Slogwang };
609df6ad731Slogwang 
610df6ad731Slogwang enum { PFR_FB_NONE, PFR_FB_MATCH, PFR_FB_ADDED, PFR_FB_DELETED,
611df6ad731Slogwang 	PFR_FB_CHANGED, PFR_FB_CLEARED, PFR_FB_DUPLICATE,
612df6ad731Slogwang 	PFR_FB_NOTMATCH, PFR_FB_CONFLICT, PFR_FB_NOCOUNT, PFR_FB_MAX };
613df6ad731Slogwang 
614df6ad731Slogwang struct pfr_addr {
615df6ad731Slogwang 	union {
616df6ad731Slogwang 		struct in_addr	 _pfra_ip4addr;
617df6ad731Slogwang 		struct in6_addr	 _pfra_ip6addr;
618df6ad731Slogwang 	}		 pfra_u;
619df6ad731Slogwang 	u_int8_t	 pfra_af;
620df6ad731Slogwang 	u_int8_t	 pfra_net;
621df6ad731Slogwang 	u_int8_t	 pfra_not;
622df6ad731Slogwang 	u_int8_t	 pfra_fback;
623df6ad731Slogwang };
624df6ad731Slogwang #define	pfra_ip4addr	pfra_u._pfra_ip4addr
625df6ad731Slogwang #define	pfra_ip6addr	pfra_u._pfra_ip6addr
626df6ad731Slogwang 
627df6ad731Slogwang enum { PFR_DIR_IN, PFR_DIR_OUT, PFR_DIR_MAX };
628df6ad731Slogwang enum { PFR_OP_BLOCK, PFR_OP_PASS, PFR_OP_ADDR_MAX, PFR_OP_TABLE_MAX };
629*d4a07e70Sfengbojiang enum { PFR_TYPE_PACKETS, PFR_TYPE_BYTES, PFR_TYPE_MAX };
630*d4a07e70Sfengbojiang #define	PFR_NUM_COUNTERS	(PFR_DIR_MAX * PFR_OP_ADDR_MAX * PFR_TYPE_MAX)
631df6ad731Slogwang #define PFR_OP_XPASS	PFR_OP_ADDR_MAX
632df6ad731Slogwang 
633df6ad731Slogwang struct pfr_astats {
634df6ad731Slogwang 	struct pfr_addr	 pfras_a;
635df6ad731Slogwang 	u_int64_t	 pfras_packets[PFR_DIR_MAX][PFR_OP_ADDR_MAX];
636df6ad731Slogwang 	u_int64_t	 pfras_bytes[PFR_DIR_MAX][PFR_OP_ADDR_MAX];
637df6ad731Slogwang 	long		 pfras_tzero;
638df6ad731Slogwang };
639df6ad731Slogwang 
640df6ad731Slogwang enum { PFR_REFCNT_RULE, PFR_REFCNT_ANCHOR, PFR_REFCNT_MAX };
641df6ad731Slogwang 
642df6ad731Slogwang struct pfr_tstats {
643df6ad731Slogwang 	struct pfr_table pfrts_t;
644df6ad731Slogwang 	u_int64_t	 pfrts_packets[PFR_DIR_MAX][PFR_OP_TABLE_MAX];
645df6ad731Slogwang 	u_int64_t	 pfrts_bytes[PFR_DIR_MAX][PFR_OP_TABLE_MAX];
646df6ad731Slogwang 	u_int64_t	 pfrts_match;
647df6ad731Slogwang 	u_int64_t	 pfrts_nomatch;
648df6ad731Slogwang 	long		 pfrts_tzero;
649df6ad731Slogwang 	int		 pfrts_cnt;
650df6ad731Slogwang 	int		 pfrts_refcnt[PFR_REFCNT_MAX];
651df6ad731Slogwang };
652*d4a07e70Sfengbojiang 
653*d4a07e70Sfengbojiang struct pfr_ktstats {
654*d4a07e70Sfengbojiang 	struct pfr_table pfrts_t;
655*d4a07e70Sfengbojiang 	counter_u64_t	 pfrkts_packets[PFR_DIR_MAX][PFR_OP_TABLE_MAX];
656*d4a07e70Sfengbojiang 	counter_u64_t	 pfrkts_bytes[PFR_DIR_MAX][PFR_OP_TABLE_MAX];
657*d4a07e70Sfengbojiang 	counter_u64_t	 pfrkts_match;
658*d4a07e70Sfengbojiang 	counter_u64_t	 pfrkts_nomatch;
659*d4a07e70Sfengbojiang 	long		 pfrkts_tzero;
660*d4a07e70Sfengbojiang 	int		 pfrkts_cnt;
661*d4a07e70Sfengbojiang 	int		 pfrkts_refcnt[PFR_REFCNT_MAX];
662*d4a07e70Sfengbojiang };
663df6ad731Slogwang #define	pfrts_name	pfrts_t.pfrt_name
664df6ad731Slogwang #define pfrts_flags	pfrts_t.pfrt_flags
665df6ad731Slogwang 
666df6ad731Slogwang #ifndef _SOCKADDR_UNION_DEFINED
667df6ad731Slogwang #define	_SOCKADDR_UNION_DEFINED
668df6ad731Slogwang union sockaddr_union {
669df6ad731Slogwang 	struct sockaddr		sa;
670df6ad731Slogwang 	struct sockaddr_in	sin;
671df6ad731Slogwang 	struct sockaddr_in6	sin6;
672df6ad731Slogwang };
673df6ad731Slogwang #endif /* _SOCKADDR_UNION_DEFINED */
674df6ad731Slogwang 
675df6ad731Slogwang struct pfr_kcounters {
676*d4a07e70Sfengbojiang 	counter_u64_t		 pfrkc_counters;
677*d4a07e70Sfengbojiang 	long			 pfrkc_tzero;
678df6ad731Slogwang };
679*d4a07e70Sfengbojiang #define	pfr_kentry_counter(kc, dir, op, t)		\
680*d4a07e70Sfengbojiang 	((kc)->pfrkc_counters +				\
681*d4a07e70Sfengbojiang 	    (dir) * PFR_OP_ADDR_MAX * PFR_TYPE_MAX + (op) * PFR_TYPE_MAX + (t))
682df6ad731Slogwang 
683*d4a07e70Sfengbojiang #ifdef _KERNEL
684df6ad731Slogwang SLIST_HEAD(pfr_kentryworkq, pfr_kentry);
685df6ad731Slogwang struct pfr_kentry {
686df6ad731Slogwang 	struct radix_node	 pfrke_node[2];
687df6ad731Slogwang 	union sockaddr_union	 pfrke_sa;
688df6ad731Slogwang 	SLIST_ENTRY(pfr_kentry)	 pfrke_workq;
689*d4a07e70Sfengbojiang 	struct pfr_kcounters	 pfrke_counters;
690df6ad731Slogwang 	u_int8_t		 pfrke_af;
691df6ad731Slogwang 	u_int8_t		 pfrke_net;
692df6ad731Slogwang 	u_int8_t		 pfrke_not;
693df6ad731Slogwang 	u_int8_t		 pfrke_mark;
694df6ad731Slogwang };
695df6ad731Slogwang 
696df6ad731Slogwang SLIST_HEAD(pfr_ktableworkq, pfr_ktable);
697df6ad731Slogwang RB_HEAD(pfr_ktablehead, pfr_ktable);
698df6ad731Slogwang struct pfr_ktable {
699*d4a07e70Sfengbojiang 	struct pfr_ktstats	 pfrkt_kts;
700df6ad731Slogwang 	RB_ENTRY(pfr_ktable)	 pfrkt_tree;
701df6ad731Slogwang 	SLIST_ENTRY(pfr_ktable)	 pfrkt_workq;
702df6ad731Slogwang 	struct radix_node_head	*pfrkt_ip4;
703df6ad731Slogwang 	struct radix_node_head	*pfrkt_ip6;
704df6ad731Slogwang 	struct pfr_ktable	*pfrkt_shadow;
705df6ad731Slogwang 	struct pfr_ktable	*pfrkt_root;
706*d4a07e70Sfengbojiang 	struct pf_kruleset	*pfrkt_rs;
707df6ad731Slogwang 	long			 pfrkt_larg;
708df6ad731Slogwang 	int			 pfrkt_nflags;
709df6ad731Slogwang };
710*d4a07e70Sfengbojiang #define pfrkt_t		pfrkt_kts.pfrts_t
711df6ad731Slogwang #define pfrkt_name	pfrkt_t.pfrt_name
712df6ad731Slogwang #define pfrkt_anchor	pfrkt_t.pfrt_anchor
713df6ad731Slogwang #define pfrkt_ruleset	pfrkt_t.pfrt_ruleset
714df6ad731Slogwang #define pfrkt_flags	pfrkt_t.pfrt_flags
715*d4a07e70Sfengbojiang #define pfrkt_cnt	pfrkt_kts.pfrkts_cnt
716*d4a07e70Sfengbojiang #define pfrkt_refcnt	pfrkt_kts.pfrkts_refcnt
717*d4a07e70Sfengbojiang #define pfrkt_packets	pfrkt_kts.pfrkts_packets
718*d4a07e70Sfengbojiang #define pfrkt_bytes	pfrkt_kts.pfrkts_bytes
719*d4a07e70Sfengbojiang #define pfrkt_match	pfrkt_kts.pfrkts_match
720*d4a07e70Sfengbojiang #define pfrkt_nomatch	pfrkt_kts.pfrkts_nomatch
721*d4a07e70Sfengbojiang #define pfrkt_tzero	pfrkt_kts.pfrkts_tzero
722*d4a07e70Sfengbojiang #endif
723df6ad731Slogwang 
724*d4a07e70Sfengbojiang #ifdef _KERNEL
725*d4a07e70Sfengbojiang struct pfi_kkif {
726df6ad731Slogwang 	char				 pfik_name[IFNAMSIZ];
727df6ad731Slogwang 	union {
728*d4a07e70Sfengbojiang 		RB_ENTRY(pfi_kkif)	 _pfik_tree;
729*d4a07e70Sfengbojiang 		LIST_ENTRY(pfi_kkif)	 _pfik_list;
730df6ad731Slogwang 	} _pfik_glue;
731df6ad731Slogwang #define	pfik_tree	_pfik_glue._pfik_tree
732df6ad731Slogwang #define	pfik_list	_pfik_glue._pfik_list
733*d4a07e70Sfengbojiang 	counter_u64_t			 pfik_packets[2][2][2];
734*d4a07e70Sfengbojiang 	counter_u64_t			 pfik_bytes[2][2][2];
735df6ad731Slogwang 	u_int32_t			 pfik_tzero;
736df6ad731Slogwang 	u_int				 pfik_flags;
737df6ad731Slogwang 	struct ifnet			*pfik_ifp;
738df6ad731Slogwang 	struct ifg_group		*pfik_group;
739df6ad731Slogwang 	u_int				 pfik_rulerefs;
740df6ad731Slogwang 	TAILQ_HEAD(, pfi_dynaddr)	 pfik_dynaddrs;
741df6ad731Slogwang };
742*d4a07e70Sfengbojiang #endif
743df6ad731Slogwang 
744df6ad731Slogwang #define	PFI_IFLAG_REFS		0x0001	/* has state references */
745df6ad731Slogwang #define PFI_IFLAG_SKIP		0x0100	/* skip filtering on interface */
746df6ad731Slogwang 
747df6ad731Slogwang struct pf_pdesc {
748df6ad731Slogwang 	struct {
749df6ad731Slogwang 		int	 done;
750df6ad731Slogwang 		uid_t	 uid;
751df6ad731Slogwang 		gid_t	 gid;
752df6ad731Slogwang 	}		 lookup;
753df6ad731Slogwang 	u_int64_t	 tot_len;	/* Make Mickey money */
754df6ad731Slogwang 	union {
755df6ad731Slogwang 		struct tcphdr		*tcp;
756df6ad731Slogwang 		struct udphdr		*udp;
757df6ad731Slogwang 		struct icmp		*icmp;
758df6ad731Slogwang #ifdef INET6
759df6ad731Slogwang 		struct icmp6_hdr	*icmp6;
760df6ad731Slogwang #endif /* INET6 */
761df6ad731Slogwang 		void			*any;
762df6ad731Slogwang 	} hdr;
763df6ad731Slogwang 
764*d4a07e70Sfengbojiang 	struct pf_krule	*nat_rule;	/* nat/rdr rule applied to packet */
765df6ad731Slogwang 	struct pf_addr	*src;		/* src address */
766df6ad731Slogwang 	struct pf_addr	*dst;		/* dst address */
767df6ad731Slogwang 	u_int16_t *sport;
768df6ad731Slogwang 	u_int16_t *dport;
769df6ad731Slogwang 	struct pf_mtag	*pf_mtag;
770df6ad731Slogwang 
771df6ad731Slogwang 	u_int32_t	 p_len;		/* total length of payload */
772df6ad731Slogwang 
773df6ad731Slogwang 	u_int16_t	*ip_sum;
774df6ad731Slogwang 	u_int16_t	*proto_sum;
775df6ad731Slogwang 	u_int16_t	 flags;		/* Let SCRUB trigger behavior in
776df6ad731Slogwang 					 * state code. Easier than tags */
777df6ad731Slogwang #define PFDESC_TCP_NORM	0x0001		/* TCP shall be statefully scrubbed */
778df6ad731Slogwang #define PFDESC_IP_REAS	0x0002		/* IP frags would've been reassembled */
779df6ad731Slogwang 	sa_family_t	 af;
780df6ad731Slogwang 	u_int8_t	 proto;
781df6ad731Slogwang 	u_int8_t	 tos;
782df6ad731Slogwang 	u_int8_t	 dir;		/* direction */
783df6ad731Slogwang 	u_int8_t	 sidx;		/* key index for source */
784df6ad731Slogwang 	u_int8_t	 didx;		/* key index for destination */
785df6ad731Slogwang };
786df6ad731Slogwang 
787df6ad731Slogwang /* flags for RDR options */
788df6ad731Slogwang #define PF_DPORT_RANGE	0x01		/* Dest port uses range */
789df6ad731Slogwang #define PF_RPORT_RANGE	0x02		/* RDR'ed port uses range */
790df6ad731Slogwang 
791df6ad731Slogwang /* UDP state enumeration */
792df6ad731Slogwang #define PFUDPS_NO_TRAFFIC	0
793df6ad731Slogwang #define PFUDPS_SINGLE		1
794df6ad731Slogwang #define PFUDPS_MULTIPLE		2
795df6ad731Slogwang 
796df6ad731Slogwang #define PFUDPS_NSTATES		3	/* number of state levels */
797df6ad731Slogwang 
798df6ad731Slogwang #define PFUDPS_NAMES { \
799df6ad731Slogwang 	"NO_TRAFFIC", \
800df6ad731Slogwang 	"SINGLE", \
801df6ad731Slogwang 	"MULTIPLE", \
802df6ad731Slogwang 	NULL \
803df6ad731Slogwang }
804df6ad731Slogwang 
805df6ad731Slogwang /* Other protocol state enumeration */
806df6ad731Slogwang #define PFOTHERS_NO_TRAFFIC	0
807df6ad731Slogwang #define PFOTHERS_SINGLE		1
808df6ad731Slogwang #define PFOTHERS_MULTIPLE	2
809df6ad731Slogwang 
810df6ad731Slogwang #define PFOTHERS_NSTATES	3	/* number of state levels */
811df6ad731Slogwang 
812df6ad731Slogwang #define PFOTHERS_NAMES { \
813df6ad731Slogwang 	"NO_TRAFFIC", \
814df6ad731Slogwang 	"SINGLE", \
815df6ad731Slogwang 	"MULTIPLE", \
816df6ad731Slogwang 	NULL \
817df6ad731Slogwang }
818df6ad731Slogwang 
819df6ad731Slogwang #define ACTION_SET(a, x) \
820df6ad731Slogwang 	do { \
821df6ad731Slogwang 		if ((a) != NULL) \
822df6ad731Slogwang 			*(a) = (x); \
823df6ad731Slogwang 	} while (0)
824df6ad731Slogwang 
825df6ad731Slogwang #define REASON_SET(a, x) \
826df6ad731Slogwang 	do { \
827df6ad731Slogwang 		if ((a) != NULL) \
828df6ad731Slogwang 			*(a) = (x); \
829df6ad731Slogwang 		if (x < PFRES_MAX) \
830df6ad731Slogwang 			counter_u64_add(V_pf_status.counters[x], 1); \
831df6ad731Slogwang 	} while (0)
832df6ad731Slogwang 
833df6ad731Slogwang struct pf_kstatus {
834df6ad731Slogwang 	counter_u64_t	counters[PFRES_MAX]; /* reason for passing/dropping */
835df6ad731Slogwang 	counter_u64_t	lcounters[LCNT_MAX]; /* limit counters */
836df6ad731Slogwang 	counter_u64_t	fcounters[FCNT_MAX]; /* state operation counters */
837df6ad731Slogwang 	counter_u64_t	scounters[SCNT_MAX]; /* src_node operation counters */
838df6ad731Slogwang 	uint32_t	states;
839df6ad731Slogwang 	uint32_t	src_nodes;
840df6ad731Slogwang 	uint32_t	running;
841df6ad731Slogwang 	uint32_t	since;
842df6ad731Slogwang 	uint32_t	debug;
843df6ad731Slogwang 	uint32_t	hostid;
844df6ad731Slogwang 	char		ifname[IFNAMSIZ];
845df6ad731Slogwang 	uint8_t		pf_chksum[PF_MD5_DIGEST_LENGTH];
846df6ad731Slogwang };
847df6ad731Slogwang 
848df6ad731Slogwang struct pf_divert {
849df6ad731Slogwang 	union {
850df6ad731Slogwang 		struct in_addr	ipv4;
851df6ad731Slogwang 		struct in6_addr	ipv6;
852df6ad731Slogwang 	}		addr;
853df6ad731Slogwang 	u_int16_t	port;
854df6ad731Slogwang };
855df6ad731Slogwang 
856df6ad731Slogwang #define PFFRAG_FRENT_HIWAT	5000	/* Number of fragment entries */
857df6ad731Slogwang #define PFR_KENTRY_HIWAT	200000	/* Number of table entries */
858df6ad731Slogwang 
859df6ad731Slogwang /*
860*d4a07e70Sfengbojiang  * Limit the length of the fragment queue traversal.  Remember
861*d4a07e70Sfengbojiang  * search entry points based on the fragment offset.
862*d4a07e70Sfengbojiang  */
863*d4a07e70Sfengbojiang #define PF_FRAG_ENTRY_POINTS		16
864*d4a07e70Sfengbojiang 
865*d4a07e70Sfengbojiang /*
866*d4a07e70Sfengbojiang  * The number of entries in the fragment queue must be limited
867*d4a07e70Sfengbojiang  * to avoid DoS by linear seaching.  Instead of a global limit,
868*d4a07e70Sfengbojiang  * use a limit per entry point.  For large packets these sum up.
869*d4a07e70Sfengbojiang  */
870*d4a07e70Sfengbojiang #define PF_FRAG_ENTRY_LIMIT		64
871*d4a07e70Sfengbojiang 
872*d4a07e70Sfengbojiang /*
873df6ad731Slogwang  * ioctl parameter structures
874df6ad731Slogwang  */
875df6ad731Slogwang 
876df6ad731Slogwang struct pfioc_pooladdr {
877df6ad731Slogwang 	u_int32_t		 action;
878df6ad731Slogwang 	u_int32_t		 ticket;
879df6ad731Slogwang 	u_int32_t		 nr;
880df6ad731Slogwang 	u_int32_t		 r_num;
881df6ad731Slogwang 	u_int8_t		 r_action;
882df6ad731Slogwang 	u_int8_t		 r_last;
883df6ad731Slogwang 	u_int8_t		 af;
884df6ad731Slogwang 	char			 anchor[MAXPATHLEN];
885df6ad731Slogwang 	struct pf_pooladdr	 addr;
886df6ad731Slogwang };
887df6ad731Slogwang 
888df6ad731Slogwang struct pfioc_rule {
889df6ad731Slogwang 	u_int32_t	 action;
890df6ad731Slogwang 	u_int32_t	 ticket;
891df6ad731Slogwang 	u_int32_t	 pool_ticket;
892df6ad731Slogwang 	u_int32_t	 nr;
893df6ad731Slogwang 	char		 anchor[MAXPATHLEN];
894df6ad731Slogwang 	char		 anchor_call[MAXPATHLEN];
895df6ad731Slogwang 	struct pf_rule	 rule;
896df6ad731Slogwang };
897df6ad731Slogwang 
898df6ad731Slogwang struct pfioc_natlook {
899df6ad731Slogwang 	struct pf_addr	 saddr;
900df6ad731Slogwang 	struct pf_addr	 daddr;
901df6ad731Slogwang 	struct pf_addr	 rsaddr;
902df6ad731Slogwang 	struct pf_addr	 rdaddr;
903df6ad731Slogwang 	u_int16_t	 sport;
904df6ad731Slogwang 	u_int16_t	 dport;
905df6ad731Slogwang 	u_int16_t	 rsport;
906df6ad731Slogwang 	u_int16_t	 rdport;
907df6ad731Slogwang 	sa_family_t	 af;
908df6ad731Slogwang 	u_int8_t	 proto;
909df6ad731Slogwang 	u_int8_t	 direction;
910df6ad731Slogwang };
911df6ad731Slogwang 
912df6ad731Slogwang struct pfioc_state {
913df6ad731Slogwang 	struct pfsync_state	state;
914df6ad731Slogwang };
915df6ad731Slogwang 
916df6ad731Slogwang struct pfioc_src_node_kill {
917df6ad731Slogwang 	sa_family_t psnk_af;
918df6ad731Slogwang 	struct pf_rule_addr psnk_src;
919df6ad731Slogwang 	struct pf_rule_addr psnk_dst;
920df6ad731Slogwang 	u_int		    psnk_killed;
921df6ad731Slogwang };
922df6ad731Slogwang 
923df6ad731Slogwang struct pfioc_state_kill {
924df6ad731Slogwang 	struct pf_state_cmp	psk_pfcmp;
925df6ad731Slogwang 	sa_family_t		psk_af;
926df6ad731Slogwang 	int			psk_proto;
927df6ad731Slogwang 	struct pf_rule_addr	psk_src;
928df6ad731Slogwang 	struct pf_rule_addr	psk_dst;
929df6ad731Slogwang 	char			psk_ifname[IFNAMSIZ];
930df6ad731Slogwang 	char			psk_label[PF_RULE_LABEL_SIZE];
931df6ad731Slogwang 	u_int			psk_killed;
932df6ad731Slogwang };
933df6ad731Slogwang 
934df6ad731Slogwang struct pfioc_states {
935df6ad731Slogwang 	int	ps_len;
936df6ad731Slogwang 	union {
937df6ad731Slogwang 		caddr_t			 psu_buf;
938df6ad731Slogwang 		struct pfsync_state	*psu_states;
939df6ad731Slogwang 	} ps_u;
940df6ad731Slogwang #define ps_buf		ps_u.psu_buf
941df6ad731Slogwang #define ps_states	ps_u.psu_states
942df6ad731Slogwang };
943df6ad731Slogwang 
944df6ad731Slogwang struct pfioc_src_nodes {
945df6ad731Slogwang 	int	psn_len;
946df6ad731Slogwang 	union {
947df6ad731Slogwang 		caddr_t		 psu_buf;
948df6ad731Slogwang 		struct pf_src_node	*psu_src_nodes;
949df6ad731Slogwang 	} psn_u;
950df6ad731Slogwang #define psn_buf		psn_u.psu_buf
951df6ad731Slogwang #define psn_src_nodes	psn_u.psu_src_nodes
952df6ad731Slogwang };
953df6ad731Slogwang 
954df6ad731Slogwang struct pfioc_if {
955df6ad731Slogwang 	char		 ifname[IFNAMSIZ];
956df6ad731Slogwang };
957df6ad731Slogwang 
958df6ad731Slogwang struct pfioc_tm {
959df6ad731Slogwang 	int		 timeout;
960df6ad731Slogwang 	int		 seconds;
961df6ad731Slogwang };
962df6ad731Slogwang 
963df6ad731Slogwang struct pfioc_limit {
964df6ad731Slogwang 	int		 index;
965df6ad731Slogwang 	unsigned	 limit;
966df6ad731Slogwang };
967df6ad731Slogwang 
968*d4a07e70Sfengbojiang struct pfioc_altq_v0 {
969df6ad731Slogwang 	u_int32_t	 action;
970df6ad731Slogwang 	u_int32_t	 ticket;
971df6ad731Slogwang 	u_int32_t	 nr;
972*d4a07e70Sfengbojiang 	struct pf_altq_v0 altq;
973df6ad731Slogwang };
974df6ad731Slogwang 
975*d4a07e70Sfengbojiang struct pfioc_altq_v1 {
976*d4a07e70Sfengbojiang 	u_int32_t	 action;
977*d4a07e70Sfengbojiang 	u_int32_t	 ticket;
978*d4a07e70Sfengbojiang 	u_int32_t	 nr;
979*d4a07e70Sfengbojiang 	/*
980*d4a07e70Sfengbojiang 	 * Placed here so code that only uses the above parameters can be
981*d4a07e70Sfengbojiang 	 * written entirely in terms of the v0 or v1 type.
982*d4a07e70Sfengbojiang 	 */
983*d4a07e70Sfengbojiang 	u_int32_t	 version;
984*d4a07e70Sfengbojiang 	struct pf_altq_v1 altq;
985*d4a07e70Sfengbojiang };
986*d4a07e70Sfengbojiang 
987*d4a07e70Sfengbojiang /*
988*d4a07e70Sfengbojiang  * Latest version of struct pfioc_altq_vX.  This must move in lock-step with
989*d4a07e70Sfengbojiang  * the latest version of struct pf_altq_vX as it has that struct as a
990*d4a07e70Sfengbojiang  * member.
991*d4a07e70Sfengbojiang  */
992*d4a07e70Sfengbojiang #define PFIOC_ALTQ_VERSION	PF_ALTQ_VERSION
993*d4a07e70Sfengbojiang 
994*d4a07e70Sfengbojiang struct pfioc_qstats_v0 {
995df6ad731Slogwang 	u_int32_t	 ticket;
996df6ad731Slogwang 	u_int32_t	 nr;
997df6ad731Slogwang 	void		*buf;
998df6ad731Slogwang 	int		 nbytes;
999df6ad731Slogwang 	u_int8_t	 scheduler;
1000df6ad731Slogwang };
1001df6ad731Slogwang 
1002*d4a07e70Sfengbojiang struct pfioc_qstats_v1 {
1003*d4a07e70Sfengbojiang 	u_int32_t	 ticket;
1004*d4a07e70Sfengbojiang 	u_int32_t	 nr;
1005*d4a07e70Sfengbojiang 	void		*buf;
1006*d4a07e70Sfengbojiang 	int		 nbytes;
1007*d4a07e70Sfengbojiang 	u_int8_t	 scheduler;
1008*d4a07e70Sfengbojiang 	/*
1009*d4a07e70Sfengbojiang 	 * Placed here so code that only uses the above parameters can be
1010*d4a07e70Sfengbojiang 	 * written entirely in terms of the v0 or v1 type.
1011*d4a07e70Sfengbojiang 	 */
1012*d4a07e70Sfengbojiang 	u_int32_t	 version;  /* Requested version of stats struct */
1013*d4a07e70Sfengbojiang };
1014*d4a07e70Sfengbojiang 
1015*d4a07e70Sfengbojiang /* Latest version of struct pfioc_qstats_vX */
1016*d4a07e70Sfengbojiang #define PFIOC_QSTATS_VERSION	1
1017*d4a07e70Sfengbojiang 
1018df6ad731Slogwang struct pfioc_ruleset {
1019df6ad731Slogwang 	u_int32_t	 nr;
1020df6ad731Slogwang 	char		 path[MAXPATHLEN];
1021df6ad731Slogwang 	char		 name[PF_ANCHOR_NAME_SIZE];
1022df6ad731Slogwang };
1023df6ad731Slogwang 
1024df6ad731Slogwang #define PF_RULESET_ALTQ		(PF_RULESET_MAX)
1025df6ad731Slogwang #define PF_RULESET_TABLE	(PF_RULESET_MAX+1)
1026df6ad731Slogwang struct pfioc_trans {
1027df6ad731Slogwang 	int		 size;	/* number of elements */
1028df6ad731Slogwang 	int		 esize; /* size of each element in bytes */
1029df6ad731Slogwang 	struct pfioc_trans_e {
1030df6ad731Slogwang 		int		rs_num;
1031df6ad731Slogwang 		char		anchor[MAXPATHLEN];
1032df6ad731Slogwang 		u_int32_t	ticket;
1033df6ad731Slogwang 	}		*array;
1034df6ad731Slogwang };
1035df6ad731Slogwang 
1036df6ad731Slogwang #define PFR_FLAG_ATOMIC		0x00000001	/* unused */
1037df6ad731Slogwang #define PFR_FLAG_DUMMY		0x00000002
1038df6ad731Slogwang #define PFR_FLAG_FEEDBACK	0x00000004
1039df6ad731Slogwang #define PFR_FLAG_CLSTATS	0x00000008
1040df6ad731Slogwang #define PFR_FLAG_ADDRSTOO	0x00000010
1041df6ad731Slogwang #define PFR_FLAG_REPLACE	0x00000020
1042df6ad731Slogwang #define PFR_FLAG_ALLRSETS	0x00000040
1043df6ad731Slogwang #define PFR_FLAG_ALLMASK	0x0000007F
1044df6ad731Slogwang 
1045df6ad731Slogwang struct pfioc_table {
1046df6ad731Slogwang 	struct pfr_table	 pfrio_table;
1047df6ad731Slogwang 	void			*pfrio_buffer;
1048df6ad731Slogwang 	int			 pfrio_esize;
1049df6ad731Slogwang 	int			 pfrio_size;
1050df6ad731Slogwang 	int			 pfrio_size2;
1051df6ad731Slogwang 	int			 pfrio_nadd;
1052df6ad731Slogwang 	int			 pfrio_ndel;
1053df6ad731Slogwang 	int			 pfrio_nchange;
1054df6ad731Slogwang 	int			 pfrio_flags;
1055df6ad731Slogwang 	u_int32_t		 pfrio_ticket;
1056df6ad731Slogwang };
1057df6ad731Slogwang #define	pfrio_exists	pfrio_nadd
1058df6ad731Slogwang #define	pfrio_nzero	pfrio_nadd
1059df6ad731Slogwang #define	pfrio_nmatch	pfrio_nadd
1060df6ad731Slogwang #define pfrio_naddr	pfrio_size2
1061df6ad731Slogwang #define pfrio_setflag	pfrio_size2
1062df6ad731Slogwang #define pfrio_clrflag	pfrio_nadd
1063df6ad731Slogwang 
1064df6ad731Slogwang struct pfioc_iface {
1065df6ad731Slogwang 	char	 pfiio_name[IFNAMSIZ];
1066df6ad731Slogwang 	void	*pfiio_buffer;
1067df6ad731Slogwang 	int	 pfiio_esize;
1068df6ad731Slogwang 	int	 pfiio_size;
1069df6ad731Slogwang 	int	 pfiio_nzero;
1070df6ad731Slogwang 	int	 pfiio_flags;
1071df6ad731Slogwang };
1072df6ad731Slogwang 
1073df6ad731Slogwang /*
1074df6ad731Slogwang  * ioctl operations
1075df6ad731Slogwang  */
1076df6ad731Slogwang 
1077df6ad731Slogwang #define DIOCSTART	_IO  ('D',  1)
1078df6ad731Slogwang #define DIOCSTOP	_IO  ('D',  2)
1079df6ad731Slogwang #define DIOCADDRULE	_IOWR('D',  4, struct pfioc_rule)
1080df6ad731Slogwang #define DIOCGETRULES	_IOWR('D',  6, struct pfioc_rule)
1081df6ad731Slogwang #define DIOCGETRULE	_IOWR('D',  7, struct pfioc_rule)
1082df6ad731Slogwang /* XXX cut 8 - 17 */
1083df6ad731Slogwang #define DIOCCLRSTATES	_IOWR('D', 18, struct pfioc_state_kill)
1084df6ad731Slogwang #define DIOCGETSTATE	_IOWR('D', 19, struct pfioc_state)
1085df6ad731Slogwang #define DIOCSETSTATUSIF _IOWR('D', 20, struct pfioc_if)
1086df6ad731Slogwang #define DIOCGETSTATUS	_IOWR('D', 21, struct pf_status)
1087df6ad731Slogwang #define DIOCCLRSTATUS	_IO  ('D', 22)
1088df6ad731Slogwang #define DIOCNATLOOK	_IOWR('D', 23, struct pfioc_natlook)
1089df6ad731Slogwang #define DIOCSETDEBUG	_IOWR('D', 24, u_int32_t)
1090df6ad731Slogwang #define DIOCGETSTATES	_IOWR('D', 25, struct pfioc_states)
1091df6ad731Slogwang #define DIOCCHANGERULE	_IOWR('D', 26, struct pfioc_rule)
1092df6ad731Slogwang /* XXX cut 26 - 28 */
1093df6ad731Slogwang #define DIOCSETTIMEOUT	_IOWR('D', 29, struct pfioc_tm)
1094df6ad731Slogwang #define DIOCGETTIMEOUT	_IOWR('D', 30, struct pfioc_tm)
1095df6ad731Slogwang #define DIOCADDSTATE	_IOWR('D', 37, struct pfioc_state)
1096df6ad731Slogwang #define DIOCCLRRULECTRS	_IO  ('D', 38)
1097df6ad731Slogwang #define DIOCGETLIMIT	_IOWR('D', 39, struct pfioc_limit)
1098df6ad731Slogwang #define DIOCSETLIMIT	_IOWR('D', 40, struct pfioc_limit)
1099df6ad731Slogwang #define DIOCKILLSTATES	_IOWR('D', 41, struct pfioc_state_kill)
1100df6ad731Slogwang #define DIOCSTARTALTQ	_IO  ('D', 42)
1101df6ad731Slogwang #define DIOCSTOPALTQ	_IO  ('D', 43)
1102*d4a07e70Sfengbojiang #define DIOCADDALTQV0	_IOWR('D', 45, struct pfioc_altq_v0)
1103*d4a07e70Sfengbojiang #define DIOCADDALTQV1	_IOWR('D', 45, struct pfioc_altq_v1)
1104*d4a07e70Sfengbojiang #define DIOCGETALTQSV0	_IOWR('D', 47, struct pfioc_altq_v0)
1105*d4a07e70Sfengbojiang #define DIOCGETALTQSV1	_IOWR('D', 47, struct pfioc_altq_v1)
1106*d4a07e70Sfengbojiang #define DIOCGETALTQV0	_IOWR('D', 48, struct pfioc_altq_v0)
1107*d4a07e70Sfengbojiang #define DIOCGETALTQV1	_IOWR('D', 48, struct pfioc_altq_v1)
1108*d4a07e70Sfengbojiang #define DIOCCHANGEALTQV0 _IOWR('D', 49, struct pfioc_altq_v0)
1109*d4a07e70Sfengbojiang #define DIOCCHANGEALTQV1 _IOWR('D', 49, struct pfioc_altq_v1)
1110*d4a07e70Sfengbojiang #define DIOCGETQSTATSV0	_IOWR('D', 50, struct pfioc_qstats_v0)
1111*d4a07e70Sfengbojiang #define DIOCGETQSTATSV1	_IOWR('D', 50, struct pfioc_qstats_v1)
1112df6ad731Slogwang #define DIOCBEGINADDRS	_IOWR('D', 51, struct pfioc_pooladdr)
1113df6ad731Slogwang #define DIOCADDADDR	_IOWR('D', 52, struct pfioc_pooladdr)
1114df6ad731Slogwang #define DIOCGETADDRS	_IOWR('D', 53, struct pfioc_pooladdr)
1115df6ad731Slogwang #define DIOCGETADDR	_IOWR('D', 54, struct pfioc_pooladdr)
1116df6ad731Slogwang #define DIOCCHANGEADDR	_IOWR('D', 55, struct pfioc_pooladdr)
1117df6ad731Slogwang /* XXX cut 55 - 57 */
1118df6ad731Slogwang #define	DIOCGETRULESETS	_IOWR('D', 58, struct pfioc_ruleset)
1119df6ad731Slogwang #define	DIOCGETRULESET	_IOWR('D', 59, struct pfioc_ruleset)
1120df6ad731Slogwang #define	DIOCRCLRTABLES	_IOWR('D', 60, struct pfioc_table)
1121df6ad731Slogwang #define	DIOCRADDTABLES	_IOWR('D', 61, struct pfioc_table)
1122df6ad731Slogwang #define	DIOCRDELTABLES	_IOWR('D', 62, struct pfioc_table)
1123df6ad731Slogwang #define	DIOCRGETTABLES	_IOWR('D', 63, struct pfioc_table)
1124df6ad731Slogwang #define	DIOCRGETTSTATS	_IOWR('D', 64, struct pfioc_table)
1125df6ad731Slogwang #define DIOCRCLRTSTATS	_IOWR('D', 65, struct pfioc_table)
1126df6ad731Slogwang #define	DIOCRCLRADDRS	_IOWR('D', 66, struct pfioc_table)
1127df6ad731Slogwang #define	DIOCRADDADDRS	_IOWR('D', 67, struct pfioc_table)
1128df6ad731Slogwang #define	DIOCRDELADDRS	_IOWR('D', 68, struct pfioc_table)
1129df6ad731Slogwang #define	DIOCRSETADDRS	_IOWR('D', 69, struct pfioc_table)
1130df6ad731Slogwang #define	DIOCRGETADDRS	_IOWR('D', 70, struct pfioc_table)
1131df6ad731Slogwang #define	DIOCRGETASTATS	_IOWR('D', 71, struct pfioc_table)
1132df6ad731Slogwang #define	DIOCRCLRASTATS	_IOWR('D', 72, struct pfioc_table)
1133df6ad731Slogwang #define	DIOCRTSTADDRS	_IOWR('D', 73, struct pfioc_table)
1134df6ad731Slogwang #define	DIOCRSETTFLAGS	_IOWR('D', 74, struct pfioc_table)
1135df6ad731Slogwang #define	DIOCRINADEFINE	_IOWR('D', 77, struct pfioc_table)
1136df6ad731Slogwang #define	DIOCOSFPFLUSH	_IO('D', 78)
1137df6ad731Slogwang #define	DIOCOSFPADD	_IOWR('D', 79, struct pf_osfp_ioctl)
1138df6ad731Slogwang #define	DIOCOSFPGET	_IOWR('D', 80, struct pf_osfp_ioctl)
1139df6ad731Slogwang #define	DIOCXBEGIN	_IOWR('D', 81, struct pfioc_trans)
1140df6ad731Slogwang #define	DIOCXCOMMIT	_IOWR('D', 82, struct pfioc_trans)
1141df6ad731Slogwang #define	DIOCXROLLBACK	_IOWR('D', 83, struct pfioc_trans)
1142df6ad731Slogwang #define	DIOCGETSRCNODES	_IOWR('D', 84, struct pfioc_src_nodes)
1143df6ad731Slogwang #define	DIOCCLRSRCNODES	_IO('D', 85)
1144df6ad731Slogwang #define	DIOCSETHOSTID	_IOWR('D', 86, u_int32_t)
1145df6ad731Slogwang #define	DIOCIGETIFACES	_IOWR('D', 87, struct pfioc_iface)
1146df6ad731Slogwang #define	DIOCSETIFFLAG	_IOWR('D', 89, struct pfioc_iface)
1147df6ad731Slogwang #define	DIOCCLRIFFLAG	_IOWR('D', 90, struct pfioc_iface)
1148df6ad731Slogwang #define	DIOCKILLSRCNODES	_IOWR('D', 91, struct pfioc_src_node_kill)
1149*d4a07e70Sfengbojiang struct pf_ifspeed_v0 {
1150df6ad731Slogwang 	char			ifname[IFNAMSIZ];
1151df6ad731Slogwang 	u_int32_t		baudrate;
1152df6ad731Slogwang };
1153*d4a07e70Sfengbojiang 
1154*d4a07e70Sfengbojiang struct pf_ifspeed_v1 {
1155*d4a07e70Sfengbojiang 	char			ifname[IFNAMSIZ];
1156*d4a07e70Sfengbojiang 	u_int32_t		baudrate32;
1157*d4a07e70Sfengbojiang 	/* layout identical to struct pf_ifspeed_v0 up to this point */
1158*d4a07e70Sfengbojiang 	u_int64_t		baudrate;
1159*d4a07e70Sfengbojiang };
1160*d4a07e70Sfengbojiang 
1161*d4a07e70Sfengbojiang /* Latest version of struct pf_ifspeed_vX */
1162*d4a07e70Sfengbojiang #define PF_IFSPEED_VERSION	1
1163*d4a07e70Sfengbojiang 
1164*d4a07e70Sfengbojiang #define	DIOCGIFSPEEDV0	_IOWR('D', 92, struct pf_ifspeed_v0)
1165*d4a07e70Sfengbojiang #define	DIOCGIFSPEEDV1	_IOWR('D', 92, struct pf_ifspeed_v1)
1166df6ad731Slogwang 
1167df6ad731Slogwang #endif /* _NET_PFVAR_H_ */
1168