quagga源码学习--BGP协议路由更新
BGP的核心就是交换路由,所以关键的部分还是在路由的更新与撤销上面,这之间包含了繁杂的属性,community等等可以称之为业务逻辑的处理过程,不做详述。
bgp_read函数是路由更新的事件处理函数,在收到BGP_MSG_UPDATE消息的时候开始调用bgp_update_receive函数处理。
switch (i) {
case NLRI_UPDATE:
case NLRI_MP_UPDATE:
nlri_ret = bgp_nlri_parse(peer, NLRI_ATTR_ARG, &nlris[i]);
break;
case NLRI_WITHDRAW:
case NLRI_MP_WITHDRAW:
nlri_ret = bgp_nlri_parse(peer, NULL, &nlris[i]);
}
上面是更新路由与撤销路由。比如在cli输入clear ip bgp 命令的时候会撤销路由。
nlri是(network layer reachable infomation)的缩写。
在bgp_nlri_parse里对bgp UPDATE消息内容进行处理,遍历消息内容里的全部路由前缀,开始bgp_update调用。
/* Normal process. */
if (attr)
ret = bgp_update(peer, &p, attr, packet->afi, packet->safi,
ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, );
else
ret = bgp_withdraw(peer, &p, attr, packet->afi, packet->safi,
ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
在bgp_update中对本节点以及所有的邻居的路由信息都进行更新,主要的更新是在bgp_process函数里。
switch (bgp_node_table(rn)->type) {
case BGP_TABLE_MAIN:
work_queue_add(bm->process_main_queue, pqnode);
break;
case BGP_TABLE_RSCLIENT:
work_queue_add(bm->process_rsclient_queue, pqnode);
break;
}
可以看到,最后都是在工作队列里进行更新。对应初始化的时候设置的工作函数:
bm->process_main_queue->spec.workfunc = &bgp_process_main;
bm->process_main_queue->spec.del_item_data = &bgp_processq_del;
bm->process_main_queue->spec.max_retries = ;
bm->process_main_queue->spec.hold = ; bm->process_rsclient_queue->spec.workfunc = &bgp_process_rsclient;
bm->process_rsclient_queue->spec.del_item_data = &bgp_processq_del;
bm->process_rsclient_queue->spec.max_retries = ;
bm->process_rsclient_queue->spec.hold = ;
对本节点(即服务端),在bgp_process_main里最终发送给了zserv。
zapi_ipv4_route(ZEBRA_IPV4_ROUTE_ADD, zclient, (struct prefix_ipv4 *)p, &api);
对于邻居(即通过neighbor命令配置的),在bgp_process_rsclient中分别如下处理
如果是添加或者更新,则添加到fifo队列中:
/* Add new advertisement to advertisement attribute list. */
bgp_advertise_add(adv->baa, adv); FIFO_ADD(&peer->sync[afi][safi]->update, &adv->fifo);
如果是撤销路由,则:
/* Add to synchronization entry for withdraw announcement. */
FIFO_ADD(&peer->sync[afi][safi]->withdraw, &adv->fifo); /* Schedule packet write. */
BGP_WRITE_ON(peer->t_write, bgp_write, peer->fd);
都是在thread任务调度的bgp_write的事件中处理。
quagga源码学习--BGP协议路由更新的更多相关文章
- quagga源码学习--BGP协议的初始化
quagga支持BGP-4,BGP-4+协议,支持多协议(mpls,isis,ospf等等)以及单播,组播路由的导入和分发. 具体的协议,这里就不附录了,网络上有很多资料,或者RFC. 协议源码的学习 ...
- quagga源码学习--BGP协议中的routemap
路由策略的基础知识 定义 路由策略(Routing Policy)作用于路由,主要实现了路由过滤和路由属性设置等功能,它通过改变路由属性(包括可达性)来改变网络流量所经过的路径. 目的 路由器在发布. ...
- quagga源码学习--BGP协议对等体连接建立的状态机
创建完bgp peer之后,就要bgp start了,不然费那么大劲创建出来不做事情就销毁了,就很尴尬了. 那么对等体一旦start起来,就会进入各自的状态,在不同的状态下处理各自的事件消息. 下面列 ...
- quagga源码学习--BGP协议创建对等体
现有的路由协议都是通过分布式协议逐个配置协商运行的,协议协议,一个就不需要协议咯,至少2个才能够协议着做事情嘛,不过呢,这样就出现网元过多配置困难的问题,对网管软件要求也越来越高, SDN或许可能改变 ...
- quagga源码学习--BGP协议对等体连接tcp md5签名认证选项
bgp使用tcp连接,每个bgp实例自身是peer的一个tcp server端,同时也是peer的tcp client端. 1.在bgp_create之后都建立自己的socket服务端开始监听179端 ...
- nginx源码学习资源(不断更新)
nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没 ...
- nginx源码学习资源(不断更新)转
原文地址:http://www.cnblogs.com/yjf512/archive/2012/06/13/2548515.html nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx ...
- ASP.NET Core MVC 源码学习:Routing 路由
前言 最近打算抽时间看一下 ASP.NET Core MVC 的源码,特此把自己学习到的内容记录下来,也算是做个笔记吧. 路由作为 MVC 的基本部分,所以在学习 MVC 的其他源码之前还是先学习一下 ...
- ss源码学习--从协议建立到完成一次代理请求
上一次介绍了ss源码中各个事件处理函数完成的工作,这次具体分析一下协议的建立以及请求数据的传输过程. 因为ss的local和server共用一个类以及一系列的事件处理函数,所以看起来稍显复杂.下面来将 ...
随机推荐
- iOS完美版的UIScrollView无缝循环:你值得一看
可以直接copy运行研究 .m头文件和声明的常量(宏和const) #import "ViewController.h" // UIScrollView的尺寸 const CGFl ...
- Lazy Load, 延迟加载图片的 jQuery 插件 - NeoEase
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- SQL Server 2012 - Transact-SQL
变量 --全局变量 select @@VERSION --局部变量 declare @i int set @i=5 select @i 通配符: like 'joh%', %任意长度的任意字 ...
- mysql的数据类型int、bigint、smallint 和 tinyint取值范围
使用整数数据的精确数字数据类型. bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字 ...
- FTP服务器配置部分
构建基于虚拟用户的vsftpd服务器1.建立虚拟FTP用户的帐号数据库文件 (1) 建立虚拟用户的账户名.密码列表->奇数行为帐号名,偶数行为上一行中帐号的密码 (2) 转化为Berkeley ...
- [iOS Animation]-CALayer 图层树
图层的树状结构 巨妖有图层,洋葱也有图层,你有吗?我们都有图层 -- 史莱克 Core Animation其实是一个令人误解的命名.你可能认为它只是用来做动画的,但实际上它是从一个叫做Layer Ki ...
- HDU 2809 God of War
状压DP.我认为是数据水了,用打死了哪几只作为状态,AC代码只需要保存当前状态的最大血量,完全没有考虑攻击力大小. 个人认为正确DP应该这样的:dp[状态][等级],但这样写不能AC,时间复杂度会很大 ...
- ACM_基础知识(二)
1. strstr: 函数原型:extern char *strstr(char *str1, const char *str2); 功能:strstr(str1,str2) 函数用于判断字符串str ...
- Codeforces#348DIV2/VK CUP 2016
昨天第一次开大小号打cf,发现原来小号提交之后大号在此提交同样的代码会被skipped掉,然后之后提交的代码都不记分,昨天a,b,c都是水题 A 题意:问一个物品最多能被分成多少份,分成的连续两份不能 ...
- Keil MDK从未有过的详细使用讲解
转自博客:http://blog.csdn.net/zhzht19861011/article/details/5846510 这博主关于MDK 的使用的文章,写的得TM的好 TM的实用! 真心收藏 ...