linux内核网络sk_buff结构详解
文章平均质量分 90
本专栏是通过读《深入理解linux网络技术内幕》和自己的理解整理而成的笔记,从sk_buff结构体到sk_buff_info结构体都成员都有详细解释;以及对这些结构体的一些操作函数,和内存申请、释放、克隆、拷贝等函数;还有一些操作队列函数;总之是对sk_buff一个透彻的讲解。
庾志辉
这个作者很懒,什么都没留下…
展开
-
sk_buff整理笔记(五、队列管理函数)
分析sk_buff结构及相关结构的队列管理函数:初始化函数,skb_queue_head_init(struct sk_buff_head *list);插入函数,kb_queue_head(),skb_queue_tail();出队列函数,sk_buff *skb_dequeue(struct sk_buff_head *list),sk_buff *skb_dequeue_tail(struct sk_buff_head *list);清空队列函数,skb_queue_purge(struct sk_b原创 2014-08-31 22:37:54 · 7055 阅读 · 0 评论 -
sk_buff整理笔记(四、克隆与复制)
上面的pskb_copy()函数和skb_clone()函数类似:skb_clone()函数克隆出来的skb结构不能修改其共享数据区的数据,而pskb_copy()函数也是一样的,克隆出来的skb及数据区不能修改共享的分片结构数据区内容。所以如果想要修改分片结构数据区的内容,则必须要用skb_copy()函数来克隆skb结构体。skb_copy()函数是对skb结构体真正的完全复制拷贝。不仅是sk_buff结构体还有data指针指向的数据区(包括分片结构)以及分片结构中指针指向的数据区,都各自复制拷贝一份。原创 2014-08-25 21:41:07 · 6861 阅读 · 1 评论 -
sk_buff整理笔记(三、内存申请和释放)
内核对于sk_buff结构的内存分配不是和一般的结构动态内存申请一样:只分配指定大小的内存空间。而是在开始的时候,在初始化函数skb_init()中就分配了两段内存(skbuff_head_cache和skbuff_fclone_cache )来供sk_buff后期申请时用,所以后期要为sk_buff结构动态申请内存时,都会从这两段内存中来申请(其实这不叫申请了,因为这两段内存开始就申请好了的,只是根据你要的内存大小从某个你选定的内存段中还回个指针给你罢了)。如果在这个内存段中申请失败,则再用内核中用最低层原创 2014-08-21 22:00:46 · 9415 阅读 · 2 评论 -
sk_buff整理笔记(二、操作函数)
sk_buff整理笔记(一、数据结构)这一篇要讲的是内核为sk_buff结构提供的一些操作函数:(a)skb_put(), (b)skb_push(), (c)skb_pull(), and (d)skb_reserve(); 四大指针分别是:head、data、tail、end;这四个指针都是指向了数据区的,数据区中存放的是协议头和数据。head和end指针是每个数据包一样的,也是有这两个指针来确定数据区的大小的。最开始的时候head、data、tail三个指针都是指向一起的,当有协议数据加进来时才更原创 2014-08-20 23:21:05 · 8693 阅读 · 1 评论 -
sk_buff 整理笔记(一、数据结构)
对sk_buff结构体以及相关的sk_buff_head结构体、sk_buff结构体数据区、sk_shared_info分片结构体、分片结构体的数据区的常用成员字段进行透彻的分析。以及分析这几个结构体的关系与一个sk_buff数据包的形成和其data指针的变化。 (1)sk_buff->data_len:只计算分片中数据的长度,即是分片结构体中page指向的数据区长度。这个在分片结构体中会再详细讲解下。 (2)sk_buff->len:表示当前缓冲区中数据块的大小的总长度。它包括主缓冲中(即是sk_原创 2014-08-18 21:47:11 · 30507 阅读 · 23 评论