Skip to main content

XDP に入門してみた

前: SDN を作るぞ!という意気込み

XDP は、eXpress Data Path の略で、Linux カーネル内で動作する高速なパケット処理技術だそうです。

refs: https://terassyi.net/posts/2021/10/18/intro-xdp.html

この技術を使うと SDN の Data Plane が作れそうなので入門してみました。

やったことはすべてこちらのブログで言及されているものです。素晴らしいブログポストをありがとうございます。

以下は忘備録として書いたものなので、XDP に入門したくなった方は上のリンクを参照ください。

XDP を利用したシステムは、以下のプログラムで構成されます。

  1. C 言語で記述された XDP プログラム
  2. 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 を眺めたり書き換えたりしていろいろ試してみようと思います。