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 |