分类: LINUX
2011-04-06 12:21:07
sk_buff 功能函数应用
skbuffs是那些linux内核处理网络分组的缓存。网卡收到分组后,将它们放进skbuff,然后再传送给网络堆栈。网络堆栈一直
要用到skbuff。
skb支持的功能函数
主要描述一下sk_buff层最重要的一些功能函数。分配、释放、复制、克隆、扩展等功能函数。
分配:
struct sk_buff *alloc_skb(unsigned int len,int priority)
struct sk_buff *dev_alloc_skb(unsigned int len)
分配一个缓冲区。
alloc_skb分配一个缓冲区并初始化skb->data和skb->tail到skb->head。
dev_alloc_skb函数是以GFP_ATOMIC优先级调用alloc_skb,并保存skb->head和skb->data之间16个字节的一个快捷方式。这个数据空间可以用来"推(push)"硬件包头。
(这两个函数的定义位于net/core/skbuff.c文件内。通过这alloc_skb()申请的内存空间有两个,一个是存放实际报文数据的内存空间,通过kmalloc()函数申请;一个是sk_buff数据结构的内存空间,通过 kmem_cache_alloc()函数申请。dev_alloc_skb()的功能与alloc_skb()类似,它只被驱动程序的中断所调用,与 alloc_skb()比较只是申请的内存空间长度多了16个字节。)
例如:
skb = alloc_skb(len, GFP_ATOMIC);//见注释
kfree_skb(skb);
释放:
void kfree_skb(struct sk_buff *skb)
释放一个缓冲区。kfree_skb被内核内部使用。
struct sk_buff *skb_get(struct sk_buff *skb)
skb使用计数加一,返回一个指向skb的指针,获取数据。
克隆:
struct sk_buff *skb_clone(struct sk_buff *skb, int gfp_mask)
这个函数克隆一个skb。两份拷贝共享分组数据,但分别拥有自己的sk_buff结构。新拷贝不属于任何socket,参考计数为1。
复制:
struct sk_buff *skb_copy(const struct sk_buff *skb, int gfp_mask)
产生一个实实在在的skb拷贝,包含分组数据。但你想要修改分组数据时,需要这么做。新拷贝的参考计数为1。
struct skb_copy_expand(const struct sk_buff *skb, int new_headroom, int new_tailroom, int gfp_mask)
产生一个skb拷贝,包含分组数据。另外,新skb还拥有一个/new_headroom/字节大
小的头空间,和一个/new_tailroom/字节大小的尾空间。
其它:
unsigned char *skb_put(struct sk_buff *sbk, int len)
扩展skb的数据域。如果总长度超出了skb的尺寸大小,内核将陷入慌乱。此函数将返回一个指向新数据第一个字节的指针。
(skb_put()向后扩大数据区空间,tailroom空间减少,skb->data指针不变,skb->tail指针下移)
unsigned char *skb_push(struct sk_buff *skb, int len)
扩展skb的数据域。
(skb_push()向前扩大数据区空间,headroom空间减少,skb->tail指针不变,skb->data指针上移)
unsigned char *skb_pull(struct sk_buff *skb, int len)
将数据从缓存起始处移除,回收头空间字节。返回一个指向缓存中下一个数据的指针。
(skb_pull()缩小数据区空间,headroom空间增大,skb->data指针下移,skb->tail指针不变。)