Unyablog.

のにれんのブログ

eBPF: bpf_skb_store_bytes の BPF_F_RECOMPUTE_CSUM は tc_cls の egress では動かなさそう

最近 bpf についてめっちゃ書いてるけど、ドキュメントが弱く検索しても情報がないからです…

bpf_skb_store_bytes には BPF_F_RECOMPUTE_CSUM というフラグがあって、ドキュメントによると store 後にチェックサムを更新してくれるらしい。

しかし、これを tc_cls (classifier, BPF_PROG_TYPE_SCHED_CLS) の egress に使うとチェックサムが更新されなかった。

理由は(SKB のライフサイクルに関する知識が足りないため)確証まで至っていないけど、コードを見る限り skb->ip_summedCHECKSUM_COMPLETECHECKSUM_PARTIAL の場合に変更するようなコードになっていてそれは egress には関係ないのでは?とか、 skb->csum を tc で更新してもデバイスにわたす直前だから反映されないのではないか?とか考えている。

対処

手動でチェックサムを更新する関数(bpf_l3_csum_replace)があるのでそれを使う。