linux路由内核实现分析 四,linux路由内核实现分析(二)---FIB相关数据结构(4)
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;// 表示這一條由內(nèi)核發(fā)起的消息
.fib_nhs?= 1;//表示fib_nh的數(shù)目
.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?nh_gw;//下以跳的路由地址
struct
net_device?*nh_dev; //下一跳的DEV指針
以上幾種數(shù)據(jù)結構之間的關系
可以這樣理解這些結構之間的關系:
1,fib_table中包含fn_hash結構指針
2,fn_hash中包含fn_zone的數(shù)組,按照目的地址長度進行分類,相同長度的地址共用一個fz_zone
3, fn_key相同的兩條路由(同一子網(wǎng)),共享一個路由節(jié)點(fn_node)
4,根據(jù)具體子網(wǎng)內(nèi)地址的不同,使用不同的fib_alias和fib_info
5,目的地址相同的情況下,也可以使用多條路由,不同的路由存放在不同的fib_nh里面
總結
以上是生活随笔為你收集整理的linux路由内核实现分析 四,linux路由内核实现分析(二)---FIB相关数据结构(4)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 伤感的微信网名女生
- 下一篇: linux 查询wwid命令,linux