- 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 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user