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 * * 表 ...
随机推荐
- 全文检索引擎Solr 指南
全文检索引擎Solr系列:第一篇:http://t.cn/RP004gl.第二篇:http://t.cn/RPHDjk7 .第三篇:http://t.cn/RPuJt3T
- 重写ViewPager实施单一交有关切换到这个问题,并没有缓存
我们需要解决这个问题:切换时,可以实现单独的消息到左和右,但我不知道的情况下根据岗位总数.只是不知道ViewPagerAdapter的getCount数量. 因为帖子内容的数据图片和布局比較复杂.所以 ...
- C++习题 对象数组输入与输出
Description 建立一个对象数组,内放n(n<10)个学生的数据(学号.成绩),用指针指向数组首元素,输出第奇数(1,3,5,7)个学生的数据. Input n和n个学生的学号.成绩 O ...
- POJ 2405 Beavergnaw (计算几何-简单的问题)
Beavergnaw Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6203 Accepted: 4089 Descri ...
- Spark 1.0.0版本发布
前言 如今Spark终于迈出了里程碑一步,1.0.0标记的版本号出版物Spark1.0时代.1.0.0版本号不仅增加了非常多新特性.而且提供了更好的API支持.Spark SQL作为一个新的组件增加. ...
- 【网络流量最大流量】poj3281Dining
/* EK算法版本号,哦,慢.....见下文dinic版本号 ----------------------------------------- 最大的问题是网络流量问题 -------------- ...
- Linux查找多个类似,但不同的名称和重命名文件
受试者被认为是百度侧面问题,Linux称号:寻找core.1.core.2....形式命名的文件,然后改变这些文件的名称bak.core.1.bak.core.2,...... 首先,你应该找到这些文 ...
- codeforces Round #260(div2) D解决报告
D. A Lot of Games time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- android采用videoView播放视频(包装)
//android播放视频.用法:于androidManifest.xml添加activity, // <activity android:name=".PlayVideo" ...
- php 二维数组传递给 js 问题解决记录
需求: php从数据库中读取到二维数组.传递到js中 实现步骤: php:json_encode → json → js:eval 即在php中使用json_encode()将php的二维数 ...