fib_node结构
struct fib_node {
struct hlist_node fn_hash;
struct list_head fn_alias;
u32 fn_key;
};
这个结构实际上代表一个路由节点,fn_key是这个路由节点的IP地址或者网络号(对于本地接收路由,它就是代表本地网络设备接口的IP地址,如 172.16.48.2,对于子网单播,它就是子网号,比如172.16.48.0)。对于子网号172.16.48.0,其子网掩码就是 255.255.255.0,该路由项的目的地址长度就是24。而对于本地接收和广播路由,其掩码是255.255.255.255,目的地址长度是 32,同一目的地址长度的路由节点被维护在同一个路由域fn_zone中
struct list_head
//指向fib_alias结构的链表
相同的子网可以共享一个fib_node,fib_alias结构用以标明不同的路由信息,127.10.0.1和127.0.0.1两个A类地址,可以共享一个路由节点(fib_node),但是他们的fib_alias有所不同
一个典型的路由节点示例:
fn_alias{
fa_info{
.fib_protocol = RTPROT_KERNEL;
.fib_nhs = 1;
.fib_flags = 0;
.fib_prefsrc = 172.16.48.2;
struct fib_nh{
.nh_oif = indexof(eth0);
.nh_flags = 0;
.nh_weight = 1;
.nh_scope = RT_SCOPE_HOST;
.nh_dev = eth0;
}
}
.fa_tos = 0;
.fa_type = RTN_UNICAST;
.fa_scope = RT_SCOPE_LINK;
.fa_state = 0;
}
.fn_key = 172.16.48.0;
}
这个路由节点的目的地址长度是24(子网掩码是255.255.255.0),所以它被放到fz_order的值为24的路由域fz_zone中去