quagga源码学习--bgp协议路由更新

丹西 丹西     2022-08-21     494

关键词:

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

bgp_read函数是路由更新的事件处理函数,在收到BGP_MSG_UPDATE消息的时候开始调用bgp_update_receive函数处理。

1 switch (i) {
2         case NLRI_UPDATE:
3         case NLRI_MP_UPDATE:
4             nlri_ret = bgp_nlri_parse(peer, NLRI_ATTR_ARG, &nlris[i]);
5             break;
6         case NLRI_WITHDRAW:
7         case NLRI_MP_WITHDRAW:
8             nlri_ret = bgp_nlri_parse(peer, NULL, &nlris[i]);
9         }

上面是更新路由与撤销路由。比如在cli输入clear ip bgp 命令的时候会撤销路由。

nlri是(network layer reachable infomation)的缩写。

在bgp_nlri_parse里对bgp UPDATE消息内容进行处理,遍历消息内容里的全部路由前缀,开始bgp_update调用。

1 /* Normal process. */
2         if (attr)
3             ret = bgp_update(peer, &p, attr, packet->afi, packet->safi,
4                              ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, 0);
5         else
6             ret = bgp_withdraw(peer, &p, attr, packet->afi, packet->safi,
7                                ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);

在bgp_update中对本节点以及所有的邻居的路由信息都进行更新,主要的更新是在bgp_process函数里。

1 switch (bgp_node_table(rn)->type) {
2     case BGP_TABLE_MAIN:
3         work_queue_add(bm->process_main_queue, pqnode);
4         break;
5     case BGP_TABLE_RSCLIENT:
6         work_queue_add(bm->process_rsclient_queue, pqnode);
7         break;
8     }

可以看到,最后都是在工作队列里进行更新。对应初始化的时候设置的工作函数:

1     bm->process_main_queue->spec.workfunc = &bgp_process_main;
2     bm->process_main_queue->spec.del_item_data = &bgp_processq_del;
3     bm->process_main_queue->spec.max_retries = 0;
4     bm->process_main_queue->spec.hold = 50;
5 
6     bm->process_rsclient_queue->spec.workfunc = &bgp_process_rsclient;
7     bm->process_rsclient_queue->spec.del_item_data = &bgp_processq_del;
8     bm->process_rsclient_queue->spec.max_retries = 0;
9     bm->process_rsclient_queue->spec.hold = 50;

对本节点(即服务端),在bgp_process_main里最终发送给了zserv。

1 zapi_ipv4_route(ZEBRA_IPV4_ROUTE_ADD, zclient, (struct prefix_ipv4 *)p, &api);

对于邻居(即通过neighbor命令配置的),在bgp_process_rsclient中分别如下处理

如果是添加或者更新,则添加到fifo队列中:

1 /* Add new advertisement to advertisement attribute list. */
2     bgp_advertise_add(adv->baa, adv);
3 
4     FIFO_ADD(&peer->sync[afi][safi]->update, &adv->fifo);

如果是撤销路由,则:

1 /* Add to synchronization entry for withdraw announcement.  */
2         FIFO_ADD(&peer->sync[afi][safi]->withdraw, &adv->fifo);
3 
4         /* Schedule packet write. */
5         BGP_WRITE_ON(peer->t_write, bgp_write, peer->fd);

都是在thread任务调度的bgp_write的事件中处理。

 

quagga源码学习--bgp协议对等体的状态机

