1 /* SPDX-License-Identifier: Apache-2.0
2 * Copyright (c) 2023 Cisco Systems, Inc.
6 #include <vnet/dev/dev.h>
7 #include <vnet/dev/pci.h>
8 #include <vnet/dev/counters.h>
9 #include <dev_iavf/iavf.h>
10 #include <dev_iavf/virtchnl.h>
11 #include <dev_iavf/virtchnl_funcs.h>
13 VLIB_REGISTER_LOG_CLASS (iavf_log, static) = {
15 .subclass_name = "counters",
20 IIAVF_PORT_CTR_RX_BYTES,
21 IIAVF_PORT_CTR_TX_BYTES,
22 IIAVF_PORT_CTR_RX_PACKETS,
23 IIAVF_PORT_CTR_TX_PACKETS,
24 IIAVF_PORT_CTR_RX_DROPS,
25 IIAVF_PORT_CTR_TX_DROPS,
26 IIAVF_PORT_CTR_RX_UCAST,
27 IIAVF_PORT_CTR_TX_UCAST,
28 IIAVF_PORT_CTR_RX_MCAST,
29 IIAVF_PORT_CTR_TX_MCAST,
30 IIAVF_PORT_CTR_RX_BCAST,
31 IIAVF_PORT_CTR_TX_BCAST,
32 IIAVF_PORT_CTR_RX_UNKNOWN_PROTOCOL,
33 IIAVF_PORT_CTR_TX_ERRORS,
34 } iavf_port_counter_id_t;
36 vnet_dev_counter_t iavf_port_counters[] = {
37 VNET_DEV_CTR_RX_BYTES (IIAVF_PORT_CTR_RX_BYTES),
38 VNET_DEV_CTR_RX_PACKETS (IIAVF_PORT_CTR_RX_PACKETS),
39 VNET_DEV_CTR_RX_DROPS (IIAVF_PORT_CTR_RX_DROPS),
40 VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_RX_UCAST, RX, PACKETS, "unicast"),
41 VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_RX_MCAST, RX, PACKETS, "multicast"),
42 VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_RX_BCAST, RX, PACKETS, "broadcast"),
43 VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_RX_UNKNOWN_PROTOCOL, RX, PACKETS,
46 VNET_DEV_CTR_TX_BYTES (IIAVF_PORT_CTR_TX_BYTES),
47 VNET_DEV_CTR_TX_PACKETS (IIAVF_PORT_CTR_TX_PACKETS),
48 VNET_DEV_CTR_TX_DROPS (IIAVF_PORT_CTR_TX_DROPS),
49 VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_TX_UCAST, TX, PACKETS, "unicast"),
50 VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_TX_MCAST, TX, PACKETS, "multicast"),
51 VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_TX_BCAST, TX, PACKETS, "broadcast"),
52 VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_TX_ERRORS, TX, PACKETS, "errors"),
56 iavf_port_add_counters (vlib_main_t *vm, vnet_dev_port_t *port)
58 vnet_dev_port_add_counters (vm, port, iavf_port_counters,
59 ARRAY_LEN (iavf_port_counters));
63 iavf_port_poll_stats (vlib_main_t *vm, vnet_dev_port_t *port)
66 vnet_dev_t *dev = port->dev;
67 virtchnl_eth_stats_t stats;
68 iavf_port_t *ap = vnet_dev_get_port_data (port);
69 virtchnl_queue_select_t qs = { .vsi_id = ap->vsi_id };
71 rv = iavf_vc_op_get_stats (vm, dev, &qs, &stats);
73 if (rv != VNET_DEV_OK)
76 foreach_vnet_dev_counter (c, port->counter_main)
80 case IIAVF_PORT_CTR_RX_BYTES:
81 vnet_dev_counter_value_update (vm, c, stats.rx_bytes);
83 case IIAVF_PORT_CTR_TX_BYTES:
84 vnet_dev_counter_value_update (vm, c, stats.tx_bytes);
86 case IIAVF_PORT_CTR_RX_PACKETS:
87 vnet_dev_counter_value_update (
88 vm, c, stats.rx_unicast + stats.rx_broadcast + stats.rx_multicast);
90 case IIAVF_PORT_CTR_TX_PACKETS:
91 vnet_dev_counter_value_update (
92 vm, c, stats.tx_unicast + stats.tx_broadcast + stats.tx_multicast);
94 case IIAVF_PORT_CTR_RX_DROPS:
95 vnet_dev_counter_value_update (vm, c, stats.rx_discards);
97 case IIAVF_PORT_CTR_TX_DROPS:
98 vnet_dev_counter_value_update (vm, c, stats.tx_discards);
100 case IIAVF_PORT_CTR_RX_UCAST:
101 vnet_dev_counter_value_update (vm, c, stats.rx_unicast);
103 case IIAVF_PORT_CTR_TX_UCAST:
104 vnet_dev_counter_value_update (vm, c, stats.tx_unicast);
106 case IIAVF_PORT_CTR_RX_MCAST:
107 vnet_dev_counter_value_update (vm, c, stats.rx_multicast);
109 case IIAVF_PORT_CTR_TX_MCAST:
110 vnet_dev_counter_value_update (vm, c, stats.tx_multicast);
112 case IIAVF_PORT_CTR_RX_BCAST:
113 vnet_dev_counter_value_update (vm, c, stats.rx_broadcast);
115 case IIAVF_PORT_CTR_TX_BCAST:
116 vnet_dev_counter_value_update (vm, c, stats.tx_broadcast);
118 case IIAVF_PORT_CTR_RX_UNKNOWN_PROTOCOL:
119 vnet_dev_counter_value_update (vm, c, stats.rx_unknown_protocol);
121 case IIAVF_PORT_CTR_TX_ERRORS:
122 vnet_dev_counter_value_update (vm, c, stats.tx_errors);