X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fdpdkstat.c;h=3e0ea046a083c8ddd94c34472b8f1dad8170da9c;hb=acbf4e5d5b848540c6fc0d9bfb235f6441564384;hp=27e2d39770785b15723cd9d6d51d841b894f5440;hpb=8a7ec0cfb7aaab52e53fbb21cdc887cee4cccd6d;p=collectd.git diff --git a/src/dpdkstat.c b/src/dpdkstat.c index 27e2d397..3e0ea046 100644 --- a/src/dpdkstat.c +++ b/src/dpdkstat.c @@ -32,26 +32,11 @@ #include "plugin.h" /* plugin_register_*, plugin_dispatch_values */ #include "utils_time.h" -#include -#include -#include -#include -#include -#include -#include #include -#include -#include #include #include #include -#include -#include -#include -#include #include -#include -#include #include #include @@ -71,8 +56,6 @@ #include #include - -#define DATA_MAX_NAME_LEN 64 #define DPDKSTAT_MAX_BUFFER_SIZE (4096*4) #define DPDK_SHM_NAME "dpdk_collectd_stats_shm" #define REINIT_SHM 1 @@ -102,6 +85,7 @@ struct dpdk_config_s { cdtime_t interval; uint32_t eal_initialized; uint32_t enabled_port_mask; + char port_name[RTE_MAX_ETHPORTS][DATA_MAX_NAME_LEN]; uint32_t eal_argc; /* Helper info */ int collectd_reinit_shm; @@ -122,51 +106,54 @@ struct dpdk_config_s { }; typedef struct dpdk_config_s dpdk_config_t; -static int g_configured = 0; -static dpdk_config_t *g_configuration = 0; +static int g_configured; +static dpdk_config_t *g_configuration; -static int dpdk_config_init_default(void); +static void dpdk_config_init_default(void); static int dpdk_config(oconfig_item_t *ci); static int dpdk_helper_init_eal(void); static int dpdk_helper_run(void); static int dpdk_helper_spawn(enum DPDK_HELPER_ACTION action); -static int dpdk_init (void); +static int dpdk_init(void); static int dpdk_read(user_data_t *ud); static int dpdk_shm_cleanup(void); static int dpdk_shm_init(size_t size); -void module_register(void); /* Write the default configuration to the g_configuration instances */ -static int dpdk_config_init_default(void) +static void dpdk_config_init_default(void) { g_configuration->interval = plugin_get_interval(); WARNING("dpdkstat: No time interval was configured, default value %lu ms is set\n", CDTIME_T_TO_MS(g_configuration->interval)); - g_configuration->enabled_port_mask = 0; + /* Default is all ports enabled */ + g_configuration->enabled_port_mask = ~0; g_configuration->eal_argc = 2; g_configuration->eal_initialized = 0; - snprintf(g_configuration->coremask, DATA_MAX_NAME_LEN, "%s", "0xf"); - snprintf(g_configuration->memory_channels, DATA_MAX_NAME_LEN, "%s", "1"); - snprintf(g_configuration->process_type, DATA_MAX_NAME_LEN, "%s", "secondary"); - snprintf(g_configuration->file_prefix, DATA_MAX_NAME_LEN, "%s", + ssnprintf(g_configuration->coremask, DATA_MAX_NAME_LEN, "%s", "0xf"); + ssnprintf(g_configuration->memory_channels, DATA_MAX_NAME_LEN, "%s", "1"); + ssnprintf(g_configuration->process_type, DATA_MAX_NAME_LEN, "%s", "secondary"); + ssnprintf(g_configuration->file_prefix, DATA_MAX_NAME_LEN, "%s", "/var/run/.rte_config"); - return 0; + + for (int i = 0; i < RTE_MAX_ETHPORTS; i++) + g_configuration->port_name[i][0] = 0; } static int dpdk_config(oconfig_item_t *ci) { - int i = 0, ret = 0; + int port_counter = 0; /* Initialize a POSIX SHared Memory (SHM) object. */ - dpdk_shm_init(sizeof(dpdk_config_t)); - - /* Set defaults for config, overwritten by loop if config item exists */ - ret = dpdk_config_init_default(); - if(ret != 0) { + int err = dpdk_shm_init(sizeof(dpdk_config_t)); + if (err) { + DEBUG("dpdkstat: error in shm_init, %s", strerror(errno)); return -1; } - for (i = 0; i < ci->children_num; i++) { + /* Set defaults for config, overwritten by loop if config item exists */ + dpdk_config_init_default(); + + for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp("Interval", child->key) == 0) { @@ -175,37 +162,46 @@ static int dpdk_config(oconfig_item_t *ci) DEBUG("dpdkstat: Plugin Read Interval %lu milliseconds\n", CDTIME_T_TO_MS(g_configuration->interval)); } else if (strcasecmp("Coremask", child->key) == 0) { - snprintf(g_configuration->coremask, DATA_MAX_NAME_LEN, "%s", + ssnprintf(g_configuration->coremask, DATA_MAX_NAME_LEN, "%s", child->values[0].value.string); DEBUG("dpdkstat:COREMASK %s \n", g_configuration->coremask); g_configuration->eal_argc+=1; } else if (strcasecmp("MemoryChannels", child->key) == 0) { - snprintf(g_configuration->memory_channels, DATA_MAX_NAME_LEN, "%s", + ssnprintf(g_configuration->memory_channels, DATA_MAX_NAME_LEN, "%s", child->values[0].value.string); DEBUG("dpdkstat:Memory Channels %s \n", g_configuration->memory_channels); g_configuration->eal_argc+=1; } else if (strcasecmp("SocketMemory", child->key) == 0) { - snprintf(g_configuration->socket_memory, DATA_MAX_NAME_LEN, "%s", + ssnprintf(g_configuration->socket_memory, DATA_MAX_NAME_LEN, "%s", child->values[0].value.string); DEBUG("dpdkstat: socket mem %s \n", g_configuration->socket_memory); g_configuration->eal_argc+=1; } else if (strcasecmp("ProcessType", child->key) == 0) { - snprintf(g_configuration->process_type, DATA_MAX_NAME_LEN, "%s", + ssnprintf(g_configuration->process_type, DATA_MAX_NAME_LEN, "%s", child->values[0].value.string); DEBUG("dpdkstat: proc type %s \n", g_configuration->process_type); g_configuration->eal_argc+=1; } else if (strcasecmp("FilePrefix", child->key) == 0) { - snprintf(g_configuration->file_prefix, DATA_MAX_NAME_LEN, "/var/run/.%s_config", + ssnprintf(g_configuration->file_prefix, DATA_MAX_NAME_LEN, "/var/run/.%s_config", child->values[0].value.string); DEBUG("dpdkstat: file prefix %s \n", g_configuration->file_prefix); if (strcasecmp(g_configuration->file_prefix, "/var/run/.rte_config") != 0) { g_configuration->eal_argc+=1; } + } else if (strcasecmp("EnabledPortMask", child->key) == 0) { + g_configuration->enabled_port_mask = (uint32_t)child->values[0].value.number; + DEBUG("dpdkstat: Enabled Port Mask %u\n", g_configuration->enabled_port_mask); + } else if (strcasecmp("PortName", child->key) == 0) { + ssnprintf(g_configuration->port_name[port_counter], DATA_MAX_NAME_LEN, "%s", + child->values[0].value.string); + DEBUG("dpdkstat: Port %d Name: %s \n", port_counter, + g_configuration->port_name[port_counter]); + port_counter++; } else { WARNING ("dpdkstat: The config option \"%s\" is unknown.", child->key); } - } /* End for (i = 0; i < ci->children_num; i++)*/ + } /* End for (int i = 0; i < ci->children_num; i++)*/ g_configured = 1; /* Bypass configuration in dpdk_shm_init(). */ return 0; @@ -236,8 +232,7 @@ static int dpdk_shm_init(size_t size) goto fail_close; } /* Map the shared memory object into this process' virtual address space. */ - g_configuration = (dpdk_config_t *) - mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + g_configuration = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (g_configuration == MAP_FAILED) { WARNING("dpdkstat:Failed to mmap SHM:%s\n", strerror(errno)); goto fail_close; @@ -252,8 +247,17 @@ static int dpdk_shm_init(size_t size) memset(g_configuration, 0, size); /* Initialize the semaphores for SHM use */ - sem_init(&g_configuration->sema_helper_get_stats, 1, 0); - sem_init(&g_configuration->sema_stats_in_shm, 1, 0); + int err = sem_init(&g_configuration->sema_helper_get_stats, 1, 0); + if(err) { + ERROR("dpdkstat semaphore init failed: %s\n", strerror(errno)); + goto fail_close; + } + err = sem_init(&g_configuration->sema_stats_in_shm, 1, 0); + if(err) { + ERROR("dpdkstat semaphore init failed: %s\n", strerror(errno)); + goto fail_close; + } + return 0; fail_close: @@ -269,7 +273,7 @@ fail: static int dpdk_re_init_shm() { dpdk_config_t temp_config; - memcpy(&temp_config,g_configuration, sizeof(dpdk_config_t)); + memcpy(&temp_config, g_configuration, sizeof(dpdk_config_t)); DEBUG("dpdkstat: %s: ports %d, xstats %d\n", __func__, temp_config.num_ports, temp_config.num_xstats); @@ -289,7 +293,7 @@ static int dpdk_re_init_shm() if(!g_configured) dpdk_config_init_default(); - memcpy(g_configuration,&temp_config, sizeof(dpdk_config_t)); + memcpy(g_configuration, &temp_config, sizeof(dpdk_config_t)); g_configuration->collectd_reinit_shm = 0; return 0; @@ -297,17 +301,13 @@ static int dpdk_re_init_shm() static int dpdk_init (void) { - int ret = 0; int err = dpdk_shm_init(sizeof(dpdk_config_t)); if (err) ERROR("dpdkstat: %s : error %d in shm_init()", __func__, err); /* If the XML config() function has been run, dont re-initialize defaults */ if(!g_configured) { - ret = dpdk_config_init_default(); - if (ret != 0) { - return -1; - } + dpdk_config_init_default(); } plugin_register_complex_read (NULL, "dpdkstat", dpdk_read, @@ -318,17 +318,20 @@ static int dpdk_init (void) static int dpdk_helper_exit(int reset) { g_configuration->helper_status = DPDK_HELPER_GRACEFUL_QUIT; - if(reset) { + if (reset) { g_configuration->eal_initialized = 0; g_configuration->num_ports = 0; memset(&g_configuration->xstats, 0, g_configuration->num_xstats* sizeof(struct rte_eth_xstats)); g_configuration->num_xstats = 0; - int i =0; - for(;i < RTE_MAX_ETHPORTS; i++) + for (int i = 0; i < RTE_MAX_ETHPORTS; i++) g_configuration->num_stats_in_port[i] = 0; } close(g_configuration->helper_pipes[1]); - kill(g_configuration->helper_pid, SIGKILL); + int err = kill(g_configuration->helper_pid, SIGKILL); + if (err) { + ERROR("dpdkstat: error sending kill to helper: %s\n", strerror(errno)); + } + return 0; } @@ -340,7 +343,7 @@ static int dpdk_helper_spawn(enum DPDK_HELPER_ACTION action) * Create a pipe for helper stdout back to collectd. This is necessary for * logging EAL failures, as rte_eal_init() calls rte_panic(). */ - if(g_configuration->helper_pipes[1]) { + if (g_configuration->helper_pipes[1]) { DEBUG("dpdkstat: collectd closing helper pipe %d\n", g_configuration->helper_pipes[1]); } else { @@ -352,10 +355,18 @@ static int dpdk_helper_spawn(enum DPDK_HELPER_ACTION action) return -1; } - int pipe0_flags = fcntl(g_configuration->helper_pipes[1], F_GETFL, 0); - int pipe1_flags = fcntl(g_configuration->helper_pipes[0], F_GETFL, 0); - fcntl(g_configuration->helper_pipes[1], F_SETFL, pipe1_flags | O_NONBLOCK); - fcntl(g_configuration->helper_pipes[0], F_SETFL, pipe0_flags | O_NONBLOCK); + int pipe0_flags = fcntl(g_configuration->helper_pipes[0], F_GETFL, 0); + int pipe1_flags = fcntl(g_configuration->helper_pipes[1], F_GETFL, 0); + if (pipe0_flags == -1 || pipe1_flags == -1) { + ERROR("dpdkstat: error setting up pipe flags: %s\n", strerror(errno)); + } + int pipe0_err = fcntl(g_configuration->helper_pipes[0], F_SETFL, pipe1_flags + | O_NONBLOCK); + int pipe1_err = fcntl(g_configuration->helper_pipes[1], F_SETFL, pipe0_flags + | O_NONBLOCK); + if (pipe0_err == -1 || pipe1_err == -1) { + ERROR("dpdkstat: error setting up pipes: %s\n", strerror(errno)); + } pid_t pid = fork(); if (pid > 0) { @@ -388,24 +399,24 @@ static int dpdk_helper_init_eal(void) int i = 0; argp[i++] = "collectd-dpdk"; - if(strcasecmp(g_configuration->coremask, "") != 0) { + if (strcasecmp(g_configuration->coremask, "") != 0) { argp[i++] = "-c"; argp[i++] = g_configuration->coremask; } - if(strcasecmp(g_configuration->memory_channels, "") != 0) { + if (strcasecmp(g_configuration->memory_channels, "") != 0) { argp[i++] = "-n"; argp[i++] = g_configuration->memory_channels; } - if(strcasecmp(g_configuration->socket_memory, "") != 0) { + if (strcasecmp(g_configuration->socket_memory, "") != 0) { argp[i++] = "--socket-mem"; argp[i++] = g_configuration->socket_memory; } - if(strcasecmp(g_configuration->file_prefix, "") != 0 && + if (strcasecmp(g_configuration->file_prefix, "") != 0 && strcasecmp(g_configuration->file_prefix, "/var/run/.rte_config") != 0) { argp[i++] = "--file-prefix"; argp[i++] = g_configuration->file_prefix; } - if(strcasecmp(g_configuration->process_type, "") != 0) { + if (strcasecmp(g_configuration->process_type, "") != 0) { argp[i++] = "--proc-type"; argp[i++] = g_configuration->process_type; } @@ -417,11 +428,11 @@ static int dpdk_helper_init_eal(void) g_configuration->eal_initialized = 0; printf("dpdkstat: ERROR initializing EAL ret = %d\n", ret); printf("dpdkstat: EAL arguments: "); - for (i=0; i< g_configuration->eal_argc; i++) { + for (i = 0; i < g_configuration->eal_argc; i++) { printf("%s ", argp[i]); } printf("\n"); - return -1; + return ret; } return 0; } @@ -431,7 +442,7 @@ static int dpdk_helper_run (void) pid_t ppid = getppid(); g_configuration->helper_status = DPDK_HELPER_WAITING_ON_PRIMARY; - while(1) { + while (1) { /* sem_timedwait() to avoid blocking forever */ struct timespec ts; cdtime_t now = cdtime(); @@ -439,12 +450,11 @@ static int dpdk_helper_run (void) CDTIME_T_TO_TIMESPEC(now + half_sec + g_configuration->interval *2, &ts); int ret = sem_timedwait(&g_configuration->sema_helper_get_stats, &ts); - if(ret == -1 && errno == ETIMEDOUT) { + if (ret == -1 && errno == ETIMEDOUT) { ERROR("dpdkstat-helper: sem timedwait()" " timeout, did collectd terminate?\n"); dpdk_helper_exit(RESET); } - /* Parent PID change means collectd died so quit the helper process. */ if (ppid != getppid()) { WARNING("dpdkstat-helper: parent PID changed, quitting.\n"); @@ -463,17 +473,18 @@ static int dpdk_helper_run (void) continue; } - if(!g_configuration->eal_initialized) { + if (!g_configuration->eal_initialized) { /* Initialize EAL. */ int ret = dpdk_helper_init_eal(); - if(ret != 0) + if(ret != 0) { + WARNING("ERROR INITIALIZING EAL\n"); dpdk_helper_exit(RESET); + } } g_configuration->helper_status = DPDK_HELPER_ALIVE_SENDING_STATS; - uint8_t nb_ports; - nb_ports = rte_eth_dev_count(); + uint8_t nb_ports = rte_eth_dev_count(); if (nb_ports == 0) { DEBUG("dpdkstat-helper: No DPDK ports available. " "Check bound devices to DPDK driver.\n"); @@ -482,12 +493,9 @@ static int dpdk_helper_run (void) if (nb_ports > RTE_MAX_ETHPORTS) nb_ports = RTE_MAX_ETHPORTS; - /* If no port mask was specified enable all ports*/ - if (g_configuration->enabled_port_mask == 0) - g_configuration->enabled_port_mask = 0xffff; - int i, len = 0, enabled_port_count = 0, num_xstats = 0; - for (i = 0; i < nb_ports; i++) { + int len = 0, enabled_port_count = 0, num_xstats = 0; + for (uint8_t i = 0; i < nb_ports; i++) { if (g_configuration->enabled_port_mask & (1 << i)) { if(g_configuration->helper_action == DPDK_HELPER_ACTION_COUNT_STATS) { len = rte_eth_xstats_get(i, NULL, 0); @@ -503,18 +511,19 @@ static int dpdk_helper_run (void) len = g_configuration->num_stats_in_port[enabled_port_count]; g_configuration->port_read_time[enabled_port_count] = cdtime(); ret = rte_eth_xstats_get(i, &g_configuration->xstats + num_xstats, - g_configuration->num_stats_in_port[i]); + g_configuration->num_stats_in_port[enabled_port_count]); if (ret < 0 || ret != len) { DEBUG("dpdkstat-helper: Error reading xstats on port %d len = %d\n", i, len); return -1; } - num_xstats += g_configuration->num_stats_in_port[i]; + num_xstats += g_configuration->num_stats_in_port[enabled_port_count]; + enabled_port_count++; } } /* if (enabled_port_mask) */ } /* for (nb_ports) */ - if(g_configuration->helper_action == DPDK_HELPER_ACTION_COUNT_STATS) { + if (g_configuration->helper_action == DPDK_HELPER_ACTION_COUNT_STATS) { g_configuration->num_ports = enabled_port_count; g_configuration->num_xstats = num_xstats; DEBUG("dpdkstat-helper ports: %d, num stats: %d\n", @@ -524,7 +533,9 @@ static int dpdk_helper_run (void) dpdk_helper_exit(NO_RESET); } /* Now kick collectd send thread to send the stats */ - sem_post(&g_configuration->sema_stats_in_shm); + int err = sem_post(&g_configuration->sema_stats_in_shm); + if (err) + ERROR("dpdkstat: error posting semaphore to helper %s\n", strerror(errno)); } /* while(1) */ return 0; @@ -538,7 +549,7 @@ static int dpdk_read (user_data_t *ud) * Check if SHM flag is set to be re-initialized. AKA DPDK ports have been * counted, so re-init SHM to be large enough to fit all the statistics. */ - if(g_configuration->collectd_reinit_shm) { + if (g_configuration->collectd_reinit_shm) { DEBUG("dpdkstat: read() now reinit SHM then launching send-thread\n"); dpdk_re_init_shm(); } @@ -548,13 +559,17 @@ static int dpdk_read (user_data_t *ud) * must be done in dpdk_read(), because the DPDK primary process may not be * alive at dpdk_init() time. */ - if(g_configuration->helper_status == DPDK_HELPER_NOT_INITIALIZED || + if (g_configuration->helper_status == DPDK_HELPER_NOT_INITIALIZED || g_configuration->helper_status == DPDK_HELPER_GRACEFUL_QUIT) { int action = DPDK_HELPER_ACTION_SEND_STATS; if(g_configuration->num_xstats == 0) action = DPDK_HELPER_ACTION_COUNT_STATS; /* Spawn the helper thread to count stats or to read stats. */ - dpdk_helper_spawn(action); + int err = dpdk_helper_spawn(action); + if (err) { + ERROR("dpdkstat: error spawning helper %s\n", strerror(errno)); + return -1; + } } int exit_status; @@ -564,7 +579,7 @@ static int dpdk_read (user_data_t *ud) * waitpid() fails, helper process died (or quit), so respawn */ int respawn_helper = 0; - if(ws != 0) { + if (ws != 0) { respawn_helper = 1; } @@ -576,15 +591,15 @@ static int dpdk_read (user_data_t *ud) fds.fd = g_configuration->helper_pipes[0]; fds.events = POLLIN; int data_avail = poll(&fds, 1, 0); - while(data_avail) { + while (data_avail) { int nbytes = read(g_configuration->helper_pipes[0], buf, sizeof(buf)); - if(nbytes <= 0) + if (nbytes <= 0) break; - snprintf( out, nbytes, "%s", buf); + ssnprintf( out, nbytes, "%s", buf); DEBUG("dpdkstat: helper-proc: %s\n", out); } - if(respawn_helper) { + if (respawn_helper) { if (g_configuration->helper_pid) dpdk_helper_exit(RESET); dpdk_helper_spawn(DPDK_HELPER_ACTION_COUNT_STATS); @@ -599,41 +614,122 @@ static int dpdk_read (user_data_t *ud) cdtime_t now = cdtime(); CDTIME_T_TO_TIMESPEC(now + g_configuration->interval, &ts); ret = sem_timedwait(&g_configuration->sema_stats_in_shm, &ts); - if(ret == -1 && errno == ETIMEDOUT) { + if (ret == -1 && errno == ETIMEDOUT) { DEBUG("dpdkstat: timeout in collectd thread: is a DPDK Primary running? \n"); return 0; } /* Dispatch the stats.*/ - int i, j, count = 0; - - for (i = 0; i < g_configuration->num_ports; i++) { - cdtime_t time = g_configuration->port_read_time[i]; - char dev_name[64]; - int len = g_configuration->num_stats_in_port[i]; - snprintf(dev_name, sizeof(dev_name), "port.%d", i); - struct rte_eth_xstats *xstats = (&g_configuration->xstats); - xstats += count; /* pointer arithmetic to jump to each stats struct */ - for (j = 0; j < len; j++) { - value_t dpdkstat_values[1]; - value_list_t dpdkstat_vl = VALUE_LIST_INIT; - - dpdkstat_values[0].counter = xstats[j].value; - dpdkstat_vl.values = dpdkstat_values; - dpdkstat_vl.values_len = 1; /* Submit stats one at a time */ - dpdkstat_vl.time = time; - sstrncpy (dpdkstat_vl.host, hostname_g, sizeof (dpdkstat_vl.host)); - sstrncpy (dpdkstat_vl.plugin, "dpdkstat", sizeof (dpdkstat_vl.plugin)); - sstrncpy (dpdkstat_vl.plugin_instance, dev_name, - sizeof (dpdkstat_vl.plugin_instance)); - sstrncpy (dpdkstat_vl.type, "counter", - sizeof (dpdkstat_vl.type)); - sstrncpy (dpdkstat_vl.type_instance, xstats[j].name, - sizeof (dpdkstat_vl.type_instance)); - plugin_dispatch_values (&dpdkstat_vl); + int count = 0, port_num = 0; + + for (uint32_t i = 0; i < g_configuration->num_ports; i++) { + cdtime_t time = g_configuration->port_read_time[i]; + char dev_name[64]; + int len = g_configuration->num_stats_in_port[i]; + + while(!(g_configuration->enabled_port_mask & (1 << port_num))) + port_num++; + + if (g_configuration->port_name[i][0] != 0) + ssnprintf(dev_name, sizeof(dev_name), "%s", g_configuration->port_name[i]); + else + ssnprintf(dev_name, sizeof(dev_name), "port.%d", port_num); + struct rte_eth_xstats *xstats = (&g_configuration->xstats); + xstats += count; /* pointer arithmetic to jump to each stats struct */ + for (int j = 0; j < len; j++) { + value_t dpdkstat_values[1]; + value_list_t dpdkstat_vl = VALUE_LIST_INIT; + char *type_end; + + dpdkstat_values[0].derive = (derive_t) xstats[j].value; + dpdkstat_vl.values = dpdkstat_values; + dpdkstat_vl.values_len = 1; /* Submit stats one at a time */ + dpdkstat_vl.time = time; + sstrncpy (dpdkstat_vl.host, hostname_g, sizeof (dpdkstat_vl.host)); + sstrncpy (dpdkstat_vl.plugin, "dpdkstat", sizeof (dpdkstat_vl.plugin)); + sstrncpy (dpdkstat_vl.plugin_instance, dev_name, + sizeof (dpdkstat_vl.plugin_instance)); + + type_end = strrchr(xstats[j].name, '_'); + + if ((type_end != NULL) && + (strncmp(xstats[j].name, "rx_", strlen("rx_")) == 0)) { + if (strncmp(type_end, "_errors", strlen("_errors")) == 0) { + sstrncpy (dpdkstat_vl.type, "if_rx_errors", + sizeof(dpdkstat_vl.type)); + } else if (strncmp(type_end, "_dropped", strlen("_dropped")) == 0) { + sstrncpy (dpdkstat_vl.type, "if_rx_dropped", + sizeof(dpdkstat_vl.type)); + } else if (strncmp(type_end, "_bytes", strlen("_bytes")) == 0) { + sstrncpy (dpdkstat_vl.type, "if_rx_octets", + sizeof(dpdkstat_vl.type)); + } else if (strncmp(type_end, "_packets", strlen("_packets")) == 0) { + sstrncpy (dpdkstat_vl.type, "if_rx_packets", + sizeof(dpdkstat_vl.type)); + } else if (strncmp(type_end, "_placement", strlen("_placement")) == 0) { + sstrncpy (dpdkstat_vl.type, "if_rx_errors", + sizeof(dpdkstat_vl.type)); + } else if (strncmp(type_end, "_buff", strlen("_buff")) == 0) { + sstrncpy (dpdkstat_vl.type, "if_rx_errors", + sizeof(dpdkstat_vl.type)); + } else { + /* Does not fit obvious type: use a more generic one */ + sstrncpy (dpdkstat_vl.type, "derive", + sizeof(dpdkstat_vl.type)); + } + + } else if ((type_end != NULL) && + (strncmp(xstats[j].name, "tx_", strlen("tx_"))) == 0) { + if (strncmp(type_end, "_errors", strlen("_errors")) == 0) { + sstrncpy (dpdkstat_vl.type, "if_tx_errors", + sizeof(dpdkstat_vl.type)); + } else if (strncmp(type_end, "_dropped", strlen("_dropped")) == 0) { + sstrncpy (dpdkstat_vl.type, "if_tx_dropped", + sizeof(dpdkstat_vl.type)); + } else if (strncmp(type_end, "_bytes", strlen("_bytes")) == 0) { + sstrncpy (dpdkstat_vl.type, "if_tx_octets", + sizeof(dpdkstat_vl.type)); + } else if (strncmp(type_end, "_packets", strlen("_packets")) == 0) { + sstrncpy (dpdkstat_vl.type, "if_tx_packets", + sizeof(dpdkstat_vl.type)); + } else { + /* Does not fit obvious type: use a more generic one */ + sstrncpy (dpdkstat_vl.type, "derive", + sizeof(dpdkstat_vl.type)); + } + } else if ((type_end != NULL) && + (strncmp(xstats[j].name, "flow_", strlen("flow_"))) == 0) { + + if (strncmp(type_end, "_filters", strlen("_filters")) == 0) { + sstrncpy (dpdkstat_vl.type, "operations", + sizeof(dpdkstat_vl.type)); + } else if (strncmp(type_end, "_errors", strlen("_errors")) == 0) { + sstrncpy (dpdkstat_vl.type, "errors", + sizeof(dpdkstat_vl.type)); + } else if (strncmp(type_end, "_filters", strlen("_filters")) == 0) { + sstrncpy (dpdkstat_vl.type, "filter_result", + sizeof(dpdkstat_vl.type)); + } + } else if ((type_end != NULL) && + (strncmp(xstats[j].name, "mac_", strlen("mac_"))) == 0) { + if (strncmp(type_end, "_errors", strlen("_errors")) == 0) { + sstrncpy (dpdkstat_vl.type, "errors", + sizeof(dpdkstat_vl.type)); + } + } else { + /* Does not fit obvious type, or strrchr error: + * use a more generic type */ + sstrncpy (dpdkstat_vl.type, "derive", + sizeof(dpdkstat_vl.type)); } - count += len; - } /* for each port */ + + sstrncpy (dpdkstat_vl.type_instance, xstats[j].name, + sizeof (dpdkstat_vl.type_instance)); + plugin_dispatch_values (&dpdkstat_vl); + } + count += len; + port_num++; + } /* for each port */ return 0; } @@ -641,12 +737,12 @@ static int dpdk_shm_cleanup(void) { int ret = munmap(g_configuration, sizeof(dpdk_config_t)); g_configuration = 0; - if(ret) { + if (ret) { WARNING("dpdkstat: munmap returned %d\n", ret); return ret; } ret = shm_unlink(DPDK_SHM_NAME); - if(ret) { + if (ret) { WARNING("dpdkstat: shm_unlink returned %d\n", ret); return ret; } @@ -655,9 +751,18 @@ static int dpdk_shm_cleanup(void) static int dpdk_shutdown (void) { + int ret = 0; close(g_configuration->helper_pipes[1]); - kill(g_configuration->helper_pid, SIGKILL); - int ret = dpdk_shm_cleanup(); + int err = kill(g_configuration->helper_pid, SIGKILL); + if (err) { + ERROR("dpdkstat: error sending sigkill to helper %s\n", strerror(errno)); + ret = -1; + } + err = dpdk_shm_cleanup(); + if (err) { + ERROR("dpdkstat: error cleaning up SHM: %s\n", strerror(errno)); + ret = -1; + } return ret; }