P4-16 系列 – Table, Action

P4-16 的 Table 與 Action 的定義方式與 P4-14 並沒有太大的差異。

Action 的部份,定義與一般語言的 function 相似:

action route(bit<48> dmac, bit<9> out_port) {
    hdr.eth.dst_mac = dmac;
    standard_metadata.egress_spec = out_port;
}

action nop() {
}

在 P4-14 當中有許多 primitive action/API 可以去呼叫,但在 P4-16 皆被移到了廠商所定義而外的函式庫中(arch.p4 或 vendor.p4),當然,還是有保留部分需要(建議)支援的功能於 core.p4 當中。

這樣可以讓 P4 各家有彈性,不需要要求每一個 P4 的 target 都需要去支援所有的 API,僅需要支援自己能支援的功能即可。這部分會在後面 Package 的章節說明。

一個 Table 主要包含了一組 Match(key) 以及一套該 Table 可以用的 Action。

舉例來說:

table ipv4_routing {
    key = {
        hdr.ipv4.dst_addr: ternary;
    }

    actions = {
        nop;
        route;
    }
}

上述包含了一個 IPv4 的 Match 以及兩個 Action。

除此之外,Table 中還可以增加一些而外的屬性,P4-16 中預設的屬性包含了:

  • default_action: 當 table miss 時預設會執行的動作
  • counters: 計數器
  • size: table 大小
  • implementation: 指定 table 的實際實作方式,這部份通常是取決於 backedn compiler 或是廠商所提供的架構;例如 v1model 所提供的 ActionProfile 就提供了透過 hashed 的方式隨機選擇一個 ActionProfileMember 去執行。
  • const entries: 可以事先指定好預設的 table entry,在 Compile 階段時就會一併寫到編譯好的檔案中。

除了上述屬性之外,若是使用自定義的 Backend compiler,則還可以自行定義想要的屬性。P4-16 Compiler 的設計之後會說明。

在定義好 Table 以及 Action 之後,需要將這些 Table 放至於 Control Block 中,Control Block 將會在下一章節說明。

發佈留言

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

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