cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
阅读:2588回复:3

关于sk_buff的一点注意

楼主#
更多 发布于:2007-06-15 19:43
1 sk_buff本身并不包含存放网络包的数据的存储区,存储区是另外单独分配的内存空间,但该结构说明了如何访问存储区空间,如何维护多个存储区空间以及存储网络包解析的成果。

2 sk_buff中有四个指针指向存储区:其中head一定指向存储区的开头,end一定指向存储区的结尾。data指向实际内容的开头,tail指向实际内容的结尾。这样做有两个原因,一是在分配空间的时候我们尚不知道具体需要多大的空间,只能按照最大可能空间来分配;二是为了满足字节对齐的需要。

3 sk_buff中data部分内容包括网络包的所有内容:对于输入包而言,其就是从当前层向上的所有层的头和最后的负载,每解析掉一层的头,该协议的协议头对应的数据就不再继续处理,所以data指针在每层会逐渐增大;对于输出包而言,其每向下传输一层,都会添加一层的头,所以sk_buff的data指针也会不断减小。

4 对于输入包而言,存储区的内容是不变的。但分析包时,在每层都会剥除该层的头。为了保留剥除结果,结构中会有三个指针分别指向以太,网络和传输三层的协议头:这三个指针依次分别是union {…} mac,union {…} nh和union{…} h。三个成员都是联合,其中的内容是该层可能的协议类型的指针。

5 注意sk_buff中的几个长度字段含义:len表示存储区的数据长度和分片长度之和;data_len表示分片长度;mac_len表示mac头的长度;truesize表示存储区总长度(即end-head)和sk_buff本身长度之和。

6 刚初始化完的存储区,head,data,tail都指向存储区的开头,end指向结尾。

7 skb_put则是将tail下移,即增加了真正空间的长度。

  skb_push是将data上移,也增加了真正空间的长度。

  skb_pull将data下移,减少了真正空间的长度。

8 对于sk_buff和存储块,有时是需要拷贝的。分为三种情况,一是只拷贝sk_buff,存储块复用,此时使用skb_clone函数;二是拷贝sk_buff和存储块的主体,但存储块后的skb_shared_info中frags数组指向的分片数据不拷贝,这使用pskb_copy函数;三是上述的全都拷贝,使用skb_copy函数。在不同情况下不同使用。
走走看看开源好 Solaris vs Linux
longlongxcx
驱动牛犊
驱动牛犊
  • 注册日期2008-07-04
  • 最后登录2009-03-10
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-07-04 10:19
引用楼主cyliu于2007-06-15 19:43发表的 关于sk_buff的一点注意 :
1 sk_buff本身并不包含存放网络包的数据的存储区,存储区是另外单独分配的内存空间,但该结构说明了如何访问存储区空间,如何维护多个存储区空间以及存储网络包解析的成果。

2 sk_buff中有四个指针指向存储区:其中head一定指向存储区的开头,end一定指向存储区的结尾。data指向实际内容的开头,tail指向实际内容的结尾。这样做有两个原因,一是在分配空间的时候我们尚不知道具体需要多大的空间,只能按照最大可能空间来分配;二是为了满足字节对齐的需要。

3 sk_buff中data部分内容包括网络包的所有内容:对于输入包而言,其就是从当前层向上的所有层的头和最后的负载,每解析掉一层的头,该协议的协议头对应的数据就不再继续处理,所以data指针在每层会逐渐增大;对于输出包而言,其每向下传输一层,都会添加一层的头,所以sk_buff的data指针也会不断减小。
.......


那么我想问下,是不是如果用到了sk_buff结构,就一定要向内核注册MAC地址啊,我现在要想数据从Ip层直接传给下层(自己用软件实现的MAC层),在这中间想用一个接口实现,能否给点提示。


以我自己认为:从IP层向下层传输数据,不就是传Ip包给下层,这样MAC层只需要调用Ip层中的sk_buff不就可以了吗?这个接口不是宣布需要了吗???不知道我想的是否正确,谢谢!!
longlongxcx
驱动牛犊
驱动牛犊
  • 注册日期2008-07-04
  • 最后登录2009-03-10
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-07-04 10:22
改正下,这个接口不是宣布需要了吗???是说这个接口不是就可以不需要了
jaky_shark
驱动牛犊
驱动牛犊
  • 注册日期2007-05-03
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望21点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-07-04 16:24
楼主写得不错。顶一下
游客

返回顶部