fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / arch / ia64 / lib / checksum.c
index beb1172..4411d9b 100644 (file)
@@ -33,32 +33,32 @@ from64to16 (unsigned long x)
  * computes the checksum of the TCP/UDP pseudo-header
  * returns a 16-bit checksum, already complemented.
  */
-unsigned short int
-csum_tcpudp_magic (unsigned long saddr, unsigned long daddr, unsigned short len,
-                  unsigned short proto, unsigned int sum)
+__sum16
+csum_tcpudp_magic (__be32 saddr, __be32 daddr, unsigned short len,
+                  unsigned short proto, __wsum sum)
 {
-       return ~from64to16(saddr + daddr + sum + ((unsigned long) ntohs(len) << 16) +
-                          ((unsigned long) proto << 8));
+       return (__force __sum16)~from64to16(
+               (__force u64)saddr + (__force u64)daddr +
+               (__force u64)sum + ((len + proto) << 8));
 }
 
 EXPORT_SYMBOL(csum_tcpudp_magic);
 
-unsigned int
-csum_tcpudp_nofold (unsigned long saddr, unsigned long daddr, unsigned short len,
-                   unsigned short proto, unsigned int sum)
+__wsum
+csum_tcpudp_nofold (__be32 saddr, __be32 daddr, unsigned short len,
+                   unsigned short proto, __wsum sum)
 {
        unsigned long result;
 
-       result = (saddr + daddr + sum +
-                 ((unsigned long) ntohs(len) << 16) +
-                 ((unsigned long) proto << 8));
+       result = (__force u64)saddr + (__force u64)daddr +
+                (__force u64)sum + ((len + proto) << 8);
 
        /* Fold down to 32-bits so we don't lose in the typedef-less network stack.  */
        /* 64 to 33 */
        result = (result & 0xffffffff) + (result >> 32);
        /* 33 to 32 */
        result = (result & 0xffffffff) + (result >> 32);
-       return result;
+       return (__force __wsum)result;
 }
 
 extern unsigned long do_csum (const unsigned char *, long);
@@ -75,16 +75,15 @@ extern unsigned long do_csum (const unsigned char *, long);
  *
  * it's best to have buff aligned on a 32-bit boundary
  */
-unsigned int
-csum_partial (const unsigned char * buff, int len, unsigned int sum)
+__wsum csum_partial(const void *buff, int len, __wsum sum)
 {
-       unsigned long result = do_csum(buff, len);
+       u64 result = do_csum(buff, len);
 
        /* add in old sum, and carry.. */
-       result += sum;
+       result += (__force u32)sum;
        /* 32+c bits -> 32 bits */
        result = (result & 0xffffffff) + (result >> 32);
-       return result;
+       return (__force __wsum)result;
 }
 
 EXPORT_SYMBOL(csum_partial);
@@ -93,10 +92,9 @@ EXPORT_SYMBOL(csum_partial);
  * this routine is used for miscellaneous IP-like checksums, mainly
  * in icmp.c
  */
-unsigned short
-ip_compute_csum (unsigned char * buff, int len)
+__sum16 ip_compute_csum (const void *buff, int len)
 {
-       return ~do_csum(buff,len);
+       return (__force __sum16)~do_csum(buff,len);
 }
 
 EXPORT_SYMBOL(ip_compute_csum);