selftests: Add test for overriding global data value before load
authorToke Høiland-Jørgensen <toke@redhat.com>
Sun, 29 Mar 2020 13:22:53 +0000 (15:22 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Sun, 29 Mar 2020 23:17:35 +0000 (01:17 +0200)
This adds a test to exercise the new bpf_map__set_initial_value() function.
The test simply overrides the global data section with all zeroes, and
checks that the new value makes it into the kernel map on load.

Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Link: https://lore.kernel.org/bpf/20200329132253.232541-2-toke@redhat.com
tools/testing/selftests/bpf/prog_tests/global_data_init.c [new file with mode: 0644]
tools/testing/selftests/bpf/progs/test_global_data.c

diff --git a/tools/testing/selftests/bpf/prog_tests/global_data_init.c b/tools/testing/selftests/bpf/prog_tests/global_data_init.c
new file mode 100644 (file)
index 0000000..3bdaa5a
--- /dev/null
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <test_progs.h>
+
+void test_global_data_init(void)
+{
+       const char *file = "./test_global_data.o";
+       int err = -ENOMEM, map_fd, zero = 0;
+       __u8 *buff = NULL, *newval = NULL;
+       struct bpf_object *obj;
+       struct bpf_map *map;
+        __u32 duration = 0;
+       size_t sz;
+
+       obj = bpf_object__open_file(file, NULL);
+       if (CHECK_FAIL(!obj))
+               return;
+
+       map = bpf_object__find_map_by_name(obj, "test_glo.rodata");
+       if (CHECK_FAIL(!map || !bpf_map__is_internal(map)))
+               goto out;
+
+       sz = bpf_map__def(map)->value_size;
+       newval = malloc(sz);
+       if (CHECK_FAIL(!newval))
+               goto out;
+
+       memset(newval, 0, sz);
+       /* wrong size, should fail */
+       err = bpf_map__set_initial_value(map, newval, sz - 1);
+       if (CHECK(!err, "reject set initial value wrong size", "err %d\n", err))
+               goto out;
+
+       err = bpf_map__set_initial_value(map, newval, sz);
+       if (CHECK(err, "set initial value", "err %d\n", err))
+               goto out;
+
+       err = bpf_object__load(obj);
+       if (CHECK_FAIL(err))
+               goto out;
+
+       map_fd = bpf_map__fd(map);
+       if (CHECK_FAIL(map_fd < 0))
+               goto out;
+
+       buff = malloc(sz);
+       if (buff)
+               err = bpf_map_lookup_elem(map_fd, &zero, buff);
+       if (CHECK(!buff || err || memcmp(buff, newval, sz),
+                 "compare .rodata map data override",
+                 "err %d errno %d\n", err, errno))
+               goto out;
+
+       memset(newval, 1, sz);
+       /* object loaded - should fail */
+       err = bpf_map__set_initial_value(map, newval, sz);
+       CHECK(!err, "reject set initial value after load", "err %d\n", err);
+out:
+       free(buff);
+       free(newval);
+       bpf_object__close(obj);
+}
index dd7a4d3..1319be1 100644 (file)
@@ -68,7 +68,7 @@ static struct foo struct3 = {
                bpf_map_update_elem(&result_##map, &key, var, 0);       \
        } while (0)
 
-SEC("static_data_load")
+SEC("classifier/static_data_load")
 int load_static_data(struct __sk_buff *skb)
 {
        static const __u64 bar = ~0;