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