Bpf_prog_test_run_opts ошибка 524 при запуске программы XDP

Когда я пытаюсь вызвать bpf_prog_test_run_opts, я получаю ошибку номер 524. Я нашел другой пост, в котором человек столкнулся с той же проблемой, но это произошло потому, что он пытался вызвать эту функцию для программы типа трассировки. Похоже, их решением было создать программу XDP вместо точки трассировки. Однако в моем случае моя программа является программой XDP, и кажется, что программы XDP поддерживаются.

Вот как выглядит программа пользовательского пространства:

int main(int argc, char **argv) {
    struct xdp_program *program;
    int err;

    /* Jumping over part that loads and attaches the program */

    int prog_fd = xdp_program__fd(program);

    unsigned char data[1500];

    // Fills the packet with headers
    create_packet(data);

    struct bpf_test_run_opts opts = {
        .sz = sizeof(struct bpf_test_run_opts),
        .data_in = &data,
        .data_size_in = sizeof(data),
    };

    err = bpf_prog_test_run_opts(prog_fd, &opts);
    if (err != 0) {
        perror("bpf_prog_test_run_opts");
        return -1;
    }

    return 0;
}

Между тем программа XDP может быть очень простой, но тем не менее она показывает эту ошибку.

SEC("xdp")
int  simply_drop(struct xdp_md *ctx)
{
    return XDP_DROP;
}

Я также попробовал напрямую вызвать системный вызов, но он все равно показывает ту же ошибку. Версия моего ядра 6.5.0.

Включен ли CONFIG_TEST_BPF в конфигурации вашего ядра?

pchaigno 24.06.2024 12:57

Это «CONFIG_TEST_BPF=m», как и в другом сообщении.

Pedro M 24.06.2024 14:06

Должно ли это быть «CONFIG_TEST_BPF=y»?

Pedro M 24.06.2024 20:43

Оба должны быть в порядке.

pchaigno 24.06.2024 21:16

Я только что попробовал загрузить эту же программу на другой компьютер, и она работает хорошо. Основное различие между ними заключается в том, что тот, который работает, имеет ядро ​​5.11.0, а тот, который нет, — 6.5.0. Знаете ли вы, были ли какие-либо изменения в bpf_prog_test_run между этими двумя версиями? Поскольку на обеих машинах установлена ​​одна и та же версия libbpf, xdptools и bpftools.

Pedro M 25.06.2024 01:53

Я не сравнивал эти версии, но в версии 6.5.0 я не видел ничего, что могло бы вызвать ENOSUPP, кроме CONFIG_TEST_BPF.

pchaigno 25.06.2024 15:41

Я заметил, что при использовании «sudo bpftool prog show» на проблемной машине с ядром 6.5.0 отображаются две программы: «13835: имя xdp xdp_dispatcher...» и «13844: имя ext just_drop...». Хотя в машине, которая работает корректно, показывает только одну программу "1203: имя xdp просто_дроп...". Может ли быть так, что simple_drop считается «ext» программой, поэтому она не будет принята? Но я не уверен, откуда взялся этот «xdp_dispatcher» и как его отключить...

Pedro M 25.06.2024 23:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, эта проблема была вызвана тем, что xdp_dispatcher загружался по умолчанию. Когда xdp_dispatcher загружается, все подключенные к нему программы XDP классифицируются как «ext». Итак, поскольку тип программы расширения, похоже, не поддерживается bpf_prog_run, мне кажется, что когда я попытался выполнить системный вызов, он вернул мне ошибку 524 ENOTSUPP, потому что операция не поддерживалась для программ типа "ext ".

Поэтому моим решением было загрузить программу XDP напрямую, без xdp_dispatcher. Для этого я сделал что-то вроде:

// Open the object file and gets the bpf_object
struct bpf_object *obj = bpf_object__open_file(object_filename, NULL);

// Loads the object
bpf_object__load(obj);

// Gets the bpf_program from the object
struct bpf_program *prog = bpf_object__next_program(obj, NULL);

// Gets file descriptor
int prog_fd = bpf_program__fd(prog);

// Attaches the XDP program without xdp_dispatcher
bpf_xdp_attach(interface_index, prog_fd, 0, NULL);

Другие вопросы по теме