On Fri, Aug 28, 2020 at 11:48 AM CEST, Lorenz Bauer wrote: > 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 <lmb@xxxxxxxxxxxxxx> > --- > .../selftests/bpf/prog_tests/sockmap_basic.c | 51 ++++++++++++++----- > 1 file changed, 37 insertions(+), 14 deletions(-) > > diff --git a/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c > index 0b79d78b98db..b989f8760f1a 100644 > --- a/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c > +++ b/tools/testing/selftests/bpf/prog_tests/sockmap_basic.c > @@ -47,6 +47,38 @@ 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, src_fd, dst_fd; > + > + src_fd = bpf_map__fd(src); > + dst_fd = bpf_map__fd(src); ^^^ That looks like a typo. We're comparing src map to src map. > + > + 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); > + if (err && errno == ENOENT) > + continue; > + > + CHECK(err, "map_lookup_elem(dst)", "element not deleted\n"); > + continue; > + } > + if (CHECK(err, "lookup_elem(src, cookie)", "%s\n", strerror(errno))) > + continue; > + > + err = bpf_map_lookup_elem(dst_fd, &i, &dst_cookie); > + if (CHECK(err, "lookup_elem(dst, cookie)", "%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) > { > @@ -106,9 +138,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; > @@ -124,18 +156,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, > @@ -148,12 +176,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);