ethdev: add Rx error counters for missed, badcrc and badlen packets
authorIvan Boule <ivan.boule@6wind.com>
Thu, 12 Jun 2014 21:55:41 +0000 (23:55 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Tue, 17 Jun 2014 09:28:14 +0000 (11:28 +0200)
Split input error stats to have a better understanding of why packets
have been dropped.
Keep ierrors field untouched for backward compatibility.

Signed-off-by: Ivan Boule <ivan.boule@6wind.com>
Signed-off-by: David Marchand <david.marchand@6wind.com>
Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
app/test-pmd/config.c
app/test-pmd/testpmd.c
examples/load_balancer/runtime.c
lib/librte_ether/rte_ethdev.h
lib/librte_pmd_e1000/em_ethdev.c
lib/librte_pmd_e1000/igb_ethdev.c
lib/librte_pmd_ixgbe/ixgbe_ethdev.c

index 7a505a1..05071a8 100644 (file)
@@ -126,19 +126,29 @@ nic_stats_display(portid_t port_id)
               nic_stats_border, port_id, nic_stats_border);
 
        if ((!port->rx_queue_stats_mapping_enabled) && (!port->tx_queue_stats_mapping_enabled)) {
-               printf("  RX-packets: %-10"PRIu64" RX-errors: %-10"PRIu64"RX-bytes: "
-                      "%-"PRIu64"\n"
-                      "  TX-packets: %-10"PRIu64" TX-errors: %-10"PRIu64"TX-bytes: "
+               printf("  RX-packets: %-10"PRIu64" RX-missed: %-10"PRIu64" RX-bytes:  "
+                      "%-"PRIu64"\n",
+                      stats.ipackets, stats.imissed, stats.ibytes);
+               printf("  RX-badcrc:  %-10"PRIu64" RX-badlen: %-10"PRIu64" RX-errors: "
+                      "%-"PRIu64"\n",
+                      stats.ibadcrc, stats.ibadlen, stats.ierrors);
+               printf("  RX-nombuf:  %-10"PRIu64"\n",
+                      stats.rx_nombuf);
+               printf("  TX-packets: %-10"PRIu64" TX-errors: %-10"PRIu64" TX-bytes:  "
                       "%-"PRIu64"\n",
-                      stats.ipackets, stats.ierrors, stats.ibytes,
                       stats.opackets, stats.oerrors, stats.obytes);
        }
        else {
                printf("  RX-packets:              %10"PRIu64"    RX-errors: %10"PRIu64
-                      "    RX-bytes: %10"PRIu64"\n"
-                      "  TX-packets:              %10"PRIu64"    TX-errors: %10"PRIu64
+                      "    RX-bytes: %10"PRIu64"\n",
+                      stats.ipackets, stats.ierrors, stats.ibytes);
+               printf("  RX-badcrc:               %10"PRIu64"    RX-badlen: %10"PRIu64
+                      "  RX-errors:  %10"PRIu64"\n",
+                      stats.ibadcrc, stats.ibadlen, stats.ierrors);
+               printf("  RX-nombuf:               %10"PRIu64"\n",
+                      stats.rx_nombuf);
+               printf("  TX-packets:              %10"PRIu64"    TX-errors: %10"PRIu64
                       "    TX-bytes: %10"PRIu64"\n",
-                      stats.ipackets, stats.ierrors, stats.ibytes,
                       stats.opackets, stats.oerrors, stats.obytes);
        }
 
index 2529dc3..0727fb3 100644 (file)
@@ -770,39 +770,45 @@ fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats)
        if ((!port->rx_queue_stats_mapping_enabled) && (!port->tx_queue_stats_mapping_enabled)) {
                printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
                       "%-"PRIu64"\n",
-                      stats->ipackets, stats->ierrors,
-                      (uint64_t) (stats->ipackets + stats->ierrors));
+                      stats->ipackets, stats->imissed,
+                      (uint64_t) (stats->ipackets + stats->imissed));
 
                if (cur_fwd_eng == &csum_fwd_engine)
                        printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64" \n",
                               port->rx_bad_ip_csum, port->rx_bad_l4_csum);
+               if (((stats->ierrors - stats->imissed) + stats->rx_nombuf) > 0) {
+                       printf("  RX-badcrc:  %-14"PRIu64" RX-badlen:  %-14"PRIu64
+                              "RX-error: %-"PRIu64"\n",
+                              stats->ibadcrc, stats->ibadlen, stats->ierrors);
+                       printf("  RX-nombufs: %-14"PRIu64"\n", stats->rx_nombuf);
+               }
 
                printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
                       "%-"PRIu64"\n",
                       stats->opackets, port->tx_dropped,
                       (uint64_t) (stats->opackets + port->tx_dropped));
-
-               if (stats->rx_nombuf > 0)
-                       printf("  RX-nombufs: %-14"PRIu64"\n", stats->rx_nombuf);
-
        }
        else {
                printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
                       "%14"PRIu64"\n",
-                      stats->ipackets, stats->ierrors,
-                      (uint64_t) (stats->ipackets + stats->ierrors));
+                      stats->ipackets, stats->imissed,
+                      (uint64_t) (stats->ipackets + stats->imissed));
 
                if (cur_fwd_eng == &csum_fwd_engine)
                        printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"\n",
                               port->rx_bad_ip_csum, port->rx_bad_l4_csum);
