# P4Runtime
P4Runtime は、スイッチのフォワーディング挙動を制御するための gRPC インターフェースである。[[Stratum]] 側の server 側 RPC スタブと、SDN Controller 側の client 側スタブを合わせて、両者間の **P4Runtime Contract** が実装される。[[P4]] 言語がフォワーディングパイプラインの振る舞いを記述するのに対し、P4Runtime はそのパイプラインへ実行時にテーブルエントリを読み書きするための制御インターフェースであり、両者は役割が異なる。(Source: [[@2021__SystemsApproach__Software-Defined Networks - A Systems Approach - Chapter 5 Switch OS]] ch.5 §5.2)
## 契約の自動生成
P4 コンパイラは (1) 各スイッチングチップにロードされるバイナリと、(2) そのチップを間接的に Switch OS 経由で制御するランタイムインターフェースの両方を生成する。コンパイラはベンダー固有バックエンドの助けを借りてこれを行い、バックエンドは特定のアーキテクチャモデル(`arch.p4` で定義される)向けに書かれる必要がある。つまり P4 言語・ASIC 固有バックエンド・アーキテクチャモデルの3つの組み合わせが、データプレーンへ機能を注入するプログラミング環境を定義する。(Source: ch.5 §5.2)
コンパイラが出力する `p4info` ファイル(例: `forward.p4info`)は、P4Runtime Contract を specify する protobuf 定義であり、コントローラとスイッチの双方に対し、テーブルへエントリを挿入・読み取り・変更・削除する一連の gRPC メソッドをどう書式化・解釈すべきかを伝えるのに十分な情報を含む。table・counter・meter などの制御可能な要素とその属性が、ソース P4 プログラムから抽出された構造化フォーマットで提供される。原理的には p4info ファイルは必須ではなく、コントローラとスイッチはソース P4 プログラムから必要な情報を導出することもできるが、p4info は protobuf ライブラリで解析しやすい形にすることでこれを容易にする。(Source: ch.5 §5.2)
## コントローラからの利用
一般には ONOS のような SDN コントローラが間接的にスイッチと相互作用するが、より単純な例として、Python プログラムが P4Runtime ライブラリ(`p4runtime_lib`)の助けを借りて直接テーブルへエントリを書き込む例が示される。`p4info_helper.buildTableEntry(...)` でテーブル名・マッチフィールド・アクション名・アクションパラメータを指定してエントリを組み立て、`WriteTableEntry(table_entry)` で書き込む。(Source: ch.5 §5.2)
## SONiC/SAI との統合の取り組み(PINS)
[[SONiC]] と Stratum のアプローチを統合しようとする取り組み PINS (P4 Integrated Network Stack) の目標の一つは、リモートの SDN コントローラ/アプリが P4Runtime と [[gNMI]] を使って SAI と相互作用できるようにすることである。これは、SAI の振る舞いモデル・パイプラインを P4 プログラム(`sai.p4`)で新たに表現することに依拠する。(Source: ch.5 §5.4)
## 関連
- [[P4]] — P4Runtime Contract を生成する元となるフォワーディングパイプライン記述言語
- [[Stratum]] — P4Runtime を主要ノースバウンドインターフェースの一つとして公開する Thin Switch OS
- [[gNMI]] — Stratum が公開する構成インターフェース。P4Runtime とは役割が異なる(フォワーディング対構成)
- [[SONiC]] — PINS を通じて P4Runtime によるアクセスを取り込もうとする対抗プロジェクト
- [[@2021__SystemsApproach__Software-Defined Networks - A Systems Approach - Chapter 5 Switch OS]]
## 出典
- Peterson, Cascone, O'Connor, Vachuska, and Davie, *Software-Defined Networks: A Systems Approach*, 2021, Chapter 5: Switch OS, §5.2, §5.4. https://sdn.systemsapproach.org/stratum.html