/*
***************************
* 计算icmp校验和算法
* 2008-05-02
* ************************* */
unsigned short chksum(addr,len)
unsigned short * addr; /* 校验数据开始地址(注意是以2字节为单位) */
int len; /* 校验数据的长度大小,以字节为单位 */
{
int sum = 0 ; /* 校验和 */
int nleft = len; /* 未累加的数据长度 */
unsigned short * p; /* 走动的临时指针,2字节为单位 */
unsigned short tmp = 0 ; /* 奇数字节长度时用到 */
while ( nleft > 1 )
{
sum += * p ++ ; /* 累加 */
nleft -= 2 ;
}
if (nleft == 1 ) /* 奇数字节长度 */
{
* (unsigned char * ) & tmp = * ( & (unsigned char * )p); /* 将最后字节压如2字节的高位 */
sum += tmp;
}
sum += (sum >> 16 ) + (sum & 0xffff ); /* 高位低位相加 */
sum += sum >> 16 ; /* 上一步溢出时,将溢出位也加到sum中 */
tmp = ~ sum; /* 注意类型转换,现在的校验和为16位 */
return tmp;
}
* 计算icmp校验和算法
* 2008-05-02
* ************************* */
unsigned short chksum(addr,len)
unsigned short * addr; /* 校验数据开始地址(注意是以2字节为单位) */
int len; /* 校验数据的长度大小,以字节为单位 */
{
int sum = 0 ; /* 校验和 */
int nleft = len; /* 未累加的数据长度 */
unsigned short * p; /* 走动的临时指针,2字节为单位 */
unsigned short tmp = 0 ; /* 奇数字节长度时用到 */
while ( nleft > 1 )
{
sum += * p ++ ; /* 累加 */
nleft -= 2 ;
}
if (nleft == 1 ) /* 奇数字节长度 */
{
* (unsigned char * ) & tmp = * ( & (unsigned char * )p); /* 将最后字节压如2字节的高位 */
sum += tmp;
}
sum += (sum >> 16 ) + (sum & 0xffff ); /* 高位低位相加 */
sum += sum >> 16 ; /* 上一步溢出时,将溢出位也加到sum中 */
tmp = ~ sum; /* 注意类型转换,现在的校验和为16位 */
return tmp;
}