numam-dpdk/lib/telemetry/rte_telemetry.h
David Marchand 1094dd940e cleanup compat header inclusions
With symbols going though experimental/stable stages, we accumulated
a lot of discrepancies about inclusion of the rte_compat.h header.

Some headers are including it where unneeded, while others rely on
implicit inclusion.

Fix unneeded inclusions:
$ git grep -l include..rte_compat.h |
  xargs grep -LE '__rte_(internal|experimental)' |
  xargs sed -i -e '/#include..rte_compat.h/d'

Fix missing inclusion, by inserting rte_compat.h before the first
inclusion of a DPDK header:
$ git grep -lE '__rte_(internal|experimental)' |
  xargs grep -L include..rte_compat.h |
  xargs sed -i -e \
    '0,/#include..\(rte_\|.*pmd.h.$\)/{
      s/\(#include..\(rte_\|.*pmd.h.$\)\)/#include <rte_compat.h>\n\1/
    }'

Fix missing inclusion, by inserting rte_compat.h after the last
inclusion of a non DPDK header:
$ for file in $(git grep -lE '__rte_(internal|experimental)' |
  xargs grep -L include..rte_compat.h); do
    tac $file > $file.$$
    sed -i -e \
      '0,/#include../{
        s/\(#include..*$\)/#include <rte_compat.h>\n\n\1/
      }' $file.$$
    tac $file.$$ > $file
    rm $file.$$
  done

Fix missing inclusion, by inserting rte_compat.h after the header guard:
$ git grep -lE '__rte_(internal|experimental)' |
  xargs grep -L include..rte_compat.h |
  xargs sed -i -e \
    '0,/#define/{
      s/\(#define .*$\)/\1\n\n#include <rte_compat.h>/
    }'

And finally, exclude rte_compat.h itself.
$ git checkout lib/eal/include/rte_compat.h

At the end of all this, we have a clean tree:
$ git grep -lE '__rte_(internal|experimental)' |
  xargs grep -L include..rte_compat.h
buildtools/check-symbols.sh
devtools/checkpatches.sh
doc/guides/contributing/abi_policy.rst
doc/guides/rel_notes/release_20_11.rst
lib/eal/include/rte_compat.h

Signed-off-by: David Marchand <david.marchand@redhat.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
2022-11-15 08:39:14 +01:00

