-static int32_t
-rte_telemetry_stat_names_to_ids(struct telemetry_impl *telemetry,
- const char * const *stat_names, uint32_t *stat_ids,
- uint64_t num_stat_names)
-{
- struct rte_metric_name *names;
- int ret, num_metrics;
- uint32_t i, k;
-
- if (stat_names == NULL) {
- TELEMETRY_LOG_WARN("Invalid stat_names argument");
- goto einval_fail;
- }
-
- if (num_stat_names <= 0) {
- TELEMETRY_LOG_WARN("Invalid num_stat_names argument");
- goto einval_fail;
- }
-
- num_metrics = rte_metrics_get_names(NULL, 0);
- if (num_metrics < 0) {
- TELEMETRY_LOG_ERR("Cannot get metrics count");
- goto eperm_fail;
- } else if (num_metrics == 0) {
- TELEMETRY_LOG_WARN("No metrics have been registered");
- goto eperm_fail;
- }
-
- names = malloc(sizeof(struct rte_metric_name) * num_metrics);
- if (names == NULL) {
- TELEMETRY_LOG_ERR("Cannot allocate memory for names");
-
- ret = rte_telemetry_send_error_response(telemetry, -ENOMEM);
- if (ret < 0)
- TELEMETRY_LOG_ERR("Could not send error");
-
- return -1;
- }
-
- ret = rte_metrics_get_names(names, num_metrics);
- if (ret < 0 || ret > num_metrics) {
- TELEMETRY_LOG_ERR("Cannot get metrics names");
- free(names);
- goto eperm_fail;
- }
-
- k = 0;
- for (i = 0; i < (uint32_t)num_stat_names; i++) {
- uint32_t j;
- for (j = 0; j < (uint32_t)num_metrics; j++) {
- if (strcmp(stat_names[i], names[j].name) == 0) {
- stat_ids[k] = j;
- k++;
- break;
- }
- }
- }
-
- if (k != num_stat_names) {
- TELEMETRY_LOG_WARN("Invalid stat names provided");
- free(names);
- goto einval_fail;
- }
-
- free(names);
- return 0;
-
-einval_fail:
- ret = rte_telemetry_send_error_response(telemetry, -EINVAL);
- if (ret < 0)
- TELEMETRY_LOG_ERR("Could not send error");
- return -1;
-
-eperm_fail:
- ret = rte_telemetry_send_error_response(telemetry, -EPERM);
- if (ret < 0)
- TELEMETRY_LOG_ERR("Could not send error");
- return -1;
-}
-