Определена ли реализация значений кода операции Berkeley Packet Filter?

Определена ли реализация значений кода операции Berkeley Packet Filter?

Я всегда считал tcpdump/libpcap авторитетными на арене BPF. Я заметил, что ядро ​​Linux и tcpdump по-разному читают фильтры BPF. Мнемоника и поведение BPF одинаковы, но сами фактические значения кода операции кажутся разными. Я искал в Интернете «Стандарт», но все, что я нашел, имеет только мнемоники.


person Crazy Chenz    schedule 04.06.2015    source источник


Ответы (1)


Нет, за исключением инструкций, которые поддерживаются некоторыми интерпретаторами/JIT-компиляторами BPF, а другие нет, они имеют одинаковые двоичные значения. Сравните, например, текущий libpcap pcap/bpf.h, по крайней мере, с Linux linux/bpf_common.h и linux/filter.h в ядре 3.19 и обратите внимание на комментарий в 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, который использует тот же компилятор для генерации кода BPF для ядра Linux, *BSD/OS X/Solaris 11/и т.д. ядер и пользовательского интерпретатора BPF с небольшими изменениями кода для обработки метаданных пакета (а не данных пакета).

person Community    schedule 04.06.2015
comment
Понял... Думаю, тогда я искал ошибку. Я использовал исходное дерево ядра 3.1. Там есть функция sk_run_filter(), которая реализует то, что выглядит как BPF. Проблема в том, что он использует перечисление для кодов операций вместо кодов операций CPP для операторов switch. В случаях enum коды операций не совпадают с кодами операций CPP. Но похоже, что в какой-то момент это перечисление было удалено. Так получилось, что я использовал один из немногих исходных кодов ядра с этим ненужным кодом. Последнее ядро ​​​​2.6 и ядро ​​​​3.4+, похоже, исправили / не имеют этой проблемы. - person Crazy Chenz; 08.06.2015