+               if (((stats->ierrors - stats->imissed) + stats->rx_nombuf) > 0) {
+                       printf("  RX-badcrc:              %14"PRIu64"    RX-badlen: %14"PRIu64
+                              "    RX-error:%"PRIu64"\n",
+                              stats->ibadcrc, stats->ibadlen, stats->ierrors);
+                       printf("  RX-nombufs:             %14"PRIu64"\n",
+                              stats->rx_nombuf);
+               }
 
                printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
                       "%14"PRIu64"\n",
                       stats->opackets, port->tx_dropped,
                       (uint64_t) (stats->opackets + port->tx_dropped));
-
-               if (stats->rx_nombuf > 0)
-                       printf("  RX-nombufs:%14"PRIu64"\n", stats->rx_nombuf);
        }
 
        /* Display statistics of XON/XOFF pause frames, if any. */
@@ -1164,8 +1170,8 @@ stop_packet_forwarding(void)
                port->stats.ibytes = 0;
                stats.obytes   -= port->stats.obytes;
                port->stats.obytes = 0;
-               stats.ierrors  -= port->stats.ierrors;
-               port->stats.ierrors = 0;
+               stats.imissed  -= port->stats.imissed;
+               port->stats.imissed = 0;
                stats.oerrors  -= port->stats.oerrors;
                port->stats.oerrors = 0;
                stats.rx_nombuf -= port->stats.rx_nombuf;
@@ -1177,7 +1183,7 @@ stop_packet_forwarding(void)
 
                total_recv += stats.ipackets;
                total_xmit += stats.opackets;
-               total_rx_dropped += stats.ierrors;
+               total_rx_dropped += stats.imissed;
                total_tx_dropped += port->tx_dropped;
                total_rx_nombuf  += stats.rx_nombuf;
 
index 438224a..9612392 100644 (file)
@@ -215,7 +215,7 @@ app_lcore_io_rx(
                        printf("I/O RX %u in (NIC port %u): NIC drop ratio = %.2f avg burst size = %.2f\n",
                                lcore,
                                (unsigned) port,
-                               (double) stats.ierrors / (double) (stats.ierrors + stats.ipackets),
+                               (double) stats.imissed / (double) (stats.imissed + stats.ipackets),
                                ((double) lp->rx.nic_queues_count[i]) / ((double) lp->rx.nic_queues_iters[i]));
                        lp->rx.nic_queues_iters[i] = 0;
                        lp->rx.nic_queues_count[i] = 0;
index d2d7d5e..6fb0f43 100644 (file)
@@ -186,6 +186,9 @@ struct rte_eth_stats {
        uint64_t opackets;  /**< Total number of successfully transmitted packets.*/
        uint64_t ibytes;    /**< Total number of successfully received bytes. */
        uint64_t obytes;    /**< Total number of successfully transmitted bytes. */
+       uint64_t imissed;   /**< Total of RX missed packets (e.g full FIFO). */
+       uint64_t ibadcrc;   /**< Total of RX packets with CRC error. */
+       uint64_t ibadlen;   /**< Total of RX packets with bad length. */
        uint64_t ierrors;   /**< Total number of erroneous received packets. */
        uint64_t oerrors;   /**< Total number of failed transmitted packets. */
        uint64_t imcasts;   /**< Total number of multicast received packets. */
index f025338..dc0082f 100644 (file)
@@ -793,8 +793,13 @@ eth_em_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)
                return;
 
        /* Rx Errors */
-       rte_stats->ierrors = stats->rxerrc + stats->crcerrs + stats->algnerrc +
-               stats->ruc + stats->roc + stats->mpc + stats->cexterr;
+       rte_stats->ibadcrc = stats->crcerrs;
+       rte_stats->ibadlen = stats->rlec + stats->ruc + stats->roc;
+       rte_stats->imissed = stats->mpc;
+       rte_stats->ierrors = rte_stats->ibadcrc +
+                            rte_stats->ibadlen +
+                            rte_stats->imissed +
+                            stats->rxerrc + stats->algnerrc + stats->cexterr;
 
        /* Tx Errors */
        rte_stats->oerrors = stats->ecol + stats->latecol;
index e651e3d..ae7e03b 100644 (file)
@@ -1140,8 +1140,13 @@ eth_igb_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats)
                return;
 
        /* Rx Errors */
-       rte_stats->ierrors = stats->rxerrc + stats->crcerrs + stats->algnerrc +
-           stats->ruc + stats->roc + stats->mpc + stats->cexterr;
+       rte_stats->ibadcrc = stats->crcerrs;
+       rte_stats->ibadlen = stats->rlec + stats->ruc + stats->roc;
+       rte_stats->imissed = stats->mpc;
+       rte_stats->ierrors = rte_stats->ibadcrc +
+                            rte_stats->ibadlen +
+                            rte_stats->imissed +
+                            stats->rxerrc + stats->algnerrc + stats->cexterr;
 
        /* Tx Errors */
        rte_stats->oerrors = stats->ecol + stats->latecol;
index 40c8343..fbeb1f4 100644 (file)
@@ -1818,9 +1818,15 @@ ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
        }
 
        /* Rx Errors */
-       stats->ierrors = total_missed_rx + hw_stats->crcerrs +
-               hw_stats->rlec;
-
+       stats->ibadcrc  = hw_stats->crcerrs;
+       stats->ibadlen  = hw_stats->rlec + hw_stats->ruc + hw_stats->roc;
+       stats->imissed  = total_missed_rx;
+       stats->ierrors  = stats->ibadcrc +
+                         stats->ibadlen +
+                         stats->imissed +
+                         hw_stats->illerrc + hw_stats->errbc;
+
+       /* Tx Errors */
        stats->oerrors  = 0;
 
        /* XON/XOFF pause frames */