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...
#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; //L4 sk_buff_data_t network_header; //L3 sk_buff_data_t mac_header; //L2 这些指针分别指向报文头部,和2.4版本比较有了变化,不再是联合体,使用更加方便了,Linux给出了很方便的函数直接定位到各层的头部。下图是2.4版本的,只是说明一下。 struct dst_entry dst 路由...
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...
typedef union ktime ktime_t ; struct sk_buff_head { /* These two members must be first. */ struct sk_buff *next; struct sk_buff *prev; __u32 qlen; spinlock_t lock; }; /* 关于sk_buff_data_t */ #ifBITS_PER_LONG >32 ...
此时head、data、tail三个指针指向一起,end指向数据缓冲区的尾部。预留协议头空间:在sk_stream_alloc_skb调用__alloc_skb函数进行内存分配后,下一步就会预留协议头空间,使得head、tail、data指针分离: struct sk_buff *sk_stream_alloc_skb(struct sock *sk, int size, gfp_t gfp, ...
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; }; ...
在内核中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 network_header; //L3 sk_buff_data_t mac_header; //L2 这些指针分别指向报文头部,和2.4版本比较有了变化,不再是联合体,使用更加方便了,Linux给出了很方便的函数直接定位到各层的头部。下图是2.4版本的,只是说明一下。 struct dst_entry dst ...
* @data: Data head pointer * @truesize: Buffer size * @users: User count - see {datagram,tcp}.c */ structsk_buff{ union{ struct{ /* These two members must be first. */ structsk_buff*next; structsk_buff*prev; union{ ktime_ttstamp; ...