diff --git a/llarp/ip.cpp b/llarp/ip.cpp index 848ce7a00..e141acbc9 100644 --- a/llarp/ip.cpp +++ b/llarp/ip.cpp @@ -51,15 +51,18 @@ namespace llarp } if(sz != 0) { - uint16_t x = 0; + uint16_t x = 0; + *(byte_t *)&x = *(const byte_t *)buf; sum += x; } - while(sum >> 16) - sum = (sum & 0xFFff) + (sum >> 16); + // only need to do it 2 times to be sure + // proof: 0xFFff + 0xFFff = 0x1FFfe -> 0xFFff + sum = (sum & 0xFFff) + (sum >> 16); + sum += sum >> 16; - return ~sum; + return uint16_t((~sum) & 0xFFff); } #endif @@ -76,10 +79,12 @@ namespace llarp #undef ADDIPCS #undef SUBIPCS - while(sum >> 16) - sum = (sum & 0xFFff) + (sum >> 16); + // only need to do it 2 times to be sure + // proof: 0xFFff + 0xFFff = 0x1FFfe -> 0xFFff + sum = (sum & 0xFFff) + (sum >> 16); + sum += sum >> 16; - return htons(sum); + return htons(uint16_t(sum & 0xFFff)); } static void @@ -111,12 +116,11 @@ namespace llarp // 0 is used to indicate "no checksum" // 0xFFff and 0 are equivalent in one's complement math // 0xFFff + 1 = 0x10000 -> 0x0001 (same as 0 + 1) - // infact it's impossible to get 0 with such addition - // when starting from non-0 value - // but it's possible to get 0xFFff and we invert after that - // so we still need this fixup check - if(*check == 0x0000) - *check = 0xFFff; + // infact it's impossible to get 0 with such addition, + // when starting from non-0 value. + // inside deltachksum we don't invert so it's safe to skip check there + // if(*check == 0x0000) + // *check = 0xFFff; } void @@ -184,12 +188,11 @@ namespace llarp // 0 is used to indicate "no checksum" // 0xFFff and 0 are equivalent in one's complement math // 0xFFff + 1 = 0x10000 -> 0x0001 (same as 0 + 1) - // infact it's impossible to get 0 with such addition - // when starting from non-0 value - // but it's possible to get 0xFFff and we invert after that - // so we still need this fixup check - if(*check == 0x0000) - *check = 0xFFff; + // infact it's impossible to get 0 with such addition, + // when starting from non-0 value. + // inside deltachksum we don't invert so it's safe to skip check there + // if(*check == 0x0000) + // *check = 0xFFff; } void