BGP 方案设计
原生架构图
采用 FRR 和 VPP 进行结合的方法,FRR 产生的 BGP 报文最终要通过 VPP 发送出去,VPP 接收对端发来的 BGP 报文传送到 FRR,报文交互后,FRR 再把产生的路由表信息写入 VPP 里面,这样后续的数据报文可查询 VPP 的路由表直接发出。
VPP 节点流转设计
更改原生的架构,将 FRR 的流量引入 VPP 的协议栈中,可以对相关报文进行再次封装并按 VPP 的配置转出;同时 VPP 接收的流量,只将需要的报文转到 FRR 中进行交互即可。
目前的局限性与解决方法
不是所有的端口都能生成对应的 tap 端口,比如 gre 口,所以针对这样的场景,暂时的解决方法是再引入一个端口,可以是物理口,也可以是 loopback 口,在这个端口的 tap 设备上配置和对应 gre 口一样的 ip,这样的话,这个端口在 vpp 里面是不呈现出 ip 的,可将这个端口的流量引入 gre,回来的包将 gre 的流量再送到这个端口。可以看下面的测试场景:
代码流程
出包流程
回包流程
遗留问题
需配置静态 arp
VPP 收到的 arp 报文不能送到 linux,所以不能建立 arp 表项,暂时配置静态 arp 来规避。
生成的路由表出接口不正确
FRR 交互成功后, 往 VPP 下的路由表,出端口是那个引流口(可参照上面的 gre 拓扑),这样是不正确的,应该将出端口设置成 gre 口,但目前测试暂不关心,之后可阅读代码,再进行解决。