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

Message ID 1453466740-11943-4-git-send-email-maxim.uvarov@linaro.org
State New
Headers show

Commit Message

Maxim Uvarov Jan. 22, 2016, 12:45 p.m.
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
---
 platform/linux-generic/pktio/loop.c | 42 ++++++++++++++++++++++++++++++++++---
 1 file changed, 39 insertions(+), 3 deletions(-)

Patch

diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c
index 3cb61a8..19c584b 100644
--- a/platform/linux-generic/pktio/loop.c
+++ b/platform/linux-generic/pktio/loop.c
@@ -24,6 +24,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)
 {
@@ -40,6 +42,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;
 }
 
@@ -68,8 +72,11 @@  static int loopback_recv(pktio_entry_t *pktio_entry, odp_packet_t pkts[],
 			pkt_hdr = odp_packet_hdr(pkt);
 			packet_parse_reset(pkt_hdr);
 			packet_parse_l2(pkt_hdr);
-			if (0 > _odp_packet_classifier(pktio_entry, pkt))
+			if (0 > _odp_packet_classifier(pktio_entry, pkt)) {
 				pkts[j++] = pkt;
+				pktio_entry->s.stats.in_octets +=
+					odp_packet_len(pkts[i]);
+			}
 		}
 	nbr = j;
 	} else {
@@ -79,9 +86,13 @@  static int loopback_recv(pktio_entry_t *pktio_entry, odp_packet_t pkts[],
 			pkt_hdr = odp_packet_hdr(pkts[i]);
 			packet_parse_reset(pkt_hdr);
 			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;
 }
 
@@ -91,12 +102,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)
@@ -124,6 +145,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,
@@ -132,6 +166,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,