patches for DPDK stable branches
 help / color / mirror / Atom feed
From: Kevin Traynor <ktraynor@redhat.com>
To: Rahul Gupta <rahul.gupta@broadcom.com>
Cc: Ajit Khaparde <ajit.khaparde@broadcom.com>,
	dpdk stable <stable@dpdk.org>
Subject: [dpdk-stable] patch 'net/bnxt: fix L4 checksum error indication in Rx' has been queued to LTS release 18.11.3
Date: Wed, 28 Aug 2019 14:42:01 +0100	[thread overview]
Message-ID: <20190828134234.20547-25-ktraynor@redhat.com> (raw)
In-Reply-To: <20190828134234.20547-1-ktraynor@redhat.com>

Hi,

FYI, your patch has been queued to LTS release 18.11.3

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 09/04/19. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/kevintraynor/dpdk-stable-queue

This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable-queue/commit/214d50b648eef163de3901d048ed4d4c3a7c92b3

Thanks.

Kevin Traynor

---
From 214d50b648eef163de3901d048ed4d4c3a7c92b3 Mon Sep 17 00:00:00 2001
From: Rahul Gupta <rahul.gupta@broadcom.com>
Date: Wed, 17 Jul 2019 16:11:30 +0530
Subject: [PATCH] net/bnxt: fix L4 checksum error indication in Rx

[ upstream commit 04a681426d4999f9ff5278a3cc2c8127d25b6f76 ]

Update ol_flags correctly for checksum errors in case of tunnel and
non-tunnel packet.

Fixes: 65ee636872eb ("net/bnxt: fix Rx checksum flags")

Signed-off-by: Rahul Gupta <rahul.gupta@broadcom.com>
Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
---
 drivers/net/bnxt/bnxt_rxr.c |  43 ++++++++++---
 drivers/net/bnxt/bnxt_rxr.h | 118 ++++++++++++++++++++++++++++++------
 2 files changed, 132 insertions(+), 29 deletions(-)

diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c
index dc695e177..88ea94214 100644
--- a/drivers/net/bnxt/bnxt_rxr.c
+++ b/drivers/net/bnxt/bnxt_rxr.c
@@ -363,4 +363,5 @@ static int bnxt_rx_pkt(struct rte_mbuf **rx_pkt,
 	uint8_t agg_buf = 0;
 	uint16_t cmp_type;
+	uint32_t flags2_f = 0;
 
 	rxcmp = (struct rx_pkt_cmpl *)
@@ -441,17 +442,39 @@ static int bnxt_rx_pkt(struct rte_mbuf **rx_pkt,
 	}
 
-	if (likely(RX_CMP_IP_CS_OK(rxcmp1)))
-		mbuf->ol_flags |= PKT_RX_IP_CKSUM_GOOD;
-	else if (likely(RX_CMP_IP_CS_UNKNOWN(rxcmp1)))
-		mbuf->ol_flags |= PKT_RX_IP_CKSUM_UNKNOWN;
-	else
+	flags2_f = flags2_0xf(rxcmp1);
+	/* IP Checksum */
+	if (unlikely(((IS_IP_NONTUNNEL_PKT(flags2_f)) &&
+		      (RX_CMP_IP_CS_ERROR(rxcmp1))) ||
+		     (IS_IP_TUNNEL_PKT(flags2_f) &&
+		      (RX_CMP_IP_OUTER_CS_ERROR(rxcmp1))))) {
 		mbuf->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+	} else if (unlikely(RX_CMP_IP_CS_UNKNOWN(rxcmp1))) {
+		mbuf->ol_flags |= PKT_RX_IP_CKSUM_UNKNOWN;
+	} else {
+		mbuf->ol_flags |= PKT_RX_IP_CKSUM_GOOD;
+	}
 
-	if (likely(RX_CMP_L4_CS_OK(rxcmp1)))
-		mbuf->ol_flags |= PKT_RX_L4_CKSUM_GOOD;
-	else if (likely(RX_CMP_L4_CS_UNKNOWN(rxcmp1)))
+	/* L4 Checksum */
+	if (likely(IS_L4_NONTUNNEL_PKT(flags2_f))) {
+		if (unlikely(RX_CMP_L4_INNER_CS_ERR2(rxcmp1)))
+			mbuf->ol_flags |= PKT_RX_L4_CKSUM_BAD;
+		else
+			mbuf->ol_flags |= PKT_RX_L4_CKSUM_GOOD;
+	} else if (IS_L4_TUNNEL_PKT(flags2_f)) {
+		if (unlikely(RX_CMP_L4_INNER_CS_ERR2(rxcmp1)))
+			mbuf->ol_flags |= PKT_RX_L4_CKSUM_BAD;
+		else
+			mbuf->ol_flags |= PKT_RX_L4_CKSUM_GOOD;
+		if (unlikely(RX_CMP_L4_OUTER_CS_ERR2(rxcmp1))) {
+			mbuf->ol_flags |= PKT_RX_OUTER_L4_CKSUM_BAD;
+		} else if (unlikely(IS_L4_TUNNEL_PKT_ONLY_INNER_L4_CS
+				    (flags2_f))) {
+			mbuf->ol_flags |= PKT_RX_OUTER_L4_CKSUM_UNKNOWN;
+		} else {
+			mbuf->ol_flags |= PKT_RX_OUTER_L4_CKSUM_GOOD;
+		}
+	} else if (unlikely(RX_CMP_L4_CS_UNKNOWN(rxcmp1))) {
 		mbuf->ol_flags |= PKT_RX_L4_CKSUM_UNKNOWN;
-	else
-		mbuf->ol_flags |= PKT_RX_L4_CKSUM_BAD;
+	}
 
 	mbuf->packet_type = bnxt_parse_pkt_type(rxcmp, rxcmp1);
diff --git a/drivers/net/bnxt/bnxt_rxr.h b/drivers/net/bnxt/bnxt_rxr.h
index 3815a2199..15986ef88 100644
--- a/drivers/net/bnxt/bnxt_rxr.h
+++ b/drivers/net/bnxt/bnxt_rxr.h
@@ -25,22 +25,48 @@
 	((hdr_info) & 0x1ff)
 
-#define RX_CMP_L4_CS_BITS	\
-	rte_cpu_to_le_32(RX_PKT_CMPL_FLAGS2_L4_CS_CALC | \
-			 RX_PKT_CMPL_FLAGS2_T_L4_CS_CALC)
+#define flags2_0xf(rxcmp1)	\
+	(((rxcmp1)->flags2) & 0xf)
 
-#define RX_CMP_L4_CS_ERR_BITS	\
-	rte_cpu_to_le_32(RX_PKT_CMPL_ERRORS_L4_CS_ERROR | \
-			 RX_PKT_CMPL_ERRORS_T_L4_CS_ERROR)
+/* IP non tunnel can be with or without L4-
+ * Ether / (vlan) / IP|IP6 / UDP|TCP|SCTP Or
+ * Ether / (vlan) / outer IP|IP6 / ICMP
+ * we use '==' instead of '&' because tunnel pkts have all 4 fields set.
+ */
+#define IS_IP_NONTUNNEL_PKT(flags2_f)	\
+	(	\
+	 ((flags2_f) == \
+	  (rte_cpu_to_le_32(RX_PKT_CMPL_FLAGS2_IP_CS_CALC))) ||	\
+	 ((flags2_f) ==	\
+	  (rte_cpu_to_le_32(RX_PKT_CMPL_FLAGS2_IP_CS_CALC | \
+			    RX_PKT_CMPL_FLAGS2_L4_CS_CALC))) \
+	)
 
-#define RX_CMP_L4_CS_OK(rxcmp1)						\
-	    (((rxcmp1)->flags2 & RX_CMP_L4_CS_BITS) &&		\
-	     !((rxcmp1)->errors_v2 & RX_CMP_L4_CS_ERR_BITS))
+/* IP Tunnel pkt must have atleast tunnel-IP-calc set.
+ * again tunnel ie outer L4 is optional bcoz of
+ * Ether / (vlan) / outer IP|IP6 / GRE / Ether / IP|IP6 / UDP|TCP|SCTP
+ * Ether / (vlan) / outer IP|IP6 / outer UDP / VxLAN / Ether / IP|IP6 /
+ *           UDP|TCP|SCTP
+ * Ether / (vlan) / outer IP|IP6 / outer UDP / VXLAN-GPE / Ether / IP|IP6 /
+ *           UDP|TCP|SCTP
+ * Ether / (vlan) / outer IP|IP6 / outer UDP / VXLAN-GPE / IP|IP6 /
+ *           UDP|TCP|SCTP
+ * Ether / (vlan) / outer IP|IP6 / GRE / IP|IP6 / UDP|TCP|SCTP
+ * Ether / (vlan) / outer IP|IP6 / IP|IP6 / UDP|TCP|SCTP
+ * also inner L3 chksum error is not taken into consideration by DPDK.
+ */
+#define IS_IP_TUNNEL_PKT(flags2_f)	\
+	((flags2_f) & rte_cpu_to_le_32(RX_PKT_CMPL_FLAGS2_T_IP_CS_CALC))
 
-#define RX_CMP_L4_CS_UNKNOWN(rxcmp1)					\
-	    !((rxcmp1)->flags2 & RX_CMP_L4_CS_BITS)
+/* RX_PKT_CMPL_ERRORS_IP_CS_ERROR only for Non-tunnel pkts.
+ * For tunnel pkts RX_PKT_CMPL_ERRORS_IP_CS_ERROR is not accounted and treated
+ * as good csum pkt.
+ */
+#define RX_CMP_IP_CS_ERROR(rxcmp1)	\
+	((rxcmp1)->errors_v2 &	\
+	 rte_cpu_to_le_32(RX_PKT_CMPL_ERRORS_IP_CS_ERROR))
 
-#define RX_CMP_IP_CS_ERR_BITS	\
-	rte_cpu_to_le_32(RX_PKT_CMPL_ERRORS_IP_CS_ERROR | \
-			 RX_PKT_CMPL_ERRORS_T_IP_CS_ERROR)
+#define RX_CMP_IP_OUTER_CS_ERROR(rxcmp1)	\
+	((rxcmp1)->errors_v2 &	\
+	 rte_cpu_to_le_32(RX_PKT_CMPL_ERRORS_T_IP_CS_ERROR))
 
 #define RX_CMP_IP_CS_BITS	\
@@ -48,11 +74,65 @@
 			 RX_PKT_CMPL_FLAGS2_T_IP_CS_CALC)
 
