Stats: Updated wrong slot on new vector
[vpp.git] / src / vpp / stats / stat_segment.c
index 37beb94..793936b 100644 (file)
@@ -21,7 +21,7 @@
 #include <vnet/devices/devices.h>      /* vnet_get_aggregate_rx_packets */
 #undef HAVE_MEMFD_CREATE
 #include <vppinfra/linux/syscall.h>
-
+#include <vpp-api/client/stat_client.h>
 stat_segment_main_t stat_segment_main;
 
 /*
@@ -115,7 +115,6 @@ vlib_stats_pop_heap (void *cm_arg, void *oldheap, stat_directory_type_t type)
       strncpy (e.name, stat_segment_name, 128 - 1);
       e.type = type;
       vec_add1 (sm->directory_vector, e);
-      vector_index++;
     }
 
   stat_segment_directory_entry_t *ep = &sm->directory_vector[vector_index];
@@ -157,6 +156,7 @@ vlib_stats_register_error_index (u8 * name, u64 * em_vec, u64 index)
   e.name[vec_len (name)] = '\0';
   e.type = STAT_DIR_TYPE_ERROR_INDEX;
   e.offset = index;
+  e.offset_vector = 0;
   vec_add1 (sm->directory_vector, e);
 
   /* Warn clients to refresh any pointers they might be holding */
@@ -552,9 +552,11 @@ stats_segment_socket_init (void)
   clib_error_t *error;
   clib_socket_t *s = clib_mem_alloc (sizeof (clib_socket_t));
 
+  memset (s, 0, sizeof (clib_socket_t));
   s->config = (char *) sm->socket_name;
   s->flags = CLIB_SOCKET_F_IS_SERVER | CLIB_SOCKET_F_SEQPACKET |
     CLIB_SOCKET_F_ALLOW_GROUP_WRITE | CLIB_SOCKET_F_PASSCRED;
+
   if ((error = clib_socket_init (s)))
     {
       clib_error_report (error);
@@ -564,13 +566,25 @@ stats_segment_socket_init (void)
   clib_file_t template = { 0 };
   template.read_function = stats_socket_accept_ready;
   template.file_descriptor = s->fd;
-  template.description =
-    format (0, "stats segment listener %s", STAT_SEGMENT_SOCKET_FILE);
+  template.description = format (0, "stats segment listener %s", s->config);
   clib_file_add (&file_main, &template);
 
   sm->socket = s;
 }
 
+static clib_error_t *
+stats_segment_socket_exit (vlib_main_t * vm)
+{
+  /*
+   * cleanup the listener socket on exit.
+   */
+  stat_segment_main_t *sm = &stat_segment_main;
+  unlink ((char *) sm->socket_name);
+  return 0;
+}
+
+VLIB_MAIN_LOOP_EXIT_FUNCTION (stats_segment_socket_exit);
+
 static uword
 stat_segment_collector_process (vlib_main_t * vm, vlib_node_runtime_t * rt,
                                vlib_frame_t * f)
@@ -594,6 +608,7 @@ statseg_init (vlib_main_t * vm)
   stat_segment_main_t *sm = &stat_segment_main;
   clib_error_t *error;
 
+  /* dependent on unix_input_init */
   if ((error = vlib_call_init_function (vm, unix_input_init)))
     return error;
 
@@ -608,6 +623,9 @@ statseg_config (vlib_main_t * vm, unformat_input_t * input)
 {
   stat_segment_main_t *sm = &stat_segment_main;
 
+  /* set default socket file name when statseg config stanza is empty. */
+  sm->socket_name = format (0, "%s", STAT_SEGMENT_SOCKET_FILE);
+
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
       if (unformat (input, "socket-name %s", &sm->socket_name))
@@ -626,7 +644,6 @@ statseg_config (vlib_main_t * vm, unformat_input_t * input)
        return clib_error_return (0, "unknown input `%U'",
                                  format_unformat_error, input);
     }
-
   return 0;
 }
 
@@ -636,8 +653,10 @@ VLIB_EARLY_CONFIG_FUNCTION (statseg_config, "statseg");
 /* *INDENT-OFF* */
 VLIB_REGISTER_NODE (stat_segment_collector, static) =
 {
-.function = stat_segment_collector_process,.name =
-    "statseg-collector-process",.type = VLIB_NODE_TYPE_PROCESS,};
+.function = stat_segment_collector_process,
+.name = "statseg-collector-process",
+.type = VLIB_NODE_TYPE_PROCESS,
+};
 
 /* *INDENT-ON* */