声明:本文为原创
#####请转贴时保留以下内容######
作者:GTT
请提出宝贵意见Mail:mtloveft@hotmail.com
Linux Version:2.6.33
提示:本文是介绍linux 如何实现ipv4路由!
fib_info结构的组织
fib_info结构定义了fib_hash与fib_lhash两个字段,用于将fib_info结构链接到两个hash表中,这两个hash表是:
fib_info_hash 所有的fib_info结构被插入到这个hash表中,通过fib_find_info接口来查找该表。
fib_info_laddrhash 主要在路由表项有一个首选源地址时,才将fib_info结构插入到这个表中。
这个hash表主要是便于删除由于本地配置IP地址的删除而影响到的路由表项。
在这两个hash表中,都是通过fib_create_info方法将新fib_info实例链接到hash表上
fib_info结构定义如下
struct fib_info { struct hlist_node fib_hash; struct hlist_node fib_lhash; struct net *fib_net; 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 }
|
next-hop结构的组织
next-hop的定义如下
struct fib_nh { struct net_device *nh_dev; //网络设备
struct hlist_node nh_hash; //用于链入网络设备hash表
struct fib_info *nh_parent;//指向被包含的fib_info
unsigned nh_flags; //标志
unsigned char nh_scope; //下一跳的路由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; //egress设备标识
__be32 nh_gw; //下一跳网关的IP地址
};
|
根据fib_info定义,每个fib_info结构可以包含一个或多个fib_nh结构,
fib_nhs是一个fib_nh类型的数组。在创建fib_info实例时,会多分配出nhs*sizeof(struct fib_nh)
大小的内存。
每个fib_nh表示一个下一跳路由器(next-hop router)。
一个下一跳路由器的信息包括通过哪一个设备作为出接口。因而,
当找到这个下一跳router时就很容易得到出接口设备,
阅读(2465) | 评论(1) | 转发(3) |