#include "rte_telemetry.h"
#include "telemetry_json.h"
#include "telemetry_data.h"
+#include "rte_telemetry_legacy.h"
#define MAX_CMD_LEN 56
#define MAX_HELP_LEN 64
handler fn;
};
static struct socket v2_socket; /* socket for v2 telemetry */
+static struct socket v1_socket; /* socket for v1 telemetry */
static char telemetry_log_error[1024]; /* Will contain error on init failure */
/* list of command callbacks, with one command registered by default */
static struct cmd_callback callbacks[TELEMETRY_MAX_CALLBACKS];
return 0;
}
+static int
+list_commands(const char *cmd __rte_unused, const char *params __rte_unused,
+ struct rte_tel_data *d)
+{
+ int i;
+
+ rte_tel_data_start_array(d, RTE_TEL_STRING_VAL);
+ for (i = 0; i < num_callbacks; i++)
+ rte_tel_data_add_array_string(d, callbacks[i].cmd);
+ return 0;
+}
+
+static int
+json_info(const char *cmd __rte_unused, const char *params __rte_unused,
+ struct rte_tel_data *d)
+{
+ rte_tel_data_start_dict(d);
+ rte_tel_data_add_dict_string(d, "version", rte_version());
+ rte_tel_data_add_dict_int(d, "pid", getpid());
+ rte_tel_data_add_dict_int(d, "max_output_len", MAX_OUTPUT_LEN);
+ return 0;
+}
+
+static int
+command_help(const char *cmd __rte_unused, const char *params,
+ struct rte_tel_data *d)
+{
+ int i;
+
+ if (!params)
+ return -1;
+ rte_tel_data_start_dict(d);
+ rte_spinlock_lock(&callback_sl);
+ for (i = 0; i < num_callbacks; i++)
+ if (strcmp(params, callbacks[i].cmd) == 0) {
+ rte_tel_data_add_dict_string(d, params,
+ callbacks[i].help);
+ break;
+ }
+ rte_spinlock_unlock(&callback_sl);
+ if (i == num_callbacks)
+ return -1;
+ return 0;
+}
+
static void
output_json(const char *cmd, const struct rte_tel_data *d, int s)
{
int s_accepted = accept(s->sock, NULL, NULL);
if (s_accepted < 0) {
snprintf(telemetry_log_error,
- sizeof(telemetry_log_error),
- "Error with accept, telemetry thread quitting\n");
+ sizeof(telemetry_log_error),
+ "Error with accept, telemetry thread quitting");
return NULL;
}
pthread_create(&th, NULL, s->fn, (void *)(uintptr_t)s_accepted);
{
if (v2_socket.path[0])
unlink(v2_socket.path);
+ if (v1_socket.path[0])
+ unlink(v1_socket.path);
}
static int
}
static int
-telemetry_v2_init(const char *runtime_dir)
+telemetry_legacy_init(const char *runtime_dir, rte_cpuset_t *cpuset)
+{
+ pthread_t t_old;
+
+ if (num_legacy_callbacks == 1) {
+ snprintf(telemetry_log_error, sizeof(telemetry_log_error),
+ "No legacy callbacks, legacy socket not created");
+ return -1;
+ }
+
+ v1_socket.fn = legacy_client_handler;
+ if ((size_t) snprintf(v1_socket.path, sizeof(v1_socket.path),
+ "%s/telemetry", runtime_dir)
+ >= sizeof(v1_socket.path)) {
+ snprintf(telemetry_log_error, sizeof(telemetry_log_error),
+ "Error with socket binding, path too long");
+ return -1;
+ }
+ v1_socket.sock = create_socket(v1_socket.path);
+ if (v1_socket.sock < 0)
+ return -1;
+ pthread_create(&t_old, NULL, socket_listener, &v1_socket);
+ pthread_setaffinity_np(t_old, sizeof(*cpuset), cpuset);
+
+ return 0;
+}
+
+static int
+telemetry_v2_init(const char *runtime_dir, rte_cpuset_t *cpuset)
{
pthread_t t_new;
+ rte_telemetry_register_cmd("/", list_commands,
+ "Returns list of available commands, Takes no parameters");
+ rte_telemetry_register_cmd("/info", json_info,
+ "Returns DPDK Telemetry information. Takes no parameters");
+ rte_telemetry_register_cmd("/help", command_help,
+ "Returns help text for a command. Parameters: string command");
v2_socket.fn = client_handler;
if (strlcpy(v2_socket.path, get_socket_path(runtime_dir, 2),
sizeof(v2_socket.path)) >= sizeof(v2_socket.path)) {
if (v2_socket.sock < 0)
return -1;
pthread_create(&t_new, NULL, socket_listener, &v2_socket);
+ pthread_setaffinity_np(t_new, sizeof(*cpuset), cpuset);
atexit(unlink_sockets);
return 0;
}
int32_t
-rte_telemetry_new_init(void)
+rte_telemetry_init(const char *runtime_dir, rte_cpuset_t *cpuset,
+ const char **err_str)
{
- const char *error_str;
- if (telemetry_v2_init(rte_eal_get_runtime_dir()) != 0) {
- error_str = telemetry_log_error;
- printf("Error initialising telemetry - %s", error_str);
+ if (telemetry_v2_init(runtime_dir, cpuset) != 0) {
+ *err_str = telemetry_log_error;
+ printf("Error initialising telemetry - %s\n", *err_str);
return -1;
}
+ if (telemetry_legacy_init(runtime_dir, cpuset) != 0) {
+ *err_str = telemetry_log_error;
+ printf("No telemetry legacy support - %s\n", *err_str);
+ }
return 0;
}