SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += rte_telemetry_parser.c
SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += rte_telemetry_parser_test.c
SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += telemetry.c
+SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += telemetry_data.c
# export include files
SYMLINK-$(CONFIG_RTE_LIBRTE_TELEMETRY)-include := rte_telemetry.h
includes = [global_inc]
sources = files('rte_telemetry.c', 'rte_telemetry_parser.c', 'rte_telemetry_parser_test.c',
- 'telemetry.c')
+ 'telemetry.c', 'telemetry_data.c')
headers = files('rte_telemetry.h', 'rte_telemetry_internal.h', 'rte_telemetry_parser.h')
includes += include_directories('../librte_metrics')
RTE_TEL_U64_VAL, /** an unsigned 64-bit int value */
};
+/**
+ * Start an array of the specified type for returning from a callback
+ *
+ * @param d
+ * The data structure passed to the callback
+ * @param type
+ * The type of the array of data
+ * @return
+ * 0 on success, negative errno on error
+ */
+__rte_experimental
+int
+rte_tel_data_start_array(struct rte_tel_data *d, enum rte_tel_value_type type);
+
+/**
+ * Start a dictionary of values for returning from a callback
+ *
+ * @param d
+ * The data structure passed to the callback
+ * @return
+ * 0 on success, negative errno on error
+ */
+__rte_experimental
+int
+rte_tel_data_start_dict(struct rte_tel_data *d);
+
+/**
+ * Set a string for returning from a callback
+ *
+ * @param d
+ * The data structure passed to the callback
+ * @param str
+ * The string to be returned in the data structure
+ * @return
+ * 0 on success, negative errno on error, E2BIG on string truncation
+ */
+__rte_experimental
+int
+rte_tel_data_string(struct rte_tel_data *d, const char *str);
+
+/**
+ * Add a string to an array.
+ * The array must have been started by rte_tel_data_start_array() with
+ * RTE_TEL_STRING_VAL as the type parameter.
+ *
+ * @param d
+ * The data structure passed to the callback
+ * @param str
+ * The string to be returned in the array
+ * @return
+ * 0 on success, negative errno on error, E2BIG on string truncation
+ */
+__rte_experimental
+int
+rte_tel_data_add_array_string(struct rte_tel_data *d, const char *str);
+
+/**
+ * Add an int to an array.
+ * The array must have been started by rte_tel_data_start_array() with
+ * RTE_TEL_INT_VAL as the type parameter.
+ *
+ * @param d
+ * The data structure passed to the callback
+ * @param x
+ * The number to be returned in the array
+ * @return
+ * 0 on success, negative errno on error
+ */
+__rte_experimental
+int
+rte_tel_data_add_array_int(struct rte_tel_data *d, int x);
+
+/**
+ * Add a uint64_t to an array.
+ * The array must have been started by rte_tel_data_start_array() with
+ * RTE_TEL_U64_VAL as the type parameter.
+ *
+ * @param d
+ * The data structure passed to the callback
+ * @param x
+ * The number to be returned in the array
+ * @return
+ * 0 on success, negative errno on error
+ */
+__rte_experimental
+int
+rte_tel_data_add_array_u64(struct rte_tel_data *d, uint64_t x);
+
+/**
+ * Add a string value to a dictionary.
+ * The dict must have been started by rte_tel_data_start_dict().
+ *
+ * @param d
+ * The data structure passed to the callback
+ * @param name
+ * The name the value is to be stored under in the dict
+ * @param val
+ * The string to be stored in the dict
+ * @return
+ * 0 on success, negative errno on error, E2BIG on string truncation of
+ * either name or value.
+ */
+__rte_experimental
+int
+rte_tel_data_add_dict_string(struct rte_tel_data *d, const char *name,
+ const char *val);
+
+/**
+ * Add an int value to a dictionary.
+ * The dict must have been started by rte_tel_data_start_dict().
+ *
+ * @param d
+ * The data structure passed to the callback
+ * @param name
+ * The name the value is to be stored under in the dict
+ * @param val
+ * The number to be stored in the dict
+ * @return
+ * 0 on success, negative errno on error, E2BIG on string truncation of name.
+ */
+__rte_experimental
+int
+rte_tel_data_add_dict_int(struct rte_tel_data *d, const char *name, int val);
+
+/**
+ * Add a uint64_t value to a dictionary.
+ * The dict must have been started by rte_tel_data_start_dict().
+ *
+ * @param d
+ * The data structure passed to the callback
+ * @param name
+ * The name the value is to be stored under in the dict
+ * @param val
+ * The number to be stored in the dict
+ * @return
+ * 0 on success, negative errno on error, E2BIG on string truncation of name.
+ */
+__rte_experimental
+int
+rte_tel_data_add_dict_u64(struct rte_tel_data *d,
+ const char *name, uint64_t val);
+
/**
* This telemetry callback is used when registering a telemetry command.
* It handles getting and formatting information to be returned to telemetry
EXPERIMENTAL {
global:
+ rte_tel_data_add_array_int;
+ rte_tel_data_add_array_string;
+ rte_tel_data_add_array_u64;
+ rte_tel_data_add_dict_int;
+ rte_tel_data_add_dict_string;
+ rte_tel_data_add_dict_u64;
+ rte_tel_data_start_array;
+ rte_tel_data_start_dict;
+ rte_tel_data_string;
rte_telemetry_cleanup;
rte_telemetry_init;
rte_telemetry_new_init;
--- /dev/null
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2020 Intel Corporation
+ */
+
+#undef RTE_USE_LIBBSD
+#include <rte_string_fns.h>
+
+#include "telemetry_data.h"
+
+int
+rte_tel_data_start_array(struct rte_tel_data *d, enum rte_tel_value_type type)
+{
+ enum tel_container_types array_types[] = {
+ RTE_TEL_ARRAY_STRING, /* RTE_TEL_STRING_VAL = 0 */
+ RTE_TEL_ARRAY_INT, /* RTE_TEL_INT_VAL = 1 */
+ RTE_TEL_ARRAY_U64, /* RTE_TEL_u64_VAL = 2 */
+ };
+ d->type = array_types[type];
+ d->data_len = 0;
+ return 0;
+}
+
+int
+rte_tel_data_start_dict(struct rte_tel_data *d)
+{
+ d->type = RTE_TEL_DICT;
+ d->data_len = 0;
+ return 0;
+}
+
+int
+rte_tel_data_string(struct rte_tel_data *d, const char *str)
+{
+ d->type = RTE_TEL_STRING;
+ d->data_len = strlcpy(d->data.str, str, sizeof(d->data.str));
+ if (d->data_len >= RTE_TEL_MAX_SINGLE_STRING_LEN) {
+ d->data_len = RTE_TEL_MAX_SINGLE_STRING_LEN - 1;
+ return E2BIG; /* not necessarily and error, just truncation */
+ }
+ return 0;
+}
+
+int
+rte_tel_data_add_array_string(struct rte_tel_data *d, const char *str)
+{
+ if (d->type != RTE_TEL_ARRAY_STRING)
+ return -EINVAL;
+ if (d->data_len >= RTE_TEL_MAX_ARRAY_ENTRIES)
+ return -ENOSPC;
+ const size_t bytes = strlcpy(d->data.array[d->data_len++].sval,
+ str, RTE_TEL_MAX_STRING_LEN);
+ return bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG;
+}
+
+int
+rte_tel_data_add_array_int(struct rte_tel_data *d, int x)
+{
+ if (d->type != RTE_TEL_ARRAY_INT)
+ return -EINVAL;
+ if (d->data_len >= RTE_TEL_MAX_ARRAY_ENTRIES)
+ return -ENOSPC;
+ d->data.array[d->data_len++].ival = x;
+ return 0;
+}
+
+int
+rte_tel_data_add_array_u64(struct rte_tel_data *d, uint64_t x)
+{
+ if (d->type != RTE_TEL_ARRAY_U64)
+ return -EINVAL;
+ if (d->data_len >= RTE_TEL_MAX_ARRAY_ENTRIES)
+ return -ENOSPC;
+ d->data.array[d->data_len++].u64val = x;
+ return 0;
+}
+
+int
+rte_tel_data_add_dict_string(struct rte_tel_data *d, const char *name,
+ const char *val)
+{
+ struct tel_dict_entry *e = &d->data.dict[d->data_len];
+ size_t nbytes, vbytes;
+
+ if (d->type != RTE_TEL_DICT)
+ return -EINVAL;
+ if (d->data_len >= RTE_TEL_MAX_DICT_ENTRIES)
+ return -ENOSPC;
+
+ d->data_len++;
+ e->type = RTE_TEL_STRING_VAL;
+ vbytes = strlcpy(e->value.sval, val, RTE_TEL_MAX_STRING_LEN);
+ nbytes = strlcpy(e->name, name, RTE_TEL_MAX_STRING_LEN);
+ if (vbytes >= RTE_TEL_MAX_STRING_LEN ||
+ nbytes >= RTE_TEL_MAX_STRING_LEN)
+ return E2BIG;
+ return 0;
+}
+
+int
+rte_tel_data_add_dict_int(struct rte_tel_data *d, const char *name, int val)
+{
+ struct tel_dict_entry *e = &d->data.dict[d->data_len];
+ if (d->type != RTE_TEL_DICT)
+ return -EINVAL;
+ if (d->data_len >= RTE_TEL_MAX_DICT_ENTRIES)
+ return -ENOSPC;
+
+ d->data_len++;
+ e->type = RTE_TEL_INT_VAL;
+ e->value.ival = val;
+ const size_t bytes = strlcpy(e->name, name, RTE_TEL_MAX_STRING_LEN);
+ return bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG;
+}
+
+int
+rte_tel_data_add_dict_u64(struct rte_tel_data *d,
+ const char *name, uint64_t val)
+{
+ struct tel_dict_entry *e = &d->data.dict[d->data_len];
+ if (d->type != RTE_TEL_DICT)
+ return -EINVAL;
+ if (d->data_len >= RTE_TEL_MAX_DICT_ENTRIES)
+ return -ENOSPC;
+
+ d->data_len++;
+ e->type = RTE_TEL_U64_VAL;
+ e->value.u64val = val;
+ const size_t bytes = strlcpy(e->name, name, RTE_TEL_MAX_STRING_LEN);
+ return bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG;
+}