sk_buff整理笔记(两、操作函数)
承接上一:sk_buff 整理笔记(一、数据结构)这一篇要讲的是内核为sk_buff结构提供的一些操作函数。
第一、首先要讲的是sk_buff中的四大指针:
四大指针各自是:head、data、tail、end;这四个指针都是指向了数据区的。数据区中存放的是协议头和数据。head和end指针是每一个数据包一样的,也是有这两个指针来确定数据区的大小的。最開始的时候head、data、tail三个指针都是指向一起的,当有协议数据加进来时才更改。
再来说下包的形成。首先是应用层的数据。然后到四层加上四层的TCP协议头(如果为TCP包),然后发往三层。在三层时把四层发来的数据都当作是负载,然后再往负载前加上一个三层IP协议头。发往二层。最后二层加上个帧头就能够发送了。所以在包形成时,这几个指针起到了很关键的作用。以下来看下四个指针的指向地址大小,这也有利于对以下要讲到一些操作函数的理解。
最后一句的意思是:当数据包在二层(即data指针指向二层协议头)时。获取到三层协议头指针的一种方法。当然也能够直接用自带的获取三层协议头指针的函数(事实上函数里面也是用上面这句代码实现的),这里仅仅是为了显示data添加时,是往下移动的。
方便后面的几个函数理解。
第二、几个操作sk_buff指针的函数:
首先来说下三个空间。方便以下介绍函数时理解。第一个是:headroom,就是skb->head和skb->data之间的空间。第二个是:data。就是skb->data和skb->tail之间的空间。第三个是:tailroom,就是skb->tail和skb->end之间的空间。例如以下图:
接下来说下四个操作sk_buff结构中指针的函数:(a)skb_put(), (b)skb_push(), (c)skb_pull(), and (d)skb_reserve();这四个函数在数据包在各层之间传输时。起到了至关
重要。
(a)skb_put():向后扩大数据区空间。headroom空间不变,tailroom空间降低,skb->data指针不变,skb->tail指针下移;
(b)skb_push():向前扩大数据区空间。headroom空间降低,tailroom空间不变。skb->tail指针不变,skb->data指针上移;
(c)skb_pull():缩小数据区空间,headroom空间增大。tailroom空间不变,skb->data指针下移,skb->tail指针不变;
(d)skb_reserve():数据区不变,headroom空间增大,tailroom空间降低,skb->data和skb->tail同一时候下移;
大家也能够照着源代码来分析,还有个当大家看源代码时。会发现好多函数都有个同名的,比方:skb_push()函数,就有两个:static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len);和unsigned char *skb_push(struct
sk_buff *skb, unsigned int len);第一个函数是详细内容的实现(关键函数),第二个函数仅仅是在第一个函数的基础上进行一些合法性检查。
第三、其它简单的操作函数:
获取/设置协议头指针等一系列函数。如:获取IP头指针,unsigned char *skb_network_header(const struct sk_buff *skb);还有其它些函数(skb内存申请、skb克隆和复制、skb队列操作)将到后面做具体分析。
敬请观看下一篇sk_buff整理笔记(三、内存分配和释放)
sk_buff整理笔记(两、操作函数)的更多相关文章
- MongoDB整理笔记のGUI操作
值得幸运的是,其实MongoDB也有像类似于PL/SQL一样的界面操作工具操作MongoDB. 下面就来介绍几款不同的界面工具,大家各取所需! MongoVUE 主页:http://www.mongo ...
- JavaScript 数组操作函数--转载+格式整理
JavaScript 数组操作函数(部分)--转载+格式整理 今天看了一篇文章,主要讲的对常用的Js操作函数:push,pop,join,shift,unshift,slice,splice,conc ...
- python3.7内置函数整理笔记
#python3.7 内置函数整理 #abs(x) #返回数字的绝对值. 参数可以是整数或浮点数. 如果参数是复数,则返回其大小 # print(abs(1)) # print(abs(-1)) # ...
- (笔记)Linux内核中内存相关的操作函数
linux内核中内存相关的操作函数 1.kmalloc()/kfree() static __always_inline void *kmalloc(size_t size, gfp_t flags) ...
- canvas学习笔记、小函数整理
http://bbs.csdn.net/topics/391493648 canvas实例分享 2016-3-16 http://bbs.csdn.net/topics/390582151 html5 ...
- Qt 学习之路 2(19):事件的接受与忽略(当重写事件回调函数时,时刻注意是否需要通过调用父类的同名函数来确保原有实现仍能进行!有好几个例子。为什么要这么做?而不是自己去手动调用这两个函数呢?因为我们无法确认父类中的这个处理函数有没有额外的操作)
版本: 2012-09-29 2013-04-23 更新有关accept()和ignore()函数的相关内容. 2013-12-02 增加有关accept()和ignore()函数的示例. 上一章我们 ...
- 【阅读笔记】《C程序员 从校园到职场》第六章 常用文件操作函数 (Part 1)
参考链接:https://blog.csdn.net/zhouzhaoxiong1227/article/details/24926023 让你提前认识软件开发(18):C语言中常用的文件操作函数总结 ...
- canvas学习之API整理笔记(二)
前面我整理过一篇文章canvas学习之API整理笔记(一),从这篇文章我们已经可以基本了解到常用绘图的API.简单的变换和动画.而本篇文章的主要内容包括高级动画.像素操作.性能优化等知识点,讲解每个知 ...
- Linux C 文件操作函数(~上善止水~)
翻翻笔记,整理一下 C 语言中的文件操作函数 ~~~~~~,多注意细节,maybe 细节决定成败~ 1. fopen /* fopen(打开文件) * * 相关函数 open,fclose * * 表 ...
随机推荐
- VMware vSphere 服务器虚拟化之十八桌面虚拟化之安装View Composer服务器
VMware vSphere 服务器虚拟化之十八桌面虚拟化之安装View Composer服务器 View Compose服务可安装在管理虚拟机的vC ...
- FlexPaper二次开发问题及搜索高亮显示
原文:FlexPaper二次开发问题及搜索高亮显示 最近有个需求,做一个IT知识库,类似于文库,说到文库肯定会用到在线浏览文档了,所有在网上翻阅了一下类似豆丁的在线浏览器插件的资料,将其进行了二次开发 ...
- 使用SVM对于许多类型的多维数据分类
最近,我做了一件小事,使用SVM正确8三维级数据分类,在线搜索,我们发现二分的问题大家都在讨论二维数据,一些决定自己的研究.我首先参考opencvtutorial.这也是二维数据的二分类问题.然后通过 ...
- 使用 Cordova+Visual Studio 创建跨平台移动应用(1)
1简介 本章节是关于Visual Studio Tools for Apache Cordova的,目前此产品只发布了预览版.Visual Studio for Apache Cordova帮助熟悉V ...
- Cocos2d-x示例:单点触摸事件
为了让大家掌握Cocos2d-x中的事件机制,以下我们以触摸事件为例.使用事件触发器实现单点触摸事件.该实比如图8-3所看到的,场景中有三个方块精灵,显示顺序如图8-3所看到的,拖拽它们能够移动它们. ...
- Ejb in action(两)——示例入门
在前面的文章中,,我们推出Ejb相关概念.在此之前展开的阐述,我给大家Ejb示例.加深印象. 开发环境:eclipse 应用server:jboss 1.服务端程序 在Eclipse中创建一个Ejb项 ...
- CloudFoundry 中的GoRouter性能測试
之前一直感觉CloudFoundry的GoRouter的性能不靠谱,或者我们的CloudFoundry 部署架构存在问题,想着进行一些压力測试,可是一直苦于没有压力測试的工具.上一周,部门须要出一个測 ...
- 开源NetWorkSocket通讯组件
开源NetWorkSocket通讯组件 前言 在<化茧成蝶,开源NetWorkSocket通讯组件>发表之后,收到大家很多个star,在此感谢!更可贵的是,一些网友提出了许多好建议,经 ...
- 利用Eclipse中的Maven构建Web项目(三)
利用Eclipse中的Maven构建Web项目 1.将Maven Project转换成动态Web项目,鼠标右键项目,输入"Project Facets" 2.依据Dynamic W ...
- 读书时间《JavaScript高级程序设计》四:BOM,客户端检测
隔了一段时间,现在开始看第8章. 第8章:BOM BOM提供了很多对象,用于访问浏览器的功能.BOM的核心对象是window,它表示浏览器的一个实例. window对象是通过javascript访问浏 ...