Chinaunix首页 | 论坛 | 博客

分类: LINUX

2014-03-05 19:44:24

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是指数据长度(不包括数据的包头)
阅读(1523) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~