dpdk: fix the outer ipv4 checksum
[vpp.git] / build / external / patches / dpdk_21.08 / 0001-net-fix-Intel-specific-Prepare-the-outer-IPv4-hdr-fo.patch
1 From cbff9112647213bf4376a0c78032d15585a3b5b6 Mon Sep 17 00:00:00 2001
2 From: Mohsin Kazmi <mohsin.kazmi14@gmail.com>
3 Date: Thu, 17 Jun 2021 14:57:01 +0200
4 Subject: [PATCH] net: fix Intel-specific Prepare the outer IPv4 hdr for
5  checksum
6
7 Preparation of the headers for the hardware offload
8 misses the outer IPv4 checksum offload.
9 It results in bad checksum computed by hardware NIC.
10
11 This patch fixes the issue by setting the outer IPv4
12 checksum field to 0.
13
14 Fixes: 4fb7e803eb1a ("ethdev: add Tx preparation")
15 Cc: stable@dpdk.org
16
17 Signed-off-by: Mohsin Kazmi <mohsin.kazmi14@gmail.com>
18 Acked-by: Qi Zhang <qi.z.zhang@intel.com>
19 Acked-by: Olivier Matz <olivier.matz@6wind.com>
20 ---
21  lib/net/rte_net.h | 15 +++++++++++++--
22  1 file changed, 13 insertions(+), 2 deletions(-)
23
24 diff --git a/lib/net/rte_net.h b/lib/net/rte_net.h
25 index 434435ffa2..42639bc154 100644
26 --- a/lib/net/rte_net.h
27 +++ b/lib/net/rte_net.h
28 @@ -125,11 +125,22 @@ rte_net_intel_cksum_flags_prepare(struct rte_mbuf *m, uint64_t ol_flags)
29          * Mainly it is required to avoid fragmented headers check if
30          * no offloads are requested.
31          */
32 -       if (!(ol_flags & (PKT_TX_IP_CKSUM | PKT_TX_L4_MASK | PKT_TX_TCP_SEG)))
33 +       if (!(ol_flags & (PKT_TX_IP_CKSUM | PKT_TX_L4_MASK | PKT_TX_TCP_SEG |
34 +                         PKT_TX_OUTER_IP_CKSUM)))
35                 return 0;
36  
37 -       if (ol_flags & (PKT_TX_OUTER_IPV4 | PKT_TX_OUTER_IPV6))
38 +       if (ol_flags & (PKT_TX_OUTER_IPV4 | PKT_TX_OUTER_IPV6)) {
39                 inner_l3_offset += m->outer_l2_len + m->outer_l3_len;
40 +               /*
41 +                * prepare outer IPv4 header checksum by setting it to 0,
42 +                * in order to be computed by hardware NICs.
43 +                */
44 +               if (ol_flags & PKT_TX_OUTER_IP_CKSUM) {
45 +                       ipv4_hdr = rte_pktmbuf_mtod_offset(m,
46 +                                       struct rte_ipv4_hdr *, m->outer_l2_len);
47 +                       ipv4_hdr->hdr_checksum = 0;
48 +               }
49 +       }
50  
51         /*
52          * Check if headers are fragmented.
53 -- 
54 2.17.1
55