XDP に入門してみた
XDP は、eXpress Data Path の略で、Linux カーネル内で動作する高速なパケット処理技術だそうです。
refs: https://terassyi.net/posts/2021/10/18/intro-xdp.html
この技術を使うと SDN の Data Plane が作れそうなので入門してみました。
やったことはすべてこちらのブログで言及されているものです。素晴らしいブログポストをありがとうございます。
以下は忘備録として書いたものなので、XDP に入門したくなった方は上のリンクを参照ください。
XDP を利用したシステムは、以下のプログラムで構成されます。
- C 言語で記述された XDP プログラム
- ebpf ライブラリを用いて記述されたコントロールプレーン
コントロールプレーンと XDP プログラムとの間では、 BPF マップという Key-Value な仕組みを利用してやり取りします。例えば、ファイアウォールを作るなら Deny リスト、DNAT を作るなら宛先ポート情報などをコントロールプレーンから BPF マップに入れます。
https://github.com/dropbox/goebpf を使うと、XDP プログラムのカーネルへのロード、NIC へのアタッチ、デタッチまで一貫して実行できます。すごいですね。
goebpf の example を試してみます。
https://github.com/dropbox/goebpf/tree/master/examples/xdp/packet_counter
clang で ebpf バイトコードを生成し、go のバイナリ実行時にそれをロードしてプログラムを実行します。
ubuntu@xdp-test:~/goebpf/examples/xdp/packet_counter$ make
clang -I../../.. -O2 -target bpf -c ebpf_prog/xdp.c -o ebpf_prog/xdp.elf
go build -v -o main
github.com/dropbox/goebpf/examples/xdp/packet_counter
ubuntu@xdp-test:~/goebpf/examples/xdp/packet_counter$ ^C
ubuntu@xdp-test:~/goebpf/examples/xdp/packet_counter$ sudo ./main -iface ens18
Maps:
protocols: Per-CPU array, Fd 7
Programs:
packet_count: XDP, size 232, license "GPLv2"
XDP program successfully loaded and attached. Counters refreshed every second.
^CPROTO_TCP: 5
Detaching program and exit
TCP パケットが5個検出されました。やったね!
XDP プログラムをロードしてアタッチしてしまえば、コントールプレーンからできることは BPF マップにデータを出し入れするくらいしかありません。
XDP プログラムでは、パケットのヘッダをパースしたり、別の NIC に転送したり、色々できそう。まだ全然わかりませんが。。。
ひとまず、goebpf の example を眺めたり書き換えたりしていろいろ試してみようと思います。