免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1264 | 回复: 3

[网络子系统] __ip_route_output_key函数中的问题【已解决】 [复制链接]

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

内核版本2.6.23,更高版本例如3.0也相同。

  2334 int __ip_route_output_key(struct rtable **rp, const struct flowi *flp)
  2335 {
  2336     unsigned hash;   
  2337     struct rtable *rth;
  2338                     
  2339     hash = rt_hash(flp->fl4_dst, flp->fl4_src, flp->oif);
  2340                           
  2341     rcu_read_lock_bh();   
  2342     for (rth = rcu_dereference(rt_hash_table[hash].chain); rth;
  2343         rth = rcu_dereference(rth->u.dst.rt_next)) {
  2344         if (rth->fl.fl4_dst == flp->fl4_dst &&
  2345             rth->fl.fl4_src == flp->fl4_src &&
  2346             rth->fl.iif == 0 &&
  2347             rth->fl.oif == flp->oif &&
  2348             rth->fl.mark == flp->mark &&
  2349             !((rth->fl.fl4_tos ^ flp->fl4_tos) &
  2350                 (IPTOS_RT_MASK | RTO_ONLINK))) {
  ...                   ....


上面红色代码处的运算结果到底起何作用,我感到很困惑呢。

这个函数是在路由缓存中查找是否有匹配flp对应的缓存条目,其中rth->fl.fl4_tos和flp->fl4_tos进行异或,如果异或结果为0,表示匹配成功,则无论IPTOS_RT_MASK | RTO_ONLINK的结果是什么,都不影响最终结果,即都找到了匹配项,但是若异或的结果非0,则有很多种非0情况,而IPTOS_RT_MASK | RTO_ONLINK的值为00011101,那么00011101和异或的结果相与的运算是想表达什么意思?


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

补充下

IPTOS_RT_MASK ==> IPTOS_TOS_MASK & ~3  ==> 0x1E & ~3  ==> 00011110 & 11111100 ==> 00011100
RTO_ONLINK =====> 0x1

IPTOS_RT_MASK | RTO_ONLINK ==> 00011100 | 00000001 ==> 00011101

而tos共有下面5种可能取值:
000 1000 0
000 0100 0
000 0010 0
000 0001 0
000 0000 0

于是rth->fl.fl4_tos异或flp->fl4_tos的结果是非0的情况可以一一列出,将此异或结果和00011101相与到底是啥意思?上面的~3是为什么?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2016-11-14 18:17 |显示全部楼层
xor不为0就是不相等,任何bit有差异就是不等,后面的&把这个条件放宽松,仅限定某些bit不相等才认为两个tos不相等。换句话说就是允许某些tos的bit不相等。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
发表于 2016-11-16 13:37 |显示全部楼层
nswcfd 发表于 2016-11-14 18:17
xor不为0就是不相等,任何bit有差异就是不等,后面的&把这个条件放宽松,仅限定某些bit不相等才认为两个tos ...

恩,又仔细分析了下代码,的确如nswcfd所说。

根据IP协议规定,IP首部中TOS字段为8bit,其中最低比特位未使用,而Linux将此位置1用于表示本地LINK类型的路由(RTO_ONLINK),即不需要下一跳的路由,换句话讲,即便0000000100000011代表两个完全不同的TOS,然而由于其最低位均为1,所以Linux仍然将这两个不同TOS对应的路由当作匹配路由

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP