summaryrefslogtreecommitdiffstats
path: root/sys/arm
diff options
context:
space:
mode:
authorcognet <cognet@FreeBSD.org>2006-07-18 00:07:05 +0000
committercognet <cognet@FreeBSD.org>2006-07-18 00:07:05 +0000
commitc601d0f3196ed073fc1f196e181261c176864584 (patch)
tree933b08b02a7e3e973f4e4a535f2f0df076717f47 /sys/arm
parent3780baa5cb60344516a547bf4b9dd46e27511834 (diff)
downloadFreeBSD-src-c601d0f3196ed073fc1f196e181261c176864584.zip
FreeBSD-src-c601d0f3196ed073fc1f196e181261c176864584.tar.gz
Make sure we use REDUCE32 on the result of do_cksum(), as in_cksum_skip()
expects this. If we do not, this could result in wrong checksums. MFC after: 1 day
Diffstat (limited to 'sys/arm')
-rw-r--r--sys/arm/arm/in_cksum.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/sys/arm/arm/in_cksum.c b/sys/arm/arm/in_cksum.c
index 7e9b7ef..4222bc8 100644
--- a/sys/arm/arm/in_cksum.c
+++ b/sys/arm/arm/in_cksum.c
@@ -89,6 +89,17 @@ in_addword(u_short a, u_short b)
return (sum);
}
+static
+uint64_t _do_cksum(void *addr, int len)
+{
+ uint64_t sum;
+ union q_util q_util;
+
+ sum = do_cksum(addr, len);
+ REDUCE32;
+ return (sum);
+}
+
u_short
in_cksum_skip(struct mbuf *m, int len, int skip)
{
@@ -120,9 +131,9 @@ skip_start:
mlen = len;
if ((clen ^ (int) addr) & 1)
- sum += do_cksum(addr, mlen) << 8;
+ sum += _do_cksum(addr, mlen) << 8;
else
- sum += do_cksum(addr, mlen);
+ sum += _do_cksum(addr, mlen);
clen += mlen;
len -= mlen;
OpenPOWER on IntegriCloud