Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.2.
 1// SPDX-License-Identifier: GPL-2.0
 2
 3#include <test_progs.h>
 4#include "cgroup_helpers.h"
 5#include "network_helpers.h"
 6#include "cgroup_storage.skel.h"
 7
 8#define TEST_CGROUP "/test-bpf-cgroup-storage-buf/"
 9#define TEST_NS "cgroup_storage_ns"
10#define PING_CMD "ping localhost -c 1 -W 1 -q"
11
12static int setup_network(struct nstoken **token)
13{
14	SYS(fail, "ip netns add %s", TEST_NS);
15	*token = open_netns(TEST_NS);
16	if (!ASSERT_OK_PTR(*token, "open netns"))
17		goto cleanup_ns;
18	SYS(cleanup_ns, "ip link set lo up");
19
20	return 0;
21
22cleanup_ns:
23	SYS_NOFAIL("ip netns del %s", TEST_NS);
24fail:
25	return -1;
26}
27
28static void cleanup_network(struct nstoken *ns)
29{
30	close_netns(ns);
31	SYS_NOFAIL("ip netns del %s", TEST_NS);
32}
33
34void test_cgroup_storage(void)
35{
36	struct bpf_cgroup_storage_key key;
37	struct cgroup_storage *skel;
38	struct nstoken *ns = NULL;
39	unsigned long long value;
40	int cgroup_fd;
41	int err;
42
43	cgroup_fd = cgroup_setup_and_join(TEST_CGROUP);
44	if (!ASSERT_OK_FD(cgroup_fd, "create cgroup"))
45		return;
46
47	if (!ASSERT_OK(setup_network(&ns), "setup network"))
48		goto cleanup_cgroup;
49
50	skel = cgroup_storage__open_and_load();
51	if (!ASSERT_OK_PTR(skel, "load program"))
52		goto cleanup_network;
53
54	skel->links.bpf_prog =
55		bpf_program__attach_cgroup(skel->progs.bpf_prog, cgroup_fd);
56	if (!ASSERT_OK_PTR(skel->links.bpf_prog, "attach program"))
57		goto cleanup_progs;
58
59	/* Check that one out of every two packets is dropped */
60	err = SYS_NOFAIL(PING_CMD);
61	ASSERT_OK(err, "first ping");
62	err = SYS_NOFAIL(PING_CMD);
63	ASSERT_NEQ(err, 0, "second ping");
64	err = SYS_NOFAIL(PING_CMD);
65	ASSERT_OK(err, "third ping");
66
67	err = bpf_map__get_next_key(skel->maps.cgroup_storage, NULL, &key,
68				    sizeof(key));
69	if (!ASSERT_OK(err, "get first key"))
70		goto cleanup_progs;
71	err = bpf_map__lookup_elem(skel->maps.cgroup_storage, &key, sizeof(key),
72				   &value, sizeof(value), 0);
73	if (!ASSERT_OK(err, "first packet count read"))
74		goto cleanup_progs;
75
76	/* Add one to the packet counter, check again packet filtering */
77	value++;
78	err = bpf_map__update_elem(skel->maps.cgroup_storage, &key, sizeof(key),
79				   &value, sizeof(value), 0);
80	if (!ASSERT_OK(err, "increment packet counter"))
81		goto cleanup_progs;
82	err = SYS_NOFAIL(PING_CMD);
83	ASSERT_OK(err, "fourth ping");
84	err = SYS_NOFAIL(PING_CMD);
85	ASSERT_NEQ(err, 0, "fifth ping");
86	err = SYS_NOFAIL(PING_CMD);
87	ASSERT_OK(err, "sixth ping");
88
89cleanup_progs:
90	cgroup_storage__destroy(skel);
91cleanup_network:
92	cleanup_network(ns);
93cleanup_cgroup:
94	close(cgroup_fd);
95	cleanup_cgroup_environment();
96}