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