xref: /linux/tools/testing/selftests/bpf/progs/cgroup_getset_retval_setsockopt.c (revision 4b660dbd9ee2059850fd30e0df420ca7a38a1856)
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 __s32 page_size = 0;
15 
16 SEC("cgroup/setsockopt")
17 int get_retval(struct bpf_sockopt *ctx)
18 {
19 	retval_value = bpf_get_retval();
20 	__sync_fetch_and_add(&invocations, 1);
21 
22 	/* optval larger than PAGE_SIZE use kernel's buffer. */
23 	if (ctx->optlen > page_size)
24 		ctx->optlen = 0;
25 
26 	return 1;
27 }
28 
29 SEC("cgroup/setsockopt")
30 int set_eunatch(struct bpf_sockopt *ctx)
31 {
32 	__sync_fetch_and_add(&invocations, 1);
33 
34 	if (bpf_set_retval(-EUNATCH))
35 		assertion_error = 1;
36 
37 	/* optval larger than PAGE_SIZE use kernel's buffer. */
38 	if (ctx->optlen > page_size)
39 		ctx->optlen = 0;
40 
41 	return 0;
42 }
43 
44 SEC("cgroup/setsockopt")
45 int set_eisconn(struct bpf_sockopt *ctx)
46 {
47 	__sync_fetch_and_add(&invocations, 1);
48 
49 	if (bpf_set_retval(-EISCONN))
50 		assertion_error = 1;
51 
52 	/* optval larger than PAGE_SIZE use kernel's buffer. */
53 	if (ctx->optlen > page_size)
54 		ctx->optlen = 0;
55 
56 	return 0;
57 }
58 
59 SEC("cgroup/setsockopt")
60 int legacy_eperm(struct bpf_sockopt *ctx)
61 {
62 	__sync_fetch_and_add(&invocations, 1);
63 
64 	/* optval larger than PAGE_SIZE use kernel's buffer. */
65 	if (ctx->optlen > page_size)
66 		ctx->optlen = 0;
67 
68 	return 0;
69 }
70