All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gagandeep Singh <G.Singh@nxp.com>
To: "dev@dpdk.org" <dev@dpdk.org>,
	"ferruh.yigit@intel.com" <ferruh.yigit@intel.com>
Cc: Gagandeep Singh <G.Singh@nxp.com>
Subject: [dpdk-dev] [PATCH 12/13] net/enetc: enable Rx checksum offload validation
Date: Mon, 8 Apr 2019 11:22:47 +0000	[thread overview]
Message-ID: <1554745507-15089-13-git-send-email-g.singh@nxp.com> (raw)
In-Reply-To: <1554745507-15089-1-git-send-email-g.singh@nxp.com>

Checksum Validation on Rx is supported.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 doc/guides/nics/features/enetc.ini |   2 +
 drivers/net/enetc/base/enetc_hw.h  |   5 ++
 drivers/net/enetc/enetc_ethdev.c   |  15 +++++-
 drivers/net/enetc/enetc_rxtx.c     | 107 ++++++++++++++++++++++++++++++++-----
 4 files changed, 115 insertions(+), 14 deletions(-)

diff --git a/doc/guides/nics/features/enetc.ini b/doc/guides/nics/features/enetc.ini
index 101dc0a..39a5201 100644
--- a/doc/guides/nics/features/enetc.ini
+++ b/doc/guides/nics/features/enetc.ini
@@ -13,6 +13,8 @@ MTU update           = Y
 Jumbo frame          = Y
 Queue start/stop     = Y
 CRC offload          = Y
+L3 checksum offload  = P
+L4 checksum offload  = P
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/enetc/base/enetc_hw.h b/drivers/net/enetc/base/enetc_hw.h
index 261ad15..ff2bda5 100644
--- a/drivers/net/enetc/base/enetc_hw.h
+++ b/drivers/net/enetc/base/enetc_hw.h
@@ -99,6 +99,10 @@
 #define ENETC_PM0_RX_EN			BIT(1)
 #define ENETC_PM0_CRC			BIT(6)
 
+#define ENETC_PAR_PORT_CFG		0x03050
+#define L3_CKSUM			BIT(0)
+#define L4_CKSUM			BIT(1)
+
 #define ENETC_PM0_MAXFRM		0x08014
 #define ENETC_SET_TX_MTU(val)		((val) << 16)
 #define ENETC_SET_MAXFRM(val)		((val) & 0xffff)
@@ -182,6 +186,7 @@
 #define ENETC_TXBD_FLAGS_F		BIT(15)
 
 /* ENETC Parsed values (Little Endian) */
+#define ENETC_PARSE_ERROR		0x8000
 #define ENETC_PKT_TYPE_ETHER            0x0060
 #define ENETC_PKT_TYPE_IPV4             0x0000
 #define ENETC_PKT_TYPE_IPV6             0x0020
diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c
index a59a030..6b49fd4 100644
--- a/drivers/net/enetc/enetc_ethdev.c
+++ b/drivers/net/enetc/enetc_ethdev.c
@@ -163,7 +163,10 @@
 	dev_info->max_tx_queues = MAX_TX_RINGS;
 	dev_info->max_rx_pktlen = ENETC_MAC_MAXFRM_SIZE;
 	dev_info->rx_offload_capa =
-		(DEV_RX_OFFLOAD_KEEP_CRC |
+		(DEV_RX_OFFLOAD_IPV4_CKSUM |
+		 DEV_RX_OFFLOAD_UDP_CKSUM |
+		 DEV_RX_OFFLOAD_TCP_CKSUM |
+		 DEV_RX_OFFLOAD_KEEP_CRC |
 		 DEV_RX_OFFLOAD_JUMBO_FRAME);
 }
 
@@ -641,6 +644,7 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 	struct enetc_hw *enetc_hw = &hw->hw;
 	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
 	uint64_t rx_offloads = eth_conf->rxmode.offloads;
+	uint32_t checksum = L3_CKSUM | L4_CKSUM;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -666,6 +670,15 @@ int enetc_stats_get(struct rte_eth_dev *dev,
 		enetc_port_wr(enetc_hw, ENETC_PM0_CMD_CFG, config);
 	}
 
+	if (rx_offloads & DEV_RX_OFFLOAD_IPV4_CKSUM)
+		checksum &= ~L3_CKSUM;
+
+	if (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM))
+		checksum &= ~L4_CKSUM;
+
+	enetc_port_wr(enetc_hw, ENETC_PAR_PORT_CFG, checksum);
+
+
 	return 0;
 }
 
diff --git a/drivers/net/enetc/enetc_rxtx.c b/drivers/net/enetc/enetc_rxtx.c
index 7497a47..ed39665 100644
--- a/drivers/net/enetc/enetc_rxtx.c
+++ b/drivers/net/enetc/enetc_rxtx.c
@@ -114,69 +114,150 @@
 	return j;
 }
 
