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)); }
/* Generated from of10/port_stats_reply.data */ static int test_of10_port_stats_reply(void) { uint8_t binary[] = { 0x01, 0x11, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, }; of_object_t *obj; obj = of_port_stats_reply_new(OF_VERSION_1_0); { of_object_t list; of_port_stats_reply_entries_bind(obj, &list); { of_object_t *obj = of_port_stats_entry_new(OF_VERSION_1_0); of_port_stats_entry_collisions_set(obj, 5); of_port_stats_entry_port_no_set(obj, 1); of_port_stats_entry_rx_bytes_set(obj, 0); of_port_stats_entry_rx_crc_err_set(obj, 0); of_port_stats_entry_rx_dropped_set(obj, 0); of_port_stats_entry_rx_errors_set(obj, 0); of_port_stats_entry_rx_frame_err_set(obj, 0); of_port_stats_entry_rx_over_err_set(obj, 0); of_port_stats_entry_rx_packets_set(obj, 56); of_port_stats_entry_tx_bytes_set(obj, 0); of_port_stats_entry_tx_dropped_set(obj, 0); of_port_stats_entry_tx_errors_set(obj, 0); of_port_stats_entry_tx_packets_set(obj, 0); of_list_append(&list, obj); of_object_delete(obj); } { of_object_t *obj = of_port_stats_entry_new(OF_VERSION_1_0); of_port_stats_entry_collisions_set(obj, 1); of_port_stats_entry_port_no_set(obj, 65534); of_port_stats_entry_rx_bytes_set(obj, 0); of_port_stats_entry_rx_crc_err_set(obj, 0); of_port_stats_entry_rx_dropped_set(obj, 0); of_port_stats_entry_rx_errors_set(obj, 0); of_port_stats_entry_rx_frame_err_set(obj, 0); of_port_stats_entry_rx_over_err_set(obj, 0); of_port_stats_entry_rx_packets_set(obj, 1); of_port_stats_entry_tx_bytes_set(obj, 0); of_port_stats_entry_tx_dropped_set(obj, 0); of_port_stats_entry_tx_errors_set(obj, 0); of_port_stats_entry_tx_packets_set(obj, 0); of_list_append(&list, obj); of_object_delete(obj); } } of_port_stats_reply_flags_set(obj, 0); of_port_stats_reply_xid_set(obj, 5); if (sizeof(binary) != WBUF_CURRENT_BYTES(OF_OBJECT_TO_WBUF(obj)) || memcmp(binary, WBUF_BUF(OF_OBJECT_TO_WBUF(obj)), sizeof(binary))) { show_failure(binary, sizeof(binary), WBUF_BUF(OF_OBJECT_TO_WBUF(obj)), WBUF_CURRENT_BYTES(OF_OBJECT_TO_WBUF(obj))); of_object_delete(obj); return TEST_FAIL; } of_object_delete(obj); return TEST_PASS; }
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; }