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标签的初始化。
bgp_master全局变量综合所有这些,夸耀天下。
VRF初始化
VRF初始化,在FRR中VRF在linux上创建,处理整个过程,然后进行重新分析。
最重要的是被称为voidBGP_init(void )的函数
包括:
线程初始化
进行的初始化。 从上面可以看出,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感兴趣的事件,如路由器id、接口和分布式路由器
命令行初始化
是注册CLI。 没什么好说的。 CLI的实现也很复杂。 稍后再分析
属性相关初始化
aspath_initaspath_init初始化aspath的散列存储、散列报头ashash,所有aspath是否由全局散列存储?
相关的数据结构如下:
attrhash_init
attrhash_init 初始化属性的hash存储,hash头attrhash,所有的属性用全局的hash存放??
attr数据结构较大,包含了BGP的所有属性,AS_PATH,community,med, origin, local_pref, med等等
communitycommunity_init 初始化community的HASH,全局comhash存储,存放到全局干嘛??
ecommunityecommunity_init初始化ecommunity的HASH ,全局ecomhash存储
lcommunitylcommunity_init初始化lcommunity的HASH ,全局lcomhash存储
clustercluster_init 初始化 cluster 路由反射器的HASH,全局变量cluster_hash
transittransit_init初始化传输的属性的HASH,全局变量transit_hash
encapencap_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 listCLI的初始化
功能后面分析
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开始死循环,处理各种事件
初始化完成!!!!!!!!!