xref: /freebsd/sys/net/pflow.h (revision f92d9b1aad73fc47f8f0b960808ca2c1a938e9e7)
1*f92d9b1aSKristof Provost /*	$OpenBSD: if_pflow.h,v 1.19 2022/11/23 15:12:27 mvs Exp $	*/
2*f92d9b1aSKristof Provost 
3*f92d9b1aSKristof Provost /*
4*f92d9b1aSKristof Provost  * Copyright (c) 2008 Henning Brauer <henning@openbsd.org>
5*f92d9b1aSKristof Provost  * Copyright (c) 2008 Joerg Goltermann <jg@osn.de>
6*f92d9b1aSKristof Provost  *
7*f92d9b1aSKristof Provost  * Permission to use, copy, modify, and distribute this software for any
8*f92d9b1aSKristof Provost  * purpose with or without fee is hereby granted, provided that the above
9*f92d9b1aSKristof Provost  * copyright notice and this permission notice appear in all copies.
10*f92d9b1aSKristof Provost  *
11*f92d9b1aSKristof Provost  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12*f92d9b1aSKristof Provost  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13*f92d9b1aSKristof Provost  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14*f92d9b1aSKristof Provost  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15*f92d9b1aSKristof Provost  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
16*f92d9b1aSKristof Provost  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
17*f92d9b1aSKristof Provost  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18*f92d9b1aSKristof Provost  */
19*f92d9b1aSKristof Provost 
20*f92d9b1aSKristof Provost #ifndef _NET_IF_PFLOW_H_
21*f92d9b1aSKristof Provost #define _NET_IF_PFLOW_H_
22*f92d9b1aSKristof Provost 
23*f92d9b1aSKristof Provost #include <sys/cdefs.h>
24*f92d9b1aSKristof Provost #include <sys/types.h>
25*f92d9b1aSKristof Provost #include <sys/socket.h>
26*f92d9b1aSKristof Provost 
27*f92d9b1aSKristof Provost #include <netinet/in.h>
28*f92d9b1aSKristof Provost 
29*f92d9b1aSKristof Provost #ifdef _KERNEL
30*f92d9b1aSKristof Provost #include <sys/param.h>
31*f92d9b1aSKristof Provost #include <sys/lock.h>
32*f92d9b1aSKristof Provost #include <sys/rmlock.h>
33*f92d9b1aSKristof Provost #include <sys/interrupt.h>
34*f92d9b1aSKristof Provost #include <net/if.h>
35*f92d9b1aSKristof Provost #include <net/if_var.h>
36*f92d9b1aSKristof Provost #include <net/if_private.h>
37*f92d9b1aSKristof Provost #include <net/pfvar.h>
38*f92d9b1aSKristof Provost 
39*f92d9b1aSKristof Provost #include <netinet/ip.h>
40*f92d9b1aSKristof Provost #endif
41*f92d9b1aSKristof Provost 
42*f92d9b1aSKristof Provost #define PFLOW_ID_LEN	sizeof(u_int64_t)
43*f92d9b1aSKristof Provost 
44*f92d9b1aSKristof Provost #define PFLOW_MAXFLOWS 30
45*f92d9b1aSKristof Provost #define PFLOW_ENGINE_TYPE 42
46*f92d9b1aSKristof Provost #define PFLOW_ENGINE_ID 42
47*f92d9b1aSKristof Provost #define PFLOW_MAXBYTES 0xffffffff
48*f92d9b1aSKristof Provost #define PFLOW_TIMEOUT 30
49*f92d9b1aSKristof Provost #define PFLOW_TMPL_TIMEOUT 30 /* rfc 5101 10.3.6 (p.40) recommends 600 */
50*f92d9b1aSKristof Provost 
51*f92d9b1aSKristof Provost #define PFLOW_IPFIX_TMPL_SET_ID 2
52*f92d9b1aSKristof Provost 
53*f92d9b1aSKristof Provost /* RFC 5102 Information Element Identifiers */
54*f92d9b1aSKristof Provost 
55*f92d9b1aSKristof Provost #define PFIX_IE_octetDeltaCount			  1
56*f92d9b1aSKristof Provost #define PFIX_IE_packetDeltaCount		  2
57*f92d9b1aSKristof Provost #define PFIX_IE_protocolIdentifier		  4
58*f92d9b1aSKristof Provost #define PFIX_IE_ipClassOfService		  5
59*f92d9b1aSKristof Provost #define PFIX_IE_sourceTransportPort		  7
60*f92d9b1aSKristof Provost #define PFIX_IE_sourceIPv4Address		  8
61*f92d9b1aSKristof Provost #define PFIX_IE_ingressInterface		 10
62*f92d9b1aSKristof Provost #define PFIX_IE_destinationTransportPort	 11
63*f92d9b1aSKristof Provost #define PFIX_IE_destinationIPv4Address		 12
64*f92d9b1aSKristof Provost #define PFIX_IE_egressInterface			 14
65*f92d9b1aSKristof Provost #define PFIX_IE_flowEndSysUpTime		 21
66*f92d9b1aSKristof Provost #define PFIX_IE_flowStartSysUpTime		 22
67*f92d9b1aSKristof Provost #define PFIX_IE_sourceIPv6Address		 27
68*f92d9b1aSKristof Provost #define PFIX_IE_destinationIPv6Address		 28
69*f92d9b1aSKristof Provost #define PFIX_IE_flowStartMilliseconds		152
70*f92d9b1aSKristof Provost #define PFIX_IE_flowEndMilliseconds		153
71*f92d9b1aSKristof Provost 
72*f92d9b1aSKristof Provost struct pflow_flow {
73*f92d9b1aSKristof Provost 	u_int32_t	src_ip;
74*f92d9b1aSKristof Provost 	u_int32_t	dest_ip;
75*f92d9b1aSKristof Provost 	u_int32_t	nexthop_ip;
76*f92d9b1aSKristof Provost 	u_int16_t	if_index_in;
77*f92d9b1aSKristof Provost 	u_int16_t	if_index_out;
78*f92d9b1aSKristof Provost 	u_int32_t	flow_packets;
79*f92d9b1aSKristof Provost 	u_int32_t	flow_octets;
80*f92d9b1aSKristof Provost 	u_int32_t	flow_start;
81*f92d9b1aSKristof Provost 	u_int32_t	flow_finish;
82*f92d9b1aSKristof Provost 	u_int16_t	src_port;
83*f92d9b1aSKristof Provost 	u_int16_t	dest_port;
84*f92d9b1aSKristof Provost 	u_int8_t	pad1;
85*f92d9b1aSKristof Provost 	u_int8_t	tcp_flags;
86*f92d9b1aSKristof Provost 	u_int8_t	protocol;
87*f92d9b1aSKristof Provost 	u_int8_t	tos;
88*f92d9b1aSKristof Provost 	u_int16_t	src_as;
89*f92d9b1aSKristof Provost 	u_int16_t	dest_as;
90*f92d9b1aSKristof Provost 	u_int8_t	src_mask;
91*f92d9b1aSKristof Provost 	u_int8_t	dest_mask;
92*f92d9b1aSKristof Provost 	u_int16_t	pad2;
93*f92d9b1aSKristof Provost } __packed;
94*f92d9b1aSKristof Provost 
95*f92d9b1aSKristof Provost struct pflow_set_header {
96*f92d9b1aSKristof Provost 	u_int16_t	set_id;
97*f92d9b1aSKristof Provost 	u_int16_t	set_length; /* total length of the set,
98*f92d9b1aSKristof Provost 				       in octets, including the set header */
99*f92d9b1aSKristof Provost } __packed;
100*f92d9b1aSKristof Provost 
101*f92d9b1aSKristof Provost #define PFLOW_SET_HDRLEN sizeof(struct pflow_set_header)
102*f92d9b1aSKristof Provost 
103*f92d9b1aSKristof Provost struct pflow_tmpl_hdr {
104*f92d9b1aSKristof Provost 	u_int16_t	tmpl_id;
105*f92d9b1aSKristof Provost 	u_int16_t	field_count;
106*f92d9b1aSKristof Provost } __packed;
107*f92d9b1aSKristof Provost 
108*f92d9b1aSKristof Provost struct pflow_tmpl_fspec {
109*f92d9b1aSKristof Provost 	u_int16_t	field_id;
110*f92d9b1aSKristof Provost 	u_int16_t	len;
111*f92d9b1aSKristof Provost } __packed;
112*f92d9b1aSKristof Provost 
113*f92d9b1aSKristof Provost /* update pflow_clone_create() when changing pflow_ipfix_tmpl_ipv4 */
114*f92d9b1aSKristof Provost struct pflow_ipfix_tmpl_ipv4 {
115*f92d9b1aSKristof Provost 	struct pflow_tmpl_hdr	h;
116*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	src_ip;
117*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	dest_ip;
118*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	if_index_in;
119*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	if_index_out;
120*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	packets;
121*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	octets;
122*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	start;
123*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	finish;
124*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	src_port;
125*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	dest_port;
126*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	tos;
127*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	protocol;
128*f92d9b1aSKristof Provost #define PFLOW_IPFIX_TMPL_IPV4_FIELD_COUNT 12
129*f92d9b1aSKristof Provost #define PFLOW_IPFIX_TMPL_IPV4_ID 256
130*f92d9b1aSKristof Provost } __packed;
131*f92d9b1aSKristof Provost 
132*f92d9b1aSKristof Provost /* update pflow_clone_create() when changing pflow_ipfix_tmpl_v6 */
133*f92d9b1aSKristof Provost struct pflow_ipfix_tmpl_ipv6 {
134*f92d9b1aSKristof Provost 	struct pflow_tmpl_hdr	h;
135*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	src_ip;
136*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	dest_ip;
137*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	if_index_in;
138*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	if_index_out;
139*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	packets;
140*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	octets;
141*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	start;
142*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	finish;
143*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	src_port;
144*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	dest_port;
145*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	tos;
146*f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	protocol;
147*f92d9b1aSKristof Provost #define PFLOW_IPFIX_TMPL_IPV6_FIELD_COUNT 12
148*f92d9b1aSKristof Provost #define PFLOW_IPFIX_TMPL_IPV6_ID 257
149*f92d9b1aSKristof Provost } __packed;
150*f92d9b1aSKristof Provost 
151*f92d9b1aSKristof Provost struct pflow_ipfix_tmpl {
152*f92d9b1aSKristof Provost 	struct pflow_set_header	set_header;
153*f92d9b1aSKristof Provost 	struct pflow_ipfix_tmpl_ipv4	ipv4_tmpl;
154*f92d9b1aSKristof Provost 	struct pflow_ipfix_tmpl_ipv6	ipv6_tmpl;
155*f92d9b1aSKristof Provost } __packed;
156*f92d9b1aSKristof Provost 
157*f92d9b1aSKristof Provost struct pflow_ipfix_flow4 {
158*f92d9b1aSKristof Provost 	u_int32_t	src_ip;		/* sourceIPv4Address*/
159*f92d9b1aSKristof Provost 	u_int32_t	dest_ip;	/* destinationIPv4Address */
160*f92d9b1aSKristof Provost 	u_int32_t	if_index_in;	/* ingressInterface */
161*f92d9b1aSKristof Provost 	u_int32_t	if_index_out;	/* egressInterface */
162*f92d9b1aSKristof Provost 	u_int64_t	flow_packets;	/* packetDeltaCount */
163*f92d9b1aSKristof Provost 	u_int64_t	flow_octets;	/* octetDeltaCount */
164*f92d9b1aSKristof Provost 	int64_t		flow_start;	/* flowStartMilliseconds */
165*f92d9b1aSKristof Provost 	int64_t		flow_finish;	/* flowEndMilliseconds */
166*f92d9b1aSKristof Provost 	u_int16_t	src_port;	/* sourceTransportPort */
167*f92d9b1aSKristof Provost 	u_int16_t	dest_port;	/* destinationTransportPort */
168*f92d9b1aSKristof Provost 	u_int8_t	tos;		/* ipClassOfService */
169*f92d9b1aSKristof Provost 	u_int8_t	protocol;	/* protocolIdentifier */
170*f92d9b1aSKristof Provost 	/* XXX padding needed? */
171*f92d9b1aSKristof Provost } __packed;
172*f92d9b1aSKristof Provost 
173*f92d9b1aSKristof Provost struct pflow_ipfix_flow6 {
174*f92d9b1aSKristof Provost 	struct in6_addr src_ip;		/* sourceIPv6Address */
175*f92d9b1aSKristof Provost 	struct in6_addr dest_ip;	/* destinationIPv6Address */
176*f92d9b1aSKristof Provost 	u_int32_t	if_index_in;	/* ingressInterface */
177*f92d9b1aSKristof Provost 	u_int32_t	if_index_out;	/* egressInterface */
178*f92d9b1aSKristof Provost 	u_int64_t	flow_packets;	/* packetDeltaCount */
179*f92d9b1aSKristof Provost 	u_int64_t	flow_octets;	/* octetDeltaCount */
180*f92d9b1aSKristof Provost 	int64_t		flow_start;	/* flowStartMilliseconds */
181*f92d9b1aSKristof Provost 	int64_t		flow_finish;	/* flowEndMilliseconds */
182*f92d9b1aSKristof Provost 	u_int16_t	src_port;	/* sourceTransportPort */
183*f92d9b1aSKristof Provost 	u_int16_t	dest_port;	/* destinationTransportPort */
184*f92d9b1aSKristof Provost 	u_int8_t	tos;		/* ipClassOfService */
185*f92d9b1aSKristof Provost 	u_int8_t	protocol;	/* protocolIdentifier */
186*f92d9b1aSKristof Provost 	/* XXX padding needed? */
187*f92d9b1aSKristof Provost } __packed;
188*f92d9b1aSKristof Provost 
189*f92d9b1aSKristof Provost #ifdef _KERNEL
190*f92d9b1aSKristof Provost 
191*f92d9b1aSKristof Provost struct pflow_softc {
192*f92d9b1aSKristof Provost 	int			 sc_id;
193*f92d9b1aSKristof Provost 
194*f92d9b1aSKristof Provost 	struct mtx		 sc_lock;
195*f92d9b1aSKristof Provost 
196*f92d9b1aSKristof Provost 	int			 sc_dying;	/* [N] */
197*f92d9b1aSKristof Provost 	struct vnet		*sc_vnet;
198*f92d9b1aSKristof Provost 
199*f92d9b1aSKristof Provost 	unsigned int		 sc_count;
200*f92d9b1aSKristof Provost 	unsigned int		 sc_count4;
201*f92d9b1aSKristof Provost 	unsigned int		 sc_count6;
202*f92d9b1aSKristof Provost 	unsigned int		 sc_maxcount;
203*f92d9b1aSKristof Provost 	unsigned int		 sc_maxcount4;
204*f92d9b1aSKristof Provost 	unsigned int		 sc_maxcount6;
205*f92d9b1aSKristof Provost 	u_int64_t		 sc_gcounter;
206*f92d9b1aSKristof Provost 	u_int32_t		 sc_sequence;
207*f92d9b1aSKristof Provost 	struct callout		 sc_tmo;
208*f92d9b1aSKristof Provost 	struct callout		 sc_tmo6;
209*f92d9b1aSKristof Provost 	struct callout		 sc_tmo_tmpl;
210*f92d9b1aSKristof Provost 	struct intr_event	*sc_swi_ie;
211*f92d9b1aSKristof Provost 	void			*sc_swi_cookie;
212*f92d9b1aSKristof Provost 	struct mbufq		 sc_outputqueue;
213*f92d9b1aSKristof Provost 	struct task		 sc_outputtask;
214*f92d9b1aSKristof Provost 	struct socket		*so;		/* [p] */
215*f92d9b1aSKristof Provost 	struct sockaddr		*sc_flowsrc;
216*f92d9b1aSKristof Provost 	struct sockaddr		*sc_flowdst;
217*f92d9b1aSKristof Provost 	struct pflow_ipfix_tmpl	 sc_tmpl_ipfix;
218*f92d9b1aSKristof Provost 	u_int8_t		 sc_version;
219*f92d9b1aSKristof Provost 	struct mbuf		*sc_mbuf;	/* current cumulative mbuf */
220*f92d9b1aSKristof Provost 	struct mbuf		*sc_mbuf6;	/* current cumulative mbuf */
221*f92d9b1aSKristof Provost 	CK_LIST_ENTRY(pflow_softc) sc_next;
222*f92d9b1aSKristof Provost 	struct epoch_context	 sc_epoch_ctx;
223*f92d9b1aSKristof Provost };
224*f92d9b1aSKristof Provost 
225*f92d9b1aSKristof Provost #endif /* _KERNEL */
226*f92d9b1aSKristof Provost 
227*f92d9b1aSKristof Provost struct pflow_header {
228*f92d9b1aSKristof Provost 	u_int16_t	version;
229*f92d9b1aSKristof Provost 	u_int16_t	count;
230*f92d9b1aSKristof Provost 	u_int32_t	uptime_ms;
231*f92d9b1aSKristof Provost 	u_int32_t	time_sec;
232*f92d9b1aSKristof Provost 	u_int32_t	time_nanosec;
233*f92d9b1aSKristof Provost 	u_int32_t	flow_sequence;
234*f92d9b1aSKristof Provost 	u_int8_t	engine_type;
235*f92d9b1aSKristof Provost 	u_int8_t	engine_id;
236*f92d9b1aSKristof Provost 	u_int8_t	reserved1;
237*f92d9b1aSKristof Provost 	u_int8_t	reserved2;
238*f92d9b1aSKristof Provost } __packed;
239*f92d9b1aSKristof Provost 
240*f92d9b1aSKristof Provost #define PFLOW_HDRLEN sizeof(struct pflow_header)
241*f92d9b1aSKristof Provost 
242*f92d9b1aSKristof Provost struct pflow_v10_header {
243*f92d9b1aSKristof Provost 	u_int16_t	version;
244*f92d9b1aSKristof Provost 	u_int16_t	length;
245*f92d9b1aSKristof Provost 	u_int32_t	time_sec;
246*f92d9b1aSKristof Provost 	u_int32_t	flow_sequence;
247*f92d9b1aSKristof Provost 	u_int32_t	observation_dom;
248*f92d9b1aSKristof Provost } __packed;
249*f92d9b1aSKristof Provost 
250*f92d9b1aSKristof Provost #define PFLOW_IPFIX_HDRLEN sizeof(struct pflow_v10_header)
251*f92d9b1aSKristof Provost 
252*f92d9b1aSKristof Provost struct pflowstats {
253*f92d9b1aSKristof Provost 	u_int64_t	pflow_flows;
254*f92d9b1aSKristof Provost 	u_int64_t	pflow_packets;
255*f92d9b1aSKristof Provost 	u_int64_t	pflow_onomem;
256*f92d9b1aSKristof Provost 	u_int64_t	pflow_oerrors;
257*f92d9b1aSKristof Provost };
258*f92d9b1aSKristof Provost 
259*f92d9b1aSKristof Provost /* Supported flow protocols */
260*f92d9b1aSKristof Provost #define PFLOW_PROTO_5	5	/* original pflow */
261*f92d9b1aSKristof Provost #define PFLOW_PROTO_10	10	/* ipfix */
262*f92d9b1aSKristof Provost #define PFLOW_PROTO_MAX	11
263*f92d9b1aSKristof Provost 
264*f92d9b1aSKristof Provost #define PFLOW_PROTO_DEFAULT PFLOW_PROTO_5
265*f92d9b1aSKristof Provost 
266*f92d9b1aSKristof Provost struct pflow_protos {
267*f92d9b1aSKristof Provost 	const char	*ppr_name;
268*f92d9b1aSKristof Provost 	u_int8_t	 ppr_proto;
269*f92d9b1aSKristof Provost };
270*f92d9b1aSKristof Provost 
271*f92d9b1aSKristof Provost #define PFLOW_PROTOS {                                 \
272*f92d9b1aSKristof Provost 		{ "5",	PFLOW_PROTO_5 },	       \
273*f92d9b1aSKristof Provost 		{ "10",	PFLOW_PROTO_10 },	       \
274*f92d9b1aSKristof Provost }
275*f92d9b1aSKristof Provost 
276*f92d9b1aSKristof Provost #define PFLOWNL_FAMILY_NAME	"pflow"
277*f92d9b1aSKristof Provost 
278*f92d9b1aSKristof Provost enum {
279*f92d9b1aSKristof Provost 	PFLOWNL_CMD_UNSPEC = 0,
280*f92d9b1aSKristof Provost 	PFLOWNL_CMD_LIST = 1,
281*f92d9b1aSKristof Provost 	PFLOWNL_CMD_CREATE = 2,
282*f92d9b1aSKristof Provost 	PFLOWNL_CMD_DEL = 3,
283*f92d9b1aSKristof Provost 	PFLOWNL_CMD_SET = 4,
284*f92d9b1aSKristof Provost 	PFLOWNL_CMD_GET = 5,
285*f92d9b1aSKristof Provost 	__PFLOWNL_CMD_MAX,
286*f92d9b1aSKristof Provost };
287*f92d9b1aSKristof Provost #define PFLOWNL_CMD_MAX (__PFLOWNL_CMD_MAX - 1)
288*f92d9b1aSKristof Provost 
289*f92d9b1aSKristof Provost enum pflow_list_type_t {
290*f92d9b1aSKristof Provost 	PFLOWNL_L_UNSPEC,
291*f92d9b1aSKristof Provost 	PFLOWNL_L_ID		= 1, /* u32 */
292*f92d9b1aSKristof Provost };
293*f92d9b1aSKristof Provost 
294*f92d9b1aSKristof Provost enum pflow_create_type_t {
295*f92d9b1aSKristof Provost 	PFLOWNL_CREATE_UNSPEC,
296*f92d9b1aSKristof Provost 	PFLOWNL_CREATE_ID	= 1, /* u32 */
297*f92d9b1aSKristof Provost };
298*f92d9b1aSKristof Provost 
299*f92d9b1aSKristof Provost enum pflow_del_type_t {
300*f92d9b1aSKristof Provost 	PFLOWNL_DEL_UNSPEC,
301*f92d9b1aSKristof Provost 	PFLOWNL_DEL_ID		= 1, /* u32 */
302*f92d9b1aSKristof Provost };
303*f92d9b1aSKristof Provost 
304*f92d9b1aSKristof Provost enum pflow_addr_type_t {
305*f92d9b1aSKristof Provost 	PFLOWNL_ADDR_UNSPEC,
306*f92d9b1aSKristof Provost 	PFLOWNL_ADDR_FAMILY	= 1, /* u8 */
307*f92d9b1aSKristof Provost 	PFLOWNL_ADDR_PORT	= 2, /* u16 */
308*f92d9b1aSKristof Provost 	PFLOWNL_ADDR_IP		= 3, /* struct in_addr */
309*f92d9b1aSKristof Provost 	PFLOWNL_ADDR_IP6	= 4, /* struct in6_addr */
310*f92d9b1aSKristof Provost };
311*f92d9b1aSKristof Provost 
312*f92d9b1aSKristof Provost enum pflow_get_type_t {
313*f92d9b1aSKristof Provost 	PFLOWNL_GET_UNSPEC,
314*f92d9b1aSKristof Provost 	PFLOWNL_GET_ID		= 1, /* u32 */
315*f92d9b1aSKristof Provost 	PFLOWNL_GET_VERSION	= 2, /* u16 */
316*f92d9b1aSKristof Provost 	PFLOWNL_GET_SRC		= 3, /* struct sockaddr_storage */
317*f92d9b1aSKristof Provost 	PFLOWNL_GET_DST		= 4, /* struct sockaddr_storage */
318*f92d9b1aSKristof Provost };
319*f92d9b1aSKristof Provost 
320*f92d9b1aSKristof Provost enum pflow_set_type_t {
321*f92d9b1aSKristof Provost 	PFLOWNL_SET_UNSPEC,
322*f92d9b1aSKristof Provost 	PFLOWNL_SET_ID		= 1, /* u32 */
323*f92d9b1aSKristof Provost 	PFLOWNL_SET_VERSION	= 2, /* u16 */
324*f92d9b1aSKristof Provost 	PFLOWNL_SET_SRC		= 3, /* struct sockaddr_storage */
325*f92d9b1aSKristof Provost 	PFLOWNL_SET_DST		= 4, /* struct sockaddr_storage */
326*f92d9b1aSKristof Provost };
327*f92d9b1aSKristof Provost 
328*f92d9b1aSKristof Provost #ifdef _KERNEL
329*f92d9b1aSKristof Provost int export_pflow(struct pf_kstate *);
330*f92d9b1aSKristof Provost int pflow_sysctl(int *, u_int,  void *, size_t *, void *, size_t);
331*f92d9b1aSKristof Provost #endif /* _KERNEL */
332*f92d9b1aSKristof Provost 
333*f92d9b1aSKristof Provost #endif /* _NET_IF_PFLOW_H_ */
334