是否定义了 Berkeley 数据包过滤器操作码值实现?

Are Berkeley Packet Filter opcode values implementation defined?

是否定义了 Berkeley 数据包过滤器操作码值实现?

我一直认为 tcpdump/libpcap 在 BPF 领域是权威的。我注意到 linux 内核和 tcpdump 读取 BPF 过滤器的方式不同。 BPF 助记符和行为是相同的,但实际操作码值本身似乎不同。我在互联网上查找 "The Standard",但我找到的所有内容都只有助记符。

不,除了一些 BPF interpreters/JITs 支持而另一些不支持的指令外,它们具有相同的二进制值。例如,将当前的 libpcap pcap/bpf.h 至少与 3.19 内核中的 Linux linux/bpf_common.h 和 linux/filter.h 进行比较,并注意注释在 linux/filter.h 中显示:

/*
 *      Try and keep these values and structures similar to BSD, especially
 *      the BPF code definitions which need to match so you can share filters
 */

和 libpcap 中的代码使用相同的编译器为 Linux 内核生成 BPF 代码,*BSD/OS X/Solaris 11/等。内核和用户态 BPF 解释器,只需少量代码更改即可处理获取数据包元数据(而不是数据包数据)。