iavf: new driver using new dev infra

Type: feature
Change-Id: I9ae0dbf28b4571a37c568b587b771f90c06f200d
Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:
Damjan Marion
2023-10-17 16:08:18 +00:00
parent 38c619115b
commit 47447f1f59
18 changed files with 4589 additions and 4 deletions

View File

@@ -0,0 +1,128 @@
/* SPDX-License-Identifier: Apache-2.0
* Copyright (c) 2023 Cisco Systems, Inc.
*/
#include <vnet/vnet.h>
#include <vnet/dev/dev.h>
#include <vnet/dev/pci.h>
#include <vnet/dev/counters.h>
#include <dev_iavf/iavf.h>
#include <dev_iavf/virtchnl.h>
#include <dev_iavf/virtchnl_funcs.h>
VLIB_REGISTER_LOG_CLASS (iavf_log, static) = {
.class_name = "iavf",
.subclass_name = "counters",
};
typedef enum
{
IIAVF_PORT_CTR_RX_BYTES,
IIAVF_PORT_CTR_TX_BYTES,
IIAVF_PORT_CTR_RX_PACKETS,
IIAVF_PORT_CTR_TX_PACKETS,
IIAVF_PORT_CTR_RX_DROPS,
IIAVF_PORT_CTR_TX_DROPS,
IIAVF_PORT_CTR_RX_UCAST,
IIAVF_PORT_CTR_TX_UCAST,
IIAVF_PORT_CTR_RX_MCAST,
IIAVF_PORT_CTR_TX_MCAST,
IIAVF_PORT_CTR_RX_BCAST,
IIAVF_PORT_CTR_TX_BCAST,
IIAVF_PORT_CTR_RX_UNKNOWN_PROTOCOL,
IIAVF_PORT_CTR_TX_ERRORS,
} iavf_port_counter_id_t;
vnet_dev_counter_t iavf_port_counters[] = {
VNET_DEV_CTR_RX_BYTES (IIAVF_PORT_CTR_RX_BYTES),
VNET_DEV_CTR_RX_PACKETS (IIAVF_PORT_CTR_RX_PACKETS),
VNET_DEV_CTR_RX_DROPS (IIAVF_PORT_CTR_RX_DROPS),
VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_RX_UCAST, RX, PACKETS, "unicast"),
VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_RX_MCAST, RX, PACKETS, "multicast"),
VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_RX_BCAST, RX, PACKETS, "broadcast"),
VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_RX_UNKNOWN_PROTOCOL, RX, PACKETS,
"unknown protocol"),
VNET_DEV_CTR_TX_BYTES (IIAVF_PORT_CTR_TX_BYTES),
VNET_DEV_CTR_TX_PACKETS (IIAVF_PORT_CTR_TX_PACKETS),
VNET_DEV_CTR_TX_DROPS (IIAVF_PORT_CTR_TX_DROPS),
VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_TX_UCAST, TX, PACKETS, "unicast"),
VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_TX_MCAST, TX, PACKETS, "multicast"),
VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_TX_BCAST, TX, PACKETS, "broadcast"),
VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_TX_ERRORS, TX, PACKETS, "errors"),
};
void
iavf_port_add_counters (vlib_main_t *vm, vnet_dev_port_t *port)
{
vnet_dev_port_add_counters (vm, port, iavf_port_counters,
ARRAY_LEN (iavf_port_counters));
}
void
iavf_port_poll_stats (vlib_main_t *vm, vnet_dev_port_t *port)
{
vnet_dev_rv_t rv;
vnet_dev_t *dev = port->dev;
virtchnl_eth_stats_t stats;
iavf_port_t *ap = vnet_dev_get_port_data (port);
virtchnl_queue_select_t qs = { .vsi_id = ap->vsi_id };
rv = iavf_vc_op_get_stats (vm, dev, &qs, &stats);
if (rv != VNET_DEV_OK)
return;
foreach_vnet_dev_counter (c, port->counter_main)
{
switch (c->user_data)
{
case IIAVF_PORT_CTR_RX_BYTES:
vnet_dev_counter_value_update (vm, c, stats.rx_bytes);
break;
case IIAVF_PORT_CTR_TX_BYTES:
vnet_dev_counter_value_update (vm, c, stats.tx_bytes);
break;
case IIAVF_PORT_CTR_RX_PACKETS:
vnet_dev_counter_value_update (
vm, c, stats.rx_unicast + stats.rx_broadcast + stats.rx_multicast);
break;
case IIAVF_PORT_CTR_TX_PACKETS:
vnet_dev_counter_value_update (
vm, c, stats.tx_unicast + stats.tx_broadcast + stats.tx_multicast);
break;
case IIAVF_PORT_CTR_RX_DROPS:
vnet_dev_counter_value_update (vm, c, stats.rx_discards);
break;
case IIAVF_PORT_CTR_TX_DROPS:
vnet_dev_counter_value_update (vm, c, stats.tx_discards);
break;
case IIAVF_PORT_CTR_RX_UCAST:
vnet_dev_counter_value_update (vm, c, stats.rx_unicast);
break;
case IIAVF_PORT_CTR_TX_UCAST:
vnet_dev_counter_value_update (vm, c, stats.tx_unicast);
break;
case IIAVF_PORT_CTR_RX_MCAST:
vnet_dev_counter_value_update (vm, c, stats.rx_multicast);
break;
case IIAVF_PORT_CTR_TX_MCAST:
vnet_dev_counter_value_update (vm, c, stats.tx_multicast);
break;
case IIAVF_PORT_CTR_RX_BCAST:
vnet_dev_counter_value_update (vm, c, stats.rx_broadcast);
break;
case IIAVF_PORT_CTR_TX_BCAST:
vnet_dev_counter_value_update (vm, c, stats.tx_broadcast);
break;
case IIAVF_PORT_CTR_RX_UNKNOWN_PROTOCOL:
vnet_dev_counter_value_update (vm, c, stats.rx_unknown_protocol);
break;
case IIAVF_PORT_CTR_TX_ERRORS:
vnet_dev_counter_value_update (vm, c, stats.tx_errors);
break;
default:
ASSERT (0);
}
}
}