910
技術社區[雲棲]
網絡子係統65_路由表初始化
// 多路由表 // 編譯支持多路由表,係統提供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相關聯,該結構保存真實的路由信息。
最後更新:2017-04-03 14:53:48