int of_list_port_stats_entry_first(of_list_port_stats_entry_t *list, of_port_stats_entry_t *_obj) { int rv; of_object_t *obj = (of_object_t *)_obj; of_port_stats_entry_init(_obj, list->version, -1, 1); if ((rv = of_list_first(list, obj)) < 0) { return rv; } return rv; }
static indigo_error_t ind_ofdpa_port_stats_set(uint32_t port, of_list_port_stats_entry_t *list) { OFDPA_ERROR_t ofdpa_rv = OFDPA_E_NONE; ofdpaPortStats_t portStats; of_port_stats_entry_t entry[1]; of_port_stats_entry_init(entry, list->version, -1, 1); if (of_list_port_stats_entry_append_bind(list, entry) < 0) { LOG_ERROR("too many port stats replies"); return INDIGO_ERROR_UNKNOWN; } memset(&portStats, 0, sizeof(portStats)); ofdpa_rv = ofdpaPortStatsGet(port, &portStats); if (ofdpa_rv != OFDPA_E_NONE) { LOG_ERROR("Failed to get stats on port %d.", port); return (indigoConvertOfdpaRv(ofdpa_rv)); } of_port_stats_entry_port_no_set(entry, port); of_port_stats_entry_rx_packets_set(entry, portStats.rx_packets); of_port_stats_entry_tx_packets_set(entry, portStats.tx_packets); of_port_stats_entry_rx_bytes_set(entry, portStats.rx_bytes); of_port_stats_entry_tx_bytes_set(entry, portStats.tx_bytes); of_port_stats_entry_rx_errors_set(entry, portStats.rx_errors); of_port_stats_entry_tx_errors_set(entry, portStats.tx_errors); of_port_stats_entry_rx_dropped_set(entry, portStats.rx_drops); of_port_stats_entry_tx_dropped_set(entry, portStats.tx_drops); of_port_stats_entry_rx_frame_err_set(entry, portStats.rx_frame_err); of_port_stats_entry_rx_over_err_set(entry, portStats.rx_over_err); of_port_stats_entry_rx_crc_err_set(entry, portStats.rx_crc_err); of_port_stats_entry_collisions_set(entry, portStats.collisions); return (indigoConvertOfdpaRv(ofdpa_rv)); }
static int port_stats_iterator(struct nl_msg *msg, void *arg) { of_list_port_stats_entry_t *list = arg; struct nlmsghdr *nlh = nlmsg_hdr(msg); struct nlattr *attrs[OVS_VPORT_ATTR_MAX+1]; if (genlmsg_parse(nlh, sizeof(struct ovs_header), attrs, OVS_VPORT_ATTR_MAX, NULL) < 0) { abort(); } assert(attrs[OVS_VPORT_ATTR_PORT_NO]); assert(attrs[OVS_VPORT_ATTR_STATS]); uint32_t port_no = nla_get_u32(attrs[OVS_VPORT_ATTR_PORT_NO]); char *ifname = nla_get_string(attrs[OVS_VPORT_ATTR_NAME]); uint32_t vport_type = nla_get_u32(attrs[OVS_VPORT_ATTR_TYPE]); struct ovs_vport_stats *port_stats = nla_data(attrs[OVS_VPORT_ATTR_STATS]); of_port_stats_entry_t entry[1]; of_port_stats_entry_init(entry, list->version, -1, 1); if (of_list_port_stats_entry_append_bind(list, entry) < 0) { /* TODO needs fix in indigo core */ LOG_ERROR("too many port stats replies"); return NL_STOP; } of_port_stats_entry_port_no_set(entry, port_no); struct rtnl_link *link; if ((vport_type == OVS_VPORT_TYPE_NETDEV || vport_type == OVS_VPORT_TYPE_INTERNAL) && (link = rtnl_link_get_by_name(link_cache, ifname))) { /* Get interface stats from NETLINK_ROUTE */ of_port_stats_entry_rx_packets_set(entry, rtnl_link_get_stat(link, RTNL_LINK_RX_PACKETS)); of_port_stats_entry_tx_packets_set(entry, rtnl_link_get_stat(link, RTNL_LINK_TX_PACKETS)); of_port_stats_entry_rx_bytes_set(entry, rtnl_link_get_stat(link, RTNL_LINK_RX_BYTES)); of_port_stats_entry_tx_bytes_set(entry, rtnl_link_get_stat(link, RTNL_LINK_TX_BYTES)); of_port_stats_entry_rx_dropped_set(entry, rtnl_link_get_stat(link, RTNL_LINK_RX_DROPPED)); of_port_stats_entry_tx_dropped_set(entry, rtnl_link_get_stat(link, RTNL_LINK_TX_DROPPED)); of_port_stats_entry_rx_errors_set(entry, rtnl_link_get_stat(link, RTNL_LINK_RX_ERRORS)); of_port_stats_entry_tx_errors_set(entry, rtnl_link_get_stat(link, RTNL_LINK_TX_ERRORS)); of_port_stats_entry_rx_frame_err_set(entry, rtnl_link_get_stat(link, RTNL_LINK_RX_FRAME_ERR)); of_port_stats_entry_rx_over_err_set(entry, rtnl_link_get_stat(link, RTNL_LINK_RX_OVER_ERR)); of_port_stats_entry_rx_crc_err_set(entry, rtnl_link_get_stat(link, RTNL_LINK_RX_CRC_ERR)); of_port_stats_entry_collisions_set(entry, rtnl_link_get_stat(link, RTNL_LINK_COLLISIONS)); rtnl_link_put(link); } else { /* Use more limited stats from the datapath */ of_port_stats_entry_rx_packets_set(entry, port_stats->rx_packets); of_port_stats_entry_tx_packets_set(entry, port_stats->tx_packets); of_port_stats_entry_rx_bytes_set(entry, port_stats->rx_bytes); of_port_stats_entry_tx_bytes_set(entry, port_stats->tx_bytes); of_port_stats_entry_rx_dropped_set(entry, port_stats->rx_dropped); of_port_stats_entry_tx_dropped_set(entry, port_stats->tx_dropped); of_port_stats_entry_rx_errors_set(entry, port_stats->rx_errors); of_port_stats_entry_tx_errors_set(entry, port_stats->tx_errors); of_port_stats_entry_rx_frame_err_set(entry, 0); of_port_stats_entry_rx_over_err_set(entry, 0); of_port_stats_entry_rx_crc_err_set(entry, 0); of_port_stats_entry_collisions_set(entry, 0); } return NL_OK; }