- fixed checksum calculation

git-svn-id: http://moon:8086/svn/mips@225 a8ebac50-d88d-4704-bea3-6648445a41b3
This commit is contained in:
2021-11-26 14:43:41 +00:00
parent c89a796597
commit 1c9d2da4cd
2 changed files with 10 additions and 9 deletions
+9 -9
View File
@@ -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 IPv4ChkSum(void *pBuf, uint16_t acc, uint16_t len)
{ {
uint16_t *pBuf16 = (uint16_t*)pBuf; uint16_t *pBuf16 = (uint16_t*)pBuf;
while(len > 1) while(len > 1)
{ {
acc += *pBuf16; acc = sumup(acc, *(pBuf16++));
if(acc < *pBuf16)
acc++;
++pBuf16;
len -= 2; len -= 2;
} }
/* add up any odd byte */ /* add up any odd byte */
if(len == 1) if(len == 1)
{ {
acc += htons(((uint16_t)(*(uint8_t *)pBuf16)) << 8); acc = sumup(acc, htons(((uint16_t)(*(uint8_t *)pBuf16)) << 8));
if(acc < htons(((uint16_t)(*(uint8_t *)pBuf16)) << 8))
acc++;
} }
return acc; return acc;
} }
+1
View File
@@ -29,6 +29,7 @@ uint8_t *UDP_create(packet_t *pPacket, uint8_t *inet_addr_src, uint16_t port_src
// Fill pseudo header // Fill pseudo header
memcpy(&pseudo_hdr.inet_addr_src, inet_addr_src, 4); memcpy(&pseudo_hdr.inet_addr_src, inet_addr_src, 4);
memcpy(&pseudo_hdr.inet_addr_dst, inet_addr_dst, 4); memcpy(&pseudo_hdr.inet_addr_dst, inet_addr_dst, 4);
pseudo_hdr.zero = 0;
pseudo_hdr.proto = IP_TYPE_UDP; pseudo_hdr.proto = IP_TYPE_UDP;
pseudo_hdr.len = len + sizeof(UDP); pseudo_hdr.len = len + sizeof(UDP);