FRR BGP协议分析12 -- ZEBRA路由的处理1
当前面初始化完成的时候,zebra客户端线程(zebra_apic)静静等待客户端的消息,zebra dplane也急不可待了。
本次我们以BGP 为例,当BGP 根据自己的规则优选路由后,就会发给zebra,在函数bgp_process_main_one里面,把路由发布出去后,就会执行fib update动作,调用bgp_zebra_announce函数发布路由到zebra里面。
他们之间通过struct zapi_route 消息通信
首先填充消息内容,最后调用zclient_route_send 发送到zebra进程处理。
按照前面初始化阶段的分析,我们知道zebra为BGP创建的zebra_apic线程会被唤醒,执行fd可读的事件回调函数zserv_read。
本次我们先借助zserv_read来看下sock读取字节流的报文的处理方法,然后在继续讨论路由的处理。
- 先读取头部
- 解析头部,获取头部后面的数据区长度
- 在根据头部里面的数据区长度,获取数据
获取完所有的消息后,又把消息添加事件到zebra主线程继续处理?为啥这么处理了?zebra_apic线程就只读取下消息,然后所有的消息给主线程处理?减少锁?
我们先看看zserv_process_messages函数的注释,然后继续跟踪消息的处理:
先从client的ibuf里面出队报文,然后缓存起来,然后遍历缓存,每个消息调用zserv_handle_commands来实现函数调转,路由添加的cmd是ZEBRA_ROUTE_ADD,对应执行函数是zread_route_add,此函数继续解析处理路由消息。
- 使用zapi_route_decode解析路由消息的msg,获取前缀、nexthop等各种信息,还原struct zapi_route消息
- 生成一个新的route entry然后填充里面的各种信息,这里我们先认识下zebra里面最重要的路由的节点的数据结构
然后处理nexthop的信息,遍历所有的nexthop生成struct nexthop数据结构,我们在来认识下这个重要的数据结构
生成nexthop信息,并加入route entry的nexthop链表里面,后续用于负载均衡
如果消息里面有mpls label的信息,也需要添加到nexthop里面
Route entry填充好后,继续调用rib_add_multipath处理路由信息添加,让我们继续走下去细看。
rib_add_multipath 又引入了两个新的数据结构struct route_table和struct route_node,我们来看下:
结合前面给出的nexthop,整个路由表项的处理就是由route_table\route_node\route_entry 组织而成的,route_table包含了一个二叉树结构来保存所有的路由前缀和下一跳路由表项,prefix结构保持了路由前缀的长度和值,用来做最长前缀匹配,那,说好的mtire树呢? 好吧,我们不太可能把成千上万的路由表项塞给linux内核,够用就行。
整体的数据结构关系如下图所示:
rib_add_multipath 先查找本次的路由表的route_table,然后在table中根据前缀查找是否有相同的route_node表项,其中srcdest_rnode_get查找如果没有node,则会生成一个新的route_node,然后加入route_table的二叉树中,然后调用rib_addnode,添加route_entry表项。
rib_addnode 直接调用rib_link 继续处理,首先会在route_node的info字段生成一个rib_dest_t的结构体,上面的图也已经画了出来,同时会把route_node里面的route_entry使用链表连接起来,表示同一个前缀的不同路由。
然后会判断是否有重分发的配置,如果bgp的路由重分发到ospf等,本次不分析,如果没有重分发,那么直接调用rib_queue_add入zebrad.mq work queue处理,当work queue调度处理的时候,会调回调函数meta_queue_process继续处理
FRR BGP协议分析12 -- ZEBRA路由的处理1相关推荐
- 【FRR 】【BGP协议分析】 1 - BGP 初始化
FRR支持BGP-4,BGP-4+协议,BGP协议本身的知识点,可以参考很多资料,TCP/IP路由技术是一本不错的书,建议多看几次,还有红茶哥的博客和视频 http://blog.sina.com.c ...
- bgp协议 怎么知道相邻路由的ip地址_BGP的名词解释
BGP(Border Gateway Protocol,边界网关协议)是用来连接Internet上的独立系统的路由选择协议.它是Internet工程任务组制定的一个加强的.完善的.可伸缩的协议.BGP ...
- bgp协议 怎么知道相邻路由的ip地址_三级网络技术考前选择题1—BGP
一.视频讲解 二.知识点背诵 高频:出现 24 次(共有 29 套题) 1. BGP是边界网关协议,是外部而不是内部网关协议(是不同自治系统(AS)的路由器之间使用的协议).2. 一个BGP发言人 ...
- BGP协议原理(一)BGP协议基本概念:BGP作用与特点、BGP邻居关系建立与配置
文章目录 前提概念 AS ASN IGP与EGP BGP的基本概述 基本作用 BGP协议特点 BGP邻居关系和配置 建立TCP连接 BGP邻居类型 BGP简单邻居关系配置 报文类型 邻居关系的建立 前 ...
- BGP协议学习笔记——BGP基础
BGP协议学习笔记--BGP基础(BGP概念.BGP报文.BGP状态机.BGP关系建立.BGP路由通告) 说明:本文学习笔记整理自网络.华为公开产品文档.华为公开PPT及部分的自我理解 一.BGP简介 ...
- 基于FRR全面解析BGP协议(五):FRR的BGP路由策略
FRR的BGP路由策略 过滤器 FRR提供了基于IP,基于Community和基于AS-PATH的三种类型过滤器来匹配路由. IP Access List 基于IP的路由ACL规则,比较少使用,通常是 ...
- 基于FRR全面解析BGP协议(七):FRR编译
FRR编译 环境:centos 7.6.1810 版本:FRR 7.3 编译 下载FRR源代码包 wget https://github.com/FRRouting/frr/archive/frr-7 ...
- 实用知识点梳理:BGP协议、调制解调技术、路由特点、VOIP、FTP、Cookie、滑动窗口协议与自动重传请求
BGP协议 边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议. BGP 是唯一一个用来处理像因特网大小的网络的协议,也是唯一能够妥善处理好不相关路由域间的多路连接的协议.BGP构建在 ...
- BGP协议路由聚合—AS-SET的使用
BGP协议可以使用命令,将具体路由聚合成一条聚合路由. 路由聚合原则采用最长相同掩码匹配的方法. 路由聚合可以减小路由表的规模. BGP的聚合分为两种: 1. 自动聚合(现网中不用,可控性差,只能聚合 ...
- 【学习笔记】路由算法与路由协议:RIP协议与距离向量算法、OSPF协议与链路状态算法、BGP协议
文章目录 一. 路由算法与路由协议概述 ① 路由算法的分类 ② 分层次的路由选择协议 二. RIP协议和距离向量算法 ① RIP协议定义 ② RIP协议:交换对象.交换周期.交换内容 ③ 距离向量算法 ...
最新文章
- 为什么用1 << 16表示数
- Polya原理的应用经典实例
- 新增数据时遇到特殊字符
- ajax 如何禁止 预检请求,如何跳过“选项”预检请求?
- mysql账号密码忘_mysql用户名密码忘记了解决方法
- 程序员面向软件开发时,如何成功?
- VB 文件未找到: 'C:\WINDOWS\system32\ieframe.dll\1'--继续加载工程吗?
- linux 启动网络服务,Linux下网络启动服务器安装和配置方法(pxe+tftp+dhcpd)
- UVA10190 Divide, But Not Quite Conquer!【等差数列】
- JSTL Tutorial with Examples – JSTL Core Tags
- VS2017 winform 打包(使用 Microsoft Visual Studio 2017 Installer Project)
- [嵌入式方案][cx32l003] 一个健壮的BootLoader系统
- 「数据架构」数据模型,数据字典,数据库模式 和ERD的比较
- windows 10 宽带拨号时无法开启热点,解决热点开启问题
- html5标签figure、figcaption
- AI作画:文心一格赋能艺术与设计创作
- 激光三角测量(sheet of light)halcon示例详解 Reconstruct_Connection_Rod_Calib.hdev 模型三维重建...
- 本周大新闻|Meta AI部门重大重组,疑似Cambira CAD图曝光
- 【数据结构】树的逻辑结构
- 在win7下配置Geany,使其使用 Python 3
热门文章
- 【SSH进阶】java.lang.IllegalArgumentException: id to load is required for loading
- C语言使用SQLite3数据库
- 在ehlib的DBGridEh控件中使用过滤功能(可以不用 MemTableEh 控件 适用ehlib 5.2 ehlib 5.3)...
- papervision3D官方文档CHM格式.
- java开启注解扫描,详解Spring框架注解扫描开启之配置细节
- mysql 分页_MySQL如何实现分页查询
- HBase的两种协处理器
- 企业搜索 Solr7 安装部署
- sql 判断连续数字
- Spring boot 2.x+oauth2实现单点登录:基础准备之Spring Security