您的位置:首页 > Web前端 > Node.js

创建一个路由节点struct fib_node

2013-06-30 11:30 288 查看
在为一个网络设备接口的IP地址创建四个路由项(本地接收,子网广播,子网单播,本地接收的广播)的时候,需要为每个路由项创建一个路由节点,struct fib_node结构体表示一个路由节点,下面是其定义:

struct fib_node{

struct hlist_node fn_hash;

struct list_head fn_alias;

u32 fn_key;

};

一个路由节点总是维护在一个路由域struct fn_zone中,fn_hash成员就是用于把这个路由节点放到struct fn_zone结构体中的,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,同一目的地址长度的路由节点被维护在同一个路由域struct fn_zone中。

全局变量fn_hash_kmem是一个后备高速缓冲区,所有的路由节点都在这块区域分配。

fn_alias是一个list,其节点是一个结构体struct fib_alias,其定义如下:

struct fib_alias{

struct list_head fa_list;

struct rcu_head rcu;

struct fib_info *fa_info;

u8 fa_tos;

u8 fa_type;

u8 fa_scope;

u8 fa_state;

};

它实际存放路由节点的关键信息,它之所以以一个list的形式存放在struct fib_node中,是因为,比如,127.10.0.1和127.0.0.1两个A类IP地址,它们创建的广播路由的fn_key都是 127.255.255.255,所以共享一个路由节点,但是它们有各自的struct fib_alias。其成员fa_info指向相应的路由信息节点。

下面可以看一个比较典型的路由节点,比如本地网络设备接口eth0的子网单播路由的路由节点,其内容如下: strcut fib_node{

.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中去。关于路由域和路由表,下回分解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