tools/testing/selftests/bpf/prog_tests/cgroup_getset_retval.c

Source file repositories/reference/linux-study-clean/tools/testing/selftests/bpf/prog_tests/cgroup_getset_retval.c

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/bpf/prog_tests/cgroup_getset_retval.c
Extension
.c
Size
17644 bytes
Lines
550
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

struct exposed_hook {
	const char *name;
	int expected_err;
} exposed_hooks[] = {

#define BPF_RETVAL_HOOK(NAME, SECTION, CTX, EXPECTED_ERR) \
	{ \
		.name = #NAME, \
		.expected_err = EXPECTED_ERR, \
	},

#include "cgroup_getset_retval_hooks.h"

#undef BPF_RETVAL_HOOK
};

static void test_exposed_hooks(int cgroup_fd, int sock_fd)
{
	struct cgroup_getset_retval_hooks *skel;
	struct bpf_program *prog;
	int err;
	int i;

	for (i = 0; i < ARRAY_SIZE(exposed_hooks); i++) {
		skel = cgroup_getset_retval_hooks__open();
		if (!ASSERT_OK_PTR(skel, "cgroup_getset_retval_hooks__open"))
			continue;

		prog = bpf_object__find_program_by_name(skel->obj, exposed_hooks[i].name);
		if (!ASSERT_NEQ(prog, NULL, "bpf_object__find_program_by_name"))
			goto close_skel;

		err = bpf_program__set_autoload(prog, true);
		if (!ASSERT_OK(err, "bpf_program__set_autoload"))
			goto close_skel;

		err = cgroup_getset_retval_hooks__load(skel);
		ASSERT_EQ(err, exposed_hooks[i].expected_err, "expected_err");

close_skel:
		cgroup_getset_retval_hooks__destroy(skel);
	}
}

void test_cgroup_getset_retval(void)
{
	int cgroup_fd = -1;
	int sock_fd = -1;

	cgroup_fd = test__join_cgroup("/cgroup_getset_retval");
	if (!ASSERT_GE(cgroup_fd, 0, "cg-create"))
		goto close_fd;

	sock_fd = start_server(AF_INET, SOCK_DGRAM, NULL, 0, 0);
	if (!ASSERT_GE(sock_fd, 0, "start-server"))
		goto close_fd;

	if (test__start_subtest("setsockopt-set"))
		test_setsockopt_set(cgroup_fd, sock_fd);

	if (test__start_subtest("setsockopt-set_and_get"))
		test_setsockopt_set_and_get(cgroup_fd, sock_fd);

	if (test__start_subtest("setsockopt-default_zero"))
		test_setsockopt_default_zero(cgroup_fd, sock_fd);

	if (test__start_subtest("setsockopt-default_zero_and_set"))
		test_setsockopt_default_zero_and_set(cgroup_fd, sock_fd);

	if (test__start_subtest("setsockopt-override"))
		test_setsockopt_override(cgroup_fd, sock_fd);

	if (test__start_subtest("setsockopt-legacy_eperm"))
		test_setsockopt_legacy_eperm(cgroup_fd, sock_fd);

	if (test__start_subtest("setsockopt-legacy_no_override"))
		test_setsockopt_legacy_no_override(cgroup_fd, sock_fd);

	if (test__start_subtest("getsockopt-get"))
		test_getsockopt_get(cgroup_fd, sock_fd);

	if (test__start_subtest("getsockopt-override"))
		test_getsockopt_override(cgroup_fd, sock_fd);

	if (test__start_subtest("getsockopt-retval_sync"))
		test_getsockopt_retval_sync(cgroup_fd, sock_fd);

	if (test__start_subtest("exposed_hooks"))
		test_exposed_hooks(cgroup_fd, sock_fd);

Annotation

Implementation Notes