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

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

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

事件驱动的初始化

BGP的ORF功能 bgp frr_BGP的ORF功能

BGP的ORF功能 bgp frr_回调函数_02

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

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

VRF的初始化

BGP的ORF功能 bgp frr_客户端_03

BGP的ORF功能 bgp frr_BGP的ORF功能_04

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

 

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

BGP的ORF功能 bgp frr_BGP的ORF功能_05

包含:

  • 线程的初始化

BGP的ORF功能 bgp frr_初始化_06

BGP的ORF功能 bgp frr_客户端_07

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

BGP的ORF功能 bgp frr_回调函数_08

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

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

BGP的ORF功能 bgp frr_BGP的ORF功能_09

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

BGP的ORF功能 bgp frr_回调函数_10

bgpd_ka – 处理BGP的keeplive,bgp_keepalives_start

BGP的ORF功能 bgp frr_初始化_11

 

  • Zebra的初始化

BGP的ORF功能 bgp frr_BGP的ORF功能_12

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

BGP的ORF功能 bgp frr_初始化_13

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

 

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

 

  • 命令行的初始化

BGP的ORF功能 bgp frr_回调函数_14

BGP的ORF功能 bgp frr_客户端_15

BGP的ORF功能 bgp frr_回调函数_16

BGP的ORF功能 bgp frr_回调函数_17

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

 

  • 属性相关的初始化

BGP的ORF功能 bgp frr_客户端_18

  • aspath_init

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

相关的数据结构如下:

BGP的ORF功能 bgp frr_客户端_19

 

  • attrhash_init

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

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

BGP的ORF功能 bgp frr_客户端_20

BGP的ORF功能 bgp frr_初始化_21

  • community

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

BGP的ORF功能 bgp frr_初始化_22

  • ecommunity

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

BGP的ORF功能 bgp frr_BGP的ORF功能_23

  • lcommunity

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

BGP的ORF功能 bgp frr_初始化_24

  • cluster

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

BGP的ORF功能 bgp frr_回调函数_25

  • transit

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

BGP的ORF功能 bgp frr_BGP的ORF功能_26

  • encap

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

BGP的ORF功能 bgp frr_回调函数_27

  • 路由表的初始化

BGP的ORF功能 bgp frr_客户端_28

BGP的ORF功能 bgp frr_BGP的ORF功能_29

BGP的ORF功能 bgp frr_回调函数_30

afi  网络类型(IPV4, IPV6)

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

lock 引用计数

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

  • route_map

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

BGP的ORF功能 bgp frr_回调函数_31

BGP的ORF功能 bgp frr_初始化_32

 

route_map 初始化 route_map策略的实现

BGP的ORF功能 bgp frr_初始化_33

具体的实现,后面再分析

 

  • mplsvpn

BGP的ORF功能 bgp frr_客户端_34

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

 

  • EVPN

bgp_ethernetvpn_init CLI的初始化

 

  • FLOWSPEC

bgp_flowspec_vty_init CLI的初始化

 

  • Access list

 CLI的初始化

BGP的ORF功能 bgp frr_BGP的ORF功能_35

功能后面分析

  • Filter list

CLI的初始化

BGP的ORF功能 bgp frr_BGP的ORF功能_36

功能后面分析

 

  • Prefix list

CLI的初始化

   

BGP的ORF功能 bgp frr_初始化_37

 

功能后面分析

 

  • Community list

CLI的初始化

/* Community list initialize. */

     bgp_clist = community_list_init();

 

  • BFD init

    

BGP的ORF功能 bgp frr_客户端_38

 

Main函数继续初始化

BGP的ORF功能 bgp frr_初始化_39

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

bgp_pthreads_run 创建线程

BGP的ORF功能 bgp frr_客户端_40

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

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

 

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