当前面初始化完成的时候,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相关推荐

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

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

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

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

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

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

  4. BGP协议原理(一)BGP协议基本概念:BGP作用与特点、BGP邻居关系建立与配置

    文章目录 前提概念 AS ASN IGP与EGP BGP的基本概述 基本作用 BGP协议特点 BGP邻居关系和配置 建立TCP连接 BGP邻居类型 BGP简单邻居关系配置 报文类型 邻居关系的建立 前 ...

  5. BGP协议学习笔记——BGP基础

    BGP协议学习笔记--BGP基础(BGP概念.BGP报文.BGP状态机.BGP关系建立.BGP路由通告) 说明:本文学习笔记整理自网络.华为公开产品文档.华为公开PPT及部分的自我理解 一.BGP简介 ...

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

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

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

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

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

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

  9. BGP协议路由聚合—AS-SET的使用

    BGP协议可以使用命令,将具体路由聚合成一条聚合路由. 路由聚合原则采用最长相同掩码匹配的方法. 路由聚合可以减小路由表的规模. BGP的聚合分为两种: 1. 自动聚合(现网中不用,可控性差,只能聚合 ...

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

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

最新文章

  1. 为什么用1 << 16表示数
  2. Polya原理的应用经典实例
  3. 新增数据时遇到特殊字符
  4. ajax 如何禁止 预检请求,如何跳过“选项”预检请求?
  5. mysql账号密码忘_mysql用户名密码忘记了解决方法
  6. 程序员面向软件开发时,如何成功?
  7. VB 文件未找到: 'C:\WINDOWS\system32\ieframe.dll\1'--继续加载工程吗?
  8. linux 启动网络服务,Linux下网络启动服务器安装和配置方法(pxe+tftp+dhcpd)
  9. UVA10190 Divide, But Not Quite Conquer!【等差数列】
  10. JSTL Tutorial with Examples – JSTL Core Tags
  11. VS2017 winform 打包(使用 Microsoft Visual Studio 2017 Installer Project)
  12. [嵌入式方案][cx32l003] 一个健壮的BootLoader系统
  13. 「数据架构」数据模型,数据字典,数据库模式 和ERD的比较
  14. windows 10 宽带拨号时无法开启热点,解决热点开启问题
  15. html5标签figure、figcaption
  16. AI作画:文心一格赋能艺术与设计创作
  17. 激光三角测量(sheet of light)halcon示例详解 Reconstruct_Connection_Rod_Calib.hdev 模型三维重建...
  18. 本周大新闻|Meta AI部门重大重组,疑似Cambira CAD图曝光
  19. 【数据结构】树的逻辑结构
  20. 在win7下配置Geany,使其使用 Python 3

热门文章

  1. 【SSH进阶】java.lang.IllegalArgumentException: id to load is required for loading
  2. C语言使用SQLite3数据库
  3. 在ehlib的DBGridEh控件中使用过滤功能(可以不用 MemTableEh 控件 适用ehlib 5.2 ehlib 5.3)...
  4. papervision3D官方文档CHM格式.
  5. java开启注解扫描,详解Spring框架注解扫描开启之配置细节
  6. mysql 分页_MySQL如何实现分页查询
  7. HBase的两种协处理器
  8. 企业搜索 Solr7 安装部署
  9. sql 判断连续数字
  10. Spring boot 2.x+oauth2实现单点登录:基础准备之Spring Security