我正在使用 eBPF API 将 IPv4 (UDP) 数据包转换为 IPv6 数据包。当我在 tcpdump 上捕获数据包时,我看到数据包的校验和错误。我没有修改数据包的 UDP 标头,只是将 IPv4 转换为 IPv6。问题是我不确定在调用中“oldsum”和“newsum”的值是多少bpf_l4_csum_replace
代码:
oldsum = 0
newsum = 0;
newsum = sum16((__u16 *)&s6addr, sizeof(s6addr) >> 1);
newsum += sum16((__u16 *)&d6addr, sizeof(d6addr) >> 1);
newsum += payload_len + ip6h.nexthdr;
ret = bpf_l4_csum_replace(skb, sizeof(struct ethhdr) + sizeof(ip6h) + csum_off,
oldsum, newsum,
BPF_F_MARK_MANGLED_0 | BPF_F_PSEUDO_HDR | 4);
if (ret) {
bpf_printk("bpf_l4_csum_replace returned %d\n", ret);
return TC_ACT_SHOT;
}
TCPDUMP:
12:01:09.874198 IP6 (hlim 64, next-header UDP (17) payload length: 24) 2405:201:d003:b01a:f868:448c:1373:6ee4.6666 > 2001:db01::1.6666: [bad udp cksum 0x7589 -> 0x7690!] UDP, length 16
0x0000: 0242 6e76 a5af 0242 ac11 0002 86dd 6000
0x0010: 0000 0018 1140 2405 0201 d003 b01a f868
0x0020: 448c 1373 6ee4 2001 db01 0000 0000 0000
0x0030: 0000 0000 0001 1a0a 1a0a 0018 7589 4865
0x0040: 6c6c 6f20 5544 5020 5365 7276 6572
请帮助我如何将“oldsum”和“newsum”的正确值告知 bpf_l4_csum_replace。谢谢