一些定义与缩写
P4 Programming Protocol-independent Packet Processors,定义数据平面如何处理数据包
gRPC:Remote Procedure Calls,一个开源的客户端-服务器 RPC 框架
P4RT:P4Runtime (P4RT) 是一种控制平面规范,用于控制由 P4 程序定义或描述的设备的数据平面元素。
PI:Platform Independent representation of P4RT messages不会随着P4程序的改变而改变
PD:Program Dependent representation of P4RT messages 提升P4程序的可读性和安全性
ECMP: Equal Cost Multipath (ECMP):在到目的地址最短路径中的分离流量的路由协议
WCMP: Weighted Cost Multipath (WCMP)是一种路由协议,它根据不断变化的网络拓扑结构、可用链路容量在可用的下一跳之间分配流量。
PINS:P4 Integrated Network Stack (PINS):提供额外的部件变更SONiC并且允许栈能够通过P4和P4Runtime被远程控制
SAI: Switch Abstraction Interface (SAI)是一种标准化接口,允许以独立于供应商的方式对不同的交换机 ASIC 进行编程和管理。
P4RT应用程序是引入SONiC的组件的PINS,P4RT是一个API,它允许控制器转发流水线配置(由P4程序编译),并且能够通过gRPC连接控制流水线上的不同的元素
需求:
1)P4RT 应用程序应符合 p4 维护的开放标准。
2)支持SDN控制器链接并通过gRPC发送请求
3)在多个活动 SDN 控制器连接之间进行仲裁
4)验证转发管道配置(ACL、PacketIO),拒绝任何无法在 SAI 管道中实现的配置。
5)允许从 APPL_DB 中的 P4RT 表中插入、修改或删除 P4 表条目。
6)对每个请求做出成功/失败的回应
7)允许在APPL_DB中的P4RT表条目能反读取
8)支持 P4RT 定义的punt规则的数据包 I/O
设计
P4RT应用将在Docker容器中允许
一个控制器可以作为进行gRPC服务的用户,并编写回应SAI表(由P4程序定义)。这些条目用于 ASIC 数据库,但需要遵循 SONiC 架构,P4RT 应用程序将翻译并且规范化gRPC的请求并且在APPL_DB中写入输出,P4Orch(TODO:参考OA HLD)将解决这个请求image
每一个控制器可以限制对特定表的权限,且可以使用给予全部pipeline的权限的默认功能。
在这个实例中,P4RT应用将通过使用election ID仲裁所有客户所建立的连接,每一个role都有单独的朱连接并且,允许用户更新tables,所有其他的连接将成为备份,同时对pipeline只拥有只读权限
PINS通过使用P4编译器使SAI pipeline作为能够编译的P4程序,编译器产生P4Info来描述ASI pipeline中能够在P4RT应用中可控的部分(例如:表、counters、groups)
当P4RT应用验证了所有下层所需的配置信息,就会被写入APPL_DB中,所有P4RT应用的错误或下层的错误都会使配置失败
ACL Table Definitions
在配置SAI流水线时可以使用P4注释,这些注释会通过P4Info被发送给P4RT应用,P4RT应用会进行翻译:在APPL_DB中声明条目 OA层将会阅读这些定义然后了解配置的进程,P4RT应用将会等一段时间来获取成功/失败的信息
e.g(使用sai_action annotation)
// A SAI forwarding action for use during ACL ingress.
//
// The packet is assigned a color to be used by rate limiting checks if needed, and
// increments the ACL counter for this rule.
@sai_action(SAI_PACKET_ACTION_FORWARD)
action forward() {
acl_ingress_meter.read(local_metadata.color);
acl_ingress_counter.count();
}
similarly a match qualifier for IPv4 packets may use a @sai_field like:
// Model the ACL Ingress stage.
table acl_ingress_table {
key = {
// Allow flows to match on IPv4 packets. ACL qualifiers are marked 'optional'
// and will be ignored if unset.
//
// If set and the packet has a valid IPv4 header when reaching the ACL Ingress
// stage the qualifier will match.
headers.ipv4.isValid() : optional @name("is_ipv4") @id(2)
@sai_field(SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE/IPV4ANY);
}
}
Writing (insert/modify/delete) into the P4RT APPL_DB Table
P4RT使用PI(Platform independent)请求标准来读写,P4RT应用负责将这些请求翻译成APPL_DB条目
WCMP/哈希
WCMP 组启用权重调整后的成员选择,作为路由条目匹配的操作。根据从数据包标头的选定字段计算的哈希值,选择其中一个成员进行数据包转发。
P4RT中的WCMP功能有2个部分,首先是为不同数据包选择数据包标头字段,要使用的哈希算法等,第二部分是实际的WCMP组,成员和路由条目定义。前者的值位于 P4Info 文件中,后者位于写入请求中。
OrchAgent 添加了一个新的业务流程协调程序 HashOrch,负责在SWITCH_TABLE中对与哈希相关的 SAI 属性进行编程。哈希条目的APP_DB格式在 P4RT 架构 HLD 中进行了描述。
响应路径
P4RT 应用程序需要向南发送到 OrchAgent 的每个请求(成功和失败)的响应状态。这可确保发出请求的外部客户端了解状态并可以相应地响应。
在较高级别,syncd在同步模式下运行,OrchAgent通过单独的通知通道将操作的硬件状态中继回P4RT应用程序,并将所有成功的响应写入APPL_STATE_DB。此抽象不同于不提供应用程序级响应的现有STATE_DB。P4RT 应用程序使用APPL_STATE_DB在特定请求失败时还原APPL_DB中的条目。
P4 prgrams & P4Info
SONiC介绍
SONiC 是一个基于 Linux 的开源网络操作系统,可在多个供应商和 ASIC 的交换机上运行。SONiC提供了一整套网络功能,如BGP和RDMA,这些功能已经在一些最大的云服务提供商的数据中心进行了生产强化。它为团队提供了创建所需网络解决方案的灵活性,同时利用了大型生态系统和社区的集体力量。
用户应使用默认用户名/密码"admin/YourPaSsWoRd"通过控制台端口登录设备。
BGP:Broder Gateway Protocol
————————————————————————————————
P4Runtime是最经常使用的数据平面API
(Application Programming Interface,应用程序接口)
为实施RPC,它依赖于带有 protobuf 的 gRPC 框架。
gRPC?A high-performance, open-source universal RPC framework
所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样
典型的RPC结构图