aboutsummaryrefslogtreecommitdiffstats
path: root/src/vpp/stats/stat_segment.h
diff options
context:
space:
mode:
authorOle Troan <ot@cisco.com>2018-09-04 13:19:12 +0200
committerDamjan Marion <dmarion@me.com>2018-09-17 10:07:27 +0000
commit58492a83722caf1c49977d73abf931418ce1f8f2 (patch)
tree0e2f7e031fbfa10c35448c9660292146aeb442b1 /src/vpp/stats/stat_segment.h
parent40ea3f59dca497e5f4b5a8440a9c8c2e37396701 (diff)
STATS: Dynamically mapped shared memory segment
Move from using a hash to a vector with offsets into shared memory. Limit exposure of VPP data structures and include files to external stats library and applications. Change-Id: Ic06129f12d10cf4c4946a86d9bc734eacff2c7da Signed-off-by: Ole Troan <ot@cisco.com>
Diffstat (limited to 'src/vpp/stats/stat_segment.h')
-rw-r--r--src/vpp/stats/stat_segment.h97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/vpp/stats/stat_segment.h b/src/vpp/stats/stat_segment.h
new file mode 100644
index 00000000000..0efd45ac5f0
--- /dev/null
+++ b/src/vpp/stats/stat_segment.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2018 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef included_stat_segment_h
+#define included_stat_segment_h
+
+#include <stdatomic.h>
+
+/* Default socket to exchange segment fd */
+#define STAT_SEGMENT_SOCKET_FILE "/run/vpp/stats.sock"
+
+typedef enum
+{
+ STAT_DIR_TYPE_ILLEGAL = 0,
+ STAT_DIR_TYPE_SCALAR_INDEX,
+ STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE,
+ STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED,
+ STAT_DIR_TYPE_ERROR_INDEX,
+} stat_directory_type_t;
+
+typedef enum
+{
+ STAT_COUNTER_VECTOR_RATE = 0,
+ STAT_COUNTER_INPUT_RATE,
+ STAT_COUNTER_LAST_UPDATE,
+ STAT_COUNTER_LAST_STATS_CLEAR,
+ STAT_COUNTER_HEARTBEAT,
+ STAT_COUNTER_NODE_CLOCKS,
+ STAT_COUNTER_NODE_VECTORS,
+ STAT_COUNTER_NODE_CALLS,
+ STAT_COUNTER_NODE_SUSPENDS,
+ STAT_COUNTERS
+} stat_segment_counter_t;
+
+#define foreach_stat_segment_counter_name \
+ _(VECTOR_RATE, SCALAR_INDEX, vector_rate,) \
+ _(INPUT_RATE, SCALAR_INDEX, input_rate,) \
+ _(LAST_UPDATE, SCALAR_INDEX, last_update,) \
+ _(LAST_STATS_CLEAR, SCALAR_INDEX, last_stats_clear,) \
+ _(HEARTBEAT, SCALAR_INDEX, heartbeat,) \
+ _(NODE_CLOCKS, COUNTER_VECTOR_SIMPLE, clocks, /node) \
+ _(NODE_VECTORS, COUNTER_VECTOR_SIMPLE, vectors, /node) \
+ _(NODE_CALLS, COUNTER_VECTOR_SIMPLE, calls, /node) \
+ _(NODE_SUSPENDS, COUNTER_VECTOR_SIMPLE, suspends, /node)
+
+typedef struct
+{
+ stat_directory_type_t type;
+ union {
+ uint64_t offset;
+ uint64_t index;
+ uint64_t value;
+ };
+ uint64_t offset_vector;
+ char name[128]; // TODO change this to pointer to "somewhere"
+} stat_segment_directory_entry_t;
+
+/* Default stat segment 32m */
+#define STAT_SEGMENT_DEFAULT_SIZE (32<<20)
+
+/*
+ * Shared header first in the shared memory segment.
+ */
+typedef struct
+{
+ atomic_int_fast64_t epoch;
+ atomic_int_fast64_t in_progress;
+ atomic_int_fast64_t directory_offset;
+ atomic_int_fast64_t error_offset;
+ atomic_int_fast64_t stats_offset;
+} stat_segment_shared_header_t;
+
+static inline uint64_t
+stat_segment_offset (void *start, void *data)
+{
+ return (char *) data - (char *) start;
+}
+
+static inline void *
+stat_segment_pointer (void *start, uint64_t offset)
+{
+ return ((char *) start + offset);
+}
+
+#endif