Count oversized packets that are dropped by the interface

Signed-off-by: Ido Goshen <i...@cgstowernetworks.com>
---
 drivers/net/pcap/pcap_ethdev.c | 74 +++++++++++++++++++++-------------
 1 file changed, 45 insertions(+), 29 deletions(-)

diff --git a/drivers/net/pcap/pcap_ethdev.c b/drivers/net/pcap/pcap_ethdev.c
index ff98762058..46f18e9b10 100644
--- a/drivers/net/pcap/pcap_ethdev.c
+++ b/drivers/net/pcap/pcap_ethdev.c
@@ -54,7 +54,7 @@ struct queue_stat {
        volatile unsigned long rx_nombuf;
 };
 
-struct queue_missed_stat {
+struct queue_pcap_stat {
        /* last value retrieved from pcap */
        unsigned int pcap;
        /* stores values lost by pcap stop or rollover */
@@ -63,12 +63,19 @@ struct queue_missed_stat {
        unsigned long reset;
 };
 
+enum {
+       QUEUE_PCAP_STAT_FIRST = 0,
+       QUEUE_PCAP_STAT_MISSED = QUEUE_PCAP_STAT_FIRST,
+       QUEUE_PCAP_STAT_ERROR,
+       QUEUE_PCAP_STAT_NUM
+};
+
 struct pcap_rx_queue {
        uint16_t port_id;
        uint16_t queue_id;
        struct rte_mempool *mb_pool;
        struct queue_stat rx_stat;
-       struct queue_missed_stat missed_stat;
+       struct queue_pcap_stat queue_pcap_stat[QUEUE_PCAP_STAT_NUM];
        char name[PATH_MAX];
        char type[ETH_PCAP_ARG_MAXLEN];
 
@@ -144,54 +151,62 @@ static struct rte_eth_link pmd_link = {
 
 RTE_LOG_REGISTER_DEFAULT(eth_pcap_logtype, NOTICE);
 
-static struct queue_missed_stat*
-queue_missed_stat_update(struct rte_eth_dev *dev, unsigned int qid)
+static struct queue_pcap_stat*
+queue_pcap_stat_update(struct rte_eth_dev *dev, unsigned int qid, int type)
 {
        struct pmd_internals *internals = dev->data->dev_private;
-       struct queue_missed_stat *missed_stat =
-                       &internals->rx_queue[qid].missed_stat;
+       struct queue_pcap_stat *queue_pcap_stat =
+                       &internals->rx_queue[qid].queue_pcap_stat[type];
        const struct pmd_process_private *pp = dev->process_private;
        pcap_t *pcap = pp->rx_pcap[qid];
        struct pcap_stat stat;
+       u_int value;
 
        if (!pcap || (pcap_stats(pcap, &stat) != 0))
-               return missed_stat;
+               return queue_pcap_stat;
 
+       value = (type == QUEUE_PCAP_STAT_ERROR) ? stat.ps_ifdrop : stat.ps_drop;
        /* rollover check - best effort fixup assuming single rollover */
-       if (stat.ps_drop < missed_stat->pcap)
-               missed_stat->mnemonic += UINT_MAX;
-       missed_stat->pcap = stat.ps_drop;
+       if (value < queue_pcap_stat->pcap)
+               queue_pcap_stat->mnemonic += UINT_MAX;
+       queue_pcap_stat->pcap = value;
 
-       return missed_stat;
+       return queue_pcap_stat;
 }
 
 static void
-queue_missed_stat_on_stop_update(struct rte_eth_dev *dev, unsigned int qid)
+queue_pcap_stat_on_stop_update(struct rte_eth_dev *dev, unsigned int qid)
 {
-       struct queue_missed_stat *missed_stat =
-                       queue_missed_stat_update(dev, qid);
+       int type;
+       struct queue_pcap_stat *queue_pcap_stat;
 
-       missed_stat->mnemonic += missed_stat->pcap;
-       missed_stat->pcap = 0;
+       for (type = QUEUE_PCAP_STAT_FIRST; type < QUEUE_PCAP_STAT_NUM; type++) {
+               queue_pcap_stat = queue_pcap_stat_update(dev, qid, type);
+               queue_pcap_stat->mnemonic += queue_pcap_stat->pcap;
+               queue_pcap_stat->pcap = 0;
+       }
 }
 
 static void
-queue_missed_stat_reset(struct rte_eth_dev *dev, unsigned int qid)
+queue_pcap_stat_reset(struct rte_eth_dev *dev, unsigned int qid)
 {
-       struct queue_missed_stat *missed_stat =
-                       queue_missed_stat_update(dev, qid);
+       int type;
+       struct queue_pcap_stat *queue_pcap_stat;
 
-       missed_stat->reset = missed_stat->pcap;
-       missed_stat->mnemonic = 0;
+       for (type = QUEUE_PCAP_STAT_FIRST; type < QUEUE_PCAP_STAT_NUM; type++) {
+               queue_pcap_stat = queue_pcap_stat_update(dev, qid, type);
+               queue_pcap_stat->reset = queue_pcap_stat->pcap;
+               queue_pcap_stat->mnemonic = 0;
+       }
 }
 
 static unsigned long
-queue_missed_stat_get(struct rte_eth_dev *dev, unsigned int qid)
+queue_pcap_stat_get(struct rte_eth_dev *dev, unsigned int qid, int type)
 {
-       const struct queue_missed_stat *missed_stat =
-                       queue_missed_stat_update(dev, qid);
+       const struct queue_pcap_stat *queue_pcap_stat =
+                       queue_pcap_stat_update(dev, qid, type);
 
-       return missed_stat->pcap + missed_stat->mnemonic - missed_stat->reset;
+       return queue_pcap_stat->pcap + queue_pcap_stat->mnemonic - 
queue_pcap_stat->reset;
 }
 
 static int
@@ -684,7 +699,7 @@ eth_dev_stop(struct rte_eth_dev *dev)
 
        /* Special iface case. Single pcap is open and shared between tx/rx. */
        if (internals->single_iface) {
-               queue_missed_stat_on_stop_update(dev, 0);
+               queue_pcap_stat_on_stop_update(dev, 0);
                if (pp->tx_pcap[0] != NULL) {
                        pcap_close(pp->tx_pcap[0]);
                        pp->tx_pcap[0] = NULL;
@@ -707,7 +722,7 @@ eth_dev_stop(struct rte_eth_dev *dev)
 
        for (i = 0; i < dev->data->nb_rx_queues; i++) {
                if (pp->rx_pcap[i] != NULL) {
-                       queue_missed_stat_on_stop_update(dev, i);
+                       queue_pcap_stat_on_stop_update(dev, i);
                        pcap_close(pp->rx_pcap[i]);
                        pp->rx_pcap[i] = NULL;
                }
@@ -766,7 +781,8 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats 
*stats)
                rx_err_total += internal->rx_queue[i].rx_stat.err_pkts;
                rx_packets_total += stats->q_ipackets[i];
                rx_bytes_total += stats->q_ibytes[i];
-               rx_missed_total += queue_missed_stat_get(dev, i);
+               rx_missed_total += queue_pcap_stat_get(dev, i, 
QUEUE_PCAP_STAT_MISSED);
+               rx_err_total += queue_pcap_stat_get(dev, i, 
QUEUE_PCAP_STAT_ERROR);
        }
 
        for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS &&
@@ -801,7 +817,7 @@ eth_stats_reset(struct rte_eth_dev *dev)
                internal->rx_queue[i].rx_stat.bytes = 0;
                internal->rx_queue[i].rx_stat.err_pkts = 0;
                internal->rx_queue[i].rx_stat.rx_nombuf = 0;
-               queue_missed_stat_reset(dev, i);
+               queue_pcap_stat_reset(dev, i);
        }
 
        for (i = 0; i < dev->data->nb_tx_queues; i++) {
-- 
2.17.1

Reply via email to