get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/66941/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 66941,
    "url": "http://patches.dpdk.org/api/patches/66941/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200319171907.60891-3-ciara.power@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20200319171907.60891-3-ciara.power@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200319171907.60891-3-ciara.power@intel.com",
    "date": "2020-03-19T17:18:57",
    "name": "[02/12] metrics: reduce code taken from telemetry",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "5295549229db78f90eb0b45d6fd832324515b6c8",
    "submitter": {
        "id": 978,
        "url": "http://patches.dpdk.org/api/people/978/?format=api",
        "name": "Power, Ciara",
        "email": "ciara.power@intel.com"
    },
    "delegate": {
        "id": 24651,
        "url": "http://patches.dpdk.org/api/users/24651/?format=api",
        "username": "dmarchand",
        "first_name": "David",
        "last_name": "Marchand",
        "email": "david.marchand@redhat.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20200319171907.60891-3-ciara.power@intel.com/mbox/",
    "series": [
        {
            "id": 8987,
            "url": "http://patches.dpdk.org/api/series/8987/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=8987",
            "date": "2020-03-19T17:18:55",
            "name": "update and simplify telemetry library.",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/8987/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/66941/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/66941/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id C0F76A0583;\n\tThu, 19 Mar 2020 18:35:25 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 7D3551C067;\n\tThu, 19 Mar 2020 18:34:59 +0100 (CET)",
            "from mga02.intel.com (mga02.intel.com [134.134.136.20])\n by dpdk.org (Postfix) with ESMTP id 1599B1C025\n for <dev@dpdk.org>; Thu, 19 Mar 2020 18:34:56 +0100 (CET)",
            "from orsmga004.jf.intel.com ([10.7.209.38])\n by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 19 Mar 2020 10:34:56 -0700",
            "from silpixa00399953.ir.intel.com (HELO\n silpixa00399953.ger.corp.intel.com) ([10.237.222.53])\n by orsmga004.jf.intel.com with ESMTP; 19 Mar 2020 10:34:54 -0700"
        ],
        "IronPort-SDR": [
            "\n qd6zt0jCdvjEAH8WJdz16iqofGcSQa9FqOKbz3kUYwYdrkN9+1dUZtNOQ7N624rZsMlUav9Ztf\n ovE1r5hopWAg==",
            "\n 8bHBNbYJX/2BTFi/rKx+yoD1L0t6gMrTu3InEhHwsu326DKQuRjh3qctsRWfx7rzEck6U6s4sM\n VinsvnRSa4FA=="
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.70,572,1574150400\"; d=\"scan'208\";a=\"391872599\"",
        "From": "Ciara Power <ciara.power@intel.com>",
        "To": "kevin.laatz@intel.com",
        "Cc": "dev@dpdk.org, reshma.pattan@intel.com,\n Ciara Power <ciara.power@intel.com>,\n Bruce Richardson <bruce.richardson@intel.com>",
        "Date": "Thu, 19 Mar 2020 17:18:57 +0000",
        "Message-Id": "<20200319171907.60891-3-ciara.power@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20200319171907.60891-1-ciara.power@intel.com>",
        "References": "<20200319171907.60891-1-ciara.power@intel.com>",
        "Subject": "[dpdk-dev] [PATCH 02/12] metrics: reduce code taken from telemetry",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "The telemetry code that was moved into the metrics library can be\nshortened, while still maintaining the same functionality.\n\nSigned-off-by: Ciara Power <ciara.power@intel.com>\nSigned-off-by: Bruce Richardson <bruce.richardson@intel.com>\n---\n lib/librte_metrics/rte_metrics_telemetry.c  | 476 ++++----------------\n lib/librte_metrics/rte_metrics_telemetry.h  |  18 +-\n lib/librte_telemetry/rte_telemetry.c        |  11 -\n lib/librte_telemetry/rte_telemetry_parser.c |  12 +-\n 4 files changed, 96 insertions(+), 421 deletions(-)",
    "diff": "diff --git a/lib/librte_metrics/rte_metrics_telemetry.c b/lib/librte_metrics/rte_metrics_telemetry.c\nindex a6b261671..78c21663d 100644\n--- a/lib/librte_metrics/rte_metrics_telemetry.c\n+++ b/lib/librte_metrics/rte_metrics_telemetry.c\n@@ -23,33 +23,12 @@ int metrics_log_level;\n #define METRICS_LOG_WARN(fmt, args...) \\\n \tMETRICS_LOG(WARNING, fmt, ## args)\n \n-static int32_t\n-rte_metrics_tel_is_port_active(int port_id)\n-{\n-\tint ret;\n-\n-\tret = rte_eth_find_next(port_id);\n-\tif (ret == port_id)\n-\t\treturn 1;\n-\n-\tMETRICS_LOG_ERR(\"port_id: %d is invalid, not active\",\n-\t\tport_id);\n-\n-\treturn 0;\n-}\n-\n static int32_t\n rte_metrics_tel_reg_port_ethdev_to_metrics(uint16_t port_id)\n {\n-\tint ret, num_xstats, ret_val, i;\n-\tstruct rte_eth_xstat *eth_xstats = NULL;\n+\tint ret,  num_xstats, i;\n \tstruct rte_eth_xstat_name *eth_xstats_names = NULL;\n \n-\tif (!rte_eth_dev_is_valid_port(port_id)) {\n-\t\tMETRICS_LOG_ERR(\"port_id: %d is invalid\", port_id);\n-\t\treturn -EINVAL;\n-\t}\n-\n \tnum_xstats = rte_eth_xstats_get(port_id, NULL, 0);\n \tif (num_xstats < 0) {\n \t\tMETRICS_LOG_ERR(\"rte_eth_xstats_get(%u) failed: %d\",\n@@ -57,53 +36,32 @@ rte_metrics_tel_reg_port_ethdev_to_metrics(uint16_t port_id)\n \t\treturn -EPERM;\n \t}\n \n-\teth_xstats = malloc(sizeof(struct rte_eth_xstat) * num_xstats);\n-\tif (eth_xstats == NULL) {\n-\t\tMETRICS_LOG_ERR(\"Failed to malloc memory for xstats\");\n-\t\treturn -ENOMEM;\n-\t}\n-\n-\tret = rte_eth_xstats_get(port_id, eth_xstats, num_xstats);\n \tconst char *xstats_names[num_xstats];\n \teth_xstats_names = malloc(sizeof(struct rte_eth_xstat_name)\n \t\t\t* num_xstats);\n-\tif (ret < 0 || ret > num_xstats) {\n-\t\tMETRICS_LOG_ERR(\"rte_eth_xstats_get(%u) len%i failed: %d\",\n-\t\t\t\tport_id, num_xstats, ret);\n-\t\tret_val = -EPERM;\n-\t\tgoto free_xstats;\n-\t}\n-\n \tif (eth_xstats_names == NULL) {\n \t\tMETRICS_LOG_ERR(\"Failed to malloc memory for xstats_names\");\n-\t\tret_val = -ENOMEM;\n+\t\tret = -ENOMEM;\n \t\tgoto free_xstats;\n \t}\n \n-\tret = rte_eth_xstats_get_names(port_id, eth_xstats_names, num_xstats);\n-\tif (ret < 0 || ret > num_xstats) {\n-\t\tMETRICS_LOG_ERR(\"rte_eth_xstats_get_names(%u) len%i failed: %d\",\n-\t\t\t\tport_id, num_xstats, ret);\n-\t\tret_val = -EPERM;\n+\tif (rte_eth_xstats_get_names(port_id,\n+\t\t\teth_xstats_names, num_xstats) != num_xstats) {\n+\t\tMETRICS_LOG_ERR(\"rte_eth_xstats_get_names(%u) len %d failed\",\n+\t\t\t\tport_id, num_xstats);\n+\t\tret = -EPERM;\n \t\tgoto free_xstats;\n \t}\n \n \tfor (i = 0; i < num_xstats; i++)\n-\t\txstats_names[i] = eth_xstats_names[eth_xstats[i].id].name;\n-\n-\tret_val = rte_metrics_reg_names(xstats_names, num_xstats);\n-\tif (ret_val < 0) {\n+\t\txstats_names[i] = eth_xstats_names[i].name;\n+\tret = rte_metrics_reg_names(xstats_names, num_xstats);\n+\tif (ret < 0)\n \t\tMETRICS_LOG_ERR(\"rte_metrics_reg_names failed - metrics may already be registered\");\n-\t\tret_val = -1;\n-\t\tgoto free_xstats;\n-\t}\n-\n-\tgoto free_xstats;\n \n free_xstats:\n-\tfree(eth_xstats);\n \tfree(eth_xstats_names);\n-\treturn ret_val;\n+\treturn ret;\n }\n \n int32_t\n@@ -113,20 +71,18 @@ rte_metrics_tel_reg_all_ethdev(int *metrics_register_done, int *reg_index_list)\n \t\tconst void *dev_ops;\n \t\tint reg_index;\n \t} drv_idx[RTE_MAX_ETHPORTS] = { {0} };\n-\tint nb_drv_idx = 0;\n-\tuint16_t pid;\n-\tint ret;\n+\tint ret, nb_drv_idx = 0;\n+\tuint16_t d;\n \n-\tRTE_ETH_FOREACH_DEV(pid) {\n+\tRTE_ETH_FOREACH_DEV(d) {\n \t\tint i;\n \t\t/* Different device types have different numbers of stats, so\n \t\t * first check if the stats for this type of device have\n \t\t * already been registered\n \t\t */\n \t\tfor (i = 0; i < nb_drv_idx; i++) {\n-\t\t\tif (rte_eth_devices[pid].dev_ops ==\n-\t\t\t\t\tdrv_idx[i].dev_ops) {\n-\t\t\t\treg_index_list[pid] = drv_idx[i].reg_index;\n+\t\t\tif (rte_eth_devices[d].dev_ops == drv_idx[i].dev_ops) {\n+\t\t\t\treg_index_list[d] = drv_idx[i].reg_index;\n \t\t\t\tbreak;\n \t\t\t}\n \t\t}\n@@ -134,17 +90,16 @@ rte_metrics_tel_reg_all_ethdev(int *metrics_register_done, int *reg_index_list)\n \t\t\tcontinue; /* we found a match, go to next port */\n \n \t\t/* No match, register a new set of xstats for this port */\n-\t\tret = rte_metrics_tel_reg_port_ethdev_to_metrics(pid);\n+\t\tret = rte_metrics_tel_reg_port_ethdev_to_metrics(d);\n \t\tif (ret < 0) {\n-\t\t\tMETRICS_LOG_ERR(\"Failed to register ethdev metrics\");\n-\t\t\treturn -1;\n+\t\t\tMETRICS_LOG_ERR(\"Failed to register ethdev to metrics\");\n+\t\t\treturn ret;\n \t\t}\n-\t\treg_index_list[pid] = ret;\n-\t\tdrv_idx[nb_drv_idx].dev_ops = rte_eth_devices[pid].dev_ops;\n+\t\treg_index_list[d] = ret;\n+\t\tdrv_idx[nb_drv_idx].dev_ops = rte_eth_devices[d].dev_ops;\n \t\tdrv_idx[nb_drv_idx].reg_index = ret;\n \t\tnb_drv_idx++;\n \t}\n-\n \t*metrics_register_done = 1;\n \treturn 0;\n }\n@@ -155,28 +110,17 @@ rte_metrics_tel_update_metrics_ethdev(uint16_t port_id, int reg_start_index)\n \tint ret, num_xstats, i;\n \tstruct rte_eth_xstat *eth_xstats;\n \n-\tif (!rte_eth_dev_is_valid_port(port_id)) {\n-\t\tMETRICS_LOG_ERR(\"port_id: %d is invalid\", port_id);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tret = rte_metrics_tel_is_port_active(port_id);\n-\tif (ret < 1)\n-\t\treturn -EINVAL;\n-\n \tnum_xstats = rte_eth_xstats_get(port_id, NULL, 0);\n \tif (num_xstats < 0) {\n \t\tMETRICS_LOG_ERR(\"rte_eth_xstats_get(%u) failed: %d\", port_id,\n \t\t\t\tnum_xstats);\n \t\treturn -EPERM;\n \t}\n-\n \teth_xstats = malloc(sizeof(struct rte_eth_xstat) * num_xstats);\n \tif (eth_xstats == NULL) {\n \t\tMETRICS_LOG_ERR(\"Failed to malloc memory for xstats\");\n \t\treturn -ENOMEM;\n \t}\n-\n \tret = rte_eth_xstats_get(port_id, eth_xstats, num_xstats);\n \tif (ret < 0 || ret > num_xstats) {\n \t\tfree(eth_xstats);\n@@ -188,223 +132,96 @@ rte_metrics_tel_update_metrics_ethdev(uint16_t port_id, int reg_start_index)\n \tuint64_t xstats_values[num_xstats];\n \tfor (i = 0; i < num_xstats; i++)\n \t\txstats_values[i] = eth_xstats[i].value;\n-\n-\tret = rte_metrics_update_values(port_id, reg_start_index, xstats_values,\n-\t\t\tnum_xstats);\n-\tif (ret < 0) {\n+\tif (rte_metrics_update_values(port_id, reg_start_index, xstats_values,\n+\t\t\tnum_xstats) < 0) {\n \t\tMETRICS_LOG_ERR(\"Could not update metrics values\");\n \t\tfree(eth_xstats);\n \t\treturn -EPERM;\n \t}\n-\n \tfree(eth_xstats);\n \treturn 0;\n }\n \n-static int\n-rte_metrics_tel_get_metrics(uint32_t port_id, struct rte_metric_value\n-\t*metrics, struct rte_metric_name *names, int num_metrics)\n-{\n-\tint ret, num_values;\n-\n-\tif (num_metrics < 0) {\n-\t\tMETRICS_LOG_ERR(\"Invalid metrics count\");\n-\t\treturn -EINVAL;\n-\t} else if (num_metrics == 0) {\n-\t\tMETRICS_LOG_ERR(\"No metrics to display (none have been registered)\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\tif (metrics == NULL) {\n-\t\tMETRICS_LOG_ERR(\"Metrics must be initialised.\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tif (names == NULL) {\n-\t\tMETRICS_LOG_ERR(\"Names must be initialised.\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tret = rte_metrics_get_names(names, num_metrics);\n-\tif (ret < 0 || ret > num_metrics) {\n-\t\tMETRICS_LOG_ERR(\"Cannot get metrics names\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\tnum_values = rte_metrics_get_values(port_id, NULL, 0);\n-\tret = rte_metrics_get_values(port_id, metrics, num_values);\n-\tif (ret < 0 || ret > num_values) {\n-\t\tMETRICS_LOG_ERR(\"Cannot get metrics values\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\treturn 0;\n-}\n-\n static int32_t\n-rte_metrics_tel_json_format_stat(json_t *stats, const char *metric_name,\n-\tuint64_t metric_value)\n-{\n-\tint ret;\n-\tjson_t *stat = json_object();\n-\n-\tif (stat == NULL) {\n-\t\tMETRICS_LOG_ERR(\"Could not create stat JSON object\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\tret = json_object_set_new(stat, \"name\", json_string(metric_name));\n-\tif (ret < 0) {\n-\t\tMETRICS_LOG_ERR(\"Stat Name field cannot be set\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\tret = json_object_set_new(stat, \"value\", json_integer(metric_value));\n-\tif (ret < 0) {\n-\t\tMETRICS_LOG_ERR(\"Stat Value field cannot be set\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\tret = json_array_append_new(stats, stat);\n-\tif (ret < 0) {\n-\t\tMETRICS_LOG_ERR(\"Stat cannot be added to stats json array\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int32_t\n-rte_metrics_tel_json_format_port(uint32_t port_id, json_t *ports,\n+rte_metrics_tel_format_port(uint32_t pid, json_t *ports,\n \tuint32_t *metric_ids, int num_metric_ids)\n {\n-\tstruct rte_metric_value *metrics = 0;\n-\tstruct rte_metric_name *names = 0;\n-\tint num_metrics, ret;\n+\tstruct rte_metric_value *metrics = NULL;\n+\tstruct rte_metric_name *names = NULL;\n+\tint num_metrics, i, ret = -EPERM; /* most error cases return EPERM */\n \tjson_t *port, *stats;\n-\tint i;\n \n \tnum_metrics = rte_metrics_get_names(NULL, 0);\n \tif (num_metrics < 0) {\n \t\tMETRICS_LOG_ERR(\"Cannot get metrics count\");\n-\t\tgoto einval_fail;\n+\t\treturn -EINVAL;\n \t} else if (num_metrics == 0) {\n \t\tMETRICS_LOG_ERR(\"No metrics to display (none have been registered)\");\n-\t\tgoto eperm_fail;\n+\t\treturn -EPERM;\n \t}\n \n \tmetrics = malloc(sizeof(struct rte_metric_value) * num_metrics);\n \tnames = malloc(sizeof(struct rte_metric_name) * num_metrics);\n \tif (metrics == NULL || names == NULL) {\n \t\tMETRICS_LOG_ERR(\"Cannot allocate memory\");\n-\t\tfree(metrics);\n-\t\tfree(names);\n \t\treturn -ENOMEM;\n \t}\n \n-\tret  = rte_metrics_tel_get_metrics(port_id, metrics, names,\n-\t\t\tnum_metrics);\n-\tif (ret < 0) {\n-\t\tfree(metrics);\n-\t\tfree(names);\n-\t\tMETRICS_LOG_ERR(\"rte_metrics_tel_get_metrics failed\");\n-\t\treturn ret;\n+\tif (rte_metrics_get_names(names, num_metrics) != num_metrics ||\n+\t\t\trte_metrics_get_values(pid, metrics, num_metrics)\n+\t\t\t\t!= num_metrics) {\n+\t\tMETRICS_LOG_ERR(\"Error getting metrics\");\n+\t\tgoto fail;\n \t}\n \n-\tport = json_object();\n \tstats = json_array();\n-\tif (port == NULL || stats == NULL) {\n-\t\tMETRICS_LOG_ERR(\"Could not create port/stats JSON objects\");\n-\t\tgoto eperm_fail;\n-\t}\n-\n-\tret = json_object_set_new(port, \"port\", json_integer(port_id));\n-\tif (ret < 0) {\n-\t\tMETRICS_LOG_ERR(\"Port field cannot be set\");\n-\t\tgoto eperm_fail;\n+\tif (stats == NULL) {\n+\t\tMETRICS_LOG_ERR(\"Could not create stats JSON object\");\n+\t\tgoto fail;\n \t}\n \n-\tfor (i = 0; i < num_metric_ids; i++) {\n-\t\tint metric_id = metric_ids[i];\n-\t\tint metric_index = -1;\n-\t\tint metric_name_key = -1;\n+\tfor (i = 0; i < num_metrics; i++) {\n \t\tint32_t j;\n-\t\tuint64_t metric_value;\n-\n-\t\tif (metric_id >= num_metrics) {\n-\t\t\tMETRICS_LOG_ERR(\"Metric_id: %d is not valid\",\n-\t\t\t\t\tmetric_id);\n-\t\t\tgoto einval_fail;\n-\t\t}\n-\n-\t\tfor (j = 0; j < num_metrics; j++) {\n-\t\t\tif (metrics[j].key == metric_id) {\n-\t\t\t\tmetric_name_key = metrics[j].key;\n-\t\t\t\tmetric_index = j;\n+\t\tfor (j = 0; j < num_metric_ids; j++)\n+\t\t\tif (metrics[i].key == metric_ids[j])\n \t\t\t\tbreak;\n-\t\t\t}\n-\t\t}\n-\n-\t\tconst char *metric_name = names[metric_name_key].name;\n-\t\tmetric_value = metrics[metric_index].value;\n \n-\t\tif (metric_name_key < 0 || metric_index < 0) {\n-\t\t\tMETRICS_LOG_ERR(\"Could not get metric name/index\");\n-\t\t\tgoto eperm_fail;\n-\t\t}\n+\t\tif (num_metric_ids > 0 && j == num_metric_ids)\n+\t\t\tcontinue; /* can't find this id */\n \n-\t\tret = rte_metrics_tel_json_format_stat(stats, metric_name,\n-\t\t\t\tmetric_value);\n-\t\tif (ret < 0) {\n+\t\tjson_t *stat = json_pack(\"{s,s,s,I}\",\n+\t\t\t\t\"name\", names[metrics[i].key].name,\n+\t\t\t\t\"value\", metrics[i].value);\n+\t\tif (stat == NULL || json_array_append_new(stats, stat) < 0) {\n \t\t\tMETRICS_LOG_ERR(\"Format stat with id: %u failed\",\n-\t\t\t\t\tmetric_id);\n-\t\t\tfree(metrics);\n-\t\t\tfree(names);\n-\t\t\treturn ret;\n+\t\t\t\t\tmetrics[i].key);\n+\t\t\tgoto fail;\n \t\t}\n \t}\n \n-\tif (json_array_size(stats) == 0)\n-\t\tret = json_object_set_new(port, \"stats\", json_null());\n-\telse\n-\t\tret = json_object_set_new(port, \"stats\", stats);\n-\n-\tif (ret < 0) {\n-\t\tMETRICS_LOG_ERR(\"Stats object cannot be set\");\n-\t\tgoto eperm_fail;\n-\t}\n-\n-\tret = json_array_append_new(ports, port);\n-\tif (ret < 0) {\n-\t\tMETRICS_LOG_ERR(\"Port object cannot be added to ports array\");\n-\t\tgoto eperm_fail;\n+\tport = json_pack(\"{s,i,s,o}\", \"port\", pid, \"stats\",\n+\t\t\tjson_array_size(stats) ? stats : json_null());\n+\tif (port == NULL || json_array_append_new(ports, port) < 0) {\n+\t\tMETRICS_LOG_ERR(\"Error creating port and adding to ports\");\n+\t\tgoto fail;\n \t}\n \n \tfree(metrics);\n \tfree(names);\n \treturn 0;\n \n-eperm_fail:\n-\tfree(metrics);\n-\tfree(names);\n-\treturn -EPERM;\n-\n-einval_fail:\n+fail:\n \tfree(metrics);\n \tfree(names);\n-\treturn -EINVAL;\n+\treturn ret;\n }\n \n int32_t\n rte_metrics_tel_encode_json_format(struct telemetry_encode_param *ep,\n \t\tchar **json_buffer)\n {\n-\tint ret;\n \tjson_t *root, *ports;\n-\tint i;\n-\tuint32_t port_id;\n-\tint num_port_ids;\n-\tint num_metric_ids;\n+\tint ret, i;\n \n \tports = json_array();\n \tif (ports == NULL) {\n@@ -413,28 +230,15 @@ rte_metrics_tel_encode_json_format(struct telemetry_encode_param *ep,\n \t}\n \n \tif (ep->type == PORT_STATS) {\n-\t\tnum_port_ids = ep->pp.num_port_ids;\n-\t\tnum_metric_ids = ep->pp.num_metric_ids;\n-\n-\t\tif (num_port_ids <= 0 || num_metric_ids <= 0) {\n-\t\t\tMETRICS_LOG_ERR(\"Please provide port and metric ids to query\");\n+\t\tif (ep->pp.num_port_ids <= 0) {\n+\t\t\tMETRICS_LOG_ERR(\"Please provide port/metric ids\");\n \t\t\treturn -EINVAL;\n \t\t}\n \n-\t\tfor (i = 0; i < num_port_ids; i++) {\n-\t\t\tport_id = ep->pp.port_ids[i];\n-\t\t\tif (!rte_eth_dev_is_valid_port(port_id)) {\n-\t\t\t\tMETRICS_LOG_ERR(\"Port: %d invalid\",\n-\t\t\t\t\t\tport_id);\n-\t\t\t\treturn -EINVAL;\n-\t\t\t}\n-\t\t}\n-\n-\t\tfor (i = 0; i < num_port_ids; i++) {\n-\t\t\tport_id = ep->pp.port_ids[i];\n-\t\t\tret = rte_metrics_tel_json_format_port(port_id,\n+\t\tfor (i = 0; i < ep->pp.num_port_ids; i++) {\n+\t\t\tret = rte_metrics_tel_format_port(ep->pp.port_ids[i],\n \t\t\t\t\tports, &ep->pp.metric_ids[0],\n-\t\t\t\t\tnum_metric_ids);\n+\t\t\t\t\tep->pp.num_metric_ids);\n \t\t\tif (ret < 0) {\n \t\t\t\tMETRICS_LOG_ERR(\"Format port in JSON failed\");\n \t\t\t\treturn ret;\n@@ -442,34 +246,21 @@ rte_metrics_tel_encode_json_format(struct telemetry_encode_param *ep,\n \t\t}\n \t} else if (ep->type == GLOBAL_STATS) {\n \t\t/* Request Global Metrics */\n-\t\tret = rte_metrics_tel_json_format_port(RTE_METRICS_GLOBAL,\n-\t\t\t\tports, &ep->gp.metric_ids[0],\n-\t\t\t\tep->gp.num_metric_ids);\n+\t\tret = rte_metrics_tel_format_port(RTE_METRICS_GLOBAL,\n+\t\t\t\tports, NULL, 0);\n \t\tif (ret < 0) {\n-\t\t\tMETRICS_LOG_ERR(\" Request Global Metrics Failed\");\n+\t\t\tMETRICS_LOG_ERR(\"Request Global Metrics Failed\");\n \t\t\treturn ret;\n \t\t}\n \t} else {\n-\t\tMETRICS_LOG_ERR(\" Invalid metrics type in encode params\");\n+\t\tMETRICS_LOG_ERR(\"Invalid metrics type in encode params\");\n \t\treturn -EINVAL;\n \t}\n \n-\troot = json_object();\n+\troot = json_pack(\"{s,s,s,o}\", \"status_code\", \"Status OK: 200\",\n+\t\t\t\"data\", ports);\n \tif (root == NULL) {\n-\t\tMETRICS_LOG_ERR(\"Could not create root JSON object\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\tret = json_object_set_new(root, \"status_code\",\n-\t\tjson_string(\"Status OK: 200\"));\n-\tif (ret < 0) {\n-\t\tMETRICS_LOG_ERR(\"Status code field cannot be set\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\tret = json_object_set_new(root, \"data\", ports);\n-\tif (ret < 0) {\n-\t\tMETRICS_LOG_ERR(\"Data field cannot be set\");\n+\t\tMETRICS_LOG_ERR(\"Root, Status or data field cannot be set\");\n \t\treturn -EPERM;\n \t}\n \n@@ -478,42 +269,6 @@ rte_metrics_tel_encode_json_format(struct telemetry_encode_param *ep,\n \treturn 0;\n }\n \n-int32_t\n-rte_metrics_tel_get_global_stats(struct telemetry_encode_param *ep)\n-{\n-\tint num_metrics, ret, i;\n-\tstruct rte_metric_value *values;\n-\n-\tnum_metrics = rte_metrics_get_values(RTE_METRICS_GLOBAL, NULL, 0);\n-\tif (num_metrics < 0) {\n-\t\tMETRICS_LOG_ERR(\"Cannot get metrics count\");\n-\t\treturn -EINVAL;\n-\t} else if (num_metrics == 0) {\n-\t\tMETRICS_LOG_ERR(\"No metrics to display (none have been registered)\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\tvalues = malloc(sizeof(struct rte_metric_value) * num_metrics);\n-\tif (values == NULL) {\n-\t\tMETRICS_LOG_ERR(\"Cannot allocate memory\");\n-\t\treturn -ENOMEM;\n-\t}\n-\n-\tret = rte_metrics_get_values(RTE_METRICS_GLOBAL, values, num_metrics);\n-\tif (ret < 0) {\n-\t\tMETRICS_LOG_ERR(\"Could not get stat values\");\n-\t\tfree(values);\n-\t\treturn -EINVAL;\n-\t}\n-\tfor (i = 0; i < num_metrics; i++)\n-\t\tep->gp.metric_ids[i] = values[i].key;\n-\n-\tep->gp.num_metric_ids = num_metrics;\n-\tep->type = GLOBAL_STATS;\n-\tfree(values);\n-\treturn 0;\n-}\n-\n int32_t\n rte_metrics_tel_get_ports_stats_json(struct telemetry_encode_param *ep,\n \t\tint *reg_index, char **json_buffer)\n@@ -547,24 +302,7 @@ rte_metrics_tel_get_ports_stats_json(struct telemetry_encode_param *ep,\n int32_t\n rte_metrics_tel_get_port_stats_ids(struct telemetry_encode_param *ep)\n {\n-\tint ret, num_metrics, i, p;\n-\tstruct rte_metric_value *values;\n-\tuint64_t num_port_ids = 0;\n-\n-\tnum_metrics = rte_metrics_get_values(0, NULL, 0);\n-\tif (num_metrics < 0) {\n-\t\tMETRICS_LOG_ERR(\"Cannot get metrics count\");\n-\t\treturn -EINVAL;\n-\t} else if (num_metrics == 0) {\n-\t\tMETRICS_LOG_ERR(\"No metrics to display (none have been registered)\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\tvalues = malloc(sizeof(struct rte_metric_value) * num_metrics);\n-\tif (values == NULL) {\n-\t\tMETRICS_LOG_ERR(\"Cannot allocate memory\");\n-\t\treturn -ENOMEM;\n-\t}\n+\tint p, num_port_ids = 0;\n \n \tRTE_ETH_FOREACH_DEV(p) {\n \t\tep->pp.port_ids[num_port_ids] = p;\n@@ -573,51 +311,26 @@ rte_metrics_tel_get_port_stats_ids(struct telemetry_encode_param *ep)\n \n \tif (!num_port_ids) {\n \t\tMETRICS_LOG_ERR(\"No active ports\");\n-\t\tgoto fail;\n-\t}\n-\n-\tret = rte_metrics_get_values(ep->pp.port_ids[0], values, num_metrics);\n-\tif (ret < 0) {\n-\t\tMETRICS_LOG_ERR(\"Could not get stat values\");\n-\t\tgoto fail;\n+\t\treturn -EINVAL;\n \t}\n-\tfor (i = 0; i < num_metrics; i++)\n-\t\tep->pp.metric_ids[i] = values[i].key;\n \n \tep->pp.num_port_ids = num_port_ids;\n-\tep->pp.num_metric_ids = num_metrics;\n+\tep->pp.num_metric_ids = 0;\n \tep->type = PORT_STATS;\n \treturn 0;\n-\n-fail:\n-\tfree(values);\n-\treturn -EINVAL;\n }\n \n static int32_t\n rte_metrics_tel_stat_names_to_ids(const char * const *stat_names,\n-\tuint32_t *stat_ids, uint64_t num_stat_names)\n+\tuint32_t *stat_ids, int num_stat_names)\n {\n \tstruct rte_metric_name *names;\n-\tint ret, num_metrics;\n-\tuint32_t i, k;\n-\n-\tif (stat_names == NULL) {\n-\t\tMETRICS_LOG_WARN(\"Invalid stat_names argument\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tif (num_stat_names <= 0) {\n-\t\tMETRICS_LOG_WARN(\"Invalid num_stat_names argument\");\n-\t\treturn -EINVAL;\n-\t}\n+\tint num_metrics;\n+\tint i, j, nb_stat_ids = 0;\n \n \tnum_metrics = rte_metrics_get_names(NULL, 0);\n-\tif (num_metrics < 0) {\n-\t\tMETRICS_LOG_ERR(\"Cannot get metrics count\");\n-\t\treturn -EPERM;\n-\t} else if (num_metrics == 0) {\n-\t\tMETRICS_LOG_WARN(\"No metrics have been registered\");\n+\tif (num_metrics <= 0) {\n+\t\tMETRICS_LOG_ERR(\"Error getting metrics count - no metrics may be registered\");\n \t\treturn -EPERM;\n \t}\n \n@@ -627,29 +340,25 @@ rte_metrics_tel_stat_names_to_ids(const char * const *stat_names,\n \t\treturn -ENOMEM;\n \t}\n \n-\tret = rte_metrics_get_names(names, num_metrics);\n-\tif (ret < 0 || ret > num_metrics) {\n+\tif (rte_metrics_get_names(names, num_metrics) != num_metrics) {\n \t\tMETRICS_LOG_ERR(\"Cannot get metrics names\");\n \t\tfree(names);\n \t\treturn -EPERM;\n \t}\n \n-\tk = 0;\n-\tfor (i = 0; i < (uint32_t)num_stat_names; i++) {\n-\t\tuint32_t j;\n-\t\tfor (j = 0; j < (uint32_t)num_metrics; j++) {\n+\tfor (i = 0; i < num_stat_names; i++) {\n+\t\tfor (j = 0; j < num_metrics; j++) {\n \t\t\tif (strcmp(stat_names[i], names[j].name) == 0) {\n-\t\t\t\tstat_ids[k] = j;\n-\t\t\t\tk++;\n+\t\t\t\tstat_ids[nb_stat_ids++] = j;\n \t\t\t\tbreak;\n \t\t\t}\n \t\t}\n-\t}\n-\n-\tif (k != num_stat_names) {\n-\t\tMETRICS_LOG_WARN(\"Invalid stat names provided\");\n-\t\tfree(names);\n-\t\treturn -EINVAL;\n+\t\tif (j == num_metrics) {\n+\t\t\tMETRICS_LOG_WARN(\"Invalid stat name %s\\n\",\n+\t\t\t\t\tstat_names[i]);\n+\t\t\tfree(names);\n+\t\t\treturn -EINVAL;\n+\t\t}\n \t}\n \n \tfree(names);\n@@ -670,28 +379,21 @@ rte_metrics_tel_extract_data(struct telemetry_encode_param *ep, json_t *data)\n \tmemset(ep, 0, sizeof(*ep));\n \tep->pp.num_port_ids = json_array_size(port_ids_json);\n \tep->pp.num_metric_ids = num_stat_names;\n-\tif (!json_is_object(data)) {\n+\tif (!json_is_object(data) || !json_is_array(port_ids_json) ||\n+\t\t\t!json_is_array(stat_names_json)) {\n \t\tMETRICS_LOG_WARN(\"Invalid data provided for this command\");\n \t\treturn -EINVAL;\n \t}\n \n-\tif (!json_is_array(port_ids_json) ||\n-\t\t !json_is_array(stat_names_json)) {\n-\t\tMETRICS_LOG_WARN(\"Invalid input data array(s)\");\n-\t\treturn -EINVAL;\n-\t}\n-\n \tjson_array_foreach(port_ids_json, index, value) {\n \t\tif (!json_is_integer(value)) {\n \t\t\tMETRICS_LOG_WARN(\"Port ID given is not valid\");\n \t\t\treturn -EINVAL;\n \t\t}\n \t\tep->pp.port_ids[index] = json_integer_value(value);\n-\t\tret = rte_metrics_tel_is_port_active(ep->pp.port_ids[index]);\n-\t\tif (ret < 1)\n+\t\tif (rte_eth_dev_is_valid_port(ep->pp.port_ids[index]) < 1)\n \t\t\treturn -EINVAL;\n \t}\n-\n \tjson_array_foreach(stat_names_json, index, value) {\n \t\tif (!json_is_string(value)) {\n \t\t\tMETRICS_LOG_WARN(\"Stat Name given is not a string\");\ndiff --git a/lib/librte_metrics/rte_metrics_telemetry.h b/lib/librte_metrics/rte_metrics_telemetry.h\nindex 4104f1568..6c2391c56 100644\n--- a/lib/librte_metrics/rte_metrics_telemetry.h\n+++ b/lib/librte_metrics/rte_metrics_telemetry.h\n@@ -21,18 +21,12 @@ enum rte_telemetry_stats_type {\n \n struct telemetry_encode_param {\n \tenum rte_telemetry_stats_type type;\n-\tunion {\n-\t\tstruct port_param {\n-\t\t\tint num_metric_ids;\n-\t\t\tuint32_t metric_ids[RTE_METRICS_MAX_METRICS];\n-\t\t\tint num_port_ids;\n-\t\t\tuint32_t port_ids[RTE_MAX_ETHPORTS];\n-\t\t} pp;\n-\t\tstruct global_param {\n-\t\t\tint num_metric_ids;\n-\t\t\tuint32_t metric_ids[RTE_METRICS_MAX_METRICS];\n-\t\t} gp;\n-\t};\n+\tstruct port_param {\n+\t\tint num_metric_ids;\n+\t\tuint32_t metric_ids[RTE_METRICS_MAX_METRICS];\n+\t\tint num_port_ids;\n+\t\tuint32_t port_ids[RTE_MAX_ETHPORTS];\n+\t} pp;\n };\n \n struct telemetry_metrics_data {\ndiff --git a/lib/librte_telemetry/rte_telemetry.c b/lib/librte_telemetry/rte_telemetry.c\nindex 1867b61f6..2022ce68e 100644\n--- a/lib/librte_telemetry/rte_telemetry.c\n+++ b/lib/librte_telemetry/rte_telemetry.c\n@@ -145,11 +145,6 @@ rte_telemetry_send_global_stats_values(struct telemetry_encode_param *ep,\n \t\treturn -1;\n \t}\n \n-\tif (ep->gp.num_metric_ids < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid num_metric_ids, must be positive\");\n-\t\tgoto einval_fail;\n-\t}\n-\n \tret = rte_metrics_tel_encode_json_format(ep, &json_buffer);\n \tif (ret < 0) {\n \t\tTELEMETRY_LOG_ERR(\"JSON encode function failed\");\n@@ -166,12 +161,6 @@ rte_telemetry_send_global_stats_values(struct telemetry_encode_param *ep,\n \t}\n \n \treturn 0;\n-\n-einval_fail:\n-\tret = rte_telemetry_send_error_response(telemetry, -EINVAL);\n-\tif (ret < 0)\n-\t\tTELEMETRY_LOG_ERR(\"Could not send error\");\n-\treturn -1;\n }\n \n int32_t\ndiff --git a/lib/librte_telemetry/rte_telemetry_parser.c b/lib/librte_telemetry/rte_telemetry_parser.c\nindex 11edf79e8..4e236e1e6 100644\n--- a/lib/librte_telemetry/rte_telemetry_parser.c\n+++ b/lib/librte_telemetry/rte_telemetry_parser.c\n@@ -225,9 +225,8 @@ rte_telemetry_command_global_stat_values(struct telemetry_impl *telemetry,\n \t int action, json_t *data)\n {\n \tint ret;\n-\tstruct telemetry_encode_param ep;\n+\tstruct telemetry_encode_param ep = { .type = GLOBAL_STATS };\n \n-\tmemset(&ep, 0, sizeof(ep));\n \tif (telemetry == NULL) {\n \t\tTELEMETRY_LOG_ERR(\"Invalid telemetry argument\");\n \t\treturn -1;\n@@ -249,15 +248,6 @@ rte_telemetry_command_global_stat_values(struct telemetry_impl *telemetry,\n \t\treturn -1;\n \t}\n \n-\tret = rte_metrics_tel_get_global_stats(&ep);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not get global stat values\");\n-\t\tret = rte_telemetry_send_error_response(telemetry, ret);\n-\t\tif (ret < 0)\n-\t\t\tTELEMETRY_LOG_ERR(\"Could not send error\");\n-\t\treturn -1;\n-\t}\n-\n \tret = rte_telemetry_send_global_stats_values(&ep, telemetry);\n \tif (ret < 0) {\n \t\tTELEMETRY_LOG_ERR(\"Sending global stats values failed\");\n",
    "prefixes": [
        "02/12"
    ]
}