]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
libbpf: Open code low level bpf commands.
authorAlexei Starovoitov <ast@kernel.org>
Mon, 31 Jan 2022 22:05:23 +0000 (14:05 -0800)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 1 Feb 2022 22:56:18 +0000 (23:56 +0100)
Open code low level bpf commands used by light skeleton to
be able to avoid full libbpf eventually.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Link: https://lore.kernel.org/bpf/20220131220528.98088-3-alexei.starovoitov@gmail.com
tools/lib/bpf/skel_internal.h

index 0b84d8e6b72a35ad9f942376d9b2f9ef3840c6ea..57507f1c1934743cc79992149520e5f07315f97d 100644 (file)
@@ -70,19 +70,59 @@ static inline int skel_closenz(int fd)
        return -EINVAL;
 }
 
+#ifndef offsetofend
+#define offsetofend(TYPE, MEMBER) \
+       (offsetof(TYPE, MEMBER) + sizeof((((TYPE *)0)->MEMBER)))
+#endif
+
+static inline int skel_map_create(enum bpf_map_type map_type,
+                                 const char *map_name,
+                                 __u32 key_size,
+                                 __u32 value_size,
+                                 __u32 max_entries)
+{
+       const size_t attr_sz = offsetofend(union bpf_attr, map_extra);
+       union bpf_attr attr;
+
+       memset(&attr, 0, attr_sz);
+
+       attr.map_type = map_type;
+       strncpy(attr.map_name, map_name, sizeof(attr.map_name));
+       attr.key_size = key_size;
+       attr.value_size = value_size;
+       attr.max_entries = max_entries;
+
+       return skel_sys_bpf(BPF_MAP_CREATE, &attr, attr_sz);
+}
+
+static inline int skel_map_update_elem(int fd, const void *key,
+                                      const void *value, __u64 flags)
+{
+       const size_t attr_sz = offsetofend(union bpf_attr, flags);
+       union bpf_attr attr;
+
+       memset(&attr, 0, attr_sz);
+       attr.map_fd = fd;
+       attr.key = (long) key;
+       attr.value = (long) value;
+       attr.flags = flags;
+
+       return skel_sys_bpf(BPF_MAP_UPDATE_ELEM, &attr, attr_sz);
+}
+
 static inline int bpf_load_and_run(struct bpf_load_and_run_opts *opts)
 {
        int map_fd = -1, prog_fd = -1, key = 0, err;
        union bpf_attr attr;
 
-       map_fd = bpf_map_create(BPF_MAP_TYPE_ARRAY, "__loader.map", 4, opts->data_sz, 1, NULL);
+       map_fd = skel_map_create(BPF_MAP_TYPE_ARRAY, "__loader.map", 4, opts->data_sz, 1);
        if (map_fd < 0) {
                opts->errstr = "failed to create loader map";
                err = -errno;
                goto out;
        }
 
-       err = bpf_map_update_elem(map_fd, &key, opts->data, 0);
+       err = skel_map_update_elem(map_fd, &key, opts->data, 0);
        if (err < 0) {
                opts->errstr = "failed to update loader map";
                err = -errno;