下面代码是自己写的一个ipv6下tcp的校验和计算代码,包含了伪头部信息。关于计算效率未进行详细测试。代码比较简单记录在此以备不时之需。
/*
*function: 计算ipv6协议下的tcp校验和
*参数:
* packet:tcp负载
* pktlen: tcp负载长度
* saddr: ipv6源地址
* daddr: ipv6目的地址
*返回值:校验和
*/
uint16_t TcpCsumIpv6(uint16_t *packet, uint32_t pktlen, uint32_t *saddr, uint32_t *daddr)
{
register long sum = 0;
uint32_t len;
int i;
uint16_t csum;
for (i = 0; i < 4; i++) {
sum += ((saddr[i] & 0xFFFF) + (saddr[i] >> 16));
sum += ((daddr[i] & 0xFFFF) + (daddr[i] >> 16));
}
len = htonl(count);
sum += ((len & 0xFFFF) + (len >> 16));
sum += htons(IPPROTO_TCP);
while (count > 1) {
sum += *addr++;
count -= 2;
}
if (count > 0)
sum += *addr & 0xFF;
while (sum >> 16) {
sum = (sum & 0xFFFF) + (sum >> 16);
sum += (sum >> 16);
}
csum = ~sum;
return csum;
}