metag: checksum.h: fix carry in csum_tcpudp_nofold
authorJames Hogan <james.hogan@imgtec.com>
Mon, 8 Jul 2013 11:21:47 +0000 (12:21 +0100)
committerJames Hogan <james.hogan@imgtec.com>
Tue, 9 Jul 2013 10:09:17 +0000 (11:09 +0100)
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.Nowakowski@pure.com>
Signed-off-by: James Hogan <james.hogan@imgtec.com>
arch/metag/include/asm/checksum.h

index 999bf761a732b0da788c0df1df7916d38e9f1094..08dd1cc65799a5f9aadcb515a332ab6ec611b7d6 100644 (file)
@@ -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"