sk_buff结构分析

在wlan驱动中,数据读取写入是通过sk_buff这个结构体,而sk_buff结构主要作用是包含接收的缓冲数据,和它的包头信息。

如下是sk_buff的主要结构成员:

1
2
3
4
5
6
7
8
struct sk_buff {
...
	unsigned char *head;
	unsigned char *data;
	unsigned char *tail;
	unsigned char *end;
...
};

当然,sk_buff还包含一些链表的东西,在此处并不做解析。在以上结构体中:

  • head:报文缓冲区的头;
  • data:数据的头指针;
  • tail:数据的尾指针;
  • end :报文缓冲区的尾部。

如图所示,

分别有三个空间:head roompacket datatail room。其中packet data是数据所在区包括数据的包头,head room是数据头部增长的预留空间、tail room是尾部增加的空间。预留头部使用skb_reserve(skb, header_len);函数,尾部增加使用skb_put(),头部增长使用skb_push()

以下图是调用分配空间函数,即初始化函数alloc_skb(len, GFP_KERNEL)的样子:

可以看到,headdatatail都指向了缓冲区的起始,而end指向结束。这个SKB的数据长度为0,不包含任何数据。

接着调用了skb_reserve(skb, header_len)预留了头部数据,如图所示:

通过调用skb_put()向尾部增长数据,如图所示:

通过调用skb_push()向头部增长数据,如图所示,增加了一个UDP头:


本文考参:http://vger.kernel.org/~davem/skb_data.html