Linux协议栈skb操作功能
字缓冲功能函数名
功能
功能的形成
参数
描述
skb_queue_empty
检查队列是否为空。
国际skb_queue_empty(struct sk_buff_head *列表)
列表是一个队列头
如果队列返回空,则返回为false。
skb_get
参考缓冲器
结构sk_buff * skb_get(struct sk_buff * skb)
公司是一个缓冲区被引用
再次引用套接字缓冲区,并返回一个指向缓冲区的指针。
kfree_skb
释放sk_buff
无效kfree_skb(struct sk_buff * skb)
SK是要释放的缓冲区。
删除对缓冲区的引用,如果引用计数更改为0,则释放它。
skb_cloned
缓冲区是否被克隆
国际skb_cloned(struct sk_buff * skb)
公司是一个缓冲区进行检查
如果缓冲区与skb_clone国旗的产生,它是一种多共享缓冲区的拷贝,它返回true。克隆的缓冲区共享数据,所以不必写在正常情况下。
skb_shared
缓冲区是否共享
国际skb_shared(struct sk_buff * skb)
公司是一个缓冲区进行检查
如果多人引用此缓冲区,则返回true。
skb_share_check
检查缓冲区是否被共享,如果它被克隆了
结构sk_buff * skb_share_check(struct sk_buff * skb,int i)
公司是一个缓冲区进行检查,和优先级的内存分配的优先级
如果缓冲区是共享的,缓冲区的克隆和原缓冲区的引用计数减1到新克隆的缓冲。如果不是共享的,返回原来的缓冲区。当函数是中断状态或全局锁称,革命制度党必须gfp_atomic。
内存分配失败,返回null。
skb_unshare
生成共享缓冲区的副本
结构sk_buff * skb_unshare(struct sk_buff * skb,int i);
公司是一个缓冲区进行检查,和优先级的内存分配的优先级
如果socket缓冲区的克隆,这个函数创建一个新的数据复制和减少1的原始缓冲区的引用计数,并返回一个新的复制与引用计数为1。如果不是克隆,回到原来的缓冲区。当函数是中断状态或全局锁,革命制度党必须gfp_atomic。
内存分配失败,返回null。
skb_queue_len
获取队列的长度
__u32 skb_queue_len(struct sk_buff_head * list_)
list_作为测量链
返回的指针指向sk_buff队列。
__skb_queue_head
在列表的第一个链中排队一个缓冲区
无效__skb_queue_head(struct sk_buff_head *列表,结构sk_buff * newsk)
列表是要使用的链接列表,
newsk是缓冲区要排队。
在链的第一个链中,一个缓冲区被排队。这个函数没有锁,所以在调用之前必须保留必要的锁。缓冲区不能同时放在两个链表中。
skb_queue_head
在列表的第一个链中排队一个缓冲区
无效skb_queue_head(struct sk_buff_head *列表,结构sk_buff * newsk)
列表是要使用的链接列表,
newsk是缓冲区要排队。
在链的第一个链中,一个缓冲区被排队。这个字母有一个锁,所以它可以被使用。一个缓冲区不能同时放在两个链表中。
__skb_dequeue
从队列的第一个队列中删除一个缓冲区
结构sk_buff * __skb_dequeue(struct sk_buff_head *列表)
列表是一个操作队列。
删除列表的第一部分。此函数不包含任何锁,因此在使用时应持有适当的锁。如果团队列表为空,则返回null,并且成功返回第一个元素。
skb_dequeue
从队列的第一个队列中删除一个缓冲区
结构sk_buff * skb_dequeue(struct sk_buff_head *列表)
列表是一个操作队列。
删除列表中第一个包含锁的部分,以便安全地使用它。如果团队列表为空,则返回null,并且成功返回第一个元素。
skb_insert
插入缓冲
无效skb_insert(struct sk_buff *岁,结构sk_buff * newsk)
岁之前插入缓冲区,缓冲区和newsk是被插入
在列表中的给定包之前放入一个包。这个函数持有链式锁,是一个原子操作。缓冲区不能同时放在两个链表中。
skb_append
添加缓冲区
无效skb_append(struct sk_buff *岁,结构sk_buff * newsk)
岁之前插入缓冲区,缓冲区和newsk是被插入
在列表中的给定包之前放入一个包。这个函数持有链式锁,是一个原子操作。缓冲区不能同时放在两个链表中。
skb_unlink
从链表中删除一个缓冲区
无效skb_unlink(struct sk_buff * skb);
公司是一个缓冲区被删除
在列表中的给定包之前放入一个包。这个函数包含一个链式锁,是一个原子操作。
_skb_dequeue_tail
从团队的结尾删除
结构sk_buff * __skb_dequeue_tail(struct sk_buff_head *列表)
列表是要操作的链表。
从列表尾部删除。此函数不包含任何锁,因此必须与适当的锁一起使用。如果列表为空,则返回null,并将成功返回到第一个元素。
skb_dequeue_tail
从团队负责人处删除
结构sk_buff * skb_dequeue_tail(struct sk_buff_head *列表)
列表是要操作的链表。
删除持有锁的列表尾部,这样就可以安全使用。如果团队列表为空,则返回null,成功返回第一个元素。
skb_put
向缓冲区添加数据
unsigned char * skb_put(struct sk_buff * skb,unsigned int len)
SKB是缓冲区被使用,和Len是数据长度增加
这个函数扩展了缓冲区中使用的数据区域。如果内核超出了缓冲区的总长度,就会生成一个警告。函数点返回的指针是扩展数据的第一个字节。
skb_push
将数据添加到缓冲区的开始部分。
unsigned char * skb_push(struct sk_buff * skb,unsigned int len);
SKB是缓冲区被使用,和Len是数据长度增加
这个函数扩展了缓冲区开始时缓冲区中使用的数据区域,如果它超出了缓冲区第一个空间的总长度,内核将产生一个警告。函数返回的指针指向扩展数据的第一个字节。
skb_pull
从缓冲区的开始删除数据
unsigned char * skb_pull(struct sk_buff * skb,unsigned int len)
公司是一个缓冲区被使用,而Len则是被删除的数据的长度
此函数从列表的开始处删除数据,并将空出的内存返回到第一个空格。
skb_headroom
缓冲区中第一个空闲空间中的字节数。
skb_headroom(const int struct sk_buff * skb)
公司是一个缓冲区进行检查
字节,返回的sk_buff第一自由空间的数量
skb_tailroom
缓冲区尾部的空闲字节数。
skb_tailroom(const int struct sk_buff * skb)
公司是一个缓冲区进行检查
字节,返回sk_buff尾自由空间的数量
skb_reserve
调整头部的空间
无效skb_reserve(struct sk_buff * skb,unsigned int len)
公司是一个缓冲区被改变,而Len是被删除的字节数
通过降低尾部空间,添加一个空sk_buff第一空间。这只适用于空缓冲区。
skb_trim
从缓冲区删除尾部
无效skb_trim(struct sk_buff * skb,unsigned int len);
公司是一个缓冲区的改变,和Len是一个新的长度
通过从尾部删除数据来减少缓冲区的长度。如果缓冲区已经在指定的长度内,则不必更改它。
skb_orphan
使缓冲器成为孤儿
无效skb_orphan(struct sk_buff * skb);
SKB是孤儿的缓冲
如果一个缓冲区,目前有一个拥有者,我们称之为主人的析构函数,所以其没有主人。缓冲区继续存在,但原业主不再对其负责;
skb_queue_purge
使链表空
voidskb_queue_purge(struct sk_buff_head *列表)
链表是空出的链表。
删除在sk_buff列出所有的缓冲区。这个功能是链条锁,是一个原子。
__skb_queue_purge
使链表空
void__skb_queue_purge(struct sk_buff_head *列表);
链表是空出的链表。
删除在sk_buff列出所有的缓冲区。这个函数不能保持链条锁,和打电话的人必须持有相关的锁的使用它。
Dev_alloc_skb
指定一个skbuff发送
结构sk_buff * dev_alloc_skb(unsigned int的长度)
长度是要分配的长度。
指定一个新的sk_buff和给它一个引用计数。这个缓冲区具有一个未定义的头部空间。用户应该分配的头部空间,你需要。
如果没有空闲内存,返回null。虽然这个函数被分配内存,但也可以从中断调用。
skb_cow
拷贝skb第一时
结构sk_buff * skb_cow(struct sk_buff * skb,符号intheadroom)
公司是一个缓冲区被复制,和净空要求的顶空
如果传递缓冲区没有足够的头空间或克隆,则缓冲区被复制,额外的头空间可用。如果没有空闲内存,返回空。如果缓冲区复制成功,则返回新的缓冲区,否则返回现有缓冲区。
skb_over_panic
私有函数
无效skb_over_panic(struct sk_buff * skb,int SZ,void *这里)
SKB的缓冲,SZ的大小,而这是地址。
用户没有被调用。
skb_under_panic
私有函数
voidskb_under_panic(struct sk_buff * skb,int SZ,void *这里)
SKB的缓冲,SZ的大小,而这是地址。
用户没有被调用。
alloc_skb
分配网络缓冲区
结构sk_buff * alloc_skb(unsigned int int的大小,gfp_mask)
尺寸的大小来分配,和gfp_mask是分配的面具
指定一个新的sk_buff.the返回缓冲区中没有大小的头部空间和尾部空间。新的缓冲区的引用计数为1,返回值是一个缓冲区,如果它失败了,它返回空。从中断分配缓冲区,面膜只能使用gfp_atomic的gfp_mask。
__kfree_skb
私有函数
无效__kfree_skb(struct sk_buff * skb)
该公司是一个缓冲区
释放sk_buff.all事情缓冲相关的释放,和状态被清除。这是一个内部使用的功能,并且用户应该叫kfree_skb。
skb_clone
复制一个sk_buff
结构sk_buff * skb_clone(struct sk_buff * skb,intgfp_mask)
公司是一个缓冲区被克隆,并gfp_mask是分区面膜。
复制一个新的缓冲区sk_buff.the不是由插座拥有。两份相同的数据包而不是结构,新的缓冲区的引用计数为1。如果分配失败,则返回零,否则新的缓冲区返回。如果这个函数是从一个中断调用,面膜只能使用gfp_atomic的gfp_mask。
skb_copy
创建一个sk_buff私人复制
结构sk_buff * skb_copy(const struct sk_buff * skb,int gfp_mask)
公司是一个缓冲区被复制,并gfp_mask是分配优先级。
既复制sk_buff和复制数据。这个功能是当对方想修改数据,需要数据的私有副本做出改变,未能恢复到零并成功返回的缓冲区的指针。
返回的缓冲区的引用计数为1。如果调用的中断调用,必须优先传递给gfp_atomic。
skb_copy_expand
复制和扩展sk_buff
结构sk_buff * skb_copy_expand(const struct sk_buff * skb,int)
newheadroom,intnewtailroom,intgfp_mask);
公司是一个缓冲区被复制,newheadroom头上新的空闲字节数,和一些新的空闲字节在newtailroom结束。
sk_buff拷贝复制数据和分配额外的空间,同时,函数被调用时,调用者想要修改的数据和需要改变的私人数据给更多的空间,新的领域。不归零并成功返回的缓冲区的指针。
返回的缓冲区的引用计数为1。如果调用的中断调用,必须优先传递给gfp_atomic