diff mbox

[API-NEXT,PATCHv8,2/5] linux-generic: netmap: implement pktio statistics

Message ID 1453824042-29478-3-git-send-email-maxim.uvarov@linaro.org
State Accepted
Commit 9dfd8417d190d8c6d4ebbfd7c560d16302cbfe9a
Headers show

Commit Message

Maxim Uvarov Jan. 26, 2016, 4 p.m. UTC
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
---
 platform/linux-generic/pktio/netmap.c | 44 +++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)
diff mbox

Patch

diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c
index 2a14861..16898ec 100644
--- a/platform/linux-generic/pktio/netmap.c
+++ b/platform/linux-generic/pktio/netmap.c
@@ -35,6 +35,8 @@ 
 #define NM_WAIT_TIMEOUT 5 /* netmap_wait_for_link() timeout in seconds */
 #define NM_INJECT_RETRIES 10
 
+static int netmap_stats_reset(pktio_entry_t *pktio_entry);
+
 static int netmap_do_ioctl(pktio_entry_t *pktio_entry, unsigned long cmd,
 			   int subcmd)
 {
@@ -255,6 +257,7 @@  static int netmap_open(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry,
 	struct nm_desc *desc;
 	struct netmap_ring *ring;
 	odp_pktin_hash_proto_t hash_proto;
+	odp_pktio_stats_t cur_stats;
 
 	if (getenv("ODP_PKTIO_DISABLE_NETMAP"))
 		return -1;
@@ -345,6 +348,20 @@  static int netmap_open(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry,
 		odp_ticketlock_init(&pkt_nm->tx_desc_ring[i].s.lock);
 	}
 
+	/* netmap uses only ethtool to get statistics counters */
+	err = ethtool_stats_get_fd(pktio_entry->s.pkt_nm.sockfd,
+				   pktio_entry->s.name,
+				   &cur_stats);
+	if (err) {
+		ODP_ERR("netmap pktio %s does not support statistics counters\n",
+			pktio_entry->s.name);
+		pktio_entry->s.stats_type = STATS_UNSUPPORTED;
+	} else {
+		pktio_entry->s.stats_type = STATS_ETHTOOL;
+	}
+
+	(void)netmap_stats_reset(pktio_entry);
+
 	return 0;
 
 error:
@@ -773,6 +790,31 @@  static int netmap_pktout_queues(pktio_entry_t *pktio_entry,
 	return num_queues;
 }
 
+static int netmap_stats(pktio_entry_t *pktio_entry,
+			odp_pktio_stats_t *stats)
+{
+	if (pktio_entry->s.stats_type == STATS_UNSUPPORTED) {
+		memset(stats, 0, sizeof(*stats));
+		return 0;
+	}
+
+	return sock_stats_fd(pktio_entry,
+			     stats,
+			     pktio_entry->s.pkt_nm.sockfd);
+}
+
+static int netmap_stats_reset(pktio_entry_t *pktio_entry)
+{
+	if (pktio_entry->s.stats_type == STATS_UNSUPPORTED) {
+		memset(&pktio_entry->s.stats, 0,
+		       sizeof(odp_pktio_stats_t));
+		return 0;
+	}
+
+	return sock_stats_reset_fd(pktio_entry,
+				   pktio_entry->s.pkt_nm.sockfd);
+}
+
 const pktio_if_ops_t netmap_pktio_ops = {
 	.name = "netmap",
 	.init = NULL,
@@ -782,6 +824,8 @@  const pktio_if_ops_t netmap_pktio_ops = {
 	.start = netmap_start,
 	.stop = netmap_stop,
 	.link_status = netmap_link_status,
+	.stats = netmap_stats,
+	.stats_reset = netmap_stats_reset,
 	.recv = netmap_recv,
 	.send = netmap_send,
 	.mtu_get = netmap_mtu_get,