Kernel Berkeley数据包筛选器操作码值是否已定义?

Kernel Berkeley数据包筛选器操作码值是否已定义?,kernel,libpcap,tcpdump,bpf,Kernel,Libpcap,Tcpdump,Bpf,Berkeley数据包筛选器操作码值是否已定义 我一直认为tcpdump/libpcap在BPF领域是权威的。我注意到linux内核和tcpdump读取BPF过滤器的方式不同。BPF助记符和行为是相同的,但实际的操作码值本身似乎不同。我在互联网上寻找“标准”,但我发现的所有东西都只有记忆法 否,除了一些BPF解释器/JIT支持但其他不支持的指令之外,它们具有相同的二进制值。例如,将当前的libpcap pcap/bpf.h与3.19内核中的Linux/bpf_common.h和Linux/fil

Berkeley数据包筛选器操作码值是否已定义


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

否,除了一些BPF解释器/JIT支持但其他不支持的指令之外,它们具有相同的二进制值。例如,将当前的libpcap pcap/bpf.h与3.19内核中的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.内核和userland BPF解释器生成BPF代码,只需少量代码更改即可处理获取数据包元数据(而不是数据包数据)。

明白了。。。我想当时我在看一只虫子。我一直在使用3.1内核源代码树。其中有一个sk_run_filter()函数,它实现了看似BPF的功能。问题是它对操作码使用枚举,而不是对其switch语句使用CPP操作码。在枚举情况下,操作码与CPP操作码不匹配。但似乎在某个时候该枚举已被删除。碰巧我使用了为数不多的内核源代码之一来编写这段垃圾代码。最新的2.6内核和3.4+内核似乎已经解决了这个问题。