SK - BUFF学习笔记

loading 分享 2026-7-18 下载文档

这个分片结构体和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


SK - BUFF学习笔记.doc 将本文的Word文档下载到电脑
搜索更多关于: SK - BUFF学习笔记 的文档
相关推荐
相关阅读