From: Long Li <lon...@microsoft.com>

Report packet statistics.

Signed-off-by: Long Li <lon...@microsoft.com>
---
 doc/guides/nics/features/mana.ini |  2 +
 drivers/net/mana/mana.c           | 77 +++++++++++++++++++++++++++++++
 2 files changed, 79 insertions(+)

diff --git a/doc/guides/nics/features/mana.ini 
b/doc/guides/nics/features/mana.ini
index bd50fe81d6..a77d6f2249 100644
--- a/doc/guides/nics/features/mana.ini
+++ b/doc/guides/nics/features/mana.ini
@@ -4,6 +4,7 @@
 ; Refer to default.ini for the full list of available PMD features.
 ;
 [Features]
+Basic stats          = Y
 Free Tx mbuf on demand = Y
 Link status          = P
 Linux                = Y
@@ -14,5 +15,6 @@ Queue start/stop     = Y
 Removal event        = Y
 RSS hash             = Y
 Speed capabilities   = P
+Stats per queue      = Y
 Usage doc            = Y
 x86-64               = Y
diff --git a/drivers/net/mana/mana.c b/drivers/net/mana/mana.c
index b919d86500..b514a4cfef 100644
--- a/drivers/net/mana/mana.c
+++ b/drivers/net/mana/mana.c
@@ -530,6 +530,79 @@ static int mana_dev_link_update(struct rte_eth_dev *dev,
        return rte_eth_linkstatus_set(dev, &link);
 }
 
+static int mana_dev_stats_get(struct rte_eth_dev *dev,
+                             struct rte_eth_stats *stats)
+{
+       unsigned int i;
+
+       for (i = 0; i < dev->data->nb_tx_queues; i++) {
+               struct mana_txq *txq = dev->data->tx_queues[i];
+
+               if (!txq)
+                       continue;
+
+               stats->opackets = txq->stats.packets;
+               stats->obytes = txq->stats.bytes;
+               stats->oerrors = txq->stats.errors;
+
+               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {
+                       stats->q_opackets[i] = txq->stats.packets;
+                       stats->q_obytes[i] = txq->stats.bytes;
+               }
+       }
+
+       stats->rx_nombuf = 0;
+       for (i = 0; i < dev->data->nb_rx_queues; i++) {
+               struct mana_rxq *rxq = dev->data->rx_queues[i];
+
+               if (!rxq)
+                       continue;
+
+               stats->ipackets = rxq->stats.packets;
+               stats->ibytes = rxq->stats.bytes;
+               stats->ierrors = rxq->stats.errors;
+
+               /* There is no good way to get stats->imissed, not setting it */
+
+               if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {
+                       stats->q_ipackets[i] = rxq->stats.packets;
+                       stats->q_ibytes[i] = rxq->stats.bytes;
+               }
+
+               stats->rx_nombuf += rxq->stats.nombuf;
+       }
+
+       return 0;
+}
+
+static int
+mana_dev_stats_reset(struct rte_eth_dev *dev __rte_unused)
+{
+       unsigned int i;
+
+       PMD_INIT_FUNC_TRACE();
+
+       for (i = 0; i < dev->data->nb_tx_queues; i++) {
+               struct mana_txq *txq = dev->data->tx_queues[i];
+
+               if (!txq)
+                       continue;
+
+               memset(&txq->stats, 0, sizeof(txq->stats));
+       }
+
+       for (i = 0; i < dev->data->nb_rx_queues; i++) {
+               struct mana_rxq *rxq = dev->data->rx_queues[i];
+
+               if (!rxq)
+                       continue;
+
+               memset(&rxq->stats, 0, sizeof(rxq->stats));
+       }
+
+       return 0;
+}
+
 const struct eth_dev_ops mana_dev_ops = {
        .dev_configure          = mana_dev_configure,
        .dev_start              = mana_dev_start,
@@ -546,9 +619,13 @@ const struct eth_dev_ops mana_dev_ops = {
        .rx_queue_setup         = mana_dev_rx_queue_setup,
        .rx_queue_release       = mana_dev_rx_queue_release,
        .link_update            = mana_dev_link_update,
+       .stats_get              = mana_dev_stats_get,
+       .stats_reset            = mana_dev_stats_reset,
 };
 
 const struct eth_dev_ops mana_dev_sec_ops = {
+       .stats_get = mana_dev_stats_get,
+       .stats_reset = mana_dev_stats_reset,
        .dev_infos_get = mana_dev_info_get,
 };
 
-- 
2.17.1

Reply via email to