net/mlx5: support hardware TSO for VXLAN and GRE
[dpdk.git] / drivers / net / mlx5 / mlx5_rxtx.c
index 7ef6c8d..6aee69c 100644 (file)
@@ -519,7 +519,19 @@ mlx5_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)
                /* Should we enable HW CKSUM offload */
                if (buf->ol_flags &
                    (PKT_TX_IP_CKSUM | PKT_TX_TCP_CKSUM | PKT_TX_UDP_CKSUM)) {
-                       cs_flags = MLX5_ETH_WQE_L3_CSUM | MLX5_ETH_WQE_L4_CSUM;
+                       const uint64_t is_tunneled = buf->ol_flags &
+                                                    (PKT_TX_TUNNEL_GRE |
+                                                     PKT_TX_TUNNEL_VXLAN);
+
+                       if (is_tunneled && txq->tunnel_en) {
+                               cs_flags = MLX5_ETH_WQE_L3_INNER_CSUM |
+                                          MLX5_ETH_WQE_L4_INNER_CSUM;
+                               if (buf->ol_flags & PKT_TX_OUTER_IP_CKSUM)
+                                       cs_flags |= MLX5_ETH_WQE_L3_CSUM;
+                       } else {
+                               cs_flags = MLX5_ETH_WQE_L3_CSUM |
+                                          MLX5_ETH_WQE_L4_CSUM;
+                       }
                }
                raw = ((uint8_t *)(uintptr_t)wqe) + 2 * MLX5_WQE_DWORD_SIZE;
                /* Replace the Ethernet type by the VLAN if necessary. */
@@ -554,10 +566,18 @@ mlx5_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)
                                unsigned int copy_b;
                                uint8_t vlan_sz = (buf->ol_flags &
                                                  PKT_TX_VLAN_PKT) ? 4 : 0;
+                               const uint64_t is_tunneled =
+                                                       buf->ol_flags &
+                                                       (PKT_TX_TUNNEL_GRE |
+                                                        PKT_TX_TUNNEL_VXLAN);
 
                                tso_header_sz = buf->l2_len + vlan_sz +
                                                buf->l3_len + buf->l4_len;
 
+                               if (is_tunneled && txq->tunnel_en) {
+                                       tso_header_sz += buf->outer_l2_len +
+                                                        buf->outer_l3_len;
+                               }
                                if (unlikely(tso_header_sz >
                                             MLX5_MAX_TSO_HEADER))
                                        break;