在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]就是代表缺省路由
请大家帮下忙,拜托!!!