aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic
diff options
context:
space:
mode:
authorMaxim Uvarov <maxim.uvarov@linaro.org>2016-01-22 15:45:38 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2016-02-08 20:45:23 +0300
commit26ce48a292e704cd84c0368bab6819316a6b9883 (patch)
tree2e171158a4524c45a7b02980386944c817cc870d /platform/linux-generic
parent9dfd8417d190d8c6d4ebbfd7c560d16302cbfe9a (diff)
linux-generic: pktio loop: implement statistics counters
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org> Reviewed-and-tested-by: Stuart Haslam <stuart.haslam@linaro.org>
Diffstat (limited to 'platform/linux-generic')
-rw-r--r--platform/linux-generic/pktio/loop.c42
1 files changed, 39 insertions, 3 deletions
diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c
index 3115f21f8..97aec9e96 100644
--- a/platform/linux-generic/pktio/loop.c
+++ b/platform/linux-generic/pktio/loop.c
@@ -20,6 +20,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)
{
@@ -36,6 +38,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(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 {
@@ -74,9 +81,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;
}
@@ -86,12 +97,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)
@@ -119,6 +140,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 = {
.init = NULL,
.term = NULL,
@@ -126,6 +160,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,