Хэш-карта BPF не показывает правильное значение при извлечении

Я пытаюсь создать хэш-карту в BPF в коде ядра следующим образом:

struct bpf_map_def SEC("maps") hash_map = {
    .type = BPF_MAP_TYPE_HASH,
    .key_size = sizeof(__u32),
    .value_size = sizeof(__u32),
    .max_entries = 1000,
};

Затем я просто вставляю и извлекаю данные из карты следующим образом:

__u32 key = src_ip;
__u32 init_val = dst_ip;
__u32 *value;

value = bpf_map_lookup_elem(&hash_map, &key);
if (value) {
    trace_printk("value found=%lu\n", value);
}

Где src_ip и dst_ip — IP-адреса источника и получателя из пакета, который я обрабатываю:

__u32 src_ip = ip->saddr;
__u32 dst_ip = ip->daddr;

Однако, когда я печатаю значение, полученное с карты, я получаю:

value found=18446637648727971896

Принимая во внимание, что фактические адреса src и dst в распечатке, которую я только что выше, показывают:

src= 763730773, dst= 2818323142

Я просто не понимаю, как правильно получить/сохранить на карте. Любые указатели на это?

Спасибо.


person Tryhard3r    schedule 17.01.2021    source источник


Ответы (1)


Функция поиска возвращает указатель на ваше значение:

void *bpf_map_lookup_elem(struct bpf_map *map, const void *key);

Вы пытались разыменовать его? Что-то типа:

trace_printk("value found=%lu\n", *value);
person Qeole    schedule 18.01.2021
comment
Большое спасибо, это было! - person Tryhard3r; 18.01.2021