-#define RX_CMP_IP_CS_OK(rxcmp1)						\
-		(((rxcmp1)->flags2 & RX_CMP_IP_CS_BITS) &&	\
-		!((rxcmp1)->errors_v2 & RX_CMP_IP_CS_ERR_BITS))
-
-#define RX_CMP_IP_CS_UNKNOWN(rxcmp1)					\
+#define RX_CMP_IP_CS_UNKNOWN(rxcmp1)	\
 		!((rxcmp1)->flags2 & RX_CMP_IP_CS_BITS)
 
+/* L4 non tunnel pkt-
+ * Ether / (vlan) / IP6 / UDP|TCP|SCTP
+ */
+#define IS_L4_NONTUNNEL_PKT(flags2_f)	\
+	( \
+	  ((flags2_f) == \
+	   (rte_cpu_to_le_32(RX_PKT_CMPL_FLAGS2_IP_CS_CALC |	\
+			     RX_PKT_CMPL_FLAGS2_L4_CS_CALC))))
+
+/* L4 tunnel pkt-
+ * Outer L4 is not mandatory. Eg: GRE-
+ * Ether / (vlan) / outer IP|IP6 / GRE / Ether / IP|IP6 / UDP|TCP|SCTP
+ * Ether / (vlan) / outer IP|IP6 / outer UDP / VxLAN / Ether / IP|IP6 /
+ *           UDP|TCP|SCTP
+ */
+#define	IS_L4_TUNNEL_PKT_INNER_OUTER_L4_CS(flags2_f)	\
+	 ((flags2_f) == \
+	  (rte_cpu_to_le_32(RX_PKT_CMPL_FLAGS2_IP_CS_CALC |	\
+			    RX_PKT_CMPL_FLAGS2_L4_CS_CALC |	\
+			    RX_PKT_CMPL_FLAGS2_T_IP_CS_CALC |	\
+			    RX_PKT_CMPL_FLAGS2_T_L4_CS_CALC)))
+
+#define IS_L4_TUNNEL_PKT_ONLY_INNER_L4_CS(flags2_f)	\
+	 ((flags2_f) == \
+	  (rte_cpu_to_le_32(RX_PKT_CMPL_FLAGS2_IP_CS_CALC |	\
+			    RX_PKT_CMPL_FLAGS2_L4_CS_CALC |	\
+			    RX_PKT_CMPL_FLAGS2_T_IP_CS_CALC)))
+
+#define IS_L4_TUNNEL_PKT(flags2_f)	\
+	(	\
+		IS_L4_TUNNEL_PKT_INNER_OUTER_L4_CS(flags2_f) || \
+		IS_L4_TUNNEL_PKT_ONLY_INNER_L4_CS(flags2_f)	\
+	)
+
+#define RX_CMP_L4_CS_BITS	\
+	rte_cpu_to_le_32(RX_PKT_CMPL_FLAGS2_L4_CS_CALC)
+
+#define RX_CMP_L4_CS_UNKNOWN(rxcmp1)					\
+	    !((rxcmp1)->flags2 & RX_CMP_L4_CS_BITS)
+
+#define RX_CMP_T_L4_CS_BITS	\
+	rte_cpu_to_le_32(RX_PKT_CMPL_FLAGS2_T_L4_CS_CALC)
+
+#define RX_CMP_T_L4_CS_UNKNOWN(rxcmp1)					\
+	    !((rxcmp1)->flags2 & RX_CMP_T_L4_CS_BITS)
+
+/* Outer L4 chksum error
+ */
+#define RX_CMP_L4_OUTER_CS_ERR2(rxcmp1)	\
+	 ((rxcmp1)->errors_v2 & \
+	  rte_cpu_to_le_32(RX_PKT_CMPL_ERRORS_T_L4_CS_ERROR))
+
+/* Inner L4 chksum error
+ */
+#define RX_CMP_L4_INNER_CS_ERR2(rxcmp1)	\
+	 ((rxcmp1)->errors_v2 & \
+	  rte_cpu_to_le_32(RX_PKT_CMPL_ERRORS_L4_CS_ERROR))
+
 #define BNXT_RX_POST_THRESH	32
 
