>Number:         180430
>Category:       misc
>Synopsis:       Bad UDP checksum calc for fragmented packets
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Jul 10 10:40:00 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator:     Meny Yossefi
>Release:        9.1.0
>Organization:
Mellanox
>Environment:
FreeBSD r-sw-freebsd01.mtr.labs.mlnx 9.1-RELEASE FreeBSD 9.1-RELEASE #0 
r243825: Tue Dec  4 09:23:10 UTC 2012     
[email protected]:/usr/obj/usr/src/sys/GENERIC  amd64
>Description:
HW performs UDP checksum calculation and runs over the SW (tcp/ip stack) 
calculation.

In case of fragmented packets, HW calculation (For UDP csum) is wrong and 
packets get dropped on receiver side.

Solution: remove HW UDP csum calculation on fragmented packets.
>How-To-Repeat:
Send packets over MLNX interface with msg size larger than MTU.
>Fix:
HW will calculate UDP checksum only for un-fragmented packets.

Patch attached with submission follows:

--- ../clean_9.1.0/sys/ofed/drivers/net/mlx4/en_tx.c    2013-07-09 
09:41:01.349506000 +0300
+++ ../9.1.0/sys/ofed/drivers/net/mlx4/en_tx.c  2013-07-09 10:56:18.910829000 
+0300
@@ -780,8 +780,9 @@ retry:
        tx_desc->ctrl.srcrb_flags = cpu_to_be32(MLX4_WQE_CTRL_CQ_UPDATE |
                                                MLX4_WQE_CTRL_SOLICITED);
        if (mb->m_pkthdr.csum_flags & (CSUM_IP|CSUM_TCP|CSUM_UDP)) {
-               tx_desc->ctrl.srcrb_flags |= cpu_to_be32(MLX4_WQE_CTRL_IP_CSUM |
-                                                        
MLX4_WQE_CTRL_TCP_UDP_CSUM);
+               tx_desc->ctrl.srcrb_flags |= cpu_to_be32(MLX4_WQE_CTRL_IP_CSUM);
+               if ((mb->m_flags & M_FRAG) == 0)
+                        tx_desc->ctrl.srcrb_flags |= 
cpu_to_be32(MLX4_WQE_CTRL_TCP_UDP_CSUM);
                priv->port_stats.tx_chksum_offload++;
        }
 


>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "[email protected]"

Reply via email to