免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2196 | 回复: 2
打印 上一主题 下一主题

[网络子系统] fib_validate_source的一点疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-26 16:45 |只看该作者 |倒序浏览
内核版本:2.6.32

fib_validate_source这个函数为什么会查询两次路由表呢,个人觉得第二次查询好像没有什么必要啊?

毕竟和第一次查询的区别仅仅在于设置了输出接口而已,求高人指点。


223 /* Given (packet source, input interface) and optional (dst, oif, tos):
224    - (main) check, that source is valid i.e. not broadcast or our local
225      address.
226    - figure out what "logical" interface this packet arrived
227      and calculate "specific destination" address.
228    - check, that packet arrived from expected physical interface.
229  */
230
231 int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
232                         struct net_device *dev, __be32 *spec_dst,
233                         u32 *itag, u32 mark)
234 {
235         struct in_device *in_dev;
236         struct flowi fl = { .nl_u = { .ip4_u =
237                                       { .daddr = src,
238                                         .saddr = dst,
239                                         .tos = tos } },
240                             .mark = mark,
241                             .iif = oif };
242
243         struct fib_result res;
244         int no_addr, rpf;
245         int ret;
246         struct net *net;
247
248         no_addr = rpf = 0;
249         rcu_read_lock();
250         in_dev = __in_dev_get_rcu(dev);
251         if (in_dev) {
252                 no_addr = in_dev->ifa_list == NULL;
253                 rpf = IN_DEV_RPFILTER(in_dev);
254                 if (mark && !IN_DEV_SRC_VMARK(in_dev))
255                         fl.mark = 0;
256         }
257         rcu_read_unlock();
258
259         if (in_dev == NULL)
260                 goto e_inval;
261
262         net = dev_net(dev);
263         if (fib_lookup(net, &fl, &res))
264                 goto last_resort;
265         if (res.type != RTN_UNICAST)
266                 goto e_inval_res;
267         *spec_dst = FIB_RES_PREFSRC(res);
268         fib_combine_itag(itag, &res);
269 #ifdef CONFIG_IP_ROUTE_MULTIPATH
270         if (FIB_RES_DEV(res) == dev || res.fi->fib_nhs > 1)
271 #else
272         if (FIB_RES_DEV(res) == dev)
273 #endif
274         {
275                 ret = FIB_RES_NH(res).nh_scope >= RT_SCOPE_HOST;
276                 fib_res_put(&res);
277                 return ret;
278         }
279         fib_res_put(&res);
280         if (no_addr)
281                 goto last_resort;
282         if (rpf == 1)
283                 goto e_inval;
284         fl.oif = dev->ifindex;
285
286         ret = 0;
287         if (fib_lookup(net, &fl, &res) == 0) {
288                 if (res.type == RTN_UNICAST) {
289                         *spec_dst = FIB_RES_PREFSRC(res);
290                         ret = FIB_RES_NH(res).nh_scope >= RT_SCOPE_HOST;
291                 }
292                 fib_res_put(&res);
293         }

294         return ret;
295
296 last_resort:
297         if (rpf)
298                 goto e_inval;
299         *spec_dst = inet_select_addr(dev, 0, RT_SCOPE_UNIVERSE);
300         *itag = 0;
301         return 0;
302
303 e_inval_res:
304         fib_res_put(&res);
305 e_inval:
306         return -EINVAL;
307 }

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2013-06-26 20:27 |只看该作者
回复 1# zhangsju

详细判断是否是直连的。。。


   

论坛徽章:
0
3 [报告]
发表于 2013-06-26 21:36 |只看该作者
chishanmingshen 发表于 2013-06-26 20:27
回复 1# zhangsju

详细判断是否是直连的。。。

还是不太明白,高人可以详细解释一下吗?

这是我个人的理解:
代码执行到278行,说明是可以查找到路由表的,但是通过的网卡与进入的网卡不一致。此时设置输出接口然后再次查找路由表,应该查找不到路由吧?

也就是说如果第一次查找路由,查找到的路由输出接口不是dev的话。第二次设置输出接口为dev,然后再次查好路由表应该查找不到吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP