trys1 发表于 2016-03-02 13:40

内核中,NetFilter里,使用dev_queue_xmit发送UDP包

在NetFilter下,钩住NF_INET_PRE_ROUTING
使用dev_queue_xmit发送UDP包,目标端用Wireshark能抓到包,但是在程序里用recvfrom却收不到



求教这是为什么

trys1 发表于 2016-03-02 14:24

最新发现,我把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:36

本帖最后由 Godbach 于 2016-03-02 14:37 编辑

回复 1# trys1

UDP 数据部分不用计算校验和 udph->check = 0 应该就就行


   

trys1 发表于 2016-03-02 14:43

回复 3# Godbach

是的。只要udph->check=0;确实就能正常发送接收了。但我现在的问题是,这样做是符合规范的吗?真的不需要把check值设置一下吗



   

Godbach 发表于 2016-03-02 15:05

回复 4# trys1

合规的。UDP 校验和不是必须的。

而且你也可以抓包看一下,正常的 UDP 报文,是否填充了校验和的


   

nswcfd 发表于 2016-03-03 12:32

csum_tcpudp_magic计算伪头的校验和,还缺少整个payload部分的校验和。
skb->csum在rx/tx路径上的含义不太一样,取决于硬件hw checksum的能力。
保险的方法还是使用csum_partial重新算一下payload的校验和。
可以参考协议栈udp的发送路径。
页: [1]
查看完整版本: 内核中,NetFilter里,使用dev_queue_xmit发送UDP包