【问题标题】:Why load_half is defined in bpf_helpers but it doesn't appear in filter.c?为什么在 bpf_helpers 中定义了 load_half,但它没有出现在 filter.c 中?
【发布时间】:2019-09-05 08:23:28
【问题描述】:

如果我在tools/testing/selftests/bpf/bpf_helpers.h bpf 中理解“很好”,则定义了帮助原型。

如果我现在想知道哪些助手可用于特定程序类型,我需要在 'func_proto(enum bpf_func_id func_id' kernel/ net/ drivers/ 的结果中进行搜索

例如要检查套接字过滤程序可以调用的助手,我可以阅读以下定义

static const struct bpf_func_proto *
sock_filter_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
{
        switch (func_id) {
        /* inet and inet6 sockets are created in a process
         * context so there is always a valid uid/gid
         */
        case BPF_FUNC_get_current_uid_gid:
                return &bpf_get_current_uid_gid_proto;
        case BPF_FUNC_get_local_storage:
                return &bpf_get_local_storage_proto;
        default:
                return bpf_base_func_proto(func_id);
        }
}

问题:

1)我看不到load_half,但我仍然可以从我的套接字过滤程序中调用它。为什么? 2)socket_filtersk_filter有什么区别?

【问题讨论】:

    标签: c header prototype ebpf


    【解决方案1】:
    1. load_half() 不是 BPF 助手。您提到的文件bpf_helpers.h 确实声明了BPF 辅助函数的原型,但它还包含其他有用的定义,例如SEC()bpf_printk() 宏。特别是,它声明了load_half(),并带有以下注释:

      /* llvm builtin functions that eBPF C program may use to
       * emit BPF_LD_ABS and BPF_LD_IND instructions
       */
      [...]
      unsigned long long load_half(void *skb,
                                   unsigned long long off) asm("llvm.bpf.load.half");
      

      如您所见,load_half() 是一个 LLVM 内置函数,它是由 clang/LLVM 支持的汇编原语,为方便起见,它被包装为 load_half()。而且因为它不是 BPF 助手,所以当你在内核中 grep 寻找它的原型时,你不会看到它。

    2. 前缀 sk_filter 用于连接到套接字的 eBPF 过滤器,其方式与使用传统 cBPF 的方式类似,以过滤传入的数据包。尽管可能会令人困惑,但您可以看到内核文件net/core/filter.c 中的sock_filter_is_valid_access 用于cg_sock_verifier_ops,它在include/uapi/linux/bpf.h 中与程序类型BPF_PROG_TYPE_CGROUP_SOCK_ADDR 相关联。所以它指的是cgroups中使用的程序正确help (containerised) applications to bind and connect他们的sockets。

    【讨论】:

    • 感谢您的详细回答。所以 sock_filter 用于 cgroup sock 和 sk_filter 用于普通套接字。
    猜你喜欢
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 2015-11-25
    • 2011-07-27
    相关资源
    最近更新 更多