--- researchv9/sys/inet/ip_subr.c 2018/04/24 17:21:59 1.1 +++ researchv9/sys/inet/ip_subr.c 2018/04/24 17:29:28 1.1.1.2 @@ -288,6 +288,8 @@ in_cksum(m, len) register u_short *w; register u_long sum = 0; register int mlen = 0; + register int odd = 0; /* set if last block ended on an odd + * numbered byte */ MCHECK(m); for (; len!=0; m=m->m_next) { @@ -296,19 +298,14 @@ in_cksum(m, len) break; } w = mtod(m, u_short *); - if (mlen == -1) { - /* last block ended on an odd numbered byte */ - sum += *(u_char *)w << 8; - w = (u_short *)((char *)w + 1); - mlen = BLEN(m) - 1; - len--; - } else - mlen = BLEN(m); + mlen = BLEN(m); if (len < mlen) mlen = len; len -= mlen; /* vecadd returns a 16-bit checksum of the block + sum */ - sum = vecadd(w, mlen, sum); + sum = vecadd(w, mlen, sum, odd); + if((int)mlen & 1) + odd = !odd; } /* return complement of sum */ return sum^0xffff;