59 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2 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 17SEC("cgroup/getsockopt")18int 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 31SEC("cgroup/getsockopt")32int 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 46SEC("cgroup/getsockopt")47int 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