From 1c9d2da4cd0fa50842bf3bcf2923fb2df4b86259 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Fri, 26 Nov 2021 14:43:41 +0000 Subject: [PATCH] - fixed checksum calculation git-svn-id: http://moon:8086/svn/mips@225 a8ebac50-d88d-4704-bea3-6648445a41b3 --- src/common/network/ipv4.c | 18 +++++++++--------- src/common/network/udp.c | 1 + 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/common/network/ipv4.c b/src/common/network/ipv4.c index 141f351..5c9a014 100644 --- a/src/common/network/ipv4.c +++ b/src/common/network/ipv4.c @@ -41,26 +41,26 @@ uint8_t *IPV4_create(packet_t *pPacket, uint16_t proto, uint16_t len, uint8_t *i } // ------------------------------------------------------------------------- +uint16_t sumup(uint16_t sum, uint16_t value) +{ + uint32_t sum32 = (uint32_t)sum + (uint32_t)value; + uint16_t result = (uint16_t)(sum32 >> 16) + (0xFFFF & sum32); + return result; +} + uint16_t IPv4ChkSum(void *pBuf, uint16_t acc, uint16_t len) { uint16_t *pBuf16 = (uint16_t*)pBuf; while(len > 1) { - acc += *pBuf16; - if(acc < *pBuf16) - acc++; - - ++pBuf16; + acc = sumup(acc, *(pBuf16++)); len -= 2; } /* add up any odd byte */ if(len == 1) { - acc += htons(((uint16_t)(*(uint8_t *)pBuf16)) << 8); - if(acc < htons(((uint16_t)(*(uint8_t *)pBuf16)) << 8)) - acc++; + acc = sumup(acc, htons(((uint16_t)(*(uint8_t *)pBuf16)) << 8)); } return acc; } - diff --git a/src/common/network/udp.c b/src/common/network/udp.c index 78cb79c..2c955af 100644 --- a/src/common/network/udp.c +++ b/src/common/network/udp.c @@ -29,6 +29,7 @@ uint8_t *UDP_create(packet_t *pPacket, uint8_t *inet_addr_src, uint16_t port_src // Fill pseudo header memcpy(&pseudo_hdr.inet_addr_src, inet_addr_src, 4); memcpy(&pseudo_hdr.inet_addr_dst, inet_addr_dst, 4); + pseudo_hdr.zero = 0; pseudo_hdr.proto = IP_TYPE_UDP; pseudo_hdr.len = len + sizeof(UDP);