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 Zhuint 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 Zhuint 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 Zhuint 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 Zhuint 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