X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvpp%2Fstats%2Fstats.h;h=f21451d352bcdbfa9ad6633b5ff3669855f46936;hb=58492a83722caf1c49977d73abf931418ce1f8f2;hp=118115bece00bfe49150385415c018b715edf5a4;hpb=7cd468a3d7dee7d6c92f69a0bb7061ae208ec727;p=vpp.git diff --git a/src/vpp/stats/stats.h b/src/vpp/stats/stats.h index 118115bece0..f21451d352b 100644 --- a/src/vpp/stats/stats.h +++ b/src/vpp/stats/stats.h @@ -21,20 +21,80 @@ #include #include #include +#include +#include #include #include -#include #include +#include typedef struct { volatile u32 lock; volatile u32 release_hint; - u32 thread_id; + u32 thread_index; u32 count; int tag; } data_structure_lock_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; +/* *INDENT-ON* */ + +typedef struct +{ + ip6_address_t address; + u32 address_length; + 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; @@ -44,8 +104,41 @@ typedef struct u32 stats_poll_interval_in_seconds; u32 enable_poller; - uword *stats_registration_hash; - vpe_client_registration_t *stats_registrations; + /* + * 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; @@ -53,6 +146,30 @@ typedef struct /* bail out of FIB walk if set */ clib_longjmp_t jmp_buf; + /* 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 */ + uword *directory_vector_by_name; + stat_segment_directory_entry_t *directory_vector; + clib_spinlock_t *stat_segment_lockp; + clib_socket_t *socket; + u8 *socket_name; + ssize_t memory_size; + u8 node_counters_enabled; + void *heap; + stat_segment_shared_header_t *shared_header; /* pointer to shared memory segment */ + int memfd; + + u64 last_input_packets; + /* convenience */ vlib_main_t *vlib_main; vnet_main_t *vnet_main; @@ -60,10 +177,9 @@ typedef struct api_main_t *api_main; } stats_main_t; -stats_main_t stats_main; +extern stats_main_t stats_main; -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__ */