Mohsin Kazmi | 82f9444 | 2021-09-15 15:57:29 +0200 | [diff] [blame] | 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 | |