处理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)相关推荐

  1. 【FRR 】【BGP协议分析】 1 - BGP 初始化

    FRR支持BGP-4,BGP-4+协议,BGP协议本身的知识点,可以参考很多资料,TCP/IP路由技术是一本不错的书,建议多看几次,还有红茶哥的博客和视频 http://blog.sina.com.c ...

  2. BGP协议部分笔记整理

    BGP:边界网关协议 使用范围:BGP范围,在AS(自治系统)之间使用的协议 协议的特点(算法):路径矢量型,没有算法,有规则 (传拓扑信息是链路状态型,不传是距离矢量型) 无类别,协议传递网络掩码, ...

  3. 基于FRR全面解析BGP协议(五):FRR的BGP路由策略

    FRR的BGP路由策略 过滤器 FRR提供了基于IP,基于Community和基于AS-PATH的三种类型过滤器来匹配路由. IP Access List 基于IP的路由ACL规则,比较少使用,通常是 ...

  4. 网工路由基础(6)BGP协议

    往期回顾 网工路由基础(1)静态路由 网工路由基础(2)路由选路原理 网工路由基础(3)RIP原理与配置 网工路由基础(4)EIGRP协议 网工路由基础(5)ISIS协议 作为运行全球互联网的路由协议 ...

  5. bgp协议 怎么知道相邻路由的ip地址_BGP的名词解释

    BGP(Border Gateway Protocol,边界网关协议)是用来连接Internet上的独立系统的路由选择协议.它是Internet工程任务组制定的一个加强的.完善的.可伸缩的协议.BGP ...

  6. 实用知识点梳理:BGP协议、调制解调技术、路由特点、VOIP、FTP、Cookie、滑动窗口协议与自动重传请求

    BGP协议 边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议. BGP 是唯一一个用来处理像因特网大小的网络的协议,也是唯一能够妥善处理好不相关路由域间的多路连接的协议.BGP构建在 ...

  7. 【学习笔记】路由算法与路由协议:RIP协议与距离向量算法、OSPF协议与链路状态算法、BGP协议

    文章目录 一. 路由算法与路由协议概述 ① 路由算法的分类 ② 分层次的路由选择协议 二. RIP协议和距离向量算法 ① RIP协议定义 ② RIP协议:交换对象.交换周期.交换内容 ③ 距离向量算法 ...

  8. bgp协议 怎么知道相邻路由的ip地址_三级网络技术考前选择题1—BGP

    一.视频讲解 二.知识点背诵 高频:出现 24 次(共有 29 套题) 1.  BGP是边界网关协议,是外部而不是内部网关协议(是不同自治系统(AS)的路由器之间使用的协议).2.  一个BGP发言人 ...

  9. 以实例分析 IGP中更新源检测失败丢弃路由更新包

    遇到的BGP中更新源检测失败现象 在iBGP建立邻居关系时,往往会采用单播方式的环回口建立邻居,这样做是因为环回口有永不Down的特点.在这种情况下即使是在一个接口出现问题之后,仍然可以通过其他的可用 ...

  10. 基于FRR全面解析BGP协议(七):FRR编译

    FRR编译 环境:centos 7.6.1810 版本:FRR 7.3 编译 下载FRR源代码包 wget https://github.com/FRRouting/frr/archive/frr-7 ...

最新文章

  1. 开发chrome 插件, background.js中 console log 看不到解决方法
  2. c++如何把字符串转为变量名_如何优雅地计算多变量
  3. 在 vue 组件中查看 vuex 定义
  4. JVM实用参数(三)打印所有XX参数及值
  5. bzoj 4573: [Zjoi2016]大森林
  6. matlab文件序号超出511,求教一段matlab的代码 - 数学 - 小木虫 - 学术 科研 互动社区...
  7. JavaScript:字符串相关操作
  8. Windows 無法查詢{7B849a69-220F-......} 的 DllName 登錄項目
  9. c语言怎么编程打开文件,怎么用c语言打开文件
  10. R语言医学数据分析实战(一)数据结构与获取数据集
  11. 硬核科普:一片晶圆可以生产多少芯片?
  12. 微信/支付宝app支付相关参数
  13. python实现微信机器人 + 淘宝客自动领券(二)
  14. 计算机管理要继续请输入,Windows 10上提示UAC错误:如要继续请输入管理员密码!...
  15. 一款非常经典的蓝牙多媒体芯片​RDA5850
  16. 核酸检测预约和结果查询系统
  17. 华为交换机导入配置_将一个华为交换机的配置导入另一个已有配置的交换机中...
  18. mysql udf 执行命令_mylab_sys_exec UDF调用mysql外部系统命令(For linux)
  19. hbuilder边框代码是什么_HBuilderX自定义UI主题界面风格
  20. 企业管理 - 现代管理學之父

热门文章

  1. 解决windows下的mysql匿名登陆无法使用mysql数据库的问题
  2. 如何高效设计游戏——从抽奖模型到圆桌算法
  3. android APN的打开与关闭
  4. WMI 查询分析工具更新
  5. 冲刺第七天 12.3 MON
  6. 解决安装多个Xcode出现的PBXProjectWizardChooserWizard问题
  7. 追随你心 —— 聊聊VMCloud
  8. tomcat监听activemq jms配置
  9. 在Spring MVC中使用FileUpload功能
  10. mybatis逆向工程详解