网络子系统69_路由表辅助程序(二)
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;
}