创建一个路由节点struct fib_node
在为一个网络设备接口的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相关推荐
- 『中级篇』docker-swarm创建一个多节点集群(43)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker-swarm创建一个多节点集群(43) docker Swarm是Docker官方提供的一款集群管理工具 ...
- go : go gin mysql 创建一个简单的后端web服务
吃别人吃不了的苦,忍别人受不了的气,付出比别人更多的,才会享受的比别人更多 !!! 具体代码在: https://gitee.com/hjx_RuGuoYunZhiDao/strom-huang-go ...
- 【DOM编程艺术】动态创建标记(签)---创建和插入节点
window.οnlοad=function(){var para=document.createElement('p');var info= 'nodeName:';info += para.nod ...
- 一个5节点的polardb mysql_POLARDB问题
Q:为什么云数据库POLARDB版优于传统MySQL数据库? {#section_73b_04t_cl7 .section}传统MySQL在购买时,需要指定购买的磁盘大小,通常不超过3TB.如果空间不 ...
- tensorflow1.11.0 tf.constant()函数(创建一个常数张量)
tf.constant tf.constant(value,dtype=None,shape=None,name='Const',verify_shape=False ) Defined in ten ...
- zookeeper 创建临时顺序节点_Zookeeper学习笔记
1.Zookeeper简介 Zookeeper:是一个分布式的.开源的程序协调服务,是 hadoop 项目下的一个子项目. 他提供的主要功能包括:配置管理.名字服务.分布式锁.集群管理 . 2.zno ...
- [ASP.NET MVC2 系列] ASP.NET MVC 之如何创建自定义路由约束
[ASP.NET MVC2 系列] [ASP.NET MVC2 系列] ASP.Net MVC教程之<在15分钟内用ASP.Net MVC创建一个电影数据库应用程序> ...
- 怎样添加、移除、移动、复制、创建和查找节点?
1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 createTextNode() //创建一个文本节点 ...
- 实现 Virtual DOM 下的一个 VNode 节点
实现 Virtual DOM 下的一个 VNode 节点 什么是VNode 我们知道,render function 会被转化成 VNode 节点.Virtual DOM 其实就是一棵以 JavaSc ...
最新文章
- MongoDB 从节点 延迟的测试
- JavaScript, ABAP和Scala里的尾递归(Tail Recursion)
- 数据结构——二叉树的非递归算法
- Hibernate事实:始终检查Criteria API SQL查询
- 计算机基础知识excle,职称计算机基础知识:Excel工作表的复制
- python中的索引从几开始计数_计算机为什么要从 0 开始计数?
- 渐进增强和优雅降级有什么区别
- 图解+笔记-4.2.1 字符串获取操作、字符串合并和重复操作
- ubuntu切换到root
- Atitit 模块打包器(module bundler)的概念与使用 目录 1. 解决问题	1 1.1. 多js合并方便性能加载	1 1.2. 静态模块打包	2 1.3. 动态模块打包	2 2. 最
- 帆软之使用FineTube将其他来源数据同步至简道云表单(多图预警)
- selenium 谷歌驱动 下载网址
- 【音频隐写提取】MP3Stego下载、命令、使用方法
- 本地测试微信授权登录
- 征途服务器 文件夹需手,手游新征途手工架设服务端+配套双客户端+架设流程+服务器部署文档等...
- IT运维工程师要会什么?
- 简单的RTSP播放器
- WWDC22:“花里胡哨”的苹果又会给我们带来什么惊喜呢?
- rap2服务端delos环境搭建
- 2021强烈推荐的十大Win10必备工具(重装系统必备)
热门文章
- 中移4G模块-ML302-OpenCpu开发-串口开发
- django自动转化前端模板中static的css,js引用
- Neo4j配置安装与测试
- pandas忽略行列索引,纵向拼接多个dataframe
- angular下拉框点击无反应_angular 实现 下拉菜单 的 点击其他区域关闭下拉菜单功能?...
- php提供了什么来实现反射,php提供实现反射的方法和实例代码
- vue2.0中ckeckbox(复选框)的使用心得,及对click事件和change的理解
- 以下各节已定义,但尚未为布局页“~/Views/_LayoutHome.cshtml”呈现:“mainContent; jsSrc”。...
- 洛谷 1972 莫队
- Linux内核启动过程和Bootloader(总述)