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

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

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/bpf/prog_tests/sockmap_redir.c
Extension
.c
Size
11991 bytes
Lines
466
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 maps {
	int in;
	int out;
	int verd;
};

struct combo_spec {
	enum prog_type prog_type;
	const char *in, *out;
};

struct redir_spec {
	const char *name;
	int idx_send;
	int idx_recv;
	enum prog_type prog_type;
};

struct socket_spec {
	int family;
	int sotype;
	int send_flags;
	int in[2];
	int out[2];
};

static int socket_spec_pairs(struct socket_spec *s)
{
	return create_socket_pairs(s->family, s->sotype,
				   &s->in[0], &s->out[0],
				   &s->in[1], &s->out[1]);
}

static void socket_spec_close(struct socket_spec *s)
{
	xclose(s->in[0]);
	xclose(s->in[1]);
	xclose(s->out[0]);
	xclose(s->out[1]);
}

static void get_redir_params(struct redir_spec *redir,
			     struct test_sockmap_redir *skel, int *prog_fd,
			     enum bpf_attach_type *attach_type,
			     int *redirect_flags)
{
	enum prog_type type = redir->prog_type;
	struct bpf_program *prog;
	bool sk_msg;

	sk_msg = type == SK_MSG_INGRESS || type == SK_MSG_EGRESS;
	prog = sk_msg ? skel->progs.prog_msg_verdict : skel->progs.prog_skb_verdict;

	*prog_fd = bpf_program__fd(prog);
	*attach_type = sk_msg ? BPF_SK_MSG_VERDICT : BPF_SK_SKB_VERDICT;

	if (type == SK_MSG_INGRESS || type == SK_SKB_INGRESS)
		*redirect_flags = BPF_F_INGRESS;
	else
		*redirect_flags = 0;
}

static void try_recv(const char *prefix, int fd, int flags, bool expect_success)
{
	ssize_t n;
	char buf;

	errno = 0;
	n = recv(fd, &buf, 1, flags);
	if (n < 0 && expect_success)
		FAIL_ERRNO("%s: unexpected failure: retval=%zd", prefix, n);
	if (!n && !expect_success)
		FAIL("%s: expected failure: retval=%zd", prefix, n);
}

static void handle_unsupported(int sd_send, int sd_peer, int sd_in, int sd_out,
			       int sd_recv, int map_verd, int status)
{
	unsigned int drop, pass;
	char recv_buf;
	ssize_t n;

get_verdict:
	if (xbpf_map_lookup_elem(map_verd, &u32(SK_DROP), &drop) ||
	    xbpf_map_lookup_elem(map_verd, &u32(SK_PASS), &pass))
		return;

	if (pass == 0 && drop == 0 && (status & UNSUPPORTED_RACY_VERD)) {
		sched_yield();
		goto get_verdict;

Annotation

Implementation Notes