diff options
author | cognet <cognet@FreeBSD.org> | 2006-07-18 00:07:05 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2006-07-18 00:07:05 +0000 |
commit | c601d0f3196ed073fc1f196e181261c176864584 (patch) | |
tree | 933b08b02a7e3e973f4e4a535f2f0df076717f47 /sys/arm | |
parent | 3780baa5cb60344516a547bf4b9dd46e27511834 (diff) | |
download | FreeBSD-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.c | 15 |
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; |