文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>重构skb包中的检验和的计算

重构skb包中的检验和的计算

时间:2010-11-02  来源:luoyan_xy

   在之前看过那篇对于sk_buff结构介绍的文章后,对skb包中各字段有了比较深的认识吧,这两天又看了如何构造skb包的两个帖子,也在虚拟机上实现了一把,但在这里不讨论实现的具体流程,只说一下在自己构造skb包时各个检验和字段的计算。    其中主要涉及三个函数: skb_checksum(const struct sk_buff *skb, int offset,
int len, __wsum csum)
四个参数解释:
skb:不用说了
offset:IP Header长度
len:IP payload长度
csum:0,计算校验和时为0
ip_fast_csum(const void *iph, unsigned int ihl) iph: ip头部首地址 ihl: ip头部长度/4,也即是iph->ihl字段的值
csum_tcpudp_magic(__be32 saddr, __be32 daddr,
unsigned short len,
unsigned short proto,
__wsum sum)

saddr:源IP
daddr:目的IP
proto:传输协议
sum:IP payload校验和,在使用中我是用的skb->csum字段的值,在网上也见到一种是通过csum_partial((char *)udph,udp_len,0),感觉上应该跟第一种计算方式是等价的,有待验证。

第一个是计算TCP、UDP payload校验和,也就是skb->csum字段,第二个是计算ip头部检验和,iph->check,后者是计算整个IP payload校验和,也就是tcp->check。
  在构造流程中的计算如下: skb->csum = skb_checksum()
iph->check = ip_fast_csum()
udph->check = csum_tcpudp_magic(
  两个注意的问题:
因为校验和不涉及链路层,如果skb是直接从网卡驱动取出来的话,就需要把skb->data设置为iph
在调用skb_checksum以前必须设置udph->check为0。这是协议规定的

 

关于如何重新构造skb包的文档地址如下:

http://linux.chinaunix.net/bbs/viewthread.php?tid=1152885&extra=page%3D3%26amp%3Bfilter%3Ddigest

http://blog.chinaunix.net/u2/73067/showart_2254716.html


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载