ホワイトペーパー

BittWare のパケットパーサーの構築、HLS と P4 の実装の比較

先進のパッシブ・ヒートシンクを搭載したXUP-P3R

概要

BittWareの SmartNIC Shell およびBittWareの Loopback Example の機能の 1 つに、パケットからプロトコル フィールドを抽出するパケットパーサー/分類器があります。このホワイトペーパーでは、パーサについて説明するだけでなく、HLS を使用してパーサを構築し、 設定することで、P4 言語を使用するよりも優れた実装を実現した方法についても説明したいと思います。パーサコードは、AMDUltraScale+ の所有者であれば、ループバック例の一部としてBittWare の開発者向けウェブサイトから無料で入手することができます(2020 年 1 月提供開始)。

スマートNICのプログラミングにP4を超えるものを

現在、BittWareの SmartNIC Shell のパーサコンポーネントは、AMD HLS C++ 開発環境を使用して構築されています。しかし、BittWareの SmartNIC Shell の以前のリビジョンでは、AMD SDNet ツールを使用して P4 言語を使用していました。

P4を使う理由の1つは、コモディティIntelサーバーでSDN(Software-Defined Networking:ソフトウェア定義ネットワーキング)を採用する人たちに人気のある新興規格だからだ。しかし、AMD は後に SDNet の利用を制限した。私たちが P4 を使用するのは SmartNIC Shell のエンドユーザー向けだったので、この制限により私たちはよりオープンなソリューションを探すことになりました。HLSを使用したRSS実装の成功を受けて、同じHLSアプローチ(特にXilinx HLS C++環境)を使用してSmartNIC Shellパーサーを再実装する気になりました。

本ホワイトペーパーのPDF版

Packet Parserとは?

イーサネット上で使用されるプロトコルは、ハードウェアが活用するには難しいものです。この課題は、プロトコルに多くのオプションフィールドがあるために存在します。これらのオプションは、例えば、IPヘッダーの開始を見つけることを複雑にしています。なぜか?IPヘッダーの場合、その前に0、1、2個のVLANタグがあることがあります。また、MPLSタグがある場合もあります。したがって、ハードウェアは、IPヘッダーを見つけるために、プロトコルを十分に理解する必要があります。ハードウェアは、ハードウェアのフィルタやテーブルでよく使用されるIPアドレスを見つけるために、IPヘッダを必要とします。IPヘッダー自体にもオプションのフィールドがあるため、同様の問題が次のレベルでも存在する。

