- fixed checksum calculation
git-svn-id: http://moon:8086/svn/mips@225 a8ebac50-d88d-4704-bea3-6648445a41b3
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user