dpdk: fix the outer ipv4 checksum 63/32763/3
authorMohsin Kazmi <sykazmi@cisco.com>
Wed, 15 Sep 2021 13:57:29 +0000 (15:57 +0200)
committerDamjan Marion <dmarion@me.com>
Thu, 16 Sep 2021 10:40:15 +0000 (10:40 +0000)
Type: fix

Change-Id: Ibc476b807ba0310f0cc926b0e386831ef0cbcc25
Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
build/external/patches/dpdk_21.05/0001-net-fix-Intel-specific-Prepare-the-outer-IPv4-hdr-fo.patch [new file with mode: 0644]
build/external/patches/dpdk_21.08/0001-net-fix-Intel-specific-Prepare-the-outer-IPv4-hdr-fo.patch [new file with mode: 0644]

diff --git a/build/external/patches/dpdk_21.05/0001-net-fix-Intel-specific-Prepare-the-outer-IPv4-hdr-fo.patch b/build/external/patches/dpdk_21.05/0001-net-fix-Intel-specific-Prepare-the-outer-IPv4-hdr-fo.patch
new file mode 100644 (file)
index 0000000..9d438e1
--- /dev/null
@@ -0,0 +1,55 @@
+From cbff9112647213bf4376a0c78032d15585a3b5b6 Mon Sep 17 00:00:00 2001
+From: Mohsin Kazmi <mohsin.kazmi14@gmail.com>
+Date: Thu, 17 Jun 2021 14:57:01 +0200
+Subject: [PATCH] net: fix Intel-specific Prepare the outer IPv4 hdr for
+ checksum
+
+Preparation of the headers for the hardware offload
+misses the outer IPv4 checksum offload.
+It results in bad checksum computed by hardware NIC.
+
+This patch fixes the issue by setting the outer IPv4
+checksum field to 0.
+
+Fixes: 4fb7e803eb1a ("ethdev: add Tx preparation")
+Cc: stable@dpdk.org
+
+Signed-off-by: Mohsin Kazmi <mohsin.kazmi14@gmail.com>
+Acked-by: Qi Zhang <qi.z.zhang@intel.com>
+Acked-by: Olivier Matz <olivier.matz@6wind.com>
+---
+ lib/net/rte_net.h | 15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+diff --git a/lib/net/rte_net.h b/lib/net/rte_net.h
+index 434435ffa2..42639bc154 100644
+--- a/lib/net/rte_net.h
++++ b/lib/net/rte_net.h
+@@ -125,11 +125,22 @@ rte_net_intel_cksum_flags_prepare(struct rte_mbuf *m, uint64_t ol_flags)
+        * Mainly it is required to avoid fragmented headers check if
+        * no offloads are requested.
+        */
+-      if (!(ol_flags & (PKT_TX_IP_CKSUM | PKT_TX_L4_MASK | PKT_TX_TCP_SEG)))
++      if (!(ol_flags & (PKT_TX_IP_CKSUM | PKT_TX_L4_MASK | PKT_TX_TCP_SEG |
++                        PKT_TX_OUTER_IP_CKSUM)))
+               return 0;
+-      if (ol_flags & (PKT_TX_OUTER_IPV4 | PKT_TX_OUTER_IPV6))
++      if (ol_flags & (PKT_TX_OUTER_IPV4 | PKT_TX_OUTER_IPV6)) {
+               inner_l3_offset += m->outer_l2_len + m->outer_l3_len;
++              /*
++               * prepare outer IPv4 header checksum by setting it to 0,
++               * in order to be computed by hardware NICs.
++               */
++              if (ol_flags & PKT_TX_OUTER_IP_CKSUM) {
++                      ipv4_hdr = rte_pktmbuf_mtod_offset(m,
++                                      struct rte_ipv4_hdr *, m->outer_l2_len);
++                      ipv4_hdr->hdr_checksum = 0;
++              }
++      }
+       /*
+        * Check if headers are fragmented.
+-- 
+2.17.1
+
diff --git a/build/external/patches/dpdk_21.08/0001-net-fix-Intel-specific-Prepare-the-outer-IPv4-hdr-fo.patch b/build/external/patches/dpdk_21.08/0001-net-fix-Intel-specific-Prepare-the-outer-IPv4-hdr-fo.patch
new file mode 100644 (file)
index 0000000..9d438e1
--- /dev/null
@@ -0,0 +1,55 @@
+From cbff9112647213bf4376a0c78032d15585a3b5b6 Mon Sep 17 00:00:00 2001
+From: Mohsin Kazmi <mohsin.kazmi14@gmail.com>
+Date: Thu, 17 Jun 2021 14:57:01 +0200
+Subject: [PATCH] net: fix Intel-specific Prepare the outer IPv4 hdr for
+ checksum
+
+Preparation of the headers for the hardware offload
+misses the outer IPv4 checksum offload.
+It results in bad checksum computed by hardware NIC.
+
+This patch fixes the issue by setting the outer IPv4
+checksum field to 0.
+
+Fixes: 4fb7e803eb1a ("ethdev: add Tx preparation")
+Cc: stable@dpdk.org
+
+Signed-off-by: Mohsin Kazmi <mohsin.kazmi14@gmail.com>
+Acked-by: Qi Zhang <qi.z.zhang@intel.com>
+Acked-by: Olivier Matz <olivier.matz@6wind.com>
+---
+ lib/net/rte_net.h | 15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+diff --git a/lib/net/rte_net.h b/lib/net/rte_net.h
+index 434435ffa2..42639bc154 100644
+--- a/lib/net/rte_net.h
++++ b/lib/net/rte_net.h
+@@ -125,11 +125,22 @@ rte_net_intel_cksum_flags_prepare(struct rte_mbuf *m, uint64_t ol_flags)
+        * Mainly it is required to avoid fragmented headers check if
+        * no offloads are requested.
+        */
+-      if (!(ol_flags & (PKT_TX_IP_CKSUM | PKT_TX_L4_MASK | PKT_TX_TCP_SEG)))
++      if (!(ol_flags & (PKT_TX_IP_CKSUM | PKT_TX_L4_MASK | PKT_TX_TCP_SEG |
++                        PKT_TX_OUTER_IP_CKSUM)))
+               return 0;
+-      if (ol_flags & (PKT_TX_OUTER_IPV4 | PKT_TX_OUTER_IPV6))
++      if (ol_flags & (PKT_TX_OUTER_IPV4 | PKT_TX_OUTER_IPV6)) {
+               inner_l3_offset += m->outer_l2_len + m->outer_l3_len;
++              /*
++               * prepare outer IPv4 header checksum by setting it to 0,
++               * in order to be computed by hardware NICs.
++               */
++              if (ol_flags & PKT_TX_OUTER_IP_CKSUM) {
++                      ipv4_hdr = rte_pktmbuf_mtod_offset(m,
++                                      struct rte_ipv4_hdr *, m->outer_l2_len);
++                      ipv4_hdr->hdr_checksum = 0;
++              }
++      }
+       /*
+        * Check if headers are fragmented.
+-- 
+2.17.1
+