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协议的初始化的更多相关文章

  1. quagga源码学习--BGP协议中的routemap

    路由策略的基础知识 定义 路由策略(Routing Policy)作用于路由,主要实现了路由过滤和路由属性设置等功能,它通过改变路由属性(包括可达性)来改变网络流量所经过的路径. 目的 路由器在发布. ...

  2. quagga源码学习--BGP协议对等体连接建立的状态机

    创建完bgp peer之后,就要bgp start了,不然费那么大劲创建出来不做事情就销毁了,就很尴尬了. 那么对等体一旦start起来,就会进入各自的状态,在不同的状态下处理各自的事件消息. 下面列 ...

  3. quagga源码学习--BGP协议创建对等体

    现有的路由协议都是通过分布式协议逐个配置协商运行的,协议协议,一个就不需要协议咯,至少2个才能够协议着做事情嘛,不过呢,这样就出现网元过多配置困难的问题,对网管软件要求也越来越高, SDN或许可能改变 ...

  4. quagga源码学习--BGP协议路由更新

    BGP的核心就是交换路由,所以关键的部分还是在路由的更新与撤销上面,这之间包含了冗长的属性,community等等处理过程,不做详述. bgp_read函数是路由更新的事件处理函数,在收到BGP_MS ...

  5. quagga源码学习--BGP协议对等体连接tcp md5签名认证选项

    bgp使用tcp连接,每个bgp实例自身是peer的一个tcp server端,同时也是peer的tcp client端. 1.在bgp_create之后都建立自己的socket服务端开始监听179端 ...

  6. ss源码学习--从协议建立到完成一次代理请求

    上一次介绍了ss源码中各个事件处理函数完成的工作,这次具体分析一下协议的建立以及请求数据的传输过程. 因为ss的local和server共用一个类以及一系列的事件处理函数,所以看起来稍显复杂.下面来将 ...

  7. 【js】vue 2.5.1 源码学习 (七) 初始化之 initState 响应式系统基本思路

    大体思路(六) 本节内容: 一.生命周期的钩子函数的实现 ==> callHook(vm , 'beforeCreate') beforeCreate 实例创建之后 事件数据还未创建 二.初始化 ...

  8. Spring源码学习

    Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...

  9. [tomcat7源码学习]初始化之catalina.home和catalina.base(转)

    我们在代码中为了获取某个配置文件路径下的文件经常会这么写 String tomcatPath = System.getProperty("catalina.home") + &qu ...

随机推荐

  1. Select与SelectMany

    SelectMany在MSDN中的解释:将序列的每个元素投影到 IEnumerable(T) 并将结果序列合并为一个序列. 不用去用foreach进行两次遍历,就可以将子循环需要的元素过滤出来... ...

  2. UVA 1642 Magical GCD(gcd的性质,递推)

    分析:对于区间[i,j],枚举j. 固定j以后,剩下的要比较M_gcd(k,j) = gcd(ak,...,aj)*(j-k+1)的大小, i≤k≤j. 此时M_gcd(k,j)可以看成一个二元组(g ...

  3. UVA 12118 Inspector's Dilemma(连通性,欧拉路径,构造)

    只和连通分量以及度数有关.不同连通分量只要连一条边就够了,连通分量为0的时候要特判.一个连通分量只需看度数为奇的点的数量,两个端点(度数为奇)是必要的. 如果多了,奇点数也一定是2的倍数(一条边增加两 ...

  4. jq中append(),appendTo(),after(),before(),prepend(),prependTo()的用法

    1. append():往当前元素的内部的后面追加元素; eg:$("div").append($("span"));  将span放在div内部的后面. 2. ...

  5. React后台管理系统-ajax请求封装

    1.新建文件夹 util , 在util里边新建 mm.jsx文件 2.使用jquery里边的ajax发送请求,回调用promise,返回一个promise对象 request(param){     ...

  6. 卸载Redhat 7自带的yum,安装并使用网易163源

    由于redhat的yum在线更新是收费的,如果没有注册的话不能使用,如果要使用,需将redhat的yum卸载后,安装CentOS yum工具,再配置其他源,以下为详细过程:删除redhat原有的yum ...

  7. 常见react面试题汇总

    已经开源 地址:https://github.com/nanhupatar...关注我们团队: React 中 keys 的作用是什么? Keys 是 React 用于追踪哪些列表中元素被修改.被添加 ...

  8. Python 正则表达式 贪心匹配和非贪心匹配

    Python的正则表达式默认是“贪心匹配”,即在有第二义的情况下,尽可能匹配最长的字符串,在正则表达式的花括号后面跟上问号,可以变为非贪心模式 >>> >>> ha ...

  9. Python知识点入门笔记——Python文件操作、异常处理及random模块使用

    文件是存储在外部介质的数据集合,通常可以长久保存,前提是介质不易损坏 Python的绝对路径写法: E:\\编程学习资料\\爬取某社区高清无码大图.py E:/编程学习资料/爬取某社区高清无码大图.p ...

  10. python2与python3的区别,以及注释、变量、常量与编码发展

    python2与python3的区别 宏观上: python2:源码不统一,混乱,重复代码太多. python3:源码统一标准,能去除重复代码. 编码上: python2:默认编码方式为ASCII码. ...