iavf: new driver using new dev infra
[vpp.git] / src / plugins / dev_iavf / counters.c
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright (c) 2023 Cisco Systems, Inc.
3  */
4
5 #include <vnet/vnet.h>
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>
12
13 VLIB_REGISTER_LOG_CLASS (iavf_log, static) = {
14   .class_name = "iavf",
15   .subclass_name = "counters",
16 };
17
18 typedef enum
19 {
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;
35
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,
44                        "unknown protocol"),
45
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"),
53 };
54
55 void
56 iavf_port_add_counters (vlib_main_t *vm, vnet_dev_port_t *port)
57 {
58   vnet_dev_port_add_counters (vm, port, iavf_port_counters,
59                               ARRAY_LEN (iavf_port_counters));
60 }
61
62 void
63 iavf_port_poll_stats (vlib_main_t *vm, vnet_dev_port_t *port)
64 {
65   vnet_dev_rv_t rv;
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 };
70
71   rv = iavf_vc_op_get_stats (vm, dev, &qs, &stats);
72
73   if (rv != VNET_DEV_OK)
74     return;
75
76   foreach_vnet_dev_counter (c, port->counter_main)
77     {
78       switch (c->user_data)
79         {
80         case IIAVF_PORT_CTR_RX_BYTES:
81           vnet_dev_counter_value_update (vm, c, stats.rx_bytes);
82           break;
83         case IIAVF_PORT_CTR_TX_BYTES:
84           vnet_dev_counter_value_update (vm, c, stats.tx_bytes);
85           break;
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);
89           break;
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);
93           break;
94         case IIAVF_PORT_CTR_RX_DROPS:
95           vnet_dev_counter_value_update (vm, c, stats.rx_discards);
96           break;
97         case IIAVF_PORT_CTR_TX_DROPS:
98           vnet_dev_counter_value_update (vm, c, stats.tx_discards);
99           break;
100         case IIAVF_PORT_CTR_RX_UCAST:
101           vnet_dev_counter_value_update (vm, c, stats.rx_unicast);
102           break;
103         case IIAVF_PORT_CTR_TX_UCAST:
104           vnet_dev_counter_value_update (vm, c, stats.tx_unicast);
105           break;
106         case IIAVF_PORT_CTR_RX_MCAST:
107           vnet_dev_counter_value_update (vm, c, stats.rx_multicast);
108           break;
109         case IIAVF_PORT_CTR_TX_MCAST:
110           vnet_dev_counter_value_update (vm, c, stats.tx_multicast);
111           break;
112         case IIAVF_PORT_CTR_RX_BCAST:
113           vnet_dev_counter_value_update (vm, c, stats.rx_broadcast);
114           break;
115         case IIAVF_PORT_CTR_TX_BCAST:
116           vnet_dev_counter_value_update (vm, c, stats.tx_broadcast);
117           break;
118         case IIAVF_PORT_CTR_RX_UNKNOWN_PROTOCOL:
119           vnet_dev_counter_value_update (vm, c, stats.rx_unknown_protocol);
120           break;
121         case IIAVF_PORT_CTR_TX_ERRORS:
122           vnet_dev_counter_value_update (vm, c, stats.tx_errors);
123           break;
124         default:
125           ASSERT (0);
126         }
127     }
128 }