May 6, 2019

XDP metadata が VLAN パケットのときに失われるバグを修正した

パッチ

パッチは こちら で、stable では 4.19.375.0.10 からこの修正が入っています。

内容としては bpf_xdp_adjust_meta() でパケットに付けたメタデータが skb のビルドプロセス内の skb_vlan_untag() (さらに詳しく言うと skb_reorder_vlan_header() ) で失われて tc の cls_bpf などで参照できない問題を修正したものです。

Linux へのパッチの送り方について

公式ドキュメントにパッチの送り方 Submitting patches: the essential guide to getting your code into the kernel が書いてあるので、これを読めばだいたいわかるようになっていました。

また、今回はネットワーク関連だったので、 netdev FAQ も読んだところ、バグフィックスは net ブランチ、新機能は net-next ブランチということがわかり、 net ブランチにパッチを送りました。

その他に注意する点として、メールの送り方があり、これは Email clients info for Linux というページにまとまっています。

自分はこれを読まずに git imap-send から Gmail Web Clientでメールしてしまい、 タブが全滅したパッチ を送ってしまいました。

最終的に Thunderbird でメールしましたが、 git send-email が一番シンプルで楽そうです。

Debian でのカーネルのビルド方法について

Debian Linux Kernel HandbookChapter 4. Common kernel-related tasks が詳しいです。

LOCALVERSION を付けておくとわかりやすいので下記のようなコマンドでビルドしています。

make -j`nproc` LOCALVERSION=-hoge bindeb-pkg

感想

  • VLAN の処理をハードウェアオフロードしない場合、カーネルが VLAN の処理をするけど、 skb をビルドするときに VLAN ヘッダはパケットデータからは消えてしまうということ自体初めて知ったし、ドライバのソースを追ったりして、全体的に良い経験になった
  • たぶん今まで VLAN と bpf_xdp_adjust_meta() を組み合わせて使ったことのある人がいなかった
  • メール難しい
  • eBPF/XDP と Linux Network Stack を組み合わせてパケットをいじる方法についてかなり詳しくなった

© Yuya Kusakabe 2011-2022

Powered by Hugo & Kiss.