



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
skb_put() - 扩展缓冲区中数据区域的大小;增加len个字节/usr/src/linux-2.6.19/include/linux/skbuff.hstatic inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len) unsigned char *tmp = skb-tail; SKB_LINEAR_ASSERT(skb); skb-tail += len; skb-len += len; if (unlikely(skb-tailskb-end) skb_over_panic(skb, len, current_text_addr(); return tmp; dev_alloc_skb()也是一个缓冲区分配函数,它主要被设备驱动使用,通常用在中断上下文中。这是一个alloc_skb()的包装函数,它会在请求分配的大小上增加16字节的空间以优化缓冲区的读写效率,它的分配要求使用原子操作(GFP_ATOMIC),这是因为它是在中断处理函数中被调用的。 dev_alloc_skb(length) uses the function alloc_skb() to create a socket buffer. The length of this socket buffers packet data space is length + 16 bytes. Subsequently, skb_reserve(skb, 16) is used to move the currently valid packet data space 16 bytes backwards. This means that the packet has now a headroom of 16 bytes and a tailroom of length bytes. /usr/src/linux-2.6.19/include/linux/skbuff.hstatic inline struct sk_buff *dev_alloc_skb(unsigned int length) return _dev_alloc_skb(length, GFP_ATOMIC);/usr/src/linux-2.6.19/include/linux/skbuff.hstatic inline struct sk_buff *_dev_alloc_skb(unsigned int length, gfp_t gfp_mask) struct sk_buff *skb = alloc_skb(length + NET_SKB_PAD, gfp_mask); if (likely(skb) skb_reserve(skb, NET_SKB_PAD); return skb;/usr/src/linux-2.6.19/include/linux/skbuff.h#ifndef NET_SKB_PAD#define NET_SKB_PAD 16#endif24.8 接收过程的实现接收函数一般由中断控制程序调用,负责把网络设备接收到的数据以一定格式提交给内核中的网络层模块。在具体介绍接收函数前先简单介绍一下sk_buff结构。24.8.1 sk_buff结构sk_buff是Linux网络协议栈中一个重要数据结构,网络协议栈中的各层协议都可以通过对它的操作实现本层协议数据的添加或者数据提取,这种机制避免了协议数据单元在不同的协议层间被来回复制情况的发生,提高了执行效率。内核在各协议层都提供一系列函数对此结构进行操作。如图24-4所示为sk_buff结构的示意图。sk_buff的数据分成两大部分,一部分是实际在网络中要传输的部分,图中表示为Packet date storage部分,这就是常说的数据区。另一部分是用于内核进行管理的部分。在此着重介绍要用到的几个域段。其中有四个数据指针指向数据区相应的位置。unsigned char *head:指向被分配的内存空间的首地址;unsigned char *data:指向当前数据包的首地址;unsigned char *tail:指向当前数据包的末地址;unsigned char *end:指向被分配的内存空间的末地址; (点击查看大图)图24-4 sk_buff结构 unsigned long len:当前数据包的大小。len=skb-tail - skb-data;unsigned long truesize:分配到的内存空间大小。len=skb-end - skb-head;struct net_device *dev:接收或者发送该数据包的网络设备;unsigned short:protocol给数据包使用的网络层协议。由于数据包的大小会随着自己在不同协议层间的传送而不断地变化,故data和tail指针也将会不断地改变,即依赖于sk_buff当前所在的协议层;head和end指针则在内存空间分配后就固定不变。对sk_buff缓冲区的操作,核心提供了一个比较完整的函数界面,下面将列出用得最多的几个函数并作分析说明。struct sk_buff*alloc_skb (unsigned int len, int priority);struct sk_buff*dev_alloc_skb (unsigned int len); 申请一个sk_buff缓冲区。alloc_skb函数分配一个缓冲区并将skb-data和skb-tail初始化为skb-head;dev_alloc_skb函数是alloc_skb函数的一个快捷方式,它用priority=GFP_ATOMIC调用alloc_skb并在skb-data和skb-head之间保留16字节的空间。这16字节也用来填写硬件头(hardware header)。void kfree_skb (struct sk_buff*skb, int rw);void dev_kfree_skb (struct sk_buff*skb, int rw);释放一个sk_buff缓冲区。kfree_skb()供核心内部调用,驱动程序应该用dev_kfree_skb(),因为它能正确处理缓冲区加锁。参数rw可用FREE_READ或FREE_WRITE。用于发送的缓冲区应该用FREE_WRITE,用于接收的则用FREE_READ。unsigned char *skb_put (struct sk_buff*skb, int len);当有数据要加到缓冲区的尾部时,用于增加skb-tail和skb-len。返回值是修改之前的skb-tail指针。static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len)unsigned char *tmp = skb-tail;SKB_LINEAR_ASSERT(skb);skb-tail += len;skb-len += len;if (unlikely(skb-tailskb-end)skb_over_panic(skb, len, current_text_addr();return tmp;unsigned char *skb_push (struct sk_buff*skb, int len);当有数据要加到缓冲区的首部时,用于减少skb-data及增大skb-len。返回值是修改之后的skb-data。 int skb_tailroom (struct sk_buff*skb);该函数返回在sk_buff中可用于put的空间大小(尾部空余空间)。如果缓冲区被正确分配到空间,驱动程序通常不需要检查缓冲区中剩余空间的大小。由于驱动程序在申请空间之前可得到数据包的大小,故只有严重出错的驱动程序才会put太多的数据到缓冲区中。int skb_headroom (struct sk_buff*skb); 类似于skb_tailroom(),该函数返回可用的push的空间大小,即首部空余空间。void skb_reserve (struct sk_buff*skb, int len); 该函数既增加skb-data又增加skb-tail,即在首部留出len大小的空间。在填充缓冲区之前,可用该函数保留一部分首部空间。许多以太网卡在首部保留2字节空间,这样在14字节的以太网头的后面,IP头就能以16字节对齐了。unsig
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湘潭理工学院《新能源汽车》2023-2024学年第二学期期末试卷
- 山东省安丘市重点名校2025届初三总复习质量调查(一)数学试题试卷含解析
- 江苏省兴化市顾庄区三校2025年初三下学期3月质量检测试题数学试题试卷含解析
- 华侨大学《信息内容安全》2023-2024学年第二学期期末试卷
- 聊城大学东昌学院《中国传统文化与中医》2023-2024学年第一学期期末试卷
- 武汉设计工程学院《BM5D项目管理》2023-2024学年第二学期期末试卷
- 云南省保山市施甸县2025届初三下学期两校期中联考数学试题含解析
- 泉州市晋江市2024-2025学年三年级数学第二学期期末检测试题含解析
- 浙江中医药大学滨江学院《物理化学实验》2023-2024学年第二学期期末试卷
- 江西旅游商贸职业学院《食品微生物检验技术实验》2023-2024学年第二学期期末试卷
- 移植排斥反应早期诊断-洞察分析
- 电力系统继电保护知到智慧树章节测试课后答案2024年秋福建水利电力职业技术学院
- IATF16949基础知识培训教材
- 《基于机器视觉的激光焊缝跟踪系统研究》
- UL1059标准中文版-2020接线端子UL标准中文版
- 酒店服务流程规范化手册
- 消化道疾病护理
- 2024年卫生专业技术资格考试卫生检验技术(初级(师)211)相关专业知识试题及答案指导
- 2024年视角下的地球形状教案创新探讨
- 2023年温州市服装制版师职业技能大赛技术文件
- 2024-2030年中国质子治疗仪产业现状趋势及应用前景预测研究报告
评论
0/150
提交评论