文档章节

linux内核API每天来一发(5)

付超_pku
 付超_pku
发布于 2013/04/28 16:44
字数 3567
阅读 43
收藏 0

第七章 网络编程

第一节 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。
内存分配失败则返回NULL

skb_unshare

函数名称 产生一个共享缓冲区的拷贝
函数原型 struct sk_buff * skb_unshare (struct sk_buff * skb, int pri);
参数列表 skb---为要检查的缓冲区
pri---为内存分配的优先级
函数简介

如果套接字缓冲区是克隆的,那么这个函数就创建一个新的数据拷贝,并把原来缓冲区的引用计数减1,返回引用计数为1的新拷贝。如果不是克隆的,就返回原缓冲区。当从中断状态或全局锁调用该函数时,pri必须是GFP_ATOMIC。
内存分配失败则返回NULL。

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---为要使用的链表
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_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,并赋予它一个引用计数
函数简介

这个缓冲区有未确定的头空间。用户应该分配自己需要的头空间。
如果没有空闲内存,则返回NULL。尽管这个函数是分配内存,但也可以从中断来调用。

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,成功返回指向缓冲区的指针。
返回的缓冲区其引用计数为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为尾部的新空闲字节数gfp_mask为分配掩码
函数简介

既拷贝&sk_buff也拷贝其数据,同时分配额外的空间。当调用者希望修改数据并需要对私有数据进行改变,以及给新的域更多的空间时调用该函数。失败返回NULL,成功返回指向缓冲区的指针。
返回的缓冲区其引用计数为1。如果从中断调用,则必须传递的优先级为GFP_ATOM

© 著作权归作者所有

付超_pku
粉丝 3
博文 17
码字总数 42455
作品 0
西城
网页/平面设计
私信 提问
谷歌是怎样使用Linux的?

作者:袁萌 过去,谷歌怎样使用Linux一直是个谜团,属于谷歌所谓的“商业机密”.实际情况是,连谷歌自己也不好意思说出来.此话当真? 10月19日至20日,《Linux内核开发峰会》在日本东京召开,其间谷...

红薯
2009/11/07
2.8K
2
linux2.6.29发布

linux的最新版本今天发布了,我几乎每天都在看linux内核的网站新闻,每天都在等待新内核的发布,每当新内核提出来时,我就会看一些相关的文章,这些文章介绍了新内核的大致理论,主要通过目前...

晨曦之光
2012/04/10
146
0
Build 2019 上微软的开源动作有点不一样

微软今年举办的 Build 开发者大会可谓是抢足风头,大会第一天就放了不少大招:宣布新的命令行终端 Windows Terminal、Windows 10 的 Linux 子系统 WSL 2 将运行真正的 Linux 内核、跳过 .NET...

局长
05/13
4K
18
windows的分层驱动--内核实现的一种方式

古老的unix提出了一切皆文件的思想,近代的OO提出了一切皆对象的理论,在unix的年代,人们迫切需要的是如何操作计算机而不是如何设计软件,毕竟那个时候软件设计其实比现在简单,就那么几种,...

晨曦之光
2012/04/10
172
0
WSL 2 内核源码 - WSL2-Linux-Kernel

WSL2-Linux-Kernel 基于 Linux 内核修改而来,是微软 WSL 2 使用的内核源码。 与第一代相比,WSL 2 重新设计了架构,使用真正的 Linux 内核,支持在 Windows 上运行 ELF64 Linux 二进制文件。...

匿名
06/30
3.7K
0

没有更多内容

加载失败,请刷新页面

加载更多

Java获取当前时间的上一个月和下一个月,第一天和最后一天,任意时间的第一天和最后一天,任意时间上一个月和下一个月详解

/** * 获取当前时间 * * @param args */ public static String getNowTime() { Calendar cal = Calendar.getInstance(); SimpleDa......

botkenni
21分钟前
4
0
yum指定某repo进行软件安装

命令 # yum install XXX --enablerepo=YYY XXX:需要要安装的软件。 YYY:相应源的“repo id”。 注意:建议安装的时候尽量选择同一个源,因为不同的源安装的软件可能会有冲突。 eg:指...

Wybaron
22分钟前
2
0
学习记录(day12-container容器布局、侧边导航栏)

container容器布局、侧边导航栏 index.js import Vue from 'vue'import VueRouter from 'vue-router'Vue.use(VueRouter)const routes = [ { path:'/', redirect:'/studentL......

庭前云落
24分钟前
2
0
为什么你成不了数据分析高手?可能是缺少这个思维

在讲前三章基础思维的时候,有读者反映文章过于理论,没有实际的操作讲解,那么今天我就在讲解数据思维的同时也会附上案例教程,以供大家参考学习。 话不多说,我们今天要讲的是矩阵思维,其...

帆软
36分钟前
3
0
怎样绘制时间轴流程图?迅捷画图教你一招轻松解决

时间轴流程图就是通过一张图将不同年代发生的事情或者是多方面的事情串联起来,形成一个相对完整的记录体系,运用图文的形式呈现给用户,时间轴流程图可以应用不同的领域,让过去发生的事情更...

百因必有果
46分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部