[PATCH V5 6/8] telemetry: support adding integer value as hexadecimal
lihuisong (C)
lihuisong at huawei.com
Thu Dec 15 02:32:12 CET 2022
在 2022/12/14 23:38, Bruce Richardson 写道:
> On Wed, Dec 14, 2022 at 08:32:51PM +0800, Huisong Li wrote:
>> Sometimes displaying a unsigned integer value as hexadecimal encoded style
>> is more expected for human consumption, such as, offload capability and
>> device flag. This patch introduces two APIs to add unsigned integer value
>> as hexadecimal encoded string to array or dictionary. And user can choose
>> whether the stored value is padding to the specified width.
>>
>> Signed-off-by: Huisong Li <lihuisong at huawei.com>
>> Acked-by: Morten Brørup <mb at smartsharesystems.com>
>> Acked-by: Chengwen Feng <fengchengwen at huawei.com>
>> ---
>> lib/telemetry/rte_telemetry.h | 47 +++++++++++++++++++++
>> lib/telemetry/telemetry_data.c | 74 ++++++++++++++++++++++++++++++++++
>> lib/telemetry/version.map | 9 +++++
>> 3 files changed, 130 insertions(+)
>>
>> diff --git a/lib/telemetry/rte_telemetry.h b/lib/telemetry/rte_telemetry.h
>> index 40e9a3bf9d..b24f0310ea 100644
>> --- a/lib/telemetry/rte_telemetry.h
>> +++ b/lib/telemetry/rte_telemetry.h
>> @@ -10,6 +10,7 @@ extern "C" {
>> #endif
>>
>> #include <stdint.h>
>> +#include <rte_compat.h>
>>
>> /** Maximum length for string used in object. */
>> #define RTE_TEL_MAX_STRING_LEN 128
>> @@ -153,6 +154,28 @@ int
>> rte_tel_data_add_array_container(struct rte_tel_data *d,
>> struct rte_tel_data *val, int keep);
>>
>> +/**
>> + * Convert a unsigned integer to hexadecimal encoded strings and add this 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 val
>> + * The number to be returned in the array as a hexadecimal encoded strings.
>> + * @param display_bitwidth
>> + * The display bit width of the 'val'. If 'display_bitwidth' is zero, the
>> + * value is stored in the array as no-padding zero hexadecimal encoded string,
>> + * or the value is stored as padding zero to specified hexadecimal width.
>> + * @return
>> + * 0 on success, negative errno on error
>> + */
>> +__rte_experimental
>> +int
>> +rte_tel_data_add_array_uint_hex(struct rte_tel_data *d, uint64_t val,
>> + uint8_t display_bitwidth);
>> +
>> /**
>> * Add a string value to a dictionary.
>> * The dict must have been started by rte_tel_data_start_dict().
>> @@ -231,6 +254,30 @@ int
>> rte_tel_data_add_dict_container(struct rte_tel_data *d, const char *name,
>> struct rte_tel_data *val, int keep);
>>
>> +/**
>> + * Convert a unsigned integer to hexadecimal encoded strings and add this string
>> + * to an 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 of the value is to be stored in the dict
>> + * Must contain only alphanumeric characters or the symbols: '_' or '/'
>> + * @param val
>> + * The number to be stored in the dict as a hexadecimal encoded strings.
>> + * @param display_bitwidth
>> + * The display bit width of the 'val'. If 'display_bitwidth' is zero, the
>> + * value is stored in the array as no-padding zero hexadecimal encoded string,
>> + * or the value is stored as padding zero to specified hexadecimal width.
>> + * @return
>> + * 0 on success, negative errno on error
>> + */
>> +__rte_experimental
>> +int
>> +rte_tel_data_add_dict_uint_hex(struct rte_tel_data *d, const char *name,
>> + uint64_t val, uint8_t display_bitwidth);
>> +
>> /**
>> * This telemetry callback is used when registering a telemetry command.
>> * It handles getting and formatting information to be returned to telemetry
>> diff --git a/lib/telemetry/telemetry_data.c b/lib/telemetry/telemetry_data.c
>> index 34366ecee3..14cb56d680 100644
>> --- a/lib/telemetry/telemetry_data.c
>> +++ b/lib/telemetry/telemetry_data.c
>> @@ -4,6 +4,7 @@
>>
>> #include <errno.h>
>> #include <stdlib.h>
>> +#include <inttypes.h>
>>
>> #undef RTE_USE_LIBBSD
>> #include <stdbool.h>
>> @@ -12,6 +13,8 @@
>>
>> #include "telemetry_data.h"
>>
>> +#define RTE_TEL_UINT_HEX_STR_BUF_LEN 64
>> +
>> int
>> rte_tel_data_start_array(struct rte_tel_data *d, enum rte_tel_value_type type)
>> {
>> @@ -97,6 +100,60 @@ rte_tel_data_add_array_container(struct rte_tel_data *d,
>> return 0;
>> }
>>
>> +/* To suppress compiler warning about format string. */
>> +#if defined(RTE_TOOLCHAIN_GCC)
>> +#pragma GCC diagnostic push
>> +#pragma GCC diagnostic ignored "-Wformat-nonliteral"
>> +#elif defined(RTE_TOOLCHAIN_CLANG)
>> +#pragma clang diagnostic push
>> +#pragma clang diagnostic ignored "-Wformat-nonliteral"
>> +#endif
>> +
>> +static int
>> +rte_tel_uint_to_hex_encoded_str(char *buf, uint16_t len, uint64_t val,
>> + uint8_t display_bitwidth)
>> +{
>> +#define RTE_TEL_UINT_HEX_FORMAT_LEN 16
>> +
>> + uint8_t spec_hex_width = (display_bitwidth + 3) / 4;
>> + char format[RTE_TEL_UINT_HEX_FORMAT_LEN];
>> +
>> + /* Buffer needs to have room to contain the prefix '0x' and '\0'. */
>> + if (len < spec_hex_width + 3)
>> + return -EINVAL;
>> +
>> + if (display_bitwidth != 0) {
>> + sprintf(format, "0x%%0%u" PRIx64, spec_hex_width);
>> + sprintf(buf, format, val);
>> + } else {
>> + sprintf(buf, "0x%" PRIx64, val);
>> + }
>> +
>> + return 0;
>> +}
>> +
>> +#if defined(RTE_TOOLCHAIN_GCC)
>> +#pragma GCC diagnostic pop
>> +#elif defined(RTE_TOOLCHAIN_CLANG)
>> +#pragma clang diagnostic pop
>> +#endif
>> +
>> +int
>> +rte_tel_data_add_array_uint_hex(struct rte_tel_data *d, uint64_t val,
>> + uint8_t display_bitwidth)
>> +{
>> + char hex_str[RTE_TEL_UINT_HEX_STR_BUF_LEN];
>> + int ret;
>> +
>> + ret = rte_tel_uint_to_hex_encoded_str(hex_str,
>> + RTE_TEL_UINT_HEX_STR_BUF_LEN, val,
>> + display_bitwidth);
> Small nit - the indentation here - and in a few other places does not match
> that in the rest of the file. The existing file only uses tabs for indent,
> and does not align continuations on brackets, it just double-indents.
All right. Let's keep it in line with the file.
>
> /Bruce
> .
More information about the dev
mailing list