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
This commit is contained in:
Olivier Houchard 2006-07-18 00:07:05 +00:00
parent 4da0d523f9
commit 8067ea809e

View File

@ -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;