P4Runtime & P4 Info 簡介

P4 Runtime 是一套基於 Protobuf 以及 gRPC 框架上的協定,透過 P4 Runtime,SDN 控制器或是使用者可以控制支援 P4 的裝置。

P4 Runtime 目前是由 P4 API Workgroup 所制定,這一個 Group 裡面主要的人員是來自於 Barefoot,也有其他公司參與。

目前 P4 Runtime 還在開發階段,但大多數需要的功能都已經被支援,例如操作 Table Entry 或 Action profile、查詢 Counter 等等。

除了上述的特點以外,使用者或是控制器也可以透過 P4 Runtime 去修改裝置上的 pipeline,且 P4 Runtime 並不會因為裝置上使用不同的 P4 配置而改變。

與 OpenFlow 不同的點除了具備高度彈性的訊息格式以外,控制器與裝置之間連線的順序也不一樣,以往 OpenFlow 是需要由控制器開啟特定埠口,然後裝置連上控制器。

而 P4 Runtime 的設計則是在裝置上開啟 gRPC server ,由控制器聯繫裝置,因此在裝置上都會有一個代理人(Agent )負責處理由控制器來的連線。

Screen Shot 2017-10-25 at 10.34.27 PM

方才有提到,P4 Runtime 是透過一個 protobuf 檔案所定義出來,我們可以在 P4 官方的 GitHub 上找到相關的定義:

https://github.com/p4lang/PI/blob/master/proto/p4/p4runtime.proto

下圖節錄自 p4runtime.proto,這一份 protobuf 中定義了相關的訊息格式,舉例來說,一個 TableEntry 包含了 table_id、多個 FieldMatch、TableAction、priority 以及相關的 metadata。

Screen Shot 2017-10-25 at 10.35.49 PM

gRPC 除了提供單方向的 RPC 介面以外,也提供雙向的 stream channel,舉例來說有時候我們會希望 switch 做 Packet-In/Out 的動作,這部份就需要用到 stream channel 來實作,而 P4 Runtime 也提供相關訊息格式供這類型的需求使用。

在上圖中我們看到,當要對裝置裡面的資訊進行操作時,需要使用一個 unsigned int 型態的 ID 而非名稱,名稱與 ID 對應關係必須透過讀取 P4 Info 設定檔來獲得。

原則上在編譯階段,前端的編譯器(front-end compiler)除了將原始的 P4 檔案編譯成中間碼(IR)以外,也會將名稱與 ID 資訊轉換成 P4 Info 檔案,P4 Info 檔案將會與編譯好的 P4 binary(bmv2 -> json, Tofino -> bin)一起傳送給裝置上的 Agent,而 P4 Info 也會匯入給控制器供控制器去查詢。

Screen Shot 2017-10-25 at 10.36.28 PM

圖源自於:S. Abdi, W. Mohsin, Y. Yetim, A. Ghaffarkhah.P4 Program-Dependent Controller Interface for SDN Applications. P4 Workshop 2017

下面是將 P4 原始碼轉換成 P4 Info 的例子,在 P4 Info 中並不會存在名稱,所有的名稱都會轉換成 ID 表示,而不同的 ID 會指向不同的資訊,像是 Table 或是 Match Field 等等。

Screen Shot 2017-10-25 at 10.37.22 PM

圖源自於:S. Abdi, W. Mohsin, Y. Yetim, A. Ghaffarkhah.P4 Program-Dependent Controller Interface for SDN Applications. P4 Workshop 2017

 

當控制器拿到 P4 Info 之後,即可透過 P4 Info 來產生 P4 Runtime 的訊息,下面範例展示了一個用於 vrf_classifier_table 這個 Table 的 Table Entry。

Screen Shot 2017-10-25 at 10.37.46 PM

圖源自於:S. Abdi, W. Mohsin, Y. Yetim, A. Ghaffarkhah.P4 Program-Dependent Controller Interface for SDN Applications. P4 Workshop 2017

下方表格整理目前 P4 Runtime 提供的 PRC 介面以及相關說明:

RPC 名稱 用途
Write 新增、刪除以及修改
Read 查詢
SetForwardingPipelineConfig 改寫裝置的 Pipeline 設定
GetForwardingPipelineConfig 讀取目前裝置的 Pipeline 設定
StreamChannel 開啟兩個 Stream Channel,兩個 stream 代表不同方向

另外 p4runtime.proto 中還有諸多訊息格式定義,詳見該檔案。

在〈P4Runtime & P4 Info 簡介〉中有 5 則留言

    1. Controller 透過 P4 Runtime 去控制 switch 時,需要使用相關的 id(table id, action id…),這些 id 記錄在 P4Info 檔案中

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料