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

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

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/bpf/prog_tests/sock_addr.c
Extension
.c
Size
57157 bytes
Lines
2661
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 init_sock_args {
	int af;
	int type;
};

struct addr_args {
	char addr[sizeof(struct sockaddr_storage)];
	int addrlen;
};

struct sendmsg_args {
	struct addr_args addr;
	char msg[10];
	int msglen;
};

static struct sock_addr_kern *skel;

static int run_bpf_prog(const char *prog_name, void *ctx, int ctx_size)
{
	LIBBPF_OPTS(bpf_test_run_opts, topts);
	struct bpf_program *prog;
	int prog_fd, err;

	topts.ctx_in = ctx;
	topts.ctx_size_in = ctx_size;

	prog = bpf_object__find_program_by_name(skel->obj, prog_name);
	if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name"))
		goto err;

	prog_fd = bpf_program__fd(prog);
	err = bpf_prog_test_run_opts(prog_fd, &topts);
	if (!ASSERT_OK(err, prog_name))
		goto err;

	err = topts.retval;
	errno = -topts.retval;
	goto out;
err:
	err = -1;
out:
	return err;
}

static int kernel_init_sock(int af, int type, int protocol)
{
	struct init_sock_args args = {
		.af = af,
		.type = type,
	};

	return run_bpf_prog("init_sock", &args, sizeof(args));
}

static int kernel_close_sock(int fd)
{
	return run_bpf_prog("close_sock", NULL, 0);
}

static int sock_addr_op(const char *name, struct sockaddr *addr,
			socklen_t *addrlen, bool expect_change)
{
	struct addr_args args;
	int err;

	if (addrlen)
		args.addrlen = *addrlen;

	if (addr)
		memcpy(&args.addr, addr, *addrlen);

	err = run_bpf_prog(name, &args, sizeof(args));

	if (!expect_change && addr)
		if (!ASSERT_EQ(cmp_addr((struct sockaddr_storage *)addr,
					*addrlen,
					(struct sockaddr_storage *)&args.addr,
					args.addrlen, 1),
			       0, "address_param_modified"))
			return -1;

	if (addrlen)
		*addrlen = args.addrlen;

	if (addr)
		memcpy(addr, &args.addr, *addrlen);

	return err;
}

Annotation

Implementation Notes