Chinaunix首页 | 论坛 | 博客
  • 博客访问: 119183
  • 博文数量: 24
  • 博客积分: 416
  • 博客等级: 下士
  • 技术积分: 238
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-07 19:16
文章分类
文章存档

2011年(24)

分类: LINUX

2011-07-20 14:49:58

redhat 2.6.8.1内核。
套接字缓冲区有三种重要的数据类型:
1.struct sk_buff_head类型,管理套接字缓冲区
2.struct sk_buff类型,套接字缓冲区类型
3.struct skb_shared_info类型,管理套接字缓冲区的分片信息

在alloc_skb()函数中
skb->truesize指缓冲区的总大小,即整个struct sk_buff skb的大小,所以当然不包括struct skb_shared_info类型。
skb->truesize=sizeof(struct sk_buff) + SKB_DATA_ALIGN(size)
说明:SKB_DATA_ALIGN(size)是在gfp_mask函数初始定义时的size的基础上调整后的,通常把调整后的值再赋给size,代替原来的size。
即:size = SKB_DATA_ALIGN(size)
为什么要调整呢?
因为X86 上为128 bytes,根据L1_CACHE_BYTES调整大小,补齐为128的整数倍;
所以SKB_DATA_ALIGN(size)的值比size的值要大。
初始化后:size的大小为head和end指针之间的大小


在用alloc_skb()函数分配缓冲区时,alloc_skb()建立了套接字缓冲区与struct skb_shared_info结构的关系。
用alloc_skb()函数分配的缓冲区大小为:
struct sk_buff + SKB_DATA_ALIGN(size) + struct skb_shared_info
这三个的大小之和。

skb->len是指数据长度(包括数据的包头),即data,tail指针所指的部分。
当调用数据区的操作函数如:skb_put,skb_push,skb_pull,skb_trim来在数据区增加或去除协议的头部,尾部时,即在增加或减少len的长度。
注意:headroom,tailroom,是当数据从协议栈的上层传递到下层时,可向这两个区域填充协议字段的内容。
协议字段的内容并不是上面的协议的头部或者尾部,
在struct sk_buff中,协议字段的定义为:
unsigned short protocol //协议字段
 
skb->datalen是指数据长度(不包括数据的包头)
阅读(10716) | 评论(1) | 转发(2) |
给主人留下些什么吧!~~

yandongxiao2014-03-06 18:11:19

博主你好,我有三个疑问,向博主讨教。我在Linux 3.2.1下测试  

第一 :
skb->truesize = 704, 其中end-tail = 320,  sizeof(sk_buff) = 192, sizeof(skb_shared_buf) = 188.  alloc_skb中是32字节对齐的,所以704=192+192+320.
所以下面这句话是不是存在问题呀?
"""
    skb->truesize=sizeof(struct sk_buff) + SKB_DATA_ALIGN(size)
"""

第二:
       unsigned short protocol 应该是在MAC看来上层协议的类型吧,比如它的值得一般会是0x0008