On Fri, 28 Aug 2020 at 11:50, Jakub Sitnicki <jakub@xxxxxxxxxxxxxx> wrote: > > 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. Oops, that's awkward! Luckily the tests still pass after fixing this. Thanks for your other comments as well, I'll send a v2 once I have some more reviews. > > > + > > + 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); > -- Lorenz Bauer | Systems Engineer 6th Floor, County Hall/The Riverside Building, SE1 7PB, UK www.cloudflare.com