313 lines
8.6 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2018 Intel Corporation
*/
#include <stdint.h>
#ifndef _RTE_TELEMETRY_H_
#define _RTE_TELEMETRY_H_
#ifdef __cplusplus
extern "C" {
#endif
/** Maximum length for string used in object. */
#define RTE_TEL_MAX_STRING_LEN 128
/** Maximum length of string. */
#define RTE_TEL_MAX_SINGLE_STRING_LEN 8192
/** Maximum number of dictionary entries. */
#define RTE_TEL_MAX_DICT_ENTRIES 256
/** Maximum number of array entries. */
#define RTE_TEL_MAX_ARRAY_ENTRIES 512
/**
* @file
*
* RTE Telemetry.
*
* The telemetry library provides a method to retrieve statistics from
* DPDK by sending a request message over a socket. DPDK will send
* a JSON encoded response containing telemetry data.
***/
/** opaque structure used internally for managing data from callbacks */
struct rte_tel_data;
/**
* The types of data that can be managed in arrays or dicts.
* For arrays, this must be specified at creation time, while for
* dicts this is specified implicitly each time an element is added
* via calling a type-specific function.
*/
enum rte_tel_value_type {
RTE_TEL_STRING_VAL, /** a string value */
RTE_TEL_INT_VAL, /** a signed 32-bit int value */
RTE_TEL_U64_VAL, /** an unsigned 64-bit int value */
RTE_TEL_CONTAINER, /** a container struct */
};
/**
* 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
*/
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
*
* Dictionaries consist of key-values pairs to be returned, where the keys,
* or names, are strings and the values can be any of the types supported by telemetry.
* Name strings may only contain alphanumeric characters as well as '_' or '/'
*
* @param d
* The data structure passed to the callback
* @return
* 0 on success, negative errno on error
*/
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
*/
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
*/
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
*/
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
*/
int
rte_tel_data_add_array_u64(struct rte_tel_data *d, uint64_t x);
/**
* Add a container to an array. A container is an existing telemetry data
* array. The array the container is to be added to must have been started by
* rte_tel_data_start_array() with RTE_TEL_CONTAINER as the type parameter.
* The container type must be an array of type uint64_t/int/string.
*
* @param d
* The data structure passed to the callback
* @param val
* The pointer to the container to be stored in the array.
* @param keep
* Flag to indicate that the container memory should not be automatically
* freed by the telemetry library once it has finished with the data.
* 1 = keep, 0 = free.
* @return
* 0 on success, negative errno on error
*/
int
rte_tel_data_add_array_container(struct rte_tel_data *d,
struct rte_tel_data *val, int keep);
/**
* 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
* Must contain only alphanumeric characters or the symbols: '_' or '/'
* @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.
*/
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
* Must contain only alphanumeric characters or the symbols: '_' or '/'
* @param val
* The number to be stored in the dict
* @return
* 0 on success, negative errno on error, E2BIG on string truncation of name.
*/
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
* Must contain only alphanumeric characters or the symbols: '_' or '/'
* @param val
* The number to be stored in the dict
* @return
* 0 on success, negative errno on error, E2BIG on string truncation of name.
*/
int
rte_tel_data_add_dict_u64(struct rte_tel_data *d,
const char *name, uint64_t val);
/**
* Add a container to a dictionary. A container is an existing telemetry data
* array. The dict the container is to be added to must have been started by
* rte_tel_data_start_dict(). The container must be an array of type
* uint64_t/int/string.
*
* @param d
* The data structure passed to the callback
* @param name
* The name the value is to be stored under in the dict.
* Must contain only alphanumeric characters or the symbols: '_' or '/'
* @param val
* The pointer to the container to be stored in the dict.
* @param keep
* Flag to indicate that the container memory should not be automatically
* freed by the telemetry library once it has finished with the data.
* 1 = keep, 0 = free.
* @return
* 0 on success, negative errno on error
*/
int
rte_tel_data_add_dict_container(struct rte_tel_data *d, const char *name,
struct rte_tel_data *val, int keep);
/**
* This telemetry callback is used when registering a telemetry command.
* It handles getting and formatting information to be returned to telemetry
* when requested.
*
* @param cmd
* The cmd that was requested by the client.
* @param params
* Contains data required by the callback function.
* @param info
* The information to be returned to the caller.
*
* @return
* Length of buffer used on success.
* @return
* Negative integer on error.
*/
typedef int (*telemetry_cb)(const char *cmd, const char *params,
struct rte_tel_data *info);
/**
* Used for handling data received over a telemetry socket.
*
* @param sock_id
* ID for the socket to be used by the handler.
*
* @return
* Void.
*/
typedef void * (*handler)(void *sock_id);
/**
* Used when registering a command and callback function with telemetry.
*
* @param cmd
* The command to register with telemetry.
* @param fn
* Callback function to be called when the command is requested.
* @param help
* Help text for the command.
*
* @return
* 0 on success.
* @return
* -EINVAL for invalid parameters failure.
* @return
* -ENOMEM for mem allocation failure.
*/
int
rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn, const char *help);
/**
* Get a pointer to a container with memory allocated. The container is to be
* used embedded within an existing telemetry dict/array.
*
* @return
* Pointer to a container.
*/
struct rte_tel_data *
rte_tel_data_alloc(void);
/**
* @internal
* Free a container that has memory allocated.
*
* @param data
* Pointer to container.
* If data is NULL, no operation is performed.
*/
void
rte_tel_data_free(struct rte_tel_data *data);
#ifdef __cplusplus
}
#endif
#endif