-- 
2.20.1

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2019-08-28 14:32:33.271399099 +0100
+++ 0026-net-bnxt-fix-L4-checksum-error-indication-in-Rx.patch	2019-08-28 14:32:31.640957382 +0100
@@ -1 +1 @@
-From 04a681426d4999f9ff5278a3cc2c8127d25b6f76 Mon Sep 17 00:00:00 2001
+From 214d50b648eef163de3901d048ed4d4c3a7c92b3 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 04a681426d4999f9ff5278a3cc2c8127d25b6f76 ]
+
@@ -10 +11,0 @@
-Cc: stable@dpdk.org
@@ -20 +21 @@
-index 44303f3b0..54a2cf5fd 100644
+index dc695e177..88ea94214 100644
@@ -80 +81 @@
-index 6523b94c6..6a80c37c8 100644
+index 3815a2199..15986ef88 100644

  parent reply	other threads:[~2019-08-28 13:43 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-28 13:41 [dpdk-stable] patch 'crypto/openssl: fix free of asymmetric crypto keys' " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'kni: fix segmented mbuf data overflow' " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'crypto/dpaa2_sec: fix handling of session init failure' " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'mk: fix custom kernel directory name' " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'examples/ip_frag: fix stale content of ethdev info' " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'net/bnx2x: fix reading VF id' " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'net/bnx2x: fix link events polling for SRIOV' " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'net/bnx2x: fix fastpath SB allocation " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'net/tap: remove redundant declarations' " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'net/af_packet: remove redundant declaration' " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'net/vhost: " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'net/null: " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'net/pcap: " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'net/ring: " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'net/virtio_user: " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'raw/skeleton: " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'raw/dpaa2_cmdif: " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'net: adjust L2 length on soft VLAN insertion' " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'net/pcap: fix possible mbuf double freeing' " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'net/iavf: fix driver crash when enable TSO' " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'app/testpmd: fix show port info routine' " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'net/ena: fix admin CQ polling for 32-bit' " Kevin Traynor
2019-08-28 13:41 ` [dpdk-stable] patch 'net/bnxt: fix crash on probe failure' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix Tx hang after port stop/start' " Kevin Traynor
2019-08-28 13:42 ` Kevin Traynor [this message]
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: save the number of EM flow count' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix enabling/disabling interrupts' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: check invalid VNIC in cleanup path' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix compiler warning' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix RxQ count if ntuple filtering is disabled' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: check invalid VNIC id for firmware' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/avf: fix Rx bytes stats' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/i40e: fix MAC removal check' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/i40e: fix SFP X722 with FW4.16' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'doc: fix ethernet addresses in flow API guide' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix error handling in port start' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix check of address mapping' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix adding MAC address' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix unconditional wait in link update' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix setting primary MAC address' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix device init error path' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: reset filters before registering interrupts' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: retry IRQ callback deregistration' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix return values to standard error codes' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix lock release on getting NVM info' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix getting statistics' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix checking result of HWRM command' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix Rx interrupt vector' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: fix interrupt rearm logic' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/bnxt: remove unnecessary interrupt disable' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/e1000: fix buffer overrun while i219 processing DMA' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/mlx5: fix typos in comments' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/dpaa: check multi-segment external buffers' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/dpaa2: fix multi-segment Tx' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/ark: fix queue packet replacement' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/i40e: fix ethernet flow rule' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/i40e: fix flow director rule destroy' " Kevin Traynor
2019-08-28 13:42 ` [dpdk-stable] patch 'net/mlx5: remove redundant item from union' " Kevin Traynor

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=20190828134234.20547-25-ktraynor@redhat.com \
    --to=ktraynor@redhat.com \
    --cc=ajit.khaparde@broadcom.com \
    --cc=rahul.gupta@broadcom.com \
    --cc=stable@dpdk.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).