From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <thomas.monjalon@6wind.com>
Received: from mail-wi0-f177.google.com (mail-wi0-f177.google.com
 [209.85.212.177]) by dpdk.org (Postfix) with ESMTP id 90D8758D7
 for <dev@dpdk.org>; Thu, 12 Jun 2014 23:56:02 +0200 (CEST)
Received: by mail-wi0-f177.google.com with SMTP id r20so2344783wiv.16
 for <dev@dpdk.org>; Thu, 12 Jun 2014 14:56:17 -0700 (PDT)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20130820;
 h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to
 :references;
 bh=Z/P9Bskj2JFo6lRIQU86HUazeDXvxoGT5B41Qzq7eGI=;
 b=QDCgUTBwXk2Gfkg4JUJlM5oaTDn631Khy3IIuONYnjLr8EPi7KH+DX7/JKoje8Vx0n
 wHX3ha4Gm8dvB3rN7LVzE/Cj7PPOGEItpXBV/ERZoNqV+eUGHxwCjpPnIidaIl9z6paf
 5B/E0RhcMGsKUel2I96Smx49G5dkz2Q4SBEzZg87gfvusxfmlfnKqO+edsjLxLDO36KG
 3Bp9vznD5bmDsmSALxd28u2Lc4rdYGYRrOiKrQn9ZBYforfC1iJjLSatOLLCDF9w2hmM
 XMv2xSFFUFQcquECkxovapPWbCBSSxZnzsiKcGQfuBoazWkVq0h0/z3rWVPmO9KOWQZ3
 K+Pg==
X-Gm-Message-State: ALoCoQk1P0rN+YqyY1LRGcXZmYZhlbCIaXSzpOI2O0R+oynjSs2QWaeNfsmyH2CgrPr2fPzsLAOk
X-Received: by 10.180.84.168 with SMTP id a8mr10003248wiz.36.1402610177405;
 Thu, 12 Jun 2014 14:56:17 -0700 (PDT)
Received: from localhost.localdomain (136-92-190-109.dsl.ovh.fr.
 [109.190.92.136])
 by mx.google.com with ESMTPSA id l9sm6263418wic.21.2014.06.12.14.56.15
 for <multiple recipients>
 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);
 Thu, 12 Jun 2014 14:56:16 -0700 (PDT)
From: Thomas Monjalon <thomas.monjalon@6wind.com>
To: dev@dpdk.org
Date: Thu, 12 Jun 2014 23:55:41 +0200
Message-Id: <1402610141-27148-1-git-send-email-thomas.monjalon@6wind.com>
X-Mailer: git-send-email 2.0.0
In-Reply-To: <E115CCD9D858EF4F90C690B0DCB4D897082C9DD7@IRSMSX103.ger.corp.intel.com>
References: <E115CCD9D858EF4F90C690B0DCB4D897082C9DD7@IRSMSX103.ger.corp.intel.com>
Subject: [dpdk-dev] [PATCH v2] ethdev: add Rx error counters for missed,
	badcrc and badlen packets
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: patches and discussions about DPDK <dev.dpdk.org>
List-Unsubscribe: <http://dpdk.org/ml/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <http://dpdk.org/ml/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Thu, 12 Jun 2014 21:56:03 -0000

From: Ivan Boule <ivan.boule@6wind.com>

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>
---
 app/test-pmd/config.c               | 24 +++++++++++++++++-------
 app/test-pmd/testpmd.c              | 34 ++++++++++++++++++++--------------
 examples/load_balancer/runtime.c    |  2 +-
 lib/librte_ether/rte_ethdev.h       |  3 +++
 lib/librte_pmd_e1000/em_ethdev.c    |  9 +++++++--
 lib/librte_pmd_e1000/igb_ethdev.c   |  9 +++++++--
 lib/librte_pmd_ixgbe/ixgbe_ethdev.c | 12 +++++++++---
 7 files changed, 64 insertions(+), 29 deletions(-)

changes in v2:
- fix alignments when displaying fwd and nic statistics in testpmd

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index e0298c6..2137fd3 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -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);
 	}
 
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 2529dc3..0727fb3 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -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;
 
diff --git a/examples/load_balancer/runtime.c b/examples/load_balancer/runtime.c
index 438224a..9612392 100644
--- a/examples/load_balancer/runtime.c
+++ b/examples/load_balancer/runtime.c
@@ -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;
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 202c899..807aa42 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -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. */
diff --git a/lib/librte_pmd_e1000/em_ethdev.c b/lib/librte_pmd_e1000/em_ethdev.c
index 398838f..ef2408c 100644
--- a/lib/librte_pmd_e1000/em_ethdev.c
+++ b/lib/librte_pmd_e1000/em_ethdev.c
@@ -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;
diff --git a/lib/librte_pmd_e1000/igb_ethdev.c b/lib/librte_pmd_e1000/igb_ethdev.c
index f043c28..b24bf0a 100644
--- a/lib/librte_pmd_e1000/igb_ethdev.c
+++ b/lib/librte_pmd_e1000/igb_ethdev.c
@@ -1138,8 +1138,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;
diff --git a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
index 5f6a0f7..e2988e5 100644
--- a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
+++ b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
@@ -1816,9 +1816,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 */
-- 
2.0.0