Функция bpf_filter()
принимает в качестве аргумента указатель на структуру, содержащую инструкции BPF (pc
на справочной странице), и запускает их на пакетах для их фильтрации.
Функция bpf_filter() возвращает -1 (приведение к целому числу без знака), если фильтр отсутствует.
Мы можем проверить в исходном коде что когда pc
, структура, которая должна содержать инструкции BPF, имеет значение null, тогда bpf_filter()
немедленно возвращает -1
, преобразованное в u_int
:
if (pc == 0)
/*
* No filter means accept all.
*/
return (u_int)-1;
[Отредактировано] Внутренне для целого числа со знаком -1
будет храниться как «максимальное значение целого числа минус один». С 32 битами, поскольку здесь возвращаемое значение приводится к целому числу без знака, это будет 2^32 - 1
.
Поскольку здесь возвращаемое значение приводится к целому числу без знака, это значение, которое вы получаете: 65535
равно 2**16 - 1
, поэтому -1
приводится к беззнаковому 16-битному целому числу (a u_int
). Поэтому я склонен полагать, что, когда вы видите это значение 65535
, вы на самом деле не предоставляете какой-либо программе BPF функцию? Согласуется ли это с вашими наблюдениями?
Теперь, когда есть совпадение:
В противном случае он возвращает результат программы фильтра.
Результирующее значение bpf_filter()
— это результат, полученный из программы BPF. Итак, когда вы получаете возвращаемое значение 0
, это означает, что:
- Либо ваша программа BPF завершилась и вернула
0
.
Или, возможно (хотя это и не задокументировано на справочной странице), произошла ошибка при запуске программы BPF. Вот пример, тоже из первоисточника:
case BPF_ALU|BPF_DIV|BPF_X:
if (X == 0)
return 0;
A /= X;
continue;
«В случае арифметического деления, если знаменатель X
равен нулю, то заставить bpf_filter()
вернуть 0
, в противном случае разделить регистр A
на регистр X
и перейти к следующей инструкции».
[Отредактировано] (см. комментарии) Как вы узнали, то же самое относится и к значению 65535
: это значение, которое вы заставили вернуть ваша программа BPF.
person
Qeole
schedule
27.08.2016