^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include "util/bpf_map.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <bpf/bpf.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <bpf/libbpf.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <stdbool.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <stdlib.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <unistd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) static bool bpf_map_def__is_per_cpu(const struct bpf_map_def *def)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) return def->type == BPF_MAP_TYPE_PERCPU_HASH ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) def->type == BPF_MAP_TYPE_PERCPU_ARRAY ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) def->type == BPF_MAP_TYPE_LRU_PERCPU_HASH ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) def->type == BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) static void *bpf_map_def__alloc_value(const struct bpf_map_def *def)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) if (bpf_map_def__is_per_cpu(def))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) return malloc(round_up(def->value_size, 8) * sysconf(_SC_NPROCESSORS_CONF));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) return malloc(def->value_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) int bpf_map__fprintf(struct bpf_map *map, FILE *fp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) const struct bpf_map_def *def = bpf_map__def(map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) void *prev_key = NULL, *key, *value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) int fd = bpf_map__fd(map), err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) int printed = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) if (fd < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) return fd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) if (IS_ERR(def))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) return PTR_ERR(def);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) key = malloc(def->key_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) if (key == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) value = bpf_map_def__alloc_value(def);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) if (value == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) goto out_free_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) while ((err = bpf_map_get_next_key(fd, prev_key, key) == 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) int intkey = *(int *)key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) if (!bpf_map_lookup_elem(fd, key, value)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) bool boolval = *(bool *)value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) if (boolval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) printed += fprintf(fp, "[%d] = %d,\n", intkey, boolval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) printed += fprintf(fp, "[%d] = ERROR,\n", intkey);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) prev_key = key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) if (err == ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) err = printed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) free(value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) out_free_key:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) free(key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) }