не удается прикрепить большой двоичный объект eBPF

Я только что скомпилировал примеры BPF из ядра tools/testing/selftests/bpf и попытался загрузить их, как описано в http://cilium.readthedocs.io/en/v0.10/bpf/:

% tc filter add dev enp0s1 ingress bpf \
    object-file ./net-next.git/tools/testing/selftests/bpf/sockmap_parse_prog.o \
    section sk_skb1 verbose 
Program section 'sk_skb1' not found in ELF file!
Error fetching program/map!

Это происходит на Ubuntu 16.04.3 LTS с ядром 4.4.0-98, llvm и clang версии 3.8, установленной из пакетов, iproute2 самая последняя с github.

Я подозреваю, что столкнулся с некоторым несоответствием версии/функций инструментария/ядра.

Что я делаю не так?


person Mark    schedule 22.11.2017    source источник


Ответы (1)


Я не знаю, почему tc жалуется. В моей настройке с помощью аналогичной команды программа загружается. Тем не менее, вот несколько советов:

  • Я думаю, что проблема может возникнуть, как вы предполагаете, из-за некоторой несовместимости между версией заголовков ядра и iproute2, и из-за того, что какое-то перемещение не происходит, хотя при быстром исследовании я не нашел, почему именно он отказывается загрузить раздел. Со своей стороны я использую clang-3.8, последний iproute2, а также последнее ядро ​​(некоторые коммиты близки к 4.14).

  • Если вам удастся как-то загрузить раздел, я думаю, вы все равно столкнетесь с проблемами при попытке прикрепить программу в ядре. Функция под названием «direct пакетный доступ» присутствует только на ядра 4.7 и выше. Это то, что позволяет вам использовать skb->data и skb->data_end в своих программах.

  • Тогда, как примечание, эта программа sockmap_parse_prog.c не предназначена для использования с tc. Предполагается, что он подключается непосредственно к сокету (ищите SOCKMAP_PARSE_PROG в файле test_maps.c в том же каталоге, чтобы увидеть, как он там загружается). Технически это не мешает прицепить программу как tc filter, но скорее всего не будет работать как положено. В частности, значение, возвращаемое программой, вероятно, не будет иметь значения, которое поймет хук классификатора tc.

Поэтому я бы посоветовал попробовать с последним ядром и посмотреть, получится ли у вас больше. В качестве альтернативы попробуйте скомпилировать и запустить примеры, которые вы можете найти в исходных текстах вашего ядра. Удачи!

person Qeole    schedule 22.11.2017
comment
Спасибо за ваши комментарии. Мне нужно будет попытаться собрать и установить последнее ядро. Не могли бы вы посоветовать, какой пример bpf для TC я должен попробовать вместо sockmap_parse_prog.c ? - person Mark; 24.11.2017
comment
В качестве альтернативы вы можете установить виртуальную машину с последним дистрибутивом, я думаю, что Ubuntu 17.04, например, имеет ядро ​​​​4.8? Для примеров, возможно, вы могли бы начать с запуска samples/bpf/parse_simple.c, это очень простая программа, которая, кажется, отбрасывает пакеты UDP с заданным номером порта назначения. Обратите внимание, что у вас также есть другие образцы под tools/testing/selftests/bpf. Вы можете найти коды возврата TC_ACT_, чтобы найти программы, написанные для tc. - person Qeole; 24.11.2017