進行状況と、高速パケット処理に非常に役立つカーネル バイパス ライブラリである DPDK からのテスト プログラムを保存するために使用する小さなリポジトリ。
このリポジトリは、作業を簡素化するために私の DPDK Common プロジェクトを使用します。
警告- 時間の経過とともにサンプルをさらに追加しており、新しい機能やメソッドをテストする必要があります。
デフォルトのオプションを使用して DPDK をビルドする場合は、 ninja
やmeson
などの要件があると仮定して、次のように機能します。
git clone https://github.com/DPDK/dpdk.git
cd dpdk/
meson build
cd build
ninja
sudo ninja install
sudo ldconfig
DPDK からの必要なヘッダー ファイルはすべて/usr/local/include/
内に保存されます。
以下を使用するとninja
とmeson
を受け取ることができます。
sudo apt update
sudo apt install python3 python3-pip
sudo pip3 install meson # Pip3 is used because 'apt' has an outdated version of Meson usually.
sudo apt install ninja-build
git
とmake
使用して、このリポジトリ内にソース ファイルをビルドできます。
git clone --recursive https://github.com/gamemann/The-DPDK-Examples.git
cd The-DPDK-Examples/
make
実行可能ファイルはデフォルトでbuild/
ディレクトリ内にビルドされます。
このリポジトリ内のすべての DPDK アプリケーションは、DPDK の EAL パラメータをサポートします。これらはここで見つけることができます。
これは、たとえば、構成する L コアとポートの数を指定する場合に便利です。
この DPDK アプリケーションでは、UDP 宛先ポート 8080 に到着するパケットはすべてドロップされます。それ以外の場合、パケットのイーサネット ヘッダー タイプが IPv4 または VLAN の場合は、送信元/宛先の MAC アドレスと IP アドレス、および UDP 送信元/宛先ポートを交換してから、パケットを TX パスに送信します (基本的にパケットは送信元から転送されます)。 。
EAL パラメータに加えて、このアプリケーション専用に次のパラメータを使用できます。
-p --portmask => The port mask to configure (e.g. 0xFFFF).
-P --portmap => The port map to configure (in '(x, y),(b,z)' format).
-q --queues => The amount of RX and TX queues to setup per port (default and recommended value is 1).
-x --promisc => Whether to enable promiscuous on all enabled ports.
-s --stats => If specified, will print real-time packet counter stats to stdout.
以下に例を示します。
./dropudp8080 -l 0-1 -n 1 -- -q 1 -p 0xff -s
この DPDK アプリケーションでは、キーが宛先 IP アドレス、値が転送先の MAC アドレスである単純なルーティング ハッシュ テーブルが作成されます。
ルートは、 /etc/l3fwd/routes.txt
ファイルから次の形式で読み取られます。
<ip address> <mac address in xx:xx:xx:xx:xx:xx>
以下は一例です。
10.50.0.4 ae:21:14:4b:3a:6d
10.50.0.5 d6:45:f3:b1:a4:3d
パケットが処理されるとき、それが IPv4 または VLAN パケットであることを確認します (この場合、パケットの残りの部分を問題なく処理できるように、パケット データを 4 バイトオフセットします)。その後、ルート ハッシュ テーブルのキーとなる宛先 IP を使用してルックアップを実行します。ルックアップが成功すると、送信元 MAC アドレスが宛先 MAC アドレスに置き換えられ (TX バッファとキューが作成されるため、パケットは到着したのと同じポートから送信されます)、宛先 MAC アドレスは IP の MAC アドレスに置き換えられます。上記のルートファイルから割り当てられました。それ以外の場合、パケットはドロップされ、パケット ドロップ カウンタが増分されます。
EAL パラメータに加えて、このアプリケーション専用に次のパラメータを使用できます。
-p --portmask => The port mask to configure (e.g. 0xFFFF).
-P --portmap => The port map to configure (in '(x, y),(b,z)' format).
-q --queues => The amount of RX and TX queues to setup per port (default and recommended value is 1).
-x --promisc => Whether to enable promiscuous on all enabled ports.
-s --stats => If specified, will print real-time packet counter stats to stdout.
以下に例を示します。
./simple_l3fwd -l 0-1 -n 1 -- -q 1 -p 0xff -s
このアプリケーションでは、ソース IP がコマンド ラインで指定された 1 秒あたりのパケット数または 1 秒あたりのバイト数以上の場合、パケットはドロップされます。それ以外の場合、イーサネット アドレスと IP アドレスは TCP/UDP ポートとともに交換され、パケットは TX パスに転送されて戻されます。
-s
フラグにはパケット統計も含まれます。
次のコマンド ライン オプションがサポートされています。
-p --portmask => The port mask to configure (e.g. 0xFFFF).
-P --portmap => The port map to configure (in '(x, y),(b,z)' format).
-q --queues => The amount of RX and TX queues to setup per port (default and recommended value is 1).
-x --promisc => Whether to enable promiscuous on all enabled ports.
-s --stats => If specified, will print real-time packet counter stats to stdout.
--pps => The packets per second to limit each source IP to.
--bps => The bytes per second to limit each source IP to.
以下に例を示します。
./ratelimit -l 0-1 -n 1 -- -q 1 -p 0xff -s
注- このアプリケーションは、DPDK Common プロジェクトで作成したカスタム関数check_and_del_lru_from_hash_table()
を介して LRU リサイクルをサポートしています。この関数を使用する場合は、DPDK 共通ヘッダー ファイルをインクルードする前に必ずUSE_HASH_TABLES
を定義してください。
これは、ハッシュ テーブルの手動 LRU メソッドを実装する小さなアプリケーションです。しばらくの間、私はこれらのライブラリから LRU テーブルを動作させることを試みてきました。ただし、実際にテーブルを初期化することにはまったく成功しませんでした。
したがって、代わりにこれらのライブラリを使用し続け、独自の LRU 機能を実装することにしました。基本的には、 rte_hash_get_key_with_position()
関数を使用して、削除する最も古いキーを取得します。ただし、新しいエントリは最後に削除された位置に挿入されるようです。そのため、テーブルの最大エントリまで位置の値をインクリメントし続ける必要があります。ただし、位置の値がテーブルの最大エントリを超えた場合は、それを 0 に戻す必要があります。
コマンド ライン オプションは必要ありませんが、EAL パラメータは引き続きサポートされます。ただし、違いはありません。
以下に例を示します。
./ratelimit