要想看懂路由,最好先能理清各个结构体之间的关联,这样才能有一个整体的印象。
1 内核fib路由表
1.1 基本结构1.1.1 fib_table_hash结构图
1.1.2 举例说明fn_zone结构体的关系
说明:
结构体Fn_zone[33]中存放同一掩码长度表项的集合;
结构体fib_node存放同一网段的路由表项集合;
结构体fib_alias存放具体的一条路由表项;
结构体fib_info存放下一跳网关等信息。
1.1.3 结构体描述
相关数据结构:fib_table、fn_hash、fn_zone、fib_node、fib_alias、fib_info、fib_nh
全局散列表net->ipv4.fib_table_hash中,存放所有的路由表fib_node;
全局散列表fib_info_hash,存放所有的fib_info实例;
全局散列表fib_info_laddrhash,当路由表项有源地址时,才存放该fib_info
(1)路由表fib_table结构
路由表是由fib_table结构来描述的,该结构是通过函数fib_hash_table()来赋值的,fib_table结构中的tb_data,是一个零长数组,该地址指向fn_hash结构体;
struct fib_table
struct hlist_node tb_hlist; |
//用来将各个路由表连接成一个双向链表 |
u32 tb_id; |
/路由标识,最多可以有256个路由表(静态路由、策略路由等等表项) |
int tb_default; |
|
int (*tb_lookup)(struct fib_table*tb,conststruct flowi*flp,struct fib_result*res); |
//搜索路由表项 |
int (*tb_insert)(struct fib_table*,struct fib_config*); |
//插入给定的路由表项 |
int (*tb_delete |