linux协议栈skb操作函数,linux协议栈skb操作函数

本文详细介绍了skb_queue系列函数的功能及使用方法,包括检查队列是否为空、引用和释放sk_buff缓冲区、判断缓冲区是否为克隆或共享等。此外还提供了缓冲区的插入、删除、扩展等操作说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数名

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值