X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fovs_stats.c;h=a629ec6a0860fc6a2a2a412ed1cad38394307419;hb=24b87484c7fd2e0998682db6f77e54d8cdc459d4;hp=e2103744c955ef2f493e03f407dc45c50e214a72;hpb=22813e1a6a3d059efc67975893df985052661a7a;p=collectd.git diff --git a/src/ovs_stats.c b/src/ovs_stats.c index e2103744..a629ec6a 100644 --- a/src/ovs_stats.c +++ b/src/ovs_stats.c @@ -94,42 +94,46 @@ typedef struct bridge_list_s { 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; @@ -244,6 +248,9 @@ static port_list_t *ovs_stats_get_port_by_name(const char *name) { /* 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) { @@ -357,21 +364,33 @@ static int ovs_stats_update_bridge(yajl_val bridge) { 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 */ @@ -629,10 +648,15 @@ static int ovs_stats_update_iface(yajl_val iface) { 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_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; } @@ -833,6 +857,7 @@ static int ovs_stats_plugin_config(oconfig_item_t *ci) { 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; } @@ -943,7 +968,7 @@ static int ovs_stats_plugin_read(__attribute__((unused)) user_data_t *ud) { 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", @@ -974,9 +999,9 @@ static int ovs_stats_plugin_read(__attribute__((unused)) user_data_t *ud) { /* 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);