免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6539 | 回复: 7
打印 上一主题 下一主题

内核构造udp数据包,计算校验和需要注意的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-05 14:35 |只看该作者 |倒序浏览
其中涉及到两个函数

skb_checksum(const struct sk_buff *skb, int offset,
int len, __wsum csum)
四个参数解释:
skb:不用说了
offset:IP Header长度
len:IP payload长度
csum:0,计算校验和时为0

csum_tcpudp_magic(__be32 saddr, __be32 daddr,
unsigned short len,
unsigned short proto,
__wsum sum)

saddr:源IP
daddr:目的IP
proto:传输协议
sum:IP payload校验和

两个函数配合使用,前者是计算UDP payload校验和,后者是计算整个IP payload校验和。

两个注意的问题:
因为校验和不涉及链路层,如果skb是直接从网卡驱动取出来的话,就需要把skb->data设置为iph
在调用skb_checksum以前必须设置udph->check为0。这是协议规定的


我就是因为下面提到的两个问题,花了很久才弄明白。
网上也能搜到一些相关的内容,可惜说的不是很明白,详细参考了《TCP/IP详解第一卷》才弄明白

[ 本帖最后由 印随 于 2009-11-5 14:38 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-11-05 14:40 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2009-11-05 15:26 |只看该作者
两个函数配合使用,前者是计算UDP payload校验和,
skb_checksum(const struct sk_buff *skb, int offset,
int len, __wsum csum)

你的是那个版本,记得通常时使用csum_partial来计算数据部分的

论坛徽章:
0
4 [报告]
发表于 2009-11-05 18:07 |只看该作者
kernel  2.6.28.10

PS:
听同事说 这两个函数接口好像经常变,

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2009-11-05 19:28 |只看该作者
原帖由 印随 于 2009-11-5 18:07 发表
kernel  2.6.28.10

PS:
听同事说 这两个函数接口好像经常变,


记得前两天看了2.6.30.9的,接口好像用的还是csum_partial。难道是有变化了,还是我记错了

论坛徽章:
0
6 [报告]
发表于 2009-11-05 20:49 |只看该作者
skb_checksum调用csum_partial,算是高级一点的接口

论坛徽章:
0
7 [报告]
发表于 2009-11-10 10:32 |只看该作者
随便是不是还要checkip头呀!
skb->csum = skb_checksum()
iph->check = ip_fast_csum()
udph->check = csum_tcpudp_magic()
:wink:

论坛徽章:
0
8 [报告]
发表于 2012-07-09 09:39 |只看该作者
我感觉LZ你说的不对吧,skb_checksum应该是整个SKB结构的校验和,csum_tcpudp_magic是计算UDP和TCP伪首部的校验和。我想计算UDP和TCP的校验和有没有直接的接口呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP