xref: /freebsd/sys/net/pflow.h (revision e95025ed93886dc854c2c92a2d2812cb51abf4ed)
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 
4263a5fe83SKristof Provost #define PFLOW_MAX_ENTRIES	128
4363a5fe83SKristof Provost 
44f92d9b1aSKristof Provost #define PFLOW_ID_LEN	sizeof(u_int64_t)
45f92d9b1aSKristof Provost 
46f92d9b1aSKristof Provost #define PFLOW_MAXFLOWS 30
47f92d9b1aSKristof Provost #define PFLOW_ENGINE_TYPE 42
48f92d9b1aSKristof Provost #define PFLOW_ENGINE_ID 42
49f92d9b1aSKristof Provost #define PFLOW_MAXBYTES 0xffffffff
50f92d9b1aSKristof Provost #define PFLOW_TIMEOUT 30
51f92d9b1aSKristof Provost #define PFLOW_TMPL_TIMEOUT 30 /* rfc 5101 10.3.6 (p.40) recommends 600 */
52f92d9b1aSKristof Provost 
53f92d9b1aSKristof Provost #define PFLOW_IPFIX_TMPL_SET_ID 2
54f92d9b1aSKristof Provost 
55f92d9b1aSKristof Provost /* RFC 5102 Information Element Identifiers */
56f92d9b1aSKristof Provost 
57f92d9b1aSKristof Provost #define PFIX_IE_octetDeltaCount			  1
58f92d9b1aSKristof Provost #define PFIX_IE_packetDeltaCount		  2
59f92d9b1aSKristof Provost #define PFIX_IE_protocolIdentifier		  4
60f92d9b1aSKristof Provost #define PFIX_IE_ipClassOfService		  5
61f92d9b1aSKristof Provost #define PFIX_IE_sourceTransportPort		  7
62f92d9b1aSKristof Provost #define PFIX_IE_sourceIPv4Address		  8
63f92d9b1aSKristof Provost #define PFIX_IE_ingressInterface		 10
64f92d9b1aSKristof Provost #define PFIX_IE_destinationTransportPort	 11
65f92d9b1aSKristof Provost #define PFIX_IE_destinationIPv4Address		 12
66f92d9b1aSKristof Provost #define PFIX_IE_egressInterface			 14
67f92d9b1aSKristof Provost #define PFIX_IE_flowEndSysUpTime		 21
68f92d9b1aSKristof Provost #define PFIX_IE_flowStartSysUpTime		 22
69f92d9b1aSKristof Provost #define PFIX_IE_sourceIPv6Address		 27
70f92d9b1aSKristof Provost #define PFIX_IE_destinationIPv6Address		 28
71f92d9b1aSKristof Provost #define PFIX_IE_flowStartMilliseconds		152
72f92d9b1aSKristof Provost #define PFIX_IE_flowEndMilliseconds		153
73fc6e5069SKristof Provost #define PFIX_IE_postNATSourceIPv4Address	225
74fc6e5069SKristof Provost #define PFIX_IE_postNATDestinationIPv4Address	226
75fc6e5069SKristof Provost #define PFIX_IE_postNAPTSourceTransportPort	227
76fc6e5069SKristof Provost #define PFIX_IE_postNAPTDestinationTransportPort	228
77fc6e5069SKristof Provost #define PFIX_IE_natEvent			230
78fc6e5069SKristof Provost #define PFIX_NAT_EVENT_SESSION_CREATE		4
79fc6e5069SKristof Provost #define PFIX_NAT_EVENT_SESSION_DELETE		5
80fc6e5069SKristof Provost #define PFIX_IE_timeStamp			323
81f92d9b1aSKristof Provost 
82f92d9b1aSKristof Provost struct pflow_flow {
83f92d9b1aSKristof Provost 	u_int32_t	src_ip;
84f92d9b1aSKristof Provost 	u_int32_t	dest_ip;
85f92d9b1aSKristof Provost 	u_int32_t	nexthop_ip;
86f92d9b1aSKristof Provost 	u_int16_t	if_index_in;
87f92d9b1aSKristof Provost 	u_int16_t	if_index_out;
88f92d9b1aSKristof Provost 	u_int32_t	flow_packets;
89f92d9b1aSKristof Provost 	u_int32_t	flow_octets;
90f92d9b1aSKristof Provost 	u_int32_t	flow_start;
91f92d9b1aSKristof Provost 	u_int32_t	flow_finish;
92f92d9b1aSKristof Provost 	u_int16_t	src_port;
93f92d9b1aSKristof Provost 	u_int16_t	dest_port;
94f92d9b1aSKristof Provost 	u_int8_t	pad1;
95f92d9b1aSKristof Provost 	u_int8_t	tcp_flags;
96f92d9b1aSKristof Provost 	u_int8_t	protocol;
97f92d9b1aSKristof Provost 	u_int8_t	tos;
98f92d9b1aSKristof Provost 	u_int16_t	src_as;
99f92d9b1aSKristof Provost 	u_int16_t	dest_as;
100f92d9b1aSKristof Provost 	u_int8_t	src_mask;
101f92d9b1aSKristof Provost 	u_int8_t	dest_mask;
102f92d9b1aSKristof Provost 	u_int16_t	pad2;
103f92d9b1aSKristof Provost } __packed;
104f92d9b1aSKristof Provost 
105f92d9b1aSKristof Provost struct pflow_set_header {
106f92d9b1aSKristof Provost 	u_int16_t	set_id;
107f92d9b1aSKristof Provost 	u_int16_t	set_length; /* total length of the set,
108f92d9b1aSKristof Provost 				       in octets, including the set header */
109f92d9b1aSKristof Provost } __packed;
110f92d9b1aSKristof Provost 
111f92d9b1aSKristof Provost #define PFLOW_SET_HDRLEN sizeof(struct pflow_set_header)
112f92d9b1aSKristof Provost 
113f92d9b1aSKristof Provost struct pflow_tmpl_hdr {
114f92d9b1aSKristof Provost 	u_int16_t	tmpl_id;
115f92d9b1aSKristof Provost 	u_int16_t	field_count;
116f92d9b1aSKristof Provost } __packed;
117f92d9b1aSKristof Provost 
118f92d9b1aSKristof Provost struct pflow_tmpl_fspec {
119f92d9b1aSKristof Provost 	u_int16_t	field_id;
120f92d9b1aSKristof Provost 	u_int16_t	len;
121f92d9b1aSKristof Provost } __packed;
122f92d9b1aSKristof Provost 
123f92d9b1aSKristof Provost /* update pflow_clone_create() when changing pflow_ipfix_tmpl_ipv4 */
124f92d9b1aSKristof Provost struct pflow_ipfix_tmpl_ipv4 {
125f92d9b1aSKristof Provost 	struct pflow_tmpl_hdr	h;
126f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	src_ip;
127f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	dest_ip;
128f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	if_index_in;
129f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	if_index_out;
130f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	packets;
131f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	octets;
132f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	start;
133f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	finish;
134f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	src_port;
135f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	dest_port;
136f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	tos;
137f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	protocol;
138f92d9b1aSKristof Provost #define PFLOW_IPFIX_TMPL_IPV4_FIELD_COUNT 12
139f92d9b1aSKristof Provost #define PFLOW_IPFIX_TMPL_IPV4_ID 256
140f92d9b1aSKristof Provost } __packed;
141f92d9b1aSKristof Provost 
142f92d9b1aSKristof Provost /* update pflow_clone_create() when changing pflow_ipfix_tmpl_v6 */
143f92d9b1aSKristof Provost struct pflow_ipfix_tmpl_ipv6 {
144f92d9b1aSKristof Provost 	struct pflow_tmpl_hdr	h;
145f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	src_ip;
146f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	dest_ip;
147f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	if_index_in;
148f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	if_index_out;
149f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	packets;
150f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	octets;
151f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	start;
152f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	finish;
153f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	src_port;
154f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	dest_port;
155f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	tos;
156f92d9b1aSKristof Provost 	struct pflow_tmpl_fspec	protocol;
157f92d9b1aSKristof Provost #define PFLOW_IPFIX_TMPL_IPV6_FIELD_COUNT 12
158f92d9b1aSKristof Provost #define PFLOW_IPFIX_TMPL_IPV6_ID 257
159f92d9b1aSKristof Provost } __packed;
160f92d9b1aSKristof Provost 
161fc6e5069SKristof Provost struct pflow_ipfix_tmpl_nat44 {
162fc6e5069SKristof Provost 	struct pflow_tmpl_hdr	h;
163fc6e5069SKristof Provost 	struct pflow_tmpl_fspec timestamp;
164fc6e5069SKristof Provost 	struct pflow_tmpl_fspec nat_event;
165fc6e5069SKristof Provost 	struct pflow_tmpl_fspec protocol;
166fc6e5069SKristof Provost 	struct pflow_tmpl_fspec src_ip;
167fc6e5069SKristof Provost 	struct pflow_tmpl_fspec src_port;
168fc6e5069SKristof Provost 	struct pflow_tmpl_fspec postnat_src_ip;
169fc6e5069SKristof Provost 	struct pflow_tmpl_fspec postnat_src_port;
170fc6e5069SKristof Provost 	struct pflow_tmpl_fspec dst_ip;
171fc6e5069SKristof Provost 	struct pflow_tmpl_fspec dst_port;
172fc6e5069SKristof Provost 	struct pflow_tmpl_fspec postnat_dst_ip;
173fc6e5069SKristof Provost 	struct pflow_tmpl_fspec postnat_dst_port;
174fc6e5069SKristof Provost #define PFLOW_IPFIX_TMPL_NAT44_FIELD_COUNT 11
175fc6e5069SKristof Provost #define PFLOW_IPFIX_TMPL_NAT44_ID 258
176fc6e5069SKristof Provost };
177fc6e5069SKristof Provost 
178f92d9b1aSKristof Provost struct pflow_ipfix_tmpl {
179f92d9b1aSKristof Provost 	struct pflow_set_header	set_header;
180f92d9b1aSKristof Provost 	struct pflow_ipfix_tmpl_ipv4	ipv4_tmpl;
181f92d9b1aSKristof Provost 	struct pflow_ipfix_tmpl_ipv6	ipv6_tmpl;
182fc6e5069SKristof Provost 	struct pflow_ipfix_tmpl_nat44	nat44_tmpl;
183f92d9b1aSKristof Provost } __packed;
184f92d9b1aSKristof Provost 
185f92d9b1aSKristof Provost struct pflow_ipfix_flow4 {
186f92d9b1aSKristof Provost 	u_int32_t	src_ip;		/* sourceIPv4Address*/
187f92d9b1aSKristof Provost 	u_int32_t	dest_ip;	/* destinationIPv4Address */
188f92d9b1aSKristof Provost 	u_int32_t	if_index_in;	/* ingressInterface */
189f92d9b1aSKristof Provost 	u_int32_t	if_index_out;	/* egressInterface */
190f92d9b1aSKristof Provost 	u_int64_t	flow_packets;	/* packetDeltaCount */
191f92d9b1aSKristof Provost 	u_int64_t	flow_octets;	/* octetDeltaCount */
192f92d9b1aSKristof Provost 	int64_t		flow_start;	/* flowStartMilliseconds */
193f92d9b1aSKristof Provost 	int64_t		flow_finish;	/* flowEndMilliseconds */
194f92d9b1aSKristof Provost 	u_int16_t	src_port;	/* sourceTransportPort */
195f92d9b1aSKristof Provost 	u_int16_t	dest_port;	/* destinationTransportPort */
196f92d9b1aSKristof Provost 	u_int8_t	tos;		/* ipClassOfService */
197f92d9b1aSKristof Provost 	u_int8_t	protocol;	/* protocolIdentifier */
198f92d9b1aSKristof Provost 	/* XXX padding needed? */
199f92d9b1aSKristof Provost } __packed;
200f92d9b1aSKristof Provost 
201f92d9b1aSKristof Provost struct pflow_ipfix_flow6 {
202f92d9b1aSKristof Provost 	struct in6_addr src_ip;		/* sourceIPv6Address */
203f92d9b1aSKristof Provost 	struct in6_addr dest_ip;	/* destinationIPv6Address */
204f92d9b1aSKristof Provost 	u_int32_t	if_index_in;	/* ingressInterface */
205f92d9b1aSKristof Provost 	u_int32_t	if_index_out;	/* egressInterface */
206f92d9b1aSKristof Provost 	u_int64_t	flow_packets;	/* packetDeltaCount */
207f92d9b1aSKristof Provost 	u_int64_t	flow_octets;	/* octetDeltaCount */
208f92d9b1aSKristof Provost 	int64_t		flow_start;	/* flowStartMilliseconds */
209f92d9b1aSKristof Provost 	int64_t		flow_finish;	/* flowEndMilliseconds */
210f92d9b1aSKristof Provost 	u_int16_t	src_port;	/* sourceTransportPort */
211f92d9b1aSKristof Provost 	u_int16_t	dest_port;	/* destinationTransportPort */
212f92d9b1aSKristof Provost 	u_int8_t	tos;		/* ipClassOfService */
213f92d9b1aSKristof Provost 	u_int8_t	protocol;	/* protocolIdentifier */
214f92d9b1aSKristof Provost 	/* XXX padding needed? */
215f92d9b1aSKristof Provost } __packed;
216f92d9b1aSKristof Provost 
217fc6e5069SKristof Provost struct pflow_ipfix_nat4 {
218fc6e5069SKristof Provost 	u_int64_t	timestamp;	/* timeStamp */
219fc6e5069SKristof Provost 	u_int8_t	nat_event;	/* natEvent */
220fc6e5069SKristof Provost 	u_int8_t	protocol;	/* protocolIdentifier */
221fc6e5069SKristof Provost 	u_int32_t	src_ip;		/* sourceIPv4Address */
222fc6e5069SKristof Provost 	u_int16_t	src_port;	/* sourceTransportPort */
223fc6e5069SKristof Provost 	u_int32_t	postnat_src_ip;	/* postNATSourceIPv4Address */
224fc6e5069SKristof Provost 	u_int16_t	postnat_src_port;/* postNAPTSourceTransportPort */
225fc6e5069SKristof Provost 	u_int32_t	dest_ip;	/* destinationIPv4Address */
226fc6e5069SKristof Provost 	u_int16_t	dest_port;	/* destinationTransportPort */
227fc6e5069SKristof Provost 	u_int32_t	postnat_dest_ip;/* postNATDestinationIPv4Address */
228fc6e5069SKristof Provost 	u_int16_t	postnat_dest_port;/* postNAPTDestinationTransportPort */
229fc6e5069SKristof Provost } __packed;
230fc6e5069SKristof Provost 
231f92d9b1aSKristof Provost #ifdef _KERNEL
232f92d9b1aSKristof Provost 
233f92d9b1aSKristof Provost struct pflow_softc {
234f92d9b1aSKristof Provost 	int			 sc_id;
235f92d9b1aSKristof Provost 
236f92d9b1aSKristof Provost 	struct mtx		 sc_lock;
237f92d9b1aSKristof Provost 
238f92d9b1aSKristof Provost 	int			 sc_dying;	/* [N] */
239f92d9b1aSKristof Provost 	struct vnet		*sc_vnet;
240f92d9b1aSKristof Provost 
241f92d9b1aSKristof Provost 	unsigned int		 sc_count;
242f92d9b1aSKristof Provost 	unsigned int		 sc_count4;
243f92d9b1aSKristof Provost 	unsigned int		 sc_count6;
244fc6e5069SKristof Provost 	unsigned int		 sc_count_nat4;
245f92d9b1aSKristof Provost 	unsigned int		 sc_maxcount;
246f92d9b1aSKristof Provost 	unsigned int		 sc_maxcount4;
247f92d9b1aSKristof Provost 	unsigned int		 sc_maxcount6;
248fc6e5069SKristof Provost 	unsigned int		 sc_maxcount_nat4;
2492be6f757SKristof Provost 	u_int32_t		 sc_gcounter;
250f92d9b1aSKristof Provost 	u_int32_t		 sc_sequence;
251f92d9b1aSKristof Provost 	struct callout		 sc_tmo;
252f92d9b1aSKristof Provost 	struct callout		 sc_tmo6;
253fc6e5069SKristof Provost 	struct callout		 sc_tmo_nat4;
254f92d9b1aSKristof Provost 	struct callout		 sc_tmo_tmpl;
255f92d9b1aSKristof Provost 	struct intr_event	*sc_swi_ie;
256f92d9b1aSKristof Provost 	void			*sc_swi_cookie;
257f92d9b1aSKristof Provost 	struct mbufq		 sc_outputqueue;
258f92d9b1aSKristof Provost 	struct task		 sc_outputtask;
259f92d9b1aSKristof Provost 	struct socket		*so;		/* [p] */
260f92d9b1aSKristof Provost 	struct sockaddr		*sc_flowsrc;
261f92d9b1aSKristof Provost 	struct sockaddr		*sc_flowdst;
262f92d9b1aSKristof Provost 	struct pflow_ipfix_tmpl	 sc_tmpl_ipfix;
263f92d9b1aSKristof Provost 	u_int8_t		 sc_version;
26485b71dcfSKristof Provost 	u_int32_t		 sc_observation_dom;
265f92d9b1aSKristof Provost 	struct mbuf		*sc_mbuf;	/* current cumulative mbuf */
266f92d9b1aSKristof Provost 	struct mbuf		*sc_mbuf6;	/* current cumulative mbuf */
267fc6e5069SKristof Provost 	struct mbuf		*sc_mbuf_nat4;
268f92d9b1aSKristof Provost 	CK_LIST_ENTRY(pflow_softc) sc_next;
269f92d9b1aSKristof Provost 	struct epoch_context	 sc_epoch_ctx;
270f92d9b1aSKristof Provost };
271f92d9b1aSKristof Provost 
272f92d9b1aSKristof Provost #endif /* _KERNEL */
273f92d9b1aSKristof Provost 
274f92d9b1aSKristof Provost struct pflow_header {
275f92d9b1aSKristof Provost 	u_int16_t	version;
276f92d9b1aSKristof Provost 	u_int16_t	count;
277f92d9b1aSKristof Provost 	u_int32_t	uptime_ms;
278f92d9b1aSKristof Provost 	u_int32_t	time_sec;
279f92d9b1aSKristof Provost 	u_int32_t	time_nanosec;
280f92d9b1aSKristof Provost 	u_int32_t	flow_sequence;
281f92d9b1aSKristof Provost 	u_int8_t	engine_type;
282f92d9b1aSKristof Provost 	u_int8_t	engine_id;
283f92d9b1aSKristof Provost 	u_int8_t	reserved1;
284f92d9b1aSKristof Provost 	u_int8_t	reserved2;
285f92d9b1aSKristof Provost } __packed;
286f92d9b1aSKristof Provost 
287f92d9b1aSKristof Provost #define PFLOW_HDRLEN sizeof(struct pflow_header)
288f92d9b1aSKristof Provost 
289f92d9b1aSKristof Provost struct pflow_v10_header {
290f92d9b1aSKristof Provost 	u_int16_t	version;
291f92d9b1aSKristof Provost 	u_int16_t	length;
292f92d9b1aSKristof Provost 	u_int32_t	time_sec;
293f92d9b1aSKristof Provost 	u_int32_t	flow_sequence;
294f92d9b1aSKristof Provost 	u_int32_t	observation_dom;
295f92d9b1aSKristof Provost } __packed;
296f92d9b1aSKristof Provost 
297f92d9b1aSKristof Provost #define PFLOW_IPFIX_HDRLEN sizeof(struct pflow_v10_header)
298f92d9b1aSKristof Provost 
299f92d9b1aSKristof Provost struct pflowstats {
300f92d9b1aSKristof Provost 	u_int64_t	pflow_flows;
301f92d9b1aSKristof Provost 	u_int64_t	pflow_packets;
302f92d9b1aSKristof Provost 	u_int64_t	pflow_onomem;
303f92d9b1aSKristof Provost 	u_int64_t	pflow_oerrors;
304f92d9b1aSKristof Provost };
305f92d9b1aSKristof Provost 
306f92d9b1aSKristof Provost /* Supported flow protocols */
307f92d9b1aSKristof Provost #define PFLOW_PROTO_5	5	/* original pflow */
308f92d9b1aSKristof Provost #define PFLOW_PROTO_10	10	/* ipfix */
309f92d9b1aSKristof Provost #define PFLOW_PROTO_MAX	11
310f92d9b1aSKristof Provost 
311f92d9b1aSKristof Provost #define PFLOW_PROTO_DEFAULT PFLOW_PROTO_5
312f92d9b1aSKristof Provost 
313f92d9b1aSKristof Provost struct pflow_protos {
314f92d9b1aSKristof Provost 	const char	*ppr_name;
315f92d9b1aSKristof Provost 	u_int8_t	 ppr_proto;
316f92d9b1aSKristof Provost };
317f92d9b1aSKristof Provost 
318f92d9b1aSKristof Provost #define PFLOW_PROTOS {                                 \
319f92d9b1aSKristof Provost 		{ "5",	PFLOW_PROTO_5 },	       \
320f92d9b1aSKristof Provost 		{ "10",	PFLOW_PROTO_10 },	       \
321f92d9b1aSKristof Provost }
322f92d9b1aSKristof Provost 
323f92d9b1aSKristof Provost #define PFLOWNL_FAMILY_NAME	"pflow"
324f92d9b1aSKristof Provost 
325f92d9b1aSKristof Provost enum {
326f92d9b1aSKristof Provost 	PFLOWNL_CMD_UNSPEC = 0,
327f92d9b1aSKristof Provost 	PFLOWNL_CMD_LIST = 1,
328f92d9b1aSKristof Provost 	PFLOWNL_CMD_CREATE = 2,
329f92d9b1aSKristof Provost 	PFLOWNL_CMD_DEL = 3,
330f92d9b1aSKristof Provost 	PFLOWNL_CMD_SET = 4,
331f92d9b1aSKristof Provost 	PFLOWNL_CMD_GET = 5,
332f92d9b1aSKristof Provost 	__PFLOWNL_CMD_MAX,
333f92d9b1aSKristof Provost };
334f92d9b1aSKristof Provost #define PFLOWNL_CMD_MAX (__PFLOWNL_CMD_MAX - 1)
335f92d9b1aSKristof Provost 
336f92d9b1aSKristof Provost enum pflow_list_type_t {
337f92d9b1aSKristof Provost 	PFLOWNL_L_UNSPEC,
338f92d9b1aSKristof Provost 	PFLOWNL_L_ID		= 1, /* u32 */
339f92d9b1aSKristof Provost };
340f92d9b1aSKristof Provost 
341f92d9b1aSKristof Provost enum pflow_create_type_t {
342f92d9b1aSKristof Provost 	PFLOWNL_CREATE_UNSPEC,
343f92d9b1aSKristof Provost 	PFLOWNL_CREATE_ID	= 1, /* u32 */
344f92d9b1aSKristof Provost };
345f92d9b1aSKristof Provost 
346f92d9b1aSKristof Provost enum pflow_del_type_t {
347f92d9b1aSKristof Provost 	PFLOWNL_DEL_UNSPEC,
348f92d9b1aSKristof Provost 	PFLOWNL_DEL_ID		= 1, /* u32 */
349f92d9b1aSKristof Provost };
350f92d9b1aSKristof Provost 
351f92d9b1aSKristof Provost enum pflow_addr_type_t {
352f92d9b1aSKristof Provost 	PFLOWNL_ADDR_UNSPEC,
353f92d9b1aSKristof Provost 	PFLOWNL_ADDR_FAMILY	= 1, /* u8 */
354f92d9b1aSKristof Provost 	PFLOWNL_ADDR_PORT	= 2, /* u16 */
355f92d9b1aSKristof Provost 	PFLOWNL_ADDR_IP		= 3, /* struct in_addr */
356f92d9b1aSKristof Provost 	PFLOWNL_ADDR_IP6	= 4, /* struct in6_addr */
357f92d9b1aSKristof Provost };
358f92d9b1aSKristof Provost 
359f92d9b1aSKristof Provost enum pflow_get_type_t {
360f92d9b1aSKristof Provost 	PFLOWNL_GET_UNSPEC,
361f92d9b1aSKristof Provost 	PFLOWNL_GET_ID		= 1, /* u32 */
362f92d9b1aSKristof Provost 	PFLOWNL_GET_VERSION	= 2, /* u16 */
363f92d9b1aSKristof Provost 	PFLOWNL_GET_SRC		= 3, /* struct sockaddr_storage */
364f92d9b1aSKristof Provost 	PFLOWNL_GET_DST		= 4, /* struct sockaddr_storage */
36585b71dcfSKristof Provost 	PFLOWNL_GET_OBSERVATION_DOMAIN	= 5, /* u32 */
366*e95025edSKristof Provost 	PFLOWNL_GET_SOCKET_STATUS	= 6, /* u8 */
367f92d9b1aSKristof Provost };
368f92d9b1aSKristof Provost 
369f92d9b1aSKristof Provost enum pflow_set_type_t {
370f92d9b1aSKristof Provost 	PFLOWNL_SET_UNSPEC,
371f92d9b1aSKristof Provost 	PFLOWNL_SET_ID		= 1, /* u32 */
372f92d9b1aSKristof Provost 	PFLOWNL_SET_VERSION	= 2, /* u16 */
373f92d9b1aSKristof Provost 	PFLOWNL_SET_SRC		= 3, /* struct sockaddr_storage */
374f92d9b1aSKristof Provost 	PFLOWNL_SET_DST		= 4, /* struct sockaddr_storage */
37585b71dcfSKristof Provost 	PFLOWNL_SET_OBSERVATION_DOMAIN = 5, /* u32 */
376f92d9b1aSKristof Provost };
377f92d9b1aSKristof Provost 
378f92d9b1aSKristof Provost #ifdef _KERNEL
379f92d9b1aSKristof Provost int pflow_sysctl(int *, u_int,  void *, size_t *, void *, size_t);
380f92d9b1aSKristof Provost #endif /* _KERNEL */
381f92d9b1aSKristof Provost 
382f92d9b1aSKristof Provost #endif /* _NET_IF_PFLOW_H_ */
383