网络子系统69_路由表辅助程序(二)

2014-11-24 00:12:08 · 作者: · 浏览: 11
for (id = RT_TABLE_MAX; id>0; id--) { if ((tb = fib_get_table(id))==NULL) continue; //特定于路由表的刷新操作 flushed += tb->tb_flush(tb); } #else /* CONFIG_IP_MULTIPLE_TABLES */ flushed += ip_fib_main_table->tb_flush(ip_fib_main_table); flushed += ip_fib_local_table->tb_flush(ip_fib_local_table); #endif /* CONFIG_IP_MULTIPLE_TABLES */ //删除的路由个数>0,刷新路由缓存 if (flushed) rt_cache_flush(-1); } // 设备开启,激活使用该设备的下一跳 // 在路由的某些下一跳为alive时,更新fib_info结构内该路由的一些参数。 // 返回值:RTNH_F_DEAD标识被清除的fib_info结构的个数 // 函数主要任务: // 1.1 遍历与设备相关的下一跳信息 // 1.2 清除下一跳的RTNH_F_DEAD标志 // 1.3 清除该下一跳相关的路由信息的RTNH_F_DEAD标志 // 1.4 返回清除RTNH_F_DEAD标志的fib_info个数 // 注:只有内核支持多路径路由时才使用该函数 4.1 int fib_sync_up(struct net_device *dev) { struct fib_info *prev_fi; unsigned int hash; struct hlist_head *head; struct hlist_node *node; struct fib_nh *nh; int ret; //设备需要开启状态 if (!(dev->flags&IFF_UP)) return 0; prev_fi = NULL; hash = fib_devindex_hashfn(dev->
ifindex); head = &fib_info_devhash[hash]; ret = 0; //与设备相关的所有下一跳 hlist_for_each_entry(nh, node, head, nh_hash) { struct fib_info *fi = nh->nh_parent; int alive; if (nh->nh_dev != dev || fi == prev_fi) continue; prev_fi = fi; alive = 0; //遍历路由信息的下一跳,统计有效下一跳的个数 change_nexthops(fi) { if (!(nh->nh_flags&RTNH_F_DEAD)) { alive++; continue; } if (nh->nh_dev == NULL || !(nh->nh_dev->flags&IFF_UP)) continue; if (nh->nh_dev != dev || __in_dev_get(dev) == NULL) continue; alive++; //设备开启,清除之前由于设备关闭而设置的RTNH_F_DEAD标志 spin_lock_bh(&fib_multipath_lock); nh->nh_power = 0; nh->nh_flags &= ~RTNH_F_DEAD; spin_unlock_bh(&fib_multipath_lock); } endfor_nexthops(fi) //只要路由信息有一个有效的下一跳,则该路由信息有效 if (alive > 0) { fi->fib_flags &= ~RTNH_F_DEAD; ret++; } } return ret; }