Fin*_*fin 7 c linux networking network-programming linux-kernel
我正在编写一个内核模块,它使用Netfilter挂钩修改一些TCP头信息,显然,在发送之前,我想重新计算校验和.
我也在接收端编辑标题,所以我也需要在那里重新计算它.
在网上搜索,我发现有些人说我可以简单地将它设置为0并且它将为我计算,显然这不起作用.
我也发现了这个功能
tcp_v4_send_check(struct sock *sk, struct sk_buff *skb);
Run Code Online (Sandbox Code Playgroud)
虽然没有人解释如何使用它,以及我是否可以在接收/发送时以相同的方式使用它.
我自己的尝试是将校验和设置为0然后调用此函数传递我拥有的skb和我拥有的skb-> sk,仍然没有.
那么请问,计算TCP数据报校验和的简单方法是什么?
要重新计算校验和,您最好计算增量校验和 - 只需根据您更改的字段修改现有校验和,而不是读取整个数据包。
当您更改数据包时,当您知道旧值和存储的新值时,必须执行此操作。
基本思想是tcp->check += (new_val - old_val)。
它比这更复杂一点,因为:
1.old_val需要new_val是 16 位值,按 2 个字节对齐(例如更改端口号)。
2. 校验和使用补码运算,因此需要进行“进位反馈”。这基本上意味着,如果tcp->check + new_val - old_val为负数,则需要从结果中减去 1。
| 归档时间: |
|
| 查看次数: |
9592 次 |
| 最近记录: |