X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_telemetry%2Frte_telemetry_parser.c;h=96013239708c942f717c455ca148f5f2a32fcf35;hb=03df3c7473dfd8f2efafe525b61ef980d0a68aa1;hp=03a58a2fdd5f956ddb257314fd39184dd2ebc5ee;hpb=67c3c2de48105f58bd478675c3f09b6b4261d06c;p=dpdk.git diff --git a/lib/librte_telemetry/rte_telemetry_parser.c b/lib/librte_telemetry/rte_telemetry_parser.c index 03a58a2fdd..9601323970 100644 --- a/lib/librte_telemetry/rte_telemetry_parser.c +++ b/lib/librte_telemetry/rte_telemetry_parser.c @@ -13,11 +13,12 @@ #include #include "rte_telemetry_internal.h" +#include "rte_telemetry_parser.h" typedef int (*command_func)(struct telemetry_impl *, int, json_t *); struct rte_telemetry_command { - char *text; + const char *text; command_func fn; } command; @@ -251,15 +252,16 @@ eperm_fail: return -1; } -int32_t +static int32_t rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry, int action, json_t *data) { int ret, num_metrics, i, p; - struct rte_metric_name *names; + struct rte_metric_value *values; uint64_t num_port_ids = 0; - uint32_t port_ids[RTE_MAX_ETHPORTS]; + struct telemetry_encode_param ep; + memset(&ep, 0, sizeof(ep)); if (telemetry == NULL) { TELEMETRY_LOG_ERR("Invalid telemetry argument"); return -1; @@ -281,7 +283,7 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry, return -1; } - num_metrics = rte_metrics_get_names(NULL, 0); + num_metrics = rte_metrics_get_values(0, NULL, 0); if (num_metrics < 0) { TELEMETRY_LOG_ERR("Cannot get metrics count"); @@ -300,8 +302,8 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry, return -1; } - names = malloc(sizeof(struct rte_metric_name) * num_metrics); - if (names == NULL) { + values = malloc(sizeof(struct rte_metric_value) * num_metrics); + if (values == NULL) { TELEMETRY_LOG_ERR("Cannot allocate memory"); ret = rte_telemetry_send_error_response(telemetry, -ENOMEM); @@ -310,11 +312,8 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry, return -1; } - const char *stat_names[num_metrics]; - uint32_t stat_ids[num_metrics]; - RTE_ETH_FOREACH_DEV(p) { - port_ids[num_port_ids] = p; + ep.pp.port_ids[num_port_ids] = p; num_port_ids++; } @@ -328,45 +327,138 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry, goto fail; } - ret = rte_metrics_get_names(names, num_metrics); + ret = rte_metrics_get_values(ep.pp.port_ids[0], values, num_metrics); + if (ret < 0) { + TELEMETRY_LOG_ERR("Could not get stat values"); + ret = rte_telemetry_send_error_response(telemetry, -EINVAL); + if (ret < 0) + TELEMETRY_LOG_ERR("Could not send error"); + goto fail; + } for (i = 0; i < num_metrics; i++) - stat_names[i] = names[i].name; + ep.pp.metric_ids[i] = values[i].key; + + ep.pp.num_port_ids = num_port_ids; + ep.pp.num_metric_ids = num_metrics; + ep.type = PORT_STATS; - ret = rte_telemetry_stat_names_to_ids(telemetry, stat_names, stat_ids, - num_metrics); + ret = rte_telemetry_send_ports_stats_values(&ep, telemetry); if (ret < 0) { - TELEMETRY_LOG_ERR("Could not convert stat names to IDs"); + TELEMETRY_LOG_ERR("Sending ports stats values failed"); + goto fail; + } + + free(values); + return 0; + +fail: + free(values); + return -1; +} + +static int32_t +rte_telemetry_command_global_stat_values(struct telemetry_impl *telemetry, + int action, json_t *data) +{ + int ret, num_metrics, i; + struct rte_metric_value *values; + struct telemetry_encode_param ep; + + memset(&ep, 0, sizeof(ep)); + if (telemetry == NULL) { + TELEMETRY_LOG_ERR("Invalid telemetry argument"); + return -1; + } + + if (action != ACTION_GET) { + TELEMETRY_LOG_WARN("Invalid action for this command"); + ret = rte_telemetry_send_error_response(telemetry, -EINVAL); + if (ret < 0) + TELEMETRY_LOG_ERR("Could not send error"); + return -1; + } + + if (json_is_object(data)) { + TELEMETRY_LOG_WARN("Invalid data provided for this command"); + ret = rte_telemetry_send_error_response(telemetry, -EINVAL); + if (ret < 0) + TELEMETRY_LOG_ERR("Could not send error"); + return -1; + } + + num_metrics = rte_metrics_get_values(RTE_METRICS_GLOBAL, NULL, 0); + if (num_metrics < 0) { + TELEMETRY_LOG_ERR("Cannot get metrics count"); + + ret = rte_telemetry_send_error_response(telemetry, -EINVAL); + if (ret < 0) + TELEMETRY_LOG_ERR("Could not send error"); + + return -1; + } else if (num_metrics == 0) { + TELEMETRY_LOG_ERR("No metrics to display (none have been registered)"); + + ret = rte_telemetry_send_error_response(telemetry, -EPERM); + if (ret < 0) + TELEMETRY_LOG_ERR("Could not send error"); + + return -1; + } + + values = malloc(sizeof(struct rte_metric_value) * num_metrics); + if (values == NULL) { + TELEMETRY_LOG_ERR("Cannot allocate memory"); + ret = rte_telemetry_send_error_response(telemetry, + -ENOMEM); + if (ret < 0) + TELEMETRY_LOG_ERR("Could not send error"); + return -1; + } + + ret = rte_metrics_get_values(RTE_METRICS_GLOBAL, values, num_metrics); + if (ret < 0) { + TELEMETRY_LOG_ERR("Could not get stat values"); + ret = rte_telemetry_send_error_response(telemetry, -EINVAL); + if (ret < 0) + TELEMETRY_LOG_ERR("Could not send error"); goto fail; } + for (i = 0; i < num_metrics; i++) + ep.gp.metric_ids[i] = values[i].key; + + ep.gp.num_metric_ids = num_metrics; + ep.type = GLOBAL_STATS; - ret = rte_telemetry_send_ports_stats_values(stat_ids, num_metrics, - port_ids, num_port_ids, telemetry); + ret = rte_telemetry_send_global_stats_values(&ep, telemetry); if (ret < 0) { - TELEMETRY_LOG_ERR("Sending ports stats values failed"); + TELEMETRY_LOG_ERR("Sending global stats values failed"); goto fail; } + free(values); return 0; fail: - free(names); + free(values); return -1; } -int32_t +static int32_t rte_telemetry_command_ports_stats_values_by_name(struct telemetry_impl *telemetry, int action, json_t *data) { int ret; json_t *port_ids_json = json_object_get(data, "ports"); json_t *stat_names_json = json_object_get(data, "stats"); - uint64_t num_port_ids = json_array_size(port_ids_json); uint64_t num_stat_names = json_array_size(stat_names_json); const char *stat_names[num_stat_names]; - uint32_t port_ids[num_port_ids], stat_ids[num_stat_names]; + struct telemetry_encode_param ep; size_t index; json_t *value; + ep.pp.num_port_ids = json_array_size(port_ids_json); + ep.pp.num_metric_ids = num_stat_names; + memset(&ep, 0, sizeof(ep)); if (telemetry == NULL) { TELEMETRY_LOG_ERR("Invalid telemetry argument"); return -1; @@ -406,8 +498,8 @@ rte_telemetry_command_ports_stats_values_by_name(struct telemetry_impl TELEMETRY_LOG_ERR("Could not send error"); return -1; } - port_ids[index] = json_integer_value(value); - ret = rte_telemetry_is_port_active(port_ids[index]); + ep.pp.port_ids[index] = json_integer_value(value); + ret = rte_telemetry_is_port_active(ep.pp.port_ids[index]); if (ret < 1) { ret = rte_telemetry_send_error_response(telemetry, -EINVAL); @@ -431,15 +523,15 @@ rte_telemetry_command_ports_stats_values_by_name(struct telemetry_impl stat_names[index] = json_string_value(value); } - ret = rte_telemetry_stat_names_to_ids(telemetry, stat_names, stat_ids, - num_stat_names); + ret = rte_telemetry_stat_names_to_ids(telemetry, stat_names, + ep.pp.metric_ids, num_stat_names); if (ret < 0) { TELEMETRY_LOG_ERR("Could not convert stat names to IDs"); return -1; } - ret = rte_telemetry_send_ports_stats_values(stat_ids, num_stat_names, - port_ids, num_port_ids, telemetry); + ep.type = PORT_STATS; + ret = rte_telemetry_send_ports_stats_values(&ep, telemetry); if (ret < 0) { TELEMETRY_LOG_ERR("Sending ports stats values failed"); return -1; @@ -484,6 +576,10 @@ rte_telemetry_parse_command(struct telemetry_impl *telemetry, int action, { .text = "ports_all_stat_values", .fn = &rte_telemetry_command_ports_all_stat_values + }, + { + .text = "global_stat_values", + .fn = &rte_telemetry_command_global_stat_values } }; @@ -510,7 +606,7 @@ rte_telemetry_parse_command(struct telemetry_impl *telemetry, int action, return -1; } -int32_t __rte_experimental +int32_t rte_telemetry_parse(struct telemetry_impl *telemetry, char *socket_rx_data) { int ret, action_int;