【发布时间】:2014-03-12 20:27:50
【问题描述】:
我正在尝试在发送数据包时在内核中手动修改 IP 标头中的源地址和目标地址。之后,我需要重新计算 IP 校验和和 TCP 校验和。
我是按照下面的方式做的。
iph = ip_hdr(skb);
iph->saddr = mysaddr;
iph->daddr = mydaddr;
tcph= tcp_hdr(skb);
__tcp_v4_send_check(skb, iph->saddr, iph->daddr);
iph->tot_len = htons(skb->len);
ip_send_check(iph);
但在接收端,校验和总是在 TCP 层失败,而它可以通过 IP 层。
我做了很多debug,发现在正常过程中,当数据包到达时,skb->ip_summed一般是CHECKSUM_UNNECESSARY,但是如果我在发送端进行修改,那么到达接收端的时候这个值就是CHECKSUM_NONE .
谁能给我一些建议?谢谢。
【问题讨论】:
-
对
iph->tot_len的分配不应该在__tcp_v4_send_check之前吗?
标签: linux tcp linux-kernel ip