コンテンツにスキップ

4. アーキテクチャモデル

P4プログラムのインターフェース。
図4. P4プログラムのインターフェース。

P4アーキテクチャは、P4でプログラム可能なブロック(パーサー、ingressコントロールフロー、egressコントロールフロー、デパーサーなど)と、それらのデータプレーンインターフェースを定めます。

P4アーキテクチャは、P4プログラムとターゲットとの間の契約とみなすことができます。 したがって、各製造元はターゲット向けのP4コンパイラと、それに対応するアーキテクチャ定義の両方を提供しなければなりません。(P4コンパイラでは、すべてのアーキテクチャを扱う共通のフロントエンドを共有できると考えられます。) アーキテクチャ定義は、データプレーンのプログラム可能な機能全体を公開する必要はありません。同じハードウェアデバイスに対しても、製造元はそれぞれ機能の異なる複数の定義(たとえば、マルチキャストをサポートするものとしないもの)を提供できます。

4は、P4でプログラム可能なブロック間のデータプレーンインターフェースを示しています。ここでは、2つのプログラム可能なブロック(#1と#2)を持つターゲットを例にしています。各ブロックは、それぞれ別のP4コードの断片によってプログラムされます。 ターゲットは、一連の制御レジスタまたは信号を介してP4プログラムとやり取りします。 入力側の制御情報は、パケットを受信した入力ポートなどの情報をP4プログラムに提供します。 一方、P4プログラムは出力側の制御情報に書き込むことで、ターゲットの動作に影響を与えることができます(たとえば、パケットを転送すべき出力ポート)。制御レジスタや信号は、P4では組み込みメタデータとして表現されます。P4プログラムは、パケットごとに関連するデータをユーザー定義メタデータとして格納および操作することもできます。

P4プログラムの動作は、ビットベクトルをビットベクトルに写像する変換として完全に記述できます。 実際にパケットを処理するには、アーキテクチャモデルがP4プログラムによって組み込みメタデータに書き込まれたビットを解釈します。たとえば、特定の出力ポートへパケットを転送するには、P4プログラムが専用の制御レジスタに出力ポートのインデックスを書き込む必要がある場合があります。 同様に、パケットを破棄するには、別の専用制御レジスタに「drop」ビットを設定する必要がある場合があります。 組み込みメタデータの解釈方法の詳細は、アーキテクチャごとに異なることに注意してください。

固定機能オブジェクトのサービスを呼び出すP4プログラム。
図5. 固定機能オブジェクトのサービスを呼び出すP4プログラム。

P4プログラムは、アーキテクチャが提供する外部オブジェクトが実装するサービスと、アーキテクチャが提供する関数を呼び出すことができます。図5は、ターゲット上の組み込みチェックサム計算ユニットのサービスをP4プログラムが呼び出す様子を示しています。 チェックサムユニットでは、P4で規定されるのはインターフェースであり、実装自体は規定されません。 一般に、外部オブジェクトのインターフェースは、提供する各操作とそのパラメータ型および戻り値型を記述します。

一般に、異なるアーキテクチャ間でのP4プログラムの移植性は想定されていません。 たとえば、独自の制御レジスタに書き込むことでパケットをブロードキャストするP4プログラムは、その制御レジスタを持たないターゲットでは正しく動作しません。ただし、特定のアーキテクチャ向けに書かれたP4プログラムは、十分なリソースが利用可能である限り、対応するモデルを忠実に実装したすべてのターゲット間で移植可能であるべきです。

P4コミュニティが、特定の用途分野に対応する少数の標準アーキテクチャモデルを発展させていくことを期待しています。このような標準アーキテクチャが広く採用されれば、異なるターゲット間でのP4プログラムの移植性が高まります。ただし、これらの標準アーキテクチャの定義はこのドキュメントの対象外です。

P4でプログラム可能な機能ブロックを記述するために、アーキテクチャにはそのブロックとアーキテクチャ内の他のコンポーネントとの間のインターフェースを指定する型宣言が含まれます。 たとえば、アーキテクチャには次のような宣言が含まれる場合があります。

control MatchActionPipe<H>(in bit<4> inputPort,
                           inout H parsedHeaders,
                           out bit<4> outputPort);

この型宣言は、データに依存したマッチアクションユニットの呼び出しシーケンスとその他の命令型構成要素(controlキーワードで示されます)を用いてプログラムできるMatchActionPipeというブロックを記述しています。MatchActionPipeブロックとアーキテクチャ内の他のコンポーネントとのインターフェースは、この宣言から次のように読み取れます。

  • 第1パラメータは、inputPortという名前の4ビット値です。方向inは、このパラメータが変更できない入力であることを示します。
  • 第2パラメータは、parsedHeadersという名前の型Hのオブジェクトです。Hは、P4プログラマーが後で定義するヘッダを表す型変数です。方向inoutは、このパラメータが入力と出力の両方であることを示します。
  • 第3パラメータは、outputPortという名前の4ビット値です。方向outは、このパラメータが変更可能な出力であり、初期値は未定義であることを示します。

P4プログラムは、アーキテクチャが提供する外部オブジェクトや関数を利用することもできます。 このようなオブジェクトはextern構文で記述します。この構文は、オブジェクトがデータプレーンに公開するインターフェースを記述します。

外部オブジェクトは、オブジェクトが実装するメソッド群を記述しますが、これらのメソッドの実装自体は記述しません(すなわち、オブジェクト指向言語の抽象クラスに似ています)。たとえば、インクリメンタルチェックサムユニットが提供する操作は、次のように記述できます。

extern Checksum16 {
    Checksum16();              // constructor
    void clear();              // prepare unit for computation
    void update<T>(in T data); // add data to checksum
    void remove<T>(in T data); // remove data from existing checksum
    bit<16> get(); // get the checksum for the data added since last clear
}