Ejemplo n.º 1
0
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));
}
Ejemplo n.º 2
0
/* 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;
}
Ejemplo n.º 3
0
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;
}