论坛风格切换切换到宽版
  • 804阅读
  • 4回复

[问题求助]Linux的协议栈对于要转发的分组,为啥不进行缺省路由的显式判断【好像解决了:)】 [复制链接]

上一主题 下一主题
离线long0.
 
发帖
2156
C币
-198461
威望
384
贡献值
1
银元
0
铜钱
4821
人人网人气币
0
只看楼主 倒序阅读 使用道具 楼主  发表于: 2009-05-01
i.p_route_input_slow和ip_rou.te_output_slow是分别用于对收到的分组和本地产生分组的路由表查询处理的函数,一个我问题我比较困惑,即在ip_route_input_slow中,如果发现一个分组是要被转发的,那么并不对此分组的路由是否在缺省路由中进行显式判断,而是就在fib_l.ookup中进.行隐式处理,即在遍历到fn_zones[0]时,自然就是在进行缺省路由的处理。但是在ip_route_output_.slow中.,对本地产生分组就要明确判断本地产生的分组的目的是否在缺省路由中,如果.是,则需要调用fn_hash_select_default进行明确缺省路由的处理,为啥会这样做呢?电脑

请各位大虾提醒下,谢谢!

[ 本帖最后由 jiu.fe.i19 于 2009-3-29 23:23 编辑 ]    健康

评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
离线laa110.
发帖
2019
C币
-152388
威望
394
贡献值
1
银元
-2
铜钱
4669
人人网人气币
0
只看该作者 沙发  发表于: 2010-04-13
在ip_route_output_slow函数中有如下判断

if (!res.prefixlen && res.type == RTN_UNICAST && !fl.oif)
          fib_select_default(&fl, &res);

这里是对当前fib_lookup的查询结果res的特征进行判断,如果满足上面的条件,表示路由表中缺省路由匹配搜索条件,于是程序调用fib_select_default进行缺省路由的处理。

但是我们知道在ip_route_input_slow函数中我们有类似的如下代码片段:

     if (!IN_DEV_FORWARD(in_dev))
           goto e_hostunreach; // 若当前设备不允许转发则返回错误
     if (res.type != RTN_UNICAST) // 若返回路由类型不是单播
           // 若该路由既不是广播,组播,本地或单播路由,那么必然有
           // 非正常错误发生,于是转到“火星目的”去处理
           goto martian_destination;
        // 如果收到的skb不是本地接收的,需要进行转发,并且该网络
     // 设备接口也确实允许转发,那么由于该目的地址对应路由没有出现
     // 在路由缓存表中,于是通过下面函数创建相关路由缓存条目  
     err = ip_mkroute_input(skb, &res, &fl, in_dev, daddr,  saddr, tos);

显然对于转发分组的情况下,就没有对是否缺省路由进行明确处理了,虽然fib_lookup中实际上仍然会对缺省路由进行处理的,因为fn_zones[0]就是代表缺省路由

请大家帮下忙,拜托!!!

离线dwenhcil.
发帖
2054
C币
-132295
威望
381
贡献值
1
银元
-4
铜钱
4658
人人网人气币
0
只看该作者 板凳  发表于: 2010-04-13
可能的理由就是源代码没有考虑到或者忽视这种情况了,应该
在input中加上 fib_select_default

离线pon1pon.
发帖
2175
C币
-313393
威望
404
贡献值
3
银元
-3
铜钱
4936
人人网人气币
0
只看该作者 地板  发表于: 2010-04-13
经过我近5天的思考,初步认为我可能找到了我这个问题的答案,下面我分析下,如有错误请拍砖
------------------------------------------------
1、根据linux的网络协议栈代码,可以看出是支持多个缺省路由设置的,每个缺省路由对应一个fib_node结构
2、进行转发分组的linux实际上是路由器,因此可以通过路由协议的定时收发来获知到其他网络的下一跳是否还在工作,因此不需要在ip_route_input_slow中再次进行显式对多个缺省路由的逐一检查了
3、对于普通主机,因为不会收到来自作为其下一跳路由器发来的的路由协议告知当前路由状态,因此linux主机无法知道当前缺省路由下一跳是否还处于active状态,于是必须主动进行判断,因此调用fn_hash_select_default,进而调用fib_detect_death来完成的
4、当所有下一跳都还active时,linux实际上是随机选择(根据fib_node在链表中的顺序)某个下一跳进行本地分组的外出发送

上面就是我个人认为的原因,正确可能性99%

离线session1987.
发帖
1990
C币
-61049
威望
329
贡献值
1
银元
-2
铜钱
4261
人人网人气币
0
只看该作者 4楼 发表于: 2010-04-13
不错啊,支持它了..
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个