18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci#include <netinet/in.h>
38c2ecf20Sopenharmony_ci#include <linux/bpf.h>
48c2ecf20Sopenharmony_ci#include <bpf/bpf_helpers.h>
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_cichar _license[] SEC("license") = "GPL";
78c2ecf20Sopenharmony_ci__u32 _version SEC("version") = 1;
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ciSEC("cgroup/getsockopt/child")
108c2ecf20Sopenharmony_ciint _getsockopt_child(struct bpf_sockopt *ctx)
118c2ecf20Sopenharmony_ci{
128c2ecf20Sopenharmony_ci	__u8 *optval_end = ctx->optval_end;
138c2ecf20Sopenharmony_ci	__u8 *optval = ctx->optval;
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci	if (ctx->level != SOL_IP || ctx->optname != IP_TOS)
168c2ecf20Sopenharmony_ci		return 1;
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci	if (optval + 1 > optval_end)
198c2ecf20Sopenharmony_ci		return 0; /* EPERM, bounds check */
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci	if (optval[0] != 0x80)
228c2ecf20Sopenharmony_ci		return 0; /* EPERM, unexpected optval from the kernel */
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	ctx->retval = 0; /* Reset system call return value to zero */
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci	optval[0] = 0x90;
278c2ecf20Sopenharmony_ci	ctx->optlen = 1;
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci	return 1;
308c2ecf20Sopenharmony_ci}
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ciSEC("cgroup/getsockopt/parent")
338c2ecf20Sopenharmony_ciint _getsockopt_parent(struct bpf_sockopt *ctx)
348c2ecf20Sopenharmony_ci{
358c2ecf20Sopenharmony_ci	__u8 *optval_end = ctx->optval_end;
368c2ecf20Sopenharmony_ci	__u8 *optval = ctx->optval;
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	if (ctx->level != SOL_IP || ctx->optname != IP_TOS)
398c2ecf20Sopenharmony_ci		return 1;
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	if (optval + 1 > optval_end)
428c2ecf20Sopenharmony_ci		return 0; /* EPERM, bounds check */
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	if (optval[0] != 0x90)
458c2ecf20Sopenharmony_ci		return 0; /* EPERM, unexpected optval from the kernel */
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci	ctx->retval = 0; /* Reset system call return value to zero */
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	optval[0] = 0xA0;
508c2ecf20Sopenharmony_ci	ctx->optlen = 1;
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci	return 1;
538c2ecf20Sopenharmony_ci}
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ciSEC("cgroup/setsockopt")
568c2ecf20Sopenharmony_ciint _setsockopt(struct bpf_sockopt *ctx)
578c2ecf20Sopenharmony_ci{
588c2ecf20Sopenharmony_ci	__u8 *optval_end = ctx->optval_end;
598c2ecf20Sopenharmony_ci	__u8 *optval = ctx->optval;
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci	if (ctx->level != SOL_IP || ctx->optname != IP_TOS)
628c2ecf20Sopenharmony_ci		return 1;
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci	if (optval + 1 > optval_end)
658c2ecf20Sopenharmony_ci		return 0; /* EPERM, bounds check */
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci	optval[0] += 0x10;
688c2ecf20Sopenharmony_ci	ctx->optlen = 1;
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci	return 1;
718c2ecf20Sopenharmony_ci}
72