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