]> git.droids-corp.org - dpdk.git/commitdiff
net/ice: fix Tx checksum offload
authorKevin Liu <kevinx.liu@intel.com>
Sun, 12 Dec 2021 14:35:20 +0000 (14:35 +0000)
committerQi Zhang <qi.z.zhang@intel.com>
Mon, 10 Jan 2022 09:38:05 +0000 (10:38 +0100)
The tunnel packets is missing some information after Tx forwarding.

In ice_txd_enable_offload, when set tunnel packet Tx checksum
offload enable, td_offset should be set with outer l2/l3 len instead
of inner l2/l3 len.

In ice_txd_enable_checksum, td_offset should also be set with outer
l3 len.

This patch fix the bug that the checksum engine can forward Ipv4/Ipv6
tunnel packets.

Fixes: 28f9002ab67f ("net/ice: add Tx AVX512 offload path")
Fixes: 17c7d0f9d6a4 ("net/ice: support basic Rx/Tx")
Cc: stable@dpdk.org
Signed-off-by: Kevin Liu <kevinx.liu@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
drivers/net/ice/ice_rxtx.c
drivers/net/ice/ice_rxtx_vec_common.h

index c80d86915e15f7659737c5e1cb834b59d14e9690..ba40a0dc87475e79b36c1baeb0bd513d0741f0b3 100644 (file)
@@ -2490,18 +2490,35 @@ ice_txd_enable_checksum(uint64_t ol_flags,
                        << ICE_TX_DESC_LEN_MACLEN_S;
 
        /* Enable L3 checksum offloads */
-       if (ol_flags & RTE_MBUF_F_TX_IP_CKSUM) {
-               *td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV4_CSUM;
-               *td_offset |= (tx_offload.l3_len >> 2) <<
-                             ICE_TX_DESC_LEN_IPLEN_S;
-       } else if (ol_flags & RTE_MBUF_F_TX_IPV4) {
-               *td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV4;
-               *td_offset |= (tx_offload.l3_len >> 2) <<
-                             ICE_TX_DESC_LEN_IPLEN_S;
-       } else if (ol_flags & RTE_MBUF_F_TX_IPV6) {
-               *td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV6;
-               *td_offset |= (tx_offload.l3_len >> 2) <<
-                             ICE_TX_DESC_LEN_IPLEN_S;
+       /*Tunnel package usage outer len enable L3 checksum offload*/
+       if (ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) {
+               if (ol_flags & RTE_MBUF_F_TX_IP_CKSUM) {
+                       *td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV4_CSUM;
+                       *td_offset |= (tx_offload.outer_l3_len >> 2) <<
+                               ICE_TX_DESC_LEN_IPLEN_S;
+               } else if (ol_flags & RTE_MBUF_F_TX_IPV4) {
+                       *td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV4;
+                       *td_offset |= (tx_offload.outer_l3_len >> 2) <<
+                               ICE_TX_DESC_LEN_IPLEN_S;
+               } else if (ol_flags & RTE_MBUF_F_TX_IPV6) {
+                       *td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV6;
+                       *td_offset |= (tx_offload.outer_l3_len >> 2) <<
+                               ICE_TX_DESC_LEN_IPLEN_S;
+               }
+       } else {
+               if (ol_flags & RTE_MBUF_F_TX_IP_CKSUM) {
+                       *td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV4_CSUM;
+                       *td_offset |= (tx_offload.l3_len >> 2) <<
+                               ICE_TX_DESC_LEN_IPLEN_S;
+               } else if (ol_flags & RTE_MBUF_F_TX_IPV4) {
+                       *td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV4;
+                       *td_offset |= (tx_offload.l3_len >> 2) <<
+                               ICE_TX_DESC_LEN_IPLEN_S;
+               } else if (ol_flags & RTE_MBUF_F_TX_IPV6) {
+                       *td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV6;
+                       *td_offset |= (tx_offload.l3_len >> 2) <<
+                               ICE_TX_DESC_LEN_IPLEN_S;
+               }
        }
 
        if (ol_flags & RTE_MBUF_F_TX_TCP_SEG) {
index dfe60c81d93e0b7dcec478d5741171db779b1c3f..8ff01046e1f187a6d9e2740536c88ef448695dd8 100644 (file)
@@ -364,23 +364,45 @@ ice_txd_enable_offload(struct rte_mbuf *tx_pkt,
        uint32_t td_offset = 0;
 
        /* Tx Checksum Offload */
-       /* SET MACLEN */
-       td_offset |= (tx_pkt->l2_len >> 1) <<
+       /*Tunnel package usage outer len enable L2/L3 checksum offload*/
+       if (ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) {
+               /* SET MACLEN */
+               td_offset |= (tx_pkt->outer_l2_len >> 1) <<
                        ICE_TX_DESC_LEN_MACLEN_S;
 
-       /* Enable L3 checksum offload */
-       if (ol_flags & RTE_MBUF_F_TX_IP_CKSUM) {
-               td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV4_CSUM;
-               td_offset |= (tx_pkt->l3_len >> 2) <<
-                       ICE_TX_DESC_LEN_IPLEN_S;
-       } else if (ol_flags & RTE_MBUF_F_TX_IPV4) {
-               td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV4;
-               td_offset |= (tx_pkt->l3_len >> 2) <<
-                       ICE_TX_DESC_LEN_IPLEN_S;
-       } else if (ol_flags & RTE_MBUF_F_TX_IPV6) {
-               td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV6;
-               td_offset |= (tx_pkt->l3_len >> 2) <<
-                       ICE_TX_DESC_LEN_IPLEN_S;
+               /* Enable L3 checksum offload */
+               if (ol_flags & RTE_MBUF_F_TX_IP_CKSUM) {
+                       td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV4_CSUM;
+                       td_offset |= (tx_pkt->outer_l3_len >> 2) <<
+                               ICE_TX_DESC_LEN_IPLEN_S;
+               } else if (ol_flags & RTE_MBUF_F_TX_IPV4) {
+                       td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV4;
+                       td_offset |= (tx_pkt->outer_l3_len >> 2) <<
+                               ICE_TX_DESC_LEN_IPLEN_S;
+               } else if (ol_flags & RTE_MBUF_F_TX_IPV6) {
+                       td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV6;
+                       td_offset |= (tx_pkt->outer_l3_len >> 2) <<
+                               ICE_TX_DESC_LEN_IPLEN_S;
+               }
+       } else {
+               /* SET MACLEN */
+               td_offset |= (tx_pkt->l2_len >> 1) <<
+                       ICE_TX_DESC_LEN_MACLEN_S;
+
+               /* Enable L3 checksum offload */
+               if (ol_flags & RTE_MBUF_F_TX_IP_CKSUM) {
+                       td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV4_CSUM;
+                       td_offset |= (tx_pkt->l3_len >> 2) <<
+                               ICE_TX_DESC_LEN_IPLEN_S;
+               } else if (ol_flags & RTE_MBUF_F_TX_IPV4) {
+                       td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV4;
+                       td_offset |= (tx_pkt->l3_len >> 2) <<
+                               ICE_TX_DESC_LEN_IPLEN_S;
+               } else if (ol_flags & RTE_MBUF_F_TX_IPV6) {
+                       td_cmd |= ICE_TX_DESC_CMD_IIPT_IPV6;
+                       td_offset |= (tx_pkt->l3_len >> 2) <<
+                               ICE_TX_DESC_LEN_IPLEN_S;
+               }
        }
 
        /* Enable L4 checksum offloads */