閱讀910 返回首頁    go 技術社區[雲棲]


網絡子係統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

  上一篇:go Android交互體驗必知:功能按鍵事件
  下一篇:go 發送郵件程序報錯454 Authentication failed以及POP3和SMTP簡介