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的初始化,FRR 里面VRF是在linux上创建的,整个流程的处理,后续再分析。
包含:
线程的初始化,从上面可以看出,FRR 也模拟出来了线程的概念但和linux的线程不一样,后续可以在聊聊,BGP 的线程包含bgpd/bgpd_io/bgpd_ka:
从名字上看,也知道他们的主要任务:
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的hash存储,hash头ashash,所有的aspath用全局的hash存放??
相关的数据结构如下:
attrhash_init 初始化属性的hash存储,hash头attrhash,所有的属性用全局的hash存放??
attr数据结构较大,包含了BGP的所有属性,AS_PATH,community,med, origin, local_pref, med等等
community_init 初始化community的HASH,全局comhash存储,存放到全局干嘛??
ecommunity_init初始化ecommunity的HASH ,全局ecomhash存储
lcommunity_init初始化lcommunity的HASH ,全局lcomhash存储
cluster_init 初始化 cluster 路由反射器的HASH,全局变量cluster_hash
transit_init初始化传输的属性的HASH,全局变量transit_hash
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使用的是同一个数据结构,存放路由表项
初始化路由图的实现,并增加hook的回调函数
route_map 初始化 route_map策略的实现
具体的实现,后面再分析
MPLS VPN的初始化全是CLI的初始化
bgp_ethernet_init CLI的初始化
bgp_flowspec_vty_init CLI的初始化
CLI的初始化
功能后面分析
CLI的初始化
功能后面分析
CLI的初始化
功能后面分析
CLI的初始化
/* Community list initialize. */
bgp_clist = community_list_init();
Main函数继续初始化
frr_config_fork 后面分析,没看明白处理啥
bgp_pthreads_run 创建线程
Bgp_pthread_run创建对应的线程,并运行起来。
然后frr_run bgpd开始死循环,处理各种事件