Reply To: IP Checksum

Home Forums Discussions Support IP Checksum Reply To: IP Checksum

#5761
Vadim Smirnov
Keymaster

    Personally I use this one

    //
    // Function recalculates IP checksum
    //
    VOID
    RecalculateIPChecksum (
    iphdr_ptr pIpHeader
    )
    {
    unsigned short word16;
    unsigned int sum = 0;
    unsigned int i = 0;
    PUCHAR buff;

    // Initialize checksum to zero
    pIpHeader->ip_sum = 0;
    buff = (PUCHAR)pIpHeader;

    // Calculate IP header checksum
    for (i = 0; i < pIpHeader->ip_hl*sizeof(DWORD); i=i+2)
    {
    word16 = ((buff<<8)&0xFF00)+(buff[i+1]&0xFF);
    sum = sum+word16;
    }

    // keep only the last 16 bits of the 32 bit calculated sum and add the carries
    while (sum>>16)
    sum = (sum & 0xFFFF)+(sum >> 16);

    // Take the one’s complement of sum
    sum = ~sum;

    pIpHeader->ip_sum = htons((unsigned short) sum);
    }