FRR BGP 协议分析 5 -- 路由更新(2)
处理NLRI
获取NLRI的报文长度,填入nlris[NLRI_UPDATE],到现在为止nlris里面的4种类型(如果有的话),已经全部填写到nlris数组结构体里面
然后我们遍历这个数组,处理里面所有的NLRI的类型,本次先分析NLRI_UPDATE,MP后面再分析。
根据前面解析出来的SAFI选取不同的处理函数,afi/safi定义如下:
AFI_IP 的组合定义如下:
IP + UNICAST |
普通的IP 单播路由处理 |
IP + MULTICAST |
组播路由?? |
IP + MPLS_VPN |
MPLS VPN 路由的处理 |
IP + ENCAP |
??目前不太清楚 |
IP + EVPN |
?? 还是L2VPN + EVPN ?? |
IP + LABELED_UNICAST |
BGP的标签分发的路由处理 |
IP + FLOWSPEC |
BGP FLOWSPEC的处理 |
可以从下面的函数查看组合:
IP + UNICAST/ MULTICAST走的是下面的函数,NLRI里面存放的是前缀,为了方便,把报文也放到下面:
这里又引出BGP的一个数据结构struct prefix
在每次的for循环里面,需要填充好prefix前缀里面的长度、family、前缀值,然后以便后续bgp_update函数继续处理。
bgp_update 引申出struct bgp_node的数据结构,是BGP 存放路由的关键数据结构,我们先认识下,使用关键字prefix组织成radix树
struct bgp_path_info 存放在bgp_node的void *info里面,这个数据结构的意义是什么??
bgp_afi_node_get在bgp对应的afi/safi table里面使用prefix前缀,获取struct bgp_node节点,并加入afi/safi table的二叉树里面。
如果需要记录adj_in,那么把当前的信息存入bgp_adj_in结构体,然后link到bgp_node的链表上面。
然后会进行AS_PATH的防环检查,
attr_new = bgp_attr_intern(&new_attr); 会根据前面解析的attr(局部变量传下来的),申请一个attr_new,以便后续保存。
info_make 会创建一个新的struct bgp_path_info数据结构,attr_new 便保存在里面的,后续会在给bgp_path_info赋值。
函数bgp_path_info_add 会把新的bgp_path_info,连接到bgp_node里面。
bgp_maximum_prefix_overflow 会检查BGP Max Prefix条目限制
bgp_process 会把rn入队work_queue,后续work_queue注册的回调函数bgp_process_wq,会出队继续处理rn,而work_queue是在初始化的时候,就已经初始化好了
这里的work_queue和linux内核的work queue是异曲同工之妙。
WORK_QUEUE 后续处理
work queue的回调函数bgp_process_wq出队queue继续处理,bgp_process_main_one 处理具体的queue node,即bgp route_node的信息,这里提个问题,单线程处理的bgpd,为何这里需要在异步下work_queue继续处理??
bgp_process_main_one 会根据BGP的选路原则选择一个最优的路由,选择原则如下:
然后group_announce_route发布路由,会遍历bgp->update_groups的HASH表,执行回调函数update_group_walkcb,最后会调到函数group_announce_route_walkcb
而这里涉及到的结构体struct update_group/ struct update_subgroup是在bgp_establish的时候调用update_group_adjust_peer_afs创建的
/* assign update-group/subgroup */
update_group_adjust_peer_afs(peer);
回到group_announce_route_walkcb函数,遍历group下的subgroup,然后得到struct bgp_path_info和bgp_node,调用函数subgroup_process_announce_selected,最后调用bgp_adj_out_set_subgroup 加入sync->update表,等待定时器更新发送,但此时传入定时器的时间为0,所以应该是一个实时的时间,此时相当于又异步了一次。
事件执行会调用bgp_generate_updgrp_packets,然后调用subgroup_update_packet,里面封装发送的UPDATE报文,bgp_packet_attribute封装属性,报文封装好后,调用bpacket_reformat_for_peer修正下报文的nexthop,然后调用bgp_packet_add把报文加入到peer的obuf里面,然后调用bgp_writes_on(peer),等fd可写的时候,IO线程会把UPDATE报文发送出去。
到此我们分析了接受到UPDATE消息,然后在BGP 路由表里面添加了路由,并且发送出去的全部过程,涉及的路径很长,细节很大,只有后面再慢慢体会。
而这个BGP 路由下发到ZEBRA和linux内核的过程同样很长,后面再继续分析。
FRR BGP 协议分析 5 -- 路由更新(2)相关推荐
- 【FRR 】【BGP协议分析】 1 - BGP 初始化
FRR支持BGP-4,BGP-4+协议,BGP协议本身的知识点,可以参考很多资料,TCP/IP路由技术是一本不错的书,建议多看几次,还有红茶哥的博客和视频 http://blog.sina.com.c ...
- BGP协议部分笔记整理
BGP:边界网关协议 使用范围:BGP范围,在AS(自治系统)之间使用的协议 协议的特点(算法):路径矢量型,没有算法,有规则 (传拓扑信息是链路状态型,不传是距离矢量型) 无类别,协议传递网络掩码, ...
- 基于FRR全面解析BGP协议(五):FRR的BGP路由策略
FRR的BGP路由策略 过滤器 FRR提供了基于IP,基于Community和基于AS-PATH的三种类型过滤器来匹配路由. IP Access List 基于IP的路由ACL规则,比较少使用,通常是 ...
- 网工路由基础(6)BGP协议
往期回顾 网工路由基础(1)静态路由 网工路由基础(2)路由选路原理 网工路由基础(3)RIP原理与配置 网工路由基础(4)EIGRP协议 网工路由基础(5)ISIS协议 作为运行全球互联网的路由协议 ...
- bgp协议 怎么知道相邻路由的ip地址_BGP的名词解释
BGP(Border Gateway Protocol,边界网关协议)是用来连接Internet上的独立系统的路由选择协议.它是Internet工程任务组制定的一个加强的.完善的.可伸缩的协议.BGP ...
- 实用知识点梳理:BGP协议、调制解调技术、路由特点、VOIP、FTP、Cookie、滑动窗口协议与自动重传请求
BGP协议 边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议. BGP 是唯一一个用来处理像因特网大小的网络的协议,也是唯一能够妥善处理好不相关路由域间的多路连接的协议.BGP构建在 ...
- 【学习笔记】路由算法与路由协议:RIP协议与距离向量算法、OSPF协议与链路状态算法、BGP协议
文章目录 一. 路由算法与路由协议概述 ① 路由算法的分类 ② 分层次的路由选择协议 二. RIP协议和距离向量算法 ① RIP协议定义 ② RIP协议:交换对象.交换周期.交换内容 ③ 距离向量算法 ...
- bgp协议 怎么知道相邻路由的ip地址_三级网络技术考前选择题1—BGP
一.视频讲解 二.知识点背诵 高频:出现 24 次(共有 29 套题) 1. BGP是边界网关协议,是外部而不是内部网关协议(是不同自治系统(AS)的路由器之间使用的协议).2. 一个BGP发言人 ...
- 以实例分析 IGP中更新源检测失败丢弃路由更新包
遇到的BGP中更新源检测失败现象 在iBGP建立邻居关系时,往往会采用单播方式的环回口建立邻居,这样做是因为环回口有永不Down的特点.在这种情况下即使是在一个接口出现问题之后,仍然可以通过其他的可用 ...
- 基于FRR全面解析BGP协议(七):FRR编译
FRR编译 环境:centos 7.6.1810 版本:FRR 7.3 编译 下载FRR源代码包 wget https://github.com/FRRouting/frr/archive/frr-7 ...
最新文章
- 开发chrome 插件, background.js中 console log 看不到解决方法
- c++如何把字符串转为变量名_如何优雅地计算多变量
- 在 vue 组件中查看 vuex 定义
- JVM实用参数(三)打印所有XX参数及值
- bzoj 4573: [Zjoi2016]大森林
- matlab文件序号超出511,求教一段matlab的代码 - 数学 - 小木虫 - 学术 科研 互动社区...
- JavaScript:字符串相关操作
- Windows 無法查詢{7B849a69-220F-......} 的 DllName 登錄項目
- c语言怎么编程打开文件,怎么用c语言打开文件
- R语言医学数据分析实战(一)数据结构与获取数据集
- 硬核科普:一片晶圆可以生产多少芯片?
- 微信/支付宝app支付相关参数
- python实现微信机器人 + 淘宝客自动领券(二)
- 计算机管理要继续请输入,Windows 10上提示UAC错误:如要继续请输入管理员密码!...
- 一款非常经典的蓝牙多媒体芯片​RDA5850
- 核酸检测预约和结果查询系统
- 华为交换机导入配置_将一个华为交换机的配置导入另一个已有配置的交换机中...
- mysql udf 执行命令_mylab_sys_exec UDF调用mysql外部系统命令(For linux)
- hbuilder边框代码是什么_HBuilderX自定义UI主题界面风格
- 企业管理 - 现代管理學之父