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_summed
が CHECKSUM_COMPLETE
や CHECKSUM_PARTIAL
の場合に変更するようなコードになっていてそれは egress には関係ないのでは?とか、 skb->csum
を tc で更新してもデバイスにわたす直前だから反映されないのではないか?とか考えている。
対処
手動でチェックサムを更新する関数(bpf_l3_csum_replace
)があるのでそれを使う。