パッチ
パッチは こちら で、stable では 4.19.37 か 5.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 Handbook の Chapter 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 を組み合わせてパケットをいじる方法についてかなり詳しくなった