一些定義與縮寫
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結構圖