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

来源:互联网 发布:淘宝开店铺要钱吗 编辑:程序博客网 时间:2024/05/29 12:33
作者: 和linux相关

简介:这是重构skb包中的检验和的计算的详细页面,介绍了和linux,有关的知识、技巧、经验,和一些linux源码等。

   在之前看过那篇对于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

原创粉丝点击