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. pta 编程题6 树的同构

    其它pta数据结构编程题请参见:pta 题目请参见:树的同构 因题目中左右子树是按照下标给出,因此用数组存放树是更好的方法. 判断两棵树是否同构:用递归的方法.如果当前两个结点都为空,则返回TRUE: ...

  2. linux 命令——21 find(转)

    在 使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命 令长度有限制,这样在find命令运行几分钟之后,就 ...

  3. gearmand 编译 could not find gperf

    安装步骤: #wget https://launchpad.net/gearmand/1.2/1.1.8/+download/gearmand-1.1.8.tar.gz #tar zxvf gearm ...

  4. 2018.6.22 Java试题测试结果

    如何从有数字规律的网址抓取网页并保存在当前目录?假设网址为 http://test/0.xml,其中这个数字可以递增到100. for((i=0;i<100;++i));do wget http ...

  5. 输入hostname -f提示:hostname: Unknown host

    解决方法:将/etc/hosts文件中的内容添加如下所示 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdo ...

  6. BZOJ2118: 墨墨的等式(最短路 数论)

    题意 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. So ...

  7. 转载:java分布式服务框架Dubbo的介绍与使用

    1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...

  8. django+xadmin在线教育平台(五)

    3-3 django orm介绍与model设计 上节教程完成后代码(来学习本节前置条件): 对应commit: 留言板前端页面展示.本次内容截止教程3-2结束. 可能现在你还在通过手写sql语句来操 ...

  9. 记python版本管理--pyenv

    随记: 众所周知,python2.x版本与3.x版本有比较大的区别,如果你是2.x版本的使用者,突然接了3.x版本的项目,或者反过来,遇到这种情况该怎么办呢?重新安装自己电脑上的python,来匹配对 ...

  10. 【CSS】CSS 的优先级总结

    样式的优先级 多重样式(Multiple Styles):如果外部样式.内部样式和内联样式同时应用于同一个元素,就是使多重样式的情况. 一般情况下,优先级如下: (外部样式)External styl ...