fib_info结构
struct fib_info {
struct hlist_node fib_hash;
struct hlist_node fib_lhash;
int fib_treeref;
atomic_t fib_clntref;
int fib_dead;
unsigned fib_flags;
int fib_protocol;
__be32 fib_prefsrc;
u32 fib_priority;
u32 fib_metrics[RTAX_MAX];
#define fib_mtu fib_metrics[RTAX_MTU-1]
#define fib_window fib_metrics[RTAX_WINDOW-1]
#define fib_rtt fib_metrics[RTAX_RTT-1]
#define fib_advmss fib_metrics[RTAX_ADVMSS-1]
int fib_nhs;
#ifdef CONFIG_IP_ROUTE_MULTIPATH
int fib_power;
#endif
struct fib_nh fib_nh[0];
#define fib_dev fib_nh[0].nh_dev
};
这个结构表示一个路由信息,一个路由信息可以被多个路由复用
例如:
struct fib_info{
.fib_protocol = RTPROT_KERNEL;// 表示这一条由内核发起的消息
.fib_nhs = 1;//表示fib_nh的数目
.fib_flags = 0;
.fib_prefsrc = 172.16.48.2; //接口上的primary地址
struct fib_nh{
.nh_oif = indexof(eth0);
.nh_flags = 0;
.nh_weight = 1;
.nh_scope = RT_SCOPE_NOWHERE;
.nh_dev = eth0;
}
}
fib_nh结构
struct fib_nh {
struct net_device *nh_dev;
struct hlist_node nh_hash;
struct fib_info *nh_parent;
unsigned nh_flags;
unsigned char nh_scope;
#ifdef CONFIG_IP_ROUTE_MULTIPATH
int nh_weight;
int nh_power;
#endif
#ifdef CONFIG_NET_CLS_ROUTE
__u32 nh_tclassid;
#endif
int nh_oif;
u32 nh_gw;
};
fib_nh结构存放着下一跳路由的地址(nh_gw)。一个路由(fib_alias)可能有多个fib_nh结构,它表示这个路由有多个下一跳地址,即它是多路径(multipath)的。下一跳地址的选择也有多种算法,这些算法都是基于nh_weight, nh_power域的。nh_hash域则是用于将nh_hash链入HASH表的。
u32
struct net_device
以上几种数据结构之间的关系
可以这样理解这些结构之间的关系:
1,fib_table中包含fn_hash结构指针
2,fn_hash中包含fn_zone的数组,按照目的地址长度进行分类,相同长度的地址共用一个fz_zone
3, fn_key相同的两条路由(同一子网),共享一个路由节点(fn_node)
4,根据具体子网内地址的不同,使用不同的fib_alias和fib_info
5,目的地址相同的情况下,也可以使用多条路由,不同的路由存放在不同的fib_nh里面