Skip to content

Commit

Permalink
selftests: bpf: Add helper to compare socket cookies
Browse files Browse the repository at this point in the history
We compare socket cookies to ensure that insertion into a sockmap worked.
Pull this out into a helper function for use in other tests.

Signed-off-by: Lorenz Bauer <[email protected]>
Signed-off-by: Alexei Starovoitov <[email protected]>
Link: https://lore.kernel.org/bpf/[email protected]
  • Loading branch information
lmb authored and Alexei Starovoitov committed Sep 28, 2020
1 parent 6550f2d commit 26c3270
Showing 1 changed file with 36 additions and 14 deletions.
50 changes: 36 additions & 14 deletions tools/testing/selftests/bpf/prog_tests/sockmap_basic.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,37 @@ static int connected_socket_v4(void)
return -1;
}

static void compare_cookies(struct bpf_map *src, struct bpf_map *dst)
{
__u32 i, max_entries = bpf_map__max_entries(src);
int err, duration = 0, src_fd, dst_fd;

src_fd = bpf_map__fd(src);
dst_fd = bpf_map__fd(dst);

for (i = 0; i < max_entries; i++) {
__u64 src_cookie, dst_cookie;

err = bpf_map_lookup_elem(src_fd, &i, &src_cookie);
if (err && errno == ENOENT) {
err = bpf_map_lookup_elem(dst_fd, &i, &dst_cookie);
CHECK(!err, "map_lookup_elem(dst)", "element %u not deleted\n", i);
CHECK(err && errno != ENOENT, "map_lookup_elem(dst)", "%s\n",
strerror(errno));
continue;
}
if (CHECK(err, "lookup_elem(src)", "%s\n", strerror(errno)))
continue;

err = bpf_map_lookup_elem(dst_fd, &i, &dst_cookie);
if (CHECK(err, "lookup_elem(dst)", "%s\n", strerror(errno)))
continue;

CHECK(dst_cookie != src_cookie, "cookie mismatch",
"%llu != %llu (pos %u)\n", dst_cookie, src_cookie, i);
}
}

/* Create a map, populate it with one socket, and free the map. */
static void test_sockmap_create_update_free(enum bpf_map_type map_type)
{
Expand Down Expand Up @@ -109,9 +140,9 @@ static void test_skmsg_helpers(enum bpf_map_type map_type)
static void test_sockmap_update(enum bpf_map_type map_type)
{
struct bpf_prog_test_run_attr tattr;
int err, prog, src, dst, duration = 0;
int err, prog, src, duration = 0;
struct test_sockmap_update *skel;
__u64 src_cookie, dst_cookie;
struct bpf_map *dst_map;
const __u32 zero = 0;
char dummy[14] = {0};
__s64 sk;
Expand All @@ -127,18 +158,14 @@ static void test_sockmap_update(enum bpf_map_type map_type)
prog = bpf_program__fd(skel->progs.copy_sock_map);
src = bpf_map__fd(skel->maps.src);
if (map_type == BPF_MAP_TYPE_SOCKMAP)
dst = bpf_map__fd(skel->maps.dst_sock_map);
dst_map = skel->maps.dst_sock_map;
else
dst = bpf_map__fd(skel->maps.dst_sock_hash);
dst_map = skel->maps.dst_sock_hash;

err = bpf_map_update_elem(src, &zero, &sk, BPF_NOEXIST);
if (CHECK(err, "update_elem(src)", "errno=%u\n", errno))
goto out;

err = bpf_map_lookup_elem(src, &zero, &src_cookie);
if (CHECK(err, "lookup_elem(src, cookie)", "errno=%u\n", errno))
goto out;

tattr = (struct bpf_prog_test_run_attr){
.prog_fd = prog,
.repeat = 1,
Expand All @@ -151,12 +178,7 @@ static void test_sockmap_update(enum bpf_map_type map_type)
"errno=%u retval=%u\n", errno, tattr.retval))
goto out;

err = bpf_map_lookup_elem(dst, &zero, &dst_cookie);
if (CHECK(err, "lookup_elem(dst, cookie)", "errno=%u\n", errno))
goto out;

CHECK(dst_cookie != src_cookie, "cookie mismatch", "%llu != %llu\n",
dst_cookie, src_cookie);
compare_cookies(skel->maps.src, dst_map);

out:
test_sockmap_update__destroy(skel);
Expand Down

0 comments on commit 26c3270

Please sign in to comment.