我目前正在处理一个用例,在Docker容器中运行eBPF程序。我想根据进程ID(PID)过滤请求,但从我的钩子(refer)获得的PID遇到了问题。具体来说,我在cgroup/connect 4上放置了一个钩子,但是当我试图加载程序时,我收到错误消息unknown func bpf_get_ns_current_pid_tgid#120
。
但是,当我在kprobe方法中使用bpf_get_ns_current_pid_tgid函数时,它工作正常。我怀疑bpf_get_ns_current_pid_tgid可能不是每个eBPF程序类型都支持。
有没有人能提供哪些eBPF程序类型支持bpf_get_ns_current_pid_tgid辅助函数的信息?我将非常感谢任何见解或参考文档,可以帮助澄清这个兼容性问题。
提前感谢您的帮助!
1条答案
按热度按时间wqsoz72f1#
你是对的,不是所有的辅助函数在所有的上下文中都可用。
bpf_get_ns_current_pid_tgid
函数仅在以下程序类型中可用:BPF_PROG_TYPE_KPROBE
BPF_PROG_TYPE_LSM
BPF_PROG_TYPE_PERF_EVENT
BPF_PROG_TYPE_RAW_TRACEPOINT
BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE
BPF_PROG_TYPE_SYSCALL
BPF_PROG_TYPE_TRACEPOINT
BPF_PROG_TYPE_TRACING
但是,如果它是调用进程的PID,则可以使用
bpf_get_current_pid_tgid
助手,该助手在以下程序类型中可用:BPF_PROG_TYPE_CGROUP_SOCK
BPF_PROG_TYPE_CGROUP_SOCK_ADDR
BPF_PROG_TYPE_KPROBE
BPF_PROG_TYPE_LSM
BPF_PROG_TYPE_PERF_EVENT
BPF_PROG_TYPE_RAW_TRACEPOINT
BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE
BPF_PROG_TYPE_SK_MSG
BPF_PROG_TYPE_SYSCALL
BPF_PROG_TYPE_TRACEPOINT
BPF_PROG_TYPE_TRACING
对于其他辅助函数,您可以运行
bpftool feature
命令,以在本地系统上的任何辅助函数中找出这一点。或者,您可以找到您感兴趣的程序类型的
struct bpf_verifier_ops
。然后查看.get_func_proto
字段指示的 *_func_proto函数。sock_addr_func_proto,它揭示了允许的帮助程序调用。访问源代码的好处是,它们还显示了bpftool输出中没有详细说明的其他需求,如kconfig设置、附件类型和运行时模式限制