大家好,欢迎来到IT知识分享网。
本篇翻译自doc/developer/fpm
一、FPM概述
FPM代表Forwarding Plane Manager(转发平面管理器),它是一个用于Zebra的模块。
与FPM交换消息的封装头由frr树中的文件“FPM/FPM.h”定义。路由本身以Netlink或protobuf格式编码,Netlink是默认格式。
Netlink是Linux中对消息进行编码以与内核空间进行通信的标准格式,也是它所使用的套接字类型的名称。FPM netlink的使用与Linux的不同之处在于:
- Linux netlink套接字以多播方式使用数据报,FPM用作流,并且是单播的。
- FPM网络链接消息可能比正常消息包含更多或更少的信息
Linux netlink套接字消息(例如:RTM_NEWROUTE可能会添加一个额外的路由属性来通知VxLAN封装)。
Protobuf是许多新的序列化格式之一,其中消息模式用专门构建的语言表示。从模式生成用于对有线格式进行编码/解码的代码。Protobuf消息可以很容易地扩展,同时保持与旧代码的向后兼容性。Protobuf与Netlink相比具有以下优势:
- 用于序列化/反序列化的代码是自动生成的。这降低了出现错误的可能性,允许快速集成第三方程序,并使添加字段变得容易。
- 消息格式不与操作系统(Linux)绑定,可以独立发展。
目前,“zebra”中有两个FPM模块:
- “fpm“
- “dplane_fpm_nl“
1.1 fpm
第一个FPM实现是使用“zebra”路由处理函数中的钩子构建的。它使用自己的netlink/protobuf编码函数将“zebra”路由数据结构转换为格式化的二进制数据。
1.2 dplane_fpm_nl
新的FPM实现是使用“zebra”的数据平面框架作为插件构建的。它只支持netlink,并共享“zebra”的netlink函数,将路由事件快照转换为格式化的二进制数据。
二、协议规范
FPM(在任何模式下)使用TCP连接与外部应用程序进行通信。它作为TCP客户端运行,并使用CLI配置的地址/端口连接到FPM服务器(默认为端口“2620”)。
FPM用一个标头将所有数据帧化,以帮助外部读取器计算它必须读取多少字节才能读取完整消息(这有助于模拟数据报,就像在最初的netlink Linux内核使用中一样)。
2.1 帧头:
2.12 版本
目前只有一个版本,因此应该始终为“1”。
2.3 消息类型
定义我们使用的下划线协议:netlink(`1’`)或protobuf(`2’`)。
2.3 消息长度
此帧中按网络字节顺序排列的数据量。
2.4 数据
netlink或protobuf消息负载。
2.5 来自ASIC的路由状态通知
dplane_fpm_nl能够从底层fpm实现读取路由网络链接消息,该消息可以告诉zebra路由是否已卸载/失败或受阻。
最终开发人员必须将数据发送到已创建的同一套接字,以侦听来自Zebra的FPM消息。发送的数据必须具有“Frame Header”,“Version”设置为1,“Message Type”设置为1,以及适当的消息长度。消息数据必须包含RTM_NEWROUTE网络链接消息,该消息发送与路由相关联的前缀和下一跳。最后,rtm_flags必须包含rtm_F_OFFLOAD、rtm_F_TRAP或rtm_F_OOFFLOAD_FAILED,以表示ASIC中的路由发生了什么。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/138008.html