diff --git a/mcproxy/src/utils/mroute_socket.cpp b/mcproxy/src/utils/mroute_socket.cpp index 61289ddbb9f6f56435afba03ffef1fda91c8fc38..3a5535910fac70f1d2dcf5882bb10886e0e3a73f 100644 --- a/mcproxy/src/utils/mroute_socket.cpp +++ b/mcproxy/src/utils/mroute_socket.cpp @@ -157,17 +157,23 @@ u_int16_t mroute_socket::calc_checksum(const unsigned char* buf, int buf_size) c u_int16_t* b = (u_int16_t*)buf; int sum = 0; + int csum; for (int i = 0; i < buf_size / 2; i++) { - ADD_SIGNED_NUM_U16(sum, b[i]); - //sum +=b[i]; + sum +=b[i]; } if (buf_size % 2 == 1) { - //sum += buf[buf_size-1]; - ADD_SIGNED_NUM_U16(sum, buf[buf_size - 1]); + sum += buf[buf_size-1]; } + // fold checksum + csum = sum & 0xFFFF; + sum = sum >> 16; + sum += csum; + // fold again in case of overflow. + sum += sum >> 16; + return ~sum; }