i p _ d o o p t i o n s函数
我们知道 i p i n t r在检测分组的目的地址之前调用 i p _ d o o p t i o n s。
i p _ d o o p t i o n s被传给一个指针m,该指针指向某个分组, i p _ d o o p t i o n s处理分组中它所
知道的选项。如果i p _ d o o p t i o n s转发该分组,如在处理 L S R R和S S R R选项时,或由于某个
差错而丢掉该分组时,它返回 1。如果它不转发分组, i p _ d o o p t i o n s返回0,由i p i n t r继
续处理该分组。
i p _ d o o p t i o n s是一个长函数,所以我们分步地显示。第一部分初始化一个 f o r循环,
处理首部中的各选项。
当处理每个选项时, c p指向选项的第一个字节。图 9 - 7显示,当可用时,如何从 c p的常
量位移访问t y p e、l e n g t h和o f f s e t字段。
R F C把位移(o f f s e t)字段描述作指针(p o i n t e r),指针比位移的描述性略强一些。 o f f s e t的值是
某个字节在该选项内的序号 (从t y p e开始,序号为1 ),不是从t y p e开始的、且以零开始的计数。
位移的最小值是4 (I P O P T _ M I N O F F) ,它指向的是多字节选项中数据字段的第一个字节。
图显示了i p _ d o o p t i o n s函数的整体结构。
5 5 5 - 5 6 6 i p _ d o o p t i o n s把I C M P差错类型t y p e初始化为I C M P _ P A R A M P R O B,对任何没
有特定差错类型的差错,这是一个一般值。对于 I C M P _ P A R A M P R O B,c o d e指的是出错字节
在分组内的位移。这是默认的I C M P差错报文。某些选项将改变这些值。
i p指向一个2 0字节大小的i p结构,所以i p + 1指向的是跟在I P首部后面的下一个
i p结构。因为i p _ d o o p t i o n s需要I P首部后面字节的地址,所以就把结果指针转换
成为指向一个无符号字节 (u _ c h a r)的指针。因此,c p指向标准I P首部以外的第一个
字节,就是I P选项的第一个字节。
1. EOL和N O P过程
5 6 7 - 5 8 2 f o r循环按照每个选项在分组中出现的顺序分别对它们进行处理。 E O L选项以及
一个无效的选项长度(也即选项长度表明选项数据超过了 I P首部)都将终止该循环。当出现N O P
选项时,忽略它。s w i t c h语句的d e f a u l t情况隐含要求系统忽略未知的选项。
下面的内容描述了 s w i t c h语句处理的每个选项。如果 i p _ d o o p t i o n s在处理分组选项
时没有出错,就把控制交给s w i tc h下面的代码。
2. 源路由转发
7 1 9 - 7 2 4 如果分组需要被转发,S S R R或L S R R选项处理代码就把f o r w a r d置位。分组被传
给i p _ f o r w a r d,并且第2个参数为1,表明分组是按源路由选择的。
3. 差错处理
7 2 5 - 7 3 0 如果在s w i t c h语句里出现了错误,i p _ d o o p t i o n s就跳到b a d。从分组长度中
把I P首部长度减去,因为i c m p _ e r r o r假设首部长度不包含在分组长度里。 i c m p _ e r r o r发
出适当的差错报文,i p _ d o o p t i o n s返回1,避免i p i n t r处理被丢弃的分组。
i p _ d o o p t i o n s函数的更多相关文章
- Effective C++_笔记_条款05_了解C++默认编写并调用哪些函数
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 直接上代码: 1: class Empty{}; 如果你写了这样 ...
- Python笔记_第四篇_高阶编程_再议装饰器和再议内置函数
1. 概述: 我们在前面用了很多的装饰器这个工具的方法.这个位置要系统的讲一下装饰器. 1.2 为什么需要装饰器. 装饰器本质是一个Python函数,它可以让其他函数在不需要任何代码变动的前提下增加额 ...
- u-boot启动流程分析(2)_板级(board)部分
转自:http://www.wowotech.net/u-boot/boot_flow_2.html 目录: 1. 前言 2. Generic Board 3. _main 4. global dat ...
- underscore.js源码解析【'_'对象定义及内部函数】
(function() { // Baseline setup // -------------- // Establish the root object, `window` (`self`) in ...
- go import使用及. _的作用解析
go中import用于导入包.导入之后就可以使用包中的代码. 比如: import( "fmt" ) 在代码中就可以使用fmt包中的方法,如: fmt.Println(" ...
- 学习笔记之C++入门到精通(名师教学·手把手教会)【职坐标】_腾讯课堂
C++入门到精通(名师教学·手把手教会)[职坐标]_腾讯课堂 https://ke.qq.com/course/101465#term_id=100105503 https://github.com/ ...
- Scala 基础(8)—— 占位符_和部分应用函数
1. 占位符 _ 针对 Scala 基础(7)—— 函数字面量和一等函数 中最后提到的,关于 filter 函数字面量的精简写法,可以使用占位符 _ 来代替. 占位符_,用来表示一个或者多个参数.(这 ...
- i p _ i n s e r t o p t i o n s函数
i p _ o u t p u t函数接收一个分组和选项.当 i p _ f o r w a r d调用该函数时,选项已经是分组的一部分,所以 i p _ f o r w a r d总是把一个空选项指 ...
- Python 进阶_生成器 & 生成器表达式
目录 目录 相关知识点 生成器 生成器 fab 的执行过程 生成器和迭代器的区别 生成器的优势 加强的生成器特性 生成器表达式 生成器表达式样例 小结 相关知识点 Python 进阶_迭代器 & ...
随机推荐
- 什么是挂载(mount)?
官方文档是这么解释的: All files accessible in a Unix system are arranged in one big tree, the file hierarchy, ...
- C++之父给 C 程序员的建议
1. 在 C++中几乎不需要用宏, 用 const 或 enum 定义显式的常量, 用 inline 避免函数调用的额外开销,用模板去刻画一族函数或类型,用 namespace 去避免命名冲突. 2. ...
- Spring Boot系列教程十一: Mybatis使用分页插件PageHelper
一.前言 上篇博客中介绍了spring boot集成mybatis的方法,基于上篇文章这里主要介绍如何使用分页插件PageHelper.在MyBatis中提供了拦截器接口,我们可以使用PageHelp ...
- 20191011-构建我们公司自己的自动化接口测试框架-Util的读取excel常用方法模块
包括获取excel的sheet名字,设定excel的sheet,读excel,写excel等常规操作. from openpyxl import Workbook from openpyxl impo ...
- TZOJ1294吃糖果
#include<stdio.h> int main() { ],mi,i,max,s; scanf("%d",&t); while(t--) { scanf( ...
- 列表初始化(list initialization)
列表初始化啊就是大括号来初始化: 列表初始化的好处:
- 关于UBOOT,LINUX内核编译,根文件系统的15个小问题
(1)内核默认运行地址和加载地址在哪里设置? 由 arch/arm/kernel/vmlinux.lds.S 生成的 arch/armkernel/vmlinux.lds决定 (2)从FLASH什 ...
- win7 bios引导启动Ubuntu
用easyBCD修改系统启动项更改 1.安装easyBCD后打开,点击“Add New Entry”>选择Linux/BSD:具体设置如图,Type选择GRUB2,Name自己随便写,笔者写的是 ...
- 使用Lua编写Wireshark插件解析KCP UDP包,解析视频RTP包
前段时间写了一个局域网音视频通话的程序,使用开源 KCP 来实现可靠UDP传输. 通过研究发现KCP在发包时,会在数据包前面加上它自己的头.如果数据包较小,KCP可能会把多个数据包合成一个包发送,提高 ...
- 基于微软hyper-v虚拟化服务器搭建方法和步骤整理
基于Microsoft基础设施私有云计算搭建 摘要:私有云是指组织机构建设的专供自己使用的云平台,它所提供的服务不是供他人使用,而是供自己的内部人员或分支机构使用,不同于公有云,私有云部署在企业内部网 ...