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