BPF:程序上下文的翻译

时间:2018-03-01 14:21:52

标签: linux networking linux-kernel bpf

我正在研究不同类型的BPF程序,并注意到对于不同的程序类型,上下文的传递方式不同。

示例:

  1. 对于程序类型BPF_PROG_TYPE_SOCK_OPS,传递类型为struct bpf_sock_ops_kern的对象。但是,此类型的BPF程序会引用struct bpf_sock_ops。为什么这样做?"翻译"从bpf_sock_ops_kernbpf_sock_ops

  2. 对于程序类型BPF_PROG_TYPE_CGROUP_SKB,传递类型为struct sk_buff的对象(例如,在__cgroup_bpf_run_filter_skb中),但BPF程序需要最小化版本{{3} }。

  3. 所以我看了struct __sk_buff,但他们似乎只调整BPF指令中的偏移量,因为它们是由BPF验证者调用的。

    如果有人能够阐明如何定义BPF上下文,我会感到高兴。感谢。

1 个答案:

答案 0 :(得分:3)

作为参数传递的镜像对象(例如,struct bpf_sock_ops)将原始对象的字段的子集暴露给BPF程序。镜子结构也可以具有来自几个不同原始结构的场;在这种情况下,镜像对象用作聚合。将原始对象传递给BPF程序也会产生误导,因为用户可能认为他们可以访问所有字段。例如,当事实并非如此时,他们可以认为他们可以访问bpf_sock_ops_kern.sk

验证程序然后在第一次执行程序之前将对镜像对象的访问转换为对原始对象的访问。每种类型的镜像对象都有一个转换函数(例如,sock_ops_convert_ctx_access用于将访问转换为struct bpf_sock_ops)。然后,对于镜像对象的每个字段(即,对于每个偏移量),转换函数用原始字段的偏移量重写加载或存储指令。

请注意,所有原始字段可能不在同一个对象中。例如,在镜像对象struct bpf_sock_ops中,字段opfamily分别在bpf_sock_ops_kern.opbpf_sock_ops_kern.sk->skc_family中检索。