struct sk_buff

struct sk_buff结构被网络的各个层所使用,链路层、网络层和传输层都用到了该数据结构。为了增进处理网络数据包的效率,Linux没有使用在各层之间拷贝数据的方式来传输数据,而采用了增加头部信息的方式来处理。在一块缓冲区的前面增加一块空间,只要将指针的值改变一下就好了,内核使用skb_reserve()来实现操作.

当数据向下传递,直至由网络设备把包发送出去之前,每层协议在处理packet时的第一件事情就是调用skb_reserve()。

但是,当数据是向上传递(网络设备接收到了新的数据)时,之前的协议层的信息就没有什么用了,这时只会将指针指向新的协议层,这样是为了节省CPU时间,提高效率。

管理struct sk_buff结构的几个函数:

static inline void skb_reserve(struct sk_buff *skb, unsigned int len);
static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len);
static inline unsigned char *skb_pull(struct sk_buff *skb, unsigned int len);
static inline unsigned char *skb_push(struct sk_buff *skb, unsigned int len);

skb_reserve()对一个空缓冲区,通过更改skb->tail和skb->data指针,为headroom预留空间。

skb_put()通过改变skb->tail的指针,减小tail域空间,往skb_buff中增加数据,增加到尾部;

skb_push()通过改变skb->data的指针,增加数据到skb_buff的头部。

skb_pull()改变skb->data指针,把缓冲区里面的数据从buffer的开头去除掉。

Advertisements
struct sk_buff

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s