- 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));