sk_buff_data_t就是unsigned char * */ sk_buff_data_t tail;//指向报文尾巴 sk_buff_data_t end;//指向报文最后一个字节 unsigned char *head,//分配的内存块的起始位置;指向数据区中开始的位置(非实际数据区域开始位置) *data;//保存数据内容的首地址;(实际数据区域开始位置) /*缓冲区的总长度,包括s...
1、sk_buff四大指针与相关操作 分配初始化: struct sk_buff中四个指针都指向数据区,分别是head、data、tail、end,刚刚分配出来的sk_buff会立马进行四大指针的初始操作。分配sk_buff如下所示: sk_stream_alloc_skb最终调用__alloc_skb函数进行内存分配,分配skb后,进行四大指针的初始化操作: 其中skb_reset_tail_poi...
引用计数,使用这个sk_buff的使用者的数目,可能有多个函数要使用同一个sk_buff所以防止提前释放掉,设置此计数 unsigned int truesize 此缓冲区总大小,包括sk_buff。sk_buff只不过是个指针的集合,他所指的才是真正的数据区,所以是两部分。(见下图) sk_buff_data_t tail; sk_buff_data_t end; unsigned char *...
#ifdef NET_SKBUFF_DATA_USES_OFFSET typedef unsigned int sk_buff_data_t; #else typedef unsigned char *sk_buff_data_t; #endif 这里主要说明下后面几个后面的四个属性的含义head、data、tail、end head是缓冲区的头指针,data是数据的起始地址,tail是数据的结束地址,end是缓冲区的结束地址。 charcb[48] ...
在内核中sk_buff表示一个网络数据包,它是一个双向链表,而链表头就是sk_buff_head,在老的内核里面sk_buff会有一个list域直接指向sk_buff_head也就是链表头,现在在2.6.32里面这个域已经被删除了。 而sk_buff的内存布局可以分作3个段,第一个就是sk_buff自身,第二个是linear-data buff,第三个是paged-data ...
1、先说一下sk_buff结构体 这个结构体是套接字的缓冲区,详细记录了一个数据包的组成,时间、网络设备、各层的首部及首部长度和数据的首尾指针。 下面是他的定义,挺长 [cpp]view plaincopy structsk_buff { /* These two members must be first. */ ...
在内核中sk_buff表示一个网络数据包,它是一个双向链表,而链表头就是sk_buff_head,在老的内核里面sk_buff会有一个list域直接指向sk_buff_head也就是链表头,现在在2.6.32里面这个域已经被删除了。 而sk_buff的内存布局可以分作3个段,第一个就是sk_buff自身,第二个是linear-data buff,第三个是paged-data ...
sk_buff_data_t transport_header; sk_buff_data_t network_header; sk_buff_data_t mac_header; 。。。 }; 上面分别是运输层/网络层/链路层头变量,看看sk_buff_data_t定义: #ifdef NET_SKBUFF_DATA_USES_OFFSET typedef unsigned int sk_buff_data_t; //使用偏移来表示数据头位置 #else...
在内核中sk_buff表示一个网络数据包,它是一个双向链表,而链表头就是sk_buff_head,在老的内核里面sk_buff会有一个list域直接指向sk_buff_head也就是链表头,现在在2.6.32里面这个域已经被删除了。 而sk_buff的内存布局可以分作3个段,第一个就是sk_buff自身,第二个是linear-data buff,第三个是paged-data ...
1、先说一下sk_buff结构体 这个结构体是套接字的缓冲区,详细记录了一个数据包的组成,时间、网络设备、各层的首部及首部长度和数据的首尾指针。 下面是他的定义,挺长 struct sk_buff { /* These two members must be first. */ struct sk_buff *next; ...