LABELED_UNICAST 的update消息和前面的不同点是在bgp_attr_parse解析属性的时候会调用bgp_mp_reach_parse解析BGP_ATTR_MP_REACH_NLRI,而在bgp_mp_reach_parse会处理label和vpn的一些选项,本地我们只说明处理label的,VPN的参照前面的文章。
在bgp_mp_reach_parse会解析label里面的nexthop属性,并保存在attr里面。
然后bgp_nlri_parse继续处理,labeled_unicast的处理函数是bgp_nlri_parse_label
同时我们也看下具体的MP_REACH_NLRI的报文
bgp_nlri_parse_label 解析报文主要完成下面的几件事情:
- 解析prefix 前缀和长度
- 解析label
- 准备好数据,调用bgp_update
bgp_update 前面已经大致说过,这次我们只说明下label-unicat的处理:
- has_valid_label处理会变成1,因为前面传入了解析出来的label值
- 在构建struct bgp_path_info的时候,如果label有值,还需要构建struct bgp_path_info_extra,然后把label值存放在info_extra里面
后续的处理和在路由更新章节的WORK_QUEUE处理的逻辑一样,在bgp_process_main_one函数里面调用bgp_zebra_announce通告ZEBRA路由,ZEBRA处理路由的解析在zebra章节也已经讲过,这里重点补充下label相关的处理。
- bgp_zebra_announce函数里面对nh label的处理,保存label信息
- zapi_route_decode 解析nh的label
- 生成nexthop的时候,如果有label,那么把label copy进nexthop
rib_process_add_fib处理LSP 下发的代码,我们继续跟踪下
这里又涉及到MPLS 的fec,简单理解就是保存了MPLS 转发表的in-label,而out-label保存在nh里面的label里面的,MPLS存放在NHLFE里面,LSP保存了整个LABEL转发路径。具体的数据结果的组织在MPLS里面讲解。
lsp_install 主要完成创建LSP,在LSP里面填充in-label和nhlfe的out-label,然后调用lsp_processq_add入队处理,入队后续的处理在MPLS章节讲解,这里就可以看到BGP的LABEL-UNICAT的label经过这样的处理就下发到了内核的MPLS转发表里面了。