X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvpp%2Fstats%2Fstats.h;h=911706cbb09104326f774a7a37ec881fbdac1df9;hb=2fee16787ed0d622631223567635a77e14c8c076;hp=167b09bd11cdb52853243255a1c78835201c2125;hpb=8a19f12a0cfe6d611f6e266931af691fb69a74ad;p=vpp.git diff --git a/src/vpp/stats/stats.h b/src/vpp/stats/stats.h index 167b09bd11c..911706cbb09 100644 --- a/src/vpp/stats/stats.h +++ b/src/vpp/stats/stats.h @@ -22,10 +22,15 @@ #include #include #include +#include #include #include -#include #include +#include +#include + +/* Default socket to exchange segment fd */ +#define STAT_SEGMENT_SOCKET_FILE "/run/vpp/stats.sock" typedef struct { @@ -36,26 +41,19 @@ typedef struct int tag; } data_structure_lock_t; -typedef struct -{ - vpe_client_registration_t client; - u8 stats_registrations; -#define INTERFACE_SIMPLE_COUNTERS (1 << 0) -#define INTERFACE_COMBINED_COUNTERS (1 << 1) -#define IP4_FIB_COUNTERS (1 << 2) -#define IP4_NBR_COUNTERS (1 << 3) -#define IP6_FIB_COUNTERS (1 << 4) -#define IP6_NBR_COUNTERS (1 << 5) - -} vpe_client_stats_registration_t; - +/** + * @brief stats request registration indexes + * + */ /* from .../vnet/vnet/ip/lookup.c. Yuck */ +/* *INDENT-OFF* */ typedef CLIB_PACKED (struct - { - ip4_address_t address; -u32 address_length: 6; -u32 index: 26; - }) ip4_route_t; +{ + ip4_address_t address; + u32 address_length: 6; + u32 index: 26; +}) ip4_route_t; +/* *INDENT-ON* */ typedef struct { @@ -64,16 +62,44 @@ typedef struct u32 index; } ip6_route_t; - typedef struct { ip4_route_t *ip4routes; ip6_route_t *ip6routes; + mfib_prefix_t *mroutes; fib_table_t **fibs; + mfib_table_t **mfibs; hash_pair_t **pvec; uword *results; } do_ip46_fibs_t; +typedef struct +{ + u16 msg_id; + u32 size; + u32 client_index; + u32 context; + i32 retval; +} client_registration_reply_t; + +typedef enum +{ +#define stats_reg(n) IDX_##n, +#include +#undef stats_reg + STATS_REG_N_IDX, +} stats_reg_index_t; + +typedef struct +{ + //Standard client information + uword *client_hash; + vpe_client_registration_t *clients; + u32 item; + +} vpe_client_stats_registration_t; + + typedef struct { void *mheap; @@ -83,9 +109,41 @@ typedef struct u32 stats_poll_interval_in_seconds; u32 enable_poller; - uword *stats_registration_hash; - vpe_client_stats_registration_t *stats_registrations; - vpe_client_stats_registration_t **regs; + /* + * stats_registrations is a vector, indexed by + * IDX_xxxx_COUNTER generated for each streaming + * stat a client can register for. (see stats.reg) + * + * The values in the vector refer to pools. + * + * The pool is of type vpe_client_stats_registration_t + * + * This typedef consists of: + * + * u32 item: This is the instance of the IDX_xxxx_COUNTER a + * client is interested in. + * vpe_client_registration_t *clients: The list of clients interested. + * + * e.g. + * stats_registrations[IDX_INTERFACE_SIMPLE_COUNTERS] refers to a pool + * containing elements: + * + * u32 item = sw_if_index1 + * clients = ["clienta","clientb"] + * + * When clients == NULL the pool element is freed. When the pool is empty + * + * ie + * 0 == pool_elts(stats_registrations[IDX_INTERFACE_SIMPLE_COUNTERS] + * + * then there is no need to process INTERFACE_SIMPLE_COUNTERS + * + * Note that u32 item = ~0 is the simple case for ALL interfaces or fibs. + * + */ + + uword **stats_registration_hash; + vpe_client_stats_registration_t **stats_registrations; /* control-plane data structure lock */ data_structure_lock_t *data_structure_lock; @@ -96,6 +154,41 @@ typedef struct /* Vectors for Distribution funcs: do_ip4_fibs and do_ip6_fibs. */ do_ip46_fibs_t do_ip46_fibs; + /* + Working vector vars so as to not thrash memory allocator. + Has effect of making "static" + */ + vpe_client_stats_registration_t **regs_tmp; + vpe_client_registration_t **clients_tmp; + + /* statistics segment */ + ssvm_private_t stat_segment; + uword *counter_vector_by_name; + clib_spinlock_t *stat_segment_lockp; + clib_socket_t *socket; + u8 *socket_name; + uword memory_size; + u8 serialize_nodes; + + /* Pointers to scalar stats maintained by the stat thread */ + f64 *input_rate_ptr; + f64 *last_runtime_ptr; + f64 *last_runtime_stats_clear_ptr; + f64 *vector_rate_ptr; + f64 *heartbeat_ptr; + u64 last_input_packets; + + /* Pointers to vector stats maintained by the stat thread */ + u8 *serialized_nodes; + vlib_main_t **stat_vms; + vlib_node_t ***node_dups; + + f64 *vectors_per_node; + f64 *vector_rate_in; + f64 *vector_rate_out; + f64 *vector_rate_drop; + f64 *vector_rate_punt; + /* convenience */ vlib_main_t *vlib_main; vnet_main_t *vnet_main; @@ -103,10 +196,33 @@ typedef struct api_main_t *api_main; } stats_main_t; -stats_main_t stats_main; +extern stats_main_t stats_main; + +/* Default stat segment 32m */ +#define STAT_SEGMENT_DEFAULT_SIZE (32<<20) + +#define STAT_SEGMENT_OPAQUE_LOCK 0 +#define STAT_SEGMENT_OPAQUE_DIR 1 +#define STAT_SEGMENT_OPAQUE_EPOCH 2 + +typedef enum +{ + STAT_DIR_TYPE_ILLEGAL = 0, + STAT_DIR_TYPE_SCALAR_POINTER, + STAT_DIR_TYPE_VECTOR_POINTER, + STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE, + STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED, + STAT_DIR_TYPE_ERROR_INDEX, + STAT_DIR_TYPE_SERIALIZED_NODES, +} stat_directory_type_t; + +typedef struct +{ + stat_directory_type_t type; + void *value; +} stat_segment_directory_entry_t; -void dslock (stats_main_t * sm, int release_hint, int tag); -void dsunlock (stats_main_t * sm); +void do_stat_segment_updates (stats_main_t * sm); #endif /* __included_stats_h__ */