linux路由内核实现分析(二)---FIB相关数据结构(4)
2013-07-10 12:21
627 查看
fib_info结构
这个结构表示一个路由信息,一个路由信息可以被多个路由复用
例如:
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指针
以上几种数据结构之间的关系
可以这样理解这些结构之间的关系:
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里面
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 nh_gw;//下以跳的路由地址
struct net_device *nh_dev; //下一跳的DEV指针
以上几种数据结构之间的关系
可以这样理解这些结构之间的关系:
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里面
相关文章推荐
- linux路由内核实现分析(二)---FIB相关数据结构(1)
- linux路由内核实现分析(二)---FIB相关数据结构(2)
- linux路由内核实现分析(二)---FIB相关数据结构
- linux路由内核实现分析(二)---FIB相关数据结构(3)
- linux路由内核实现分析(四)---路由缓存机制(3)
- Linux内核--网络栈实现分析(八)--应用层发送数据(下)
- Linux内核--网络栈实现分析(八)--应用层发送数据(下)
- linux路由内核实现分析(一)----邻居子节点(2)
- linux路由内核实现分析(四)---路由缓存机制(4)
- Linux 路由 学习笔记 之一 相关的数据结构
- linux路由内核实现分析(一)----邻居子节点
- linux路由内核实现分析(三)---路由查找过程
- linux路由内核实现分析(四)---路由缓存机制
- linux路由内核实现分析(三)---路由查找过程
- Linux0.11内核--进程相关数据结构
- linux路由内核实现分析(四)---路由缓存机制(1)
- Linux0.11内核--进程相关数据结构
- Linux2.6内核--VFS层中和进程相关的数据结构
- linux路由内核实现分析(一)----邻居子节点(1)
- linux路由内核实现分析(四)---路由缓存机制(2)