SONiCプラットフォーム今昔(2) SONiC-P4

# はじめに

SONiC-P4について紹介しますが、その前にP4について簡単に紹介します。その関係でBarefoot Tofinoに関しても少しだけ触れています。

# P4?
P4はDSLの一種で、つまるところプログラミング言語のひとつです。パケット処理に特化したプログラミング言語で、ターゲットはハードウェア(プログラマブルASIC, FPGA)からソフトウェアまでカバーするとされています。おおまかには、下記のような処理を(L2転送やL3ルーティングなども含めて)Human readableな手続き型プログラミング言語で記述します。

- (パケットの受信)
- パケットヘッダからデータの抽出
- 別途用意してあるテーブルと抽出したデータを照合し解析
- 解析結果に従い処理分岐
- 捨てるべきパケットであれば破棄
- 必要に応じてパケットヘッダの変更
- (パケットの送信)

記述したプログラムをP4コンパイラに通すことで、ターゲットに応じた出力を得られるというものです。[DPDKを呼び出すC言語プログラムを出力するP4コンパイラ](https://github.com/P4ELTE/t4p4s)も存在します。

2015年発足の[P4言語コンソーシアム](https://p4.org/)はP4言語に関する仕様を議論し決定していく会議体ですが、P4を取り巻く環境やP4の適用事例が広がるに従い、言語としてのP4そのものだけではなく標準ライブラリ仕様やテーブルデータの機器間通信ライブラリなど、扱う内容も多岐に渡ってきています。

日本でのP4関連の活動ですが、2019年に[日本P4ユーザ会](https://p4users.org/)が発足され、日本国内でのP4の情報発信の中心となっています。参加無料、コミュニティベースですが、P4で研究開発されている方、P4を扱えるハードウェア製品を扱うベンダーの方、P4対応ハードウェアを使って応用ビジネスをされてる方など集まっていますので、P4採用を検討されてる方だけでなくP4に興味があったりP4に関する知見を得たいといった場合は、参加してみるといいように思います。

# SONiCとP4

SONiCはホワイトボックススイッチ用のソフトウェアですが、世の中にはP4をサポートしたプログラマブルASICを搭載したホワイトボックススイッチがありまして、サポートされているハードウェアであればそのスイッチ上でSONiCを動作させることができます。それによって、結果として間接的にSONiCでP4(でプログラムされた処理)を利用することがある、という関係になります。

## platform/barefoot
SONiCは、Barefoot Networks (現在はIntelに買収) のTofinoという名前のP4対応プログラマブルASICを搭載したホワイトボックススイッチをサポートしています。具体的には下記ハードウェアがサポートされています。

- Arista [7170-32C](https://www.arista.com/jp/products/7170-series)
- Arista [7170-64C](https://www.arista.com/jp/products/7170-series)
- Edgecore [Wedge 100BF-32X](https://www.edge-core.com/productsInfo.php?cls=1&cls2=5&cls3=181&id=335)
- Edgecore [Wedge 100BF-65X](https://www.edge-core.com/productsInfo.php?cls=1&cls2=5&cls3=181&id=334)
- Ingrasys S9180-32X
- Ingrasys S9280-64X
- WNC [OSW1800](https://www.wnc.com.tw/mobile/index.php?action=product_detail&top_id=106&scid=142&tid=99&lid=99&id=353)

当たり前の話ですが、Barefoot Tofinoを搭載していてもSONiCがサポートしていないホワイトボックススイッチもありますので、入手を検討される場合はご注意ください。

### P4言語のカスタム処理をSONiCに付加する
APRESIA Systems株式会社の熊谷さんがJANOG45 Meetingで発表されていました。

- [SONiCとP4ハードウェアにて実現するSRv6サービスチェイニング](https://www.janog.gr.jp/meeting/janog45/program/srv6sfc)

スライドの17ページに、SONiCのどこに手を加えたか簡単な図示があります。

SONiCでは、Barefoot SDE (Software Development Environment) のコンパイル済みバイナリを取得してBarefoot ASIC向けホワイトボックススイッチ用のインストールイメージをビルドしますので、具体的にどこにどう手を加えればP4の追加処理を組み込めるのか不明です。もしかするとNDAを締結してTNA(Tofino Native Architecture)の情報を得る必要があるかも知れません。

もし自分でP4コードをSONiCに組み込みたいという場合は、発表者まで問い合わせていただければと思います。

## platform/p4 (SONiC-P4)
P4のBehavior Model(動作モデル)であるBMv2と呼ばれるソフトウェア実装があるのですが、そのBMv2をターゲットとしたものです。SONiC-P4と呼ばれます([紹介ページ](https://github.com/Azure/SONiC/wiki/SONiC-P4-Software-Switch))。

プロセッサやメモリと言ったリアルハードウェアをエミュレーションする仮想マシンではないのですが、SONiC-P4はソフトウェアスイッチです。紹介ページに書かれたとおりの手順で構築すれば書かれている通りのデモが実際に動作します。

# SONiC-P4の現在

[JenkinsのCI/CD結果](https://sonic-jenkins.westus2.cloudapp.azure.com/job/p4/job/buildimage-p4-all/)を見ると、「現在、このプロジェクトは無効です。」と書かれています。理由は単純、ビルドに失敗し続けていて修正されない状態が1年以上続いているためです。

なぜか。

BMv2はそのままではSONiCで使えません。SAIのAPIが呼び出されることによってBMv2を制御する必要があります。その実装として、現在SONiCではMellanoxさんが公開している[SAI-P4-BM](https://github.com/Mellanox/SAI-P4-BM)を参照しています。

しかし、見ていただければわかるとおりSAI-P4-BMは年単位で更新されないままとなっています。SONiC自身が利用するSAIのバージョンはOCPによるSAI仕様の更新に追従しているのですが、SAI-P4-BMがそれについていけていないため、SAIのバージョン不整合でビルドに失敗しているのでした。

実は[OCP SAI仕様のリポジトリ](https://github.com/opencomputeproject/SAI)にもBehavior Modelの参照実装が用意されているようですので、そちらを使うよう変更することができればSONiC-P4は復活させられるかも知れません。(簡単にできそうならと思って試してみましたが、BMのビルドの想定がMellanoxとOCPとでかなり違っていて、整合性を保つことが難しくて挫折しました……)

つまるところ、SONiC-P4は開発凍結されているというのが現状で、残念ながら最新のSONiCがサポートする機能を試すことはできません。

# おわりに

ソフトウェア実装でSONiCを試したい場合は、[SONiC-VS](https://github.com/Azure/sonic-buildimage/blob/master/platform/vs/README.vsvm.md) (Virtual Switch)を使うのがいいでしょう。こちらはKVMやdockerで動作する仮想マシン実装となります。ちょっとしたテストであれば[GNS3を使う](https://github.com/Azure/sonic-buildimage/blob/master/platform/vs/README.gns3.md)のが楽だと思います。