最近笔记做到作业部落了,这个东西就留在 CSDN 了
linux 分段模式下的校验和计算
__u16 computeTCPChecksum(__u32 saddr, __u32 daddr, __u32 len , __u8 protocol){
__u16 uNum1 = *((__u16*)&saddr);
__u16 uNum2 = *((__u16*)&saddr + 1);
__u16 uNum3 = *((__u16*)&daddr);
__u16 uNum4 = *((__u16*)&daddr + 1);
// 交换高低位
uNum1 = htons(uNum1);
uNum2 = htons(uNum2);
uNum3 = htons(uNum3);
uNum4 = htons(uNum4);
__u32 sum = uNum1 + uNum2 + uNum3 + uNum4 + len + protocol;
// 超过 0xFFFF 的 右移 16位 加上不超过 0xFFFF 的部分
while(sum >> 16)
{
sum = (sum & 0xffff) + (sum >> 16);
}
// 累加和转换字节序并保留低位
return (__u16) (htons(sum) & 0xFFFF);
}
if(!(skb_shinfo(skb)->nr_frags &&\
(computeTCPChecksum(iph->saddr, iph->daddr, tot_len - iph_len, iph->protocol)\
== tcph->check))) {
}