bpf_get_socket_cookie() 在什么情况下返回 0

问题描述

bpf-helpers(7) 指出,如果 bpf_get_socket_cookie() 中缺少套接字字段,skb 将返回 0。

在什么情况下套接字字段在此上下文中丢失?它是否取决于 BPF 程序附加到数据路径中的哪个位置?例如,在使用 bpf_get_socket_cookie() 附加过滤器的情况下,tc filter add dev ... ingress ... bpf ... 是否总是返回 0(例如,在 Linux 内核 4.19 上)?

解决方法

如果数据包尚未解复用到套接字,则套接字字段为 NULL。对于 TCP,这发生在 tcp_v4_early_demux() 中。

所以是的,这取决于你附加 BPF 程序的位置。您需要在将数据包解复用到套接字之前附加它。