+static inline void enetc_slow_parsing(struct rte_mbuf *m,
+				     uint64_t parse_results)
+{
+	m->ol_flags &= ~(PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD);
+
+	switch (parse_results) {
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6;
+		m->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_TCP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_TCP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_UDP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_UDP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_SCTP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_SCTP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV4_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV4 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	case ENETC_PARSE_ERROR | ENETC_PKT_TYPE_IPV6_ICMP:
+		m->packet_type = RTE_PTYPE_L2_ETHER |
+				 RTE_PTYPE_L3_IPV6 |
+				 RTE_PTYPE_L4_ICMP;
+		m->ol_flags |= PKT_RX_IP_CKSUM_GOOD |
+			       PKT_RX_L4_CKSUM_BAD;
+		return;
+	/* More switch cases can be added */
+	default:
+		m->packet_type = RTE_PTYPE_UNKNOWN;
+		m->ol_flags |= PKT_RX_IP_CKSUM_UNKNOWN |
+			       PKT_RX_L4_CKSUM_UNKNOWN;
+	}
+}
+
 
 static inline void __attribute__((hot))
 enetc_dev_rx_parse(struct rte_mbuf *m, uint16_t parse_results)
 {
 	ENETC_PMD_DP_DEBUG("parse summary = 0x%x   ", parse_results);
+	m->ol_flags |= PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD;
 
-	m->packet_type = RTE_PTYPE_UNKNOWN;
 	switch (parse_results) {
 	case ENETC_PKT_TYPE_ETHER:
 		m->packet_type = RTE_PTYPE_L2_ETHER;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_TCP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_TCP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_UDP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_UDP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_SCTP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_SCTP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV4_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV4 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	case ENETC_PKT_TYPE_IPV6_ICMP:
 		m->packet_type = RTE_PTYPE_L2_ETHER |
 				 RTE_PTYPE_L3_IPV6 |
 				 RTE_PTYPE_L4_ICMP;
-		break;
+		return;
 	/* More switch cases can be added */
 	default:
-		m->packet_type = RTE_PTYPE_UNKNOWN;
+		enetc_slow_parsing(m, parse_results);
 	}
+
 }
 
 static int
-- 
1.9.1


  parent reply	other threads:[~2019-04-08 11:24 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-08 11:22 [dpdk-dev] [PATCH 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 01/13] net/enetc: support physical addressing mode Gagandeep Singh
2019-04-08 13:16   ` Ferruh Yigit
2019-04-08 11:22 ` [dpdk-dev] [PATCH 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 03/13] net/enetc: use correct buffer allocation API Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 05/13] net/enetc: add statistics APIs Gagandeep Singh
2019-04-08 11:35   ` David Marchand
2019-04-10 11:18     ` [dpdk-dev] [EXT] " Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 07/13] net/enetc: remove forward declarations Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
2019-04-08 11:22 ` [dpdk-dev] [PATCH 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
2019-04-08 11:22 ` Gagandeep Singh [this message]
2019-04-08 11:22 ` [dpdk-dev] [PATCH 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
2019-04-12  7:04 ` [dpdk-dev] [PATCH v2 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 01/13] net/enetc: support physical addressing mode Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 03/13] net/enetc: use correct buffer allocation API Gagandeep Singh
2019-04-12  8:37     ` Thomas Monjalon
2019-04-12  8:50       ` [dpdk-dev] [EXT] " Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 05/13] net/enetc: add basic statistics Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 07/13] net/enetc: remove forward declarations Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
2019-04-12  7:04   ` [dpdk-dev] [PATCH v2 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
2019-04-12 11:01   ` [dpdk-dev] [PATCH v3 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 01/13] net/enetc: support physical addressing mode Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 03/13] net/enetc: fix big endian build and correct buffer allocation Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 05/13] net/enetc: add basic statistics Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 07/13] net/enetc: remove forward declarations Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
2019-04-12 11:01     ` [dpdk-dev] [PATCH v3 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
2019-04-12 12:28     ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Gagandeep Singh
2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 01/13] net/enetc: support physical addressing mode Gagandeep Singh
2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 02/13] net/enetc: fix SMMU unhandled context fault Gagandeep Singh
2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 03/13] net/enetc: fix big endian build and correct buffer allocation Gagandeep Singh
2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 04/13] net/enetc: set interface mode for SXGMII Gagandeep Singh
2019-04-12 12:28       ` [dpdk-dev] [PATCH v4 05/13] net/enetc: add basic statistics Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 06/13] net/enetc: replace register read/write macros with functions Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 07/13] net/enetc: remove forward declarations Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 08/13] net/enetc: enable promiscuous and allmulticast feature Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 09/13] net/enetc: add MTU update and jumbo frames support Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 10/13] net/enetc: enable Rx-Tx queue start/stop feature Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 11/13] net/enetc: enable CRC offload feature Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 12/13] net/enetc: enable Rx checksum offload validation Gagandeep Singh
2019-04-12 12:29       ` [dpdk-dev] [PATCH v4 13/13] net/enetc: fix crash at high speed traffic Gagandeep Singh
2019-04-16  7:41       ` [dpdk-dev] [PATCH v4 00/13] ENETC PMD basic features and bug fixes Ferruh Yigit
2019-04-16  8:28         ` Ferruh Yigit

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1554745507-15089-13-git-send-email-g.singh@nxp.com \
    --to=g.singh@nxp.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.