Когда я пытаюсь вызвать 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=m», как и в другом сообщении.
Должно ли это быть «CONFIG_TEST_BPF=y»?
Оба должны быть в порядке.
Я только что попробовал загрузить эту же программу на другой компьютер, и она работает хорошо. Основное различие между ними заключается в том, что тот, который работает, имеет ядро 5.11.0, а тот, который нет, — 6.5.0. Знаете ли вы, были ли какие-либо изменения в bpf_prog_test_run между этими двумя версиями? Поскольку на обеих машинах установлена одна и та же версия libbpf, xdptools и bpftools.
Я не сравнивал эти версии, но в версии 6.5.0 я не видел ничего, что могло бы вызвать ENOSUPP
, кроме CONFIG_TEST_BPF
.
Я заметил, что при использовании «sudo bpftool prog show» на проблемной машине с ядром 6.5.0 отображаются две программы: «13835: имя xdp xdp_dispatcher...» и «13844: имя ext just_drop...». Хотя в машине, которая работает корректно, показывает только одну программу "1203: имя xdp просто_дроп...". Может ли быть так, что simple_drop считается «ext» программой, поэтому она не будет принята? Но я не уверен, откуда взялся этот «xdp_dispatcher» и как его отключить...
Похоже, эта проблема была вызвана тем, что 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);
Включен ли
CONFIG_TEST_BPF
в конфигурации вашего ядра?