struct bridge_list_s *next; /* Next bridge*/
} bridge_list_t;
+#define cnt_str(x) [x] = #x
+
static const char *const iface_counter_table[IFACE_COUNTER_COUNT] = {
- [collisions] = "collisions",
- [rx_bytes] = "rx_bytes",
- [rx_crc_err] = "rx_crc_err",
- [rx_dropped] = "rx_dropped",
- [rx_errors] = "rx_errors",
- [rx_frame_err] = "rx_frame_err",
- [rx_over_err] = "rx_over_err",
- [rx_packets] = "rx_packets",
- [tx_bytes] = "tx_bytes",
- [tx_dropped] = "tx_dropped",
- [tx_errors] = "tx_errors",
- [tx_packets] = "tx_packets",
- [rx_1_to_64_packets] = "rx_1_to_64_packets",
- [rx_65_to_127_packets] = "rx_65_to_127_packets",
- [rx_128_to_255_packets] = "rx_128_to_255_packets",
- [rx_256_to_511_packets] = "rx_256_to_511_packets",
- [rx_512_to_1023_packets] = "rx_512_to_1023_packets",
- [rx_1024_to_1522_packets] = "rx_1024_to_1518_packets",
- [rx_1523_to_max_packets] = "rx_1523_to_max_packets",
- [tx_1_to_64_packets] = "tx_1_to_64_packets",
- [tx_65_to_127_packets] = "tx_65_to_127_packets",
- [tx_128_to_255_packets] = "tx_128_to_255_packets",
- [tx_256_to_511_packets] = "tx_256_to_511_packets",
- [tx_512_to_1023_packets] = "tx_512_to_1023_packets",
- [tx_1024_to_1522_packets] = "tx_1024_to_1518_packets",
- [tx_1523_to_max_packets] = "tx_1523_to_max_packets",
- [tx_multicast_packets] = "tx_multicast_packets",
- [rx_broadcast_packets] = "rx_broadcast_packets",
- [tx_broadcast_packets] = "tx_broadcast_packets",
- [rx_undersized_errors] = "rx_undersized_errors",
- [rx_oversize_errors] = "rx_oversize_errors",
- [rx_fragmented_errors] = "rx_fragmented_errors",
- [rx_jabber_errors] = "rx_jabber_errors",
+ cnt_str(collisions),
+ cnt_str(rx_bytes),
+ cnt_str(rx_crc_err),
+ cnt_str(rx_dropped),
+ cnt_str(rx_errors),
+ cnt_str(rx_frame_err),
+ cnt_str(rx_over_err),
+ cnt_str(rx_packets),
+ cnt_str(tx_bytes),
+ cnt_str(tx_dropped),
+ cnt_str(tx_errors),
+ cnt_str(tx_packets),
+ cnt_str(rx_1_to_64_packets),
+ cnt_str(rx_65_to_127_packets),
+ cnt_str(rx_128_to_255_packets),
+ cnt_str(rx_256_to_511_packets),
+ cnt_str(rx_512_to_1023_packets),
+ cnt_str(rx_1024_to_1522_packets),
+ cnt_str(rx_1523_to_max_packets),
+ cnt_str(tx_1_to_64_packets),
+ cnt_str(tx_65_to_127_packets),
+ cnt_str(tx_128_to_255_packets),
+ cnt_str(tx_256_to_511_packets),
+ cnt_str(tx_512_to_1023_packets),
+ cnt_str(tx_1024_to_1522_packets),
+ cnt_str(tx_1523_to_max_packets),
+ cnt_str(tx_multicast_packets),
+ cnt_str(rx_broadcast_packets),
+ cnt_str(tx_broadcast_packets),
+ cnt_str(rx_undersized_errors),
+ cnt_str(rx_oversize_errors),
+ cnt_str(rx_fragmented_errors),
+ cnt_str(rx_jabber_errors),
};
+#undef cnt_str
+
/* Entry into the list of network bridges */
static bridge_list_t *g_bridge_list_head;
/* Create or get port by port uuid */
static port_list_t *ovs_stats_new_port(bridge_list_t *bridge,
const char *uuid) {
+ if (uuid == NULL)
+ return NULL;
+
port_list_t *port = ovs_stats_get_port(uuid);
if (port == NULL) {
br = ovs_stats_get_bridge(g_bridge_list_head, YAJL_GET_STRING(br_name));
pthread_mutex_lock(&g_stats_lock);
if (br == NULL) {
- br = (bridge_list_t *)calloc(1, sizeof(bridge_list_t));
+ br = calloc(1, sizeof(*br));
if (!br) {
pthread_mutex_unlock(&g_stats_lock);
- ERROR("%s: Error allocating memory for bridge", plugin_name);
+ ERROR("%s: calloc(%zu) failed.", plugin_name, sizeof(*br));
return -1;
}
char *tmp = YAJL_GET_STRING(br_name);
if (br->name == NULL) {
sfree(br);
pthread_mutex_unlock(&g_stats_lock);
+ ERROR("%s: strdup failed.", plugin_name);
return -1;
}
br->next = g_bridge_list_head;
yajl_val *array = YAJL_GET_ARRAY(br_ports)->values;
size_t array_len = YAJL_GET_ARRAY(br_ports)->len;
if (array != NULL && array_len > 0 && YAJL_IS_ARRAY(array[1])) {
- yajl_val *ports_arr = YAJL_GET_ARRAY(array[1])->values;
- size_t ports_num = YAJL_GET_ARRAY(array[1])->len;
- for (size_t i = 0; i < ports_num && ports_arr != NULL; i++)
- ovs_stats_new_port(
- br, YAJL_GET_STRING(ports_arr[i]->u.array.values[1]));
+ if (YAJL_GET_ARRAY(array[1]) == NULL)
+ goto failure;
+ else {
+ yajl_val *ports_arr = YAJL_GET_ARRAY(array[1])->values;
+ size_t ports_num = YAJL_GET_ARRAY(array[1])->len;
+ for (size_t i = 0; i < ports_num && ports_arr != NULL; i++) {
+ tmp = YAJL_GET_STRING(ports_arr[i]->u.array.values[1]);
+ if (tmp != NULL)
+ ovs_stats_new_port(br, tmp);
+ else
+ goto failure;
+ }
+ }
}
} else
ovs_stats_new_port(br, YAJL_GET_STRING(br_ports->u.array.values[1]));
}
}
} else {
- ERROR("Incorrect JSON Bridge data");
- return -1;
+ goto failure;
}
+
return 0;
+
+failure:
+ ERROR("Incorrect JSON Bridge data");
+ return -1;
}
/* Handle JSON with Bridge Table change event */
/* Get interface statistic and external_ids */
static int ovs_stats_update_iface(yajl_val iface) {
- yajl_val row;
- port_list_t *port = NULL;
- if (iface && YAJL_IS_OBJECT(iface)) {
- row = ovs_utils_get_value_by_key(iface, "new");
- if (row && YAJL_IS_OBJECT(row)) {
- yajl_val iface_name = ovs_utils_get_value_by_key(row, "name");
- yajl_val iface_stats = ovs_utils_get_value_by_key(row, "statistics");
- yajl_val iface_ext_ids = ovs_utils_get_value_by_key(row, "external_ids");
- yajl_val iface_uuid = ovs_utils_get_value_by_key(row, "_uuid");
- if (iface_name && YAJL_IS_STRING(iface_name)) {
- port = ovs_stats_get_port_by_name(YAJL_GET_STRING(iface_name));
- if (port == NULL)
- return 0;
- }
- /*
- * {
- "statistics": [
- "map",
- [
- [
- "collisions",
- 0
- ],
- . . .
- [
- "tx_packets",
- 0
- ]
- ]
+ if (!iface || !YAJL_IS_OBJECT(iface)) {
+ ERROR("ovs_stats plugin: incorrect JSON port data");
+ return -1;
+ }
+
+ yajl_val row = ovs_utils_get_value_by_key(iface, "new");
+ if (!row || !YAJL_IS_OBJECT(row))
+ return 0;
+
+ yajl_val iface_name = ovs_utils_get_value_by_key(row, "name");
+ if (!iface_name || !YAJL_IS_STRING(iface_name))
+ return 0;
+
+ port_list_t *port = ovs_stats_get_port_by_name(YAJL_GET_STRING(iface_name));
+ if (port == NULL)
+ return 0;
+
+ yajl_val iface_stats = ovs_utils_get_value_by_key(row, "statistics");
+ yajl_val iface_ext_ids = ovs_utils_get_value_by_key(row, "external_ids");
+ yajl_val iface_uuid = ovs_utils_get_value_by_key(row, "_uuid");
+ /*
+ * {
+ "statistics": [
+ "map",
+ [
+ [
+ "collisions",
+ 0
+ ],
+ . . .
+ [
+ "tx_packets",
+ 0
]
- }
- Check that statistics is an array with 2 elements
- */
- if (iface_stats && YAJL_IS_ARRAY(iface_stats) &&
- YAJL_GET_ARRAY(iface_stats)->len == 2)
- ovs_stats_update_iface_stats(port,
- YAJL_GET_ARRAY(iface_stats)->values[1]);
- if (iface_ext_ids && YAJL_IS_ARRAY(iface_ext_ids))
- ovs_stats_update_iface_ext_ids(
- port, YAJL_GET_ARRAY(iface_ext_ids)->values[1]);
- if (iface_uuid && YAJL_IS_ARRAY(iface_uuid) &&
- YAJL_GET_ARRAY(iface_uuid)->len == 2)
- sstrncpy(port->iface_uuid,
- YAJL_GET_STRING(YAJL_GET_ARRAY(iface_uuid)->values[1]),
- sizeof(port->iface_uuid));
- }
- } else {
- ERROR("Incorrect JSON Port data");
+ ]
+ ]
+ }
+ Check that statistics is an array with 2 elements
+ */
+ if (iface_stats && YAJL_IS_ARRAY(iface_stats) &&
+ YAJL_GET_ARRAY(iface_stats)->len == 2)
+ ovs_stats_update_iface_stats(port, YAJL_GET_ARRAY(iface_stats)->values[1]);
+ if (iface_ext_ids && YAJL_IS_ARRAY(iface_ext_ids))
+ ovs_stats_update_iface_ext_ids(port,
+ YAJL_GET_ARRAY(iface_ext_ids)->values[1]);
+ if (iface_uuid && YAJL_IS_ARRAY(iface_uuid) &&
+ YAJL_GET_ARRAY(iface_uuid)->len == 2 &&
+ YAJL_GET_STRING(YAJL_GET_ARRAY(iface_uuid)->values[1]) != NULL)
+ sstrncpy(port->iface_uuid,
+ YAJL_GET_STRING(YAJL_GET_ARRAY(iface_uuid)->values[1]),
+ sizeof(port->iface_uuid));
+ else {
+ ERROR("ovs_stats plugin: incorrect JSON interface data");
return -1;
}
+
return 0;
}
char *br_name_dup = strdup(br_name);
if (br_name_dup == NULL) {
ERROR("%s: strdup() copy bridge name fail", plugin_name);
+ sfree(bridge);
goto cleanup_fail;
}
ovs_stats_submit_two(devname, "if_packets", "512_to_1023_packets",
port->stats[rx_512_to_1023_packets],
port->stats[tx_512_to_1023_packets], meta);
- ovs_stats_submit_two(devname, "if_packets", "1024_to_1518_packets",
+ ovs_stats_submit_two(devname, "if_packets", "1024_to_1522_packets",
port->stats[rx_1024_to_1522_packets],
port->stats[tx_1024_to_1522_packets], meta);
ovs_stats_submit_two(devname, "if_packets", "1523_to_max_packets",
/* Shutdown OvS Stats plugin */
static int ovs_stats_plugin_shutdown(void) {
- pthread_mutex_lock(&g_stats_lock);
DEBUG("OvS Statistics plugin shutting down");
ovs_db_destroy(g_ovs_db);
+ pthread_mutex_lock(&g_stats_lock);
ovs_stats_free_bridge_list(g_bridge_list_head);
ovs_stats_free_bridge_list(g_monitored_bridge_list_head);
ovs_stats_free_port_list(g_port_list_head);