FRR BGP协议分析 1 --- BGP 初始化
FRR支持BGP-4,BGP-4+协议,BGP协议本身的知识点,可以参考很多资料,TCP/IP路由技术是一本不错的书,建议多看几次,还有红茶哥的博客和视频。
初始化在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) 这个函数里
包含:
- 线程的初始化
线程的初始化,从上面可以看出,FRR 也模拟出来了线程的概念但和linux的线程不一样,后续可以在聊聊,BGP 的线程包含bgpd/bgpd_io/bgpd_ka:
从名字上看,也知道他们的主要任务:
Bgp_pthread_run创建对应的线程,并运行起来。
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_v*n,SAFI_ENCAP)
lock 引用计数
route_table 路由表项的集合,与zebra使用的是同一个数据结构,存放路由表项
- route_map
初始化路由图的实现,并增加hook的回调函数
route_map 初始化 route_map策略的实现
具体的实现,后面再分析
- mplsv*n
MPLS v*n的初始化全是CLI的初始化
- Ev*n
bgp_ethernetv*n_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 创建线程
然后frr_run bgpd开始死循环,处理各种事件