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") |
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") |
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") |
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 |