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