1 // SPDX-License-Identifier: GPL-2.0
2 #include <netinet/in.h>
4 #include <bpf/bpf_helpers.h>
6 char _license[] SEC("license") = "GPL";
10 SEC("cgroup/getsockopt")
11 int _getsockopt_child(struct bpf_sockopt *ctx)
13 __u8 *optval_end = ctx->optval_end;
14 __u8 *optval = ctx->optval;
16 if (ctx->level != SOL_IP || ctx->optname != IP_TOS)
19 if (optval + 1 > optval_end)
20 return 0; /* EPERM, bounds check */
22 if (optval[0] != 0x80)
23 return 0; /* EPERM, unexpected optval from the kernel */
25 ctx->retval = 0; /* Reset system call return value to zero */
33 /* optval larger than PAGE_SIZE use kernel's buffer. */
34 if (ctx->optlen > page_size)
39 SEC("cgroup/getsockopt")
40 int _getsockopt_parent(struct bpf_sockopt *ctx)
42 __u8 *optval_end = ctx->optval_end;
43 __u8 *optval = ctx->optval;
45 if (ctx->level != SOL_IP || ctx->optname != IP_TOS)
48 if (optval + 1 > optval_end)
49 return 0; /* EPERM, bounds check */
51 if (optval[0] != 0x90)
52 return 0; /* EPERM, unexpected optval from the kernel */
54 ctx->retval = 0; /* Reset system call return value to zero */
62 /* optval larger than PAGE_SIZE use kernel's buffer. */
63 if (ctx->optlen > page_size)
68 SEC("cgroup/setsockopt")
69 int _setsockopt(struct bpf_sockopt *ctx)
71 __u8 *optval_end = ctx->optval_end;
72 __u8 *optval = ctx->optval;
74 if (ctx->level != SOL_IP || ctx->optname != IP_TOS)
77 if (optval + 1 > optval_end)
78 return 0; /* EPERM, bounds check */
86 /* optval larger than PAGE_SIZE use kernel's buffer. */
87 if (ctx->optlen > page_size)