-/* Copyright (c) 2002-2009 InMon Corp. Licensed under the terms of the InMon sFlow licence: */
-/* http://www.inmon.com/technology/sflowlicense.txt */
+/* Copyright (c) 2002-2009 InMon Corp. Licensed under the terms of either the
+ * Sun Industry Standards Source License 1.1, that is available at:
+ * http://host-sflow.sourceforge.net/sissl.html
+ * or the InMon sFlow License, that is available at:
+ * http://www.inmon.com/technology/sflowlicense.txt
+ */
#ifndef SFLOW_H
#define SFLOW_H 1
+#ifdef _WIN32
+#include "windefs.h"
+#endif
+
+#include "openvswitch/types.h"
+
+typedef enum {
+ SFL_DSCLASS_IFINDEX = 0,
+ SFL_DSCLASS_VLAN = 1,
+ SFL_DSCLASS_PHYSICAL_ENTITY = 2,
+ SFL_DSCLASS_LOGICAL_ENTITY = 3
+} SFL_DSCLASS;
+
enum SFLAddress_type {
SFLADDRESSTYPE_IP_V4 = 1,
SFLADDRESSTYPE_IP_V6 = 2
/* decoded ethernet header */
typedef struct _SFLSampled_ethernet {
- u_int32_t eth_len; /* The length of the MAC packet excluding
+ u_int32_t eth_len; /* The length of the MAC packet excluding
lower layer encapsulations */
- u_int8_t src_mac[8]; /* 6 bytes + 2 pad */
- u_int8_t dst_mac[8];
+ struct eth_addr src_mac; /* 6 bytes */
+ u_int8_t pad1[2]; /* 2 pad */
+ struct eth_addr dst_mac;
+ u_int8_t pad2[2];
u_int32_t eth_type;
} SFLSampled_ethernet;
SFLEXTENDED_AS_SET = 1, /* Unordered set of ASs */
SFLEXTENDED_AS_SEQUENCE = 2 /* Ordered sequence of ASs */
};
-
+
typedef struct _SFLExtended_as_path_segment {
u_int32_t type; /* enum SFLExtended_as_path_segment_type */
u_int32_t length; /* number of AS numbers in set/sequence */
} SFLLabelStack;
typedef struct _SFLExtended_mpls {
- SFLAddress nextHop; /* Address of the next hop */
+ SFLAddress nextHop; /* Address of the next hop */
SFLLabelStack in_stack;
SFLLabelStack out_stack;
} SFLExtended_mpls;
/* Extended NAT data
Packet header records report addresses as seen at the sFlowDataSource.
The extended_nat structure reports on translated source and/or destination
- addesses for this packet. If an address was not translated it should
+ addesses for this packet. If an address was not translated it should
be equal to that reported for the header. */
typedef struct _SFLExtended_nat {
u_int32_t mplsFecAddrPrefixLength;
} SFLExtended_mpls_LDP_FEC;
-/* Extended VLAN tunnel information
- Record outer VLAN encapsulations that have
- been stripped. extended_vlantunnel information
- should only be reported if all the following conditions are satisfied:
- 1. The packet has nested vlan tags, AND
- 2. The reporting device is VLAN aware, AND
- 3. One or more VLAN tags have been stripped, either
- because they represent proprietary encapsulations, or
- because switch hardware automatically strips the outer VLAN
- encapsulation.
- Reporting extended_vlantunnel information is not a substitute for
- reporting extended_switch information. extended_switch data must
- always be reported to describe the ingress/egress VLAN information
- for the packet. The extended_vlantunnel information only applies to
- nested VLAN tags, and then only when one or more tags has been
- stripped. */
+/* Extended VLAN tunnel information
+ Record outer VLAN encapsulations that have
+ been stripped. extended_vlantunnel information
+ should only be reported if all the following conditions are satisfied:
+ 1. The packet has nested vlan tags, AND
+ 2. The reporting device is VLAN aware, AND
+ 3. One or more VLAN tags have been stripped, either
+ because they represent proprietary encapsulations, or
+ because switch hardware automatically strips the outer VLAN
+ encapsulation.
+ Reporting extended_vlantunnel information is not a substitute for
+ reporting extended_switch information. extended_switch data must
+ always be reported to describe the ingress/egress VLAN information
+ for the packet. The extended_vlantunnel information only applies to
+ nested VLAN tags, and then only when one or more tags has been
+ stripped. */
typedef SFLLabelStack SFLVlanStack;
-typedef struct _SFLExtended_vlan_tunnel {
- SFLVlanStack stack; /* List of stripped 802.1Q TPID/TCI layers. Each
- TPID,TCI pair is represented as a single 32 bit
- integer. Layers listed from outermost to
- innermost. */
+typedef struct _SFLExtended_vlan_tunnel {
+ SFLVlanStack stack; /* List of stripped 802.1Q TPID/TCI layers. Each
+ TPID,TCI pair is represented as a single 32 bit
+ integer. Layers listed from outermost to
+ innermost. */
} SFLExtended_vlan_tunnel;
+typedef struct _SFLExtended_vni {
+ uint32_t vni; /* virtual network identifier */
+} SFLExtended_vni;
+
enum SFLFlow_type_tag {
/* enterprise = 0, format = ... */
SFLFLOW_HEADER = 1, /* Packet headers are sampled */
SFLFLOW_EX_MPLS_FTN = 1010,
SFLFLOW_EX_MPLS_LDP_FEC = 1011,
SFLFLOW_EX_VLAN_TUNNEL = 1012, /* VLAN stack */
+ SFLFLOW_EX_IPV4_TUNNEL_EGRESS = 1023, /* http://sflow.org/sflow_tunnels.txt */
+ SFLFLOW_EX_IPV4_TUNNEL_INGRESS = 1024,
+ SFLFLOW_EX_VNI_EGRESS = 1029,
+ SFLFLOW_EX_VNI_INGRESS = 1030,
};
typedef union _SFLFlow_type {
SFLExtended_mpls_FTN mpls_ftn;
SFLExtended_mpls_LDP_FEC mpls_ldp_fec;
SFLExtended_vlan_tunnel vlan_tunnel;
+ SFLExtended_vni tunnel_vni;
} SFLFlow_type;
typedef struct _SFLFlow_sample_element {
SFLFLOW_SAMPLE_EXPANDED = 3, /* enterprise = 0 : format = 3 */
SFLCOUNTERS_SAMPLE_EXPANDED = 4 /* enterprise = 0 : format = 4 */
};
-
+
/* Format of a single flow sample */
typedef struct _SFLFlow_sample {
/* Counter types */
+#define SFL_UNDEF_COUNTER(c) c=-1
+#define SFL_UNDEF_GAUGE(c) c=0
+
/* Generic interface counters - see RFC 1573, 2233 */
typedef struct _SFLIf_counters {
u_int32_t ifPromiscuousMode;
} SFLIf_counters;
+#define SFL_CTR_GENERIC_XDR_SIZE 88
+
/* Ethernet interface counters - see RFC 2358 */
typedef struct _SFLEthernet_counters {
u_int32_t dot3StatsAlignmentErrors;
u_int32_t dot3StatsSymbolErrors;
} SFLEthernet_counters;
+#define SFL_CTR_ETHERNET_XDR_SIZE 52
+
/* Token ring counters - see RFC 1748 */
typedef struct _SFLTokenring_counters {
u_int32_t discards;
} SFLVlan_counters;
+/* OpenFlow port */
+typedef struct {
+ u_int64_t datapath_id;
+ u_int32_t port_no;
+} SFLOpenFlowPort;
+
+#define SFL_CTR_OPENFLOWPORT_XDR_SIZE 12
+
+/* port name */
+typedef struct {
+ SFLString portName;
+} SFLPortName;
+
+#define SFL_MAX_PORTNAME_LEN 255
+
+/* LAG Port Statistics - see http://sflow.org/sflow_lag.txt */
+/* opaque = counter_data; enterprise = 0; format = 7 */
+
+typedef union _SFLLACP_portState {
+ uint32_t all;
+ struct {
+ uint8_t actorAdmin;
+ uint8_t actorOper;
+ uint8_t partnerAdmin;
+ uint8_t partnerOper;
+ } v;
+} SFLLACP_portState;
+
+typedef struct _SFLLACP_counters {
+ struct eth_addr actorSystemID; /* 6 bytes */
+ uint8_t pad1[2];
+ struct eth_addr partnerSystemID; /* 6 bytes */
+ uint8_t pad2[2];
+ uint32_t attachedAggID;
+ SFLLACP_portState portState;
+ uint32_t LACPDUsRx;
+ uint32_t markerPDUsRx;
+ uint32_t markerResponsePDUsRx;
+ uint32_t unknownRx;
+ uint32_t illegalRx;
+ uint32_t LACPDUsTx;
+ uint32_t markerPDUsTx;
+ uint32_t markerResponsePDUsTx;
+} SFLLACP_counters;
+
+#define SFL_CTR_LACP_XDR_SIZE 56
+
+/* Application resource counters */
+
+typedef struct _SFLAPPResources_counters {
+ uint32_t user_time; /* in milliseconds */
+ uint32_t system_time; /* in milliseconds */
+ uint64_t mem_used;
+ uint64_t mem_max;
+ uint32_t fd_open;
+ uint32_t fd_max;
+ uint32_t conn_open;
+ uint32_t conn_max;
+} SFLAPPResources_counters;
+
+#define SFL_CTR_APP_RESOURCES_XDR_SIZE 40
+
+/* OVS datapath stats */
+
+typedef struct _SFLOVSDP_counters {
+ uint32_t n_hit;
+ uint32_t n_missed;
+ uint32_t n_lost;
+ uint32_t n_mask_hit;
+ uint32_t n_flows;
+ uint32_t n_masks;
+} SFLOVSDP_counters;
+
+#define SFL_CTR_OVSDP_XDR_SIZE 24
+
/* Counters data */
enum SFLCounters_type_tag {
SFLCOUNTERS_ETHERNET = 2,
SFLCOUNTERS_TOKENRING = 3,
SFLCOUNTERS_VG = 4,
- SFLCOUNTERS_VLAN = 5
+ SFLCOUNTERS_VLAN = 5,
+ SFLCOUNTERS_LACP = 7,
+ SFLCOUNTERS_OPENFLOWPORT = 1004,
+ SFLCOUNTERS_PORTNAME = 1005,
+ SFLCOUNTERS_APP_RESOURCES = 2203,
+ SFLCOUNTERS_OVSDP = 2207
};
typedef union _SFLCounters_type {
SFLTokenring_counters tokenring;
SFLVg_counters vg;
SFLVlan_counters vlan;
+ SFLLACP_counters lacp;
+ SFLOpenFlowPort ofPort;
+ SFLPortName portName;
+ SFLAPPResources_counters appResources;
+ SFLOVSDP_counters ovsdp;
} SFLCounters_type;
typedef struct _SFLCounters_sample_element {