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

diff --git a/platform/linux-generic/pktio/loop.c 
b/platform/linux-generic/pktio/loop.c
index 3f86104..d96cab4 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 = {
        .name = "loop",
        .init = NULL,
@@ -127,6 +161,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