gpt4 book ai didi

c++ - 如何在 netfilter 中重新计算 IP 校验和?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:17 26 4
gpt4 key购买 nike

我正在开发一个 netfilter 内核模块,我需要在其中重新计算 IP 校验和。我用这个函数来计算 IP 校验和(在互联网上的某个地方找到的):

unsigned short ComputeIPChecksum(unsigned char *data, int len)
{
long sum = 0; /* assume 32 bit long, 16 bit short */
unsigned short *temp = (unsigned short *)data;

while(len > 1){
sum += *temp++;
if(sum & 0x80000000) /* if high order bit set, fold */
sum = (sum & 0xFFFF) + (sum >> 16);
len -= 2;
}

if(len) /* take care of left over byte */
sum += (unsigned short) *((unsigned char *)temp);

while(sum>>16)
sum = (sum & 0xFFFF) + (sum >> 16);

return ~sum;
}

通过查看 wireshark,我可以看到传入数据包已成功接收,但对于传出数据包,wireshark 显示不正确的 ip 校验和。这是我的钩子(Hook)函数:

static unsigned int hook_func(unsigned int hooknum,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
sock_buff = skb;

if (sock_buff)
{
ip_header = (struct iphdr *)skb_network_header(sock_buff);
if (ip_header && ip_header->protocol == TCP)
{
ip_header->check = ComputeIPChecksum((unsigned char *)ip_header, ip_header->ihl*4);
}
}
return NF_ACCEPT;
}

这是主要的,我已经将相同的钩子(Hook)函数绑定(bind)到 PRE_ROUTING 和 POST_ROUTING

static int __init init_main(void)
{
nfho.hook = hook_func;
nfho.hooknum = 0;
nfho.pf = PF_INET;
nfho.priority = NF_IP_PRI_FIRST;

nfho1.hook = hook_func;
nfho1.hooknum = 4;
nfho1.pf = PF_INET;
nfho1.priority = NF_IP_PRI_FIRST;

nf_register_hook(&nfho);
nf_register_hook(&nfho1);

return 0;
}

为什么传出数据包的 IP 校验和会损坏???

wireshark 中显示的错误:

Header checksum: 0x0000 [incorrect, should be 0x85de (maybe caused by "IP checksum offload"?)]

最佳答案

你在哪里捕获数据包?

IP 校验和(以及 TCP/UDP 校验和)可以由网卡本身计算。如果您的卡上出现这种情况(这是一个非常常见的功能)并且您正在您的机器上捕获我希望看到 0 校验和。

关于c++ - 如何在 netfilter 中重新计算 IP 校验和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10366706/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com