FRR BGP 协议分析 5 -- 路由更新(2)

2023-05-16

处理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的选路原则选择一个最优的路由,选择原则如下:

https://img-blog.csdnimg.cn/20190930160602771.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FybWxpbnV4d3c=,size_16,color_FFFFFF,t_70

 然后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内核的过程同样很长,后面再继续分析。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FRR BGP 协议分析 5 -- 路由更新(2) 的相关文章

  • i2c信号的ACK与NACK

    nbsp nbsp nbsp nbsp nbsp nbsp nbsp 我们平时在调试I2C的时候可能很少去关注NACK信号 只知道如果Master发送数据 MSB先发 LSB后发 连续发送一个字节 8个bit 之后Slave会回复一个ACK
  • ubuntu的recovery mode

    偶尔会遇到Ubuntu无法正常启动的情况 xff0c 这时候需修改某些文件让系统正常启动 xff0c 如果直接进入 recovery 模式 xff0c 默认是文件权限只读 xff0c 无法修改文件 这时我们需要进入recovery 的单用户
  • oprofile库安装与使用

    一 概述 oprofile库是linux平台上的一个功能强大的性能分析工具 xff0c 支持两种采样方式 xff1a 基于事件的采样与基于时间的采样 1 xff09 基于事件的采样 xff1a oprofile只记录特定事件 xff08 比
  • 超声波模块

    HC SR04 简介 HC SR04超声波模块可提供2cm 400cm的距离感测功能 xff0c 测量精度可以达到3mm 模块包括超声波发射器 xff0c 接收器与控制电路 基本工作原理 1 采用Trig引脚触发 xff0c 给至少10us
  • /proc/interrupts

    proc interrupts中的字段依次是逻辑中断号 中断在各CPU上发生的次数 xff0c 中断所属父设备名称 硬件中断号 中断触发方式 电平或边沿 中断名称 proc interrupts的具体实现查看代码kernel irq pro
  • BGP-LS 简介

    BGP LS xff08 BGP Link state xff09 汇总IGP协议收集的拓扑信息上送给上层控制器 产生原因 BGP LS是收集网络拓扑的一种新的方式 BGP LS特性产生前 xff0c 路由器使用IGP xff08 OSPF
  • ubuntu下vnc使用

    使用apt cache search vncserver命令搜索可以用来安装vncserver的软件包 xff0c 这里选用vnc4server安装vnc 2 使用apt get install vnc4server命令安装vncserve
  • 使用“反射”将 Java 中一种对象类型转换为另外一种类型

    将一种对象类型转换为另外一种类型的常用场景 场景如下 xff1a 一般后端是使用 MVC 三层架构进行分层 实体类 User 用于接收数据库中的数据 xff1b 表现层 UserVo 将数据传给前端 这中间免不了要将实体类转换为表现层中的对
  • Ubuntu18.04 vnc灰屏问题

    vnc安装完以后 xff0c 用客户端登录发现只有5901端口可用 xff0c 但是其他端口登录上去以后都是灰屏的 查找了一下 xff0c 需要修改配置文件 vnc xstartup为如下内容 xff1a bin bash export d
  • 安装docker

    1 查看docker安装目录 whereis docker docker usr bin docker etc docker usr libexec docker usr share man man1 docker 1 gz 2 查询运行文
  • 关于PiBOT使用的一些问题汇总--ing

    xff1a 多机通讯是按照教程设置环境变量ROS MASTER URI 初始化 pibot init env sh xff0c 使用rostopic已经能够查看 xff0c 但是主机PC无法启动launch 原因 xff1a 个人测试是需要
  • ubuntu 19.10系统解决E: 仓库 “http://ppa.launchpad.net/webupd8team/java/ubuntu eoan Release” 没有 Release 文件。

    在终端换源后遇到E 仓库 http ppa launchpad net webupd8team java ubuntu eoan Release 没有 Release 文件 问题 解决方法 xff1a 将对应的ppa删除即可 第一步 xff
  • 使用org-mode生成晨检报告

    原文地址 https lujun9972 github io blog 2020 04 10 使用org mode生成晨检报告 index html 我们设置了每天8点多自动进行调用一次晨检脚本 xff0c 该脚本会将检查的一些数据存入本地
  • 使用Pi-hole屏蔽广告

    原文地址 https www lujun9972 win blog 2020 12 05 使用pi hole屏蔽广告 index html 目录 获取Pi的对外IP地址安装Pi hole配置DNS配置拦截域名 获取Pi的对外IP地址 我们一
  • 笑话理解之Mature

    原文地址 https www lujun9972 win blog 2020 12 09 笑话理解之mature index html 目录 The difference between government bonds and men T
  • 笑话理解之Hearing

    原文地址 https www lujun9972 win blog 2020 12 09 笑话理解之hearing index html 目录 The Hearing Problem The Hearing Problem In a chu
  • Emacs 作为 MPD 客户端

    原文地址 https www lujun9972 win blog 2022 06 26 emacs 作为 mpd 客户端 index html 今天才知道 xff0c Emacs居然内置了一个 mpc el 可以将 Emacs 转换为 M
  • 编译SONiC交换机镜像(转,参考2)

    sonic buildimage 编译SONiC交换机镜像 描述 以下是关于如何为网络交换机构建 ONIE 兼容网络操作系统 xff08 NOS xff09 安装程序镜像的说明 xff0c 以及如何构建在NOS内运行的Docker镜像 请注
  • Emacs 作为 MPD 客户端

    原文地址 https www lujun9972 win blog 2022 06 26 emacs 作为 mpd 客户端 index html 今天才知道 xff0c Emacs居然内置了一个 mpc el 可以将 Emacs 转换为 M
  • 使用 calc 计算保险实际收益率

    原文地址 https www lujun9972 win blog 2022 08 10 使用 calc 计算保险实际收益率 index html 今天某银行的客户经理来推销一个 增额终身寿险 xff0c 号称是能锁定3 5 的收益率 具体

随机推荐