aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Uvarov <maxim.uvarov@linaro.org>2016-01-22 15:45:39 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2016-02-08 20:45:23 +0300
commit6fb555a9abea4ffbf4a30cd913240bafa9cad7ea (patch)
tree0d924f730049f57fb402217d595269a2ed192570
parent26ce48a292e704cd84c0368bab6819316a6b9883 (diff)
linux-generic: pcap: implement pktio statistics counters
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org> Reviewed-and-tested-by: Stuart Haslam <stuart.haslam@linaro.org>
-rw-r--r--platform/linux-generic/pktio/pcap.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/platform/linux-generic/pktio/pcap.c b/platform/linux-generic/pktio/pcap.c
index 5ba0a639c..979bfed3b 100644
--- a/platform/linux-generic/pktio/pcap.c
+++ b/platform/linux-generic/pktio/pcap.c
@@ -49,6 +49,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;
@@ -154,6 +156,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;
}
@@ -249,6 +253,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;
@@ -259,6 +264,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;
}
@@ -291,7 +297,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;
@@ -300,9 +308,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;
}
@@ -367,9 +378,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,