diff mbox

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

Message ID 1447839268-20423-4-git-send-email-maxim.uvarov@linaro.org
State Superseded
Headers show

Commit Message

Maxim Uvarov Nov. 18, 2015, 9:34 a.m. UTC
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
---
 platform/linux-generic/pktio/pcap.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)
diff mbox

Patch

diff --git a/platform/linux-generic/pktio/pcap.c b/platform/linux-generic/pktio/pcap.c
index 0817bf5..34cd73c 100644
--- a/platform/linux-generic/pktio/pcap.c
+++ b/platform/linux-generic/pktio/pcap.c
@@ -51,6 +51,8 @@ 
 #define PKTIO_PCAP_MTU (64 * 1024)
 static const char pcap_mac[] = {0x02, 0xe9, 0x34, 0x80, 0x73, 0x04};
 
+static int pcapif_stats_reset(pktio_entry_t *pktio_entry);
+
 static int _pcapif_parse_devname(pkt_pcap_t *pcap, const char *devname)
 {
 	char *tok;
@@ -156,6 +158,8 @@  static int pcapif_init(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry,
 	if (ret == 0 && (!pcap->rx && !pcap->tx_dump))
 		ret = -1;
 
+	(void)pcapif_stats_reset(pktio_entry);
+
 	return ret;
 }
 
@@ -251,6 +255,7 @@  static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, odp_packet_t pkts[],
 		}
 
 		packet_parse_l2(pkt_hdr);
+		pktio_entry->s.stats.in_octets += pkt_hdr->frame_len;
 
 		pkts[i] = pkt;
 		pkt = ODP_PACKET_INVALID;
@@ -261,6 +266,7 @@  static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, odp_packet_t pkts[],
 	if (pkt != ODP_PACKET_INVALID)
 		odp_packet_free(pkt);
 
+	pktio_entry->s.stats.in_ucast_pkts += i;
 	return i;
 }
 
@@ -293,7 +299,9 @@  static int pcapif_send_pkt(pktio_entry_t *pktio_entry, odp_packet_t pkts[],
 	ODP_ASSERT(pktio_entry->s.state == STATE_START);
 
 	for (i = 0; i < len; ++i) {
-		if (odp_packet_len(pkts[i]) > PKTIO_PCAP_MTU) {
+		int pkt_len = odp_packet_len(pkts[i]);
+
+		if (pkt_len > PKTIO_PCAP_MTU) {
 			if (i == 0)
 				return -1;
 			break;
@@ -302,9 +310,12 @@  static int pcapif_send_pkt(pktio_entry_t *pktio_entry, odp_packet_t pkts[],
 		if (_pcapif_dump_pkt(pcap, pkts[i]) != 0)
 			break;
 
+		pktio_entry->s.stats.out_octets += pkt_len;
 		odp_packet_free(pkts[i]);
 	}
 
+	pktio_entry->s.stats.out_ucast_pkts += i;
+
 	return i;
 }
 
@@ -369,9 +380,24 @@  static int pcapif_promisc_mode_get(pktio_entry_t *pktio_entry)
 	return pktio_entry->s.pkt_pcap.promisc;
 }
 
+static int pcapif_stats_reset(pktio_entry_t *pktio_entry)
+{
+	memset(&pktio_entry->s.stats, 0, sizeof(odp_pktio_stats_t));
+	return 0;
+}
+
+static int pcapif_stats(pktio_entry_t *pktio_entry,
+			odp_pktio_stats_t *stats)
+{
+	memcpy(stats, &pktio_entry->s.stats, sizeof(odp_pktio_stats_t));
+	return 0;
+}
+
 const pktio_if_ops_t pcap_pktio_ops = {
 	.open = pcapif_init,
 	.close = pcapif_close,
+	.stats = pcapif_stats,
+	.stats_reset = pcapif_stats_reset,
 	.recv = pcapif_recv_pkt,
 	.send = pcapif_send_pkt,
 	.mtu_get = pcapif_mtu_get,