本次继续分析BGP最简单的配置的代码实现,这样大家对BGP的框架会有进一步的熟悉:
router bgp 200
bgp router-id 2.2.2.2
neighbor 3.3.3.3 remote-as 200
neighbor 3.3.3.3 update-source 2.2.2.2
router bgp XX
命令执行函数是router_bgp_cmd,主要完成以下几点:
- 根据参数查找bgp 对象是否存在,第一个配置的route bgp XX将作为default,后续带vrf的将作为新的bgp对象
- 如果bgp对象不存在,则需要重新创建一个bgp对象,struct bgp *bgp,所有的bgp对象存放在struct bgp_master *bm链表里面,此时BGP 最重要,贯穿全局的顶级结构体struct bgp闪亮登场,后续都会和这个结构体打交道,和bgp相关的几乎都在这里面,也是BGP最大的一个结构体。
3、创建bgp对象是bgp_get函数,调用如下的几个函数:
- bgp_create 函数会创建新的struct bgp结构,并初始化里面很多的值和数据结构,其中最重要的peer对象,我们在下一个命令在分析
- bgp_router_id_set 处理router_id
- bgp_address_init 建立 bgp address的HASH ??什么地址?
- bgp_tip_hash_init ??
- bgp_scan_init 没懂,后续再补充
- 处理VRF相关的事情
- bgp_handle_socket 创建对应的socket,bgp是使用TCP 建立连接的,建立socker服务端,监听179端口,等待peer端的connect接入,其中会处理和VRF相关的socker创建的细节
- listnode_add(bm->bgp, bgp) -》加入全局的bgp链表
neighbor 3.3.3.3 remote-as 200
neighbor peer remote-as 命令就是配置一个对等体,peer是指对等体的地址(ipv4,ipv6地址),可以看到,bgp对等体之间是单播通信和OSPF协议的组播是不一样的。
对于路由协议,不管是基于3层的还是2层的,都需要建立自己的寻路数据库,也就是通过邻居找到下一跳,你要走的远,你就得认识更多邻居,以及邻居的邻居,好比一句老话,在家靠父母,出门靠朋友,朋友多路好走,就这么一个道理。
那么话又说回来了,创建对等体呢,就是给自己找邻居,找朋友,不过呢,BGP这个人呢,更像一个干中介的,比如卖房的中介,他自己不建房子,只把建好的房源介绍给要买房的人,同时还维护这个房源信息库,及时更新已经卖掉的房子。
peer_remote_as_vty处理CLI的命令,
如果传给peer的值不是一个合法的地址,那么会被当做是一个peer group/interface名称来处理,如果是合法的,检查下地址是否是本地的,如果不是,peer_remote_as 则开始peer创建的奇妙之旅。
按照国际惯例,查找一下是不是已经为这个peer地址创建了peer,如果peer地址相同,as值不一样,就修改一下peer的as值,如果这个peer已经是某个group的成员,那么就不能成功创建对等体关系了。
如果上面的事情都没有发生,那么就可以创建一个新的对等体了,peer_create负责创我们的peer:
- 创建一个新的peer结构,并给里面的status赋值为Idle,端口号 BGP_PORT_DEFAULT = 179,初始化大部分的数据结构。
- 初始化peer的ibuf和obuf来收发报文
- peer会加入bgp->peer的链表,以及peerhash的HASH表里面
- 在把peer加入对应的地址族里面
- 最后,将这个peer加入到定时器任务中:
开启start timer定时器,定时器到期后,开始peer的状态机协商,最简单的配置已经分析完成,后面开始BGP 状态机的协商和分析。