AF-XDP: загрузить программу ядра только один раз, но распределить доступ к xsks-map нескольким процессам - PullRequest
1 голос
/ 05 марта 2020

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

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

...