1b8bff6f8SYiFei Zhu // SPDX-License-Identifier: GPL-2.0-only
2b8bff6f8SYiFei Zhu 
3b8bff6f8SYiFei Zhu /*
4b8bff6f8SYiFei Zhu  * Copyright 2021 Google LLC.
5b8bff6f8SYiFei Zhu  */
6b8bff6f8SYiFei Zhu 
7b8bff6f8SYiFei Zhu #include <errno.h>
8b8bff6f8SYiFei Zhu #include <linux/bpf.h>
9b8bff6f8SYiFei Zhu #include <bpf/bpf_helpers.h>
10b8bff6f8SYiFei Zhu 
11b8bff6f8SYiFei Zhu __u32 invocations = 0;
12b8bff6f8SYiFei Zhu __u32 assertion_error = 0;
13b8bff6f8SYiFei Zhu __u32 retval_value = 0;
14*e01b4a72SStanislav Fomichev __u32 page_size = 0;
15b8bff6f8SYiFei Zhu 
16b8bff6f8SYiFei Zhu SEC("cgroup/setsockopt")
get_retval(struct bpf_sockopt * ctx)17b8bff6f8SYiFei Zhu int get_retval(struct bpf_sockopt *ctx)
18b8bff6f8SYiFei Zhu {
19b8bff6f8SYiFei Zhu 	retval_value = bpf_get_retval();
20b8bff6f8SYiFei Zhu 	__sync_fetch_and_add(&invocations, 1);
21b8bff6f8SYiFei Zhu 
22*e01b4a72SStanislav Fomichev 	/* optval larger than PAGE_SIZE use kernel's buffer. */
23*e01b4a72SStanislav Fomichev 	if (ctx->optlen > page_size)
24*e01b4a72SStanislav Fomichev 		ctx->optlen = 0;
25*e01b4a72SStanislav Fomichev 
26b8bff6f8SYiFei Zhu 	return 1;
27b8bff6f8SYiFei Zhu }
28b8bff6f8SYiFei Zhu 
29b8bff6f8SYiFei Zhu SEC("cgroup/setsockopt")
set_eunatch(struct bpf_sockopt * ctx)30b8bff6f8SYiFei Zhu int set_eunatch(struct bpf_sockopt *ctx)
31b8bff6f8SYiFei Zhu {
32b8bff6f8SYiFei Zhu 	__sync_fetch_and_add(&invocations, 1);
33b8bff6f8SYiFei Zhu 
34b8bff6f8SYiFei Zhu 	if (bpf_set_retval(-EUNATCH))
35b8bff6f8SYiFei Zhu 		assertion_error = 1;
36b8bff6f8SYiFei Zhu 
37*e01b4a72SStanislav Fomichev 	/* optval larger than PAGE_SIZE use kernel's buffer. */
38*e01b4a72SStanislav Fomichev 	if (ctx->optlen > page_size)
39*e01b4a72SStanislav Fomichev 		ctx->optlen = 0;
40*e01b4a72SStanislav Fomichev 
41b8bff6f8SYiFei Zhu 	return 0;
42b8bff6f8SYiFei Zhu }
43b8bff6f8SYiFei Zhu 
44b8bff6f8SYiFei Zhu SEC("cgroup/setsockopt")
set_eisconn(struct bpf_sockopt * ctx)45b8bff6f8SYiFei Zhu int set_eisconn(struct bpf_sockopt *ctx)
46b8bff6f8SYiFei Zhu {
47b8bff6f8SYiFei Zhu 	__sync_fetch_and_add(&invocations, 1);
48b8bff6f8SYiFei Zhu 
49b8bff6f8SYiFei Zhu 	if (bpf_set_retval(-EISCONN))
50b8bff6f8SYiFei Zhu 		assertion_error = 1;
51b8bff6f8SYiFei Zhu 
52*e01b4a72SStanislav Fomichev 	/* optval larger than PAGE_SIZE use kernel's buffer. */
53*e01b4a72SStanislav Fomichev 	if (ctx->optlen > page_size)
54*e01b4a72SStanislav Fomichev 		ctx->optlen = 0;
55*e01b4a72SStanislav Fomichev 
56b8bff6f8SYiFei Zhu 	return 0;
57b8bff6f8SYiFei Zhu }
58b8bff6f8SYiFei Zhu 
59b8bff6f8SYiFei Zhu SEC("cgroup/setsockopt")
legacy_eperm(struct bpf_sockopt * ctx)60b8bff6f8SYiFei Zhu int legacy_eperm(struct bpf_sockopt *ctx)
61b8bff6f8SYiFei Zhu {
62b8bff6f8SYiFei Zhu 	__sync_fetch_and_add(&invocations, 1);
63b8bff6f8SYiFei Zhu 
64*e01b4a72SStanislav Fomichev 	/* optval larger than PAGE_SIZE use kernel's buffer. */
65*e01b4a72SStanislav Fomichev 	if (ctx->optlen > page_size)
66*e01b4a72SStanislav Fomichev 		ctx->optlen = 0;
67*e01b4a72SStanislav Fomichev 
68b8bff6f8SYiFei Zhu 	return 0;
69b8bff6f8SYiFei Zhu }
70