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整理笔记(二、操作函数),布布扣,bubuko.com

时间: 2024-10-25 09:04:29

sk_buff整理笔记(二、操作函数)的相关文章

linux shell学习笔记二---自定义函数(定义、返回值、变量作用域)介绍

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数. 2.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值. retu

PHP整理笔记六自定义函数

一.标准函数 标准的PHP发行包中有1000多个标准函数,这些标准函数都是系统内置的,不需要用户自己创建而可以直接使用. <? echo md5('123456');   //MD5函数对字符串进行加密处理 ?>   二.自定义函数 PHP内置函数允许和文件进行交互.使用数据库.创建图形,还可以连接其他的服务器.但是,在实际工作中,有许多时候所需要的东西是语言的创建者无法预见到的. 声明一个函数可以让我们想内置函数那样使用自己的代码.只要简单地调用这个函数并提供给它必须的参数.这就意味着,在整

JavaScript笔记(二):函数只是一种对象

上一篇随笔提到JS中有两种数据类型:原始类型和对象类型,但是我们还没有提到函数.实际上函数也是一种对象,准确地说函数应该叫做函数对象.下面从对象开始说起. 1. 对象和函数 最简单的对象,是这样的: var obj = {}; 我们创建了一个空对象.说它空是因为它没有任何自定义属性,但是实际上它还是有一些默认属性的,这些属性是从它的原型对象继承来的,比如constructor.toString和valueOf等.除此之外,ECMA-262中还定义了对象的一些内置属性,这些属性对JS语言来说是不可

MongoDB整理笔记のGUI操作

值得幸运的是,其实MongoDB也有像类似于PL/SQL一样的界面操作工具操作MongoDB. 下面就来介绍几款不同的界面工具,大家各取所需! MongoVUE 主页:http://www.mongovue.com/ 一个桌面程序,提供了对MongoDB 数据库的基本操作,如查看.查询.更新.删除等,简单易用,但是功能还比较弱,以后发展应该不错.  RockMongo 主页:http://code.google.com/p/rock-php/ RockMongo 是一个PHP5 写的MongoD

JavaScript学习代码整理(二)--函数

//JavaScript函数 //简单的求和函数 function sum(a,b) { return a + b; } //函数可以存储在变量中,也可以通过变量调用函数 x = sum(a,b); x(1,2); //自调用函数 (function(){ var x = "Hello"; //以上函数实际上是一个 匿名自我调用的函数 (没有函数名). }) //arguments.length 属性返回函数调用过程接收到的参数个数: function MyFunction(a,b,c

C#学习笔记二(函数高级参数)

int[] b = { 1, 2, 3, 4, 5 }; int max; int min; int sum; int avg; OutTest(b,out max,out min,out sum,out avg); Console.WriteLine("最大:{0},最小:{1},总和:{2},平均:{3}",max,min,sum,avg); Console.ReadKey(); /// <summary> /// 用来返回多个参数的测试函数,使用OUT参数 /// &

【HTML5学习】HTML5学习整理笔记(二)

接上一篇 (六):HTML5样式,链接和表格 ①:HTML样式: 1.标签: <style>:样式定义 <link>:资源引用 2.熟悉: rel="stylesheet":外部样式表 type="text/css":引用文档的类型 margin-left:边距 HTML三种样式插入方法: 1.外部样式表: <link rel="stylesheet" type="text/css" href=&

Linux内核--网络协议栈深入分析(二)--sk_buff的操作函数

本文分析基于Linux Kernel 3.2.1 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7972647 更多请查看网络栈分析专栏http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 1.alloc_skb()函数 该函数的作用是在上层协议要发送数据包的时候或网络设备准备接收数据包的时候会调用alloc_skb()函数分配sk_buff结构体,需要释

jQuery整理笔记目录

jQuery整理笔记目录 jQuery整理笔记一----jQuery开始 jQuery整理笔记二----jQuery选择器整理 jQuery整理笔记三----jQuery过滤函数 jQuery整理笔记四----jQuery操作DOM jQuery整理笔记五----jQuery事件 jQuery整理笔记六----jQuery动画 jQuery整理笔记七----几个经典表单应用 jQuery整理笔记八----jQuery的Ajax jQuery整理笔记九----功能性表格开发 jQuery整理笔记目