分类: LINUX
2013-05-26 15:59:23
原文地址:linux内核API每天来一发(5) 作者:fuchao2012
第七章 网络编程
第一节 Socket缓冲相关函数
如果想查看源码可以到这里用ctrl+F查看
http://blog.chinaunix.net/uid-488742-id-2113564.html
skb_queue_empty
函数名称 | 检查一个队列是否为空 |
函数原型 | int skb_queue_empty(struct sk_buff_head* list) |
参数列表 | list---队列头指针 |
函数简介 | 如果队列为空,返回TRUE |
skb_get
函数名称 | 获取socket buffer的新引用 |
函数原型 | struct sk_buff* skb_get(struct sk_buff* skb) |
参数列表 | skb---被引用的socket buffer |
函数简介 | 向socket添加一个新的引用,同时返回指向缓冲区的指针 |
kfree_skb
函数名称 | 释放一个socket buffer引用 |
函数原型 | void kfree_skb(struct sk_buff* skb) |
参数列表 | skb----被释放的socket buffer指针 |
函数简介 | 当缓冲区的使用量为0 时 ,可以将其删除 |
skb_cloned
函数名称 | 缓冲区是否是克隆的 |
函数原型 | int skb_cloned(struct sk_buff* skb) |
参数列表 | skb----为要检查的缓冲区 |
函数简介 | 如果以skb_clone标志来产生缓冲区,并且是缓冲区多个共享拷贝中的一个,则返回真。克隆的缓冲区具有共享数据,因此在正常情况下不必对其进行写。 |
skb_shared
函数名称 | 缓冲区是否是可共享的 |
函数原型 | int skb_shared(struct sk_buff* skb) |
参数列表 | skb---为要检查的缓冲区 |
函数简介 | 如果有多于一个的人引用这个缓冲区就返回真。 |
skb_share_check
函数名称 | 检查缓冲区是否共享的,如果是就克隆它 |
函数原型 | struct sk_buff * skb_share_check (struct sk_buff * skb, int pri) |
参数列表 |
skb---为要检查的缓冲区 pri---为内存分配的优先级 |
函数简介 |
如果缓冲区是共享的,就克隆这个缓冲区,并把原来缓冲区的引用计数减1,返回新克隆的缓冲区。如果不是共享的,则返回原来的缓冲区。当从中断状态或全局锁调用该函数时,pri必须是GFP_ATOMIC。 |
skb_unshare
函数名称 | 产生一个共享缓冲区的拷贝 |
函数原型 | struct sk_buff * skb_unshare (struct sk_buff * skb, int pri); |
参数列表 |
skb---为要检查的缓冲区 pri---为内存分配的优先级 |
函数简介 |
如果套接字缓冲区是克隆的,那么这个函数就创建一个新的数据拷贝,并把原来缓冲区的引用计数减1,返回引用计数为1的新拷贝。如果不是克隆的,就返回原缓冲区。当从中断状态或全局锁调用该函数时,pri必须是GFP_ATOMIC。 |
skb_peek
函数名称 | 查看skb |
函数原型 | struct sk_buff * skb_peek (struct sk_buff_head * list_); |
参数列表 | list_----为测量的链表 |
函数简介 |
skb_queue_len
函数名称 | 获得队列的长度 |
函数原型 | __u32 skb_queue_len (struct sk_buff_head * list_) |
参数列表 |
list_----为测量的链表 |
函数简介 |
返回&sk_buff 队列的指针。 |
__skb_queue_head
函数名称 | 在链表首部对一个缓冲区排队 |
函数原型 | void __skb_queue_head (struct sk_buff_head * list, struct sk_buff * newsk) |
参数列表 |
list---为要使用的链表 |
函数简介 | 在链表首部对一个缓冲区进行排队。这个函数没有锁,因此在调用它之前必须持有必要的锁。一个缓冲区不能同时放在两个链表中 |
skb_queue_head
函数名称 | 在链表首部对一个缓冲区排队 |
函数原型 | void skb_queue_head (struct sk_buff_head * list, struct sk_buff * newsk) |
参数列表 |
list---为要使用的链表 |
函数简介 | 在链表首部对一个缓冲区进行排队。这个函持有锁,因此可以安全地使用。一个缓冲区不能同时放在两个链表中。 |
__skb_queue_tail
函数名称 | 在链表尾部对一个缓冲区排队 |
函数原型 | void __skb_queue_tail (struct sk_buff_head * list, struct sk_buff * newsk) |
参数列表 |
list---为要使用的链表, |
函数简介 | 在链表尾部对一个缓冲区进行排队。这个函数没有锁,因此在调用它之前必须持有必要的锁。一个缓冲区不能同时放在两个链表中。 |
skb_dequeue_tail
函数名称 | 从队头删除 |
函数原型 | struct sk_buff *skb_dequeue_tail(struct sk_buff_head * list) |
参数列表 | List为要操作的链表删除链表尾部 |
函数简介 | 这个函数持有锁,因此可以安全地使用。如果队链表为空则返回NULL,成功则返回首部元素。 |
___skb_dequeue
函数名称 | 从队列的首部删除一个缓冲区 |
函数原型 | struct sk_buff * __skb_dequeue (struct sk_buff_head * list) |
参数列表 | list为要操作的队列删除链表首部 |
函数简介 | 这个函数不持有任何锁,因此使用时应当持有适当的锁。如果队链表为空则返回NULL,成功则返回首部元素。 |
skb_dequeue
函数名称 | 从队列的首部删除一个缓冲区 |
函数原型 | struct sk_buff * skb_dequeue (struct sk_buff_head * list) |
参数列表 | list为要操作的队列删除链表首部 |
函数简介 | 这个函数持有锁,因此可以安全地使用。如果队链表为空则返回NULL,成功则返回首部元素 |
skb_insert
函数名称 | 插入一个缓冲区 |
函数原型 | void skb_insert (struct sk_buff * old, struct sk_buff * newsk) |
参数列表 |
old---为插入之前的缓冲区 newsk---为要插入的缓冲区把一个数据包放在链表中给定的包之前 |
函数简介 | 该函数持有链表锁,并且是原子操作。一个缓冲区不能同时放在两个链表中。 |
skb_append
函数名称 | 追加一个缓冲区 |
函数原型 | void skb_append (struct sk_buff * old, struct sk_buff * newsk) |
参数列表 |
old---为插入之前的缓冲区 newsk---为要插入的缓冲区把一个数据包放在链表中给定的包之前 |
函数简介 | 该函数持有链表锁,并且是原子操作。一个缓冲区不能同时放在两个链表中。 |
skb_unlink
函数名称 | 从链表删除一个缓冲区 |
函数原型 | void skb_unlink(struct sk_buff *skb); |
参数列表 | Skb为要删除的缓冲区 |
函数简介 | 把一个数据包放在链表中给定的包之前。该函数持有链表锁,并且是原子操作。 |
__skb_dequeue_tail
函数名称 | 从队尾删除 |
函数原型 | struct sk_buff *__skb_dequeue_tail(struct sk_buff_head * list) |
参数列表 | list为要操作的链表从链表尾部删除 |
函数简介 | 这个函数不持有任何锁,因此必须持以合适的锁来使用。如果链表为空,则返回NULL,成功则返首部元素。 |
skb_dequeue_tail
函数名称 | 从队头删除 |
函数原型 | struct sk_buff *skb_dequeue_tail(struct sk_buff_head * list) |
参数列表 | list为要操作的链表从链表尾部删除 |
函数简介 | 这个函数持有锁,因此可以安全地使用。如果队链表为空则返回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_headroom
函数名称 | 缓冲区首部空闲空间的字节数 |
函数原型 | int skb_headroom(const struct sk_buff * skb) |
参数列表 | skb为要检查的缓冲区返回&sk_buff首部空闲空间的字节数 |
函数简介 |
skb_tailroom
函数名称 | 缓冲区尾部的空闲字节数 |
函数原型 | int skb_tailroom(const struct sk_buff * skb) |
参数列表 | skb为要检查的缓冲区返回&sk_buff尾部空闲空间的字节数 |
函数简介 |
skb_reserve
函数名称 | 调整头部的空间 |
函数原型 | void skb_reserve(struct sk_buff * skb, unsigned int len) |
参数列表 | skb为要改变的缓冲区,len为要删除的字节数 |
函数简介 | 通过减少尾部空间,增加一个空&sk_buff的首部空间。这仅仅适用于空缓冲区。 |
skb_trim
函数名称 | 从缓冲区删除尾部 |
函数原型 | void skb_trim (struct sk_buff * skb, unsigned int len) |
参数列表 | skb为要改变的缓冲区,len为新的长度 |
函数简介 | 通过从尾部删除数据,剪切缓冲区的长度。如果缓冲区已经处于指定的长度,则不用改变。 |
skb_orphan
函数名称 | 使一个缓冲区成为孤儿 |
函数原型 | void skb_orphan(struct sk_buff *skb); |
参数列表 | skb是要成为孤儿的缓冲区 |
函数简介 | 如果一个缓冲区当前有一个拥有者,我们就调用拥有者的析构函数,使skb没有拥有者。该缓冲区继续存在,但以前的拥有者不再对其“负责”。 |
skb_queue_purge
函数名称 | 使一个链表空 |
函数原型 | void skb_queue_purge(struct sk_buff_head * list) |
参数列表 | list为要腾空的链表删除在&sk_buff链表上的所有缓冲区 |
函数简介 | 这个函数持有链表锁,并且是原子的。 |
___skb_queue_purge
函数名称 | 使一个链表空 |
函数原型 | void__skb_queue_purge(struct sk_buff_head * list) |
参数列表 | list为要腾空的链表删除在&sk_buff链表上的所有缓冲区。 |
函数简介 | 这个函数不持有链表锁,调用者必须持有相关的锁来使用它。 |
___dev_alloc_skb
函数名称 | 为发送分配一个skbuff |
函数原型 | struct sk_buff *dev_alloc_skb(unsigned int length) |
参数列表 | Length为要分配的长度分配一个新的&sk_buff,并赋予它一个引用计数 |
函数简介 | 这个缓冲区有未确定的头空间。用户应该分配自己需要的头空间。如果没有空闲内存,则返回NULL。尽管这个函数是分配内存,但也可以从中断来调用。 |
dev_alloc_skb
函数名称 | 为发送分配一个skbuff |
函数原型 | struct sk_buff *dev_alloc_skb(unsigned int length) |
参数列表 | length为要分配的长度分配一个新的&sk_buff,并赋予它一个引用计数 |
函数简介 |
这个缓冲区有未确定的头空间。用户应该分配自己需要的头空间。 |
skb_cow
函数名称 | 当需要时拷贝skb的首部 |
函数原型 | struct sk_buff *skb_cow (struct sk_buff * skb, unsigned int headroom) |
参数列表 | Skb为要拷贝的缓冲区,headroom为需要的头空间 |
函数简介 | 如果传递过来的缓冲区缺乏足够的头空间或是克隆的,则该缓冲区被拷贝,并且附加的头空间变为可用。如果没有空闲的内存,则返回空。如果缓冲区拷贝成功,则返回新的缓冲区,否则返回已存在的缓冲区。 |
skb_over_panic
函数名称 | 有函数 |
函数原型 | void skb_over_panic(struct sk_buff * skb, int sz, void * here) |
参数列表 | skb为缓冲区,sz为大小,here为地址 |
函数简介 | 用户不可调用。 |
alloc_skb
函数名称 | 分配一个网络缓冲区 |
函数原型 | struct sk_buff *alloc_skb (unsigned int size, int gfp_mask) |
参数列表 | size为要分配的大小,gfp_mask为分配掩码 |
函数简介 | 分配一个新的&sk_buff。返回的缓冲区没有size大小的头空间和尾空间。新缓冲区的引用计数为1。返回值为一缓冲区,如果失败则返回空。从中断分配缓冲区,掩码只能使用GFP_ATOMIC的gfp_mask。 |
__kfree_skb
函数名称 | 私有函数 |
函数原型 | void __kfree_skb(struct sk_buff * skb) |
参数列表 | skb为缓冲区释放一个sk_buff |
函数简介 | 释放与该缓冲区相关的所有事情,清除状态。这是一个内部使用的函数,用户应当调用kfree_skb |
skb_clone
函数名称 | 复制一个sk_buff |
函数原型 | struct sk_buff *skb_clone (struct sk_buff * skb, intgfp_mask) |
参数列表 | skb为要克隆的缓冲区,gfp_mask为分配掩码 |
函数简介 | 复制一个&sk_buff。新缓冲区不是由套接字拥有。两个拷贝共享相同的数据包而不是结构。新缓冲区的引用计数为1。如果分配失败,函数返回NULL,否则返回新的缓冲区。如果从中断调用这个函数,掩码只能使用GFP_ATOMIC的 |
skb_copy
函数名称 | 创建一个sk_buff的私有拷贝 |
函数原型 | struct sk_buff *skb_copy (const struct sk_buff * skb, int gfp_mask) |
参数列表 | skb为要拷贝的缓冲区,gfp_mask为分配优先级 |
函数简介 |
既拷贝&sk_buff也拷贝其数据。该函数用在调用者希望修改数据并需要数据的私有拷贝来进行改变时。失败返回NULL,成功返回指向缓冲区的指针。 |
skb_copy_expand
函数名称 | 拷贝并扩展sk_buff |
函数原型 |
struct sk_buff *skb_copy_expand(const struct sk_buff * skb,
int |
参数列表 | skb为要拷贝的缓冲区,newheadroom为头部的新空闲字节数,newtailroom为尾部的新空闲字节数gfp_mask为分配掩码 |
函数简介 |
既拷贝&sk_buff也拷贝其数据,同时分配额外的空间。当调用者希望修改数据并需要对私有数据进行改变,以及给新的域更多的空间时调用该函数。失败返回NULL,成功返回指向缓冲区的指针。 |