linux协议栈skb操作函数
来源:互联网 发布:男性家暴 知乎 编辑:程序博客网 时间:2024/04/30 09:56
接字缓冲区函数
函数名
功能
函数形成
参数
描述
skb_queue_empty
检查队列是否为空
int skb_queue_empty (struct sk_buff_head * list)
list为队列头
如果队列为空返回真,否则返回假
skb_get
引用缓冲区
struct sk_buff * skb_get (struct sk_buff * skb)
skb为要引用的缓冲区
对套接字缓冲区再引用一次,返回指向缓冲区的指针
kfree_skb
释放一个sk_buff
void kfree_skb (struct sk_buff * skb)
sk为要释放的缓冲区
删除对一个缓冲区的引用,如果其引用计数变为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。
内存分配失败则返回NULL。
skb_unshare
产生一个共享缓冲区的拷贝
struct sk_buff * skb_unshare (struct sk_buff * skb, int pri);
skb为要检查的缓冲区,pri为内存分配的优先级
如果套接字缓冲区是克隆的,那么这个函数就创建一个新的数据拷贝,并把原来缓冲区的引用计数减1,返回引用计数为1的新拷贝。如果不是克隆的,就返回原缓冲区。当从中断状态或全局锁调用该函数时,pri必须是GFP_ATOMIC。
内存分配失败则返回NULL。
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为要使用的链表,
newsk为要排队的缓冲区。
在链表首部对一个缓冲区进行排队。这个函数没有锁,因此在调用它之前必须持有必要的锁。一个缓冲区不能同时放在两个链表中。
skb_queue_head
在链表首部对一个缓冲区排队
void skb_queue_head (struct sk_buff_head * list, struct sk_buff * newsk)
list为要使用的链表,
newsk为要排队的缓冲区。
在链表首部对一个缓冲区进行排队。这个函持有锁,因此可以安全地使用。一个缓冲区不能同时放在两个链表中。
__skb_queue_tail
在链表尾部对一个缓冲区排队
void __skb_queue_tail (struct sk_buff_head * list, struct sk_buff * newsk)
list为要使用的链表,
newsk为要排队的缓冲区。
在链表尾部对一个缓冲区进行排队。这个函数没有锁,因此在调用它之前必须持有必要的锁。一个缓冲区不能同时放在两个链表中。
skb_queue_tail
在链表尾部对一个缓冲区排队
void skb_queue_tail (struct sk_buff_head * list, struct sk_buff * newsk)
list为要使用的链表,
newsk为要排队的缓冲区。
在链表尾部对一个缓冲区进行排队。这个函持有锁,因此可以安全地使用。一个缓冲区不能同时放在两个链表中。
__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 intlen)
skb为要使用的缓冲区,len为要增加的数据长度
这个函数扩充缓冲区所使用的数据区。如果扩充后超过缓冲区总长度,内核会产生警告。函数返回的指针指向所扩充数据的第一个字节。
skb_push
把数据加到缓冲区的开始
unsigned char * skb_push (struct sk_buff * skb, unsigned intlen);
skb为要使用的缓冲区,len为要增加的数据长度
这个函数扩充在缓冲区的开始处缓冲区所使用的数据区。如果扩充后超过缓冲区首部空间的总长度,内核会产生警告。函数返回的指针指向所扩充数据的第一个字节。
skb_pull
从缓冲区的开始删除数据
unsigned char * skb_pull (struct sk_buff * skb, unsigned intlen)
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 intlen)
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。尽管这个函数是分配内存,但也可以从中断来调用。
skb_cow
当需要时拷贝skb的首部
struct sk_buff * skb_cow (struct sk_buff * skb, unsigned intheadroom)
Skb为要拷贝的缓冲区,headroom为需要的头空间
如果传递过来的缓冲区缺乏足够的头空间或是克隆的,则该缓冲区被拷贝,并且附加的头空间变为可用。如果没有空闲的内存,则返回空。如果缓冲区拷贝成功,则返回新的缓冲区,否则返回已存在的缓冲区。
skb_over_panic
私有函数
void skb_over_panic (struct sk_buff * skb, int sz, void *here)
skb为缓冲区,sz为大小,here为地址。
用户不可调用。
skb_under_panic
私有函数
void skb_under_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的gfp_mask。
skb_copy
创建一个sk_buff的私有拷贝
struct sk_buff * skb_copy (const struct sk_buff * skb, intgfp_mask)
skb为要拷贝的缓冲区,gfp_mask为分配优先级。
既拷贝&sk_buff也拷贝其数据。该函数用在调用者希望修改数据并需要数据的私有拷贝来进行改变时。失败返回NULL,成功返回指向缓冲区的指针。
返回的缓冲区其引用计数为1。如果从中断调用,则必须传递的优先级为GFP_ATOMIC。
skb_copy_expand
拷贝并扩展sk_buff
struct sk_buff * skb_copy_expand (const struct sk_buff * skb, int
newheadroom, int newtailroom, int gfp_mask);
skb为要拷贝的缓冲区,newheadroom为头部的新空闲字节数,newtailroom为尾部的新空闲字节数。
既拷贝&sk_buff也拷贝其数据,同时分配额外的空间。当调用者希望修改数据并需要对私有数据进行改变,以及给新的域更多的空间时调用该函数。失败返回NULL,成功返回指向缓冲区的指针。
返回的缓冲区其引用计数为1。如果从中断调用,则必须传递的优先级为GFP_ATOMIC。
接字缓冲区函数
函数名
功能
函数形成
参数
描述
skb_queue_empty
检查队列是否为空
int skb_queue_empty (struct sk_buff_head * list)
list为队列头
如果队列为空返回真,否则返回假
skb_get
引用缓冲区
struct sk_buff * skb_get (struct sk_buff * skb)
skb为要引用的缓冲区
对套接字缓冲区再引用一次,返回指向缓冲区的指针
kfree_skb
释放一个sk_buff
void kfree_skb (struct sk_buff * skb)
sk为要释放的缓冲区
删除对一个缓冲区的引用,如果其引用计数变为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。
内存分配失败则返回NULL。
skb_unshare
产生一个共享缓冲区的拷贝
struct sk_buff * skb_unshare (struct sk_buff * skb, int pri);
skb为要检查的缓冲区,pri为内存分配的优先级
如果套接字缓冲区是克隆的,那么这个函数就创建一个新的数据拷贝,并把原来缓冲区的引用计数减1,返回引用计数为1的新拷贝。如果不是克隆的,就返回原缓冲区。当从中断状态或全局锁调用该函数时,pri必须是GFP_ATOMIC。
内存分配失败则返回NULL。
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为要使用的链表,
newsk为要排队的缓冲区。
在链表首部对一个缓冲区进行排队。这个函数没有锁,因此在调用它之前必须持有必要的锁。一个缓冲区不能同时放在两个链表中。
skb_queue_head
在链表首部对一个缓冲区排队
void skb_queue_head (struct sk_buff_head * list, struct sk_buff * newsk)
list为要使用的链表,
newsk为要排队的缓冲区。
在链表首部对一个缓冲区进行排队。这个函持有锁,因此可以安全地使用。一个缓冲区不能同时放在两个链表中。
__skb_queue_tail
在链表尾部对一个缓冲区排队
void __skb_queue_tail (struct sk_buff_head * list, struct sk_buff * newsk)
list为要使用的链表,
newsk为要排队的缓冲区。
在链表尾部对一个缓冲区进行排队。这个函数没有锁,因此在调用它之前必须持有必要的锁。一个缓冲区不能同时放在两个链表中。
skb_queue_tail
在链表尾部对一个缓冲区排队
void skb_queue_tail (struct sk_buff_head * list, struct sk_buff * newsk)
list为要使用的链表,
newsk为要排队的缓冲区。
在链表尾部对一个缓冲区进行排队。这个函持有锁,因此可以安全地使用。一个缓冲区不能同时放在两个链表中。
__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 intlen)
skb为要使用的缓冲区,len为要增加的数据长度
这个函数扩充缓冲区所使用的数据区。如果扩充后超过缓冲区总长度,内核会产生警告。函数返回的指针指向所扩充数据的第一个字节。
skb_push
把数据加到缓冲区的开始
unsigned char * skb_push (struct sk_buff * skb, unsigned intlen);
skb为要使用的缓冲区,len为要增加的数据长度
这个函数扩充在缓冲区的开始处缓冲区所使用的数据区。如果扩充后超过缓冲区首部空间的总长度,内核会产生警告。函数返回的指针指向所扩充数据的第一个字节。
skb_pull
从缓冲区的开始删除数据
unsigned char * skb_pull (struct sk_buff * skb, unsigned intlen)
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 intlen)
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。尽管这个函数是分配内存,但也可以从中断来调用。
skb_cow
当需要时拷贝skb的首部
struct sk_buff * skb_cow (struct sk_buff * skb, unsigned intheadroom)
Skb为要拷贝的缓冲区,headroom为需要的头空间
如果传递过来的缓冲区缺乏足够的头空间或是克隆的,则该缓冲区被拷贝,并且附加的头空间变为可用。如果没有空闲的内存,则返回空。如果缓冲区拷贝成功,则返回新的缓冲区,否则返回已存在的缓冲区。
skb_over_panic
私有函数
void skb_over_panic (struct sk_buff * skb, int sz, void *here)
skb为缓冲区,sz为大小,here为地址。
用户不可调用。
skb_under_panic
私有函数
void skb_under_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的gfp_mask。
skb_copy
创建一个sk_buff的私有拷贝
struct sk_buff * skb_copy (const struct sk_buff * skb, intgfp_mask)
skb为要拷贝的缓冲区,gfp_mask为分配优先级。
既拷贝&sk_buff也拷贝其数据。该函数用在调用者希望修改数据并需要数据的私有拷贝来进行改变时。失败返回NULL,成功返回指向缓冲区的指针。
返回的缓冲区其引用计数为1。如果从中断调用,则必须传递的优先级为GFP_ATOMIC。
skb_copy_expand
拷贝并扩展sk_buff
struct sk_buff * skb_copy_expand (const struct sk_buff * skb, int
newheadroom, int newtailroom, int gfp_mask);
skb为要拷贝的缓冲区,newheadroom为头部的新空闲字节数,newtailroom为尾部的新空闲字节数。
既拷贝&sk_buff也拷贝其数据,同时分配额外的空间。当调用者希望修改数据并需要对私有数据进行改变,以及给新的域更多的空间时调用该函数。失败返回NULL,成功返回指向缓冲区的指针。
返回的缓冲区其引用计数为1。如果从中断调用,则必须传递的优先级为GFP_ATOMIC。
接字缓冲区函数
函数名
功能
函数形成
参数
描述
skb_queue_empty
检查队列是否为空
int skb_queue_empty (struct sk_buff_head * list)
list为队列头
如果队列为空返回真,否则返回假
skb_get
引用缓冲区
struct sk_buff * skb_get (struct sk_buff * skb)
skb为要引用的缓冲区
对套接字缓冲区再引用一次,返回指向缓冲区的指针
kfree_skb
释放一个sk_buff
void kfree_skb (struct sk_buff * skb)
sk为要释放的缓冲区
删除对一个缓冲区的引用,如果其引用计数变为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。
内存分配失败则返回NULL。
skb_unshare
产生一个共享缓冲区的拷贝
struct sk_buff * skb_unshare (struct sk_buff * skb, int pri);
skb为要检查的缓冲区,pri为内存分配的优先级
如果套接字缓冲区是克隆的,那么这个函数就创建一个新的数据拷贝,并把原来缓冲区的引用计数减1,返回引用计数为1的新拷贝。如果不是克隆的,就返回原缓冲区。当从中断状态或全局锁调用该函数时,pri必须是GFP_ATOMIC。
内存分配失败则返回NULL。
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为要使用的链表,
newsk为要排队的缓冲区。
在链表首部对一个缓冲区进行排队。这个函数没有锁,因此在调用它之前必须持有必要的锁。一个缓冲区不能同时放在两个链表中。
skb_queue_head
在链表首部对一个缓冲区排队
void skb_queue_head (struct sk_buff_head * list, struct sk_buff * newsk)
list为要使用的链表,
newsk为要排队的缓冲区。
在链表首部对一个缓冲区进行排队。这个函持有锁,因此可以安全地使用。一个缓冲区不能同时放在两个链表中。
__skb_queue_tail
在链表尾部对一个缓冲区排队
void __skb_queue_tail (struct sk_buff_head * list, struct sk_buff * newsk)
list为要使用的链表,
newsk为要排队的缓冲区。
在链表尾部对一个缓冲区进行排队。这个函数没有锁,因此在调用它之前必须持有必要的锁。一个缓冲区不能同时放在两个链表中。
skb_queue_tail
在链表尾部对一个缓冲区排队
void skb_queue_tail (struct sk_buff_head * list, struct sk_buff * newsk)
list为要使用的链表,
newsk为要排队的缓冲区。
在链表尾部对一个缓冲区进行排队。这个函持有锁,因此可以安全地使用。一个缓冲区不能同时放在两个链表中。
__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 intlen)
skb为要使用的缓冲区,len为要增加的数据长度
这个函数扩充缓冲区所使用的数据区。如果扩充后超过缓冲区总长度,内核会产生警告。函数返回的指针指向所扩充数据的第一个字节。
skb_push
把数据加到缓冲区的开始
unsigned char * skb_push (struct sk_buff * skb, unsigned intlen);
skb为要使用的缓冲区,len为要增加的数据长度
这个函数扩充在缓冲区的开始处缓冲区所使用的数据区。如果扩充后超过缓冲区首部空间的总长度,内核会产生警告。函数返回的指针指向所扩充数据的第一个字节。
skb_pull
从缓冲区的开始删除数据
unsigned char * skb_pull (struct sk_buff * skb, unsigned intlen)
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 intlen)
skb为要改变的缓冲区,len为要删除的字节数
通过减少尾部空间,增加一个空&sk_buff的首部空间。这仅仅适用于空缓冲区。
skb_trim
从缓冲区删除尾部
void skb_trim (struct sk_buff * skb, unsigned intlen);
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。尽管这个函数是分配内存,但也可以从中断来调用。
skb_cow
当需要时拷贝skb的首部
struct sk_buff * skb_cow (struct sk_buff * skb, unsigned intheadroom)
Skb为要拷贝的缓冲区,headroom为需要的头空间
如果传递过来的缓冲区缺乏足够的头空间或是克隆的,则该缓冲区被拷贝,并且附加的头空间变为可用。如果没有空闲的内存,则返回空。如果缓冲区拷贝成功,则返回新的缓冲区,否则返回已存在的缓冲区。
skb_over_panic
私有函数
void skb_over_panic (struct sk_buff * skb, intsz, void * here)
skb为缓冲区,sz为大小,here为地址。
用户不可调用。
skb_under_panic
私有函数
void skb_under_panic (struct sk_buff * skb, intsz, void * here)
skb为缓冲区,sz为大小,here为地址。
用户不可调用。
alloc_skb
分配一个网络缓冲区
struct sk_buff * alloc_skb (unsigned int size, intgfp_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, int gfp_mask)
skb为要克隆的缓冲区,gfp_mask为分配掩码。
复制一个&sk_buff。新缓冲区不是由套接字拥有。两个拷贝共享相同的数据包而不是结构。新缓冲区的引用计数为1。如果分配失败,函数返回NULL,否则返回新的缓冲区。如果从中断调用这个函数,掩码只能使用GFP_ATOMIC的gfp_mask。
skb_copy
创建一个sk_buff的私有拷贝
struct sk_buff * skb_copy (const struct sk_buff *skb, int gfp_mask)
skb为要拷贝的缓冲区,gfp_mask为分配优先级。
既拷贝&sk_buff也拷贝其数据。该函数用在调用者希望修改数据并需要数据的私有拷贝来进行改变时。失败返回NULL,成功返回指向缓冲区的指针。
返回的缓冲区其引用计数为1。如果从中断调用,则必须传递的优先级为GFP_ATOMIC。
skb_copy_expand
拷贝并扩展sk_buff
struct sk_buff * skb_copy_expand (const struct sk_buff *skb, int
newheadroom, int newtailroom, int gfp_mask);
skb为要拷贝的缓冲区,newheadroom为头部的新空闲字节数,newtailroom为尾部的新空闲字节数。
既拷贝&sk_buff也拷贝其数据,同时分配额外的空间。当调用者希望修改数据并需要对私有数据进行改变,以及给新的域更多的空间时调用该函数。失败返回NULL,成功返回指向缓冲区的指针。
返回的缓冲区其引用计数为1。如果从中断调用,则必须传递的优先级为GFP_ATOMIC。
- linux协议栈skb操作函数
- linux协议栈skb操作函数
- linux协议栈skb操作函数
- Linux协议栈skb操作函数介绍
- inux协议栈skb操作函数 -- linux
- linux协议栈skb操作函数
- Linux网络协议栈 — skb
- skb操作函数
- Linux 内核网络协议栈 中最重要的数据结构 SKB
- 【Linux 驱动】Netfilter/iptables (六) 内核协议栈编程(发送skb)
- 【Linux 驱动】Netfilter/Iptables (七) 内核协议栈skb封装分析(续六)
- 《探寻linux协议栈》之二:源于skb的一场大联欢
- skb相关的函数
- skb - Linux network buffers
- skb - Linux network buffers
- skb --- linux network buffers
- linux 中skb结构
- Linux skb->priority Qos
- java中如何实现对已有图片的部分截图
- Java中HashMap遍历的两种方式
- HDU 1213
- 英语练习27 He usually plays tennis
- 消失的网页:信息衰减正在蚕食我们的历史
- linux协议栈skb操作函数
- 交叉编译静态库的链接顺序
- 冲量(impulse)
- jquery获得下拉框的值
- 数学之美番外篇:平凡而又神奇的贝叶斯方法(5)——刘未鹏
- 使用 jQuery UI Widget Factory 编写有状态的插件(Stateful Plugins)
- PL/SQL记住用户名密码
- 关于爱情
- MSDE 增加登录用户名及赋予角色