函数名
skb_queue_emptyskb_getkfree_skbskb_clonedskb_sharedskb_share_check
功能
检查队列是否为空引用缓冲区释放一个sk_buff缓冲区是否是克隆的缓冲区是否是共享的检查缓冲区是否共享的,如果是就克隆它
函数形成
int skb_queue_empty (struct sk_buff_head * list)struct sk_buff * skb_get (struct sk_buff * skb)void kfree_skb (struct sk_buff * skb)int skb_cloned (struct sk_buff * skb)int skb_shared (struct sk_buff * skb)
参数
list为队列头skb为要引用的缓冲区sk为要释放的缓冲区skb为要检查的缓冲区skb为要检查的缓冲区
描述
如果队列为空返回真,否则返回假
对套接字缓冲区再引用一次,返回指向缓冲区的指针删除对一个缓冲区的引用,如果其引用计数变为0,则释放它
如果以skb_clone标志来产生缓冲区,并且是缓冲区多个共享拷贝中的一个,则返回真。克隆的缓冲区具有共享数据,因此在正常情况下不必对其进行写。 如果有多于一个的人引用这个缓冲区就返回真。
如果缓冲区是共享的,就克隆这个缓冲区,并把原来缓冲区的引用计数减1,返回新克隆的缓冲区。如果不是共享的,则返回原来的缓冲区。当从中断状态或全局锁调用该函数时,pri必须是GFP_ATOMIC。 内存分配失败则返回NULL。如果套接字缓冲区是克隆的,那么这个函数就创建一个新的数据拷贝,并把原来缓冲区的引用计数减1,返回引用计数为1的新拷贝。如果不是克隆的,就返回原缓冲区。当从中断状态或全局锁调用该函数时,pri必须是GFP_ATOMIC。 内存分配失败则返回NULL。返回&sk_buff 队列的指针。
skb为要检查的缓冲区,skb, int pri)pri为内存分配的优先级
skb_unshare
产生一个共享缓冲区的struct sk_buff * skb_unshare (struct sk_buff *
拷贝skb, int pri);获得队列的长度
__u32 skb_queue_len (struct sk_buff_head * list_)
skb为要检查的缓冲区,
pri为内存分配的优先级list_为测量的链表
skb_queue_len__skb_queue_headskb_queue_head
在链表首部对一个缓冲list为要使用的链表,在链表首部对一个缓冲区进行排队。这个函数没有锁,因此在调用它之前必须持区排队struct sk_buff * newsk)newsk为要排队的缓冲区。有必要的锁。一个缓冲区不能同时放在两个链表中。在链表首部对一个缓冲void skb_queue_head (struct sk_buff_head * list, 区排队struct sk_buff * newsk)
list为要使用的链表,在链表首部对一个缓冲区进行排队。这个函持有锁,因此可以安全地使用。一个
newsk为要排队的缓冲区。缓冲区不能同时放在两个链表中。
__skb_queue_tailskb_queue_tail__skb_dequeueskb_dequeue
在链表尾部对一个缓冲list为要使用的链表,在链表尾部对一个缓冲区进行排队。这个函数没有锁,因此在调用它之前必须持区排队struct sk_buff * newsk)newsk为要排队的缓冲区。有必要的锁。一个缓冲区不能同时放在两个链表中。在链表尾部对一个缓冲void skb_queue_tail (struct sk_buff_head * list, 区排队struct sk_buff * newsk)从队列的首部删除一个struct sk_buff * __skb_dequeue (struct 缓冲区sk_buff_head * list)
list为要使用的链表,在链表尾部对一个缓冲区进行排队。这个函持有锁,因此可以安全地使用。一个
newsk为要排队的缓冲区。缓冲区不能同时放在两个链表中。list为要操作的队列
删除链表首部。这个函数不持有任何锁,因此使用时应当持有适当的锁。如果队链表为空则返回NULL,成功则返回首部元素。
删除链表首部,这个函数持有锁,因此可以安全地使用。如果队链表为空则返回NULL,成功则返回首部元素。
从队列的首部删除一个struct sk_buff * skb_dequeue (struct sk_buff_head
list为要操作的队列
缓冲区* list)插入一个缓冲区
void skb_insert (struct sk_buff * old, struct
sk_buff * newsk)
void skb_append (struct sk_buff * old, struct sk_buff * newsk)
skb_insert
old为插入之前的缓冲区,把一个数据包放在链表中给定的包之前。该函数持有链表锁,并且是原子操作。newsk为要插入的缓冲区一个缓冲区不能同时放在两个链表中。old为插入之前的缓冲区,把一个数据包放在链表中给定的包之前。该函数持有链表锁,并且是原子操作。newsk为要插入的缓冲区一个缓冲区不能同时放在两个链表中。Skb为要删除的缓冲区List为要操作的链表
把一个数据包放在链表中给定的包之前。该函数持有链表锁,并且是原子操作。 从链表尾部删除。这个函数不持有任何锁,因此必须持以合适的锁来使用。如果
链表为空,则返回NULL,成功则返首部元素。
删除链表尾部,这个函数持有锁,因此可以安全地使用。如果队链表为空则返回NULL,成功则返回首部元素。
这个函数扩充缓冲区所使用的数据区。如果扩充后超过缓冲区总长度,内核会产生警告。函数返回的指针指向所扩充数据的第一个字节。这个函数扩充在缓冲区的开始处缓冲区所使用的数据区。如果扩充后超过缓冲区首部空间的总长度,内核会产生警告。函数返回的指针指向所扩充数据的第一个字节。
skb_appendskb_unlink_skb_dequeue_tail
追加一个缓冲区
从链表删除一个缓冲区void skb_unlink(struct sk_buff * skb);从队尾删除
struct sk_buff * __skb_dequeue_tail(struct sk_buff_head * list)
struct sk_buff * skb_dequeue_tail(struct sk_buff_head * list)
unsigned char * skb_put(struct sk_buff * skb, unsigned int len)
skb_dequeue_tail从队头删除List为要操作的链表skb为要使用的缓冲区,len为要增加的数据长度skb为要使用的缓冲区,len为要增加的数据长度
skb_put
接字缓冲区函数
把数据加到缓冲区
skb_push
把数据加到缓冲区的开unsigned char * skb_push(struct sk_buff * skb, 始unsigned int len);