bpf_xdp_adjust_head()でIP/UDP/GTPヘッダの長さの分パケットのマイナス方向に先頭アドレスを移動(encap) ▪ NAPT情報を使って、インナーパケットのIP/L4ヘッダを書き換える ▪ トンネル情報を使って、アウターパケットのIP/UDP/GTPヘッダを書き込む ▪ bpf_fib_lookup()でソース/宛先MACアドレスを取得できればこれを使ってXDP_TX、取得できなければXDP_PASSする Ethernet 802.1q RX TX Ethernet 802.1q VLAN X (ローミングネットワークの VLAN) VLAN Z (グローバルネットワークの VLAN) TEID A IP UDP GTP IP L4 Data IP L4 Data 宛先IPがPGW-Uのグローバルアドレス XDP program eBPF Maps FIB Table bpf_fib_lookup() bpf_map_lookup_elem() bpf_map_update_elem() bpf_map_delete_elem()
“queues must be available to dedicate to XDP” • 他にも必要な機能があって、さくらのクラウドがマルチキュー対応した ◦ サーバの仮想NICがマルチキューに対応しました ◦ https://www.linux-kvm.org/page/Multiqueue • サーバ作成時にタグとして @nic-double-queue を付けるとキューの数がCPUコア数 *NIC数*2になる機能を作っていただいた • ちなみにさくらのクラウドではvnet_hdrがオフになっているので、ethtoolでオフロードをオ フにしまくらなくてもXDPが使える さくらのクラウドがXDPに対応していなかった
meta data support • qemuでVM起動するときのNICのオプションを変えるとソースのどこを通るようになるの かがわかるようになった(もう忘れた) • 関係ない話ですが、LKMLにパッチをメールで送信するのが難しいです virtio_netがXDP metadataに対応していなかった
BPF and XDP Reference Guide ◦ Suricata eBPF and XDP ◦ Linux Documantation/bpf ◦ Linux samples/bpf ◦ XDP Hands-On Tutorial ◦ BPF Features by Linux Kernel Version ◦ Linux Observability with BPF ◦ yunazuno.log ◦ @IT Berkeley Packet Filter(BPF)入門 ◦ JANOG45 パケット処理の独自実装や高速化手法の 比較と実践 独自パケット処理実装方法解説( XDP)