Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 
0003 /*
0004  * Copyright 2020 Google LLC.
0005  */
0006 
0007 #include <test_progs.h>
0008 #include <cgroup_helpers.h>
0009 #include <network_helpers.h>
0010 
0011 #include "metadata_unused.skel.h"
0012 #include "metadata_used.skel.h"
0013 
0014 static int duration;
0015 
0016 static int prog_holds_map(int prog_fd, int map_fd)
0017 {
0018     struct bpf_prog_info prog_info = {};
0019     struct bpf_prog_info map_info = {};
0020     __u32 prog_info_len;
0021     __u32 map_info_len;
0022     __u32 *map_ids;
0023     int nr_maps;
0024     int ret;
0025     int i;
0026 
0027     map_info_len = sizeof(map_info);
0028     ret = bpf_obj_get_info_by_fd(map_fd, &map_info, &map_info_len);
0029     if (ret)
0030         return -errno;
0031 
0032     prog_info_len = sizeof(prog_info);
0033     ret = bpf_obj_get_info_by_fd(prog_fd, &prog_info, &prog_info_len);
0034     if (ret)
0035         return -errno;
0036 
0037     map_ids = calloc(prog_info.nr_map_ids, sizeof(__u32));
0038     if (!map_ids)
0039         return -ENOMEM;
0040 
0041     nr_maps = prog_info.nr_map_ids;
0042     memset(&prog_info, 0, sizeof(prog_info));
0043     prog_info.nr_map_ids = nr_maps;
0044     prog_info.map_ids = ptr_to_u64(map_ids);
0045     prog_info_len = sizeof(prog_info);
0046 
0047     ret = bpf_obj_get_info_by_fd(prog_fd, &prog_info, &prog_info_len);
0048     if (ret) {
0049         ret = -errno;
0050         goto free_map_ids;
0051     }
0052 
0053     ret = -ENOENT;
0054     for (i = 0; i < prog_info.nr_map_ids; i++) {
0055         if (map_ids[i] == map_info.id) {
0056             ret = 0;
0057             break;
0058         }
0059     }
0060 
0061 free_map_ids:
0062     free(map_ids);
0063     return ret;
0064 }
0065 
0066 static void test_metadata_unused(void)
0067 {
0068     struct metadata_unused *obj;
0069     int err;
0070 
0071     obj = metadata_unused__open_and_load();
0072     if (CHECK(!obj, "skel-load", "errno %d", errno))
0073         return;
0074 
0075     err = prog_holds_map(bpf_program__fd(obj->progs.prog),
0076                  bpf_map__fd(obj->maps.rodata));
0077     if (CHECK(err, "prog-holds-rodata", "errno: %d", err))
0078         return;
0079 
0080     /* Assert that we can access the metadata in skel and the values are
0081      * what we expect.
0082      */
0083     if (CHECK(strncmp(obj->rodata->bpf_metadata_a, "foo",
0084               sizeof(obj->rodata->bpf_metadata_a)),
0085           "bpf_metadata_a", "expected \"foo\", value differ"))
0086         goto close_bpf_object;
0087     if (CHECK(obj->rodata->bpf_metadata_b != 1, "bpf_metadata_b",
0088           "expected 1, got %d", obj->rodata->bpf_metadata_b))
0089         goto close_bpf_object;
0090 
0091     /* Assert that binding metadata map to prog again succeeds. */
0092     err = bpf_prog_bind_map(bpf_program__fd(obj->progs.prog),
0093                 bpf_map__fd(obj->maps.rodata), NULL);
0094     CHECK(err, "rebind_map", "errno %d, expected 0", errno);
0095 
0096 close_bpf_object:
0097     metadata_unused__destroy(obj);
0098 }
0099 
0100 static void test_metadata_used(void)
0101 {
0102     struct metadata_used *obj;
0103     int err;
0104 
0105     obj = metadata_used__open_and_load();
0106     if (CHECK(!obj, "skel-load", "errno %d", errno))
0107         return;
0108 
0109     err = prog_holds_map(bpf_program__fd(obj->progs.prog),
0110                  bpf_map__fd(obj->maps.rodata));
0111     if (CHECK(err, "prog-holds-rodata", "errno: %d", err))
0112         return;
0113 
0114     /* Assert that we can access the metadata in skel and the values are
0115      * what we expect.
0116      */
0117     if (CHECK(strncmp(obj->rodata->bpf_metadata_a, "bar",
0118               sizeof(obj->rodata->bpf_metadata_a)),
0119           "metadata_a", "expected \"bar\", value differ"))
0120         goto close_bpf_object;
0121     if (CHECK(obj->rodata->bpf_metadata_b != 2, "metadata_b",
0122           "expected 2, got %d", obj->rodata->bpf_metadata_b))
0123         goto close_bpf_object;
0124 
0125     /* Assert that binding metadata map to prog again succeeds. */
0126     err = bpf_prog_bind_map(bpf_program__fd(obj->progs.prog),
0127                 bpf_map__fd(obj->maps.rodata), NULL);
0128     CHECK(err, "rebind_map", "errno %d, expected 0", errno);
0129 
0130 close_bpf_object:
0131     metadata_used__destroy(obj);
0132 }
0133 
0134 void test_metadata(void)
0135 {
0136     if (test__start_subtest("unused"))
0137         test_metadata_unused();
0138 
0139     if (test__start_subtest("used"))
0140         test_metadata_used();
0141 }