From ad6c02b3497be66d84963249f9bc264d5a8e06ff Mon Sep 17 00:00:00 2001 From: Martine Lenders <mlenders@inf.fu-berlin.de> Date: Wed, 1 Jul 2015 18:19:22 +0200 Subject: [PATCH] ng_inet_csum: fix double-wrap around of carry --- sys/net/crosslayer/ng_inet_csum/ng_inet_csum.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/sys/net/crosslayer/ng_inet_csum/ng_inet_csum.c b/sys/net/crosslayer/ng_inet_csum/ng_inet_csum.c index b4447814d5..f38935bbf6 100644 --- a/sys/net/crosslayer/ng_inet_csum/ng_inet_csum.c +++ b/sys/net/crosslayer/ng_inet_csum/ng_inet_csum.c @@ -43,11 +43,14 @@ uint16_t ng_inet_csum(uint16_t sum, const uint8_t *buf, uint16_t len) csum += (*buf << 8); /* add last byte as top half of 16-byte word */ } - csum += csum >> 16; + while (csum >> 16) { + uint16_t carry = csum >> 16; + csum = (csum & 0xffff) + carry; + } - DEBUG("inet_sum: new sum = 0x%04" PRIx32 "\n", csum & 0xffff); + DEBUG("inet_sum: new sum = 0x%04" PRIx32 "\n", csum); - return (csum & 0xffff); + return csum; } /** @} */ -- GitLab