ONOS 中有提供一個預設的 pipeline,稱為 default pipeline,目前 P4 檔案可以在 $ONOS_ROOT/tools/test/p4src/p4-16/default.p4 找到,default pipeline 簡化後長得像這樣:
這邊介紹一下每一個區塊的功用:
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 中其它的東西搞混。