在wlan驱动中,数据读取写入是通过sk_buff
这个结构体,而sk_buff
结构主要作用是包含接收的缓冲数据,和它的包头信息。
如下是sk_buff
的主要结构成员:
1 |
|
当然,sk_buff
还包含一些链表的东西,在此处并不做解析。在以上结构体中:
head
:报文缓冲区的头;data
:数据的头指针;tail
:数据的尾指针;end
:报文缓冲区的尾部。
如图所示,
分别有三个空间:head room、packet data、tail room。其中packet data是数据所在区包括数据的包头,head room是数据头部增长的预留空间、tail room是尾部增加的空间。预留头部使用skb_reserve(skb, header_len);
函数,尾部增加使用skb_put()
,头部增长使用skb_push()
。
以下图是调用分配空间函数,即初始化函数alloc_skb(len, GFP_KERNEL)
的样子:
可以看到,head
、data
和tail
都指向了缓冲区的起始,而end指向结束。这个SKB的数据长度为0,不包含任何数据。
接着调用了skb_reserve(skb, header_len)
预留了头部数据,如图所示:
通过调用skb_put()
向尾部增长数据,如图所示:
通过调用skb_push()
向头部增长数据,如图所示,增加了一个UDP头: