aboutsummaryrefslogtreecommitdiffstats
path: root/src/vpp/stats
diff options
context:
space:
mode:
authorSteven Luong <sluong@cisco.com>2019-08-07 12:20:22 -0700
committerDamjan Marion <dmarion@me.com>2019-09-04 19:52:48 +0000
commit0f09a828ad2dc53d4f1e69de536f3104eaccc4b0 (patch)
treeb4d3fb43e1af7101f5e1b0855fcdb729789d0329 /src/vpp/stats
parent63882357549a39c7be4b23b48418b8febb5b0e12 (diff)
stats: add /if/<n>/<n>/state for lacp interface state
Add /if/lacp/<bond-sw_if_index>/<slave-sw_if_index>/state <bond-sw_if_index> is a vector of the bond sw_if_index <slave-sw_if_index> is a vector of the slave sw_if_index Content is the integer value of the lacp actor state. The state is actually a bitfield as described in the lacp protocol spec. Type: feature Signed-off-by: Steven Luong <sluong@cisco.com> Change-Id: Ic6eca8ce2a1acd2d858e4e50b7eac1d000ea08e5 Signed-off-by: Ole Troan <ot@cisco.com>
Diffstat (limited to 'src/vpp/stats')
-rw-r--r--src/vpp/stats/stat_segment.c72
-rw-r--r--src/vpp/stats/stat_segment.h5
2 files changed, 76 insertions, 1 deletions
diff --git a/src/vpp/stats/stat_segment.c b/src/vpp/stats/stat_segment.c
index bb533d19118..670d0910d26 100644
--- a/src/vpp/stats/stat_segment.c
+++ b/src/vpp/stats/stat_segment.c
@@ -358,6 +358,10 @@ format_stat_dir_entry (u8 * s, va_list * args)
type_name = "ErrIndex";
break;
+ case STAT_DIR_TYPE_NAME_VECTOR:
+ type_name = "NameVector";
+ break;
+
default:
type_name = "illegal!";
break;
@@ -730,7 +734,6 @@ VLIB_INIT_FUNCTION (statseg_init) =
};
/* *INDENT-ON* */
-
clib_error_t *
stat_segment_register_gauge (u8 * name, stat_segment_update_fn update_fn,
u32 caller_index)
@@ -774,6 +777,73 @@ stat_segment_register_gauge (u8 * name, stat_segment_update_fn update_fn,
return NULL;
}
+clib_error_t *
+stat_segment_register_state_counter (u8 * name, u32 * index)
+{
+ stat_segment_main_t *sm = &stat_segment_main;
+ stat_segment_shared_header_t *shared_header = sm->shared_header;
+ void *oldheap;
+ stat_segment_directory_entry_t e;
+
+ ASSERT (shared_header);
+ ASSERT (vlib_get_thread_index () == 0);
+
+ u32 next_vector_index = vec_len (sm->directory_vector);
+ u32 vector_index = lookup_or_create_hash_index (name,
+ next_vector_index);
+
+ if (vector_index < next_vector_index) /* Already registered */
+ return clib_error_return (0, "%v is already registered", name);
+
+ oldheap = vlib_stats_push_heap (NULL);
+ vlib_stat_segment_lock ();
+
+ memset (&e, 0, sizeof (e));
+ e.type = STAT_DIR_TYPE_SCALAR_INDEX;
+
+ memcpy (e.name, name, vec_len (name));
+ vec_add1 (sm->directory_vector, e);
+
+ shared_header->directory_offset =
+ stat_segment_offset (shared_header, sm->directory_vector);
+
+ vlib_stat_segment_unlock ();
+ clib_mem_set_heap (oldheap);
+
+ *index = next_vector_index;
+ return 0;
+}
+
+clib_error_t *
+stat_segment_deregister_state_counter (u32 index)
+{
+ stat_segment_main_t *sm = &stat_segment_main;
+ stat_segment_shared_header_t *shared_header = sm->shared_header;
+ stat_segment_directory_entry_t *e;
+
+ ASSERT (shared_header);
+
+ if (index > vec_len (sm->directory_vector))
+ return clib_error_return (0, "%u index does not exist", index);
+
+ e = &sm->directory_vector[index];
+ if (e->type != STAT_DIR_TYPE_SCALAR_INDEX)
+ return clib_error_return (0, "%u index cannot be deleted", index);
+
+ hash_unset (sm->directory_vector_by_name, &e->name);
+ vec_del1 (sm->directory_vector, index);
+ return 0;
+}
+
+void
+stat_segment_set_state_counter (u32 index, u64 value)
+{
+ stat_segment_main_t *sm = &stat_segment_main;
+
+ ASSERT (index < vec_len (sm->directory_vector));
+ sm->directory_vector[index].index = value;
+}
+
static clib_error_t *
statseg_config (vlib_main_t * vm, unformat_input_t * input)
{
diff --git a/src/vpp/stats/stat_segment.h b/src/vpp/stats/stat_segment.h
index 5c55cf94ff9..eae6902dc75 100644
--- a/src/vpp/stats/stat_segment.h
+++ b/src/vpp/stats/stat_segment.h
@@ -107,5 +107,10 @@ extern stat_segment_main_t stat_segment_main;
clib_error_t *
stat_segment_register_gauge (u8 *names, stat_segment_update_fn update_fn, u32 index);
+clib_error_t *
+stat_segment_register_state_counter(u8 *name, u32 *index);
+clib_error_t *
+stat_segment_deregister_state_counter(u32 index);
+void stat_segment_set_state_counter (u32 index, u64 value);
#endif