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

diff --git a/platform/linux-generic/pktio/loop.c 
b/platform/linux-generic/pktio/loop.c
index ce19add..ec65fd4 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 = {
        .init = NULL,
        .term = NULL,
@@ -114,6 +144,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,
-- 
1.9.1

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to