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