当响应某个分组时,I C M P和标准的运输层协议必须把分组带的任意源路由逆转。逆转源
路由是通过i p _ s r c r o u t e保存的路由构造的。
7 7 7 - 7 8 3 i p _ s r c r o u t e把保存在i p _ s r c r t结构中的源路由逆转后,
如果 i p _ n h o p s 是 0,则没有保存的路由,所以
i p _ s r c r o u t e返回一个指针。
当一个无效分组到达时, i p i n t r把i p _ n h o p s清零。运输层
协议必须调用i p _ s r c r o u t e,并在下一个分组到达之前自己保存逆转后的路由。正
如以前我们注意到的,这样做是正确的,因为 i p i n t r在处理分组时,在 I P输入队列的
下一个分组被处理之前都会调用运输层 ( T C P或U D P )的。
为源路由分配存储器缓存
7 8 4 - 7 8 6 如果i p _ n h o p s非0,i p _ s r c r o u t e就分配一个m b u f,并把m _ l e n设置成足够大,
以便包含第一跳目的地、选项首部信息 (O P T S I Z)以及逆转后的路由。如果分配失败,则返回
一个空指针,跟没有源路由一样。
p被初始化为指向到达路由的末尾,i p _ s r c r o u t e把最后记录的地址复制到m b u f的前面,
在这里它为外出的第一跳目的地开始逆转后的路由。然后该函数把一份 N O P选项和
源路由信息复制到m b u f中。
8 0 5 - 8 1 8 W h i l e循环把其余的IP 地址从源路由中以相反的顺序复制到 m b u f中。路由的最
后一个地址被设置成到达分组中被 s a v e _ r t e放在i p _ s r c r t . d s t中的源站地址。返回一个
指向m b u f的指针。