mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 18:37:58 -04:00
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: Jakub Sitnicki <jakub@cloudflare.com> Acked-by: John Fastabend <john.fastabend@gmail.com> Link: https://lore.kernel.org/r/20230113-sockmap-fix-v2-3-1e0ee7ac2f90@cloudflare.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
committed by
Alexei Starovoitov
parent
ddce1e0917
commit
b4ea530d02
@@ -30,6 +30,8 @@
|
||||
#define MAX_STRERR_LEN 256
|
||||
#define MAX_TEST_NAME 80
|
||||
|
||||
#define __always_unused __attribute__((__unused__))
|
||||
|
||||
#define _FAIL(errnum, fmt...) \
|
||||
({ \
|
||||
error_at_line(0, (errnum), __func__, __LINE__, fmt); \
|
||||
@@ -321,7 +323,8 @@ static int socket_loopback(int family, int sotype)
|
||||
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;
|
||||
u64 value;
|
||||
@@ -338,7 +341,8 @@ static void test_insert_invalid(int family, int sotype, int mapfd)
|
||||
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;
|
||||
u64 value;
|
||||
@@ -359,7 +363,8 @@ static void test_insert_opened(int family, int sotype, int mapfd)
|
||||
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;
|
||||
socklen_t len;
|
||||
@@ -386,7 +391,8 @@ static void test_insert_bound(int family, int sotype, int mapfd)
|
||||
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;
|
||||
u32 key;
|
||||
@@ -402,7 +408,8 @@ static void test_insert(int family, int sotype, int mapfd)
|
||||
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;
|
||||
u32 key;
|
||||
@@ -419,7 +426,8 @@ static void test_delete_after_insert(int family, int sotype, int mapfd)
|
||||
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;
|
||||
u64 value;
|
||||
@@ -442,7 +450,8 @@ static void test_delete_after_close(int family, int sotype, int mapfd)
|
||||
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;
|
||||
socklen_t len;
|
||||
@@ -470,7 +479,8 @@ static void test_lookup_after_insert(int family, int sotype, int mapfd)
|
||||
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;
|
||||
u64 value;
|
||||
@@ -493,7 +503,8 @@ static void test_lookup_after_delete(int family, int sotype, int mapfd)
|
||||
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;
|
||||
int err, s;
|
||||
@@ -523,7 +534,8 @@ static void test_lookup_32_bit_value(int family, int sotype, int mapfd)
|
||||
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;
|
||||
u64 value;
|
||||
@@ -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
|
||||
* 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;
|
||||
socklen_t len;
|
||||
@@ -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
|
||||
* 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;
|
||||
socklen_t len;
|
||||
@@ -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
|
||||
* 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;
|
||||
const u32 zero = 0;
|
||||
@@ -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
|
||||
* 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;
|
||||
const u32 zero = 0, one = 1;
|
||||
@@ -784,7 +800,8 @@ static void *connect_accept_thread(void *arg)
|
||||
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 sockaddr_storage addr;
|
||||
@@ -847,7 +864,8 @@ static void *listen_thread(void *arg)
|
||||
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 };
|
||||
const u32 zero = 0;
|
||||
@@ -1473,7 +1491,8 @@ static void test_ops(struct test_sockmap_listen *skel, struct bpf_map *map,
|
||||
int family, int sotype)
|
||||
{
|
||||
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;
|
||||
int sotype;
|
||||
} tests[] = {
|
||||
@@ -1520,7 +1539,7 @@ static void test_ops(struct test_sockmap_listen *skel, struct bpf_map *map,
|
||||
if (!test__start_subtest(s))
|
||||
continue;
|
||||
|
||||
t->fn(family, sotype, map_fd);
|
||||
t->fn(skel, family, sotype, map_fd);
|
||||
test_ops_cleanup(map);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user