Насколько я понимаю, на сетевой интерфейс может быть только одна программа ядра AF-XDP. Я хочу распределить обработку пакетов с нескольких multicast-адресов с одного сетевого интерфейса на несколько процессов. Я написал программу-загрузчик, которая создает процессы (пока работает нормально).
Моя проблема сейчас состоит в том, чтобы загрузить программу ядра только один раз через load_bpf_and_xdp_attach
в программе-загрузчике, но раздать доступ к xsks-map нескольким процессам.
load_bpf_and_xdp_attach
возвращает указатель на struct bpf_object*
. Затем этот указатель необходим bpf_object__find_map_by_name
для получения доступа к файловому дескриптору bpf_map
.
Моя идея заключалась в том, чтобы записать содержимое bpf_object
в разделяемую память, тем самым распределив его по процессам. Но, к сожалению, структура bpf_object
определена в libbpf.c
. Из-за этого я не могу сделать это:
void insert_bpf_obj_into_shrd_mem(int shmid, struct bpf_object *bpf_obj) {
uint8_t *shm_data = shmat(shmid, NULL, 0);
if(shm_data == -1) {
fprintf(stderr, "Failed to obtain `shared memory` with id %d: %s\n", shmid, strerror(errno));
exit(1);
}
memcpy(shm_data, bpf_obj, sizeof(struct bpf_object));
shmdt(shm_data);
}
Мне кажется, что libbpf
не хочет, чтобы кто-нибудь знал о bpf_object
.
Любые идеи, как я могу реализовать свою первоначальную идею?
В случае, если каждый процесс загружает свою собственную версию программы ядра, я получаю карты (amount of processes)
-xsks, и я не думаю, что это разумно.
Редактировать: я знаю, что есть способ повторно использовать карты, но... это кажется запутанным.
struct bpf_object
намеренно скрыто от приложения, вызывающего libbpf. Повторное использование карт кажется здесь хорошим подходом, я дал несколько указателей здесь. - person Qeole   schedule 05.03.2020load_bpf_and_xdp_attach(cfg);
в дистрибутиве и ничего не загружаю в процессы пользовательских программ. Я не понимаю, как это работает, но как-то сокеты теперь, где найти xsks-карту? - person binaryBigInt   schedule 05.03.2020