5 sk_buff管理和操作函数
5.1缓冲区操作函数
有很多函数,通常都比较短小而且简单,内核用这些函数操作sk_buff的成员变量或者sk_buff链表。首先来看分配和释放缓冲区的函数,然后是一些通过移动指针在缓冲区的头部或尾部预留空间的函数。如果你看过include/linux/skbuff.h和net/core/skbuff.c中的函数,你会发现,基本上每个函数都有两个版本,名字分别是do_something和__do_something。通常第一种函数是一个包装函数,它会在第二种函数的基础上增加合法性检查或者锁。一般来说,类似__do_something的函数不能被直接调用(除非满足特定的条件,比如说锁)。那些违反这条规则而直接引用这些函数的不良代码会最终被更正。
各操作函数缓冲区与移动指针变化如图所示。
操作前与操作后指针变化图: (a)skb_put,(b)skb_push, (c)skb_pull, and (d)skb_reserve
1 unsigned char *skb_put(struct sk_buff *skb, unsigned int len)
在缓冲