Commit b4ea530d authored by Jakub Sitnicki's avatar Jakub Sitnicki Committed by Alexei Starovoitov

selftests/bpf: Pass BPF skeleton to sockmap_listen ops tests

Following patch extends the sockmap ops tests to cover the scenario when a
sockmap with attached programs holds listening sockets.

Pass the BPF skeleton to sockmap ops test so that the can access and attach
the BPF programs.
Signed-off-by: default avatarJakub Sitnicki <jakub@cloudflare.com>
Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/r/20230113-sockmap-fix-v2-3-1e0ee7ac2f90@cloudflare.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent ddce1e09
...@@ -30,6 +30,8 @@ ...@@ -30,6 +30,8 @@
#define MAX_STRERR_LEN 256 #define MAX_STRERR_LEN 256
#define MAX_TEST_NAME 80 #define MAX_TEST_NAME 80
#define __always_unused __attribute__((__unused__))
#define _FAIL(errnum, fmt...) \ #define _FAIL(errnum, fmt...) \
({ \ ({ \
error_at_line(0, (errnum), __func__, __LINE__, fmt); \ error_at_line(0, (errnum), __func__, __LINE__, fmt); \
...@@ -321,7 +323,8 @@ static int socket_loopback(int family, int sotype) ...@@ -321,7 +323,8 @@ static int socket_loopback(int family, int sotype)
return socket_loopback_reuseport(family, sotype, -1); return socket_loopback_reuseport(family, sotype, -1);
} }
static void test_insert_invalid(int family, int sotype, int mapfd) static void test_insert_invalid(struct test_sockmap_listen *skel __always_unused,
int family, int sotype, int mapfd)
{ {
u32 key = 0; u32 key = 0;
u64 value; u64 value;
...@@ -338,7 +341,8 @@ static void test_insert_invalid(int family, int sotype, int mapfd) ...@@ -338,7 +341,8 @@ static void test_insert_invalid(int family, int sotype, int mapfd)
FAIL_ERRNO("map_update: expected EBADF"); FAIL_ERRNO("map_update: expected EBADF");
} }
static void test_insert_opened(int family, int sotype, int mapfd) static void test_insert_opened(struct test_sockmap_listen *skel __always_unused,
int family, int sotype, int mapfd)
{ {
u32 key = 0; u32 key = 0;
u64 value; u64 value;
...@@ -359,7 +363,8 @@ static void test_insert_opened(int family, int sotype, int mapfd) ...@@ -359,7 +363,8 @@ static void test_insert_opened(int family, int sotype, int mapfd)
xclose(s); xclose(s);
} }
static void test_insert_bound(int family, int sotype, int mapfd) static void test_insert_bound(struct test_sockmap_listen *skel __always_unused,
int family, int sotype, int mapfd)
{ {
struct sockaddr_storage addr; struct sockaddr_storage addr;
socklen_t len; socklen_t len;
...@@ -386,7 +391,8 @@ static void test_insert_bound(int family, int sotype, int mapfd) ...@@ -386,7 +391,8 @@ static void test_insert_bound(int family, int sotype, int mapfd)
xclose(s); xclose(s);
} }
static void test_insert(int family, int sotype, int mapfd) static void test_insert(struct test_sockmap_listen *skel __always_unused,
int family, int sotype, int mapfd)
{ {
u64 value; u64 value;
u32 key; u32 key;
...@@ -402,7 +408,8 @@ static void test_insert(int family, int sotype, int mapfd) ...@@ -402,7 +408,8 @@ static void test_insert(int family, int sotype, int mapfd)
xclose(s); xclose(s);
} }
static void test_delete_after_insert(int family, int sotype, int mapfd) static void test_delete_after_insert(struct test_sockmap_listen *skel __always_unused,
int family, int sotype, int mapfd)
{ {
u64 value; u64 value;
u32 key; u32 key;
...@@ -419,7 +426,8 @@ static void test_delete_after_insert(int family, int sotype, int mapfd) ...@@ -419,7 +426,8 @@ static void test_delete_after_insert(int family, int sotype, int mapfd)
xclose(s); xclose(s);
} }
static void test_delete_after_close(int family, int sotype, int mapfd) static void test_delete_after_close(struct test_sockmap_listen *skel __always_unused,
int family, int sotype, int mapfd)
{ {
int err, s; int err, s;
u64 value; u64 value;
...@@ -442,7 +450,8 @@ static void test_delete_after_close(int family, int sotype, int mapfd) ...@@ -442,7 +450,8 @@ static void test_delete_after_close(int family, int sotype, int mapfd)
FAIL_ERRNO("map_delete: expected EINVAL/EINVAL"); FAIL_ERRNO("map_delete: expected EINVAL/EINVAL");
} }
static void test_lookup_after_insert(int family, int sotype, int mapfd) static void test_lookup_after_insert(struct test_sockmap_listen *skel __always_unused,
int family, int sotype, int mapfd)
{ {
u64 cookie, value; u64 cookie, value;
socklen_t len; socklen_t len;
...@@ -470,7 +479,8 @@ static void test_lookup_after_insert(int family, int sotype, int mapfd) ...@@ -470,7 +479,8 @@ static void test_lookup_after_insert(int family, int sotype, int mapfd)
xclose(s); xclose(s);
} }
static void test_lookup_after_delete(int family, int sotype, int mapfd) static void test_lookup_after_delete(struct test_sockmap_listen *skel __always_unused,
int family, int sotype, int mapfd)
{ {
int err, s; int err, s;
u64 value; u64 value;
...@@ -493,7 +503,8 @@ static void test_lookup_after_delete(int family, int sotype, int mapfd) ...@@ -493,7 +503,8 @@ static void test_lookup_after_delete(int family, int sotype, int mapfd)
xclose(s); xclose(s);
} }
static void test_lookup_32_bit_value(int family, int sotype, int mapfd) static void test_lookup_32_bit_value(struct test_sockmap_listen *skel __always_unused,
int family, int sotype, int mapfd)
{ {
u32 key, value32; u32 key, value32;
int err, s; int err, s;
...@@ -523,7 +534,8 @@ static void test_lookup_32_bit_value(int family, int sotype, int mapfd) ...@@ -523,7 +534,8 @@ static void test_lookup_32_bit_value(int family, int sotype, int mapfd)
xclose(s); xclose(s);
} }
static void test_update_existing(int family, int sotype, int mapfd) static void test_update_existing(struct test_sockmap_listen *skel __always_unused,
int family, int sotype, int mapfd)
{ {
int s1, s2; int s1, s2;
u64 value; u64 value;
...@@ -551,7 +563,8 @@ static void test_update_existing(int family, int sotype, int mapfd) ...@@ -551,7 +563,8 @@ static void test_update_existing(int family, int sotype, int mapfd)
/* Exercise the code path where we destroy child sockets that never /* Exercise the code path where we destroy child sockets that never
* got accept()'ed, aka orphans, when parent socket gets closed. * got accept()'ed, aka orphans, when parent socket gets closed.
*/ */
static void test_destroy_orphan_child(int family, int sotype, int mapfd) static void test_destroy_orphan_child(struct test_sockmap_listen *skel __always_unused,
int family, int sotype, int mapfd)
{ {
struct sockaddr_storage addr; struct sockaddr_storage addr;
socklen_t len; socklen_t len;
...@@ -585,7 +598,8 @@ static void test_destroy_orphan_child(int family, int sotype, int mapfd) ...@@ -585,7 +598,8 @@ static void test_destroy_orphan_child(int family, int sotype, int mapfd)
/* Perform a passive open after removing listening socket from SOCKMAP /* Perform a passive open after removing listening socket from SOCKMAP
* to ensure that callbacks get restored properly. * to ensure that callbacks get restored properly.
*/ */
static void test_clone_after_delete(int family, int sotype, int mapfd) static void test_clone_after_delete(struct test_sockmap_listen *skel __always_unused,
int family, int sotype, int mapfd)
{ {
struct sockaddr_storage addr; struct sockaddr_storage addr;
socklen_t len; socklen_t len;
...@@ -621,7 +635,8 @@ static void test_clone_after_delete(int family, int sotype, int mapfd) ...@@ -621,7 +635,8 @@ static void test_clone_after_delete(int family, int sotype, int mapfd)
* SOCKMAP, but got accept()'ed only after the parent has been removed * SOCKMAP, but got accept()'ed only after the parent has been removed
* from SOCKMAP, gets cloned without parent psock state or callbacks. * from SOCKMAP, gets cloned without parent psock state or callbacks.
*/ */
static void test_accept_after_delete(int family, int sotype, int mapfd) static void test_accept_after_delete(struct test_sockmap_listen *skel __always_unused,
int family, int sotype, int mapfd)
{ {
struct sockaddr_storage addr; struct sockaddr_storage addr;
const u32 zero = 0; const u32 zero = 0;
...@@ -675,7 +690,8 @@ static void test_accept_after_delete(int family, int sotype, int mapfd) ...@@ -675,7 +690,8 @@ static void test_accept_after_delete(int family, int sotype, int mapfd)
/* Check that child socket that got created and accepted while parent /* Check that child socket that got created and accepted while parent
* was in a SOCKMAP is cloned without parent psock state or callbacks. * was in a SOCKMAP is cloned without parent psock state or callbacks.
*/ */
static void test_accept_before_delete(int family, int sotype, int mapfd) static void test_accept_before_delete(struct test_sockmap_listen *skel __always_unused,
int family, int sotype, int mapfd)
{ {
struct sockaddr_storage addr; struct sockaddr_storage addr;
const u32 zero = 0, one = 1; const u32 zero = 0, one = 1;
...@@ -784,7 +800,8 @@ static void *connect_accept_thread(void *arg) ...@@ -784,7 +800,8 @@ static void *connect_accept_thread(void *arg)
return NULL; return NULL;
} }
static void test_syn_recv_insert_delete(int family, int sotype, int mapfd) static void test_syn_recv_insert_delete(struct test_sockmap_listen *skel __always_unused,
int family, int sotype, int mapfd)
{ {
struct connect_accept_ctx ctx = { 0 }; struct connect_accept_ctx ctx = { 0 };
struct sockaddr_storage addr; struct sockaddr_storage addr;
...@@ -847,7 +864,8 @@ static void *listen_thread(void *arg) ...@@ -847,7 +864,8 @@ static void *listen_thread(void *arg)
return NULL; return NULL;
} }
static void test_race_insert_listen(int family, int socktype, int mapfd) static void test_race_insert_listen(struct test_sockmap_listen *skel __always_unused,
int family, int socktype, int mapfd)
{ {
struct connect_accept_ctx ctx = { 0 }; struct connect_accept_ctx ctx = { 0 };
const u32 zero = 0; const u32 zero = 0;
...@@ -1473,7 +1491,8 @@ static void test_ops(struct test_sockmap_listen *skel, struct bpf_map *map, ...@@ -1473,7 +1491,8 @@ static void test_ops(struct test_sockmap_listen *skel, struct bpf_map *map,
int family, int sotype) int family, int sotype)
{ {
const struct op_test { const struct op_test {
void (*fn)(int family, int sotype, int mapfd); void (*fn)(struct test_sockmap_listen *skel,
int family, int sotype, int mapfd);
const char *name; const char *name;
int sotype; int sotype;
} tests[] = { } tests[] = {
...@@ -1520,7 +1539,7 @@ static void test_ops(struct test_sockmap_listen *skel, struct bpf_map *map, ...@@ -1520,7 +1539,7 @@ static void test_ops(struct test_sockmap_listen *skel, struct bpf_map *map,
if (!test__start_subtest(s)) if (!test__start_subtest(s))
continue; continue;
t->fn(family, sotype, map_fd); t->fn(skel, family, sotype, map_fd);
test_ops_cleanup(map); test_ops_cleanup(map);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment