Я видел, что для каждого типа программы ebpf есть разные входные данные (контекст) для программы. Например, в случае программы BPF_PROG_TYPE_SOCKET_FILTER в качестве аргумента передается указатель на структуру __sk_buff. Где определяются контексты для каждого типа программы?
контекст для каждого типа программы ebpf
Ответы (1)
Где определяются контексты для каждого типа программы?
Они определены в ядре, как правило, в заголовках ядра. Точное местоположение зависит от типа программы. Например, __sk_buff
используется несколькими типами программ и определен в linux/bpf.h
.
Чтобы узнать, какой контекст ожидает каждая программа, вы можете просмотреть образцы BPF в ядре или попытаться найти xxxx_convert_ctx_access
для данного типа программы. Эти функции переводят доступ к объекту контекста в доступ к реальному объекту ядра (например, __sk_buff
является зеркальным отображением sk_buff
). Например, программы XDP ожидают контекст введите struct xdp_md
.
Как отметил @Qeole в комментариях, Oracle опубликовала сообщение в блоге от января 2019 года, в котором перечисляет ожидаемый контекст для каждого типа программы.
block:block_getrq
и block:block_plug
будут иметь разные структуры контекста). См. этот ответ StackOverflow, чтобы узнать, как получить содержимое каждой структуры. Вам нужно будет самостоятельно объявить эту структуру с соответствующими полями (хотя bcc сделает это за вас).
- person pchaigno; 27.08.2019