diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2006-11-15 00:16:30 -0500 |
|---|---|---|
| committer | David S. Miller <davem@sunset.davemloft.net> | 2006-12-03 00:23:05 -0500 |
| commit | 322529961e3b3e64fdf1a3e46a45294456c91acf (patch) | |
| tree | 94f029cb2fce7d2672e1bba0e80a47a0bb170d0c /arch/ia64/lib | |
| parent | db521083bcb75505e9c3e21cbabe8274ee0daea6 (diff) | |
[NET]: IA64 checksum annotations and cleanups.
* sanitize prototypes, annotate
* ntohs -> shift in checksum calculations
* kill access_ok() in csum_partial_copy_from_user
* collapse do_csum_partial_copy_from_user
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/ia64/lib')
| -rw-r--r-- | arch/ia64/lib/checksum.c | 38 | ||||
| -rw-r--r-- | arch/ia64/lib/csum_partial_copy.c | 31 |
2 files changed, 27 insertions, 42 deletions
diff --git a/arch/ia64/lib/checksum.c b/arch/ia64/lib/checksum.c index beb11721d9f5..4411d9baeb21 100644 --- a/arch/ia64/lib/checksum.c +++ b/arch/ia64/lib/checksum.c | |||
| @@ -33,32 +33,32 @@ from64to16 (unsigned long x) | |||
| 33 | * computes the checksum of the TCP/UDP pseudo-header | 33 | * computes the checksum of the TCP/UDP pseudo-header |
| 34 | * returns a 16-bit checksum, already complemented. | 34 | * returns a 16-bit checksum, already complemented. |
| 35 | */ | 35 | */ |
| 36 | unsigned short int | 36 | __sum16 |
| 37 | csum_tcpudp_magic (unsigned long saddr, unsigned long daddr, unsigned short len, | 37 | csum_tcpudp_magic (__be32 saddr, __be32 daddr, unsigned short len, |
| 38 | unsigned short proto, unsigned int sum) | 38 | unsigned short proto, __wsum sum) |
| 39 | { | 39 | { |
| 40 | return ~from64to16(saddr + daddr + sum + ((unsigned long) ntohs(len) << 16) + | 40 | return (__force __sum16)~from64to16( |
| 41 | ((unsigned long) proto << 8)); | 41 | (__force u64)saddr + (__force u64)daddr + |
| 42 | (__force u64)sum + ((len + proto) << 8)); | ||
| 42 | } | 43 | } |
| 43 | 44 | ||
| 44 | EXPORT_SYMBOL(csum_tcpudp_magic); | 45 | EXPORT_SYMBOL(csum_tcpudp_magic); |
| 45 | 46 | ||
| 46 | unsigned int | 47 | __wsum |
| 47 | csum_tcpudp_nofold (unsigned long saddr, unsigned long daddr, unsigned short len, | 48 | csum_tcpudp_nofold (__be32 saddr, __be32 daddr, unsigned short len, |
| 48 | unsigned short proto, unsigned int sum) | 49 | unsigned short proto, __wsum sum) |
| 49 | { | 50 | { |
| 50 | unsigned long result; | 51 | unsigned long result; |
| 51 | 52 | ||
| 52 | result = (saddr + daddr + sum + | 53 | result = (__force u64)saddr + (__force u64)daddr + |
| 53 | ((unsigned long) ntohs(len) << 16) + | 54 | (__force u64)sum + ((len + proto) << 8); |
| 54 | ((unsigned long) proto << 8)); | ||
| 55 | 55 | ||
| 56 | /* Fold down to 32-bits so we don't lose in the typedef-less network stack. */ | 56 | /* Fold down to 32-bits so we don't lose in the typedef-less network stack. */ |
| 57 | /* 64 to 33 */ | 57 | /* 64 to 33 */ |
| 58 | result = (result & 0xffffffff) + (result >> 32); | 58 | result = (result & 0xffffffff) + (result >> 32); |
| 59 | /* 33 to 32 */ | 59 | /* 33 to 32 */ |
| 60 | result = (result & 0xffffffff) + (result >> 32); | 60 | result = (result & 0xffffffff) + (result >> 32); |
| 61 | return result; | 61 | return (__force __wsum)result; |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | extern unsigned long do_csum (const unsigned char *, long); | 64 | extern unsigned long do_csum (const unsigned char *, long); |
| @@ -75,16 +75,15 @@ extern unsigned long do_csum (const unsigned char *, long); | |||
| 75 | * | 75 | * |
| 76 | * it's best to have buff aligned on a 32-bit boundary | 76 | * it's best to have buff aligned on a 32-bit boundary |
| 77 | */ | 77 | */ |
| 78 | unsigned int | 78 | __wsum csum_partial(const void *buff, int len, __wsum sum) |
| 79 | csum_partial (const unsigned char * buff, int len, unsigned int sum) | ||
| 80 | { | 79 | { |
| 81 | unsigned long result = do_csum(buff, len); | 80 | u64 result = do_csum(buff, len); |
| 82 | 81 | ||
| 83 | /* add in old sum, and carry.. */ | 82 | /* add in old sum, and carry.. */ |
| 84 | result += sum; | 83 | result += (__force u32)sum; |
| 85 | /* 32+c bits -> 32 bits */ | 84 | /* 32+c bits -> 32 bits */ |
| 86 | result = (result & 0xffffffff) + (result >> 32); | 85 | result = (result & 0xffffffff) + (result >> 32); |
| 87 | return result; | 86 | return (__force __wsum)result; |
| 88 | } | 87 | } |
| 89 | 88 | ||
| 90 | EXPORT_SYMBOL(csum_partial); | 89 | EXPORT_SYMBOL(csum_partial); |
| @@ -93,10 +92,9 @@ EXPORT_SYMBOL(csum_partial); | |||
| 93 | * this routine is used for miscellaneous IP-like checksums, mainly | 92 | * this routine is used for miscellaneous IP-like checksums, mainly |
| 94 | * in icmp.c | 93 | * in icmp.c |
| 95 | */ | 94 | */ |
| 96 | unsigned short | 95 | __sum16 ip_compute_csum (const void *buff, int len) |
| 97 | ip_compute_csum (unsigned char * buff, int len) | ||
| 98 | { | 96 | { |
| 99 | return ~do_csum(buff,len); | 97 | return (__force __sum16)~do_csum(buff,len); |
| 100 | } | 98 | } |
| 101 | 99 | ||
| 102 | EXPORT_SYMBOL(ip_compute_csum); | 100 | EXPORT_SYMBOL(ip_compute_csum); |
diff --git a/arch/ia64/lib/csum_partial_copy.c b/arch/ia64/lib/csum_partial_copy.c index 36866e8a5d2b..503dfe6d1450 100644 --- a/arch/ia64/lib/csum_partial_copy.c +++ b/arch/ia64/lib/csum_partial_copy.c | |||
| @@ -104,9 +104,9 @@ out: | |||
| 104 | */ | 104 | */ |
| 105 | extern unsigned long do_csum(const unsigned char *, long); | 105 | extern unsigned long do_csum(const unsigned char *, long); |
| 106 | 106 | ||
| 107 | static unsigned int | 107 | __wsum |
| 108 | do_csum_partial_copy_from_user (const unsigned char __user *src, unsigned char *dst, | 108 | csum_partial_copy_from_user(const void __user *src, void *dst, |
| 109 | int len, unsigned int psum, int *errp) | 109 | int len, __wsum psum, int *errp) |
| 110 | { | 110 | { |
| 111 | unsigned long result; | 111 | unsigned long result; |
| 112 | 112 | ||
| @@ -122,30 +122,17 @@ do_csum_partial_copy_from_user (const unsigned char __user *src, unsigned char * | |||
| 122 | result = do_csum(dst, len); | 122 | result = do_csum(dst, len); |
| 123 | 123 | ||
| 124 | /* add in old sum, and carry.. */ | 124 | /* add in old sum, and carry.. */ |
| 125 | result += psum; | 125 | result += (__force u32)psum; |
| 126 | /* 32+c bits -> 32 bits */ | 126 | /* 32+c bits -> 32 bits */ |
| 127 | result = (result & 0xffffffff) + (result >> 32); | 127 | result = (result & 0xffffffff) + (result >> 32); |
| 128 | return result; | 128 | return (__force __wsum)result; |
| 129 | } | ||
| 130 | |||
| 131 | unsigned int | ||
| 132 | csum_partial_copy_from_user (const unsigned char __user *src, unsigned char *dst, | ||
| 133 | int len, unsigned int sum, int *errp) | ||
| 134 | { | ||
| 135 | if (!access_ok(VERIFY_READ, src, len)) { | ||
| 136 | *errp = -EFAULT; | ||
| 137 | memset(dst, 0, len); | ||
| 138 | return sum; | ||
| 139 | } | ||
| 140 | |||
| 141 | return do_csum_partial_copy_from_user(src, dst, len, sum, errp); | ||
| 142 | } | 129 | } |
| 143 | 130 | ||
| 144 | unsigned int | 131 | __wsum |
| 145 | csum_partial_copy_nocheck(const unsigned char __user *src, unsigned char *dst, | 132 | csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum) |
| 146 | int len, unsigned int sum) | ||
| 147 | { | 133 | { |
| 148 | return do_csum_partial_copy_from_user(src, dst, len, sum, NULL); | 134 | return csum_partial_copy_from_user((__force const void __user *)src, |
| 135 | dst, len, sum, NULL); | ||
| 149 | } | 136 | } |
| 150 | 137 | ||
| 151 | EXPORT_SYMBOL(csum_partial_copy_nocheck); | 138 | EXPORT_SYMBOL(csum_partial_copy_nocheck); |
