[API-NEXT,PATCHv4,2/5] linux-generic: pktio loop: implement statistics counters

Message ID 1448370648-18974-3-git-send-email-maxim.uvarov@linaro.org
State New
Headers show

Commit Message

Maxim Uvarov Nov. 24, 2015, 1:10 p.m.
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
---
 platform/linux-generic/pktio/loop.c | 36 ++++++++++++++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)

Patch

diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c
index 44da917..ac79f81 100644
--- a/platform/linux-generic/pktio/loop.c
+++ b/platform/linux-generic/pktio/loop.c
@@ -23,6 +23,8 @@ 
 /* MAC address for the "loop" interface */
 static const char pktio_loop_mac[] = {0x02, 0xe9, 0x34, 0x80, 0x73, 0x01};
 
+static int loopback_stats_reset(pktio_entry_t *pktio_entry);
+
 static int loopback_open(odp_pktio_t id, pktio_entry_t *pktio_entry,
 			 const char *devname, odp_pool_t pool ODP_UNUSED)
 {
@@ -39,6 +41,8 @@  static int loopback_open(odp_pktio_t id, pktio_entry_t *pktio_entry,
 	if (pktio_entry->s.pkt_loop.loopq == ODP_QUEUE_INVALID)
 		return -1;
 
+	loopback_stats_reset(pktio_entry);
+
 	return 0;
 }
 
@@ -63,8 +67,11 @@  static int loopback_recv(pktio_entry_t *pktio_entry, odp_packet_t pkts[],
 		pkt_hdr = odp_packet_hdr(pkts[i]);
 		packet_parse_reset(pkts[i]);
 		packet_parse_l2(pkt_hdr);
+		pktio_entry->s.stats.in_octets += odp_packet_len(pkts[i]);
 	}
 
+	pktio_entry->s.stats.in_ucast_pkts += nbr;
+
 	return nbr;
 }
 
@@ -74,12 +81,22 @@  static int loopback_send(pktio_entry_t *pktio_entry, odp_packet_t pkt_tbl[],
 	odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX];
 	queue_entry_t *qentry;
 	unsigned i;
+	int ret;
+	uint32_t bytes = 0;
 
-	for (i = 0; i < len; ++i)
+	for (i = 0; i < len; ++i) {
 		hdr_tbl[i] = odp_buf_to_hdr(_odp_packet_to_buffer(pkt_tbl[i]));
+		bytes += odp_packet_len(pkt_tbl[i]);
+	}
 
 	qentry = queue_to_qentry(pktio_entry->s.pkt_loop.loopq);
-	return queue_enq_multi(qentry, hdr_tbl, len, 0);
+	ret = queue_enq_multi(qentry, hdr_tbl, len, 0);
+	if (ret > 0) {
+		pktio_entry->s.stats.out_ucast_pkts += ret;
+		pktio_entry->s.stats.out_octets += bytes;
+	}
+
+	return ret;
 }
 
 static int loopback_mtu_get(pktio_entry_t *pktio_entry ODP_UNUSED)
@@ -107,6 +124,19 @@  static int loopback_promisc_mode_get(pktio_entry_t *pktio_entry)
 	return pktio_entry->s.pkt_loop.promisc ? 1 : 0;
 }
 
+static int loopback_stats(pktio_entry_t *pktio_entry,
+			  odp_pktio_stats_t *stats)
+{
+	memcpy(stats, &pktio_entry->s.stats, sizeof(odp_pktio_stats_t));
+	return 0;
+}
+
+static int loopback_stats_reset(pktio_entry_t *pktio_entry ODP_UNUSED)
+{
+	memset(&pktio_entry->s.stats, 0, sizeof(odp_pktio_stats_t));
+	return 0;
+}
+
 const pktio_if_ops_t loopback_pktio_ops = {
 	.name = "loop",
 	.init = NULL,
@@ -115,6 +145,8 @@  const pktio_if_ops_t loopback_pktio_ops = {
 	.close = loopback_close,
 	.start = NULL,
 	.stop = NULL,
+	.stats = loopback_stats,
+	.stats_reset = loopback_stats_reset,
 	.recv = loopback_recv,
 	.send = loopback_send,
 	.mtu_get = loopback_mtu_get,