Commit 1ff733ae2347f93a20376defe1e6af77ede4da52
Committed by
Greg Kroah-Hartman
1 parent
75a94c278e
Exists in
smarc-ti-linux-3.14.y
and in
1 other branch
lib/checksum.c: fix carry in csum_tcpudp_nofold
commit 150ae0e94634714b23919f0c333fee28a5b199d5 upstream. The carry from the 64->32bits folding was dropped, e.g with: saddr=0xFFFFFFFF daddr=0xFF0000FF len=0xFFFF proto=0 sum=1, csum_tcpudp_nofold returned 0 instead of 1. Signed-off-by: Karl Beldan <karl.beldan@rivierawaves.com> Cc: Al Viro <viro@ZenIV.linux.org.uk> Cc: Eric Dumazet <eric.dumazet@gmail.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Mike Frysinger <vapier@gentoo.org> Cc: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Showing 1 changed file with 10 additions and 2 deletions Side-by-side Diff
lib/checksum.c
... | ... | @@ -47,6 +47,15 @@ |
47 | 47 | return x; |
48 | 48 | } |
49 | 49 | |
50 | +static inline u32 from64to32(u64 x) | |
51 | +{ | |
52 | + /* add up 32-bit and 32-bit for 32+c bit */ | |
53 | + x = (x & 0xffffffff) + (x >> 32); | |
54 | + /* add up carry.. */ | |
55 | + x = (x & 0xffffffff) + (x >> 32); | |
56 | + return (u32)x; | |
57 | +} | |
58 | + | |
50 | 59 | static unsigned int do_csum(const unsigned char *buff, int len) |
51 | 60 | { |
52 | 61 | int odd; |
... | ... | @@ -195,8 +204,7 @@ |
195 | 204 | #else |
196 | 205 | s += (proto + len) << 8; |
197 | 206 | #endif |
198 | - s += (s >> 32); | |
199 | - return (__force __wsum)s; | |
207 | + return (__force __wsum)from64to32(s); | |
200 | 208 | } |
201 | 209 | EXPORT_SYMBOL(csum_tcpudp_nofold); |
202 | 210 | #endif |