IP header checksum calculation
/* IP Header in Little Endian /
#pragma pack(1)
typedef struct iphdr
{
u_char ip_hl:4, / header length /
ip_v:4; / version /
u_char ip_tos; / type of service /
short ip_len; / total length /
u_short ip_id; / identification /
short ip_off; / fragment offset field /
#define IP_DF 0x4000 / dont fragment flag /
#define IP_MF 0x2000 / more fragments flag /
u_char ip_ttl; / time to live /
u_char ip_p; / protocol /
u_short ip_sum; / checksum /
struct in_addr ip_src,ip_dst; / source and dest address */
} iphdr, *iphdr_ptr;
#pragma pack()
uint16 CalcIPChecksum(iphdr header)
{
// clear existent IP header
header->ip_sum = 0x0;
// calc the checksum
unsigned int nbytes = sizeof(iphdr);
unsigned short *buf = reinterpret_cast( header );
unsigned int sum = 0;
for (; nbytes > 1; nbytes -= 2)
{
sum += *buf++;
}
if (nbytes == 1)
{
sum += *(unsigned char*) buf;
}
sum = (sum >> 16) + (sum & 0xFFFF);
sum += (sum >> 16);
return ~sum;
}
Read more at faqs.com, RFC791 - Internet Protocol
Posted at BinaryCell
Comments
Post a Comment