In NDIS 6, use the follow code:
unsigned short checksum( unsigned short* pBuf , int nLen )
{
unsigned long sum = 0;
while( nLen > 1 )
{
sum += *(unsigned short*)pBuf++;
nLen -= 2;
}
if ( nLen > 0 )
sum += *(unsigned char*)pBuf;
while( sum >> 16 )
sum += (sum&0xffff) + (sum >> 16);
return ~sum;
}
calcuated the checksum is different with the coming packet ,why?
PIP_HEADER pIpHeader = NULL;
PTCP_HEADER pTcpHeader = NULL;
PUDP_HEADER pUdpHeader = NULL;
PICMP_HEADER pIcmpHeader = NULL;
USHORT uChecksumUDP = 0;
USHORT uChecksumIP = 0;
USHORT uTmpChecksumUDP = 0;
USHORT uTmpChecksumIP = 0;
pUdpHeader = NULL;
pUdpHeader = &pBuf[ETHERNET_FRAME_LENGTH+IP_HEADER_LENGTH];
uTmpChecksumUDP = pUdpHeader->CheckSum;
pUdpHeader->CheckSum = 0;
uChecksumUDP = checksum( &pBuf[ETHERNET_FRAME_LENGTH+IP_HEADER_LENGTH] , htons(pIpHeader->DatagramLength) );
pUdpHeader->CheckSum = uTmpChecksumUDP;
pIpHeader = NULL;
pIpHeader = &pBuf[ETHERNET_FRAME_LENGTH];
uTmpChecksumIP = pIpHeader->CheckSum;
pIpHeader->CheckSum = 0;
uChecksumIP = checksum( &pBuf[ETHERNET_FRAME_LENGTH] , IP_HEADER_LENGTH );
pIpHeader->CheckSum = uTmpChecksumIP;
KdPrint((“IP org checksum 0x[%x], calculate 0x[%x] : UDP org checksum 0x[%x], calculate 0x[%x] \r\n” , uTmpChecksumIP , uChecksumIP , uTmpChecksumUDP , uChecksumUDP));