内核中,NetFilter里,使用dev_queue_xmit发送UDP包
在NetFilter下,钩住NF_INET_PRE_ROUTING使用dev_queue_xmit发送UDP包,目标端用Wireshark能抓到包,但是在程序里用recvfrom却收不到
求教这是为什么 最新发现,我把udph->check=0然后不去计算校验和,就能成功接收了
说明是我的校验和算错了
udph->check = csum_tcpudp_magic (iph->saddr, iph->daddr,
ntohs(udph->len),
iph->protocol, skb->csum)
那么问题来了,发送时,合理的udph->check应该怎么设置呢? 本帖最后由 Godbach 于 2016-03-02 14:37 编辑
回复 1# trys1
UDP 数据部分不用计算校验和 udph->check = 0 应该就就行
回复 3# Godbach
是的。只要udph->check=0;确实就能正常发送接收了。但我现在的问题是,这样做是符合规范的吗?真的不需要把check值设置一下吗
回复 4# trys1
合规的。UDP 校验和不是必须的。
而且你也可以抓包看一下,正常的 UDP 报文,是否填充了校验和的
csum_tcpudp_magic计算伪头的校验和,还缺少整个payload部分的校验和。
skb->csum在rx/tx路径上的含义不太一样,取决于硬件hw checksum的能力。
保险的方法还是使用csum_partial重新算一下payload的校验和。
可以参考协议栈udp的发送路径。
页:
[1]