aboutsummaryrefslogtreecommitdiff
path: root/tools/testing/selftests/bpf/prog_tests
diff options
context:
space:
mode:
Diffstat (limited to 'tools/testing/selftests/bpf/prog_tests')
-rw-r--r--tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c43
1 files changed, 35 insertions, 8 deletions
diff --git a/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c b/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c
index e90e0547d759..1c7653423698 100644
--- a/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c
+++ b/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c
@@ -8,7 +8,10 @@
#include <cgroup_helpers.h>
#include <network_helpers.h>
+#include "progs/cg_storage_multi.h"
+
#include "cg_storage_multi_egress_only.skel.h"
+#include "cg_storage_multi_egress_ingress.skel.h"
#define PARENT_CGROUP "/cgroup_storage"
#define CHILD_CGROUP "/cgroup_storage/child"
@@ -16,10 +19,10 @@
static int duration;
static bool assert_storage(struct bpf_map *map, const char *cgroup_path,
- __u32 expected)
+ struct cgroup_value *expected)
{
struct bpf_cgroup_storage_key key = {0};
- __u32 value;
+ struct cgroup_value value;
int map_fd;
map_fd = bpf_map__fd(map);
@@ -29,8 +32,8 @@ static bool assert_storage(struct bpf_map *map, const char *cgroup_path,
if (CHECK(bpf_map_lookup_elem(map_fd, &key, &value) < 0,
"map-lookup", "errno %d", errno))
return true;
- if (CHECK(value != expected,
- "assert-storage", "got %u expected %u", value, expected))
+ if (CHECK(memcmp(&value, expected, sizeof(struct cgroup_value)),
+ "assert-storage", "storages differ"))
return true;
return false;
@@ -39,7 +42,7 @@ static bool assert_storage(struct bpf_map *map, const char *cgroup_path,
static bool assert_storage_noexist(struct bpf_map *map, const char *cgroup_path)
{
struct bpf_cgroup_storage_key key = {0};
- __u32 value;
+ struct cgroup_value value;
int map_fd;
map_fd = bpf_map__fd(map);
@@ -86,6 +89,7 @@ out_clean:
static void test_egress_only(int parent_cgroup_fd, int child_cgroup_fd)
{
struct cg_storage_multi_egress_only *obj;
+ struct cgroup_value expected_cgroup_value;
struct bpf_link *parent_link = NULL, *child_link = NULL;
bool err;
@@ -109,7 +113,9 @@ static void test_egress_only(int parent_cgroup_fd, int child_cgroup_fd)
if (CHECK(obj->bss->invocations != 1,
"first-invoke", "invocations=%d", obj->bss->invocations))
goto close_bpf_object;
- if (assert_storage(obj->maps.cgroup_storage, PARENT_CGROUP, 1))
+ expected_cgroup_value = (struct cgroup_value) { .egress_pkts = 1 };
+ if (assert_storage(obj->maps.cgroup_storage,
+ PARENT_CGROUP, &expected_cgroup_value))
goto close_bpf_object;
if (assert_storage_noexist(obj->maps.cgroup_storage, CHILD_CGROUP))
goto close_bpf_object;
@@ -129,9 +135,13 @@ static void test_egress_only(int parent_cgroup_fd, int child_cgroup_fd)
if (CHECK(obj->bss->invocations != 3,
"second-invoke", "invocations=%d", obj->bss->invocations))
goto close_bpf_object;
- if (assert_storage(obj->maps.cgroup_storage, PARENT_CGROUP, 2))
+ expected_cgroup_value = (struct cgroup_value) { .egress_pkts = 2 };
+ if (assert_storage(obj->maps.cgroup_storage,
+ PARENT_CGROUP, &expected_cgroup_value))
goto close_bpf_object;
- if (assert_storage(obj->maps.cgroup_storage, CHILD_CGROUP, 1))
+ expected_cgroup_value = (struct cgroup_value) { .egress_pkts = 1 };
+ if (assert_storage(obj->maps.cgroup_storage,
+ CHILD_CGROUP, &expected_cgroup_value))
goto close_bpf_object;
close_bpf_object:
@@ -141,6 +151,20 @@ close_bpf_object:
cg_storage_multi_egress_only__destroy(obj);
}
+static void test_egress_ingress(int parent_cgroup_fd, int child_cgroup_fd)
+{
+ struct cg_storage_multi_egress_ingress *obj;
+
+ /* Cannot load both programs due to verifier failure:
+ * "only one cgroup storage of each type is allowed"
+ */
+ obj = cg_storage_multi_egress_ingress__open_and_load();
+ CHECK(obj || errno != EBUSY,
+ "skel-load", "errno %d, expected EBUSY", errno);
+
+ cg_storage_multi_egress_ingress__destroy(obj);
+}
+
void test_cg_storage_multi(void)
{
int parent_cgroup_fd = -1, child_cgroup_fd = -1;
@@ -155,6 +179,9 @@ void test_cg_storage_multi(void)
if (test__start_subtest("egress_only"))
test_egress_only(parent_cgroup_fd, child_cgroup_fd);
+ if (test__start_subtest("egress_ingress"))
+ test_egress_ingress(parent_cgroup_fd, child_cgroup_fd);
+
close_cgroup_fd:
close(child_cgroup_fd);
close(parent_cgroup_fd);