]> git.proxmox.com Git - mirror_ovs.git/blob - lib/sflow.h
netdev: Take responsibility for polling MII registers.
[mirror_ovs.git] / lib / sflow.h
1 /* Copyright (c) 2002-2009 InMon Corp. Licensed under the terms of the InMon sFlow licence: */
2 /* http://www.inmon.com/technology/sflowlicense.txt */
3
4 #ifndef SFLOW_H
5 #define SFLOW_H 1
6
7 enum SFLAddress_type {
8 SFLADDRESSTYPE_IP_V4 = 1,
9 SFLADDRESSTYPE_IP_V6 = 2
10 };
11
12 typedef struct {
13 u_int32_t addr;
14 } SFLIPv4;
15
16 typedef struct {
17 u_char addr[16];
18 } SFLIPv6;
19
20 typedef union _SFLAddress_value {
21 SFLIPv4 ip_v4;
22 SFLIPv6 ip_v6;
23 } SFLAddress_value;
24
25 typedef struct _SFLAddress {
26 u_int32_t type; /* enum SFLAddress_type */
27 SFLAddress_value address;
28 } SFLAddress;
29
30 /* Packet header data */
31
32 #define SFL_DEFAULT_HEADER_SIZE 128
33 #define SFL_DEFAULT_COLLECTOR_PORT 6343
34 #define SFL_DEFAULT_SAMPLING_RATE 400
35 #define SFL_DEFAULT_POLLING_INTERVAL 30
36
37 /* The header protocol describes the format of the sampled header */
38 enum SFLHeader_protocol {
39 SFLHEADER_ETHERNET_ISO8023 = 1,
40 SFLHEADER_ISO88024_TOKENBUS = 2,
41 SFLHEADER_ISO88025_TOKENRING = 3,
42 SFLHEADER_FDDI = 4,
43 SFLHEADER_FRAME_RELAY = 5,
44 SFLHEADER_X25 = 6,
45 SFLHEADER_PPP = 7,
46 SFLHEADER_SMDS = 8,
47 SFLHEADER_AAL5 = 9,
48 SFLHEADER_AAL5_IP = 10, /* e.g. Cisco AAL5 mux */
49 SFLHEADER_IPv4 = 11,
50 SFLHEADER_IPv6 = 12,
51 SFLHEADER_MPLS = 13
52 };
53
54 /* raw sampled header */
55
56 typedef struct _SFLSampled_header {
57 u_int32_t header_protocol; /* (enum SFLHeader_protocol) */
58 u_int32_t frame_length; /* Original length of packet before sampling */
59 u_int32_t stripped; /* header/trailer bytes stripped by sender */
60 u_int32_t header_length; /* length of sampled header bytes to follow */
61 u_int8_t *header_bytes; /* Header bytes */
62 } SFLSampled_header;
63
64 /* decoded ethernet header */
65
66 typedef struct _SFLSampled_ethernet {
67 u_int32_t eth_len; /* The length of the MAC packet excluding
68 lower layer encapsulations */
69 u_int8_t src_mac[8]; /* 6 bytes + 2 pad */
70 u_int8_t dst_mac[8];
71 u_int32_t eth_type;
72 } SFLSampled_ethernet;
73
74 /* decoded IP version 4 header */
75
76 typedef struct _SFLSampled_ipv4 {
77 u_int32_t length; /* The length of the IP packet
78 excluding lower layer encapsulations */
79 u_int32_t protocol; /* IP Protocol type (for example, TCP = 6, UDP = 17) */
80 SFLIPv4 src_ip; /* Source IP Address */
81 SFLIPv4 dst_ip; /* Destination IP Address */
82 u_int32_t src_port; /* TCP/UDP source port number or equivalent */
83 u_int32_t dst_port; /* TCP/UDP destination port number or equivalent */
84 u_int32_t tcp_flags; /* TCP flags */
85 u_int32_t tos; /* IP type of service */
86 } SFLSampled_ipv4;
87
88 /* decoded IP version 6 data */
89
90 typedef struct _SFLSampled_ipv6 {
91 u_int32_t length; /* The length of the IP packet
92 excluding lower layer encapsulations */
93 u_int32_t protocol; /* IP Protocol type (for example, TCP = 6, UDP = 17) */
94 SFLIPv6 src_ip; /* Source IP Address */
95 SFLIPv6 dst_ip; /* Destination IP Address */
96 u_int32_t src_port; /* TCP/UDP source port number or equivalent */
97 u_int32_t dst_port; /* TCP/UDP destination port number or equivalent */
98 u_int32_t tcp_flags; /* TCP flags */
99 u_int32_t priority; /* IP priority */
100 } SFLSampled_ipv6;
101
102 /* Extended data types */
103
104 /* Extended switch data */
105
106 typedef struct _SFLExtended_switch {
107 u_int32_t src_vlan; /* The 802.1Q VLAN id of incomming frame */
108 u_int32_t src_priority; /* The 802.1p priority */
109 u_int32_t dst_vlan; /* The 802.1Q VLAN id of outgoing frame */
110 u_int32_t dst_priority; /* The 802.1p priority */
111 } SFLExtended_switch;
112
113 /* Extended router data */
114
115 typedef struct _SFLExtended_router {
116 SFLAddress nexthop; /* IP address of next hop router */
117 u_int32_t src_mask; /* Source address prefix mask bits */
118 u_int32_t dst_mask; /* Destination address prefix mask bits */
119 } SFLExtended_router;
120
121 /* Extended gateway data */
122 enum SFLExtended_as_path_segment_type {
123 SFLEXTENDED_AS_SET = 1, /* Unordered set of ASs */
124 SFLEXTENDED_AS_SEQUENCE = 2 /* Ordered sequence of ASs */
125 };
126
127 typedef struct _SFLExtended_as_path_segment {
128 u_int32_t type; /* enum SFLExtended_as_path_segment_type */
129 u_int32_t length; /* number of AS numbers in set/sequence */
130 union {
131 u_int32_t *set;
132 u_int32_t *seq;
133 } as;
134 } SFLExtended_as_path_segment;
135
136 typedef struct _SFLExtended_gateway {
137 SFLAddress nexthop; /* Address of the border router that should
138 be used for the destination network */
139 u_int32_t as; /* AS number for this gateway */
140 u_int32_t src_as; /* AS number of source (origin) */
141 u_int32_t src_peer_as; /* AS number of source peer */
142 u_int32_t dst_as_path_segments; /* number of segments in path */
143 SFLExtended_as_path_segment *dst_as_path; /* list of seqs or sets */
144 u_int32_t communities_length; /* number of communities */
145 u_int32_t *communities; /* set of communities */
146 u_int32_t localpref; /* LocalPref associated with this route */
147 } SFLExtended_gateway;
148
149 typedef struct _SFLString {
150 u_int32_t len;
151 char *str;
152 } SFLString;
153
154 /* Extended user data */
155
156 typedef struct _SFLExtended_user {
157 u_int32_t src_charset; /* MIBEnum value of character set used to encode a string - See RFC 2978
158 Where possible UTF-8 encoding (MIBEnum=106) should be used. A value
159 of zero indicates an unknown encoding. */
160 SFLString src_user;
161 u_int32_t dst_charset;
162 SFLString dst_user;
163 } SFLExtended_user;
164
165 /* Extended URL data */
166
167 enum SFLExtended_url_direction {
168 SFLEXTENDED_URL_SRC = 1, /* URL is associated with source address */
169 SFLEXTENDED_URL_DST = 2 /* URL is associated with destination address */
170 };
171
172 typedef struct _SFLExtended_url {
173 u_int32_t direction; /* enum SFLExtended_url_direction */
174 SFLString url; /* URL associated with the packet flow.
175 Must be URL encoded */
176 SFLString host; /* The host field from the HTTP header */
177 } SFLExtended_url;
178
179 /* Extended MPLS data */
180
181 typedef struct _SFLLabelStack {
182 u_int32_t depth;
183 u_int32_t *stack; /* first entry is top of stack - see RFC 3032 for encoding */
184 } SFLLabelStack;
185
186 typedef struct _SFLExtended_mpls {
187 SFLAddress nextHop; /* Address of the next hop */
188 SFLLabelStack in_stack;
189 SFLLabelStack out_stack;
190 } SFLExtended_mpls;
191
192 /* Extended NAT data
193 Packet header records report addresses as seen at the sFlowDataSource.
194 The extended_nat structure reports on translated source and/or destination
195 addesses for this packet. If an address was not translated it should
196 be equal to that reported for the header. */
197
198 typedef struct _SFLExtended_nat {
199 SFLAddress src; /* Source address */
200 SFLAddress dst; /* Destination address */
201 } SFLExtended_nat;
202
203 /* additional Extended MPLS stucts */
204
205 typedef struct _SFLExtended_mpls_tunnel {
206 SFLString tunnel_lsp_name; /* Tunnel name */
207 u_int32_t tunnel_id; /* Tunnel ID */
208 u_int32_t tunnel_cos; /* Tunnel COS value */
209 } SFLExtended_mpls_tunnel;
210
211 typedef struct _SFLExtended_mpls_vc {
212 SFLString vc_instance_name; /* VC instance name */
213 u_int32_t vll_vc_id; /* VLL/VC instance ID */
214 u_int32_t vc_label_cos; /* VC Label COS value */
215 } SFLExtended_mpls_vc;
216
217 /* Extended MPLS FEC
218 - Definitions from MPLS-FTN-STD-MIB mplsFTNTable */
219
220 typedef struct _SFLExtended_mpls_FTN {
221 SFLString mplsFTNDescr;
222 u_int32_t mplsFTNMask;
223 } SFLExtended_mpls_FTN;
224
225 /* Extended MPLS LVP FEC
226 - Definition from MPLS-LDP-STD-MIB mplsFecTable
227 Note: mplsFecAddrType, mplsFecAddr information available
228 from packet header */
229
230 typedef struct _SFLExtended_mpls_LDP_FEC {
231 u_int32_t mplsFecAddrPrefixLength;
232 } SFLExtended_mpls_LDP_FEC;
233
234 /* Extended VLAN tunnel information
235 Record outer VLAN encapsulations that have
236 been stripped. extended_vlantunnel information
237 should only be reported if all the following conditions are satisfied:
238 1. The packet has nested vlan tags, AND
239 2. The reporting device is VLAN aware, AND
240 3. One or more VLAN tags have been stripped, either
241 because they represent proprietary encapsulations, or
242 because switch hardware automatically strips the outer VLAN
243 encapsulation.
244 Reporting extended_vlantunnel information is not a substitute for
245 reporting extended_switch information. extended_switch data must
246 always be reported to describe the ingress/egress VLAN information
247 for the packet. The extended_vlantunnel information only applies to
248 nested VLAN tags, and then only when one or more tags has been
249 stripped. */
250
251 typedef SFLLabelStack SFLVlanStack;
252 typedef struct _SFLExtended_vlan_tunnel {
253 SFLVlanStack stack; /* List of stripped 802.1Q TPID/TCI layers. Each
254 TPID,TCI pair is represented as a single 32 bit
255 integer. Layers listed from outermost to
256 innermost. */
257 } SFLExtended_vlan_tunnel;
258
259 enum SFLFlow_type_tag {
260 /* enterprise = 0, format = ... */
261 SFLFLOW_HEADER = 1, /* Packet headers are sampled */
262 SFLFLOW_ETHERNET = 2, /* MAC layer information */
263 SFLFLOW_IPV4 = 3, /* IP version 4 data */
264 SFLFLOW_IPV6 = 4, /* IP version 6 data */
265 SFLFLOW_EX_SWITCH = 1001, /* Extended switch information */
266 SFLFLOW_EX_ROUTER = 1002, /* Extended router information */
267 SFLFLOW_EX_GATEWAY = 1003, /* Extended gateway router information */
268 SFLFLOW_EX_USER = 1004, /* Extended TACAS/RADIUS user information */
269 SFLFLOW_EX_URL = 1005, /* Extended URL information */
270 SFLFLOW_EX_MPLS = 1006, /* Extended MPLS information */
271 SFLFLOW_EX_NAT = 1007, /* Extended NAT information */
272 SFLFLOW_EX_MPLS_TUNNEL = 1008, /* additional MPLS information */
273 SFLFLOW_EX_MPLS_VC = 1009,
274 SFLFLOW_EX_MPLS_FTN = 1010,
275 SFLFLOW_EX_MPLS_LDP_FEC = 1011,
276 SFLFLOW_EX_VLAN_TUNNEL = 1012, /* VLAN stack */
277 };
278
279 typedef union _SFLFlow_type {
280 SFLSampled_header header;
281 SFLSampled_ethernet ethernet;
282 SFLSampled_ipv4 ipv4;
283 SFLSampled_ipv6 ipv6;
284 SFLExtended_switch sw;
285 SFLExtended_router router;
286 SFLExtended_gateway gateway;
287 SFLExtended_user user;
288 SFLExtended_url url;
289 SFLExtended_mpls mpls;
290 SFLExtended_nat nat;
291 SFLExtended_mpls_tunnel mpls_tunnel;
292 SFLExtended_mpls_vc mpls_vc;
293 SFLExtended_mpls_FTN mpls_ftn;
294 SFLExtended_mpls_LDP_FEC mpls_ldp_fec;
295 SFLExtended_vlan_tunnel vlan_tunnel;
296 } SFLFlow_type;
297
298 typedef struct _SFLFlow_sample_element {
299 struct _SFLFlow_sample_element *nxt;
300 u_int32_t tag; /* SFLFlow_type_tag */
301 u_int32_t length;
302 SFLFlow_type flowType;
303 } SFLFlow_sample_element;
304
305 enum SFL_sample_tag {
306 SFLFLOW_SAMPLE = 1, /* enterprise = 0 : format = 1 */
307 SFLCOUNTERS_SAMPLE = 2, /* enterprise = 0 : format = 2 */
308 SFLFLOW_SAMPLE_EXPANDED = 3, /* enterprise = 0 : format = 3 */
309 SFLCOUNTERS_SAMPLE_EXPANDED = 4 /* enterprise = 0 : format = 4 */
310 };
311
312 /* Format of a single flow sample */
313
314 typedef struct _SFLFlow_sample {
315 /* u_int32_t tag; */ /* SFL_sample_tag -- enterprise = 0 : format = 1 */
316 /* u_int32_t length; */
317 u_int32_t sequence_number; /* Incremented with each flow sample
318 generated */
319 u_int32_t source_id; /* fsSourceId */
320 u_int32_t sampling_rate; /* fsPacketSamplingRate */
321 u_int32_t sample_pool; /* Total number of packets that could have been
322 sampled (i.e. packets skipped by sampling
323 process + total number of samples) */
324 u_int32_t drops; /* Number of times a packet was dropped due to
325 lack of resources */
326 u_int32_t input; /* SNMP ifIndex of input interface.
327 0 if interface is not known. */
328 u_int32_t output; /* SNMP ifIndex of output interface,
329 0 if interface is not known.
330 Set most significant bit to indicate
331 multiple destination interfaces
332 (i.e. in case of broadcast or multicast)
333 and set lower order bits to indicate
334 number of destination interfaces.
335 Examples:
336 0x00000002 indicates ifIndex = 2
337 0x00000000 ifIndex unknown.
338 0x80000007 indicates a packet sent
339 to 7 interfaces.
340 0x80000000 indicates a packet sent to
341 an unknown number of
342 interfaces greater than 1.*/
343 u_int32_t num_elements;
344 SFLFlow_sample_element *elements;
345 } SFLFlow_sample;
346
347 /* same thing, but the expanded version (for full 32-bit ifIndex numbers) */
348
349 typedef struct _SFLFlow_sample_expanded {
350 /* u_int32_t tag; */ /* SFL_sample_tag -- enterprise = 0 : format = 1 */
351 /* u_int32_t length; */
352 u_int32_t sequence_number; /* Incremented with each flow sample
353 generated */
354 u_int32_t ds_class; /* EXPANDED */
355 u_int32_t ds_index; /* EXPANDED */
356 u_int32_t sampling_rate; /* fsPacketSamplingRate */
357 u_int32_t sample_pool; /* Total number of packets that could have been
358 sampled (i.e. packets skipped by sampling
359 process + total number of samples) */
360 u_int32_t drops; /* Number of times a packet was dropped due to
361 lack of resources */
362 u_int32_t inputFormat; /* EXPANDED */
363 u_int32_t input; /* SNMP ifIndex of input interface.
364 0 if interface is not known. */
365 u_int32_t outputFormat; /* EXPANDED */
366 u_int32_t output; /* SNMP ifIndex of output interface,
367 0 if interface is not known. */
368 u_int32_t num_elements;
369 SFLFlow_sample_element *elements;
370 } SFLFlow_sample_expanded;
371
372 /* Counter types */
373
374 /* Generic interface counters - see RFC 1573, 2233 */
375
376 typedef struct _SFLIf_counters {
377 u_int32_t ifIndex;
378 u_int32_t ifType;
379 u_int64_t ifSpeed;
380 u_int32_t ifDirection; /* Derived from MAU MIB (RFC 2668)
381 0 = unknown, 1 = full-duplex,
382 2 = half-duplex, 3 = in, 4 = out */
383 u_int32_t ifStatus; /* bit field with the following bits assigned:
384 bit 0 = ifAdminStatus (0 = down, 1 = up)
385 bit 1 = ifOperStatus (0 = down, 1 = up) */
386 u_int64_t ifInOctets;
387 u_int32_t ifInUcastPkts;
388 u_int32_t ifInMulticastPkts;
389 u_int32_t ifInBroadcastPkts;
390 u_int32_t ifInDiscards;
391 u_int32_t ifInErrors;
392 u_int32_t ifInUnknownProtos;
393 u_int64_t ifOutOctets;
394 u_int32_t ifOutUcastPkts;
395 u_int32_t ifOutMulticastPkts;
396 u_int32_t ifOutBroadcastPkts;
397 u_int32_t ifOutDiscards;
398 u_int32_t ifOutErrors;
399 u_int32_t ifPromiscuousMode;
400 } SFLIf_counters;
401
402 /* Ethernet interface counters - see RFC 2358 */
403 typedef struct _SFLEthernet_counters {
404 u_int32_t dot3StatsAlignmentErrors;
405 u_int32_t dot3StatsFCSErrors;
406 u_int32_t dot3StatsSingleCollisionFrames;
407 u_int32_t dot3StatsMultipleCollisionFrames;
408 u_int32_t dot3StatsSQETestErrors;
409 u_int32_t dot3StatsDeferredTransmissions;
410 u_int32_t dot3StatsLateCollisions;
411 u_int32_t dot3StatsExcessiveCollisions;
412 u_int32_t dot3StatsInternalMacTransmitErrors;
413 u_int32_t dot3StatsCarrierSenseErrors;
414 u_int32_t dot3StatsFrameTooLongs;
415 u_int32_t dot3StatsInternalMacReceiveErrors;
416 u_int32_t dot3StatsSymbolErrors;
417 } SFLEthernet_counters;
418
419 /* Token ring counters - see RFC 1748 */
420
421 typedef struct _SFLTokenring_counters {
422 u_int32_t dot5StatsLineErrors;
423 u_int32_t dot5StatsBurstErrors;
424 u_int32_t dot5StatsACErrors;
425 u_int32_t dot5StatsAbortTransErrors;
426 u_int32_t dot5StatsInternalErrors;
427 u_int32_t dot5StatsLostFrameErrors;
428 u_int32_t dot5StatsReceiveCongestions;
429 u_int32_t dot5StatsFrameCopiedErrors;
430 u_int32_t dot5StatsTokenErrors;
431 u_int32_t dot5StatsSoftErrors;
432 u_int32_t dot5StatsHardErrors;
433 u_int32_t dot5StatsSignalLoss;
434 u_int32_t dot5StatsTransmitBeacons;
435 u_int32_t dot5StatsRecoverys;
436 u_int32_t dot5StatsLobeWires;
437 u_int32_t dot5StatsRemoves;
438 u_int32_t dot5StatsSingles;
439 u_int32_t dot5StatsFreqErrors;
440 } SFLTokenring_counters;
441
442 /* 100 BaseVG interface counters - see RFC 2020 */
443
444 typedef struct _SFLVg_counters {
445 u_int32_t dot12InHighPriorityFrames;
446 u_int64_t dot12InHighPriorityOctets;
447 u_int32_t dot12InNormPriorityFrames;
448 u_int64_t dot12InNormPriorityOctets;
449 u_int32_t dot12InIPMErrors;
450 u_int32_t dot12InOversizeFrameErrors;
451 u_int32_t dot12InDataErrors;
452 u_int32_t dot12InNullAddressedFrames;
453 u_int32_t dot12OutHighPriorityFrames;
454 u_int64_t dot12OutHighPriorityOctets;
455 u_int32_t dot12TransitionIntoTrainings;
456 u_int64_t dot12HCInHighPriorityOctets;
457 u_int64_t dot12HCInNormPriorityOctets;
458 u_int64_t dot12HCOutHighPriorityOctets;
459 } SFLVg_counters;
460
461 typedef struct _SFLVlan_counters {
462 u_int32_t vlan_id;
463 u_int64_t octets;
464 u_int32_t ucastPkts;
465 u_int32_t multicastPkts;
466 u_int32_t broadcastPkts;
467 u_int32_t discards;
468 } SFLVlan_counters;
469
470 /* Counters data */
471
472 enum SFLCounters_type_tag {
473 /* enterprise = 0, format = ... */
474 SFLCOUNTERS_GENERIC = 1,
475 SFLCOUNTERS_ETHERNET = 2,
476 SFLCOUNTERS_TOKENRING = 3,
477 SFLCOUNTERS_VG = 4,
478 SFLCOUNTERS_VLAN = 5
479 };
480
481 typedef union _SFLCounters_type {
482 SFLIf_counters generic;
483 SFLEthernet_counters ethernet;
484 SFLTokenring_counters tokenring;
485 SFLVg_counters vg;
486 SFLVlan_counters vlan;
487 } SFLCounters_type;
488
489 typedef struct _SFLCounters_sample_element {
490 struct _SFLCounters_sample_element *nxt; /* linked list */
491 u_int32_t tag; /* SFLCounters_type_tag */
492 u_int32_t length;
493 SFLCounters_type counterBlock;
494 } SFLCounters_sample_element;
495
496 typedef struct _SFLCounters_sample {
497 /* u_int32_t tag; */ /* SFL_sample_tag -- enterprise = 0 : format = 2 */
498 /* u_int32_t length; */
499 u_int32_t sequence_number; /* Incremented with each counters sample
500 generated by this source_id */
501 u_int32_t source_id; /* fsSourceId */
502 u_int32_t num_elements;
503 SFLCounters_sample_element *elements;
504 } SFLCounters_sample;
505
506 /* same thing, but the expanded version, so ds_index can be a full 32 bits */
507 typedef struct _SFLCounters_sample_expanded {
508 /* u_int32_t tag; */ /* SFL_sample_tag -- enterprise = 0 : format = 2 */
509 /* u_int32_t length; */
510 u_int32_t sequence_number; /* Incremented with each counters sample
511 generated by this source_id */
512 u_int32_t ds_class; /* EXPANDED */
513 u_int32_t ds_index; /* EXPANDED */
514 u_int32_t num_elements;
515 SFLCounters_sample_element *elements;
516 } SFLCounters_sample_expanded;
517
518 #define SFLADD_ELEMENT(_sm, _el) do { (_el)->nxt = (_sm)->elements; (_sm)->elements = (_el); } while(0)
519
520 /* Format of a sample datagram */
521
522 enum SFLDatagram_version {
523 SFLDATAGRAM_VERSION2 = 2,
524 SFLDATAGRAM_VERSION4 = 4,
525 SFLDATAGRAM_VERSION5 = 5
526 };
527
528 typedef struct _SFLSample_datagram_hdr {
529 u_int32_t datagram_version; /* (enum SFLDatagram_version) = VERSION5 = 5 */
530 SFLAddress agent_address; /* IP address of sampling agent */
531 u_int32_t sub_agent_id; /* Used to distinguishing between datagram
532 streams from separate agent sub entities
533 within an device. */
534 u_int32_t sequence_number; /* Incremented with each sample datagram
535 generated */
536 u_int32_t uptime; /* Current time (in milliseconds since device
537 last booted). Should be set as close to
538 datagram transmission time as possible.*/
539 u_int32_t num_records; /* Number of tag-len-val flow/counter records to follow */
540 } SFLSample_datagram_hdr;
541
542 #define SFL_MAX_DATAGRAM_SIZE 1500
543 #define SFL_MIN_DATAGRAM_SIZE 200
544 #define SFL_DEFAULT_DATAGRAM_SIZE 1400
545
546 #define SFL_DATA_PAD 400
547
548 #endif /* SFLOW_H */