忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 559 | 回复: 9

[网络子系统] fib_create_info函数中的一个疑问【已解决】 [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
发表于 2016-12-01 21:22 |显示全部楼层
本帖最后由 jiufei19 于 2016-12-23 22:59 编辑

内核版本V2.6.23~3.19.8均有如下代码片段

   681 struct fib_info *fib_create_info(struct fib_config *cfg)
   682 {

   ...        ...
  813     if (fi->fib_prefsrc) {
   814         if (cfg->fc_type != RTN_LOCAL || !cfg->fc_dst ||
   815             fi->fib_prefsrc != cfg->fc_dst)
   816             if (inet_addr_type(fi->fib_prefsrc) != RTN_LOCAL)
   817                 goto err_inval;
   818     }
   ...       ...


  这段红色代码是添加路由fib_info对象时进行的判断,我一直不太清楚上面红色代码对应什么样的路由添加场景,例如我能想到的场景只有两个,一是ip addr 命令添加本地IP时,二是ip route命令直接添加路由时,但是这两个场景似乎都不能全部解释红色部分的判断条件。
希望能有人解惑,谢谢!

论坛徽章:
18
程序设计版块每日发帖之星
日期:2015-08-17 06:20:0015-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:56黑曼巴
日期:2016-12-26 16:00:32每日论坛发贴之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:51程序设计版块每日发帖之星
日期:2016-06-03 06:20:00程序设计版块每日发帖之星
日期:2016-06-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-30 06:20:00
发表于 2016-12-02 12:12 |显示全部楼层
不知道这个场景是否满足:
有两个port(port0, port1),从port0上收到的报文(目的是port0的IP,比如ping),以port1的IP(而不是port0的IP)构造应答并从port0上发出去。

论坛徽章:
18
程序设计版块每日发帖之星
日期:2015-08-17 06:20:0015-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:56黑曼巴
日期:2016-12-26 16:00:32每日论坛发贴之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:51程序设计版块每日发帖之星
日期:2016-06-03 06:20:00程序设计版块每日发帖之星
日期:2016-06-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-30 06:20:00
发表于 2016-12-02 16:27 |显示全部楼层
或者反过来理解,只有在local路由并且dst非空并且dst等于src的时候,才不会去检查src的配置,否则src必须得是local ip。

比如可以配置这样奇葩的路由
ip route add local 127.0.0.30 dev ethX src 127.0.0.40

配置src的一个典型场景是,在某个接口上配置一堆IP,通常用来模拟多个服务器,
然后利用多条带src的ip路由,精确控制到每个不同ip的源ip,使得每个client看到不同的server地址。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
发表于 2016-12-02 18:47 |显示全部楼层
nswcfd 发表于 2016-12-02 16:27
或者反过来理解,只有在local路由并且dst非空并且dst等于src的时候,才不会去检查src的配置,否则src必须得 ...

感谢nswcfd。

对了,我之前忘了问一个问题,cfg->fc_dst为0,表示目标地址为0,这是什么意思?,什么样的路由其目标地址是0? 缺省路由应该不是这个意思吧?

论坛徽章:
18
程序设计版块每日发帖之星
日期:2015-08-17 06:20:0015-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:56黑曼巴
日期:2016-12-26 16:00:32每日论坛发贴之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:51程序设计版块每日发帖之星
日期:2016-06-03 06:20:00程序设计版块每日发帖之星
日期:2016-06-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-30 06:20:00
发表于 2016-12-12 16:50 |显示全部楼层
应该是默认路由吧。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
发表于 2016-12-15 22:58 |显示全部楼层
nswcfd 发表于 2016-12-12 16:50
应该是默认路由吧。

cfg->fc_dst为0,好像并不是代表缺省路由,而是代表本主机,类似在ip_route_output_flow()函数中的oldflp->fl4_dst为0一样,我写了一个测试代码,在udp客户端套接字发送数据时,将目标地址设为0.0.0.0,结果我发现凡是在127.0.0.1上正在等待接收的udp server可以收到此报文。

论坛徽章:
18
程序设计版块每日发帖之星
日期:2015-08-17 06:20:0015-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:56黑曼巴
日期:2016-12-26 16:00:32每日论坛发贴之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:51程序设计版块每日发帖之星
日期:2016-06-03 06:20:00程序设计版块每日发帖之星
日期:2016-06-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-30 06:20:00
发表于 2016-12-19 16:04 |显示全部楼层
https://en.wikipedia.org/wiki/0.0.0.0

In the context of servers, 0.0.0.0 means "all IPv4 addresses on the local machine". If a host has two IP addresses, 192.168.1.1 and 10.1.2.1, and a server running on the host listens on 0.0.0.0, it will be reachable at both of those IPs.

In the context of routing, 0.0.0.0 usually means the default route, i.e. the route which leads to "the rest of" the internet instead of somewhere on the local network.

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
发表于 2016-12-19 22:40 |显示全部楼层
回复 7# nswcfd

是的,0.0.0.0有两个层面的含义,取决于上下文是指路由还是地址含义

论坛徽章:
18
程序设计版块每日发帖之星
日期:2015-08-17 06:20:0015-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:56黑曼巴
日期:2016-12-26 16:00:32每日论坛发贴之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:51程序设计版块每日发帖之星
日期:2016-06-03 06:20:00程序设计版块每日发帖之星
日期:2016-06-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-30 06:20:00
发表于 2016-12-20 19:39 |显示全部楼层
使用kprobe/jprobe也可以验证,route add default的时候,rta->rta_dst是0.0.0.0,但不知道跟cfg->fc_dst是不是一个东西(版本有差异?)。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
发表于 2016-12-23 22:58 |显示全部楼层
回复 9# nswcfd

在配置路由命令时,如果配置的路由是缺省路由,则cfg->fc_dst的确应该就是0.0.0.0这个值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP