AF-XDP: загружать программу ядра только один раз, но распределять доступ к xsks-map нескольким процессам.

Насколько я понимаю, на сетевой интерфейс может быть только одна программа ядра 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, и я не думаю, что это разумно.

Редактировать: я знаю, что есть способ повторно использовать карты, но... это кажется запутанным.


person binaryBigInt    schedule 05.03.2020    source источник
comment
Внутреннее устройство struct bpf_object намеренно скрыто от приложения, вызывающего libbpf. Повторное использование карт кажется здесь хорошим подходом, я дал несколько указателей здесь.   -  person Qeole    schedule 05.03.2020
comment
@Qeole Я только что заметил, что не имеет значения, загружаю ли я карту! Я просто делаю load_bpf_and_xdp_attach(cfg); в дистрибутиве и ничего не загружаю в процессы пользовательских программ. Я не понимаю, как это работает, но как-то сокеты теперь, где найти xsks-карту?   -  person binaryBigInt    schedule 05.03.2020
comment
Ссылка на ответ по настройке нескольких процессов   -  person Qeole    schedule 12.03.2020