From: Yaacov Hazan <yaac...@mellanox.com>

Change rxq_cq_to_ol_flags() to set checksum flags according to packet type,
so for non L3/L4 packets the mbuf chksum_bad flags will not be set.

Fixes: 67fa62bc672d ("mlx5: support checksum offload")

Signed-off-by: Yaacov Hazan <yaacovh at mellanox.com>
---
 doc/guides/rel_notes/release_16_04.rst |  4 ++++
 drivers/net/mlx5/Makefile              |  5 +++++
 drivers/net/mlx5/mlx5_rxtx.c           | 26 ++++++++++++++++++--------
 3 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/doc/guides/rel_notes/release_16_04.rst 
b/doc/guides/rel_notes/release_16_04.rst
index 6e94bbe..8669515 100644
--- a/doc/guides/rel_notes/release_16_04.rst
+++ b/doc/guides/rel_notes/release_16_04.rst
@@ -163,6 +163,10 @@ Drivers

   Prevented reception of multicast frames outside of configured VLANs.

+* **mlx5: Fixed RX checksum offload in non L3/L4 packets.**
+
+  Fixed report of bad checksum for packets of unknown type.
+

 Libraries
 ~~~~~~~~~
diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile
index 39cdf2c..7076ae3 100644
--- a/drivers/net/mlx5/Makefile
+++ b/drivers/net/mlx5/Makefile
@@ -132,6 +132,11 @@ mlx5_autoconf.h: $(RTE_SDK)/scripts/auto-config-h.sh
                infiniband/verbs.h \
                enum IBV_EXP_DEVICE_ATTR_VLAN_OFFLOADS \
                $(AUTOCONF_OUTPUT)
+       $Q sh -- '$<' '$@' \
+               HAVE_EXP_CQ_RX_TCP_PACKET \
+               infiniband/verbs.h \
+               enum IBV_EXP_CQ_RX_TCP_PACKET \
+               $(AUTOCONF_OUTPUT)

 $(SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD):.c=.o): mlx5_autoconf.h

diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c
index 4c53c7a..4919189 100644
--- a/drivers/net/mlx5/mlx5_rxtx.c
+++ b/drivers/net/mlx5/mlx5_rxtx.c
@@ -719,14 +719,24 @@ rxq_cq_to_ol_flags(const struct rxq *rxq, uint32_t flags)
 {
        uint32_t ol_flags = 0;

-       if (rxq->csum)
-               ol_flags |=
-                       TRANSPOSE(~flags,
-                                 IBV_EXP_CQ_RX_IP_CSUM_OK,
-                                 PKT_RX_IP_CKSUM_BAD) |
-                       TRANSPOSE(~flags,
-                                 IBV_EXP_CQ_RX_TCP_UDP_CSUM_OK,
-                                 PKT_RX_L4_CKSUM_BAD);
+       if (rxq->csum) {
+               /* Set IP checksum flag only for IPv4/IPv6 packets. */
+               if (flags &
+                   (IBV_EXP_CQ_RX_IPV4_PACKET | IBV_EXP_CQ_RX_IPV6_PACKET))
+                       ol_flags |=
+                               TRANSPOSE(~flags,
+                                       IBV_EXP_CQ_RX_IP_CSUM_OK,
+                                       PKT_RX_IP_CKSUM_BAD);
+#ifdef HAVE_EXP_CQ_RX_TCP_PACKET
+               /* Set L4 checksum flag only for TCP/UDP packets. */
+               if (flags &
+                   (IBV_EXP_CQ_RX_TCP_PACKET | IBV_EXP_CQ_RX_UDP_PACKET))
+#endif /* HAVE_EXP_CQ_RX_TCP_PACKET */
+                       ol_flags |=
+                               TRANSPOSE(~flags,
+                                       IBV_EXP_CQ_RX_TCP_UDP_CSUM_OK,
+                                       PKT_RX_L4_CKSUM_BAD);
+       }
        /*
         * PKT_RX_IP_CKSUM_BAD and PKT_RX_L4_CKSUM_BAD are used in place
         * of PKT_RX_EIP_CKSUM_BAD because the latter is not functional
-- 
2.1.4

Reply via email to