P4-16 系列 – Control block

5 月 8, 2018

在設計好 Table 以及 Action 之後,需要將它們放於 Control block 當中。

Control block 可以視同一個 Pipeline 的藍圖,而不同的架構或是裝置可能支援多個 Pipeline,例如 v1model 的 Ingress 以及 Egress Pipeline。

在撰寫 Control block 必須要先了解要使用的架構所需求的 Control block 的格式,例如 v1model 所需要的 Ingress Pipeliner 長這樣:

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

在 v1model 的 Ingress Pipeline 中,需要自行定義好所使用的 Header 以及 Metadata,且必須要包含 v1model 所提供的 Metadata。

若是自行設計的架構以及 Backend compiler,則不一定要遵照這樣的格式,自行設計架構以及 Backend compiler 會在之後的章節提到。

以 v1model ingress pipeliner 為例,基本的 Control block 撰寫方式如下:

control my_control(inout my_headers hdr, inout my_meta meta, inout standard_metadata_t standard_metadata) {
    action foo() {
        // action code here....
    }

    table my_table {
        // table description
    }

    table my_table_2 {
        // table description
    }

    apply {
        my_table.apply();

        if (something is true) {
            my_table_2.apply();
        }
    }

}

Pipeline 主要是描述於 apply 這一個區塊當中,用來表示每一個封包需要經過的 Table 的順序以及規則,也可以在 apply 裡面使用 if/else if/else 來決定某些 Table 是否要被執行。

Control block 中除了 action, table 以及 apply 以外,不同的裝置(target)可能有提供其他而外功能可以放置在 Control block 當中,例如 v1model 提供的 meter 以及 counter 等。

下一章節要說明如何使用供應商所提供的 arch.p4(如 v1model.p4)來撰寫一個完整的 P4 程式。

發佈留言

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

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