Насколько я понимаю, на каждый сетевой интерфейс может быть только одна программа ядра AF-XDP. Я хочу распределить обработку пакетов с нескольких групповых адресов с одного сетевого интерфейса на несколько процессов. Я написал "загрузчик" -программу, которая создает процессы (пока работает нормально).
Моя проблема сейчас состоит в том, чтобы загрузить программу ядра только один раз через load_bpf_and_xdp_attach
в программе-загрузчике, но распределить доступ на карту xsks для нескольких процессов.
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
.
Есть идеи, как Я могу выполнить sh мою первоначальную идею?
В случае, если каждый процесс загружает свою собственную версию программы ядра, я получаю карты (amount of processes)
-xsks и не думаю, что это разумно.
Редактировать: я знаю, что есть способ повторно использовать карты, но ... кажется немного запутанным