lib/checksum.c: fix endianess bug
[linux-2.6.git] / lib / checksum.c
index 12e5a1c..b2e2fd4 100644 (file)
@@ -55,7 +55,11 @@ static unsigned int do_csum(const unsigned char *buff, int len)
                goto out;
        odd = 1 & (unsigned long) buff;
        if (odd) {
+#ifdef __LITTLE_ENDIAN
                result = *buff;
+#else
+               result += (*buff << 8);
+#endif
                len--;
                buff++;
        }
@@ -71,7 +75,7 @@ static unsigned int do_csum(const unsigned char *buff, int len)
                if (count) {
                        unsigned long carry = 0;
                        do {
-                               unsigned long w = *(unsigned long *) buff;
+                               unsigned long w = *(unsigned int *) buff;
                                count--;
                                buff += 4;
                                result += carry;
@@ -87,7 +91,11 @@ static unsigned int do_csum(const unsigned char *buff, int len)
                }
        }
        if (len & 1)
+#ifdef __LITTLE_ENDIAN
+               result += *buff;
+#else
                result += (*buff << 8);
+#endif
        result = from32to16(result);
        if (odd)
                result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);