我们知道 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处理被丢弃的分组。