创建一个路由节点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中去。关于路由域和路由表,下回分解。
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中去。关于路由域和路由表,下回分解。
相关文章推荐
- js document.createTextNode()创建文本节点详解
- jquery创建一个新的节点对象(自定义结构/内容)的好方法
- 创建一个简单的device_create_file文件节点
- node 的express 如何接受以一个网站的url作为参数的路由
- oracle rac12c dbca创建集群实例时候,只能识别到一个节点
- 一个经过改良的XMLHelper(包含了序列化,反序列化,创建xml文件,读取节点
- 创建一个procfs文件系统的节点
- 1,windows系统中创建一个node命令行程序、2,node标准工程目录
- 如何在Openstack的控制节点使用命令手动创建一个虚拟机
- 这是一个关于XML文档的操作管理器XMLHelper类,类中包括XML文档的创建,文档节点和属性的读取,添加,修改,删除的方法功能的实现
- node.js学习--创建一个express服务
- 给定一颗二叉树,以及其中的两个node(地址均非空),要求给出这两个node的一个公共父节点,使得这个父节点与两个节点的路径之和最小。
- node.js中创建服务器与路由构建
- JavaScript基础 通过parentNode.bgColor设置一个节点的父节点的背景颜色
- node 通过指令创建一个package.json文件及npm安装package.json
- 利用jQuery的ajax得到的数据动态创建树,然后点击数节点,把对应的节点的节点信息赋值给某一个div,是上一篇的升级版
- node 通过指令创建一个package.json文件
- 浅析H5中的WebSocket对象,创建 一个基于node的TCP网络协议的通讯协议
- javascript中创建文本节点createTextNode
- node 通过指令创建一个package.json文件及npm安装package.json