本帖最后由 jiufei19 于 2016-12-27 22:41 编辑
回复 1# jiufei19
昨天仔细思考了下,这个问题看来只能有一个理由可以解释,即对于缺省路由,是没有tos设置的,如果我的这个猜测正确的话,则可以解释fn_hash_select_default函数不对tos进行判断,而直接就是对fib_priority进行检查的原因了。
假设第301的遍历操作找到一个fib_alias,并且next_fi->fib_priority小于res->fi->fib_priority,则此时第316行的if条件必然不成立,如下红色代码所示:
301 list_for_each_entry(fa, &f->fn_alias, fa_list) {
302 struct fib_info *next_fi = fa->fa_info;
... ...
307
308 if (next_fi->fib_priority > res->fi->fib_priority)
309 break;
... ...
315 if (fi == NULL) {
316 if (next_fi != res->fi)
317 break;
318 } else if (!fib_detect_death(fi, order, &last_resort,
319 &last_idx, &fn_hash_last_dflt)) {
320 if (res->fi)
321 fib_info_put(res->fi);
322 res->fi = fi;
323 atomic_inc(&fi->fib_clntref);
324 fn_hash_last_dflt = order;
325 goto out;
326 }
327 fi = next_fi;
328 order++;
329 }// end of list_for_each_entry
这里next_fi不等于res->fi的原因是在fib_lookup后,系统又添加了一条缺省路由,且其优先级别高于之前fib_lookup所查询到的res所对应的旧的缺省路由,但是为啥明明找到了一条新的更高优先级的缺省路由(fib_priority值更小)后,就立刻break,不再继续查找余下的fib_alias了,相反,当next_fi等于res->fi时,表明自从上次fib_lookup查询到某个缺省路由后,此时尚无新的更高优先级的缺省路由被加入,因此第327行将next_fi保存在fi中,随后返回到第301行继续遍历下一个fib_alias,这到底是什么逻辑?
这个fn_hash_select_default函数的逻辑实在让人摸不清头脑呢,还望各位大侠能解惑!
|