Если я правильно понял, изначально верификатор и интерпретатор cBPF находились внутри net/core/fiter.c
, например, sk_run_filter
здесь https://elixir.bootlin.com/linux/v3.2/source/net/core/filter.c#L112 просто преобразуйте инструкции cBPF, применяя их к эмулируемым регистрам и прямо на sk_buff. Пока sk_chk_filter
проверьте, все ли инструкции законны.
В настоящее время я видел, что в filter.c все еще есть функция bpf_check_classic
, которая заменяет старую sk_chk_filter
. После проверки делается попытка JIT программы, если это невозможно, то следующим шагом будет преобразование cBPF в eBPF.
ВОПРОСЫ:
1) где на самом деле вызов для запуска jitted/converted cbpf filter в последнем net/core/filter.c
?
2) Какая последовательность вызовов функций приводит к выполнению программы cBPF как программы eBPF?