// 多路由表
// 编译支持多路由表,系统提供255张路由表,由系统使用id为253,254,255的路由表
1.1 enum rt_class_t
{
RT_TABLE_UNSPEC=0,
RT_TABLE_DEFAULT=253,
RT_TABLE_MAIN=254,
RT_TABLE_LOCAL=255,
__RT_TABLE_MAX
};
#define RT_TABLE_MAX (__RT_TABLE_MAX - 1)
struct fib_table *fib_tables[RT_TABLE_MAX+1];
// 默认路由表
// 系统总是默认提供这两个路由表
// ip_fib_local_table保存本地配置的ip地址
// ip_fib_main_table保存所有其他的路由表项
1.2
#define ip_fib_local_table (fib_tables[RT_TABLE_LOCAL])
#define ip_fib_main_table (fib_tables[RT_TABLE_MAIN])
// 路由表初始化
// 调用路径:ip_rt_init->ip_fib_init
// 函数主要任务:
// 1.初始化2张路由表,其中1张本地配置路由表,另1张用于配置管理路由表
// 2.向netdev_chain,inetaddr_chain注册监听块
1.2 void __init ip_fib_init(void)
{
#ifndef CONFIG_IP_MULTIPLE_TABLES
ip_fib_local_table = fib_hash_init(RT_TABLE_LOCAL);
ip_fib_main_table = fib_hash_init(RT_TABLE_MAIN);
#else
fib_rules_init();
#endif
register_netdevice_notifier(&fib_netdev_notifier);
register_inetaddr_notifier(&fib_inetaddr_notifier);
}
// 新建路由表
// 参数:
// id,路由表id
// 注:
// 1.所有路由表共享fib_node, fib_alias缓存
1.3 struct fib_table * __init fib_hash_init(int id)
{
struct fib_table *tb;
//fib_node 缓存
if (fn_hash_kmem == NULL)
fn_hash_kmem = kmem_cache_create("ip_fib_hash",
sizeof(struct fib_node),
0, SLAB_HWCACHE_ALIGN,
NULL, NULL);
//fib_alias 缓存
if (fn_alias_kmem == NULL)
fn_alias_kmem = kmem_cache_create("ip_fib_alias",
sizeof(struct fib_alias),
0, SLAB_HWCACHE_ALIGN,
NULL, NULL);
//路由表
tb = kmalloc(sizeof(struct fib_table) + sizeof(struct fn_hash),
GFP_KERNEL);
if (tb == NULL)
return NULL;
//路由表id
tb->tb_id = id;
//路由表的回调函数
tb->tb_lookup = fn_hash_lookup;
tb->tb_insert = fn_hash_insert;
tb->tb_delete = fn_hash_delete;
tb->tb_flush = fn_hash_flush;
tb->tb_select_default = fn_hash_select_default;
tb->tb_dump = fn_hash_dump;
//tb->tb_data为路由表项hash表
memset(tb->tb_data, 0, sizeof(struct fn_hash));
return tb;
}
// fib_node, fib_alias,fib_info区别:
// 1.
// 1.1 fib_node 表示每个唯一的目的网络
// 1.2 fib_alias 用于区分目的网络相同但其配置参数不同的路由项
// 1.3 fib_info 保存路由信息
// 2.
// 2.1 每个单独的子网对应一个fib_node实例,用fn_key标示,它的值代表该子网
// 2.2 目的子网相同(即fn_key相同)的不同路由共享同一个fib_node,每条路由有自己的fib_alias结构,
// 例如,通向同一子网的不同路由,它们只有tos值不同,因此每个fib_alias实例就被指定一个不通过的tos值。
// 2.3 每个fib_alias都与一个fib_info相关联,该结构保存真实的路由信息。
网络子系统65_路由表初始化
最新推荐文章于 2021-05-04 16:29:37 发布