Chinaunix

标题: fib_create_info函数中的一个疑问【已解决】 [打印本页]

作者: jiufei19    时间: 2016-12-01 21:22
标题: fib_create_info函数中的一个疑问【已解决】
本帖最后由 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命令直接添加路由时,但是这两个场景似乎都不能全部解释红色部分的判断条件。
希望能有人解惑,谢谢!


作者: nswcfd    时间: 2016-12-02 12:12
不知道这个场景是否满足:
有两个port(port0, port1),从port0上收到的报文(目的是port0的IP,比如ping),以port1的IP(而不是port0的IP)构造应答并从port0上发出去。
作者: nswcfd    时间: 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地址。
作者: jiufei19    时间: 2016-12-02 18:47
nswcfd 发表于 2016-12-02 16:27
或者反过来理解,只有在local路由并且dst非空并且dst等于src的时候,才不会去检查src的配置,否则src必须得 ...

感谢nswcfd。

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

作者: nswcfd    时间: 2016-12-12 16:50
应该是默认路由吧。
作者: jiufei19    时间: 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可以收到此报文。

作者: nswcfd    时间: 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.

作者: jiufei19    时间: 2016-12-19 22:40
回复 7# nswcfd

是的,0.0.0.0有两个层面的含义,取决于上下文是指路由还是地址含义
作者: nswcfd    时间: 2016-12-20 19:39
使用kprobe/jprobe也可以验证,route add default的时候,rta->rta_dst是0.0.0.0,但不知道跟cfg->fc_dst是不是一个东西(版本有差异?)。
作者: jiufei19    时间: 2016-12-23 22:58
回复 9# nswcfd

在配置路由命令时,如果配置的路由是缺省路由,则cfg->fc_dst的确应该就是0.0.0.0这个值。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2