aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic/pktio/stats/packet_io_stats.c
diff options
context:
space:
mode:
Diffstat (limited to 'platform/linux-generic/pktio/stats/packet_io_stats.c')
-rw-r--r--platform/linux-generic/pktio/stats/packet_io_stats.c190
1 files changed, 190 insertions, 0 deletions
diff --git a/platform/linux-generic/pktio/stats/packet_io_stats.c b/platform/linux-generic/pktio/stats/packet_io_stats.c
new file mode 100644
index 000000000..b839faaa6
--- /dev/null
+++ b/platform/linux-generic/pktio/stats/packet_io_stats.c
@@ -0,0 +1,190 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2014-2018 Linaro Limited
+ * Copyright (c) 2021 Nokia
+ */
+
+#include <odp_packet_io_stats.h>
+#include <odp_ethtool_stats.h>
+#include <odp_sysfs_stats.h>
+
+#include <string.h>
+
+static int sock_stats_get(pktio_entry_t *e, odp_pktio_stats_t *stats, int fd)
+{
+ int ret = 0;
+
+ memset(stats, 0, sizeof(*stats));
+
+ if (e->stats_type == STATS_ETHTOOL)
+ ret = _odp_ethtool_stats_get_fd(fd, e->name, stats);
+ else if (e->stats_type == STATS_SYSFS)
+ ret = _odp_sysfs_stats(e, stats);
+
+ if (ret)
+ _ODP_ERR("Failed to get pktio statistics.\n");
+
+ return ret;
+}
+
+int _odp_sock_stats_reset_fd(pktio_entry_t *pktio_entry, int fd)
+{
+ odp_pktio_stats_t cur_stats;
+ int ret;
+
+ if (pktio_entry->stats_type == STATS_UNSUPPORTED) {
+ memset(&pktio_entry->stats, 0,
+ sizeof(odp_pktio_stats_t));
+ return 0;
+ }
+
+ ret = sock_stats_get(pktio_entry, &cur_stats, fd);
+
+ if (!ret)
+ memcpy(&pktio_entry->stats, &cur_stats,
+ sizeof(odp_pktio_stats_t));
+
+ return ret;
+}
+
+int _odp_sock_stats_fd(pktio_entry_t *pktio_entry,
+ odp_pktio_stats_t *stats,
+ int fd)
+{
+ odp_pktio_stats_t cur_stats;
+
+ if (pktio_entry->stats_type == STATS_UNSUPPORTED) {
+ memset(stats, 0, sizeof(*stats));
+ return 0;
+ }
+
+ if (sock_stats_get(pktio_entry, &cur_stats, fd))
+ return -1;
+
+ stats->in_octets = cur_stats.in_octets -
+ pktio_entry->stats.in_octets;
+ stats->in_packets = cur_stats.in_packets -
+ pktio_entry->stats.in_packets;
+ stats->in_ucast_pkts = cur_stats.in_ucast_pkts -
+ pktio_entry->stats.in_ucast_pkts;
+ stats->in_bcast_pkts = cur_stats.in_bcast_pkts -
+ pktio_entry->stats.in_bcast_pkts;
+ stats->in_mcast_pkts = cur_stats.in_mcast_pkts -
+ pktio_entry->stats.in_mcast_pkts;
+ stats->in_discards = cur_stats.in_discards -
+ pktio_entry->stats.in_discards;
+ stats->in_errors = cur_stats.in_errors -
+ pktio_entry->stats.in_errors;
+ stats->out_octets = cur_stats.out_octets -
+ pktio_entry->stats.out_octets;
+ stats->out_packets = cur_stats.out_packets -
+ pktio_entry->stats.out_packets;
+ stats->out_ucast_pkts = cur_stats.out_ucast_pkts -
+ pktio_entry->stats.out_ucast_pkts;
+ stats->out_bcast_pkts = cur_stats.out_bcast_pkts -
+ pktio_entry->stats.out_bcast_pkts;
+ stats->out_mcast_pkts = cur_stats.out_mcast_pkts -
+ pktio_entry->stats.out_mcast_pkts;
+ stats->out_discards = cur_stats.out_discards -
+ pktio_entry->stats.out_discards;
+ stats->out_errors = cur_stats.out_errors -
+ pktio_entry->stats.out_errors;
+
+ return 0;
+}
+
+int _odp_sock_extra_stat_info(pktio_entry_t *pktio_entry,
+ odp_pktio_extra_stat_info_t info[], int num,
+ int fd)
+{
+ if (pktio_entry->stats_type == STATS_UNSUPPORTED)
+ return 0;
+
+ if (pktio_entry->stats_type == STATS_ETHTOOL)
+ return _odp_ethtool_extra_stat_info(fd, pktio_entry->name,
+ info, num);
+ else if (pktio_entry->stats_type == STATS_SYSFS)
+ return _odp_sysfs_extra_stat_info(pktio_entry, info, num);
+
+ return 0;
+}
+
+int _odp_sock_extra_stats(pktio_entry_t *pktio_entry, uint64_t stats[], int num,
+ int fd)
+{
+ if (pktio_entry->stats_type == STATS_UNSUPPORTED)
+ return 0;
+
+ if (pktio_entry->stats_type == STATS_ETHTOOL)
+ return _odp_ethtool_extra_stats(fd, pktio_entry->name,
+ stats, num);
+ else if (pktio_entry->stats_type == STATS_SYSFS)
+ return _odp_sysfs_extra_stats(pktio_entry, stats, num);
+
+ return 0;
+}
+
+int _odp_sock_extra_stat_counter(pktio_entry_t *pktio_entry, uint32_t id,
+ uint64_t *stat, int fd)
+{
+ if (pktio_entry->stats_type == STATS_UNSUPPORTED)
+ return -1;
+
+ if (pktio_entry->stats_type == STATS_ETHTOOL) {
+ return _odp_ethtool_extra_stat_counter(fd, pktio_entry->name,
+ id, stat);
+ } else if (pktio_entry->stats_type == STATS_SYSFS) {
+ return _odp_sysfs_extra_stat_counter(pktio_entry, id, stat);
+ }
+
+ return 0;
+}
+
+pktio_stats_type_t _odp_sock_stats_type_fd(pktio_entry_t *pktio_entry, int fd)
+{
+ odp_pktio_stats_t cur_stats;
+
+ if (!_odp_ethtool_stats_get_fd(fd, pktio_entry->name, &cur_stats))
+ return STATS_ETHTOOL;
+
+ if (!_odp_sysfs_stats(pktio_entry, &cur_stats))
+ return STATS_SYSFS;
+
+ return STATS_UNSUPPORTED;
+}
+
+void _odp_sock_stats_capa(pktio_entry_t *pktio_entry,
+ odp_pktio_capability_t *capa)
+{
+ capa->stats.pktio.all_counters = 0;
+ capa->stats.pktin_queue.all_counters = 0;
+ capa->stats.pktout_queue.all_counters = 0;
+
+ if (pktio_entry->stats_type == STATS_SYSFS) {
+ capa->stats.pktio.counter.in_octets = 1;
+ capa->stats.pktio.counter.in_packets = 1;
+ capa->stats.pktio.counter.in_ucast_pkts = 1;
+ capa->stats.pktio.counter.in_mcast_pkts = 1;
+ capa->stats.pktio.counter.in_discards = 1;
+ capa->stats.pktio.counter.in_errors = 1;
+ capa->stats.pktio.counter.out_octets = 1;
+ capa->stats.pktio.counter.out_packets = 1;
+ capa->stats.pktio.counter.out_ucast_pkts = 1;
+ capa->stats.pktio.counter.out_discards = 1;
+ capa->stats.pktio.counter.out_errors = 1;
+ } else if (pktio_entry->stats_type == STATS_ETHTOOL) {
+ capa->stats.pktio.counter.in_octets = 1;
+ capa->stats.pktio.counter.in_packets = 1;
+ capa->stats.pktio.counter.in_ucast_pkts = 1;
+ capa->stats.pktio.counter.in_bcast_pkts = 1;
+ capa->stats.pktio.counter.in_mcast_pkts = 1;
+ capa->stats.pktio.counter.in_discards = 1;
+ capa->stats.pktio.counter.in_errors = 1;
+ capa->stats.pktio.counter.out_octets = 1;
+ capa->stats.pktio.counter.out_packets = 1;
+ capa->stats.pktio.counter.out_ucast_pkts = 1;
+ capa->stats.pktio.counter.out_bcast_pkts = 1;
+ capa->stats.pktio.counter.out_mcast_pkts = 1;
+ capa->stats.pktio.counter.out_discards = 1;
+ capa->stats.pktio.counter.out_errors = 1;
+ }
+}