The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/net/if_pflow.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $OpenBSD: if_pflow.h,v 1.19 2022/11/23 15:12:27 mvs Exp $       */
    2 
    3 /*
    4  * Copyright (c) 2008 Henning Brauer <henning@openbsd.org>
    5  * Copyright (c) 2008 Joerg Goltermann <jg@osn.de>
    6  *
    7  * Permission to use, copy, modify, and distribute this software for any
    8  * purpose with or without fee is hereby granted, provided that the above
    9  * copyright notice and this permission notice appear in all copies.
   10  *
   11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   15  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
   16  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
   17  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   18  */
   19 
   20 #ifndef _NET_IF_PFLOW_H_
   21 #define _NET_IF_PFLOW_H_
   22 
   23 #define PFLOW_ID_LEN    sizeof(u_int64_t)
   24 
   25 #define PFLOW_MAXFLOWS 30
   26 #define PFLOW_ENGINE_TYPE 42
   27 #define PFLOW_ENGINE_ID 42
   28 #define PFLOW_MAXBYTES 0xffffffff
   29 #define PFLOW_TIMEOUT 30
   30 #define PFLOW_TMPL_TIMEOUT 30 /* rfc 5101 10.3.6 (p.40) recommends 600 */
   31 
   32 #define PFLOW_IPFIX_TMPL_SET_ID 2
   33 
   34 /* RFC 5102 Information Element Identifiers */
   35 
   36 #define PFIX_IE_octetDeltaCount                   1
   37 #define PFIX_IE_packetDeltaCount                  2
   38 #define PFIX_IE_protocolIdentifier                4
   39 #define PFIX_IE_ipClassOfService                  5
   40 #define PFIX_IE_sourceTransportPort               7
   41 #define PFIX_IE_sourceIPv4Address                 8
   42 #define PFIX_IE_ingressInterface                 10
   43 #define PFIX_IE_destinationTransportPort         11
   44 #define PFIX_IE_destinationIPv4Address           12
   45 #define PFIX_IE_egressInterface                  14
   46 #define PFIX_IE_flowEndSysUpTime                 21
   47 #define PFIX_IE_flowStartSysUpTime               22
   48 #define PFIX_IE_sourceIPv6Address                27
   49 #define PFIX_IE_destinationIPv6Address           28
   50 #define PFIX_IE_flowStartMilliseconds           152
   51 #define PFIX_IE_flowEndMilliseconds             153
   52 
   53 struct pflow_flow {
   54         u_int32_t       src_ip;
   55         u_int32_t       dest_ip;
   56         u_int32_t       nexthop_ip;
   57         u_int16_t       if_index_in;
   58         u_int16_t       if_index_out;
   59         u_int32_t       flow_packets;
   60         u_int32_t       flow_octets;
   61         u_int32_t       flow_start;
   62         u_int32_t       flow_finish;
   63         u_int16_t       src_port;
   64         u_int16_t       dest_port;
   65         u_int8_t        pad1;
   66         u_int8_t        tcp_flags;
   67         u_int8_t        protocol;
   68         u_int8_t        tos;
   69         u_int16_t       src_as;
   70         u_int16_t       dest_as;
   71         u_int8_t        src_mask;
   72         u_int8_t        dest_mask;
   73         u_int16_t       pad2;
   74 } __packed;
   75 
   76 struct pflow_set_header {
   77         u_int16_t       set_id;
   78         u_int16_t       set_length; /* total length of the set,
   79                                        in octets, including the set header */
   80 } __packed;
   81 
   82 #define PFLOW_SET_HDRLEN sizeof(struct pflow_set_header)
   83 
   84 struct pflow_tmpl_hdr {
   85         u_int16_t       tmpl_id;
   86         u_int16_t       field_count;
   87 } __packed;
   88 
   89 struct pflow_tmpl_fspec {
   90         u_int16_t       field_id;
   91         u_int16_t       len;
   92 } __packed;
   93 
   94 /* update pflow_clone_create() when changing pflow_ipfix_tmpl_ipv4 */
   95 struct pflow_ipfix_tmpl_ipv4 {
   96         struct pflow_tmpl_hdr   h;
   97         struct pflow_tmpl_fspec src_ip;
   98         struct pflow_tmpl_fspec dest_ip;
   99         struct pflow_tmpl_fspec if_index_in;
  100         struct pflow_tmpl_fspec if_index_out;
  101         struct pflow_tmpl_fspec packets;
  102         struct pflow_tmpl_fspec octets;
  103         struct pflow_tmpl_fspec start;
  104         struct pflow_tmpl_fspec finish;
  105         struct pflow_tmpl_fspec src_port;
  106         struct pflow_tmpl_fspec dest_port;
  107         struct pflow_tmpl_fspec tos;
  108         struct pflow_tmpl_fspec protocol;
  109 #define PFLOW_IPFIX_TMPL_IPV4_FIELD_COUNT 12
  110 #define PFLOW_IPFIX_TMPL_IPV4_ID 256
  111 } __packed;
  112 
  113 /* update pflow_clone_create() when changing pflow_ipfix_tmpl_v6 */
  114 struct pflow_ipfix_tmpl_ipv6 {
  115         struct pflow_tmpl_hdr   h;
  116         struct pflow_tmpl_fspec src_ip;
  117         struct pflow_tmpl_fspec dest_ip;
  118         struct pflow_tmpl_fspec if_index_in;
  119         struct pflow_tmpl_fspec if_index_out;
  120         struct pflow_tmpl_fspec packets;
  121         struct pflow_tmpl_fspec octets;
  122         struct pflow_tmpl_fspec start;
  123         struct pflow_tmpl_fspec finish;
  124         struct pflow_tmpl_fspec src_port;
  125         struct pflow_tmpl_fspec dest_port;
  126         struct pflow_tmpl_fspec tos;
  127         struct pflow_tmpl_fspec protocol;
  128 #define PFLOW_IPFIX_TMPL_IPV6_FIELD_COUNT 12
  129 #define PFLOW_IPFIX_TMPL_IPV6_ID 257
  130 } __packed;
  131 
  132 struct pflow_ipfix_tmpl {
  133         struct pflow_set_header set_header;
  134         struct pflow_ipfix_tmpl_ipv4    ipv4_tmpl;
  135         struct pflow_ipfix_tmpl_ipv6    ipv6_tmpl;
  136 } __packed;
  137 
  138 struct pflow_ipfix_flow4 {
  139         u_int32_t       src_ip;         /* sourceIPv4Address*/
  140         u_int32_t       dest_ip;        /* destinationIPv4Address */
  141         u_int32_t       if_index_in;    /* ingressInterface */
  142         u_int32_t       if_index_out;   /* egressInterface */
  143         u_int64_t       flow_packets;   /* packetDeltaCount */
  144         u_int64_t       flow_octets;    /* octetDeltaCount */
  145         int64_t         flow_start;     /* flowStartMilliseconds */
  146         int64_t         flow_finish;    /* flowEndMilliseconds */
  147         u_int16_t       src_port;       /* sourceTransportPort */
  148         u_int16_t       dest_port;      /* destinationTransportPort */
  149         u_int8_t        tos;            /* ipClassOfService */
  150         u_int8_t        protocol;       /* protocolIdentifier */
  151         /* XXX padding needed? */
  152 } __packed;
  153 
  154 struct pflow_ipfix_flow6 {
  155         struct in6_addr src_ip;         /* sourceIPv6Address */
  156         struct in6_addr dest_ip;        /* destinationIPv6Address */
  157         u_int32_t       if_index_in;    /* ingressInterface */
  158         u_int32_t       if_index_out;   /* egressInterface */
  159         u_int64_t       flow_packets;   /* packetDeltaCount */
  160         u_int64_t       flow_octets;    /* octetDeltaCount */
  161         int64_t         flow_start;     /* flowStartMilliseconds */
  162         int64_t         flow_finish;    /* flowEndMilliseconds */
  163         u_int16_t       src_port;       /* sourceTransportPort */
  164         u_int16_t       dest_port;      /* destinationTransportPort */
  165         u_int8_t        tos;            /* ipClassOfService */
  166         u_int8_t        protocol;       /* protocolIdentifier */
  167         /* XXX padding needed? */
  168 } __packed;
  169 
  170 #ifdef _KERNEL
  171 
  172 /*
  173  * Locks used to protect struct members and global data
  174  *       N       net lock
  175  *       p       this pflow_softc' `sc_lock'
  176  */
  177 
  178 struct pflow_softc {
  179         struct rwlock            sc_lock;
  180 
  181         int                      sc_dying;      /* [N] */
  182         struct ifnet             sc_if;
  183 
  184         unsigned int             sc_count;
  185         unsigned int             sc_count4;
  186         unsigned int             sc_count6;
  187         unsigned int             sc_maxcount;
  188         unsigned int             sc_maxcount4;
  189         unsigned int             sc_maxcount6;
  190         u_int64_t                sc_gcounter;
  191         u_int32_t                sc_sequence;
  192         struct timeout           sc_tmo;
  193         struct timeout           sc_tmo6;
  194         struct timeout           sc_tmo_tmpl;
  195         struct mbuf_queue        sc_outputqueue;
  196         struct task              sc_outputtask;
  197         struct socket           *so;            /* [p] */
  198         struct mbuf             *send_nam;
  199         struct sockaddr         *sc_flowsrc;
  200         struct sockaddr         *sc_flowdst;
  201         struct pflow_ipfix_tmpl  sc_tmpl_ipfix;
  202         u_int8_t                 sc_version;
  203         struct mbuf             *sc_mbuf;       /* current cumulative mbuf */
  204         struct mbuf             *sc_mbuf6;      /* current cumulative mbuf */
  205         SLIST_ENTRY(pflow_softc) sc_next;
  206 };
  207 
  208 extern struct pflow_softc       *pflowif;
  209 
  210 #endif /* _KERNEL */
  211 
  212 struct pflow_header {
  213         u_int16_t       version;
  214         u_int16_t       count;
  215         u_int32_t       uptime_ms;
  216         u_int32_t       time_sec;
  217         u_int32_t       time_nanosec;
  218         u_int32_t       flow_sequence;
  219         u_int8_t        engine_type;
  220         u_int8_t        engine_id;
  221         u_int8_t        reserved1;
  222         u_int8_t        reserved2;
  223 } __packed;
  224 
  225 #define PFLOW_HDRLEN sizeof(struct pflow_header)
  226 
  227 struct pflow_v10_header {
  228         u_int16_t       version;
  229         u_int16_t       length;
  230         u_int32_t       time_sec;
  231         u_int32_t       flow_sequence;
  232         u_int32_t       observation_dom;
  233 } __packed;
  234 
  235 #define PFLOW_IPFIX_HDRLEN sizeof(struct pflow_v10_header)
  236 
  237 struct pflowstats {
  238         u_int64_t       pflow_flows;
  239         u_int64_t       pflow_packets;
  240         u_int64_t       pflow_onomem;
  241         u_int64_t       pflow_oerrors;
  242 };
  243 
  244 /* Supported flow protocols */
  245 #define PFLOW_PROTO_5   5       /* original pflow */
  246 #define PFLOW_PROTO_10  10      /* ipfix */
  247 #define PFLOW_PROTO_MAX 11
  248 
  249 #define PFLOW_PROTO_DEFAULT PFLOW_PROTO_5
  250 
  251 struct pflow_protos {
  252         const char      *ppr_name;
  253         u_int8_t         ppr_proto;
  254 };
  255 
  256 #define PFLOW_PROTOS {                                 \
  257                 { "5",  PFLOW_PROTO_5 },               \
  258                 { "10", PFLOW_PROTO_10 },              \
  259 }
  260 
  261 /*
  262  * Configuration structure for SIOCSETPFLOW SIOCGETPFLOW
  263  */
  264 struct pflowreq {
  265         struct sockaddr_storage flowsrc;
  266         struct sockaddr_storage flowdst;
  267         u_int16_t               addrmask;
  268         u_int8_t                version;
  269 #define PFLOW_MASK_SRCIP        0x01
  270 #define PFLOW_MASK_DSTIP        0x02
  271 #define PFLOW_MASK_VERSION      0x04
  272 };
  273 
  274 #ifdef _KERNEL
  275 int export_pflow(struct pf_state *);
  276 int pflow_sysctl(int *, u_int,  void *, size_t *, void *, size_t);
  277 #endif /* _KERNEL */
  278 
  279 #endif /* _NET_IF_PFLOW_H_ */

Cache object: b5fdcdcbf3fc4ad31e26e48213a1dc2f


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.