get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 69269,
    "url": "https://patches.dpdk.org/api/patches/69269/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20200424124159.45989-15-ciara.power@intel.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<20200424124159.45989-15-ciara.power@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200424124159.45989-15-ciara.power@intel.com",
    "date": "2020-04-24T12:41:55",
    "name": "[v4,14/18] telemetry: remove existing telemetry files",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "4a74e815a152652d698ba660e25e955c8510c560",
    "submitter": {
        "id": 978,
        "url": "https://patches.dpdk.org/api/people/978/?format=api",
        "name": "Power, Ciara",
        "email": "ciara.power@intel.com"
    },
    "delegate": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20200424124159.45989-15-ciara.power@intel.com/mbox/",
    "series": [
        {
            "id": 9624,
            "url": "https://patches.dpdk.org/api/series/9624/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=9624",
            "date": "2020-04-24T12:41:41",
            "name": "update and simplify telemetry library.",
            "version": 4,
            "mbox": "https://patches.dpdk.org/series/9624/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/69269/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/69269/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 66F04A00C2;\n\tFri, 24 Apr 2020 15:04:36 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 7BCD01D409;\n\tFri, 24 Apr 2020 15:02:29 +0200 (CEST)",
            "from mga02.intel.com (mga02.intel.com [134.134.136.20])\n by dpdk.org (Postfix) with ESMTP id B64C71C436\n for <dev@dpdk.org>; Fri, 24 Apr 2020 15:02:18 +0200 (CEST)",
            "from orsmga007.jf.intel.com ([10.7.209.58])\n by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 24 Apr 2020 06:02:18 -0700",
            "from silpixa00399953.ir.intel.com (HELO\n silpixa00399953.ger.corp.intel.com) ([10.237.222.53])\n by orsmga007.jf.intel.com with ESMTP; 24 Apr 2020 06:02:15 -0700"
        ],
        "IronPort-SDR": [
            "\n jr7wdowHVFfQJCm0yi+0m5yP0LXfglWpIecK8wm+fOUIFpziv/1O85EG5wRN+cQ56sFzNo2WJ4\n ykgcrQljqCcQ==",
            "\n NcN0jWM9wH79PufG/26II9r9pOxV5zR6vxzTISSj10wwo9/zKXg22yQTUEzJSY4CkZyS9/dpwT\n J2Fi8KnwcTOA=="
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.73,311,1583222400\"; d=\"scan'208\";a=\"245228381\"",
        "From": "Ciara Power <ciara.power@intel.com>",
        "To": "dev@dpdk.org,\n\tkevin.laatz@intel.com",
        "Cc": "reshma.pattan@intel.com, jerinjacobk@gmail.com, david.marchand@redhat.com,\n keith.wiles@intel.com, mb@smartsharesystems.com, thomas@monjalon.net,\n Ciara Power <ciara.power@intel.com>",
        "Date": "Fri, 24 Apr 2020 13:41:55 +0100",
        "Message-Id": "<20200424124159.45989-15-ciara.power@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20200424124159.45989-1-ciara.power@intel.com>",
        "References": "<20200319171907.60891-1-ciara.power@intel.com>\n <20200424124159.45989-1-ciara.power@intel.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v4 14/18] telemetry: remove existing telemetry\n\tfiles",
        "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": "This patch removes the existing telemetry files, which are now redundant\nas the new version of telemetry has backward compatibility for their\nfunctionality.\n\nSigned-off-by: Ciara Power <ciara.power@intel.com>\n---\n lib/librte_metrics/rte_metrics_telemetry.c    |    9 -\n lib/librte_telemetry/Makefile                 |    4 -\n lib/librte_telemetry/meson.build              |   15 +-\n lib/librte_telemetry/rte_telemetry.c          | 1384 -----------------\n lib/librte_telemetry/rte_telemetry.h          |   54 +-\n lib/librte_telemetry/rte_telemetry_internal.h |  114 --\n lib/librte_telemetry/rte_telemetry_parser.c   |  435 ------\n lib/librte_telemetry/rte_telemetry_parser.h   |   15 -\n .../rte_telemetry_parser_test.c               |  533 -------\n .../rte_telemetry_socket_tests.h              |   36 -\n .../rte_telemetry_version.map                 |    6 -\n lib/librte_telemetry/telemetry.c              |   20 +-\n 12 files changed, 23 insertions(+), 2602 deletions(-)\n delete mode 100644 lib/librte_telemetry/rte_telemetry.c\n delete mode 100644 lib/librte_telemetry/rte_telemetry_internal.h\n delete mode 100644 lib/librte_telemetry/rte_telemetry_parser.c\n delete mode 100644 lib/librte_telemetry/rte_telemetry_parser.h\n delete mode 100644 lib/librte_telemetry/rte_telemetry_parser_test.c\n delete mode 100644 lib/librte_telemetry/rte_telemetry_socket_tests.h",
    "diff": "diff --git a/lib/librte_metrics/rte_metrics_telemetry.c b/lib/librte_metrics/rte_metrics_telemetry.c\nindex 49de9d74b5..5ef6f765a2 100644\n--- a/lib/librte_metrics/rte_metrics_telemetry.c\n+++ b/lib/librte_metrics/rte_metrics_telemetry.c\n@@ -7,7 +7,6 @@\n #include <rte_ethdev.h>\n #include <rte_string_fns.h>\n #ifdef RTE_LIBRTE_TELEMETRY\n-#include <rte_telemetry_internal.h>\n #include <rte_telemetry_legacy.h>\n #endif\n \n@@ -527,14 +526,6 @@ handle_ports_stats_values_by_name(const char *cmd __rte_unused,\n RTE_INIT(metrics_ctor)\n {\n #ifdef RTE_LIBRTE_TELEMETRY\n-\tstatic const struct metrics_functions fns = {\n-\t\t.reg_all_ethdev = rte_metrics_tel_reg_all_ethdev,\n-\t\t.encode_json_format = rte_metrics_tel_encode_json_format,\n-\t\t.get_port_stats_ids = rte_metrics_tel_get_port_stats_ids,\n-\t\t.get_ports_stats_json = rte_metrics_tel_get_ports_stats_json,\n-\t\t.extract_data = rte_metrics_tel_extract_data\n-\t};\n-\trte_telemetry_set_metrics_fns(&fns); /* assign them to telemetry lib */\n \trte_telemetry_legacy_register(\"ports_all_stat_values\", DATA_NOT_REQ,\n \t\t\thandle_ports_all_stats_values);\n \trte_telemetry_legacy_register(\"global_stat_values\", DATA_NOT_REQ,\ndiff --git a/lib/librte_telemetry/Makefile b/lib/librte_telemetry/Makefile\nindex 260dce3e3d..0dce053aeb 100644\n--- a/lib/librte_telemetry/Makefile\n+++ b/lib/librte_telemetry/Makefile\n@@ -15,14 +15,10 @@ CFLAGS += -pthread\n \n LDLIBS += -lrte_eal\n LDLIBS += -lpthread\n-LDLIBS += -ljansson\n \n EXPORT_MAP := rte_telemetry_version.map\n \n # library source files\n-SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) := rte_telemetry.c\n-SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += rte_telemetry_parser.c\n-SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += rte_telemetry_parser_test.c\n SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += telemetry.c\n SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += telemetry_data.c\n SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += telemetry_legacy.c\ndiff --git a/lib/librte_telemetry/meson.build b/lib/librte_telemetry/meson.build\nindex 5bcef6c81f..f0af11a4ce 100644\n--- a/lib/librte_telemetry/meson.build\n+++ b/lib/librte_telemetry/meson.build\n@@ -3,16 +3,7 @@\n \n includes = [global_inc]\n \n-sources = files('rte_telemetry.c', 'rte_telemetry_parser.c', 'rte_telemetry_parser_test.c',\n-\t'telemetry.c', 'telemetry_data.c', 'telemetry_legacy.c')\n-headers = files('rte_telemetry.h', 'rte_telemetry_internal.h', 'rte_telemetry_parser.h')\n+sources = files('telemetry.c', 'telemetry_data.c', 'telemetry_legacy.c')\n+headers = files('rte_telemetry.h')\n includes += include_directories('../librte_metrics')\n-\n-jansson = dependency('jansson', required: false)\n-if jansson.found()\n-\text_deps += jansson\n-\tdpdk_app_link_libraries += ['telemetry']\n-else\n-\tbuild = false\n-\treason = 'missing dependency \"jansson\"'\n-endif\n+dpdk_app_link_libraries += ['telemetry']\ndiff --git a/lib/librte_telemetry/rte_telemetry.c b/lib/librte_telemetry/rte_telemetry.c\ndeleted file mode 100644\nindex 45b6d9d948..0000000000\n--- a/lib/librte_telemetry/rte_telemetry.c\n+++ /dev/null\n@@ -1,1384 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2018 Intel Corporation\n- */\n-\n-#include <unistd.h>\n-#include <fcntl.h>\n-#include <pthread.h>\n-#include <sys/socket.h>\n-#include <sys/un.h>\n-#include <jansson.h>\n-\n-#include <rte_eal.h>\n-#include <rte_metrics.h>\n-#include <rte_option.h>\n-#include <rte_string_fns.h>\n-#include <rte_lcore.h>\n-\n-#include \"rte_telemetry.h\"\n-#include \"rte_telemetry_internal.h\"\n-#include \"rte_telemetry_parser.h\"\n-#include \"rte_telemetry_socket_tests.h\"\n-\n-#define BUF_SIZE 1024\n-#define ACTION_POST 1\n-#define SLEEP_TIME 10\n-\n-#define SELFTEST_VALID_CLIENT \"/var/run/dpdk/valid_client\"\n-#define SELFTEST_INVALID_CLIENT \"/var/run/dpdk/invalid_client\"\n-#define SOCKET_TEST_CLIENT_PATH \"/var/run/dpdk/client\"\n-\n-static telemetry_impl *static_telemetry;\n-\n-struct telemetry_message_test {\n-\tconst char *test_name;\n-\tint (*test_func_ptr)(struct telemetry_impl *telemetry, int fd);\n-};\n-\n-struct json_data {\n-\tchar *status_code;\n-\tconst char *data;\n-\tint port;\n-\tchar *stat_name;\n-\tint stat_value;\n-};\n-\n-/* global array of functions pointers to metrics library */\n-const struct metrics_functions *metrics_fns;\n-\n-void\n-rte_telemetry_set_metrics_fns(const struct metrics_functions *fns)\n-{\n-\tmetrics_fns = fns;\n-}\n-\n-static void\n-rte_telemetry_get_runtime_dir(char *socket_path, size_t size)\n-{\n-\tsnprintf(socket_path, size, \"%s/telemetry\", rte_eal_get_runtime_dir());\n-}\n-\n-static int32_t\n-rte_telemetry_write_to_socket(struct telemetry_impl *telemetry,\n-\tconst char *json_string)\n-{\n-\tint ret;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not initialise TELEMETRY_API\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (telemetry->request_client == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"No client has been chosen to write to\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (json_string == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid JSON string!\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = send(telemetry->request_client->fd,\n-\t\t\tjson_string, strlen(json_string), 0);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Failed to write to socket for client: %s\",\n-\t\t\t\ttelemetry->request_client->file_path);\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-int32_t\n-rte_telemetry_send_error_response(struct telemetry_impl *telemetry,\n-\tint error_type)\n-{\n-\tint ret;\n-\tconst char *status_code, *json_buffer;\n-\tjson_t *root;\n-\n-\tif (error_type == -EPERM)\n-\t\tstatus_code = \"Status Error: Unknown\";\n-\telse if (error_type == -EINVAL)\n-\t\tstatus_code = \"Status Error: Invalid Argument 404\";\n-\telse if (error_type == -ENOMEM)\n-\t\tstatus_code = \"Status Error: Memory Allocation Error\";\n-\telse {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid error type\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\troot = json_object();\n-\n-\tif (root == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not create root JSON object\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\tret = json_object_set_new(root, \"status_code\", json_string(status_code));\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Status code field cannot be set\");\n-\t\tjson_decref(root);\n-\t\treturn -EPERM;\n-\t}\n-\n-\tret = json_object_set_new(root, \"data\", json_null());\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Data field cannot be set\");\n-\t\tjson_decref(root);\n-\t\treturn -EPERM;\n-\t}\n-\n-\tjson_buffer = json_dumps(root, 0);\n-\tjson_decref(root);\n-\n-\tret = rte_telemetry_write_to_socket(telemetry, json_buffer);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not write to socket\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-int32_t\n-rte_telemetry_send_global_stats_values(struct telemetry_encode_param *ep,\n-\tstruct telemetry_impl *telemetry)\n-{\n-\tint ret;\n-\tchar *json_buffer = NULL;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid telemetry argument\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = metrics_fns->encode_json_format(ep, &json_buffer);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"JSON encode function failed\");\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_write_to_socket(telemetry, json_buffer);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not write to socket\");\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-int32_t\n-rte_telemetry_send_ports_stats_values(struct telemetry_encode_param *ep,\n-\tstruct telemetry_impl *telemetry)\n-{\n-\tint ret;\n-\tchar *json_buffer = NULL;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid telemetry argument\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (ep == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid encode param argument\");\n-\t\tgoto einval_fail;\n-\t}\n-\n-\tif (ep->pp.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-\tif (ep->pp.num_port_ids < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid num_port_ids, must be positive\");\n-\t\tgoto einval_fail;\n-\t}\n-\n-\tret = metrics_fns->get_ports_stats_json(ep, telemetry->reg_index,\n-\t\t\t&json_buffer);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Function for get_ports_stats_json\"\n-\t\t\t\t\" failed\");\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_write_to_socket(telemetry, json_buffer);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not write to socket\");\n-\t\treturn -1;\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-static int32_t\n-rte_telemetry_initial_accept(struct telemetry_impl *telemetry)\n-{\n-\tint ret;\n-\tint selftest = 0;\n-\n-\tret = metrics_fns->reg_all_ethdev(&telemetry->metrics_register_done,\n-\t\t\ttelemetry->reg_index);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Failed to register ethdev metrics\");\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-\tif (selftest) {\n-\t\tret = rte_telemetry_socket_messaging_testing(telemetry->reg_index[0],\n-\t\t\t\ttelemetry->server_fd);\n-\t\tif (ret < 0)\n-\t\t\treturn -1;\n-\n-\t\tret = rte_telemetry_parser_test(telemetry);\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Parser Tests Failed\");\n-\t\t\treturn -1;\n-\t\t}\n-\n-\t\tTELEMETRY_LOG_INFO(\"Success - All Parser Tests Passed\");\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int32_t\n-rte_telemetry_read_client(struct telemetry_impl *telemetry)\n-{\n-\tchar buf[BUF_SIZE];\n-\tint ret, buffer_read;\n-\n-\tbuffer_read = read(telemetry->accept_fd, buf, BUF_SIZE-1);\n-\n-\tif (buffer_read == -1) {\n-\t\tTELEMETRY_LOG_ERR(\"Read error\");\n-\t\treturn -1;\n-\t} else if (buffer_read == 0) {\n-\t\tgoto close_socket;\n-\t} else {\n-\t\tbuf[buffer_read] = '\\0';\n-\t\tret = rte_telemetry_parse_client_message(telemetry, buf);\n-\t\tif (ret < 0)\n-\t\t\tTELEMETRY_LOG_WARN(\"Parse message failed\");\n-\t\tgoto close_socket;\n-\t}\n-\n-close_socket:\n-\tif (close(telemetry->accept_fd) < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Close TELEMETRY socket failed\");\n-\t\tfree(telemetry);\n-\t\treturn -EPERM;\n-\t}\n-\ttelemetry->accept_fd = 0;\n-\n-\treturn 0;\n-}\n-\n-static int32_t\n-rte_telemetry_accept_new_client(struct telemetry_impl *telemetry)\n-{\n-\tint ret;\n-\n-\tif (telemetry->accept_fd <= 0) {\n-\t\tret = listen(telemetry->server_fd, 1);\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Listening error with server fd\");\n-\t\t\treturn -1;\n-\t\t}\n-\n-\t\ttelemetry->accept_fd = accept(telemetry->server_fd, NULL, NULL);\n-\t\tif (telemetry->accept_fd >= 0 &&\n-\t\t\ttelemetry->metrics_register_done == 0) {\n-\t\t\tret = rte_telemetry_initial_accept(telemetry);\n-\t\t\tif (ret < 0) {\n-\t\t\t\tTELEMETRY_LOG_ERR(\"Failed to run initial configurations/tests\");\n-\t\t\t\treturn -1;\n-\t\t\t}\n-\t\t}\n-\t} else {\n-\t\tret = rte_telemetry_read_client(telemetry);\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Failed to read socket buffer\");\n-\t\t\treturn -1;\n-\t\t}\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int32_t\n-rte_telemetry_read_client_sockets(struct telemetry_impl *telemetry)\n-{\n-\tint ret;\n-\ttelemetry_client *client;\n-\tchar client_buf[BUF_SIZE];\n-\tint bytes;\n-\n-\tTAILQ_FOREACH(client, &telemetry->client_list_head, client_list) {\n-\t\tbytes = read(client->fd, client_buf, BUF_SIZE-1);\n-\n-\t\tif (bytes > 0) {\n-\t\t\tclient_buf[bytes] = '\\0';\n-\t\t\ttelemetry->request_client = client;\n-\t\t\tret = rte_telemetry_parse(telemetry, client_buf);\n-\t\t\tif (ret < 0) {\n-\t\t\t\tTELEMETRY_LOG_WARN(\"Parse socket input failed: %i\",\n-\t\t\t\t\t\tret);\n-\t\t\t\treturn -1;\n-\t\t\t}\n-\t\t}\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int32_t\n-rte_telemetry_run(void *userdata)\n-{\n-\tint ret;\n-\tstruct telemetry_impl *telemetry = userdata;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_WARN(\"TELEMETRY could not be initialised\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_telemetry_accept_new_client(telemetry);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Accept and read new client failed\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_telemetry_read_client_sockets(telemetry);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Client socket read failed\");\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static void\n-*rte_telemetry_run_thread_func(void *userdata)\n-{\n-\tint ret;\n-\tstruct telemetry_impl *telemetry = userdata;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"%s passed a NULL instance\", __func__);\n-\t\tpthread_exit(0);\n-\t}\n-\n-\twhile (telemetry->thread_status) {\n-\t\trte_telemetry_run(telemetry);\n-\t\tret = usleep(SLEEP_TIME);\n-\t\tif (ret < 0)\n-\t\t\tTELEMETRY_LOG_ERR(\"Calling thread could not be put to sleep\");\n-\t}\n-\tpthread_exit(0);\n-}\n-\n-static int32_t\n-rte_telemetry_set_socket_nonblock(int fd)\n-{\n-\tint flags;\n-\n-\tif (fd < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid fd provided\");\n-\t\treturn -1;\n-\t}\n-\n-\tflags = fcntl(fd, F_GETFL, 0);\n-\tif (flags < 0)\n-\t\tflags = 0;\n-\n-\treturn fcntl(fd, F_SETFL, flags | O_NONBLOCK);\n-}\n-\n-static int32_t\n-rte_telemetry_create_socket(struct telemetry_impl *telemetry)\n-{\n-\tint ret;\n-\tstruct sockaddr_un addr;\n-\tchar socket_path[BUF_SIZE];\n-\n-\tif (telemetry == NULL)\n-\t\treturn -1;\n-\n-\ttelemetry->server_fd = socket(AF_UNIX, SOCK_SEQPACKET, 0);\n-\tif (telemetry->server_fd == -1) {\n-\t\tTELEMETRY_LOG_ERR(\"Failed to open socket\");\n-\t\treturn -1;\n-\t}\n-\n-\tret  = rte_telemetry_set_socket_nonblock(telemetry->server_fd);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not set socket to NONBLOCK\");\n-\t\tgoto close_socket;\n-\t}\n-\n-\taddr.sun_family = AF_UNIX;\n-\trte_telemetry_get_runtime_dir(socket_path, sizeof(socket_path));\n-\tstrlcpy(addr.sun_path, socket_path, sizeof(addr.sun_path));\n-\tunlink(socket_path);\n-\n-\tif (bind(telemetry->server_fd, (struct sockaddr *)&addr,\n-\t\tsizeof(addr)) < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Socket binding error\");\n-\t\tgoto close_socket;\n-\t}\n-\n-\treturn 0;\n-\n-close_socket:\n-\tif (close(telemetry->server_fd) < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Close TELEMETRY socket failed\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\treturn -1;\n-}\n-\n-int32_t\n-rte_telemetry_init(void)\n-{\n-\tint ret;\n-\tpthread_attr_t attr;\n-\tconst char *telemetry_ctrl_thread = \"telemetry\";\n-\n-\tif (static_telemetry) {\n-\t\tTELEMETRY_LOG_WARN(\"TELEMETRY structure already initialised\");\n-\t\treturn -EALREADY;\n-\t}\n-\n-\tstatic_telemetry = calloc(1, sizeof(struct telemetry_impl));\n-\tif (static_telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Memory could not be allocated\");\n-\t\treturn -ENOMEM;\n-\t}\n-\n-\tstatic_telemetry->socket_id = rte_socket_id();\n-\n-\tret = pthread_attr_init(&attr);\n-\tif (ret != 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Pthread attribute init failed\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\tret = rte_telemetry_create_socket(static_telemetry);\n-\tif (ret < 0) {\n-\t\tret = rte_telemetry_cleanup();\n-\t\tif (ret < 0)\n-\t\t\tTELEMETRY_LOG_ERR(\"TELEMETRY cleanup failed\");\n-\t\treturn -EPERM;\n-\t}\n-\tTAILQ_INIT(&static_telemetry->client_list_head);\n-\n-\tret = rte_ctrl_thread_create(&static_telemetry->thread_id,\n-\t\ttelemetry_ctrl_thread, &attr, rte_telemetry_run_thread_func,\n-\t\t(void *)static_telemetry);\n-\tstatic_telemetry->thread_status = 1;\n-\n-\tif (ret < 0) {\n-\t\tret = rte_telemetry_cleanup();\n-\t\tif (ret < 0)\n-\t\t\tTELEMETRY_LOG_ERR(\"TELEMETRY cleanup failed\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\tif (rte_telemetry_new_init() != 0)\n-\t\treturn -1;\n-\n-\treturn 0;\n-}\n-\n-static int32_t\n-rte_telemetry_client_cleanup(struct telemetry_client *client)\n-{\n-\tint ret;\n-\n-\tret = close(client->fd);\n-\tfree(client->file_path);\n-\tfree(client);\n-\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Close client socket failed\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-int32_t\n-rte_telemetry_cleanup(void)\n-{\n-\tint ret;\n-\tstruct telemetry_impl *telemetry = static_telemetry;\n-\ttelemetry_client *client, *temp_client;\n-\n-\tTAILQ_FOREACH_SAFE(client, &telemetry->client_list_head, client_list,\n-\t\ttemp_client) {\n-\t\tTAILQ_REMOVE(&telemetry->client_list_head, client, client_list);\n-\t\tret = rte_telemetry_client_cleanup(client);\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Client cleanup failed\");\n-\t\t\treturn -EPERM;\n-\t\t}\n-\t}\n-\n-\tret = close(telemetry->server_fd);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Close TELEMETRY socket failed\");\n-\t\tfree(telemetry);\n-\t\treturn -EPERM;\n-\t}\n-\n-\ttelemetry->thread_status = 0;\n-\tpthread_join(telemetry->thread_id, NULL);\n-\tfree(telemetry);\n-\tstatic_telemetry = NULL;\n-\n-\treturn 0;\n-}\n-\n-int32_t\n-rte_telemetry_unregister_client(struct telemetry_impl *telemetry,\n-\tconst char *client_path)\n-{\n-\tint ret;\n-\ttelemetry_client *client, *temp_client;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_WARN(\"TELEMETRY is not initialised\");\n-\t\treturn -ENODEV;\n-\t}\n-\n-\tif (client_path == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid client path\");\n-\t\tgoto einval_fail;\n-\t}\n-\n-\tif (TAILQ_EMPTY(&telemetry->client_list_head)) {\n-\t\tTELEMETRY_LOG_ERR(\"There are no clients currently registered\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\tTAILQ_FOREACH_SAFE(client, &telemetry->client_list_head, client_list,\n-\t\t\ttemp_client) {\n-\t\tif (strcmp(client_path, client->file_path) == 0) {\n-\t\t\tTAILQ_REMOVE(&telemetry->client_list_head, client,\n-\t\t\t\tclient_list);\n-\t\t\tret = rte_telemetry_client_cleanup(client);\n-\n-\t\t\tif (ret < 0) {\n-\t\t\t\tTELEMETRY_LOG_ERR(\"Client cleanup failed\");\n-\t\t\t\treturn -EPERM;\n-\t\t\t}\n-\n-\t\t\treturn 0;\n-\t\t}\n-\t}\n-\n-\tTELEMETRY_LOG_WARN(\"Couldn't find client, possibly not registered yet.\");\n-\treturn -1;\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 -EINVAL;\n-}\n-\n-int32_t\n-rte_telemetry_register_client(struct telemetry_impl *telemetry,\n-\tconst char *client_path)\n-{\n-\tint ret, fd;\n-\tstruct sockaddr_un addrs;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not initialize TELEMETRY API\");\n-\t\treturn -ENODEV;\n-\t}\n-\n-\tif (client_path == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid client path\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\ttelemetry_client *client;\n-\tTAILQ_FOREACH(client, &telemetry->client_list_head, client_list) {\n-\t\tif (strcmp(client_path, client->file_path) == 0) {\n-\t\t\tTELEMETRY_LOG_WARN(\"'%s' already registered\",\n-\t\t\t\t\tclient_path);\n-\t\t\treturn -EINVAL;\n-\t\t}\n-\t}\n-\n-\tfd = socket(AF_UNIX, SOCK_SEQPACKET, 0);\n-\tif (fd == -1) {\n-\t\tTELEMETRY_LOG_ERR(\"Client socket error\");\n-\t\treturn -EACCES;\n-\t}\n-\n-\tret = rte_telemetry_set_socket_nonblock(fd);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not set socket to NONBLOCK\");\n-\t\treturn -EPERM;\n-\t}\n-\n-\taddrs.sun_family = AF_UNIX;\n-\tstrlcpy(addrs.sun_path, client_path, sizeof(addrs.sun_path));\n-\ttelemetry_client *new_client = malloc(sizeof(telemetry_client));\n-\tnew_client->file_path = strdup(client_path);\n-\tnew_client->fd = fd;\n-\n-\tif (connect(fd, (struct sockaddr *)&addrs, sizeof(addrs)) == -1) {\n-\t\tTELEMETRY_LOG_ERR(\"TELEMETRY client connect to %s didn't work\",\n-\t\t\t\tclient_path);\n-\t\tret = rte_telemetry_client_cleanup(new_client);\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Client cleanup failed\");\n-\t\t\treturn -EPERM;\n-\t\t}\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tTAILQ_INSERT_HEAD(&telemetry->client_list_head, new_client, client_list);\n-\n-\treturn 0;\n-}\n-\n-int32_t\n-rte_telemetry_parse_client_message(struct telemetry_impl *telemetry, char *buf)\n-{\n-\tint ret, action_int;\n-\tjson_error_t error;\n-\tjson_t *root = json_loads(buf, 0, &error);\n-\n-\tif (root == NULL) {\n-\t\tTELEMETRY_LOG_WARN(\"Could not load JSON object from data passed in : %s\",\n-\t\t\t\terror.text);\n-\t\tgoto fail;\n-\t} else if (!json_is_object(root)) {\n-\t\tTELEMETRY_LOG_WARN(\"JSON Request is not a JSON object\");\n-\t\tgoto fail;\n-\t}\n-\n-\tjson_t *action = json_object_get(root, \"action\");\n-\tif (action == NULL) {\n-\t\tTELEMETRY_LOG_WARN(\"Request does not have action field\");\n-\t\tgoto fail;\n-\t} else if (!json_is_integer(action)) {\n-\t\tTELEMETRY_LOG_WARN(\"Action value is not an integer\");\n-\t\tgoto fail;\n-\t}\n-\n-\tjson_t *command = json_object_get(root, \"command\");\n-\tif (command == NULL) {\n-\t\tTELEMETRY_LOG_WARN(\"Request does not have command field\");\n-\t\tgoto fail;\n-\t} else if (!json_is_string(command)) {\n-\t\tTELEMETRY_LOG_WARN(\"Command value is not a string\");\n-\t\tgoto fail;\n-\t}\n-\n-\taction_int = json_integer_value(action);\n-\tif (action_int != ACTION_POST) {\n-\t\tTELEMETRY_LOG_WARN(\"Invalid action code\");\n-\t\tgoto fail;\n-\t}\n-\n-\tif (strcmp(json_string_value(command), \"clients\") != 0) {\n-\t\tTELEMETRY_LOG_WARN(\"Invalid command\");\n-\t\tgoto fail;\n-\t}\n-\n-\tjson_t *data = json_object_get(root, \"data\");\n-\tif (data == NULL) {\n-\t\tTELEMETRY_LOG_WARN(\"Request does not have data field\");\n-\t\tgoto fail;\n-\t}\n-\n-\tjson_t *client_path = json_object_get(data, \"client_path\");\n-\tif (client_path == NULL) {\n-\t\tTELEMETRY_LOG_WARN(\"Request does not have client_path field\");\n-\t\tgoto fail;\n-\t}\n-\n-\tif (!json_is_string(client_path)) {\n-\t\tTELEMETRY_LOG_WARN(\"Client_path value is not a string\");\n-\t\tgoto fail;\n-\t}\n-\n-\tret = rte_telemetry_register_client(telemetry,\n-\t\t\tjson_string_value(client_path));\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not register client\");\n-\t\ttelemetry->register_fail_count++;\n-\t\tgoto fail;\n-\t}\n-\n-\treturn 0;\n-\n-fail:\n-\tTELEMETRY_LOG_WARN(\"Client attempted to register with invalid message\");\n-\tjson_decref(root);\n-\treturn -1;\n-}\n-\n-static int32_t\n-rte_telemetry_dummy_client_socket(const char *valid_client_path)\n-{\n-\tint sockfd = socket(AF_UNIX, SOCK_SEQPACKET, 0);\n-\tstruct sockaddr_un addr = {0};\n-\n-\tif (sockfd < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Test socket creation failure\");\n-\t\treturn -1;\n-\t}\n-\n-\taddr.sun_family = AF_UNIX;\n-\tstrlcpy(addr.sun_path, valid_client_path, sizeof(addr.sun_path));\n-\tunlink(valid_client_path);\n-\n-\tif (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Test socket binding failure\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (listen(sockfd, 1) < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Listen failure\");\n-\t\treturn -1;\n-\t}\n-\n-\treturn sockfd;\n-}\n-\n-int32_t\n-rte_telemetry_selftest(void)\n-{\n-\tconst char *invalid_client_path = SELFTEST_INVALID_CLIENT;\n-\tconst char *valid_client_path = SELFTEST_VALID_CLIENT;\n-\tint ret, sockfd;\n-\n-\tTELEMETRY_LOG_INFO(\"Selftest\");\n-\n-\tret = rte_telemetry_init();\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Valid initialisation test failed\");\n-\t\treturn -1;\n-\t}\n-\n-\tTELEMETRY_LOG_INFO(\"Success - Valid initialisation test passed\");\n-\n-\tret = rte_telemetry_init();\n-\tif (ret != -EALREADY) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid initialisation test failed\");\n-\t\treturn -1;\n-\t}\n-\n-\tTELEMETRY_LOG_INFO(\"Success - Invalid initialisation test passed\");\n-\n-\tret = rte_telemetry_unregister_client(static_telemetry,\n-\t\t\tinvalid_client_path);\n-\tif (ret != -EPERM) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid unregister test failed\");\n-\t\treturn -1;\n-\t}\n-\n-\tTELEMETRY_LOG_INFO(\"Success - Invalid unregister test passed\");\n-\n-\tsockfd = rte_telemetry_dummy_client_socket(valid_client_path);\n-\tif (sockfd < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Test socket creation failed\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_telemetry_register_client(static_telemetry, valid_client_path);\n-\tif (ret != 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Valid register test failed: %i\", ret);\n-\t\treturn -1;\n-\t}\n-\n-\taccept(sockfd, NULL, NULL);\n-\tTELEMETRY_LOG_INFO(\"Success - Valid register test passed\");\n-\n-\tret = rte_telemetry_register_client(static_telemetry, valid_client_path);\n-\tif (ret != -EINVAL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid register test failed: %i\", ret);\n-\t\treturn -1;\n-\t}\n-\n-\tTELEMETRY_LOG_INFO(\"Success - Invalid register test passed\");\n-\n-\tret = rte_telemetry_unregister_client(static_telemetry,\n-\t\tinvalid_client_path);\n-\tif (ret != -1) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid unregister test failed: %i\", ret);\n-\t\treturn -1;\n-\t}\n-\n-\tTELEMETRY_LOG_INFO(\"Success - Invalid unregister test passed\");\n-\n-\tret = rte_telemetry_unregister_client(static_telemetry, valid_client_path);\n-\tif (ret != 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Valid unregister test failed: %i\", ret);\n-\t\treturn -1;\n-\t}\n-\n-\tTELEMETRY_LOG_INFO(\"Success - Valid unregister test passed\");\n-\n-\tret = rte_telemetry_cleanup();\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Cleanup test failed\");\n-\t\treturn -1;\n-\t}\n-\n-\tTELEMETRY_LOG_INFO(\"Success - Valid cleanup test passed\");\n-\n-\treturn 0;\n-}\n-\n-int32_t\n-rte_telemetry_socket_messaging_testing(int index, int socket)\n-{\n-\tstruct telemetry_impl *telemetry = calloc(1, sizeof(telemetry_impl));\n-\tint fd, bad_send_fd, send_fd, bad_fd, bad_recv_fd, recv_fd, ret;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not initialize Telemetry API\");\n-\t\treturn -1;\n-\t}\n-\n-\ttelemetry->server_fd = socket;\n-\ttelemetry->reg_index[0] = index;\n-\tTELEMETRY_LOG_INFO(\"Beginning Telemetry socket message Selftest\");\n-\trte_telemetry_socket_test_setup(telemetry, &send_fd, &recv_fd);\n-\tTELEMETRY_LOG_INFO(\"Register valid client test\");\n-\n-\tret = rte_telemetry_socket_register_test(telemetry, &fd, send_fd,\n-\t\trecv_fd);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Register valid client test failed!\");\n-\t\tfree(telemetry);\n-\t\treturn -1;\n-\t}\n-\n-\tTELEMETRY_LOG_INFO(\"Success - Register valid client test passed!\");\n-\n-\tTELEMETRY_LOG_INFO(\"Register invalid/same client test\");\n-\tret = rte_telemetry_socket_test_setup(telemetry, &bad_send_fd,\n-\t\t&bad_recv_fd);\n-\tret = rte_telemetry_socket_register_test(telemetry, &bad_fd,\n-\t\tbad_send_fd, bad_recv_fd);\n-\tif (!ret) {\n-\t\tTELEMETRY_LOG_ERR(\"Register invalid/same client test failed!\");\n-\t\tfree(telemetry);\n-\t\treturn -1;\n-\t}\n-\n-\tTELEMETRY_LOG_INFO(\"Success - Register invalid/same client test passed!\");\n-\n-\tret = rte_telemetry_json_socket_message_test(telemetry, fd);\n-\tif (ret < 0) {\n-\t\tfree(telemetry);\n-\t\treturn -1;\n-\t}\n-\n-\tfree(telemetry);\n-\treturn 0;\n-}\n-\n-int32_t\n-rte_telemetry_socket_register_test(struct telemetry_impl *telemetry, int *fd,\n-\tint send_fd, int recv_fd)\n-{\n-\tint ret;\n-\tchar good_req_string[BUF_SIZE];\n-\n-\tsnprintf(good_req_string, sizeof(good_req_string),\n-\t\"{\\\"action\\\":1,\\\"command\\\":\\\"clients\\\",\\\"data\\\":{\\\"client_path\\\"\"\n-\t\t\":\\\"%s\\\"}}\", SOCKET_TEST_CLIENT_PATH);\n-\n-\tlisten(recv_fd, 1);\n-\n-\tret = send(send_fd, good_req_string, strlen(good_req_string), 0);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not send message over socket\");\n-\t\treturn -1;\n-\t}\n-\n-\trte_telemetry_run(telemetry);\n-\n-\tif (telemetry->register_fail_count != 0)\n-\t\treturn -1;\n-\n-\t*fd = accept(recv_fd, NULL, NULL);\n-\n-\treturn 0;\n-}\n-\n-int32_t\n-rte_telemetry_socket_test_setup(struct telemetry_impl *telemetry, int *send_fd,\n-\tint *recv_fd)\n-{\n-\tint ret;\n-\tconst char *client_path = SOCKET_TEST_CLIENT_PATH;\n-\tchar socket_path[BUF_SIZE];\n-\tstruct sockaddr_un addr = {0};\n-\tstruct sockaddr_un addrs = {0};\n-\t*send_fd = socket(AF_UNIX, SOCK_SEQPACKET, 0);\n-\t*recv_fd = socket(AF_UNIX, SOCK_SEQPACKET, 0);\n-\n-\tlisten(telemetry->server_fd, 5);\n-\taddr.sun_family = AF_UNIX;\n-\trte_telemetry_get_runtime_dir(socket_path, sizeof(socket_path));\n-\tstrlcpy(addr.sun_path, socket_path, sizeof(addr.sun_path));\n-\n-\tret = connect(*send_fd, (struct sockaddr *) &addr, sizeof(addr));\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not connect socket\");\n-\t\treturn -1;\n-\t}\n-\n-\ttelemetry->accept_fd = accept(telemetry->server_fd, NULL, NULL);\n-\n-\taddrs.sun_family = AF_UNIX;\n-\tstrlcpy(addrs.sun_path, client_path, sizeof(addrs.sun_path));\n-\tunlink(client_path);\n-\n-\tret = bind(*recv_fd, (struct sockaddr *)&addrs, sizeof(addrs));\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not bind socket\");\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int32_t\n-rte_telemetry_stat_parse(char *buf, struct json_data *json_data_struct)\n-{\n-\tjson_error_t error;\n-\tjson_t *root = json_loads(buf, 0, &error);\n-\tint arraylen, i;\n-\tjson_t *status, *dataArray, *port, *stats, *name, *value, *dataArrayObj,\n-\t       *statsArrayObj;\n-\n-\tstats = NULL;\n-\tport = NULL;\n-\tname = NULL;\n-\n-\tif (buf == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"JSON message is NULL\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tif (root == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not load JSON object from data passed in : %s\",\n-\t\t\t\terror.text);\n-\t\treturn -EPERM;\n-\t} else if (!json_is_object(root)) {\n-\t\tTELEMETRY_LOG_ERR(\"JSON Request is not a JSON object\");\n-\t\tjson_decref(root);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tstatus = json_object_get(root, \"status_code\");\n-\tif (!status) {\n-\t\tTELEMETRY_LOG_ERR(\"Request does not have status field\");\n-\t\treturn -EINVAL;\n-\t} else if (!json_is_string(status)) {\n-\t\tTELEMETRY_LOG_ERR(\"Status value is not a string\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tjson_data_struct->status_code = strdup(json_string_value(status));\n-\n-\tdataArray = json_object_get(root, \"data\");\n-\tif (dataArray == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Request does not have data field\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tarraylen = json_array_size(dataArray);\n-\tif (arraylen == 0) {\n-\t\tjson_data_struct->data = \"null\";\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tfor (i = 0; i < arraylen; i++) {\n-\t\tdataArrayObj = json_array_get(dataArray, i);\n-\t\tport = json_object_get(dataArrayObj, \"port\");\n-\t\tstats = json_object_get(dataArrayObj, \"stats\");\n-\t}\n-\n-\tif (port == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Request does not have port field\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tif (!json_is_integer(port)) {\n-\t\tTELEMETRY_LOG_ERR(\"Port value is not an integer\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tjson_data_struct->port = json_integer_value(port);\n-\n-\tif (stats == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Request does not have stats field\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tarraylen = json_array_size(stats);\n-\tfor (i = 0; i < arraylen; i++) {\n-\t\tstatsArrayObj = json_array_get(stats, i);\n-\t\tname = json_object_get(statsArrayObj, \"name\");\n-\t\tvalue = json_object_get(statsArrayObj, \"value\");\n-\t}\n-\n-\tif (name == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Request does not have name field\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tif (!json_is_string(name)) {\n-\t\tTELEMETRY_LOG_ERR(\"Stat name value is not a string\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tjson_data_struct->stat_name = strdup(json_string_value(name));\n-\n-\tif (value == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Request does not have value field\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tif (!json_is_integer(value)) {\n-\t\tTELEMETRY_LOG_ERR(\"Stat value is not an integer\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tjson_data_struct->stat_value = json_integer_value(value);\n-\n-\treturn 0;\n-}\n-\n-static void\n-rte_telemetry_free_test_data(struct json_data *data)\n-{\n-\tfree(data->status_code);\n-\tfree(data->stat_name);\n-\tfree(data);\n-}\n-\n-int32_t\n-rte_telemetry_valid_json_test(struct telemetry_impl *telemetry, int fd)\n-{\n-\tint ret;\n-\tint port = 0;\n-\tint value = 0;\n-\tint fail_count = 0;\n-\tint buffer_read = 0;\n-\tchar buf[BUF_SIZE];\n-\tstruct json_data *data_struct;\n-\terrno = 0;\n-\tconst char *status = \"Status OK: 200\";\n-\tconst char *name = \"rx_good_packets\";\n-\tconst char *valid_json_message = \"{\\\"action\\\":0,\\\"command\\\":\"\n-\t\"\\\"ports_stats_values_by_name\\\",\\\"data\\\":{\\\"ports\\\"\"\n-\t\":[0],\\\"stats\\\":[\\\"rx_good_packets\\\"]}}\";\n-\n-\tret = send(fd, valid_json_message, strlen(valid_json_message), 0);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not send message over socket\");\n-\t\treturn -1;\n-\t}\n-\n-\trte_telemetry_run(telemetry);\n-\tbuffer_read = recv(fd, buf, BUF_SIZE-1, 0);\n-\n-\tif (buffer_read == -1) {\n-\t\tTELEMETRY_LOG_ERR(\"Read error\");\n-\t\treturn -1;\n-\t}\n-\n-\tbuf[buffer_read] = '\\0';\n-\tdata_struct = calloc(1, sizeof(struct json_data));\n-\tret = rte_telemetry_stat_parse(buf, data_struct);\n-\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not parse stats\");\n-\t\tfail_count++;\n-\t}\n-\n-\tif (strcmp(data_struct->status_code, status) != 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Status code is invalid\");\n-\t\tfail_count++;\n-\t}\n-\n-\tif (data_struct->port != port) {\n-\t\tTELEMETRY_LOG_ERR(\"Port is invalid\");\n-\t\tfail_count++;\n-\t}\n-\n-\tif (strcmp(data_struct->stat_name, name) != 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Stat name is invalid\");\n-\t\tfail_count++;\n-\t}\n-\n-\tif (data_struct->stat_value != value) {\n-\t\tTELEMETRY_LOG_ERR(\"Stat value is invalid\");\n-\t\tfail_count++;\n-\t}\n-\n-\trte_telemetry_free_test_data(data_struct);\n-\tif (fail_count > 0)\n-\t\treturn -1;\n-\n-\tTELEMETRY_LOG_INFO(\"Success - Passed valid JSON message test passed\");\n-\n-\treturn 0;\n-}\n-\n-int32_t\n-rte_telemetry_invalid_json_test(struct telemetry_impl *telemetry, int fd)\n-{\n-\tint ret;\n-\tchar buf[BUF_SIZE];\n-\tint fail_count = 0;\n-\tconst char *invalid_json = \"{]\";\n-\tconst char *status = \"Status Error: Unknown\";\n-\tconst char *data = \"null\";\n-\tstruct json_data *data_struct;\n-\tint buffer_read = 0;\n-\terrno = 0;\n-\n-\tret = send(fd, invalid_json, strlen(invalid_json), 0);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not send message over socket\");\n-\t\treturn -1;\n-\t}\n-\n-\trte_telemetry_run(telemetry);\n-\tbuffer_read = recv(fd, buf, BUF_SIZE-1, 0);\n-\n-\tif (buffer_read == -1) {\n-\t\tTELEMETRY_LOG_ERR(\"Read error\");\n-\t\treturn -1;\n-\t}\n-\n-\tbuf[buffer_read] = '\\0';\n-\n-\tdata_struct = calloc(1, sizeof(struct json_data));\n-\tret = rte_telemetry_stat_parse(buf, data_struct);\n-\n-\tif (ret < 0)\n-\t\tTELEMETRY_LOG_ERR(\"Could not parse stats\");\n-\n-\tif (strcmp(data_struct->status_code, status) != 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Status code is invalid\");\n-\t\tfail_count++;\n-\t}\n-\n-\tif (strcmp(data_struct->data, data) != 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Data status is invalid\");\n-\t\tfail_count++;\n-\t}\n-\n-\trte_telemetry_free_test_data(data_struct);\n-\tif (fail_count > 0)\n-\t\treturn -1;\n-\n-\tTELEMETRY_LOG_INFO(\"Success - Passed invalid JSON message test\");\n-\n-\treturn 0;\n-}\n-\n-int32_t\n-rte_telemetry_json_contents_test(struct telemetry_impl *telemetry, int fd)\n-{\n-\tint ret;\n-\tchar buf[BUF_SIZE];\n-\tint fail_count = 0;\n-\tconst char *status = \"Status Error: Invalid Argument 404\";\n-\tconst char *data = \"null\";\n-\tstruct json_data *data_struct;\n-\tconst char *invalid_contents = \"{\\\"action\\\":0,\\\"command\\\":\"\n-\t\"\\\"ports_stats_values_by_name\\\",\\\"data\\\":{\\\"ports\\\"\"\n-\t\":[0],\\\"stats\\\":[\\\"some_invalid_param\\\",\"\n-\t\"\\\"another_invalid_param\\\"]}}\";\n-\tint buffer_read = 0;\n-\terrno = 0;\n-\n-\tret = send(fd, invalid_contents, strlen(invalid_contents), 0);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not send message over socket\");\n-\t\treturn -1;\n-\t}\n-\n-\trte_telemetry_run(telemetry);\n-\tbuffer_read = recv(fd, buf, BUF_SIZE-1, 0);\n-\n-\tif (buffer_read == -1) {\n-\t\tTELEMETRY_LOG_ERR(\"Read error\");\n-\t\treturn -1;\n-\t}\n-\n-\tbuf[buffer_read] = '\\0';\n-\tdata_struct = calloc(1, sizeof(struct json_data));\n-\tret = rte_telemetry_stat_parse(buf, data_struct);\n-\n-\tif (ret < 0)\n-\t\tTELEMETRY_LOG_ERR(\"Could not parse stats\");\n-\n-\tif (strcmp(data_struct->status_code, status) != 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Status code is invalid\");\n-\t\tfail_count++;\n-\t}\n-\n-\tif (strcmp(data_struct->data, data) != 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Data status is invalid\");\n-\t\tfail_count++;\n-\t}\n-\n-\trte_telemetry_free_test_data(data_struct);\n-\tif (fail_count > 0)\n-\t\treturn -1;\n-\n-\tTELEMETRY_LOG_INFO(\"Success - Passed invalid JSON content test\");\n-\n-\treturn 0;\n-}\n-\n-int32_t\n-rte_telemetry_json_empty_test(struct telemetry_impl *telemetry, int fd)\n-{\n-\tint ret;\n-\tchar buf[BUF_SIZE];\n-\tint fail_count = 0;\n-\tconst char *status = \"Status Error: Invalid Argument 404\";\n-\tconst char *data = \"null\";\n-\tstruct json_data *data_struct;\n-\tconst char *empty_json  = \"{}\";\n-\tint buffer_read = 0;\n-\terrno = 0;\n-\n-\tret = (send(fd, empty_json, strlen(empty_json), 0));\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not send message over socket\");\n-\t\treturn -1;\n-\t}\n-\n-\trte_telemetry_run(telemetry);\n-\tbuffer_read = recv(fd, buf, BUF_SIZE-1, 0);\n-\n-\tif (buffer_read == -1) {\n-\t\tTELEMETRY_LOG_ERR(\"Read error\");\n-\t\treturn -1;\n-\t}\n-\n-\tbuf[buffer_read] = '\\0';\n-\tdata_struct = calloc(1, sizeof(struct json_data));\n-\tret = rte_telemetry_stat_parse(buf, data_struct);\n-\n-\tif (ret < 0)\n-\t\tTELEMETRY_LOG_ERR(\"Could not parse stats\");\n-\n-\tif (strcmp(data_struct->status_code, status) != 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Status code is invalid\");\n-\t\tfail_count++;\n-\t}\n-\n-\tif (strcmp(data_struct->data, data) != 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Data status is invalid\");\n-\t\tfail_count++;\n-\t}\n-\n-\trte_telemetry_free_test_data(data_struct);\n-\n-\tif (fail_count > 0)\n-\t\treturn -1;\n-\n-\tTELEMETRY_LOG_INFO(\"Success - Passed JSON empty message test\");\n-\n-\treturn 0;\n-}\n-\n-int32_t\n-rte_telemetry_json_socket_message_test(struct telemetry_impl *telemetry, int fd)\n-{\n-\tuint16_t i;\n-\tint ret, fail_count;\n-\n-\tfail_count = 0;\n-\tstruct telemetry_message_test socket_json_tests[] = {\n-\t\t{.test_name = \"Invalid JSON test\",\n-\t\t\t.test_func_ptr = rte_telemetry_invalid_json_test},\n-\t\t{.test_name = \"Valid JSON test\",\n-\t\t\t.test_func_ptr = rte_telemetry_valid_json_test},\n-\t\t{.test_name = \"JSON contents test\",\n-\t\t\t.test_func_ptr = rte_telemetry_json_contents_test},\n-\t\t{.test_name = \"JSON empty tests\",\n-\t\t\t.test_func_ptr = rte_telemetry_json_empty_test}\n-\t\t};\n-\n-#define NUM_TESTS RTE_DIM(socket_json_tests)\n-\n-\tfor (i = 0; i < NUM_TESTS; i++) {\n-\t\tTELEMETRY_LOG_INFO(\"%s\", socket_json_tests[i].test_name);\n-\t\tret = (socket_json_tests[i].test_func_ptr)\n-\t\t\t(telemetry, fd);\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"%s failed\",\n-\t\t\t\t\tsocket_json_tests[i].test_name);\n-\t\t\tfail_count++;\n-\t\t}\n-\t}\n-\n-\tif (fail_count > 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Failed %i JSON socket message test(s)\",\n-\t\t\t\tfail_count);\n-\t\treturn -1;\n-\t}\n-\n-\tTELEMETRY_LOG_INFO(\"Success - All JSON tests passed\");\n-\n-\treturn 0;\n-}\n-\n-int telemetry_log_level;\n-\n-static struct rte_option option = {\n-\t.name = \"telemetry\",\n-\t.usage = \"Enable telemetry backend\",\n-\t.cb = &rte_telemetry_init,\n-\t.enabled = 0\n-};\n-\n-RTE_INIT(rte_telemetry_register)\n-{\n-\ttelemetry_log_level = rte_log_register(\"lib.telemetry\");\n-\tif (telemetry_log_level >= 0)\n-\t\trte_log_set_level(telemetry_log_level, RTE_LOG_ERR);\n-\n-\trte_option_register(&option);\n-}\ndiff --git a/lib/librte_telemetry/rte_telemetry.h b/lib/librte_telemetry/rte_telemetry.h\nindex f3ca3e4b3f..de99e83163 100644\n--- a/lib/librte_telemetry/rte_telemetry.h\n+++ b/lib/librte_telemetry/rte_telemetry.h\n@@ -219,56 +219,6 @@ typedef int (*telemetry_cb)(const char *cmd, const char *params,\n  */\n typedef void * (*handler)(void *sock_id);\n \n-/**\n- * @warning\n- * @b EXPERIMENTAL: this API may change without prior notice\n- *\n- * Initialize Telemetry\n- *\n- * @return\n- *  0 on successful initialisation.\n- * @return\n- *  -ENOMEM on memory allocation error\n- * @return\n- *  -EPERM on unknown error failure\n- * @return\n- *  -EALREADY if Telemetry is already initialised.\n- */\n-__rte_experimental\n-int32_t\n-rte_telemetry_init(void);\n-\n-/**\n- * @warning\n- * @b EXPERIMENTAL: this API may change without prior notice\n- *\n- * Clean up and free memory.\n- *\n- * @return\n- *  0 on success\n- * @return\n- *  -EPERM on failure\n- */\n-__rte_experimental\n-int32_t\n-rte_telemetry_cleanup(void);\n-\n-/**\n- * @warning\n- * @b EXPERIMENTAL: this API may change without prior notice\n- *\n- * Runs various tests to ensure telemetry initialisation and register/unregister\n- * functions are working correctly.\n- *\n- * @return\n- *  0 on success when all tests have passed\n- * @return\n- *  -1 on failure when the test has failed\n- */\n-__rte_experimental\n-int32_t\n-rte_telemetry_selftest(void);\n-\n /**\n  * Used when registering a command and callback function with telemetry.\n  *\n@@ -291,7 +241,7 @@ int\n rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn, const char *help);\n \n /**\n- * Initialize new version of Telemetry.\n+ * Initialize Telemetry.\n  *\n  * @return\n  *  0 on success.\n@@ -300,5 +250,5 @@ rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn, const char *help);\n  */\n __rte_experimental\n int\n-rte_telemetry_new_init(void);\n+rte_telemetry_init(void);\n #endif\ndiff --git a/lib/librte_telemetry/rte_telemetry_internal.h b/lib/librte_telemetry/rte_telemetry_internal.h\ndeleted file mode 100644\nindex 2ef72b1ec3..0000000000\n--- a/lib/librte_telemetry/rte_telemetry_internal.h\n+++ /dev/null\n@@ -1,114 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2018 Intel Corporation\n- */\n-\n-#include <rte_log.h>\n-#include <rte_tailq.h>\n-#include <rte_metrics.h>\n-#include <rte_metrics_telemetry.h>\n-\n-#ifndef _RTE_TELEMETRY_INTERNAL_H_\n-#define _RTE_TELEMETRY_INTERNAL_H_\n-\n-/* function types for the functions coming from metrics library */\n-typedef int32_t (*metrics_tel_reg_all_ethdev_t)(int *metrics_register_done,\n-\t\tint *reg_index_list);\n-\n-typedef int32_t (*metrics_tel_encode_json_format_t)(\n-\t\tstruct telemetry_encode_param *ep, char **json_buffer);\n-\n-typedef int32_t (*metrics_tel_get_port_stats_ids_t)(\n-\t\tstruct telemetry_encode_param *ep);\n-\n-typedef int32_t (*metrics_tel_get_ports_stats_json_t)(\n-\t\tstruct telemetry_encode_param *ep,\n-\t\tint *reg_index, char **json_buffer);\n-\n-typedef int32_t (*metrics_tel_extract_data_t)(struct telemetry_encode_param *ep,\n-\t\tjson_t *data);\n-\n-struct metrics_functions {\n-\tmetrics_tel_reg_all_ethdev_t reg_all_ethdev;\n-\tmetrics_tel_encode_json_format_t encode_json_format;\n-\tmetrics_tel_get_port_stats_ids_t get_port_stats_ids;\n-\tmetrics_tel_get_ports_stats_json_t get_ports_stats_json;\n-\tmetrics_tel_extract_data_t extract_data;\n-};\n-extern const struct metrics_functions *metrics_fns;\n-\n-/* API for use by metrics libraries to provide the functions to use */\n-__rte_experimental\n-void rte_telemetry_set_metrics_fns(const struct metrics_functions *fns);\n-\n-/* Logging Macros */\n-extern int telemetry_log_level;\n-\n-#define TELEMETRY_LOG(level, fmt, args...) \\\n-\trte_log(RTE_LOG_ ##level, telemetry_log_level, \"%s(): \"fmt \"\\n\", \\\n-\t\t__func__, ##args)\n-\n-#define TELEMETRY_LOG_ERR(fmt, args...) \\\n-\tTELEMETRY_LOG(ERR, fmt, ## args)\n-\n-#define TELEMETRY_LOG_WARN(fmt, args...) \\\n-\tTELEMETRY_LOG(WARNING, fmt, ## args)\n-\n-#define TELEMETRY_LOG_INFO(fmt, args...) \\\n-\tTELEMETRY_LOG(INFO, fmt, ## args)\n-\n-#define MAX_METRICS 256\n-\n-typedef struct telemetry_client {\n-\tchar *file_path;\n-\tint fd;\n-\tTAILQ_ENTRY(telemetry_client) client_list;\n-} telemetry_client;\n-\n-typedef struct telemetry_impl {\n-\tint accept_fd;\n-\tint server_fd;\n-\tpthread_t thread_id;\n-\tint thread_status;\n-\tuint32_t socket_id;\n-\tint reg_index[RTE_MAX_ETHPORTS];\n-\tint metrics_register_done;\n-\tTAILQ_HEAD(, telemetry_client) client_list_head;\n-\tstruct telemetry_client *request_client;\n-\tint register_fail_count;\n-} telemetry_impl;\n-\n-enum rte_telemetry_parser_actions {\n-\tACTION_GET = 0,\n-\tACTION_DELETE = 2\n-};\n-\n-int32_t\n-rte_telemetry_parse_client_message(struct telemetry_impl *telemetry, char *buf);\n-\n-int32_t\n-rte_telemetry_send_error_response(struct telemetry_impl *telemetry,\n-\tint error_type);\n-\n-int32_t\n-rte_telemetry_register_client(struct telemetry_impl *telemetry,\n-\tconst char *client_path);\n-\n-int32_t\n-rte_telemetry_unregister_client(struct telemetry_impl *telemetry,\n-\tconst char *client_path);\n-\n-int32_t\n-rte_telemetry_send_ports_stats_values(struct telemetry_encode_param *ep,\n-\tstruct telemetry_impl *telemetry);\n-\n-int32_t\n-rte_telemetry_socket_messaging_testing(int index, int socket);\n-\n-int32_t\n-rte_telemetry_send_global_stats_values(struct telemetry_encode_param *ep,\n-\tstruct telemetry_impl *telemetry);\n-\n-int32_t\n-rte_telemetry_parser_test(struct telemetry_impl *telemetry);\n-\n-#endif\ndiff --git a/lib/librte_telemetry/rte_telemetry_parser.c b/lib/librte_telemetry/rte_telemetry_parser.c\ndeleted file mode 100644\nindex 7dc84c2cf3..0000000000\n--- a/lib/librte_telemetry/rte_telemetry_parser.c\n+++ /dev/null\n@@ -1,435 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2018 Intel Corporation\n- */\n-\n-#include <stdio.h>\n-#include <stdint.h>\n-#include <string.h>\n-#include <errno.h>\n-#include <jansson.h>\n-\n-#include <rte_metrics.h>\n-#include <rte_common.h>\n-#include <rte_metrics_telemetry.h>\n-\n-#include \"rte_telemetry_internal.h\"\n-#include \"rte_telemetry_parser.h\"\n-\n-typedef int (*command_func)(struct telemetry_impl *, int, json_t *);\n-\n-struct rte_telemetry_command {\n-\tconst char *text;\n-\tcommand_func fn;\n-} command;\n-\n-static int32_t\n-rte_telemetry_command_clients(struct telemetry_impl *telemetry, int action,\n-\tjson_t *data)\n-{\n-\tint ret;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid telemetry argument\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (action != ACTION_DELETE) {\n-\t\tTELEMETRY_LOG_WARN(\"Invalid action for this command\");\n-\t\tgoto einval_fail;\n-\t}\n-\n-\tif (!json_is_object(data)) {\n-\t\tTELEMETRY_LOG_WARN(\"Invalid data provided for this command\");\n-\t\tgoto einval_fail;\n-\t}\n-\n-\tjson_t *client_path = json_object_get(data, \"client_path\");\n-\tif (!json_is_string(client_path)) {\n-\t\tTELEMETRY_LOG_WARN(\"Command value is not a string\");\n-\t\tgoto einval_fail;\n-\t}\n-\n-\tret = rte_telemetry_unregister_client(telemetry,\n-\t\t\tjson_string_value(client_path));\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not unregister client\");\n-\t\tgoto einval_fail;\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-static int32_t\n-rte_telemetry_command_ports(struct telemetry_impl *telemetry, int action,\n-\tjson_t *data)\n-{\n-\tint ret;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid telemetry argument\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (!json_is_null(data)) {\n-\t\tTELEMETRY_LOG_WARN(\"Data should be NULL JSON object for 'ports' command\");\n-\t\tgoto einval_fail;\n-\t}\n-\n-\tif (action != ACTION_GET) {\n-\t\tTELEMETRY_LOG_WARN(\"Invalid action for this command\");\n-\t\tgoto einval_fail;\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-static int32_t\n-rte_telemetry_command_ports_details(struct telemetry_impl *telemetry,\n-\tint action, json_t *data)\n-{\n-\tjson_t *value, *port_ids_json = json_object_get(data, \"ports\");\n-\tuint64_t num_port_ids = json_array_size(port_ids_json);\n-\tint ret, port_ids[num_port_ids];\n-\tRTE_SET_USED(port_ids);\n-\tsize_t index;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid telemetry argument\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (action != ACTION_GET) {\n-\t\tTELEMETRY_LOG_WARN(\"Invalid action for this command\");\n-\t\tgoto einval_fail;\n-\t}\n-\n-\tif (!json_is_object(data)) {\n-\t\tTELEMETRY_LOG_WARN(\"Invalid data provided for this command\");\n-\t\tgoto einval_fail;\n-\t}\n-\n-\tif (!json_is_array(port_ids_json)) {\n-\t\tTELEMETRY_LOG_WARN(\"Invalid Port ID array\");\n-\t\tgoto einval_fail;\n-\t}\n-\n-\tjson_array_foreach(port_ids_json, index, value) {\n-\t\tif (!json_is_integer(value)) {\n-\t\t\tTELEMETRY_LOG_WARN(\"Port ID given is invalid\");\n-\t\t\tgoto einval_fail;\n-\t\t}\n-\t\tport_ids[index] = json_integer_value(value);\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-static int32_t\n-rte_telemetry_command_port_stats(struct telemetry_impl *telemetry, int action,\n-\tjson_t *data)\n-{\n-\tint ret;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid telemetry argument\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (!json_is_null(data)) {\n-\t\tTELEMETRY_LOG_WARN(\"Data should be NULL JSON object for 'port_stats' command\");\n-\t\tgoto einval_fail;\n-\t}\n-\n-\tif (action != ACTION_GET) {\n-\t\tTELEMETRY_LOG_WARN(\"Invalid action for this command\");\n-\t\tgoto einval_fail;\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-static int32_t\n-rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry,\n-\t int action, json_t *data)\n-{\n-\tint ret;\n-\tstruct telemetry_encode_param ep;\n-\n-\tmemset(&ep, 0, sizeof(ep));\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid telemetry argument\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (action != ACTION_GET) {\n-\t\tTELEMETRY_LOG_WARN(\"Invalid action for this command\");\n-\t\tret = rte_telemetry_send_error_response(telemetry, -EINVAL);\n-\t\tif (ret < 0)\n-\t\t\tTELEMETRY_LOG_ERR(\"Could not send error\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (json_is_object(data)) {\n-\t\tTELEMETRY_LOG_WARN(\"Invalid data provided for this command\");\n-\t\tret = rte_telemetry_send_error_response(telemetry, -EINVAL);\n-\t\tif (ret < 0)\n-\t\t\tTELEMETRY_LOG_ERR(\"Could not send error\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = metrics_fns->get_port_stats_ids(&ep);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not get ports 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_ports_stats_values(&ep, telemetry);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Sending ports stats values failed\");\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int32_t\n-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 = { .type = GLOBAL_STATS };\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid telemetry argument\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (action != ACTION_GET) {\n-\t\tTELEMETRY_LOG_WARN(\"Invalid action for this command\");\n-\t\tret = rte_telemetry_send_error_response(telemetry, -EINVAL);\n-\t\tif (ret < 0)\n-\t\t\tTELEMETRY_LOG_ERR(\"Could not send error\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (json_is_object(data)) {\n-\t\tTELEMETRY_LOG_WARN(\"Invalid data provided for this command\");\n-\t\tret = rte_telemetry_send_error_response(telemetry, -EINVAL);\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-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int32_t\n-rte_telemetry_command_ports_stats_values_by_name(struct telemetry_impl\n-\t*telemetry, int action, json_t *data)\n-{\n-\tint ret;\n-\tstruct telemetry_encode_param ep;\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid telemetry argument\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (action != ACTION_GET) {\n-\t\tTELEMETRY_LOG_WARN(\"Invalid action for this command\");\n-\t\tret = rte_telemetry_send_error_response(telemetry, -EINVAL);\n-\t\tif (ret < 0)\n-\t\t\tTELEMETRY_LOG_ERR(\"Could not send error\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = metrics_fns->extract_data(&ep, data);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Extracting JSON data failed\");\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_ports_stats_values(&ep, telemetry);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Sending ports stats values failed\");\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int32_t\n-rte_telemetry_parse_command(struct telemetry_impl *telemetry, int action,\n-\tconst char *command, json_t *data)\n-{\n-\tint ret;\n-\tuint32_t i;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid telemetry argument\");\n-\t\treturn -1;\n-\t}\n-\n-\tstruct rte_telemetry_command commands[] = {\n-\t\t{\n-\t\t\t.text = \"clients\",\n-\t\t\t.fn = &rte_telemetry_command_clients\n-\t\t},\n-\t\t{\n-\t\t\t.text = \"ports\",\n-\t\t\t.fn = &rte_telemetry_command_ports\n-\t\t},\n-\t\t{\n-\t\t\t.text = \"ports_details\",\n-\t\t\t.fn = &rte_telemetry_command_ports_details\n-\t\t},\n-\t\t{\n-\t\t\t.text = \"port_stats\",\n-\t\t\t.fn = &rte_telemetry_command_port_stats\n-\t\t},\n-\t\t{\n-\t\t\t.text = \"ports_stats_values_by_name\",\n-\t\t\t.fn = &rte_telemetry_command_ports_stats_values_by_name\n-\t\t},\n-\t\t{\n-\t\t\t.text = \"ports_all_stat_values\",\n-\t\t\t.fn = &rte_telemetry_command_ports_all_stat_values\n-\t\t},\n-\t\t{\n-\t\t\t.text = \"global_stat_values\",\n-\t\t\t.fn = &rte_telemetry_command_global_stat_values\n-\t\t}\n-\t};\n-\n-\tconst uint32_t num_commands = RTE_DIM(commands);\n-\n-\tfor (i = 0; i < num_commands; i++) {\n-\t\tif (strcmp(command, commands[i].text) == 0) {\n-\t\t\tret = commands[i].fn(telemetry, action, data);\n-\t\t\tif (ret < 0) {\n-\t\t\t\tTELEMETRY_LOG_ERR(\"Command Function for %s failed\",\n-\t\t\t\t\tcommands[i].text);\n-\t\t\t\treturn -1;\n-\t\t\t}\n-\t\t\treturn 0;\n-\t\t}\n-\t}\n-\n-\tTELEMETRY_LOG_WARN(\"\\\"%s\\\" command not found\", command);\n-\n-\tret = rte_telemetry_send_error_response(telemetry, -EINVAL);\n-\tif (ret < 0)\n-\t\tTELEMETRY_LOG_ERR(\"Could not send error\");\n-\n-\treturn -1;\n-}\n-\n-int32_t\n-rte_telemetry_parse(struct telemetry_impl *telemetry, char *socket_rx_data)\n-{\n-\tint ret, action_int;\n-\tjson_error_t error;\n-\tjson_t *root, *action, *command, *data;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Invalid telemetry argument\");\n-\t\treturn -1;\n-\t}\n-\n-\troot = json_loads(socket_rx_data, 0, &error);\n-\tif (root == NULL) {\n-\t\tTELEMETRY_LOG_WARN(\"Could not load JSON object from data passed in : %s\",\n-\t\t\t\terror.text);\n-\t\tret = rte_telemetry_send_error_response(telemetry, -EPERM);\n-\t\tif (ret < 0)\n-\t\t\tTELEMETRY_LOG_ERR(\"Could not send error\");\n-\t\treturn -EPERM;\n-\t} else if (!json_is_object(root)) {\n-\t\tTELEMETRY_LOG_WARN(\"JSON Request is not a JSON object\");\n-\t\tjson_decref(root);\n-\t\tgoto einval_fail;\n-\t}\n-\n-\taction = json_object_get(root, \"action\");\n-\tif (action == NULL) {\n-\t\tTELEMETRY_LOG_WARN(\"Request does not have action field\");\n-\t\tgoto einval_fail;\n-\t} else if (!json_is_integer(action)) {\n-\t\tTELEMETRY_LOG_WARN(\"Action value is not an integer\");\n-\t\tgoto einval_fail;\n-\t}\n-\n-\tcommand = json_object_get(root, \"command\");\n-\tif (command == NULL) {\n-\t\tTELEMETRY_LOG_WARN(\"Request does not have command field\");\n-\t\tgoto einval_fail;\n-\t} else if (!json_is_string(command)) {\n-\t\tTELEMETRY_LOG_WARN(\"Command value is not a string\");\n-\t\tgoto einval_fail;\n-\t}\n-\n-\taction_int = json_integer_value(action);\n-\tif (action_int != ACTION_GET && action_int != ACTION_DELETE) {\n-\t\tTELEMETRY_LOG_WARN(\"Invalid action code\");\n-\t\tgoto einval_fail;\n-\t}\n-\n-\tconst char *command_string = json_string_value(command);\n-\tdata = json_object_get(root, \"data\");\n-\tif (data == NULL) {\n-\t\tTELEMETRY_LOG_WARN(\"Request does not have data field\");\n-\t\tgoto einval_fail;\n-\t}\n-\n-\tret = rte_telemetry_parse_command(telemetry, action_int, command_string,\n-\t\tdata);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_WARN(\"Could not parse command\");\n-\t\treturn -EINVAL;\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-\t\treturn -EPERM;\n-\t}\n-\treturn -EINVAL;\n-}\ndiff --git a/lib/librte_telemetry/rte_telemetry_parser.h b/lib/librte_telemetry/rte_telemetry_parser.h\ndeleted file mode 100644\nindex 28b808d8ad..0000000000\n--- a/lib/librte_telemetry/rte_telemetry_parser.h\n+++ /dev/null\n@@ -1,15 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2018 Intel Corporation\n- */\n-\n-#include \"rte_telemetry_internal.h\"\n-#include \"rte_compat.h\"\n-\n-#ifndef _RTE_TELEMETRY_PARSER_H_\n-#define _RTE_TELEMETRY_PARSER_H_\n-\n-__rte_experimental\n-int32_t\n-rte_telemetry_parse(struct telemetry_impl *telemetry, char *socket_rx_data);\n-\n-#endif\ndiff --git a/lib/librte_telemetry/rte_telemetry_parser_test.c b/lib/librte_telemetry/rte_telemetry_parser_test.c\ndeleted file mode 100644\nindex 6164ef83ec..0000000000\n--- a/lib/librte_telemetry/rte_telemetry_parser_test.c\n+++ /dev/null\n@@ -1,533 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2018 Intel Corporation\n- */\n-\n-#include <stdio.h>\n-#include <stdint.h>\n-#include <string.h>\n-#include <errno.h>\n-#include <jansson.h>\n-#include <sys/socket.h>\n-#include <sys/un.h>\n-#include <unistd.h>\n-\n-#include <rte_common.h>\n-#include <rte_tailq.h>\n-#include <rte_string_fns.h>\n-\n-#include \"rte_telemetry_parser.h\"\n-#include \"rte_telemetry_internal.h\"\n-\n-enum choices {\n-\tINV_ACTION_VAL,\n-\tINV_COMMAND_VAL,\n-\tINV_DATA_VAL,\n-\tINV_ACTION_FIELD,\n-\tINV_COMMAND_FIELD,\n-\tINV_DATA_FIELD,\n-\tINV_JSON_FORMAT,\n-\tVALID_REQ\n-};\n-\n-\n-#define TEST_CLIENT \"/var/run/dpdk/test_client\"\n-\n-static int32_t\n-rte_telemetry_create_test_socket(struct telemetry_impl *telemetry,\n-\tconst char *test_client_path)\n-{\n-\tint ret, sockfd;\n-\tstruct sockaddr_un addr = {0};\n-\tstruct telemetry_client *client;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Telemetry argument has not been initialised\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tsockfd = socket(AF_UNIX, SOCK_SEQPACKET, 0);\n-\tif (sockfd < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Test socket creation failure\");\n-\t\treturn -1;\n-\t}\n-\n-\taddr.sun_family = AF_UNIX;\n-\tstrlcpy(addr.sun_path, test_client_path, sizeof(addr.sun_path));\n-\tunlink(test_client_path);\n-\n-\tif (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Test socket binding failure\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (listen(sockfd, 1) < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Listen failure\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_telemetry_register_client(telemetry, test_client_path);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Register dummy client failed: %i\", ret);\n-\t\treturn -1;\n-\t}\n-\n-\tret = accept(sockfd, NULL, NULL);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Socket accept failed\");\n-\t\treturn -1;\n-\t}\n-\n-\tTAILQ_FOREACH(client, &telemetry->client_list_head, client_list)\n-\t\ttelemetry->request_client = client;\n-\n-\treturn 0;\n-}\n-\n-static int32_t\n-rte_telemetry_format_port_stat_ids(int *port_ids, int num_port_ids,\n-\tconst char * const *stat_names, int num_stat_names, json_t **data)\n-{\n-\n-\tint ret;\n-\tjson_t *stat_names_json_array = NULL;\n-\tjson_t *port_ids_json_array = NULL;\n-\tuint32_t i;\n-\n-\tif (num_port_ids < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Port Ids Count invalid\");\n-\t\tgoto fail;\n-\t}\n-\n-\t*data = json_object();\n-\tif (*data == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Data json object creation failed\");\n-\t\tgoto fail;\n-\t}\n-\n-\tport_ids_json_array = json_array();\n-\tif (port_ids_json_array == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"port_ids_json_array creation failed\");\n-\t\tgoto fail;\n-\t}\n-\n-\tfor (i = 0; i < (uint32_t)num_port_ids; i++) {\n-\t\tret = json_array_append(port_ids_json_array,\n-\t\t\t\tjson_integer(port_ids[i]));\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"JSON array creation failed\");\n-\t\t\tgoto fail;\n-\t\t}\n-\t}\n-\n-\tret = json_object_set_new(*data, \"ports\", port_ids_json_array);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Setting 'ports' value in data object failed\");\n-\t\tgoto fail;\n-\t}\n-\n-\tif (stat_names) {\n-\t\tif (num_stat_names < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Stat Names Count invalid\");\n-\t\t\tgoto fail;\n-\t\t}\n-\n-\t\tstat_names_json_array = json_array();\n-\t\tif (stat_names_json_array == NULL) {\n-\t\t\tTELEMETRY_LOG_ERR(\"stat_names_json_array creation failed\");\n-\t\t\tgoto fail;\n-\t\t}\n-\n-\t\tuint32_t i;\n-\t\tfor (i = 0; i < (uint32_t)num_stat_names; i++) {\n-\t\t\tret = json_array_append(stat_names_json_array,\n-\t\t\t\t json_string(stat_names[i]));\n-\t\t\tif (ret < 0) {\n-\t\t\t\tTELEMETRY_LOG_ERR(\"JSON array creation failed\");\n-\t\t\t\tgoto fail;\n-\t\t\t}\n-\t\t}\n-\n-\t\tret = json_object_set_new(*data, \"stats\", stat_names_json_array);\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Setting 'stats' value in data object failed\");\n-\t\t\tgoto fail;\n-\t\t}\n-\t}\n-\n-\treturn 0;\n-\n-fail:\n-\tif (*data)\n-\t\tjson_decref(*data);\n-\tif (stat_names_json_array)\n-\t\tjson_decref(stat_names_json_array);\n-\tif (port_ids_json_array)\n-\t\tjson_decref(port_ids_json_array);\n-\treturn -1;\n-}\n-\n-static int32_t\n-rte_telemetry_create_json_request(int action, const char *command,\n-\tconst char *client_path, int *port_ids, int num_port_ids,\n-\tconst char * const *stat_names, int num_stat_names, char **request,\n-\tint inv_choice)\n-{\n-\tint ret;\n-\tjson_t *root = json_object();\n-\tjson_t *data;\n-\n-\tif (root == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not create root json object\");\n-\t\tgoto fail;\n-\t}\n-\n-\tif (inv_choice == INV_ACTION_FIELD) {\n-\t\tret = json_object_set_new(root, \"ac--on\", json_integer(action));\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Setting invalid action field in root object failed\");\n-\t\t\tgoto fail;\n-\t\t}\n-\t} else {\n-\t\tret = json_object_set_new(root, \"action\", json_integer(action));\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Setting valid action field in root object failed\");\n-\t\t\tgoto fail;\n-\t\t}\n-\t}\n-\n-\tif (inv_choice == INV_COMMAND_FIELD) {\n-\t\tret = json_object_set_new(root, \"co---nd\", json_string(command));\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Setting invalid command field in root object failed\");\n-\t\t\tgoto fail;\n-\t\t}\n-\t} else {\n-\t\tret = json_object_set_new(root, \"command\", json_string(command));\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Setting valid command field in root object failed\");\n-\t\t\tgoto fail;\n-\t\t}\n-\t}\n-\n-\tdata = json_null();\n-\tif (client_path) {\n-\t\tdata = json_object();\n-\t\tif (data == NULL) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Data json object creation failed\");\n-\t\t\tgoto fail;\n-\t\t}\n-\n-\t\tret = json_object_set_new(data, \"client_path\",\n-\t\t\t\tjson_string(client_path));\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Setting valid client_path field in data object failed\");\n-\t\t\tgoto fail;\n-\t\t}\n-\n-\t} else if (port_ids) {\n-\t\tret = rte_telemetry_format_port_stat_ids(port_ids, num_port_ids,\n-\t\t\t\tstat_names, num_stat_names, &data);\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Formatting Port/Stat arrays failed\");\n-\t\t\tgoto fail;\n-\t\t}\n-\n-\t}\n-\n-\tif (inv_choice == INV_DATA_FIELD) {\n-\t\tret = json_object_set_new(root, \"d--a\", data);\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Setting invalid data field in data object failed\");\n-\t\t\tgoto fail;\n-\t\t}\n-\t} else {\n-\t\tret = json_object_set_new(root, \"data\", data);\n-\t\tif (ret < 0) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Setting valid data field in data object failed\");\n-\t\t\tgoto fail;\n-\t\t}\n-\t}\n-\n-\t*request = json_dumps(root, 0);\n-\tif (*request == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Converting JSON root object to char* failed\");\n-\t\tgoto fail;\n-\t}\n-\n-\tjson_decref(root);\n-\treturn 0;\n-\n-fail:\n-\tif (root)\n-\t\tjson_decref(root);\n-\treturn -1;\n-}\n-\n-static int32_t\n-rte_telemetry_send_get_ports_and_stats_request(struct telemetry_impl *telemetry,\n-\tint action_choice, const char *command_choice, int inv_choice)\n-{\n-\tint ret;\n-\tchar *request;\n-\tconst char *client_path_data = NULL;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Telemetry argument has not been initialised\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\n-\tif (inv_choice == INV_ACTION_VAL)\n-\t\taction_choice = -1;\n-\telse if (inv_choice == INV_COMMAND_VAL)\n-\t\tcommand_choice = \"INVALID_COMMAND\";\n-\telse if (inv_choice == INV_DATA_VAL)\n-\t\tclient_path_data = \"INVALID_DATA\";\n-\n-\tret = rte_telemetry_create_json_request(action_choice, command_choice,\n-\t\tclient_path_data, NULL, -1, NULL, -1, &request, inv_choice);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not create JSON Request\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (inv_choice == INV_JSON_FORMAT)\n-\t\trequest++;\n-\n-\tret = rte_telemetry_parse(telemetry, request);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_WARN(\"Could not parse JSON Request\");\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int32_t\n-rte_telemetry_send_get_ports_details_request(struct telemetry_impl *telemetry,\n-\tint action_choice, int *port_ids, int num_port_ids, int inv_choice)\n-{\n-\tint ret;\n-\tchar *request;\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Telemetry argument has not been initialised\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tconst char *command = \"ports_details\";\n-\n-\tif (inv_choice == INV_ACTION_VAL)\n-\t\taction_choice = -1;\n-\telse if (inv_choice == INV_COMMAND_VAL)\n-\t\tcommand = \"INVALID_COMMAND\";\n-\telse if (inv_choice == INV_DATA_VAL)\n-\t\tport_ids = NULL;\n-\n-\n-\tret = rte_telemetry_create_json_request(action_choice, command, NULL,\n-\t\tport_ids, num_port_ids, NULL, -1, &request, inv_choice);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not create JSON Request\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (inv_choice == INV_JSON_FORMAT)\n-\t\trequest++;\n-\n-\tret = rte_telemetry_parse(telemetry, request);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_WARN(\"Could not parse JSON Request\");\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int32_t\n-rte_telemetry_send_stats_values_by_name_request(struct telemetry_impl\n-\t*telemetry, int action_choice, int *port_ids, int num_port_ids,\n-\tconst char * const *stat_names, int num_stat_names,\n-\tint inv_choice)\n-{\n-\tint ret;\n-\tchar *request;\n-\tconst char *command = \"ports_stats_values_by_name\";\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Telemetry argument has not been initialised\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tif (inv_choice == INV_ACTION_VAL)\n-\t\taction_choice = -1;\n-\telse if (inv_choice == INV_COMMAND_VAL)\n-\t\tcommand = \"INVALID_COMMAND\";\n-\telse if (inv_choice == INV_DATA_VAL) {\n-\t\tport_ids = NULL;\n-\t\tstat_names = NULL;\n-\t}\n-\n-\tret = rte_telemetry_create_json_request(action_choice, command, NULL,\n-\t\tport_ids, num_port_ids, stat_names, num_stat_names, &request,\n-\t\tinv_choice);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not create JSON Request\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (inv_choice == INV_JSON_FORMAT)\n-\t\trequest++;\n-\n-\tret = rte_telemetry_parse(telemetry, request);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_WARN(\"Could not parse JSON Request\");\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int32_t\n-rte_telemetry_send_unreg_request(struct telemetry_impl *telemetry,\n-\tint action_choice, const char *client_path, int inv_choice)\n-{\n-\tint ret;\n-\tchar *request;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Telemetry argument has not been initialised\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tconst char *command = \"clients\";\n-\n-\tif (inv_choice == INV_ACTION_VAL)\n-\t\taction_choice = -1;\n-\telse if (inv_choice == INV_COMMAND_VAL)\n-\t\tcommand = \"INVALID_COMMAND\";\n-\telse if (inv_choice == INV_DATA_VAL)\n-\t\tclient_path = NULL;\n-\n-\tret = rte_telemetry_create_json_request(action_choice, command,\n-\t\tclient_path, NULL, -1, NULL, -1, &request, inv_choice);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not create JSON Request\");\n-\t\treturn -1;\n-\t}\n-\n-\tif (inv_choice == INV_JSON_FORMAT)\n-\t\trequest++;\n-\n-\tret = rte_telemetry_parse(telemetry, request);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_WARN(\"Could not parse JSON Request\");\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-int32_t\n-rte_telemetry_parser_test(struct telemetry_impl *telemetry)\n-{\n-\tint ret;\n-\tconst char *client_path = TEST_CLIENT;\n-\n-\tif (telemetry == NULL) {\n-\t\tTELEMETRY_LOG_ERR(\"Telemetry argument has not been initialised\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tret = rte_telemetry_create_test_socket(telemetry, client_path);\n-\tif (ret < 0) {\n-\t\tTELEMETRY_LOG_ERR(\"Could not create test request client socket\");\n-\t\treturn -1;\n-\t}\n-\n-\tint port_ids[] = {0, 1};\n-\tint num_port_ids = RTE_DIM(port_ids);\n-\n-\tstatic const char * const stat_names[] = {\"tx_good_packets\",\n-\t\t\"rx_good_packets\"};\n-\tint num_stat_names = RTE_DIM(stat_names);\n-\n-\tstatic const char * const test_types[] = {\n-\t\t\"INVALID ACTION VALUE TESTS\",\n-\t\t\"INVALID COMMAND VALUE TESTS\",\n-\t\t\"INVALID DATA VALUE TESTS\",\n-\t\t\"INVALID ACTION FIELD TESTS\",\n-\t\t\"INVALID COMMAND FIELD TESTS\",\n-\t\t\"INVALID DATA FIELD TESTS\",\n-\t\t\"INVALID JSON FORMAT TESTS\",\n-\t\t\"VALID TESTS\"\n-\t};\n-\n-\n-\tuint32_t i;\n-\tfor (i = 0; i < RTE_DIM(test_types); i++) {\n-\t\tTELEMETRY_LOG_INFO(\"%s\", test_types[i]);\n-\n-\t\tret = rte_telemetry_send_get_ports_and_stats_request(telemetry,\n-\t\t\tACTION_GET, \"ports\", i);\n-\t\tif (ret != 0 && i == VALID_REQ) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Get ports valid test failed\");\n-\t\t\treturn -EPERM;\n-\t\t} else if (ret != -1 && i != VALID_REQ) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Get ports invalid test failed\");\n-\t\t\treturn -EPERM;\n-\t\t}\n-\n-\t\tTELEMETRY_LOG_INFO(\"Success - Get ports test passed\");\n-\n-\t\tret = rte_telemetry_send_get_ports_details_request(telemetry,\n-\t\t\tACTION_GET, port_ids, num_port_ids, i);\n-\t\tif (ret != 0 && i == VALID_REQ) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Get ports details valid\");\n-\t\t\treturn -EPERM;\n-\t\t} else if (ret != -1 && i != VALID_REQ) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Get ports details invalid\");\n-\t\t\treturn -EPERM;\n-\t\t}\n-\n-\t\tTELEMETRY_LOG_INFO(\"Success - Get ports details test passed\");\n-\n-\t\tret = rte_telemetry_send_get_ports_and_stats_request(telemetry,\n-\t\t\tACTION_GET, \"port_stats\", i);\n-\t\tif (ret != 0  && i == VALID_REQ) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Get port stats valid test\");\n-\t\t\treturn -EPERM;\n-\t\t} else if (ret != -1 && i != VALID_REQ) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Get ports stats invalid test failed\");\n-\t\t\treturn -EPERM;\n-\t\t}\n-\n-\t\tTELEMETRY_LOG_INFO(\"Success - Get ports stats test passed\");\n-\n-\t\tret = rte_telemetry_send_stats_values_by_name_request(telemetry,\n-\t\t\tACTION_GET, port_ids, num_port_ids, stat_names,\n-\t\t\tnum_stat_names, i);\n-\t\tif (ret != 0 && i == VALID_REQ) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Get ports stats values by name valid test failed\");\n-\t\t\treturn -EPERM;\n-\t\t} else if (ret != -1 && i != VALID_REQ) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Get ports stats values by name invalid test failed\");\n-\t\t\treturn -EPERM;\n-\t\t}\n-\n-\t\tTELEMETRY_LOG_INFO(\"Success - Get ports stats values by name test passed\");\n-\n-\t\tret = rte_telemetry_send_unreg_request(telemetry, ACTION_DELETE,\n-\t\t\tclient_path, i);\n-\t\tif (ret != 0 && i == VALID_REQ) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Deregister valid test failed\");\n-\t\t\treturn -EPERM;\n-\t\t} else if (ret != -1 && i != VALID_REQ) {\n-\t\t\tTELEMETRY_LOG_ERR(\"Deregister invalid test failed\");\n-\t\t\treturn -EPERM;\n-\t\t}\n-\n-\t\tTELEMETRY_LOG_INFO(\"Success - Deregister test passed\");\n-\t}\n-\n-\treturn 0;\n-}\ndiff --git a/lib/librte_telemetry/rte_telemetry_socket_tests.h b/lib/librte_telemetry/rte_telemetry_socket_tests.h\ndeleted file mode 100644\nindex db9167c5d5..0000000000\n--- a/lib/librte_telemetry/rte_telemetry_socket_tests.h\n+++ /dev/null\n@@ -1,36 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2018 Intel Corporation\n- */\n-\n-#include <stdbool.h>\n-\n-#include \"rte_telemetry_internal.h\"\n-\n-#ifndef _RTE_TELEMETRY_SOCKET_TESTING_H_\n-#define _RTE_TELEMETRY_SOCKET_TESTING_H_\n-\n-int32_t\n-rte_telemetry_json_socket_message_test(struct telemetry_impl *telemetry,\n-\tint fd);\n-\n-int32_t\n-rte_telemetry_invalid_json_test(struct telemetry_impl *telemetry, int fd);\n-\n-int32_t\n-rte_telemetry_valid_json_test(struct telemetry_impl *telemetry, int fd);\n-\n-int32_t\n-rte_telemetry_json_contents_test(struct telemetry_impl *telemetry, int fd);\n-\n-int32_t\n-rte_telemetry_json_empty_test(struct telemetry_impl *telemetry, int fd);\n-\n-int32_t\n-rte_telemetry_socket_register_test(struct telemetry_impl *telemetry, int *fd,\n-\tint send_fd, int recv_fd);\n-\n-int32_t\n-rte_telemetry_socket_test_setup(struct telemetry_impl *telemetry, int *send_fd,\n-\tint *recv_fd);\n-\n-#endif\ndiff --git a/lib/librte_telemetry/rte_telemetry_version.map b/lib/librte_telemetry/rte_telemetry_version.map\nindex 36eac75c4e..67246e2ebe 100644\n--- a/lib/librte_telemetry/rte_telemetry_version.map\n+++ b/lib/librte_telemetry/rte_telemetry_version.map\n@@ -1,12 +1,7 @@\n EXPERIMENTAL {\n \tglobal:\n \n-\trte_telemetry_cleanup;\n \trte_telemetry_init;\n-\trte_telemetry_parse;\n-\trte_telemetry_selftest;\n-\trte_telemetry_set_metrics_fns;\n-\trte_telemetry_new_init;\n \trte_telemetry_register_cmd;\n \trte_tel_data_add_array_int;\n \trte_tel_data_add_array_string;\n@@ -17,7 +12,6 @@ EXPERIMENTAL {\n \trte_tel_data_start_array;\n \trte_tel_data_start_dict;\n \trte_tel_data_string;\n-\trte_telemetry_legacy_init;\n \trte_telemetry_legacy_register;\n \n \tlocal: *;\ndiff --git a/lib/librte_telemetry/telemetry.c b/lib/librte_telemetry/telemetry.c\nindex f7e51be07c..d82e03bb71 100644\n--- a/lib/librte_telemetry/telemetry.c\n+++ b/lib/librte_telemetry/telemetry.c\n@@ -14,6 +14,7 @@\n #include <rte_common.h>\n #include <rte_spinlock.h>\n #include <rte_version.h>\n+#include <rte_option.h>\n \n #include \"rte_telemetry.h\"\n #include \"telemetry_json.h\"\n@@ -341,7 +342,7 @@ create_socket(char *path)\n \treturn -1;\n }\n \n-static int __rte_unused /* will be used in future commit */\n+static int\n telemetry_legacy_init(const char *runtime_dir)\n {\n \tpthread_t t_old;\n@@ -397,7 +398,7 @@ telemetry_v2_init(const char *runtime_dir)\n }\n \n int32_t\n-rte_telemetry_new_init(void)\n+rte_telemetry_init(void)\n {\n \tconst char *error_str;\n \tif (telemetry_v2_init(rte_eal_get_runtime_dir()) != 0) {\n@@ -405,5 +406,20 @@ rte_telemetry_new_init(void)\n \t\tprintf(\"Error initialising telemetry - %s\", error_str);\n \t\treturn -1;\n \t}\n+\tif (telemetry_legacy_init(rte_eal_get_runtime_dir()) != 0) {\n+\t\terror_str = telemetry_log_error;\n+\t\tprintf(\"No telemetry legacy support- %s\", error_str);\n+\t}\n \treturn 0;\n }\n+\n+static struct rte_option option = {\n+\t.name = \"telemetry\",\n+\t.usage = \"Enable telemetry backend\",\n+\t.cb = &rte_telemetry_init,\n+\t.enabled = 0\n+};\n+\n+RTE_INIT(telemetry_register_op) {\n+\trte_option_register(&option);\n+}\n",
    "prefixes": [
        "v4",
        "14/18"
    ]
}