2

是否定义了伯克利包过滤器操作码值实现?

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

4

1 回答 1

1

不,除了某些 BPF 解释器/JIT 支持但其他不支持的指令外,它们具有相同的二进制值。例如,将当前的 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 内核(*BSD/OS X/Solaris 11/etc)生成 BPF 代码。内核和用户态 BPF 解释器,只需对代码进行少量更改即可处理获取数据包元数据(而不是数据包数据)。

于 2015-06-04T17:19:37.040 回答