| // SPDX-License-Identifier: GPL-2.0 |
| |
| /* |
| * Copyright (C) 2022 Huawei Technologies Duesseldorf GmbH |
| * |
| * Author: Roberto Sassu <roberto.sassu@huawei.com> |
| */ |
| |
| #include <test_progs.h> |
| |
| #include "test_libbpf_get_fd_by_id_opts.skel.h" |
| |
| void test_libbpf_get_fd_by_id_opts(void) |
| { |
| struct test_libbpf_get_fd_by_id_opts *skel; |
| struct bpf_map_info info_m = {}; |
| __u32 len = sizeof(info_m), value; |
| int ret, zero = 0, fd = -1; |
| LIBBPF_OPTS(bpf_get_fd_by_id_opts, fd_opts_rdonly, |
| .open_flags = BPF_F_RDONLY, |
| ); |
| |
| skel = test_libbpf_get_fd_by_id_opts__open_and_load(); |
| if (!ASSERT_OK_PTR(skel, |
| "test_libbpf_get_fd_by_id_opts__open_and_load")) |
| return; |
| |
| ret = test_libbpf_get_fd_by_id_opts__attach(skel); |
| if (!ASSERT_OK(ret, "test_libbpf_get_fd_by_id_opts__attach")) |
| goto close_prog; |
| |
| ret = bpf_map_get_info_by_fd(bpf_map__fd(skel->maps.data_input), |
| &info_m, &len); |
| if (!ASSERT_OK(ret, "bpf_map_get_info_by_fd")) |
| goto close_prog; |
| |
| fd = bpf_map_get_fd_by_id(info_m.id); |
| if (!ASSERT_LT(fd, 0, "bpf_map_get_fd_by_id")) |
| goto close_prog; |
| |
| fd = bpf_map_get_fd_by_id_opts(info_m.id, NULL); |
| if (!ASSERT_LT(fd, 0, "bpf_map_get_fd_by_id_opts")) |
| goto close_prog; |
| |
| fd = bpf_map_get_fd_by_id_opts(info_m.id, &fd_opts_rdonly); |
| if (!ASSERT_GE(fd, 0, "bpf_map_get_fd_by_id_opts")) |
| goto close_prog; |
| |
| /* Map lookup should work with read-only fd. */ |
| ret = bpf_map_lookup_elem(fd, &zero, &value); |
| if (!ASSERT_OK(ret, "bpf_map_lookup_elem")) |
| goto close_prog; |
| |
| if (!ASSERT_EQ(value, 0, "map value mismatch")) |
| goto close_prog; |
| |
| /* Map update should not work with read-only fd. */ |
| ret = bpf_map_update_elem(fd, &zero, &len, BPF_ANY); |
| if (!ASSERT_LT(ret, 0, "bpf_map_update_elem")) |
| goto close_prog; |
| |
| /* Map update should work with read-write fd. */ |
| ret = bpf_map_update_elem(bpf_map__fd(skel->maps.data_input), &zero, |
| &len, BPF_ANY); |
| if (!ASSERT_OK(ret, "bpf_map_update_elem")) |
| goto close_prog; |
| |
| /* Prog get fd with opts set should not work (no kernel support). */ |
| ret = bpf_prog_get_fd_by_id_opts(0, &fd_opts_rdonly); |
| if (!ASSERT_EQ(ret, -EINVAL, "bpf_prog_get_fd_by_id_opts")) |
| goto close_prog; |
| |
| /* Link get fd with opts set should not work (no kernel support). */ |
| ret = bpf_link_get_fd_by_id_opts(0, &fd_opts_rdonly); |
| if (!ASSERT_EQ(ret, -EINVAL, "bpf_link_get_fd_by_id_opts")) |
| goto close_prog; |
| |
| /* BTF get fd with opts set should not work (no kernel support). */ |
| ret = bpf_btf_get_fd_by_id_opts(0, &fd_opts_rdonly); |
| ASSERT_EQ(ret, -EINVAL, "bpf_btf_get_fd_by_id_opts"); |
| |
| close_prog: |
| if (fd >= 0) |
| close(fd); |
| |
| test_libbpf_get_fd_by_id_opts__destroy(skel); |
| } |