quagga源码学习--BGP协议的初始化
quagga支持BGP-4,BGP-4+协议,支持多协议(mpls,isis,ospf等等)以及单播,组播路由的导入和分发。
具体的协议,这里就不附录了,网络上有很多资料,或者RFC。
协议源码的学习基于前几章的quagga源码分析,所以刚接触的朋友最好浏览一下quagga的通用框架以及通用路由处理流程。
好了,闲话少说,直奔主题才是最要紧的。
一、BGP初始化
初始化在bgp_main.c的main函数里开始,其他协议也类似,比如isis的main函数就在isis_main.c,这个嘛,简单统一,通俗易懂。
main里最重要的初始化都在 void bgp_init(void) 这个函数里。
这里初始化了如下主要元素:
1、事件驱动的消息
2、bgp属性的初始化:as_path,attr,community等的哈希表及其哈希函数
3、vty command
4、路由表的初始化
二、BGP路由表
1、数据结构:
struct bgp_table {
bgp_table_t type;
/* afi/safi of this table */
afi_t afi;
safi_t safi;
int lock;
/* The owner of this 'bgp_table' structure. */
struct peer *owner;
struct route_table *route_table;
};
bgp_table里字段定义:
type 表的类型 (BGP_TABLE_MAIN, BGP_TABLE_RSCLIENT)
afi 网络类型(IPV4, IPV6)
safi 子网络类型(SAFI_UNICAST,SAFI_MULTICAST,SAFI_RESERVED_3,SAFI_MPLS_VPN,SAFI_ENCAP)
lock 引用计数
owner 对等体的详细描述
route_table 路由表项的集合,与之前zebra使用的是同一个数据结构
三、定时任务
bgp_scan_init函数定义2个定时任务:
void bgp_scan_init(void) {
zlookup = zclient_new(bm->master);
zlookup->sock = -;
zlookup->t_connect = thread_add_event(bm->master, zlookup_connect, zlookup, );
bgp_scan_interval = BGP_SCAN_INTERVAL_DEFAULT;
bgp_import_interval = BGP_IMPORT_INTERVAL_DEFAULT;
cache1_table[AFI_IP] = bgp_table_init(AFI_IP, SAFI_UNICAST);
cache2_table[AFI_IP] = bgp_table_init(AFI_IP, SAFI_UNICAST);
bgp_nexthop_cache_table[AFI_IP] = cache1_table[AFI_IP];
bgp_connected_table[AFI_IP] = bgp_table_init(AFI_IP, SAFI_UNICAST);
cache1_table[AFI_IP6] = bgp_table_init(AFI_IP6, SAFI_UNICAST);
cache2_table[AFI_IP6] = bgp_table_init(AFI_IP6, SAFI_UNICAST);
bgp_nexthop_cache_table[AFI_IP6] = cache1_table[AFI_IP6];
bgp_connected_table[AFI_IP6] = bgp_table_init(AFI_IP6, SAFI_UNICAST);
/* Make BGP scan thread. */
bgp_scan_thread = thread_add_timer(bm->master, bgp_scan_timer,
NULL, bgp_scan_interval);
/* Make BGP import there. */
bgp_import_thread = thread_add_timer(bm->master, bgp_import, NULL, );
}
bgp_scan_interval是可以通过命令配置修改的。
DEFUN(bgp_scan_time,
bgp_scan_time_cmd,
"bgp scan-time <5-60>",
"BGP specific commands\n"
"Configure background scanner interval\n"
"Scanner interval (seconds)\n") {
bgp_scan_interval = atoi(argv[]); if (bgp_scan_thread) {
thread_cancel(bgp_scan_thread);
bgp_scan_thread =
thread_add_timer(bm->master, bgp_scan_timer, NULL, bgp_scan_interval);
} return CMD_SUCCESS;
}
默认的扫描间隔是60s,import间隔是15s,在thread_add_timer函数添加定时器任务的时候取当前的时间加上间隔时间,定时循环执行。
#define BGP_SCAN_INTERVAL_DEFAULT 60
#define BGP_IMPORT_INTERVAL_DEFAULT 15
quagga会定时的扫描路由表,检查其中的路由表现的下一跳是否可达。bgp_scan函数来完成这个操作,通过向zserv查询路由信息,来检查合法性,从而更新路由或者收敛路由。
当然,在跟对等体交互时也会更新路由,这个主要bgp_update函数完成。
quagga源码学习--BGP协议的初始化的更多相关文章
- quagga源码学习--BGP协议中的routemap
路由策略的基础知识 定义 路由策略(Routing Policy)作用于路由,主要实现了路由过滤和路由属性设置等功能,它通过改变路由属性(包括可达性)来改变网络流量所经过的路径. 目的 路由器在发布. ...
- quagga源码学习--BGP协议对等体连接建立的状态机
创建完bgp peer之后,就要bgp start了,不然费那么大劲创建出来不做事情就销毁了,就很尴尬了. 那么对等体一旦start起来,就会进入各自的状态,在不同的状态下处理各自的事件消息. 下面列 ...
- quagga源码学习--BGP协议创建对等体
现有的路由协议都是通过分布式协议逐个配置协商运行的,协议协议,一个就不需要协议咯,至少2个才能够协议着做事情嘛,不过呢,这样就出现网元过多配置困难的问题,对网管软件要求也越来越高, SDN或许可能改变 ...
- quagga源码学习--BGP协议路由更新
BGP的核心就是交换路由,所以关键的部分还是在路由的更新与撤销上面,这之间包含了冗长的属性,community等等处理过程,不做详述. bgp_read函数是路由更新的事件处理函数,在收到BGP_MS ...
- quagga源码学习--BGP协议对等体连接tcp md5签名认证选项
bgp使用tcp连接,每个bgp实例自身是peer的一个tcp server端,同时也是peer的tcp client端. 1.在bgp_create之后都建立自己的socket服务端开始监听179端 ...
- ss源码学习--从协议建立到完成一次代理请求
上一次介绍了ss源码中各个事件处理函数完成的工作,这次具体分析一下协议的建立以及请求数据的传输过程. 因为ss的local和server共用一个类以及一系列的事件处理函数,所以看起来稍显复杂.下面来将 ...
- 【js】vue 2.5.1 源码学习 (七) 初始化之 initState 响应式系统基本思路
大体思路(六) 本节内容: 一.生命周期的钩子函数的实现 ==> callHook(vm , 'beforeCreate') beforeCreate 实例创建之后 事件数据还未创建 二.初始化 ...
- Spring源码学习
Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...
- [tomcat7源码学习]初始化之catalina.home和catalina.base(转)
我们在代码中为了获取某个配置文件路径下的文件经常会这么写 String tomcatPath = System.getProperty("catalina.home") + &qu ...
随机推荐
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- POJ-1149 PIGS---最大流+建图
题目链接: https://vjudge.net/problem/POJ-1149 题目大意: M个猪圈,N个顾客,每个顾客有一些的猪圈的钥匙,只能购买这些有钥匙的猪圈里的猪,而且要买一定数量的猪,每 ...
- 【HHHOJ】NOIP2018 模拟赛(二十五) 解题报告
点此进入比赛 得分: \(100+100+20=220\)(\(T1\)打了两个小时,以至于\(T3\)没时间打了,无奈交暴力) 排名: \(Rank\ 8\) \(Rating\):\(+19\) ...
- slice 与 substring
Array数组:slice() slice() : 截取 Array 的部分元素,然后返回一个新的Array. var arr = ['a', ' b', 'c', 'd', 'e', 'f', 'g ...
- python_41_with语句
#为了避免打开文件后忘记关闭,可以通过管理上下文,即:with open('log','r') as f: # 如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源. with open ...
- CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第四节
了解和使用共享内存(1) Rob Farber 是西北太平洋国家实验室(Pacific Northwest National Laboratory)的高级科研人员.他在多个国家级的实验室进行大型并行运 ...
- css代码
#footr { background: #3e434a } #header #blogTitle { background: url("http://images.cnblogs.com/ ...
- String&StringBuffer&StringBuilder区别
String String类是final类故不可以继承,也就意味着String引用的字符串内容是不能被修改.String有两种实例化方式: (1)直接赋值(例中,String str = &q ...
- oracle 事务 锁机制
原文地址:http://www.cnblogs.com/quanweiru/archive/2013/05/24/3097367.html 本课内容属于Oracle高级课程范畴,内容略微偏向理论性,但 ...
- Groundhog Build Home - HDU - 3932(模拟退火)
题意 给定一个矩形内的\(n\)个点,在矩形中找一个点,离其他点的最大距离最小. 题解 模拟退火. 这个题需要\(x\)和\(y\)坐标随机动的时候多随机几次.否则就WA了.另外由于随机多次,如果温度 ...