P4-16 系列 – Package

5 月 8, 2018

這一篇要說明 P4-16 是如何將原有 P4-14 許多預設的功能拆出來透過像是 library 的方式打包,以及一個 P4-16 的主要的骨架/藍圖是如何去撰寫的。

當要基於一個「架構」(例如 v1model, eBPF, VSS 或是 PSA)去撰寫一個新的 pipeline 時,首先需要先了解初始化的時候需要給他什麼樣的資訊,在 P4-16 中,我們會將這些資訊放入一個 package 當中。

以下透過官方所提供的 v1model 為範例進行說明

v1model 的 package 定義如下(取自 v1model.p4):

package V1Switch(Parser p,
                       VerifyChecksum vr,
                       Ingress ig,
                       Egress eg,
                       ComputeChecksum ck,
                       Deparser dep
                       );

透過上述程式可以了解到說 v1model 會需要 parser/deparser, checksum verifier/computer, ingress/egress pipeline, 這幾個東西,而這些東西都也有他的定義,例如在 v1model.p4 中明確的規定了 Ingress 這個 control block 的規格:

@pipeline
control Ingress(inout H hdr,
                      inout M meta,
                      inout standard_metadata_t standard_metadata);

因此若是要製作可以適用於 v1model 的 ingress control block,則會需要包含了自定義的 header、自定義的 metadata 以及 v1model 所定義的 standard metadata。

在撰寫一個標準的 P4-16 程式時,官方建議引用 core.p4 這一個標準函式庫,裡面定義了 P4-16 的基本需求,例如 Error 的類型、特定的 match 類型,或是 parser 所需要的額外功能。

一個比較完整的 P4-16 程式寫起來如下:

# include <core.p4>
# include <v1model.p4>

/* header 定義 */
/* parser/deparser 定義 */
/* control blocks 定義 */
/* checksum compute/verify 定義 */

V1Switch(parser(), checksum_verify(), ingress(), egress(), checksum_compute(), deparser()) main;

其中 main 就是整個 P4-16 程式的進入點,P4-16 的 IR, eBPF compiler 以及 bmv2 compiler 實作上也是看 “main” 這以個關鍵字作為進入基準點:

const cstring P4Program::main = "main";
/* ... */
auto main = program->getDeclByName(IR::P4Program::main);

若是需要更詳盡的範例,可以到這邊了解。

上面講述了如何使用他人所提供的框架去實作想要的 P4-16 pipeline,但如果今天需要自行研發一個自己的 P4 target,除了沿用目前已經定義好的框架以外,也可以自行定義新的框架並自行撰寫一個新的 Backend compiler。

P4-16 的其中一個設計理念就是希望能夠讓晶片/設備製造商提供他們能提供的功能,而非局限於已經定義好的框架上,接下來幾篇文章會透過範例去說明如何撰寫新的 P4-16 框架以及新的 Backend compiler。

發佈留言

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

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