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;
14b8bff6f8SYiFei Zhu __u32 ctx_retval_value = 0;
15*e01b4a72SStanislav Fomichev __u32 page_size = 0;
16b8bff6f8SYiFei Zhu 
17b8bff6f8SYiFei Zhu SEC("cgroup/getsockopt")
get_retval(struct bpf_sockopt * ctx)18b8bff6f8SYiFei Zhu int get_retval(struct bpf_sockopt *ctx)
19b8bff6f8SYiFei Zhu {
20b8bff6f8SYiFei Zhu 	retval_value = bpf_get_retval();
21b8bff6f8SYiFei Zhu 	ctx_retval_value = ctx->retval;
22b8bff6f8SYiFei Zhu 	__sync_fetch_and_add(&invocations, 1);
23b8bff6f8SYiFei Zhu 
24*e01b4a72SStanislav Fomichev 	/* optval larger than PAGE_SIZE use kernel's buffer. */
25*e01b4a72SStanislav Fomichev 	if (ctx->optlen > page_size)
26*e01b4a72SStanislav Fomichev 		ctx->optlen = 0;
27*e01b4a72SStanislav Fomichev 
28b8bff6f8SYiFei Zhu 	return 1;
29b8bff6f8SYiFei Zhu }
30b8bff6f8SYiFei Zhu 
31b8bff6f8SYiFei Zhu SEC("cgroup/getsockopt")
set_eisconn(struct bpf_sockopt * ctx)32b8bff6f8SYiFei Zhu int set_eisconn(struct bpf_sockopt *ctx)
33b8bff6f8SYiFei Zhu {
34b8bff6f8SYiFei Zhu 	__sync_fetch_and_add(&invocations, 1);
35b8bff6f8SYiFei Zhu 
36b8bff6f8SYiFei Zhu 	if (bpf_set_retval(-EISCONN))
37b8bff6f8SYiFei Zhu 		assertion_error = 1;
38b8bff6f8SYiFei Zhu 
39*e01b4a72SStanislav Fomichev 	/* optval larger than PAGE_SIZE use kernel's buffer. */
40*e01b4a72SStanislav Fomichev 	if (ctx->optlen > page_size)
41*e01b4a72SStanislav Fomichev 		ctx->optlen = 0;
42*e01b4a72SStanislav Fomichev 
43b8bff6f8SYiFei Zhu 	return 1;
44b8bff6f8SYiFei Zhu }
45b8bff6f8SYiFei Zhu 
46b8bff6f8SYiFei Zhu SEC("cgroup/getsockopt")
clear_retval(struct bpf_sockopt * ctx)47b8bff6f8SYiFei Zhu int clear_retval(struct bpf_sockopt *ctx)
48b8bff6f8SYiFei Zhu {
49b8bff6f8SYiFei Zhu 	__sync_fetch_and_add(&invocations, 1);
50b8bff6f8SYiFei Zhu 
51b8bff6f8SYiFei Zhu 	ctx->retval = 0;
52b8bff6f8SYiFei Zhu 
53*e01b4a72SStanislav Fomichev 	/* optval larger than PAGE_SIZE use kernel's buffer. */
54*e01b4a72SStanislav Fomichev 	if (ctx->optlen > page_size)
55*e01b4a72SStanislav Fomichev 		ctx->optlen = 0;
56*e01b4a72SStanislav Fomichev 
57b8bff6f8SYiFei Zhu 	return 1;
58b8bff6f8SYiFei Zhu }
59