linux 分段模式下的校验和计算

最近笔记做到作业部落了,这个东西就留在 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))) {

}

你可能感兴趣的:(linux 分段模式下的校验和计算)