dev: dev process node scheduling improvements
[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/counters.h>
8 #include <dev_iavf/iavf.h>
9 #include <dev_iavf/virtchnl.h>
10 #include <dev_iavf/virtchnl_funcs.h>
11
12 VLIB_REGISTER_LOG_CLASS (iavf_log, static) = {
13   .class_name = "iavf",
14   .subclass_name = "counters",
15 };
16
17 typedef enum
18 {
19   IIAVF_PORT_CTR_RX_BYTES,
20   IIAVF_PORT_CTR_TX_BYTES,
21   IIAVF_PORT_CTR_RX_PACKETS,
22   IIAVF_PORT_CTR_TX_PACKETS,
23   IIAVF_PORT_CTR_RX_DROPS,
24   IIAVF_PORT_CTR_TX_DROPS,
25   IIAVF_PORT_CTR_RX_UCAST,
26   IIAVF_PORT_CTR_TX_UCAST,
27   IIAVF_PORT_CTR_RX_MCAST,
28   IIAVF_PORT_CTR_TX_MCAST,
29   IIAVF_PORT_CTR_RX_BCAST,
30   IIAVF_PORT_CTR_TX_BCAST,
31   IIAVF_PORT_CTR_RX_UNKNOWN_PROTOCOL,
32   IIAVF_PORT_CTR_TX_ERRORS,
33 } iavf_port_counter_id_t;
34
35 vnet_dev_counter_t iavf_port_counters[] = {
36   VNET_DEV_CTR_RX_BYTES (IIAVF_PORT_CTR_RX_BYTES),
37   VNET_DEV_CTR_RX_PACKETS (IIAVF_PORT_CTR_RX_PACKETS),
38   VNET_DEV_CTR_RX_DROPS (IIAVF_PORT_CTR_RX_DROPS),
39   VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_RX_UCAST, RX, PACKETS, "unicast"),
40   VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_RX_MCAST, RX, PACKETS, "multicast"),
41   VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_RX_BCAST, RX, PACKETS, "broadcast"),
42   VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_RX_UNKNOWN_PROTOCOL, RX, PACKETS,
43                        "unknown protocol"),
44
45   VNET_DEV_CTR_TX_BYTES (IIAVF_PORT_CTR_TX_BYTES),
46   VNET_DEV_CTR_TX_PACKETS (IIAVF_PORT_CTR_TX_PACKETS),
47   VNET_DEV_CTR_TX_DROPS (IIAVF_PORT_CTR_TX_DROPS),
48   VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_TX_UCAST, TX, PACKETS, "unicast"),
49   VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_TX_MCAST, TX, PACKETS, "multicast"),
50   VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_TX_BCAST, TX, PACKETS, "broadcast"),
51   VNET_DEV_CTR_VENDOR (IIAVF_PORT_CTR_TX_ERRORS, TX, PACKETS, "errors"),
52 };
53
54 void
55 iavf_port_add_counters (vlib_main_t *vm, vnet_dev_port_t *port)
56 {
57   vnet_dev_port_add_counters (vm, port, iavf_port_counters,
58                               ARRAY_LEN (iavf_port_counters));
59 }
60
61 void
62 iavf_port_poll_stats (vlib_main_t *vm, vnet_dev_port_t *port)
63 {
64   vnet_dev_rv_t rv;
65   vnet_dev_t *dev = port->dev;
66   virtchnl_eth_stats_t stats;
67   iavf_port_t *ap = vnet_dev_get_port_data (port);
68   virtchnl_queue_select_t qs = { .vsi_id = ap->vsi_id };
69
70   rv = iavf_vc_op_get_stats (vm, dev, &qs, &stats);
71
72   if (rv != VNET_DEV_OK)
73     return;
74
75   foreach_vnet_dev_counter (c, port->counter_main)
76     {
77       switch (c->user_data)
78         {
79         case IIAVF_PORT_CTR_RX_BYTES:
80           vnet_dev_counter_value_update (vm, c, stats.rx_bytes);
81           break;
82         case IIAVF_PORT_CTR_TX_BYTES:
83           vnet_dev_counter_value_update (vm, c, stats.tx_bytes);
84           break;
85         case IIAVF_PORT_CTR_RX_PACKETS:
86           vnet_dev_counter_value_update (
87             vm, c, stats.rx_unicast + stats.rx_broadcast + stats.rx_multicast);
88           break;
89         case IIAVF_PORT_CTR_TX_PACKETS:
90           vnet_dev_counter_value_update (
91             vm, c, stats.tx_unicast + stats.tx_broadcast + stats.tx_multicast);
92           break;
93         case IIAVF_PORT_CTR_RX_DROPS:
94           vnet_dev_counter_value_update (vm, c, stats.rx_discards);
95           break;
96         case IIAVF_PORT_CTR_TX_DROPS:
97           vnet_dev_counter_value_update (vm, c, stats.tx_discards);
98           break;
99         case IIAVF_PORT_CTR_RX_UCAST:
100           vnet_dev_counter_value_update (vm, c, stats.rx_unicast);
101           break;
102         case IIAVF_PORT_CTR_TX_UCAST:
103           vnet_dev_counter_value_update (vm, c, stats.tx_unicast);
104           break;
105         case IIAVF_PORT_CTR_RX_MCAST:
106           vnet_dev_counter_value_update (vm, c, stats.rx_multicast);
107           break;
108         case IIAVF_PORT_CTR_TX_MCAST:
109           vnet_dev_counter_value_update (vm, c, stats.tx_multicast);
110           break;
111         case IIAVF_PORT_CTR_RX_BCAST:
112           vnet_dev_counter_value_update (vm, c, stats.rx_broadcast);
113           break;
114         case IIAVF_PORT_CTR_TX_BCAST:
115           vnet_dev_counter_value_update (vm, c, stats.tx_broadcast);
116           break;
117         case IIAVF_PORT_CTR_RX_UNKNOWN_PROTOCOL:
118           vnet_dev_counter_value_update (vm, c, stats.rx_unknown_protocol);
119           break;
120         case IIAVF_PORT_CTR_TX_ERRORS:
121           vnet_dev_counter_value_update (vm, c, stats.tx_errors);
122           break;
123         default:
124           ASSERT (0);
125         }
126     }
127 }