#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是缓冲区的结束地址。 char cb[48]...
sk_buff_data_t transport_header ;/* 传输层协议头 */ sk_buff_data_t network_header ;/* 网络层协议头 */ sk_buff_data_t mac_header ;/* 链路层协议头 */ sk_buff_data_t tail ;/* 指向驻留在线性数据区的最后一字节数据*/ sk_buff_data_end ;/* 指向线性数据区的结尾,确保不超出可用存储...
1.1.1.1 sk_buff定义 具体如下,差不多有两页左右: struct sk_buff { union { struct { /* These two members must be first. */ struct sk_buff *next;//列表中下一个buffer struct sk_buff *prev;//列表中上一个buffer union { ktime_t tstamp;//分组到达或离开的时间 u64 skb_mstamp; }; ...
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_data_t transport_header; //L4 sk_buff_data_t network_header; //L3 sk_buff_data_t mac_header; //L2 这些指针分别指向报文头部,和2.4版本比较有了变化,不再是联合体,使用更加方便了,Linux给出了很方便的函数直接定位到各层的头部。下图是2.4版本的,只是说明一下。
atomic_t users:引用sk_buff的计数,通过函数skb_get和kfree_skb操纵。实际(data buffer)数据区的引用计数由dataref(skb_shared_info中)表示 unsigned int truesize:在alloc_skb被设置为len+sizeof(skb_shared_info) sk_buff_data_t tail sk_buff_data_t end ...
data_len只计算片段中的数据大小 unsigned int mac_len MAC报头的大小 atomic_t users 引用计数,或者使用这个sk_buff缓冲区的实例的数目。 这个参数的主要用途是避免在某人依然使用此sk_buff结构时,把这个结构给释放掉。因此,此缓冲区的每个用户在必要时都要递增和递减此字段。
sk_buff结构体通常包含以下字段: data:指向实际数据开始位置的指针。 tail:指向当前缓冲区末尾的指针,可以用于添加更多数据。 end:表示缓冲区的结束位置,用于限制写入操作。 len:当前有效数据的长度。 protocol:数据包所使用的协议类型(如 IPv4、IPv6、ARP 等)。
*/ // 指向数据尾部的指针 sk_buff_data_t tail;、 // 指向缓冲区尾部的指针 sk_buff_data_t end; // 指向缓冲区头部的指针 unsigned char *head, // 指向数据头部的指针 *data; // 缓冲区总大小,包括sk_buff结构本身 unsigned int truesize; // 引用计数,表示使用这个sk_buff缓冲区的实例的数目。
1、先说一下sk_buff结构体 这个结构体是套接字的缓冲区,详细记录了一个数据包的组成,时间、网络设备、各层的首部及首部长度和数据的首尾指针。 下面是他的定义,挺长 [cpp]view plaincopy structsk_buff { /* These two members must be first. */ ...