这个分片结构体和sk_buff结构的数据区是一体的,所以在各种操作时都把他们两个结构看做是一个来操作。比如:为sk_buff结构的数据区申请和释放空间时,分片结构也会跟着该数据区一起分配和释放。而克隆时,sk_buff的数据区和分片结构都由分片结构中的 dataref 成员字段来标识是否被引用。
下面来看下sk_buff结构的数据区和分片结构的关系图:
从上图也可以看出来分片结构和sk_buff的数据区连在一起,end指针的下个字节就是分片结构的开始位置。那访问分片结构时,可以直接用end指针作为这个分片结构体的开始(记得要强转成分片结构体)或者用内核定义好的宏:
#define skb_shinfo(SKB) ((struct skb_shared_info *)((SKB)->end)) 去访问也可以,其本质也是返回个sk_buff的end指针。
分片结构体的数据区:
在讲分片结构时,谈到其中有个成员字段非常重要:skb_frag_t
frags[MAX_SKB_FRAGS]; 其实这就和分片结构的数据区有关。下面来讲下这个数字中的元素结构体:
typedef struct skb_frag_struct skb_frag_t; struct skb_frag_struct { };
struct page *page; // 指向分片数据区的指针,类似于sk_buff__u32 page_offset; // 偏移量,表示从page指针指向的地方,偏__u32 size; // 数据区的长度,即:sk_buff结构中的data_len 中的data指针 移page_offset
还是请看下面的两幅图:
上面这幅图是用数组存储的分片数据区指针的,这是一种分片数据类型。下面看另外一种用frag_list指针来指向的分片数据类型:
对于sk_buff结构体及相关结构体就分析这些吧,这是对sk_buff结构体的一个全面透彻的分析,后面还会研究下sk_buff结构相关的操作函数。
摘自:http://blog.csdn.net/yuzhihui_no1/article/details/38666589
相关推荐: