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

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

初始化在bgp_main.c的main函数里开始,其他协议也类似,比如ospf的main函数就在ospf_main.c.

main里最重要是初始化,包含:

事件驱动的初始化

事件驱动每个线程都要有一个struct thread_master,来做事件驱动(具体的运转方式,后续再写个文章来介绍,这是个大部头),还包含work queue的初始化以及bgp label标签的初始化。

bgp_master 全局变量统管这一切,傲视天下。

VRF的初始化

VRF的初始化,FRR 里面VRF是在linux上创建的,整个流程的处理,后续再分析。

最重要的都在 void bgp_init(void) 这个函数里

扫描二维码关注公众号,回复: 13031915 查看本文章

包含:

  • 线程的初始化

线程的初始化,从上面可以看出,FRR 也模拟出来了线程的概念但和linux的线程不一样,后续可以在聊聊,BGP 的线程包含bgpd/bgpd_io/bgpd_ka:

从名字上看,也知道他们的主要任务:

bgpd_io --- 收发包,然后把报文入队,唤醒bgpd继续处理,入口函数是fpt_run

bgpd --- 处理BGP的所有业务逻辑,处理函数frr_run

bgpd_ka – 处理BGP的keeplive,bgp_keepalives_start

  • Zebra的初始化

zclient_new 创建一个zclient客户端,struct thread_master填入bgp的master,这样客户端的回调函数就在bgp的进程上下文执行

zclient_init 初始化客户端相关的数据后,会调用zclient_event,添加一个事件,回调函数是zclient_connect,初始化完成后,后续会和zebra进程建立连接。

然后会填充各种bgp关心的事件的回调函数,在bgp_zebra_connected回调函数里面(客户端连接zebra成功后会调用),会注册各种BGP 感兴趣的事件,如router-id, interfaces, redistributed routes。

  • 命令行的初始化

就是注册CLI,没啥说的,CLI的实现也挺复杂的,后续再分析

  • 属性相关的初始化

  • aspath_init

aspath_init 初始化aspath的hash存储,hash头ashash,所有的aspath用全局的hash存放??

相关的数据结构如下:

  • attrhash_init

attrhash_init 初始化属性的hash存储,hash头attrhash,所有的属性用全局的hash存放??

attr数据结构较大,包含了BGP的所有属性,AS_PATH,community,med, origin, local_pref, med等等

  • community

community_init 初始化community的HASH,全局comhash存储,存放到全局干嘛??

  • ecommunity

ecommunity_init初始化ecommunity的HASH ,全局ecomhash存储

  • lcommunity

lcommunity_init初始化lcommunity的HASH ,全局lcomhash存储

  • cluster

cluster_init 初始化 cluster 路由反射器的HASH,全局变量cluster_hash

  • transit

transit_init初始化传输的属性的HASH,全局变量transit_hash

  • encap

encap_init 初始化BGP Encap Hash, 没太懂,后续补充

  • 路由表的初始化

afi  网络类型(IPV4, IPV6)

safi 子网络类型(SAFI_UNICAST,SAFI_MULTICAST,SAFI_RESERVED_3,SAFI_MPLS_VPN,SAFI_ENCAP)

lock 引用计数

route_table 路由表项的集合,与zebra使用的是同一个数据结构,存放路由表项

  • route_map

初始化路由图的实现,并增加hook的回调函数

route_map 初始化 route_map策略的实现

具体的实现,后面再分析

  • mplsvpn

MPLS VPN的初始化全是CLI的初始化

  • EVPN

bgp_ethernetvpn_init CLI的初始化

  • FLOWSPEC

bgp_flowspec_vty_init CLI的初始化

  • Access list

 CLI的初始化

功能后面分析

  • Filter list

CLI的初始化

功能后面分析

  • Prefix list

CLI的初始化

    

功能后面分析

  • Community list

CLI的初始化

/* Community list initialize. */

     bgp_clist = community_list_init();

  • BFD init

     

Main函数继续初始化

frr_config_fork 后面分析,没看明白处理啥

bgp_pthreads_run 创建线程

Bgp_pthread_run创建对应的线程,并运行起来。

然后frr_run bgpd开始死循环,处理各种事件

初始化完成!!!!!!!!!

猜你喜欢

转载自blog.csdn.net/weixin_39094034/article/details/115220101
BGP