xref: /linux/tools/testing/selftests/bpf/progs/cgroup_getset_retval_getsockopt.c (revision cdd5b5a9761fd66d17586e4f4ba6588c70e640ea)
1 // SPDX-License-Identifier: GPL-2.0-only
2 
3 /*
4  * Copyright 2021 Google LLC.
5  */
6 
7 #include <errno.h>
8 #include <linux/bpf.h>
9 #include <bpf/bpf_helpers.h>
10 
11 __u32 invocations = 0;
12 __u32 assertion_error = 0;
13 __u32 retval_value = 0;
14 __u32 ctx_retval_value = 0;
15 __u32 page_size = 0;
16 
17 SEC("cgroup/getsockopt")
get_retval(struct bpf_sockopt * ctx)18 int get_retval(struct bpf_sockopt *ctx)
19 {
20 	retval_value = bpf_get_retval();
21 	ctx_retval_value = ctx->retval;
22 	__sync_fetch_and_add(&invocations, 1);
23 
24 	/* optval larger than PAGE_SIZE use kernel's buffer. */
25 	if (ctx->optlen > page_size)
26 		ctx->optlen = 0;
27 
28 	return 1;
29 }
30 
31 SEC("cgroup/getsockopt")
set_eisconn(struct bpf_sockopt * ctx)32 int set_eisconn(struct bpf_sockopt *ctx)
33 {
34 	__sync_fetch_and_add(&invocations, 1);
35 
36 	if (bpf_set_retval(-EISCONN))
37 		assertion_error = 1;
38 
39 	/* optval larger than PAGE_SIZE use kernel's buffer. */
40 	if (ctx->optlen > page_size)
41 		ctx->optlen = 0;
42 
43 	return 1;
44 }
45 
46 SEC("cgroup/getsockopt")
clear_retval(struct bpf_sockopt * ctx)47 int clear_retval(struct bpf_sockopt *ctx)
48 {
49 	__sync_fetch_and_add(&invocations, 1);
50 
51 	ctx->retval = 0;
52 
53 	/* optval larger than PAGE_SIZE use kernel's buffer. */
54 	if (ctx->optlen > page_size)
55 		ctx->optlen = 0;
56 
57 	return 1;
58 }
59