From: Ted Lemon Date: Wed, 5 Mar 1997 06:15:00 +0000 (+0000) Subject: New IP header checksum code supplied by Anatoli Logvinski X-Git-Tag: DHCP-970305~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f09bfe772e5df38a6d12cb8e3849a9e9181a70ac;p=thirdparty%2Fdhcp.git New IP header checksum code supplied by Anatoli Logvinski --- diff --git a/common/packet.c b/common/packet.c index 1fc9a0bbe..b7752e234 100644 --- a/common/packet.c +++ b/common/packet.c @@ -40,9 +40,10 @@ * Enterprises, see ``http://www.vix.com''. */ + #ifndef lint static char copyright[] = -"$Id: packet.c,v 1.12 1997/02/18 14:32:51 mellon Exp $ Copyright (c) 1996 The Internet Software Consortium. All rights reserved.\n"; +"$Id: packet.c,v 1.13 1997/03/05 06:15:00 mellon Exp $ Copyright (c) 1996 The Internet Software Consortium. All rights reserved.\n"; #endif /* not lint */ #include "dhcpd.h" @@ -75,7 +76,6 @@ static u_int32_t checksum (buf, nbytes, sum) #endif sum += (u_int16_t) ntohs(*((u_int16_t *)buf)++); } - /* If there's a single byte left over, checksum it, too. Network byte order is big-endian, so the remaining byte is the high byte. */ if (i < nbytes) { @@ -97,26 +97,20 @@ static u_int32_t wrapsum (sum) #ifdef DEBUG_CHECKSUM debug ("wrapsum (%x)", sum); #endif - - while (sum > 0x10000) { - sum = (sum >> 16) + (sum & 0xFFFF); -#ifdef DEBUG_CHECKSUM_VERBOSE - debug ("sum = %x", sum); -#endif - sum += (sum >> 16); + while (sum >> 16) { #ifdef DEBUG_CHECKSUM_VERBOSE debug ("sum = %x", sum); #endif + sum = (sum & 0xFFFF) + (sum >> 16); } - sum = sum ^ 0xFFFF; #ifdef DEBUG_CHECKSUM_VERBOSE debug ("sum = %x", sum); #endif #ifdef DEBUG_CHECKSUM - debug ("wrapsum returns %x", htons (sum)); + debug ("wrapsum returns %x", htons (~sum)); #endif - return htons(sum); + return htons(~sum); } #endif /* PACKET_ASSEMBLY || PACKET_DECODING */