透過 ONOS 來控制 bmv2 switch:default pipeline 簡介

ONOS 中有提供一個預設的 pipeline,稱為 default pipeline,目前 P4 檔案可以在 $ONOS_ROOT/tools/test/p4src/p4-16/default.p4 找到,default pipeline 簡化後長得像這樣:

default

這邊介紹一下每一個區塊的功用:

packet io ingress:

檢查 packet out header 是否存在,如果 packet out 存在的話,將 egress port 從 header 取出,寫到 output port metadata 中。

ingress:

包含了幾個部分,首先會確認 packet out 是否存在,如果存在的話,則會直接略過 table,直接送到 port conunter control 以及 egress。

如果 packet out header 不存在的話,則會送往 table0

table0:

可以 match 的 key 僅有:in port, ethernet src, ethernet dst 以及 ethernet type 這幾個,而這些 key 都是 ternary key,所以可以做出不同類型的 match 組合,舉例來說可以僅 match ethernet type

可以做的 action 包含了 set_egress_port,send_to_cpu, do_ecmp 以及 drop

set_egress_port 以及 send_to_cpu 這兩個僅是修改 metadata 中的 egress port,switch 的 traffic manager 收到之後會送到特定的 port 上去,如果 egress port 是 CPU port 的話,則之後會透過 packet in 的方式送到 controller 上面。

do_ecmp 的功能目前僅有定義,還沒有相關的 app,若 table0 執行的 action 是 do_ecmp 的話,則封包將會進一步送到 ecmp table 進行處理。

ecmp:

table0 在執行 do_ecmp 這一個 action 功能時,會在 metadata 中先設定一個 ecmp group id,而 ecmp table 會 match 這一個 ecmp group id,當 match 到一個 group id 時,會執行一個 P4 的 action profile group,並且使用其他的 header 去做 hash 選擇一個 action profile member,而 member 會執行 set_egress_port 這個 action。

port counter control:

當封包到達這裡時,會去檢查封包的來源以及去向,如果來源與去向都是合法的話(非邏輯 Port),就會進行統計,往後 Controller 就可以從各個 port counter 拿取資訊。

packet io egress:

當前面有任何一個 table 把封包要送往的 port 設定成 CPU port 時,會將 packet in 的 metadata 設定成 valid,並把這一個封包的來源 port 寫入 packet in metadata 中,寫完之後就會連同 packet in metadata 一起送至 controller 中。

以上就是 ONOS default.p4 的簡介,在未來會將這一個 P4 檔案移至 $ONOS_ROOT/pipelines/basic 中,並改名為 basic.p4,主要的原因是因為不想讓 default 這一詞與 java 中其它的東西搞混。

發佈留言

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

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