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