我们知道 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函数的更多相关文章

  1. Effective C++_笔记_条款05_了解C++默认编写并调用哪些函数

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 直接上代码: 1: class Empty{}; 如果你写了这样 ...

  2. Python笔记_第四篇_高阶编程_再议装饰器和再议内置函数

    1. 概述: 我们在前面用了很多的装饰器这个工具的方法.这个位置要系统的讲一下装饰器. 1.2 为什么需要装饰器. 装饰器本质是一个Python函数,它可以让其他函数在不需要任何代码变动的前提下增加额 ...

  3. u-boot启动流程分析(2)_板级(board)部分

    转自:http://www.wowotech.net/u-boot/boot_flow_2.html 目录: 1. 前言 2. Generic Board 3. _main 4. global dat ...

  4. underscore.js源码解析【'_'对象定义及内部函数】

    (function() { // Baseline setup // -------------- // Establish the root object, `window` (`self`) in ...

  5. go import使用及. _的作用解析

    go中import用于导入包.导入之后就可以使用包中的代码. 比如: import( "fmt" ) 在代码中就可以使用fmt包中的方法,如: fmt.Println(" ...

  6. 学习笔记之C++入门到精通(名师教学·手把手教会)【职坐标】_腾讯课堂

    C++入门到精通(名师教学·手把手教会)[职坐标]_腾讯课堂 https://ke.qq.com/course/101465#term_id=100105503 https://github.com/ ...

  7. Scala 基础(8)—— 占位符_和部分应用函数

    1. 占位符 _ 针对 Scala 基础(7)—— 函数字面量和一等函数 中最后提到的,关于 filter 函数字面量的精简写法,可以使用占位符 _ 来代替. 占位符_,用来表示一个或者多个参数.(这 ...

  8. 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总是把一个空选项指 ...

  9. Python 进阶_生成器 & 生成器表达式

    目录 目录 相关知识点 生成器 生成器 fab 的执行过程 生成器和迭代器的区别 生成器的优势 加强的生成器特性 生成器表达式 生成器表达式样例 小结 相关知识点 Python 进阶_迭代器 & ...

随机推荐

  1. java类加载全过程

    引用:http://blog.csdn.net/haluoluo211/article/details/49908463 http://www.cnblogs.com/pengfeiliu/p/442 ...

  2. python argparse库

    argparse用法总结 https://blog.csdn.net/qq_24551305/article/details/90155858 args = parse.parse_args()par ...

  3. VBA来实现已存在的数据库,取得所有表的结构

    问题描述 用VBA来取出MySQL数据库中的所有表的结构后生成一个Excel的文档 首先创建MySQL的数据源,如何创建数据源在前章已经写过,之后把下面的信息填写上即可 在window7 64位系统上 ...

  4. 2、1 昨天讲列表缓存,为了让列表更新,我们需要在增、删、改方法之前加 @CacheEvict(value="list",allEntries = true)

    package com.bw.service; import java.util.List; import javax.annotation.Resource; import org.springfr ...

  5. vue 强制刷新组件重新渲染

    实现功能:使用富文本编辑器编写文章,然后把编写成功的文章用子组件显示. 问题描述:父组件给子组件传递数据,子组件第一次调用数据的时候页面渲染是正常的,当数据变化的时候,子组件的页面渲染就失效了. 问题 ...

  6. redis 持久化 ——RDB

    文章目录 RDB 关于 fork dump.rdb 文件 如何触发 RDB 快照 如何恢复 优势 劣势 停掉 RDB RDB redis database 的简写 : 在指定时间间隔后,将内存中的数据 ...

  7. WUTOJ 1284: Gold Medal(Java)

    1284: Gold Medal 题目   有N个砝码,重量为:3i-1(1<=i<=N),有一块重量为 W 的金牌.现在将金牌放在天平的左边.你需要将砝码放在左边或右边使得天平平衡,如果 ...

  8. Redis的AOF重写脚本

    手动触发 每天定期的去执行一次 写了一个脚本 bgrewriteaof.sh 内容如下: #!/bin/bash /usr/local/redis/redis-cli -p 6379 -h 127.0 ...

  9. Lieges of Legendre CodeForces - 603C (博弈论,SG找规律)

    大意: 给定$n$堆石子, 两人轮流操作, 每次操作两种选择 $(1)$任选非空堆拿走一个石子 $(2)$任选石子数为$2x(x>0)$的一堆, 替换为$k$堆$x$个石子. ($k$给定) 最 ...

  10. poj 3617 弱鸡贪心

    比赛的时候扣了一道贪心的题目,不会写,,现在补一补一些基础的贪心. 题意:给定一个字符串s,要求按下列操作生成一个新串t--每次从s串中的最前和最后取一个字符给t,要求生成的t字典序最小. 题解:由于 ...