summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/packet.c18
1 files changed, 6 insertions, 12 deletions
diff --git a/common/packet.c b/common/packet.c
index 1fc9a0bb..b7752e23 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 */