Blame view
include/net/ip6_checksum.h
2.28 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/* * INET An implementation of the TCP/IP protocol suite for the LINUX * operating system. INET is implemented using the BSD Socket * interface as the means of communication with the user level. * * Checksumming functions for IPv6 * * Authors: Jorge Cwik, <jorge@laser.satlink.net> * Arnt Gulbrandsen, <agulbra@nvg.unit.no> * Borrows very liberally from tcp.c and ip.c, see those * files for more names. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ /* * Fixes: * * Ralf Baechle : generic ipv6 checksum * <ralf@waldorf-gmbh.de> */ #ifndef _CHECKSUM_IPV6_H #define _CHECKSUM_IPV6_H #include <asm/types.h> #include <asm/byteorder.h> #include <net/ip.h> #include <asm/checksum.h> #include <linux/in6.h> #ifndef _HAVE_ARCH_IPV6_CSUM |
56649d5d3 [NET]: Generic ch... |
36 37 38 39 |
static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr, const struct in6_addr *daddr, __u32 len, unsigned short proto, __wsum csum) |
1da177e4c Linux-2.6.12-rc2 |
40 41 42 43 44 |
{ int carry; __u32 ulen; __u32 uproto; |
56649d5d3 [NET]: Generic ch... |
45 |
__u32 sum = (__force u32)csum; |
1da177e4c Linux-2.6.12-rc2 |
46 |
|
56649d5d3 [NET]: Generic ch... |
47 48 49 |
sum += (__force u32)saddr->s6_addr32[0]; carry = (sum < (__force u32)saddr->s6_addr32[0]); sum += carry; |
1da177e4c Linux-2.6.12-rc2 |
50 |
|
56649d5d3 [NET]: Generic ch... |
51 52 53 |
sum += (__force u32)saddr->s6_addr32[1]; carry = (sum < (__force u32)saddr->s6_addr32[1]); sum += carry; |
1da177e4c Linux-2.6.12-rc2 |
54 |
|
56649d5d3 [NET]: Generic ch... |
55 56 57 |
sum += (__force u32)saddr->s6_addr32[2]; carry = (sum < (__force u32)saddr->s6_addr32[2]); sum += carry; |
1da177e4c Linux-2.6.12-rc2 |
58 |
|
56649d5d3 [NET]: Generic ch... |
59 60 61 |
sum += (__force u32)saddr->s6_addr32[3]; carry = (sum < (__force u32)saddr->s6_addr32[3]); sum += carry; |
1da177e4c Linux-2.6.12-rc2 |
62 |
|
56649d5d3 [NET]: Generic ch... |
63 64 65 |
sum += (__force u32)daddr->s6_addr32[0]; carry = (sum < (__force u32)daddr->s6_addr32[0]); sum += carry; |
1da177e4c Linux-2.6.12-rc2 |
66 |
|
56649d5d3 [NET]: Generic ch... |
67 68 69 |
sum += (__force u32)daddr->s6_addr32[1]; carry = (sum < (__force u32)daddr->s6_addr32[1]); sum += carry; |
1da177e4c Linux-2.6.12-rc2 |
70 |
|
56649d5d3 [NET]: Generic ch... |
71 72 73 |
sum += (__force u32)daddr->s6_addr32[2]; carry = (sum < (__force u32)daddr->s6_addr32[2]); sum += carry; |
1da177e4c Linux-2.6.12-rc2 |
74 |
|
56649d5d3 [NET]: Generic ch... |
75 76 77 |
sum += (__force u32)daddr->s6_addr32[3]; carry = (sum < (__force u32)daddr->s6_addr32[3]); sum += carry; |
1da177e4c Linux-2.6.12-rc2 |
78 |
|
56649d5d3 [NET]: Generic ch... |
79 80 81 82 |
ulen = (__force u32)htonl((__u32) len); sum += ulen; carry = (sum < ulen); sum += carry; |
1da177e4c Linux-2.6.12-rc2 |
83 |
|
56649d5d3 [NET]: Generic ch... |
84 85 86 87 |
uproto = (__force u32)htonl(proto); sum += uproto; carry = (sum < uproto); sum += carry; |
1da177e4c Linux-2.6.12-rc2 |
88 |
|
b23e35366 [IPV6]: Dumb typo... |
89 |
return csum_fold((__force __wsum)sum); |
1da177e4c Linux-2.6.12-rc2 |
90 91 92 93 |
} #endif #endif |