创建完bgppeer之后,就要bgpstart了,不然费那么大劲创建出来不做事情就销毁了,就很尴尬了。那么对等体一旦start起来,就会进入各自的状态,在不同的状态下处理各自的事件消息。下面列举一些状态和事件的集合:1/*BGPfinitestat... 查看详情

quagga的安装

QUAGGA是一款开源的路由软件,也是zebra(已经停止更新)的升级维护版本。作用:将Linux设备变成一个功能完整的路由器。支持的协议:rip,ospf,bgp等。 各种简单的介绍使用方法啊等等什么的可以去官网搜刮一下!官网:http... 查看详情

bgp路由交换详细介绍

一,BGP概述:BGP是自治系统之间进行路由学习及选路的协议1.自治系统自治系统是由同一个技术管理机构管理,使用统一选路策略(运行同一动态路由协议)的一组路由器组的集合2.动态路由的分类(1)按自治系统分类IGP:即自治... 查看详情

quagga代码学习之bgp4

文中理解参考:http://www.cnblogs.com/danxi/p/6344116.html等关于Quagga的源码学习 第一部分:入口函数int main(intargc,char**argv) //bgp_main.cvty_init(bm->master)bgp_init() //installcommandbgp_scan_init() 查看详情

bgp协议

...AS内产生环路。即为防止环路,BGP协议规定,路由器从IBGP学习到的路由不向它的IBGP对等体发布。另外为了防止产生路由黑洞,协议还规定BGP发言者从IBGP获得的路由是否发布给它的EBGP对等体与是否同步相关。BGP消息BGP的运行是通... 查看详情

quagga源码分析--大内总管zebra

...BGM来完成这个篇章,嘿嘿,小资一把!zebra姑且戏称它是quagga项目的大内总管。因为它负责管理其他所有协议进程的路由信息的更新与交互,并负责与内核交换信息,如下的架构:1+----++----++-----++-----+2|bgpd||ripd||ospfd||zebra|3+----++--... 查看详情

quagga源码分析--通用库thread

quagga是开源路由器软件,提供的用户界面与思科,华为的路由器的人机接口几乎一致,非常有学习价值,尤其是开源的协议代码,简直亮瞎了我丹的小眼睛。quagga的介绍,我就不赘述了,有兴趣的可以找度娘或者去官网看看。&nb... 查看详情

bgp协议的原理及应用

一、BGP特征① 传输协议:TCP,端口号179② BGP是外部路由协议,用来在AS之间传递路由信息③ 是一种增强的路径矢量路由协议④ 拥有可靠的路由更新机制⑤ 具备丰富的Metric度量方法⑥ 无环路协议设计⑦ 为路由条目附... 查看详情

bgp项目实验案例(基于华为设备)

...路由的分类(1)按自治系统分类IGP:自治系统内部路由协议,包括RIP、OSPF、ISIS、EIGRPEGP:自治系统之间的路由协议,包括BGP,BGP的作用是控制路由的传播和选择最优路由(2)按协议类型分类距离矢量路由协议链路状态路由协议... 查看详情

quagga的安装和使用

Quagga的安装和使用测试环境:VM12  CentOS6.564位Quagga是一款功能比较强大的开源路由软件,支持rip,ospf,bgp等协议。1. Quagga的安装在CentOS下可以直接使用yum–yinstallquagga进行安装,也可以使用quagga的源代码包进行编译安装... 查看详情

quagga的安装和使用

Quagga的安装和使用测试环境:VM12  CentOS6.564位Quagga是一款功能比较强大的开源路由软件,支持rip,ospf,bgp等协议。1.      Quagga的安装在CentOS下可以直接使用yum–yinstallquagga进行安装,也可以使用quagga的... 查看详情

bgp学习笔记

BGP:一、基本概念1、基于TCP179,基于TCP的好处:面向链接的,有确认机制可靠的2、是一种用于AS之间路由传递和控制的协议(AS)3、BGP报文:open:协商建立邻居关系(版本,AS号,hold-time,router-id)keepalive:周期60s发送,用来... 查看详情

企业公网使用的路由协议bgp/ebgp学习使用理解及思路

大型拓扑使用协议:BGP/EBGP今天刚学的配置,跟大家分享下。华为命令:   bgp64512      开启BGP运行AS号64512 一台机器运行一个AS号   confederationid200     &nb 查看详情

bgp

最近进行了BGP协议的简单学习,也就顺手将学习到的内容进行经验总结,希望能够提供一些方便,如果有什么不足请通过评论告诉我,谢谢1.边界网关协议BGP是一种动态路由发现协议,在于控制路由的传播和选择最佳路由2.BGP4报... 查看详情

bgp4协议测试——信而泰网络测试仪实操

文章关键词BGP;路由测试;协议测试;矢量路由协议;一、前言:BGP是自治系统外部路由协议,用来在AS之间传递路由信息路径矢量路由协议,从设计上避免了环路的发生其路由信息中携带了所经过的全部AS路径列表。这样,接... 查看详情

bgp4协议测试——信而泰网络测试仪实操

文章关键词BGP;路由测试;协议测试;矢量路由协议;一、前言:BGP是自治系统外部路由协议,用来在AS之间传递路由信息路径矢量路由协议,从设计上避免了环路的发生其路由信息中携带了所经过的全部AS路径列表。这样,接... 查看详情

路由软件quagga

...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++一、Quagga简介1、什么是Quagga  Quagga软件原名是Zebra是由一个日本开发团队的软件。我们可以使用Quagga将linux机器打造成一台功能完备的路由器。2、Quagga支持的路由协议&nb... 查看详情

bgp边界网关协议(代码片段)

BGP作用:在不同的大型网络之间,长时间以稳定的方式传输大量的路由并且能够实现路由的灵活控制同时,确保无环BGP工作过程:1、建立邻居表;2、同步数据库;3、计算路由表BGP选路原则:1.preference-value,华为私有属性,仅仅... 查看详情