linux-mips
[Top] [All Lists]

[PATCH] Fix TCP/UDP checksums on the Broadcom SB-1

To: linux-mips@linux-mips.org
Subject: [PATCH] Fix TCP/UDP checksums on the Broadcom SB-1
From: Daniel Jacobowitz <dan@debian.org>
Date: Mon, 19 Sep 2005 23:28:18 -0400
Cc: ralf@linux-mips.org
Original-recipient: rfc822;linux-mips@linux-mips.org
Sender: linux-mips-bounce@linux-mips.org
User-agent: Mutt/1.5.8i
The type of sum in csum_tcpudp_nofold is "unsigned int", so when we assign
to it in an asm() block, and we're running on a system with 64-bit
registers, it is vitally important that we sign extend it correctly before
returning to C.  Otherwise the stray high bits will be preserved into
csum_fold, and on the SB-1 processor, 32-bit arithmetic on a non
sign-extended register will yield surprising results.

This caused incorrect checksums in some UDP packets for NFS root.  The
problem was mild when using a 10.0.1.x IP address, but severe when
using 192.168.1.x.

Signed-off-by: Daniel Jacobowitz <dan@codesourcery.com>

Index: linux/include/asm-mips/checksum.h
===================================================================
--- linux.orig/include/asm-mips/checksum.h      2005-09-19 21:00:48.000000000 
-0400
+++ linux/include/asm-mips/checksum.h   2005-09-19 21:52:11.000000000 -0400
@@ -149,7 +149,7 @@ static inline unsigned int csum_tcpudp_n
        "       daddu   %0, %4          \n"
        "       dsll32  $1, %0, 0       \n"
        "       daddu   %0, $1          \n"
-       "       dsrl32  %0, %0, 0       \n"
+       "       dsra32  %0, %0, 0       \n"
 #endif
        "       .set    pop"
        : "=r" (sum)

-- 
Daniel Jacobowitz
CodeSourcery, LLC

<Prev in Thread] Current Thread [Next in Thread>