我正在使用 xfrm 表(IPv6)对数据包进行自定义转换。作为转换的一部分,我添加了 UDP 标头(基本上将我的数据放入 UDP 又名 UDP 封装中)。转型是正确的。
由于此转换发生在网络层,因此我正在计算添加的 UDP 标头的校验和。 wireshark 报告此校验和不正确。我的内核版本是3.10。我无法使用,udp6_hwcsum_outgoing()
因为我没有“struct sock”。
任何人都可以指导我在我的内核或任何其他内核版本中正确计算校验和的方法吗?
我尝试了以下操作(全部产生错误的值)-
1.
skb->csum = csum_partial((char*)uh, sizeof(struct udphdr), skb->csum);
uh->check = csum_ipv6_magic(&(ip6h->saddr), &(ip6h->daddr),htons(uh->len), IPPROTO_UDP, skb->csum);
2.
~csum_ipv6_magic(&(ip6h->saddr), &(ip6h->daddr),uh->len, IPPROTO_UDP,0);
3.
csum = skb_checksum(skb, 0, skb->len, 0);
uh->check = udp_v6_check(sub->len, saddr, daddr, csum);