Chinaunix首页 | 论坛 | 博客
  • 博客访问: 825575
  • 博文数量: 264
  • 博客积分: 592
  • 博客等级: 中士
  • 技术积分: 1574
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-24 22:02
文章分类

全部博文(264)

文章存档

2019年(2)

2018年(1)

2017年(1)

2016年(4)

2015年(14)

2014年(57)

2013年(88)

2012年(97)

分类: LINUX

2014-02-12 16:00:53

转:http://blog.csdn.net/nerdx/article/details/12842811
  1. //  多路由表  
  2. //      编译支持多路由表,系统提供255张路由表,由系统使用id为253,254,255的路由表      
  3. 1.1 enum rt_class_t  
  4. {  
  5.     RT_TABLE_UNSPEC=0,  
  6.     RT_TABLE_DEFAULT=253,  
  7.     RT_TABLE_MAIN=254,  
  8.     RT_TABLE_LOCAL=255,  
  9.     __RT_TABLE_MAX  
  10. };  
  11. #define RT_TABLE_MAX (__RT_TABLE_MAX - 1)  
  12. struct fib_table *fib_tables[RT_TABLE_MAX+1];  
  13.   
  14. // 默认路由表  
  15. //  系统总是默认提供这两个路由表  
  16. //      ip_fib_local_table保存本地配置的ip地址  
  17. //      ip_fib_main_table保存所有其他的路由表项  
  18. 1.2   
  19. #define ip_fib_local_table (fib_tables[RT_TABLE_LOCAL])  
  20. #define ip_fib_main_table (fib_tables[RT_TABLE_MAIN])  
  21.   
  22.   
  23.   
  24.   
  25. //  路由表初始化  
  26. //  调用路径:ip_rt_init->ip_fib_init  
  27. //  函数主要任务:  
  28. //      1.初始化2张路由表,其中1张本地配置路由表,另1张用于配置管理路由表  
  29. //      2.向netdev_chain,inetaddr_chain注册监听块  
  30. 1.2 void __init ip_fib_init(void)  
  31. {  
  32. #ifndef CONFIG_IP_MULTIPLE_TABLES  
  33.     ip_fib_local_table = fib_hash_init(RT_TABLE_LOCAL);  
  34.     ip_fib_main_table  = fib_hash_init(RT_TABLE_MAIN);  
  35. #else  
  36.     fib_rules_init();  
  37. #endif  
  38.     register_netdevice_notifier(&fib_netdev_notifier);  
  39.     register_inetaddr_notifier(&fib_inetaddr_notifier);  
  40. }  
  41.   
  42. //  新建路由表  
  43. //  参数:  
  44. //      id,路由表id  
  45.   
  46. //  注:  
  47. //      1.所有路由表共享fib_node, fib_alias缓存  
  48. 1.3 struct fib_table * __init fib_hash_init(int id)  
  49. {  
  50.     struct fib_table *tb;  
  51.     //fib_node 缓存  
  52.     if (fn_hash_kmem == NULL)  
  53.         fn_hash_kmem = kmem_cache_create("ip_fib_hash",  
  54.                          sizeof(struct fib_node),  
  55.                          0, SLAB_HWCACHE_ALIGN,  
  56.                          NULL, NULL);  
  57.     //fib_alias 缓存  
  58.     if (fn_alias_kmem == NULL)  
  59.         fn_alias_kmem = kmem_cache_create("ip_fib_alias",  
  60.                           sizeof(struct fib_alias),  
  61.                           0, SLAB_HWCACHE_ALIGN,  
  62.                           NULL, NULL);  
  63.     //路由表  
  64.     tb = kmalloc(sizeof(struct fib_table) + sizeof(struct fn_hash),  
  65.              GFP_KERNEL);  
  66.     if (tb == NULL)  
  67.         return NULL;  
  68.     //路由表id  
  69.     tb->tb_id = id;  
  70.     //路由表的回调函数  
  71.     tb->tb_lookup = fn_hash_lookup;  
  72.     tb->tb_insert = fn_hash_insert;  
  73.     tb->tb_delete = fn_hash_delete;  
  74.     tb->tb_flush = fn_hash_flush;  
  75.     tb->tb_select_default = fn_hash_select_default;  
  76.     tb->tb_dump = fn_hash_dump;  
  77.     //tb->tb_data为路由表项hash表  
  78.     memset(tb->tb_data, 0, sizeof(struct fn_hash));  
  79.     return tb;  
  80. }  
  81.   
  82.   
  83. //  fib_node, fib_alias,fib_info区别:  
  84. //      1.  
  85. //          1.1 fib_node 表示每个唯一的目的网络  
  86. //          1.2 fib_alias 用于区分目的网络相同但其配置参数不同的路由项  
  87. //          1.3 fib_info 保存路由信息  
  88.   
  89. //      2.  
  90. //          2.1 每个单独的子网对应一个fib_node实例,用fn_key标示,它的值代表该子网  
  91. //          2.2 目的子网相同(即fn_key相同)的不同路由共享同一个fib_node,每条路由有自己的fib_alias结构,  
  92. //              例如,通向同一子网的不同路由,它们只有tos值不同,因此每个fib_alias实例就被指定一个不通过的tos值。  
  93. //          2.3 每个fib_alias都与一个fib_info相关联,该结构保存真实的路由信息。      
阅读(753) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~