BittWareのHLS C++パケットパーサーで対応可能です:

  • VLANタグ0~2個(旧SDNetのコードでは0または1個でした)
  • 0~5個のMPLSタグ(BittWare'旧SDNetコードはMPLSを認識していませんでした。)
  • IPフラグメント
  • IPv4ヘッダー(IPv6は不可)

ポートIDがこれらのIPプロトコルにあることを想定しています:TCP、UDP、DCCP、およびSTCP。

パケットパーサの 2 つのバージョンを作成した結果、P4 を使用した場合と HLS C++ を使用した場合とで、いくつかの違いがあることがわかりました。全体として、HLS のフローは P4 よりも抽象度が低いのですが、ツールははるかに成熟しています。

リソースの使用状況の詳細は表の通りです:

特徴P4/SDNetHLS C++
CLBs3,1853,391
ビーラム220
レジスター10,3615,975
コード行数2061,154

すべてのFPGAリソースにおいて、HLSは同等かそれ以上であることがわかります。ソースコードはより多くの行数を必要としますが、その一部はコメントやフォーマットによる影響です。しかし、HLS の C++ 実装は、P4 よりも常に多くのコード行を必要とすることは事実です。しかし、これはパケットパーサー/分類器の場合であり、P4 が記述できる範囲に含まれるもので、HLS C++ はそれ以上のことができます。HLSは非常に汎用的で、ほとんど何でもできる。P4は非常に特殊です。

さらに良いことに、HLS の実装が存在する以上、イーサネットプロトコルのバリエーションに対応するために HLS を修正する作業は、P4 言語で修正するのとほぼ同じであるのです。これは、HLS の C++ 実装が、私たちが作成した低レベルのパーサー関数への呼び出しのシーケンスとして構成されているためです。このアプローチは、P4 の下にあるランタイムを直接操作するのと同じです。

前述のように、Parser ブロックを含む Loopback Example のソースコードは、BittWare Developer サイトを通じて、Ultrascale++ オーナーが無償で入手できます。この例は、HLS C++ コード内で AXI インターフェイスを使用する方法を示す優れた図解です。BittWare FPGAカードをお持ちでない方は、こちらをご覧ください。購入先については、弊社までお問い合わせください。

タプル(Tuple)とは?

イーサネット上で使用されるプロトコルは、ハードウェアが活用するには難しいものです。この課題は、プロトコルに多くのオプションフィールドがあるために存在します。これらのオプションは、例えば、IPヘッダーの開始を見つけることを複雑にしています。なぜか?IPヘッダーの場合、その前に0、1、2個のVLANタグがあることがあります。また、MPLSタグがある場合もあります。したがって、ハードウェアは、IPヘッダーを見つけるために、プロトコルを十分に理解する必要があります。ハードウェアは、ハードウェアのフィルタやテーブルでよく使用されるIPアドレスを見つけるために、IPヘッダを必要とします。IPヘッダー自体にもオプションのフィールドがあるため、同様の問題が次のレベルでも存在する。

BittWareのHLS C++パケットパーサーで対応可能です:

  • VLANタグ0~2個(旧SDNetのコードでは0または1個でした)
  • 0~5個のMPLSタグ(BittWare'旧SDNetコードはMPLSを認識していませんでした。)
  • IPフラグメント
  • IPv4ヘッダー(IPv6は不可)

ポートIDがこれらのIPプロトコルにあることを想定しています:TCP、UDP、DCCP、およびSTCP。

FPGAハードウェアにP4が一般化する?

P4言語は、「パケット転送データプレーン」(またはネットワークスイッチ)をソフトウェアで定義するために作られました。この言語は、特にハードウェアベンダーのBarefoot Networksと関連しています。P4言語は、Googleが普及を支援する「P4 Runtime」と呼ばれるものとは異なります。P4 Runtimeは、P4でコンパイルされたソリューションのコントロールプレーンを操作することができる標準ランタイムAPIを提供します。

P4では、新しいプロトコルに対応したパケット分類器/解析器を簡単に定義することができます。また、P4はテーブルのルックアップ機能を一式規定しており、例えばVLANタグを排除して流れるパケットを書き換えることができます。

P4の柔軟性がFPGAへの採用につながるということでしょうか。そうならない理由はいくつかあると思います。

FPGAハードウェア上でP4のサブセットを提供する商用オプションは存在するが、現在のところその範囲は限定的である。さらに、前述の通り、商業的な条件から、BittWare 、これらを活用してサンプルプログラムを作成し、製品とともに無償で提供することは困難である。

注意すべきは、実際のFPGAアプリケーションは、P4だけで書くことはできないということです。たとえば、いくつかの例でパーサーに続くレシーバーサイドスケーリング(RSS)ブロックは、P4 でオーサリングすることはできません。しかし、HLS C++を使用すれば、どちらのブロックも、あるいは2つの機能を組み合わせた1つのブロックもオーサリングすることが可能です。

また、P4 テーブルルックアップ関数は、基本的に RTL または HLS C++ で記述されたハードウェア固有のランタイムライブラリのラ ップである。プログラマは、そのようなランタイムをHLS C++からペナルティなしで直接呼び出すことができます。

つまり、P4 と HLS C++ の両方を使用してパーサを実装した結果、HLS C++ のアプローチを採用することにしました。FPGA上のP4の需要が、成熟したツールをサポートできるほど大きくなるとは思えません。HLS C++は、より多くのことができ、より成熟しています。

HLSのポータビリティと結論

空の見出し

FPGA上のパケット・パーサーの実装について、P4言語による実装とHLS C++による実装の2つの説明を行い、あなたに合ったアプローチを評価するための参考になれば幸いです。

最後に、FPGA カード間のポータビリティに関する注意点をひとつ。AMD FPGA ベースのカード間では、HLS を使用することで、ほとんど変更することなく簡単に移植することができます。当社の 520N-MX のようなインテルベースのカードに移行する場合、特にコンプライラープラグマに関して、ソースコードの変更が必要になります。しかし、基本的なコンセプトは同じです。どちらの場合も、FPGA変換の課題に関する知識に基づいてC++を構造化しています。恣意的なC++コードは、FPGA内部での動作が非常に悪くなります。しかし、C++コードを再構築し、プラグマに油を注いだものは非常にうまく動作する。AMDやIntelに必要な変更は非常に似ていますが、表現が少し違うだけです。

BittWareの SmartNIC Shell の一部として、当社の Parser は、当社の FPGA カードでネットワークパケット処理アプリケーションを構築する際に、チームの迅速な立ち上げに貢献します。SmartNIC for our cardsの詳細、またはお客様のアプリケーションのニーズについては、弊社までお問い合わせください。

BittWareのLoopbackの例では、SmartNICシェルのサブセットを再展開しており、無償で提供することができます。このサブセットには、私たちのParserライブラリが含まれています。

もっと読みたいがある:アプリノートを入手する

PDFダウンロードを希望する

このページでは、SmartNIC Shellの一部であるParserの基本的な概要を説明しています。SmartNIC Shellのアプリノートには、より詳細な情報が記載されていますし、何より無料でダウンロードできます!フォームに記入して、フルアプリケーションノートのPDF版へのアクセスをリクエストしてください。

"*"は必須項目

名称*
PDFはこのアドレスを使って送信されますので、これが有効なメールであることを確認してください。
住所・都市名*