In csum_tcpudp_nofold, add 1 if the carry bit is set after adding the
destination IP address (32 bits) to the checksum (16 bits).

The lack of carry handling for this particular addition meant that a
destination address of *.*.255.255 (e.g. certain broadcasts) sometimes
resulted in an incorrect checksum. This bug has been present in the Meta
port since the code was written in the 2.4 days.

Reported-by: Marcin Nowakowski <marcin.nowakow...@pure.com>
Signed-off-by: James Hogan <james.ho...@imgtec.com>
---
I'll add this patch to my arch/metag fixes branch for v3.11.

 arch/metag/include/asm/checksum.h | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/metag/include/asm/checksum.h 
b/arch/metag/include/asm/checksum.h
index 999bf76..08dd1cc 100644
--- a/arch/metag/include/asm/checksum.h
+++ b/arch/metag/include/asm/checksum.h
@@ -64,7 +64,8 @@ static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 
daddr,
                                        __wsum sum)
 {
        unsigned long len_proto = (proto + len) << 8;
-       asm ("ADD    %0, %0, %1\n"
+       asm ("ADDS   %0, %0, %1\n"
+            "ADDCS  %0, %0, #1\n"
             "ADDS   %0, %0, %2\n"
             "ADDCS  %0, %0, #1\n"
             "ADDS   %0, %0, %3\n"
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to