From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 5C7FEA0597; Wed, 8 Apr 2020 19:56:43 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 40B8A1C1A9; Wed, 8 Apr 2020 19:56:42 +0200 (CEST) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by dpdk.org (Postfix) with ESMTP id C036F1C1A8 for ; Wed, 8 Apr 2020 19:56:40 +0200 (CEST) IronPort-SDR: EAI8bQ1AuXF3ADdb5TrbSpeebDPV/0jOz6pP2MjDcOB2tbD8s8YNItEj4gddHsHEYskEncGOKS esiUmQjiR58A== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Apr 2020 10:56:39 -0700 IronPort-SDR: mV639WDK2Z6ZkcYGxqwS32LIrQocPYVqcFPm4gMIghmy8qLw7fJbZem6G5mWSOrp8C06Y5AfTC B1MOiXHcCuyA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,359,1580803200"; d="scan'208";a="398278137" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by orsmga004.jf.intel.com with ESMTP; 08 Apr 2020 10:56:39 -0700 Received: from fmsmsx158.amr.corp.intel.com (10.18.116.75) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.439.0; Wed, 8 Apr 2020 10:56:38 -0700 Received: from FMSEDG002.ED.cps.intel.com (10.1.192.134) by fmsmsx158.amr.corp.intel.com (10.18.116.75) with Microsoft SMTP Server (TLS) id 14.3.439.0; Wed, 8 Apr 2020 10:56:38 -0700 Received: from NAM04-CO1-obe.outbound.protection.outlook.com (104.47.45.50) by edgegateway.intel.com (192.55.55.69) with Microsoft SMTP Server (TLS) id 14.3.439.0; Wed, 8 Apr 2020 10:56:37 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=l3DUwzKxJlhB2AqG9fCgzRVHvH7xX0Ut1qvYTmkQAcw7B4Pd/A/zGBTtmNqAQytvwRrE/MFedapZzfYph8JlQL96ZGys7tvvM52ZhwnUnRk/Bo8+S7Kpnw/McwUi+wXbbtuJvcLb4P3XoW3t3IPySGrR17w7hoaio07lrnayYw1eDvgZFtjDBp7J1H1ipdXIRCwD3TSf3+IXrfRLPl+fHm48GweitUa6Vsv0qznvYQ7k7zkSxOMI6WsOKRNU6Ek06+fSHWErTFINGB9ubWGXp9KCn8Wxg9jMSpKs+/rC4JzCTHM2vPRzZ8+/FHZQkbPwXmqybwHuSG5oYNxhiojn4Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=g707WLVs0sJcU0cvx7lAQCrgmz4Z4uBObsoNutxNjjI=; b=ZMaarB8owhm+gLxEqdYVMYO5P5+vmFrPkMeiM0ozi3SrI4+E9yAmEL1jKonfwvb7Y+R+8+SLW+Qnwnbv6Yj7RIqRhB5LkD3MxaTA5VHArdrZsQNICjIT+Me/0mxZXKiJ1VBK35iePSUYh2DyYRCFQOsfMbrviLhN4GGiKg09UITBHCnkftH37M0UucyAS/FIhMdaMblDK+PasAn0Kxv4R6aJSrjyUr9fhYXxHgcXBxgA6EjlNpbi9aihnszIbWPLKVJaBWVVEYYudLjIYjeqic3tITKuBsrU1evho3IPanRJeL2O1YovmrnfmqyXbxC10Tn9FIw8qcYpBP64qtfj9g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=g707WLVs0sJcU0cvx7lAQCrgmz4Z4uBObsoNutxNjjI=; b=F+hvSAE1XqIOdjjQdovLwxsg3Ee2mm1k4E+if1ULQUmvo556Ch3AGWdRGo3f4YpapvO0IROfFzJHASsyRHkcla59x/0eWrzCEJNYCBSqsIAhsmuivbISA9A4UZaG5HpJ10ReGqHSI3NoBExW4qbrB7MldqgnpxEqW1rtTQdHUX4= Received: from DM6PR11MB4593.namprd11.prod.outlook.com (2603:10b6:5:2a3::8) by DM6PR11MB3004.namprd11.prod.outlook.com (2603:10b6:5:67::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2878.21; Wed, 8 Apr 2020 17:56:33 +0000 Received: from DM6PR11MB4593.namprd11.prod.outlook.com ([fe80::9d18:a682:243f:6d6d]) by DM6PR11MB4593.namprd11.prod.outlook.com ([fe80::9d18:a682:243f:6d6d%3]) with mapi id 15.20.2900.015; Wed, 8 Apr 2020 17:56:33 +0000 From: "Wiles, Keith" To: "Power, Ciara" CC: dev , "Laatz, Kevin" , "Pattan, Reshma" , "jerinjacobk@gmail.com" , "david.marchand@redhat.com" , "mb@smartsharesystems.com" , "thomas@monjalon.net" , "Richardson, Bruce" Thread-Topic: [PATCH v2 05/16] telemetry: introduce new telemetry functionality Thread-Index: AQHWDchkTCtSnQ5drkmVebMCJ/Ex06hvgoEA Date: Wed, 8 Apr 2020 17:56:32 +0000 Message-ID: <8E5D05AB-5F62-4D77-9029-779B04EC0C24@intel.com> References: <20200319171907.60891-1-ciara.power@intel.com> <20200408164956.47864-1-ciara.power@intel.com> <20200408164956.47864-6-ciara.power@intel.com> In-Reply-To: <20200408164956.47864-6-ciara.power@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=keith.wiles@intel.com; x-originating-ip: [47.24.6.94] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: d17bd16f-8121-4341-b551-08d7dbe62c6f x-ms-traffictypediagnostic: DM6PR11MB3004: x-ld-processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:1775; x-forefront-prvs: 0367A50BB1 x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR11MB4593.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(10019020)(366004)(376002)(396003)(346002)(136003)(39840400004)(8936002)(478600001)(37006003)(186003)(30864003)(36756003)(71200400001)(6512007)(5660300002)(64756008)(4326008)(76116006)(91956017)(107886003)(66556008)(66946007)(81166007)(6636002)(66476007)(66446008)(2616005)(54906003)(33656002)(8676002)(81156014)(6486002)(316002)(6862004)(6506007)(53546011)(2906002)(26005)(86362001); DIR:OUT; SFP:1102; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: Si8NdT868v7LPQSmRkOuKdXMCug6BzYhNEgli7kVpehwUp0HLJJCyFmmJewrWUxh7KrMOcTZAYfvflPIbjzrrTmxv6SXjq540ferx62buYQGhBPHOTOenFseL7VzIcai43sJJvuXodx77VHU0limLwsUUyzyXl0PqYbxgb7WJt8YdYeJ+ihyl8wLga2+qYCR+hadMADQ9GW0vxmQZNJUjHOH2nvyWa3FtfZ0lRI+0i3eyN5ev0Km2teNNTWV6Ds+nUBiu7m7HKFnE0v874tqiij1JYH21GZE4o3apxYuq3Ihuht/EtQEjOEEqeeJ9X/ZMIvHmd+A6mwjft0BnBQXBempjvbUldom4YeYh6ajMtj4qk8KMq9XE06XJxB4G96ve+EFCSR+7s91E2zMtE9NbUMnXohWg9UZ1K4WA4wgT79pBMVsdDoMUQruLgcKwo7f x-ms-exchange-antispam-messagedata: RtGN/US2tUh0EvE6cxiLmeQGwhfq/Dtog2DatlIElTIsjCOgWAzcyCzc0NCoB256N7READWAvpe+8hHQDtczC1g9cRNQ+k1L0EX3jPLpVRJFEBGB/tctIoq5boSEMzhX4/nLPZfTZj+zsgOdGlWefQ== Content-Type: text/plain; charset="us-ascii" Content-ID: <82C92E0407299848B8142A72929AD115@namprd11.prod.outlook.com> Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: d17bd16f-8121-4341-b551-08d7dbe62c6f X-MS-Exchange-CrossTenant-originalarrivaltime: 08 Apr 2020 17:56:32.8613 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: Ko1IEHd6hOwXPbWRtdJORw01nJSPJGWl2fwFglsXN6JSqd3Ey8yi0ewaxjy/ExWv3H9C5/ez7IRh12DeJSHKiw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR11MB3004 X-OriginatorOrg: intel.com Subject: Re: [dpdk-dev] [PATCH v2 05/16] telemetry: introduce new telemetry functionality X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" > On Apr 8, 2020, at 11:49 AM, Power, Ciara wrote: >=20 > From: Bruce Richardson >=20 > This patch introduces a new telemetry connection socket and handling > functionality. Like the existing telemetry implementation (which is > unaffected by this change) it uses a unix socket, but unlike the > existing one it does not have a fixed list of commands - instead > libraries or applications can register telemetry commands and callbacks > to provide a full-extensible solution for all kinds of telemetry across > DPDK. >=20 > Signed-off-by: Bruce Richardson > Signed-off-by: Ciara Power >=20 > --- > v2: > - Added DPDK information message on client connection. > - Added /info command to get DPDK information post-connect. > - Replaced pid in socket name with v2. > - Increased output buffer size to 16k. > - Telemetry default callbacks now registered by init function. > --- > lib/librte_telemetry/Makefile | 4 + > lib/librte_telemetry/meson.build | 5 +- > lib/librte_telemetry/rte_telemetry.c | 3 + > lib/librte_telemetry/rte_telemetry.h | 70 ++++- > .../rte_telemetry_version.map | 2 + > lib/librte_telemetry/telemetry.c | 278 ++++++++++++++++++ > 6 files changed, 360 insertions(+), 2 deletions(-) > create mode 100644 lib/librte_telemetry/telemetry.c >=20 > diff --git a/lib/librte_telemetry/Makefile b/lib/librte_telemetry/Makefil= e > index 17e651c412..74a6e2d2f7 100644 > --- a/lib/librte_telemetry/Makefile > +++ b/lib/librte_telemetry/Makefile > @@ -10,6 +10,9 @@ CFLAGS +=3D -O3 > CFLAGS +=3D $(WERROR_FLAGS) -I$(SRCDIR) > CFLAGS +=3D -DALLOW_EXPERIMENTAL_API > CFLAGS +=3D -I$(RTE_SDK)/lib/librte_metrics/ > +CFLAGS +=3D -I$(RTE_SDK)/lib/librte_eal/include > +CFLAGS +=3D -I$(RTE_SDK)/lib/librte_eal/$(ARCH_DIR)/include > +CFLAGS +=3D -pthread >=20 > LDLIBS +=3D -lrte_eal > LDLIBS +=3D -lrte_metrics > @@ -22,6 +25,7 @@ EXPORT_MAP :=3D rte_telemetry_version.map > SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) :=3D rte_telemetry.c > SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) +=3D rte_telemetry_parser.c > SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) +=3D rte_telemetry_parser_test.c > +SRCS-$(CONFIG_RTE_LIBRTE_TELEMETRY) +=3D telemetry.c >=20 > # export include files > SYMLINK-$(CONFIG_RTE_LIBRTE_TELEMETRY)-include :=3D rte_telemetry.h > diff --git a/lib/librte_telemetry/meson.build b/lib/librte_telemetry/meso= n.build > index b34661ac13..710c119b7a 100644 > --- a/lib/librte_telemetry/meson.build > +++ b/lib/librte_telemetry/meson.build > @@ -1,7 +1,10 @@ > # SPDX-License-Identifier: BSD-3-Clause > # Copyright(c) 2018 Intel Corporation >=20 > -sources =3D files('rte_telemetry.c', 'rte_telemetry_parser.c', 'rte_tele= metry_parser_test.c') > +includes =3D [global_inc] > + > +sources =3D files('rte_telemetry.c', 'rte_telemetry_parser.c', 'rte_tele= metry_parser_test.c', > + 'telemetry.c') > headers =3D files('rte_telemetry.h', 'rte_telemetry_internal.h', 'rte_tel= emetry_parser.h') > cflags +=3D '-DALLOW_EXPERIMENTAL_API' > includes +=3D include_directories('../librte_metrics') > diff --git a/lib/librte_telemetry/rte_telemetry.c b/lib/librte_telemetry/= rte_telemetry.c > index 2fb8ffe873..45b6d9d948 100644 > --- a/lib/librte_telemetry/rte_telemetry.c > +++ b/lib/librte_telemetry/rte_telemetry.c > @@ -503,6 +503,9 @@ rte_telemetry_init(void) > return -EPERM; > } >=20 > + if (rte_telemetry_new_init() !=3D 0) > + return -1; > + > return 0; > } >=20 > diff --git a/lib/librte_telemetry/rte_telemetry.h b/lib/librte_telemetry/= rte_telemetry.h > index aedb318598..d0230d4544 100644 > --- a/lib/librte_telemetry/rte_telemetry.h > +++ b/lib/librte_telemetry/rte_telemetry.h > @@ -3,19 +3,59 @@ > */ >=20 > #include > +#include >=20 > #ifndef _RTE_TELEMETRY_H_ > #define _RTE_TELEMETRY_H_ >=20 > +/** Maximum number of telemetry callbacks. */ > +#define TELEMETRY_MAX_CALLBACKS 64 > + > /** > + * @warning > + * @b EXPERIMENTAL: all functions in this file may change without prior = notice > + * > * @file > * RTE Telemetry > * > * The telemetry library provides a method to retrieve statistics from > - * DPDK by sending a JSON encoded message over a socket. DPDK will send > + * DPDK by sending a request message over a socket. DPDK will send > * a JSON encoded response containing telemetry data. > ***/ >=20 > +/** > + * This telemetry callback is used when registering a command. > + * It handles getting and formatting stats to be returned to telemetry w= hen > + * requested. Stats up to buf_len in length are put in the buffer. > + * > + * @param cmd > + * The cmd that was requested by the client. > + * @param params > + * Contains data required by the callback function. > + * @param buffer > + * A buffer to hold the formatted response. > + * @param buf_len > + * Length of the buffer. > + * > + * @return > + * Length of buffer used on success. > + * @return > + * Negative integer on error. > + */ > +typedef int (*telemetry_cb)(const char *cmd, const char *params, > + char *buffer, int buf_len); > + > +/** > + * Used for handling data received over a telemetry socket. > + * > + * @param sock_id > + * ID for the socket to be used by the handler. > + * > + * @return > + * Void. > + */ > +typedef void * (*handler)(void *sock_id); > + > /** > * @warning > * @b EXPERIMENTAL: this API may change without prior notice > @@ -66,4 +106,32 @@ __rte_experimental > int32_t > rte_telemetry_selftest(void); I think we need to be constant with how prototypes are formatted. The two b= elow do not add a newline after the return value. >=20 > +/** > + * Used when registering a command and callback function with telemetry. > + * > + * @param cmd > + * The command to register with telemetry. > + * @param fn > + * Callback function to be called when the command is requested. > + * > + * @return > + * 0 on success. > + * @return > + * -EINVAL for invalid parameters failure. > + * @return > + * -ENOENT if max callbacks limit has been reached. > + */ > +__rte_experimental > +int rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn); > + > +/** > + * Initialize new version of Telemetry. > + * > + * @return > + * 0 on success. > + * @return > + * -1 on failure. > + */ > +__rte_experimental > +int rte_telemetry_new_init(void); > #endif > diff --git a/lib/librte_telemetry/rte_telemetry_version.map b/lib/librte_= telemetry/rte_telemetry_version.map > index a80058c59c..831bbd59ad 100644 > --- a/lib/librte_telemetry/rte_telemetry_version.map > +++ b/lib/librte_telemetry/rte_telemetry_version.map > @@ -6,6 +6,8 @@ EXPERIMENTAL { > rte_telemetry_parse; > rte_telemetry_selftest; > rte_telemetry_set_metrics_fns; > + rte_telemetry_new_init; > + rte_telemetry_register_cmd; >=20 > local: *; > }; > diff --git a/lib/librte_telemetry/telemetry.c b/lib/librte_telemetry/tele= metry.c > new file mode 100644 > index 0000000000..2878c1dbd9 > --- /dev/null > +++ b/lib/librte_telemetry/telemetry.c > @@ -0,0 +1,278 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright(c) 2020 Intel Corporation > + */ > + > +#include > +#include > +#include > +#include > +#include > + > +/* we won't link against libbsd, so just always use DPDKs-specific strlc= py */ > +#undef RTE_USE_LIBBSD > +#include > +#include > +#include > +#include > + > +#include "rte_telemetry.h" > + > +#define MAX_CMD_LEN 56 > +#define MAX_OUTPUT_LEN (1024 * 16) > + > +static int > +list_commands(const char *cmd __rte_unused, const char *params __rte_unu= sed, > + char *buffer, int buf_len); > + > +static int > +handle_info(const char *cmd __rte_unused, const char *params __rte_unuse= d, > + char *buffer, int buf_len); > + > +static void * > +client_handler(void *socket); > + > +struct cmd_callback { > + char cmd[MAX_CMD_LEN]; > + telemetry_cb fn; > +}; > + > +struct socket { > + int sock; > + char path[sizeof(((struct sockaddr_un *)0)->sun_path)]; > + handler fn; > +}; > +static struct socket v2_socket; /* socket for v2 telemetry */ > +static char telemetry_log_error[1024]; /* Will contain error on init fai= lure */ > +/* list of command callbacks, with one command registered by default */ > +static struct cmd_callback callbacks[TELEMETRY_MAX_CALLBACKS]; > +static int num_callbacks; /* How many commands are registered */ > +/* Used when accessing or modifying list of command callbacks */ > +static rte_spinlock_t callback_sl =3D RTE_SPINLOCK_INITIALIZER; > + > +int > +rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn) > +{ > + int i =3D 0; > + > + if (strlen(cmd) >=3D MAX_CMD_LEN || fn =3D=3D NULL || cmd[0] !=3D '/') > + return -EINVAL; > + if (num_callbacks >=3D TELEMETRY_MAX_CALLBACKS) > + return -ENOENT; > + > + rte_spinlock_lock(&callback_sl); > + while (i < num_callbacks && strcmp(cmd, callbacks[i].cmd) > 0) > + i++; > + if (i !=3D num_callbacks) > + /* Move elements to keep the list alphabetical */ > + memmove(callbacks + i + 1, callbacks + i, > + sizeof(struct cmd_callback) * (num_callbacks - i)); > + > + strlcpy(callbacks[i].cmd, cmd, MAX_CMD_LEN); > + callbacks[i].fn =3D fn; > + num_callbacks++; > + rte_spinlock_unlock(&callback_sl); > + > + return 0; > +} > + > +static int > +list_commands(const char *cmd __rte_unused, const char *params __rte_unu= sed, > + char *buffer, int buf_len) > +{ > + int i, ret, used =3D 0; > + > + used +=3D strlcpy(buffer, "[", buf_len); > + for (i =3D 0; i < num_callbacks; i++) { > + ret =3D snprintf(buffer + used, buf_len - used, "\"%s\",", > + callbacks[i].cmd); > + if (ret + used >=3D buf_len) > + break; > + used +=3D ret; > + } > + buffer[used - 1] =3D ']'; > + return used; > +} > + > +static int > +handle_info(const char *cmd __rte_unused, const char *params __rte_unuse= d, > + char *buffer, int buf_len) > +{ > + int ret =3D snprintf(buffer, buf_len, > + "{\"pid\":%d, \"version\":\"%s\", \"max_output_len\":%d}", > + getpid(), rte_version(), MAX_OUTPUT_LEN); The spaces can be removed after the commas, correct? > + return ret >=3D buf_len ? -1 : ret; > +} > + > +static void > +perform_command(telemetry_cb fn, const char *cmd, const char *param, int= s) > +{ > + char out_buf[MAX_OUTPUT_LEN]; > + > + int used =3D snprintf(out_buf, > + sizeof(out_buf), "{\"%s\":", cmd); > + int ret =3D fn(cmd, param, out_buf + used, sizeof(out_buf) - used); > + if (ret < 0) { > + used +=3D strlcpy(out_buf + used, "null}\n", > + sizeof(out_buf) - used); Is the newline required in the above output? > + if (write(s, out_buf, used) < 0) > + perror("Error writing to socket"); > + return; > + } > + used +=3D ret; > + used +=3D strlcpy(out_buf + used, "}\n", sizeof(out_buf) - used); Do we need the newline in the output? > + if (write(s, out_buf, used) < 0) > + perror("Error writing to socket"); > +} > + > +static int > +unknown_command(const char *cmd __rte_unused, const char *params __rte_u= nused, > + char *buffer, int buf_len) > +{ > + return snprintf(buffer, buf_len, "null"); > +} > + > +static void * > +client_handler(void *sock_id) > +{ > + int s =3D (int)(uintptr_t)sock_id; > + char buffer[1024]; > + > + /* receive data is not null terminated */ > + int bytes =3D read(s, buffer, sizeof(buffer)); > + buffer[bytes] =3D 0; If bytes is 1024, then we overrun this buffer correct? > + while (bytes > 0) { > + const char *cmd =3D strtok(buffer, ","); > + const char *param =3D strtok(NULL, ","); > + telemetry_cb fn =3D unknown_command; > + int i; > + > + rte_spinlock_lock(&callback_sl); > + for (i =3D 0; i < num_callbacks; i++) Do we need to validate the cmd pointer before we use that pointer? The man = page for strcmp did not state what will happened if the strings are NULL. > + if (strcmp(cmd, callbacks[i].cmd) =3D=3D 0) { > + fn =3D callbacks[i].fn; > + break; > + } > + > + rte_spinlock_unlock(&callback_sl); > + perform_command(fn, cmd, param, s); > + > + bytes =3D read(s, buffer, sizeof(buffer)); > + buffer[bytes] =3D 0; Same buffer overrun problem. > + } > + close(s); > + return NULL; > +} > + > +static void * > +socket_listener(void *socket) > +{ > + while (1) { > + pthread_t th; > + struct socket *s =3D (struct socket *)socket; > + int s_accepted =3D accept(s->sock, NULL, NULL); > + if (s_accepted < 0) { > + snprintf(telemetry_log_error, > + sizeof(telemetry_log_error), > + "Error with accept, telemetry thread quitting\n"); > + return NULL; > + } > + char info_buf[1024]; > + if (handle_info(NULL, NULL, info_buf, sizeof(info_buf)) < 0) > + strlcpy(info_buf, "{}", sizeof(info_buf)); > + if (write(s_accepted, info_buf, strlen(info_buf)) < 0) > + perror("Error writing to socket"); > + pthread_create(&th, NULL, s->fn, (void *)(uintptr_t)s_accepted); > + pthread_detach(th); > + } > + return NULL; > +} > + > +static inline char * > +get_socket_path(const char *runtime_dir, const int version) > +{ > + static char path[PATH_MAX]; > + snprintf(path, sizeof(path), "%s/dpdk_telemetry.v%d", > + strlen(runtime_dir) ? runtime_dir : "/tmp", version); > + return path; > +} > + > +static void > +unlink_sockets(void) > +{ > + if (v2_socket.path[0]) > + unlink(v2_socket.path); > +} > + > +static int > +create_socket(char *path) > +{ > + int sock =3D socket(AF_UNIX, SOCK_SEQPACKET, 0); > + if (sock < 0) { > + snprintf(telemetry_log_error, sizeof(telemetry_log_error), > + "Error with socket creation, %s", > + strerror(errno)); > + return -1; > + } > + > + struct sockaddr_un sun =3D {.sun_family =3D AF_UNIX}; > + strlcpy(sun.sun_path, path, sizeof(sun.sun_path)); > + unlink(sun.sun_path); > + if (bind(sock, (void *) &sun, sizeof(sun)) < 0) { > + snprintf(telemetry_log_error, sizeof(telemetry_log_error), > + "Error binding socket: %s", > + strerror(errno)); > + sun.sun_path[0] =3D 0; > + goto error; > + } > + > + if (listen(sock, 1) < 0) { > + snprintf(telemetry_log_error, sizeof(telemetry_log_error), > + "Error calling listen for socket: %s", > + strerror(errno)); > + goto error; > + } > + > + return sock; > + > +error: > + close(sock); > + unlink_sockets(); > + return -1; > +} > + > +static int > +telemetry_v2_init(const char *runtime_dir, const char **err_str) > +{ > + pthread_t t_new; > + > + rte_telemetry_register_cmd("/", list_commands); > + rte_telemetry_register_cmd("/info", handle_info); > + v2_socket.fn =3D client_handler; > + if (strlcpy(v2_socket.path, get_socket_path(runtime_dir, 2), > + sizeof(v2_socket.path)) >=3D sizeof(v2_socket.path)) { > + snprintf(telemetry_log_error, sizeof(telemetry_log_error), > + "Error with socket binding, path too long"); > + return -1; > + } > + > + v2_socket.sock =3D create_socket(v2_socket.path); > + if (v2_socket.sock < 0) { > + *err_str =3D telemetry_log_error; > + return -1; > + } > + pthread_create(&t_new, NULL, socket_listener, &v2_socket); > + atexit(unlink_sockets); > + > + return 0; > +} > + > +int32_t > +rte_telemetry_new_init(void) > +{ > + const char *error_str; > + if (telemetry_v2_init(rte_eal_get_runtime_dir(), &error_str) !=3D 0) { > + printf("Error initialising telemetry - %s", error_str); > + return -1; > + } > + return 0; > +} > --=20 > 2.17.1 >=20