18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci// Copyright (c) 2019 Facebook 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci#include <fcntl.h> 58c2ecf20Sopenharmony_ci#include <stdint.h> 68c2ecf20Sopenharmony_ci#include <stdio.h> 78c2ecf20Sopenharmony_ci#include <stdlib.h> 88c2ecf20Sopenharmony_ci#include <string.h> 98c2ecf20Sopenharmony_ci#include <unistd.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/filter.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <bpf/bpf.h> 148c2ecf20Sopenharmony_ci#include <bpf/libbpf.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include <bpf/bpf_endian.h> 178c2ecf20Sopenharmony_ci#include "bpf_rlimit.h" 188c2ecf20Sopenharmony_ci#include "bpf_util.h" 198c2ecf20Sopenharmony_ci#include "cgroup_helpers.h" 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#define CG_PATH "/foo" 228c2ecf20Sopenharmony_ci#define MAX_INSNS 512 238c2ecf20Sopenharmony_ci#define FIXUP_SYSCTL_VALUE 0 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cichar bpf_log_buf[BPF_LOG_BUF_SIZE]; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cistruct sysctl_test { 288c2ecf20Sopenharmony_ci const char *descr; 298c2ecf20Sopenharmony_ci size_t fixup_value_insn; 308c2ecf20Sopenharmony_ci struct bpf_insn insns[MAX_INSNS]; 318c2ecf20Sopenharmony_ci const char *prog_file; 328c2ecf20Sopenharmony_ci enum bpf_attach_type attach_type; 338c2ecf20Sopenharmony_ci const char *sysctl; 348c2ecf20Sopenharmony_ci int open_flags; 358c2ecf20Sopenharmony_ci int seek; 368c2ecf20Sopenharmony_ci const char *newval; 378c2ecf20Sopenharmony_ci const char *oldval; 388c2ecf20Sopenharmony_ci enum { 398c2ecf20Sopenharmony_ci LOAD_REJECT, 408c2ecf20Sopenharmony_ci ATTACH_REJECT, 418c2ecf20Sopenharmony_ci OP_EPERM, 428c2ecf20Sopenharmony_ci SUCCESS, 438c2ecf20Sopenharmony_ci } result; 448c2ecf20Sopenharmony_ci}; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_cistatic struct sysctl_test tests[] = { 478c2ecf20Sopenharmony_ci { 488c2ecf20Sopenharmony_ci .descr = "sysctl wrong attach_type", 498c2ecf20Sopenharmony_ci .insns = { 508c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 518c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 528c2ecf20Sopenharmony_ci }, 538c2ecf20Sopenharmony_ci .attach_type = 0, 548c2ecf20Sopenharmony_ci .sysctl = "kernel/ostype", 558c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 568c2ecf20Sopenharmony_ci .result = ATTACH_REJECT, 578c2ecf20Sopenharmony_ci }, 588c2ecf20Sopenharmony_ci { 598c2ecf20Sopenharmony_ci .descr = "sysctl:read allow all", 608c2ecf20Sopenharmony_ci .insns = { 618c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 628c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 638c2ecf20Sopenharmony_ci }, 648c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 658c2ecf20Sopenharmony_ci .sysctl = "kernel/ostype", 668c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 678c2ecf20Sopenharmony_ci .result = SUCCESS, 688c2ecf20Sopenharmony_ci }, 698c2ecf20Sopenharmony_ci { 708c2ecf20Sopenharmony_ci .descr = "sysctl:read deny all", 718c2ecf20Sopenharmony_ci .insns = { 728c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 738c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 748c2ecf20Sopenharmony_ci }, 758c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 768c2ecf20Sopenharmony_ci .sysctl = "kernel/ostype", 778c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 788c2ecf20Sopenharmony_ci .result = OP_EPERM, 798c2ecf20Sopenharmony_ci }, 808c2ecf20Sopenharmony_ci { 818c2ecf20Sopenharmony_ci .descr = "ctx:write sysctl:read read ok", 828c2ecf20Sopenharmony_ci .insns = { 838c2ecf20Sopenharmony_ci /* If (write) */ 848c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 858c2ecf20Sopenharmony_ci offsetof(struct bpf_sysctl, write)), 868c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 1, 2), 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci /* return DENY; */ 898c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 908c2ecf20Sopenharmony_ci BPF_JMP_A(1), 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci /* else return ALLOW; */ 938c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 948c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 958c2ecf20Sopenharmony_ci }, 968c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 978c2ecf20Sopenharmony_ci .sysctl = "kernel/ostype", 988c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 998c2ecf20Sopenharmony_ci .result = SUCCESS, 1008c2ecf20Sopenharmony_ci }, 1018c2ecf20Sopenharmony_ci { 1028c2ecf20Sopenharmony_ci .descr = "ctx:write sysctl:write read ok", 1038c2ecf20Sopenharmony_ci .insns = { 1048c2ecf20Sopenharmony_ci /* If (write) */ 1058c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 1068c2ecf20Sopenharmony_ci offsetof(struct bpf_sysctl, write)), 1078c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 1, 2), 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci /* return DENY; */ 1108c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 1118c2ecf20Sopenharmony_ci BPF_JMP_A(1), 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci /* else return ALLOW; */ 1148c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 1158c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1168c2ecf20Sopenharmony_ci }, 1178c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 1188c2ecf20Sopenharmony_ci .sysctl = "kernel/domainname", 1198c2ecf20Sopenharmony_ci .open_flags = O_WRONLY, 1208c2ecf20Sopenharmony_ci .newval = "(none)", /* same as default, should fail anyway */ 1218c2ecf20Sopenharmony_ci .result = OP_EPERM, 1228c2ecf20Sopenharmony_ci }, 1238c2ecf20Sopenharmony_ci { 1248c2ecf20Sopenharmony_ci .descr = "ctx:write sysctl:write read ok narrow", 1258c2ecf20Sopenharmony_ci .insns = { 1268c2ecf20Sopenharmony_ci /* u64 w = (u16)write & 1; */ 1278c2ecf20Sopenharmony_ci#if __BYTE_ORDER == __LITTLE_ENDIAN 1288c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_H, BPF_REG_7, BPF_REG_1, 1298c2ecf20Sopenharmony_ci offsetof(struct bpf_sysctl, write)), 1308c2ecf20Sopenharmony_ci#else 1318c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_H, BPF_REG_7, BPF_REG_1, 1328c2ecf20Sopenharmony_ci offsetof(struct bpf_sysctl, write) + 2), 1338c2ecf20Sopenharmony_ci#endif 1348c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_AND, BPF_REG_7, 1), 1358c2ecf20Sopenharmony_ci /* return 1 - w; */ 1368c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 1378c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_7), 1388c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1398c2ecf20Sopenharmony_ci }, 1408c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 1418c2ecf20Sopenharmony_ci .sysctl = "kernel/domainname", 1428c2ecf20Sopenharmony_ci .open_flags = O_WRONLY, 1438c2ecf20Sopenharmony_ci .newval = "(none)", /* same as default, should fail anyway */ 1448c2ecf20Sopenharmony_ci .result = OP_EPERM, 1458c2ecf20Sopenharmony_ci }, 1468c2ecf20Sopenharmony_ci { 1478c2ecf20Sopenharmony_ci .descr = "ctx:write sysctl:read write reject", 1488c2ecf20Sopenharmony_ci .insns = { 1498c2ecf20Sopenharmony_ci /* write = X */ 1508c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 1518c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 1528c2ecf20Sopenharmony_ci offsetof(struct bpf_sysctl, write)), 1538c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 1548c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1558c2ecf20Sopenharmony_ci }, 1568c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 1578c2ecf20Sopenharmony_ci .sysctl = "kernel/ostype", 1588c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 1598c2ecf20Sopenharmony_ci .result = LOAD_REJECT, 1608c2ecf20Sopenharmony_ci }, 1618c2ecf20Sopenharmony_ci { 1628c2ecf20Sopenharmony_ci .descr = "ctx:file_pos sysctl:read read ok", 1638c2ecf20Sopenharmony_ci .insns = { 1648c2ecf20Sopenharmony_ci /* If (file_pos == X) */ 1658c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 1668c2ecf20Sopenharmony_ci offsetof(struct bpf_sysctl, file_pos)), 1678c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 3, 2), 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ci /* return ALLOW; */ 1708c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 1718c2ecf20Sopenharmony_ci BPF_JMP_A(1), 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ci /* else return DENY; */ 1748c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 1758c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1768c2ecf20Sopenharmony_ci }, 1778c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 1788c2ecf20Sopenharmony_ci .sysctl = "kernel/ostype", 1798c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 1808c2ecf20Sopenharmony_ci .seek = 3, 1818c2ecf20Sopenharmony_ci .result = SUCCESS, 1828c2ecf20Sopenharmony_ci }, 1838c2ecf20Sopenharmony_ci { 1848c2ecf20Sopenharmony_ci .descr = "ctx:file_pos sysctl:read read ok narrow", 1858c2ecf20Sopenharmony_ci .insns = { 1868c2ecf20Sopenharmony_ci /* If (file_pos == X) */ 1878c2ecf20Sopenharmony_ci#if __BYTE_ORDER == __LITTLE_ENDIAN 1888c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_B, BPF_REG_7, BPF_REG_1, 1898c2ecf20Sopenharmony_ci offsetof(struct bpf_sysctl, file_pos)), 1908c2ecf20Sopenharmony_ci#else 1918c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_B, BPF_REG_7, BPF_REG_1, 1928c2ecf20Sopenharmony_ci offsetof(struct bpf_sysctl, file_pos) + 3), 1938c2ecf20Sopenharmony_ci#endif 1948c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 4, 2), 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci /* return ALLOW; */ 1978c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 1988c2ecf20Sopenharmony_ci BPF_JMP_A(1), 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci /* else return DENY; */ 2018c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 2028c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2038c2ecf20Sopenharmony_ci }, 2048c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 2058c2ecf20Sopenharmony_ci .sysctl = "kernel/ostype", 2068c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 2078c2ecf20Sopenharmony_ci .seek = 4, 2088c2ecf20Sopenharmony_ci .result = SUCCESS, 2098c2ecf20Sopenharmony_ci }, 2108c2ecf20Sopenharmony_ci { 2118c2ecf20Sopenharmony_ci .descr = "ctx:file_pos sysctl:read write ok", 2128c2ecf20Sopenharmony_ci .insns = { 2138c2ecf20Sopenharmony_ci /* file_pos = X */ 2148c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 2158c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2168c2ecf20Sopenharmony_ci offsetof(struct bpf_sysctl, file_pos)), 2178c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 2188c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2198c2ecf20Sopenharmony_ci }, 2208c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 2218c2ecf20Sopenharmony_ci .sysctl = "kernel/ostype", 2228c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 2238c2ecf20Sopenharmony_ci .oldval = "nux\n", 2248c2ecf20Sopenharmony_ci .result = SUCCESS, 2258c2ecf20Sopenharmony_ci }, 2268c2ecf20Sopenharmony_ci { 2278c2ecf20Sopenharmony_ci .descr = "sysctl_get_name sysctl_value:base ok", 2288c2ecf20Sopenharmony_ci .insns = { 2298c2ecf20Sopenharmony_ci /* sysctl_get_name arg2 (buf) */ 2308c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 2318c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 2328c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 2338c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci /* sysctl_get_name arg3 (buf_len) */ 2388c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 8), 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci /* sysctl_get_name arg4 (flags) */ 2418c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_4, BPF_F_SYSCTL_BASE_NAME), 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_ci /* sysctl_get_name(ctx, buf, buf_len, flags) */ 2448c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_get_name), 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ci /* if (ret == expected && */ 2478c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, sizeof("tcp_mem") - 1, 6), 2488c2ecf20Sopenharmony_ci /* buf == "tcp_mem\0") */ 2498c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, 2508c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x7463705f6d656d00ULL)), 2518c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 2528c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), 2538c2ecf20Sopenharmony_ci 2548c2ecf20Sopenharmony_ci /* return ALLOW; */ 2558c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 2568c2ecf20Sopenharmony_ci BPF_JMP_A(1), 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci /* else return DENY; */ 2598c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 2608c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2618c2ecf20Sopenharmony_ci }, 2628c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 2638c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/tcp_mem", 2648c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 2658c2ecf20Sopenharmony_ci .result = SUCCESS, 2668c2ecf20Sopenharmony_ci }, 2678c2ecf20Sopenharmony_ci { 2688c2ecf20Sopenharmony_ci .descr = "sysctl_get_name sysctl_value:base E2BIG truncated", 2698c2ecf20Sopenharmony_ci .insns = { 2708c2ecf20Sopenharmony_ci /* sysctl_get_name arg2 (buf) */ 2718c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 2728c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 2738c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 2748c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_ci /* sysctl_get_name arg3 (buf_len) too small */ 2798c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 7), 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_ci /* sysctl_get_name arg4 (flags) */ 2828c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_4, BPF_F_SYSCTL_BASE_NAME), 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_ci /* sysctl_get_name(ctx, buf, buf_len, flags) */ 2858c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_get_name), 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_ci /* if (ret == expected && */ 2888c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 6), 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ci /* buf[0:7] == "tcp_me\0") */ 2918c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, 2928c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x7463705f6d650000ULL)), 2938c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 2948c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_ci /* return ALLOW; */ 2978c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 2988c2ecf20Sopenharmony_ci BPF_JMP_A(1), 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci /* else return DENY; */ 3018c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 3028c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3038c2ecf20Sopenharmony_ci }, 3048c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 3058c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/tcp_mem", 3068c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 3078c2ecf20Sopenharmony_ci .result = SUCCESS, 3088c2ecf20Sopenharmony_ci }, 3098c2ecf20Sopenharmony_ci { 3108c2ecf20Sopenharmony_ci .descr = "sysctl_get_name sysctl:full ok", 3118c2ecf20Sopenharmony_ci .insns = { 3128c2ecf20Sopenharmony_ci /* sysctl_get_name arg2 (buf) */ 3138c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 3148c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -24), 3158c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 3168c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 3178c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 8), 3188c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 16), 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_ci /* sysctl_get_name arg3 (buf_len) */ 3238c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 17), 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci /* sysctl_get_name arg4 (flags) */ 3268c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_4, 0), 3278c2ecf20Sopenharmony_ci 3288c2ecf20Sopenharmony_ci /* sysctl_get_name(ctx, buf, buf_len, flags) */ 3298c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_get_name), 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_ci /* if (ret == expected && */ 3328c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 16, 14), 3338c2ecf20Sopenharmony_ci 3348c2ecf20Sopenharmony_ci /* buf[0:8] == "net/ipv4" && */ 3358c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, 3368c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x6e65742f69707634ULL)), 3378c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 3388c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 10), 3398c2ecf20Sopenharmony_ci 3408c2ecf20Sopenharmony_ci /* buf[8:16] == "/tcp_mem" && */ 3418c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, 3428c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x2f7463705f6d656dULL)), 3438c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 8), 3448c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 6), 3458c2ecf20Sopenharmony_ci 3468c2ecf20Sopenharmony_ci /* buf[16:24] == "\0") */ 3478c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, 0x0ULL), 3488c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 16), 3498c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), 3508c2ecf20Sopenharmony_ci 3518c2ecf20Sopenharmony_ci /* return ALLOW; */ 3528c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 3538c2ecf20Sopenharmony_ci BPF_JMP_A(1), 3548c2ecf20Sopenharmony_ci 3558c2ecf20Sopenharmony_ci /* else return DENY; */ 3568c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 3578c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3588c2ecf20Sopenharmony_ci }, 3598c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 3608c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/tcp_mem", 3618c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 3628c2ecf20Sopenharmony_ci .result = SUCCESS, 3638c2ecf20Sopenharmony_ci }, 3648c2ecf20Sopenharmony_ci { 3658c2ecf20Sopenharmony_ci .descr = "sysctl_get_name sysctl:full E2BIG truncated", 3668c2ecf20Sopenharmony_ci .insns = { 3678c2ecf20Sopenharmony_ci /* sysctl_get_name arg2 (buf) */ 3688c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 3698c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -16), 3708c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 3718c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 3728c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 8), 3738c2ecf20Sopenharmony_ci 3748c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 3758c2ecf20Sopenharmony_ci 3768c2ecf20Sopenharmony_ci /* sysctl_get_name arg3 (buf_len) */ 3778c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 16), 3788c2ecf20Sopenharmony_ci 3798c2ecf20Sopenharmony_ci /* sysctl_get_name arg4 (flags) */ 3808c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_4, 0), 3818c2ecf20Sopenharmony_ci 3828c2ecf20Sopenharmony_ci /* sysctl_get_name(ctx, buf, buf_len, flags) */ 3838c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_get_name), 3848c2ecf20Sopenharmony_ci 3858c2ecf20Sopenharmony_ci /* if (ret == expected && */ 3868c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 10), 3878c2ecf20Sopenharmony_ci 3888c2ecf20Sopenharmony_ci /* buf[0:8] == "net/ipv4" && */ 3898c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, 3908c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x6e65742f69707634ULL)), 3918c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 3928c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 6), 3938c2ecf20Sopenharmony_ci 3948c2ecf20Sopenharmony_ci /* buf[8:16] == "/tcp_me\0") */ 3958c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, 3968c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x2f7463705f6d6500ULL)), 3978c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 8), 3988c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), 3998c2ecf20Sopenharmony_ci 4008c2ecf20Sopenharmony_ci /* return ALLOW; */ 4018c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 4028c2ecf20Sopenharmony_ci BPF_JMP_A(1), 4038c2ecf20Sopenharmony_ci 4048c2ecf20Sopenharmony_ci /* else return DENY; */ 4058c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 4068c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4078c2ecf20Sopenharmony_ci }, 4088c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 4098c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/tcp_mem", 4108c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 4118c2ecf20Sopenharmony_ci .result = SUCCESS, 4128c2ecf20Sopenharmony_ci }, 4138c2ecf20Sopenharmony_ci { 4148c2ecf20Sopenharmony_ci .descr = "sysctl_get_name sysctl:full E2BIG truncated small", 4158c2ecf20Sopenharmony_ci .insns = { 4168c2ecf20Sopenharmony_ci /* sysctl_get_name arg2 (buf) */ 4178c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 4188c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 4198c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 4208c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 4218c2ecf20Sopenharmony_ci 4228c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 4238c2ecf20Sopenharmony_ci 4248c2ecf20Sopenharmony_ci /* sysctl_get_name arg3 (buf_len) */ 4258c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 7), 4268c2ecf20Sopenharmony_ci 4278c2ecf20Sopenharmony_ci /* sysctl_get_name arg4 (flags) */ 4288c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_4, 0), 4298c2ecf20Sopenharmony_ci 4308c2ecf20Sopenharmony_ci /* sysctl_get_name(ctx, buf, buf_len, flags) */ 4318c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_get_name), 4328c2ecf20Sopenharmony_ci 4338c2ecf20Sopenharmony_ci /* if (ret == expected && */ 4348c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 6), 4358c2ecf20Sopenharmony_ci 4368c2ecf20Sopenharmony_ci /* buf[0:8] == "net/ip\0") */ 4378c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, 4388c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x6e65742f69700000ULL)), 4398c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 4408c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), 4418c2ecf20Sopenharmony_ci 4428c2ecf20Sopenharmony_ci /* return ALLOW; */ 4438c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 4448c2ecf20Sopenharmony_ci BPF_JMP_A(1), 4458c2ecf20Sopenharmony_ci 4468c2ecf20Sopenharmony_ci /* else return DENY; */ 4478c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 4488c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4498c2ecf20Sopenharmony_ci }, 4508c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 4518c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/tcp_mem", 4528c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 4538c2ecf20Sopenharmony_ci .result = SUCCESS, 4548c2ecf20Sopenharmony_ci }, 4558c2ecf20Sopenharmony_ci { 4568c2ecf20Sopenharmony_ci .descr = "sysctl_get_current_value sysctl:read ok, gt", 4578c2ecf20Sopenharmony_ci .insns = { 4588c2ecf20Sopenharmony_ci /* sysctl_get_current_value arg2 (buf) */ 4598c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 4608c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 4618c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 4628c2ecf20Sopenharmony_ci 4638c2ecf20Sopenharmony_ci /* sysctl_get_current_value arg3 (buf_len) */ 4648c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 8), 4658c2ecf20Sopenharmony_ci 4668c2ecf20Sopenharmony_ci /* sysctl_get_current_value(ctx, buf, buf_len) */ 4678c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_get_current_value), 4688c2ecf20Sopenharmony_ci 4698c2ecf20Sopenharmony_ci /* if (ret == expected && */ 4708c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 6, 6), 4718c2ecf20Sopenharmony_ci 4728c2ecf20Sopenharmony_ci /* buf[0:6] == "Linux\n\0") */ 4738c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, 4748c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x4c696e75780a0000ULL)), 4758c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 4768c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), 4778c2ecf20Sopenharmony_ci 4788c2ecf20Sopenharmony_ci /* return ALLOW; */ 4798c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 4808c2ecf20Sopenharmony_ci BPF_JMP_A(1), 4818c2ecf20Sopenharmony_ci 4828c2ecf20Sopenharmony_ci /* else return DENY; */ 4838c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 4848c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4858c2ecf20Sopenharmony_ci }, 4868c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 4878c2ecf20Sopenharmony_ci .sysctl = "kernel/ostype", 4888c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 4898c2ecf20Sopenharmony_ci .result = SUCCESS, 4908c2ecf20Sopenharmony_ci }, 4918c2ecf20Sopenharmony_ci { 4928c2ecf20Sopenharmony_ci .descr = "sysctl_get_current_value sysctl:read ok, eq", 4938c2ecf20Sopenharmony_ci .insns = { 4948c2ecf20Sopenharmony_ci /* sysctl_get_current_value arg2 (buf) */ 4958c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 4968c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 4978c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 4988c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_B, BPF_REG_7, BPF_REG_0, 7), 4998c2ecf20Sopenharmony_ci 5008c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 5018c2ecf20Sopenharmony_ci 5028c2ecf20Sopenharmony_ci /* sysctl_get_current_value arg3 (buf_len) */ 5038c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 7), 5048c2ecf20Sopenharmony_ci 5058c2ecf20Sopenharmony_ci /* sysctl_get_current_value(ctx, buf, buf_len) */ 5068c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_get_current_value), 5078c2ecf20Sopenharmony_ci 5088c2ecf20Sopenharmony_ci /* if (ret == expected && */ 5098c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 6, 6), 5108c2ecf20Sopenharmony_ci 5118c2ecf20Sopenharmony_ci /* buf[0:6] == "Linux\n\0") */ 5128c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, 5138c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x4c696e75780a0000ULL)), 5148c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 5158c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), 5168c2ecf20Sopenharmony_ci 5178c2ecf20Sopenharmony_ci /* return ALLOW; */ 5188c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 5198c2ecf20Sopenharmony_ci BPF_JMP_A(1), 5208c2ecf20Sopenharmony_ci 5218c2ecf20Sopenharmony_ci /* else return DENY; */ 5228c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 5238c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5248c2ecf20Sopenharmony_ci }, 5258c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 5268c2ecf20Sopenharmony_ci .sysctl = "kernel/ostype", 5278c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 5288c2ecf20Sopenharmony_ci .result = SUCCESS, 5298c2ecf20Sopenharmony_ci }, 5308c2ecf20Sopenharmony_ci { 5318c2ecf20Sopenharmony_ci .descr = "sysctl_get_current_value sysctl:read E2BIG truncated", 5328c2ecf20Sopenharmony_ci .insns = { 5338c2ecf20Sopenharmony_ci /* sysctl_get_current_value arg2 (buf) */ 5348c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 5358c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 5368c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 5378c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_H, BPF_REG_7, BPF_REG_0, 6), 5388c2ecf20Sopenharmony_ci 5398c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 5408c2ecf20Sopenharmony_ci 5418c2ecf20Sopenharmony_ci /* sysctl_get_current_value arg3 (buf_len) */ 5428c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 6), 5438c2ecf20Sopenharmony_ci 5448c2ecf20Sopenharmony_ci /* sysctl_get_current_value(ctx, buf, buf_len) */ 5458c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_get_current_value), 5468c2ecf20Sopenharmony_ci 5478c2ecf20Sopenharmony_ci /* if (ret == expected && */ 5488c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 6), 5498c2ecf20Sopenharmony_ci 5508c2ecf20Sopenharmony_ci /* buf[0:6] == "Linux\0") */ 5518c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, 5528c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x4c696e7578000000ULL)), 5538c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 5548c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), 5558c2ecf20Sopenharmony_ci 5568c2ecf20Sopenharmony_ci /* return ALLOW; */ 5578c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 5588c2ecf20Sopenharmony_ci BPF_JMP_A(1), 5598c2ecf20Sopenharmony_ci 5608c2ecf20Sopenharmony_ci /* else return DENY; */ 5618c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 5628c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5638c2ecf20Sopenharmony_ci }, 5648c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 5658c2ecf20Sopenharmony_ci .sysctl = "kernel/ostype", 5668c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 5678c2ecf20Sopenharmony_ci .result = SUCCESS, 5688c2ecf20Sopenharmony_ci }, 5698c2ecf20Sopenharmony_ci { 5708c2ecf20Sopenharmony_ci .descr = "sysctl_get_current_value sysctl:read EINVAL", 5718c2ecf20Sopenharmony_ci .insns = { 5728c2ecf20Sopenharmony_ci /* sysctl_get_current_value arg2 (buf) */ 5738c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 5748c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 5758c2ecf20Sopenharmony_ci 5768c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 5778c2ecf20Sopenharmony_ci 5788c2ecf20Sopenharmony_ci /* sysctl_get_current_value arg3 (buf_len) */ 5798c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 8), 5808c2ecf20Sopenharmony_ci 5818c2ecf20Sopenharmony_ci /* sysctl_get_current_value(ctx, buf, buf_len) */ 5828c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_get_current_value), 5838c2ecf20Sopenharmony_ci 5848c2ecf20Sopenharmony_ci /* if (ret == expected && */ 5858c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -EINVAL, 4), 5868c2ecf20Sopenharmony_ci 5878c2ecf20Sopenharmony_ci /* buf[0:8] is NUL-filled) */ 5888c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 5898c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 0, 2), 5908c2ecf20Sopenharmony_ci 5918c2ecf20Sopenharmony_ci /* return DENY; */ 5928c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 5938c2ecf20Sopenharmony_ci BPF_JMP_A(1), 5948c2ecf20Sopenharmony_ci 5958c2ecf20Sopenharmony_ci /* else return ALLOW; */ 5968c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 5978c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5988c2ecf20Sopenharmony_ci }, 5998c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 6008c2ecf20Sopenharmony_ci .sysctl = "net/ipv6/conf/lo/stable_secret", /* -EIO */ 6018c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 6028c2ecf20Sopenharmony_ci .result = OP_EPERM, 6038c2ecf20Sopenharmony_ci }, 6048c2ecf20Sopenharmony_ci { 6058c2ecf20Sopenharmony_ci .descr = "sysctl_get_current_value sysctl:write ok", 6068c2ecf20Sopenharmony_ci .fixup_value_insn = 6, 6078c2ecf20Sopenharmony_ci .insns = { 6088c2ecf20Sopenharmony_ci /* sysctl_get_current_value arg2 (buf) */ 6098c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 6108c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 6118c2ecf20Sopenharmony_ci 6128c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 6138c2ecf20Sopenharmony_ci 6148c2ecf20Sopenharmony_ci /* sysctl_get_current_value arg3 (buf_len) */ 6158c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 8), 6168c2ecf20Sopenharmony_ci 6178c2ecf20Sopenharmony_ci /* sysctl_get_current_value(ctx, buf, buf_len) */ 6188c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_get_current_value), 6198c2ecf20Sopenharmony_ci 6208c2ecf20Sopenharmony_ci /* if (ret == expected && */ 6218c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 4, 6), 6228c2ecf20Sopenharmony_ci 6238c2ecf20Sopenharmony_ci /* buf[0:4] == expected) */ 6248c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, FIXUP_SYSCTL_VALUE), 6258c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 6268c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), 6278c2ecf20Sopenharmony_ci 6288c2ecf20Sopenharmony_ci /* return DENY; */ 6298c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 6308c2ecf20Sopenharmony_ci BPF_JMP_A(1), 6318c2ecf20Sopenharmony_ci 6328c2ecf20Sopenharmony_ci /* else return ALLOW; */ 6338c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 6348c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 6358c2ecf20Sopenharmony_ci }, 6368c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 6378c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 6388c2ecf20Sopenharmony_ci .open_flags = O_WRONLY, 6398c2ecf20Sopenharmony_ci .newval = "600", /* same as default, should fail anyway */ 6408c2ecf20Sopenharmony_ci .result = OP_EPERM, 6418c2ecf20Sopenharmony_ci }, 6428c2ecf20Sopenharmony_ci { 6438c2ecf20Sopenharmony_ci .descr = "sysctl_get_new_value sysctl:read EINVAL", 6448c2ecf20Sopenharmony_ci .insns = { 6458c2ecf20Sopenharmony_ci /* sysctl_get_new_value arg2 (buf) */ 6468c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 6478c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 6488c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 6498c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 6508c2ecf20Sopenharmony_ci 6518c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 6528c2ecf20Sopenharmony_ci 6538c2ecf20Sopenharmony_ci /* sysctl_get_new_value arg3 (buf_len) */ 6548c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 8), 6558c2ecf20Sopenharmony_ci 6568c2ecf20Sopenharmony_ci /* sysctl_get_new_value(ctx, buf, buf_len) */ 6578c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_get_new_value), 6588c2ecf20Sopenharmony_ci 6598c2ecf20Sopenharmony_ci /* if (ret == expected) */ 6608c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -EINVAL, 2), 6618c2ecf20Sopenharmony_ci 6628c2ecf20Sopenharmony_ci /* return ALLOW; */ 6638c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 6648c2ecf20Sopenharmony_ci BPF_JMP_A(1), 6658c2ecf20Sopenharmony_ci 6668c2ecf20Sopenharmony_ci /* else return DENY; */ 6678c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 6688c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 6698c2ecf20Sopenharmony_ci }, 6708c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 6718c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/tcp_mem", 6728c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 6738c2ecf20Sopenharmony_ci .result = SUCCESS, 6748c2ecf20Sopenharmony_ci }, 6758c2ecf20Sopenharmony_ci { 6768c2ecf20Sopenharmony_ci .descr = "sysctl_get_new_value sysctl:write ok", 6778c2ecf20Sopenharmony_ci .insns = { 6788c2ecf20Sopenharmony_ci /* sysctl_get_new_value arg2 (buf) */ 6798c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 6808c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 6818c2ecf20Sopenharmony_ci 6828c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 6838c2ecf20Sopenharmony_ci 6848c2ecf20Sopenharmony_ci /* sysctl_get_new_value arg3 (buf_len) */ 6858c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 4), 6868c2ecf20Sopenharmony_ci 6878c2ecf20Sopenharmony_ci /* sysctl_get_new_value(ctx, buf, buf_len) */ 6888c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_get_new_value), 6898c2ecf20Sopenharmony_ci 6908c2ecf20Sopenharmony_ci /* if (ret == expected && */ 6918c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 3, 4), 6928c2ecf20Sopenharmony_ci 6938c2ecf20Sopenharmony_ci /* buf[0:4] == "606\0") */ 6948c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_7, 0), 6958c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 6968c2ecf20Sopenharmony_ci bpf_ntohl(0x36303600), 2), 6978c2ecf20Sopenharmony_ci 6988c2ecf20Sopenharmony_ci /* return DENY; */ 6998c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 7008c2ecf20Sopenharmony_ci BPF_JMP_A(1), 7018c2ecf20Sopenharmony_ci 7028c2ecf20Sopenharmony_ci /* else return ALLOW; */ 7038c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 7048c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7058c2ecf20Sopenharmony_ci }, 7068c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 7078c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 7088c2ecf20Sopenharmony_ci .open_flags = O_WRONLY, 7098c2ecf20Sopenharmony_ci .newval = "606", 7108c2ecf20Sopenharmony_ci .result = OP_EPERM, 7118c2ecf20Sopenharmony_ci }, 7128c2ecf20Sopenharmony_ci { 7138c2ecf20Sopenharmony_ci .descr = "sysctl_get_new_value sysctl:write ok long", 7148c2ecf20Sopenharmony_ci .insns = { 7158c2ecf20Sopenharmony_ci /* sysctl_get_new_value arg2 (buf) */ 7168c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 7178c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -24), 7188c2ecf20Sopenharmony_ci 7198c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 7208c2ecf20Sopenharmony_ci 7218c2ecf20Sopenharmony_ci /* sysctl_get_new_value arg3 (buf_len) */ 7228c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 24), 7238c2ecf20Sopenharmony_ci 7248c2ecf20Sopenharmony_ci /* sysctl_get_new_value(ctx, buf, buf_len) */ 7258c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_get_new_value), 7268c2ecf20Sopenharmony_ci 7278c2ecf20Sopenharmony_ci /* if (ret == expected && */ 7288c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 23, 14), 7298c2ecf20Sopenharmony_ci 7308c2ecf20Sopenharmony_ci /* buf[0:8] == "3000000 " && */ 7318c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, 7328c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x3330303030303020ULL)), 7338c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 7348c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 10), 7358c2ecf20Sopenharmony_ci 7368c2ecf20Sopenharmony_ci /* buf[8:16] == "4000000 " && */ 7378c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, 7388c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x3430303030303020ULL)), 7398c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 8), 7408c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 6), 7418c2ecf20Sopenharmony_ci 7428c2ecf20Sopenharmony_ci /* buf[16:24] == "6000000\0") */ 7438c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, 7448c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x3630303030303000ULL)), 7458c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 16), 7468c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), 7478c2ecf20Sopenharmony_ci 7488c2ecf20Sopenharmony_ci /* return DENY; */ 7498c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 7508c2ecf20Sopenharmony_ci BPF_JMP_A(1), 7518c2ecf20Sopenharmony_ci 7528c2ecf20Sopenharmony_ci /* else return ALLOW; */ 7538c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 7548c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7558c2ecf20Sopenharmony_ci }, 7568c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 7578c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/tcp_mem", 7588c2ecf20Sopenharmony_ci .open_flags = O_WRONLY, 7598c2ecf20Sopenharmony_ci .newval = "3000000 4000000 6000000", 7608c2ecf20Sopenharmony_ci .result = OP_EPERM, 7618c2ecf20Sopenharmony_ci }, 7628c2ecf20Sopenharmony_ci { 7638c2ecf20Sopenharmony_ci .descr = "sysctl_get_new_value sysctl:write E2BIG", 7648c2ecf20Sopenharmony_ci .insns = { 7658c2ecf20Sopenharmony_ci /* sysctl_get_new_value arg2 (buf) */ 7668c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 7678c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 7688c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 7698c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_B, BPF_REG_7, BPF_REG_0, 3), 7708c2ecf20Sopenharmony_ci 7718c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 7728c2ecf20Sopenharmony_ci 7738c2ecf20Sopenharmony_ci /* sysctl_get_new_value arg3 (buf_len) */ 7748c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 3), 7758c2ecf20Sopenharmony_ci 7768c2ecf20Sopenharmony_ci /* sysctl_get_new_value(ctx, buf, buf_len) */ 7778c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_get_new_value), 7788c2ecf20Sopenharmony_ci 7798c2ecf20Sopenharmony_ci /* if (ret == expected && */ 7808c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 4), 7818c2ecf20Sopenharmony_ci 7828c2ecf20Sopenharmony_ci /* buf[0:3] == "60\0") */ 7838c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_7, 0), 7848c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 7858c2ecf20Sopenharmony_ci bpf_ntohl(0x36300000), 2), 7868c2ecf20Sopenharmony_ci 7878c2ecf20Sopenharmony_ci /* return DENY; */ 7888c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 7898c2ecf20Sopenharmony_ci BPF_JMP_A(1), 7908c2ecf20Sopenharmony_ci 7918c2ecf20Sopenharmony_ci /* else return ALLOW; */ 7928c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 7938c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7948c2ecf20Sopenharmony_ci }, 7958c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 7968c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 7978c2ecf20Sopenharmony_ci .open_flags = O_WRONLY, 7988c2ecf20Sopenharmony_ci .newval = "606", 7998c2ecf20Sopenharmony_ci .result = OP_EPERM, 8008c2ecf20Sopenharmony_ci }, 8018c2ecf20Sopenharmony_ci { 8028c2ecf20Sopenharmony_ci .descr = "sysctl_set_new_value sysctl:read EINVAL", 8038c2ecf20Sopenharmony_ci .insns = { 8048c2ecf20Sopenharmony_ci /* sysctl_set_new_value arg2 (buf) */ 8058c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 8068c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 8078c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 8088c2ecf20Sopenharmony_ci bpf_ntohl(0x36303000)), 8098c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 8108c2ecf20Sopenharmony_ci 8118c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 8128c2ecf20Sopenharmony_ci 8138c2ecf20Sopenharmony_ci /* sysctl_set_new_value arg3 (buf_len) */ 8148c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 3), 8158c2ecf20Sopenharmony_ci 8168c2ecf20Sopenharmony_ci /* sysctl_set_new_value(ctx, buf, buf_len) */ 8178c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_set_new_value), 8188c2ecf20Sopenharmony_ci 8198c2ecf20Sopenharmony_ci /* if (ret == expected) */ 8208c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -EINVAL, 2), 8218c2ecf20Sopenharmony_ci 8228c2ecf20Sopenharmony_ci /* return ALLOW; */ 8238c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 8248c2ecf20Sopenharmony_ci BPF_JMP_A(1), 8258c2ecf20Sopenharmony_ci 8268c2ecf20Sopenharmony_ci /* else return DENY; */ 8278c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 8288c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 8298c2ecf20Sopenharmony_ci }, 8308c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 8318c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 8328c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 8338c2ecf20Sopenharmony_ci .result = SUCCESS, 8348c2ecf20Sopenharmony_ci }, 8358c2ecf20Sopenharmony_ci { 8368c2ecf20Sopenharmony_ci .descr = "sysctl_set_new_value sysctl:write ok", 8378c2ecf20Sopenharmony_ci .fixup_value_insn = 2, 8388c2ecf20Sopenharmony_ci .insns = { 8398c2ecf20Sopenharmony_ci /* sysctl_set_new_value arg2 (buf) */ 8408c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 8418c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 8428c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, FIXUP_SYSCTL_VALUE), 8438c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 8448c2ecf20Sopenharmony_ci 8458c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 8468c2ecf20Sopenharmony_ci 8478c2ecf20Sopenharmony_ci /* sysctl_set_new_value arg3 (buf_len) */ 8488c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 3), 8498c2ecf20Sopenharmony_ci 8508c2ecf20Sopenharmony_ci /* sysctl_set_new_value(ctx, buf, buf_len) */ 8518c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_sysctl_set_new_value), 8528c2ecf20Sopenharmony_ci 8538c2ecf20Sopenharmony_ci /* if (ret == expected) */ 8548c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 8558c2ecf20Sopenharmony_ci 8568c2ecf20Sopenharmony_ci /* return ALLOW; */ 8578c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 8588c2ecf20Sopenharmony_ci BPF_JMP_A(1), 8598c2ecf20Sopenharmony_ci 8608c2ecf20Sopenharmony_ci /* else return DENY; */ 8618c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 8628c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 8638c2ecf20Sopenharmony_ci }, 8648c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 8658c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 8668c2ecf20Sopenharmony_ci .open_flags = O_WRONLY, 8678c2ecf20Sopenharmony_ci .newval = "606", 8688c2ecf20Sopenharmony_ci .result = SUCCESS, 8698c2ecf20Sopenharmony_ci }, 8708c2ecf20Sopenharmony_ci { 8718c2ecf20Sopenharmony_ci "bpf_strtoul one number string", 8728c2ecf20Sopenharmony_ci .insns = { 8738c2ecf20Sopenharmony_ci /* arg1 (buf) */ 8748c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 8758c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 8768c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 8778c2ecf20Sopenharmony_ci bpf_ntohl(0x36303000)), 8788c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_W, BPF_REG_7, BPF_REG_0, 0), 8798c2ecf20Sopenharmony_ci 8808c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 8818c2ecf20Sopenharmony_ci 8828c2ecf20Sopenharmony_ci /* arg2 (buf_len) */ 8838c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 4), 8848c2ecf20Sopenharmony_ci 8858c2ecf20Sopenharmony_ci /* arg3 (flags) */ 8868c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 0), 8878c2ecf20Sopenharmony_ci 8888c2ecf20Sopenharmony_ci /* arg4 (res) */ 8898c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 8908c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 8918c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_7), 8928c2ecf20Sopenharmony_ci 8938c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_strtoul), 8948c2ecf20Sopenharmony_ci 8958c2ecf20Sopenharmony_ci /* if (ret == expected && */ 8968c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 3, 4), 8978c2ecf20Sopenharmony_ci /* res == expected) */ 8988c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 8998c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 600, 2), 9008c2ecf20Sopenharmony_ci 9018c2ecf20Sopenharmony_ci /* return ALLOW; */ 9028c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 9038c2ecf20Sopenharmony_ci BPF_JMP_A(1), 9048c2ecf20Sopenharmony_ci 9058c2ecf20Sopenharmony_ci /* else return DENY; */ 9068c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 9078c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9088c2ecf20Sopenharmony_ci }, 9098c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 9108c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 9118c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 9128c2ecf20Sopenharmony_ci .result = SUCCESS, 9138c2ecf20Sopenharmony_ci }, 9148c2ecf20Sopenharmony_ci { 9158c2ecf20Sopenharmony_ci "bpf_strtoul multi number string", 9168c2ecf20Sopenharmony_ci .insns = { 9178c2ecf20Sopenharmony_ci /* arg1 (buf) */ 9188c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 9198c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 9208c2ecf20Sopenharmony_ci /* "600 602\0" */ 9218c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 9228c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x3630302036303200ULL)), 9238c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 9248c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 9258c2ecf20Sopenharmony_ci 9268c2ecf20Sopenharmony_ci /* arg2 (buf_len) */ 9278c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 8), 9288c2ecf20Sopenharmony_ci 9298c2ecf20Sopenharmony_ci /* arg3 (flags) */ 9308c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 0), 9318c2ecf20Sopenharmony_ci 9328c2ecf20Sopenharmony_ci /* arg4 (res) */ 9338c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 9348c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 9358c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_7), 9368c2ecf20Sopenharmony_ci 9378c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_strtoul), 9388c2ecf20Sopenharmony_ci 9398c2ecf20Sopenharmony_ci /* if (ret == expected && */ 9408c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 3, 18), 9418c2ecf20Sopenharmony_ci /* res == expected) */ 9428c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 9438c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 600, 16), 9448c2ecf20Sopenharmony_ci 9458c2ecf20Sopenharmony_ci /* arg1 (buf) */ 9468c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 9478c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 9488c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 9498c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 9508c2ecf20Sopenharmony_ci 9518c2ecf20Sopenharmony_ci /* arg2 (buf_len) */ 9528c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 8), 9538c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_0), 9548c2ecf20Sopenharmony_ci 9558c2ecf20Sopenharmony_ci /* arg3 (flags) */ 9568c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 0), 9578c2ecf20Sopenharmony_ci 9588c2ecf20Sopenharmony_ci /* arg4 (res) */ 9598c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 9608c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -16), 9618c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_7), 9628c2ecf20Sopenharmony_ci 9638c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_strtoul), 9648c2ecf20Sopenharmony_ci 9658c2ecf20Sopenharmony_ci /* if (ret == expected && */ 9668c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 4, 4), 9678c2ecf20Sopenharmony_ci /* res == expected) */ 9688c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 9698c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 602, 2), 9708c2ecf20Sopenharmony_ci 9718c2ecf20Sopenharmony_ci /* return ALLOW; */ 9728c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 9738c2ecf20Sopenharmony_ci BPF_JMP_A(1), 9748c2ecf20Sopenharmony_ci 9758c2ecf20Sopenharmony_ci /* else return DENY; */ 9768c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 9778c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9788c2ecf20Sopenharmony_ci }, 9798c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 9808c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/tcp_mem", 9818c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 9828c2ecf20Sopenharmony_ci .result = SUCCESS, 9838c2ecf20Sopenharmony_ci }, 9848c2ecf20Sopenharmony_ci { 9858c2ecf20Sopenharmony_ci "bpf_strtoul buf_len = 0, reject", 9868c2ecf20Sopenharmony_ci .insns = { 9878c2ecf20Sopenharmony_ci /* arg1 (buf) */ 9888c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 9898c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 9908c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 9918c2ecf20Sopenharmony_ci bpf_ntohl(0x36303000)), 9928c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 9938c2ecf20Sopenharmony_ci 9948c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 9958c2ecf20Sopenharmony_ci 9968c2ecf20Sopenharmony_ci /* arg2 (buf_len) */ 9978c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 0), 9988c2ecf20Sopenharmony_ci 9998c2ecf20Sopenharmony_ci /* arg3 (flags) */ 10008c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 0), 10018c2ecf20Sopenharmony_ci 10028c2ecf20Sopenharmony_ci /* arg4 (res) */ 10038c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 10048c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 10058c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_7), 10068c2ecf20Sopenharmony_ci 10078c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_strtoul), 10088c2ecf20Sopenharmony_ci 10098c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 10108c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 10118c2ecf20Sopenharmony_ci }, 10128c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 10138c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 10148c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 10158c2ecf20Sopenharmony_ci .result = LOAD_REJECT, 10168c2ecf20Sopenharmony_ci }, 10178c2ecf20Sopenharmony_ci { 10188c2ecf20Sopenharmony_ci "bpf_strtoul supported base, ok", 10198c2ecf20Sopenharmony_ci .insns = { 10208c2ecf20Sopenharmony_ci /* arg1 (buf) */ 10218c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 10228c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 10238c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 10248c2ecf20Sopenharmony_ci bpf_ntohl(0x30373700)), 10258c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_W, BPF_REG_7, BPF_REG_0, 0), 10268c2ecf20Sopenharmony_ci 10278c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 10288c2ecf20Sopenharmony_ci 10298c2ecf20Sopenharmony_ci /* arg2 (buf_len) */ 10308c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 4), 10318c2ecf20Sopenharmony_ci 10328c2ecf20Sopenharmony_ci /* arg3 (flags) */ 10338c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 8), 10348c2ecf20Sopenharmony_ci 10358c2ecf20Sopenharmony_ci /* arg4 (res) */ 10368c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 10378c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 10388c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_7), 10398c2ecf20Sopenharmony_ci 10408c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_strtoul), 10418c2ecf20Sopenharmony_ci 10428c2ecf20Sopenharmony_ci /* if (ret == expected && */ 10438c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 3, 4), 10448c2ecf20Sopenharmony_ci /* res == expected) */ 10458c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 10468c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 63, 2), 10478c2ecf20Sopenharmony_ci 10488c2ecf20Sopenharmony_ci /* return ALLOW; */ 10498c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 10508c2ecf20Sopenharmony_ci BPF_JMP_A(1), 10518c2ecf20Sopenharmony_ci 10528c2ecf20Sopenharmony_ci /* else return DENY; */ 10538c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 10548c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 10558c2ecf20Sopenharmony_ci }, 10568c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 10578c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 10588c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 10598c2ecf20Sopenharmony_ci .result = SUCCESS, 10608c2ecf20Sopenharmony_ci }, 10618c2ecf20Sopenharmony_ci { 10628c2ecf20Sopenharmony_ci "bpf_strtoul unsupported base, EINVAL", 10638c2ecf20Sopenharmony_ci .insns = { 10648c2ecf20Sopenharmony_ci /* arg1 (buf) */ 10658c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 10668c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 10678c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 10688c2ecf20Sopenharmony_ci bpf_ntohl(0x36303000)), 10698c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 10708c2ecf20Sopenharmony_ci 10718c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 10728c2ecf20Sopenharmony_ci 10738c2ecf20Sopenharmony_ci /* arg2 (buf_len) */ 10748c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 4), 10758c2ecf20Sopenharmony_ci 10768c2ecf20Sopenharmony_ci /* arg3 (flags) */ 10778c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 3), 10788c2ecf20Sopenharmony_ci 10798c2ecf20Sopenharmony_ci /* arg4 (res) */ 10808c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 10818c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 10828c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_7), 10838c2ecf20Sopenharmony_ci 10848c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_strtoul), 10858c2ecf20Sopenharmony_ci 10868c2ecf20Sopenharmony_ci /* if (ret == expected) */ 10878c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -EINVAL, 2), 10888c2ecf20Sopenharmony_ci 10898c2ecf20Sopenharmony_ci /* return ALLOW; */ 10908c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 10918c2ecf20Sopenharmony_ci BPF_JMP_A(1), 10928c2ecf20Sopenharmony_ci 10938c2ecf20Sopenharmony_ci /* else return DENY; */ 10948c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 10958c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 10968c2ecf20Sopenharmony_ci }, 10978c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 10988c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 10998c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 11008c2ecf20Sopenharmony_ci .result = SUCCESS, 11018c2ecf20Sopenharmony_ci }, 11028c2ecf20Sopenharmony_ci { 11038c2ecf20Sopenharmony_ci "bpf_strtoul buf with spaces only, EINVAL", 11048c2ecf20Sopenharmony_ci .insns = { 11058c2ecf20Sopenharmony_ci /* arg1 (buf) */ 11068c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 11078c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 11088c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 11098c2ecf20Sopenharmony_ci bpf_ntohl(0x0d0c0a09)), 11108c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 11118c2ecf20Sopenharmony_ci 11128c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 11138c2ecf20Sopenharmony_ci 11148c2ecf20Sopenharmony_ci /* arg2 (buf_len) */ 11158c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 4), 11168c2ecf20Sopenharmony_ci 11178c2ecf20Sopenharmony_ci /* arg3 (flags) */ 11188c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 0), 11198c2ecf20Sopenharmony_ci 11208c2ecf20Sopenharmony_ci /* arg4 (res) */ 11218c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 11228c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 11238c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_7), 11248c2ecf20Sopenharmony_ci 11258c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_strtoul), 11268c2ecf20Sopenharmony_ci 11278c2ecf20Sopenharmony_ci /* if (ret == expected) */ 11288c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -EINVAL, 2), 11298c2ecf20Sopenharmony_ci 11308c2ecf20Sopenharmony_ci /* return ALLOW; */ 11318c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 11328c2ecf20Sopenharmony_ci BPF_JMP_A(1), 11338c2ecf20Sopenharmony_ci 11348c2ecf20Sopenharmony_ci /* else return DENY; */ 11358c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 11368c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 11378c2ecf20Sopenharmony_ci }, 11388c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 11398c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 11408c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 11418c2ecf20Sopenharmony_ci .result = SUCCESS, 11428c2ecf20Sopenharmony_ci }, 11438c2ecf20Sopenharmony_ci { 11448c2ecf20Sopenharmony_ci "bpf_strtoul negative number, EINVAL", 11458c2ecf20Sopenharmony_ci .insns = { 11468c2ecf20Sopenharmony_ci /* arg1 (buf) */ 11478c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 11488c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 11498c2ecf20Sopenharmony_ci /* " -6\0" */ 11508c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 11518c2ecf20Sopenharmony_ci bpf_ntohl(0x0a2d3600)), 11528c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 11538c2ecf20Sopenharmony_ci 11548c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 11558c2ecf20Sopenharmony_ci 11568c2ecf20Sopenharmony_ci /* arg2 (buf_len) */ 11578c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 4), 11588c2ecf20Sopenharmony_ci 11598c2ecf20Sopenharmony_ci /* arg3 (flags) */ 11608c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 0), 11618c2ecf20Sopenharmony_ci 11628c2ecf20Sopenharmony_ci /* arg4 (res) */ 11638c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 11648c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 11658c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_7), 11668c2ecf20Sopenharmony_ci 11678c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_strtoul), 11688c2ecf20Sopenharmony_ci 11698c2ecf20Sopenharmony_ci /* if (ret == expected) */ 11708c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -EINVAL, 2), 11718c2ecf20Sopenharmony_ci 11728c2ecf20Sopenharmony_ci /* return ALLOW; */ 11738c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 11748c2ecf20Sopenharmony_ci BPF_JMP_A(1), 11758c2ecf20Sopenharmony_ci 11768c2ecf20Sopenharmony_ci /* else return DENY; */ 11778c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 11788c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 11798c2ecf20Sopenharmony_ci }, 11808c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 11818c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 11828c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 11838c2ecf20Sopenharmony_ci .result = SUCCESS, 11848c2ecf20Sopenharmony_ci }, 11858c2ecf20Sopenharmony_ci { 11868c2ecf20Sopenharmony_ci "bpf_strtol negative number, ok", 11878c2ecf20Sopenharmony_ci .insns = { 11888c2ecf20Sopenharmony_ci /* arg1 (buf) */ 11898c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 11908c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 11918c2ecf20Sopenharmony_ci /* " -6\0" */ 11928c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 11938c2ecf20Sopenharmony_ci bpf_ntohl(0x0a2d3600)), 11948c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_W, BPF_REG_7, BPF_REG_0, 0), 11958c2ecf20Sopenharmony_ci 11968c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 11978c2ecf20Sopenharmony_ci 11988c2ecf20Sopenharmony_ci /* arg2 (buf_len) */ 11998c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 4), 12008c2ecf20Sopenharmony_ci 12018c2ecf20Sopenharmony_ci /* arg3 (flags) */ 12028c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 10), 12038c2ecf20Sopenharmony_ci 12048c2ecf20Sopenharmony_ci /* arg4 (res) */ 12058c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 12068c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 12078c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_7), 12088c2ecf20Sopenharmony_ci 12098c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_strtol), 12108c2ecf20Sopenharmony_ci 12118c2ecf20Sopenharmony_ci /* if (ret == expected && */ 12128c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 3, 4), 12138c2ecf20Sopenharmony_ci /* res == expected) */ 12148c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 12158c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_9, -6, 2), 12168c2ecf20Sopenharmony_ci 12178c2ecf20Sopenharmony_ci /* return ALLOW; */ 12188c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 12198c2ecf20Sopenharmony_ci BPF_JMP_A(1), 12208c2ecf20Sopenharmony_ci 12218c2ecf20Sopenharmony_ci /* else return DENY; */ 12228c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 12238c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 12248c2ecf20Sopenharmony_ci }, 12258c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 12268c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 12278c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 12288c2ecf20Sopenharmony_ci .result = SUCCESS, 12298c2ecf20Sopenharmony_ci }, 12308c2ecf20Sopenharmony_ci { 12318c2ecf20Sopenharmony_ci "bpf_strtol hex number, ok", 12328c2ecf20Sopenharmony_ci .insns = { 12338c2ecf20Sopenharmony_ci /* arg1 (buf) */ 12348c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 12358c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 12368c2ecf20Sopenharmony_ci /* "0xfe" */ 12378c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 12388c2ecf20Sopenharmony_ci bpf_ntohl(0x30786665)), 12398c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_W, BPF_REG_7, BPF_REG_0, 0), 12408c2ecf20Sopenharmony_ci 12418c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 12428c2ecf20Sopenharmony_ci 12438c2ecf20Sopenharmony_ci /* arg2 (buf_len) */ 12448c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 4), 12458c2ecf20Sopenharmony_ci 12468c2ecf20Sopenharmony_ci /* arg3 (flags) */ 12478c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 0), 12488c2ecf20Sopenharmony_ci 12498c2ecf20Sopenharmony_ci /* arg4 (res) */ 12508c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 12518c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 12528c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_7), 12538c2ecf20Sopenharmony_ci 12548c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_strtol), 12558c2ecf20Sopenharmony_ci 12568c2ecf20Sopenharmony_ci /* if (ret == expected && */ 12578c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 4, 4), 12588c2ecf20Sopenharmony_ci /* res == expected) */ 12598c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 12608c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 254, 2), 12618c2ecf20Sopenharmony_ci 12628c2ecf20Sopenharmony_ci /* return ALLOW; */ 12638c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 12648c2ecf20Sopenharmony_ci BPF_JMP_A(1), 12658c2ecf20Sopenharmony_ci 12668c2ecf20Sopenharmony_ci /* else return DENY; */ 12678c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 12688c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 12698c2ecf20Sopenharmony_ci }, 12708c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 12718c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 12728c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 12738c2ecf20Sopenharmony_ci .result = SUCCESS, 12748c2ecf20Sopenharmony_ci }, 12758c2ecf20Sopenharmony_ci { 12768c2ecf20Sopenharmony_ci "bpf_strtol max long", 12778c2ecf20Sopenharmony_ci .insns = { 12788c2ecf20Sopenharmony_ci /* arg1 (buf) 9223372036854775807 */ 12798c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 12808c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -24), 12818c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 12828c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x3932323333373230ULL)), 12838c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 12848c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 12858c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x3336383534373735ULL)), 12868c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 8), 12878c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 12888c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x3830370000000000ULL)), 12898c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 16), 12908c2ecf20Sopenharmony_ci 12918c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 12928c2ecf20Sopenharmony_ci 12938c2ecf20Sopenharmony_ci /* arg2 (buf_len) */ 12948c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 19), 12958c2ecf20Sopenharmony_ci 12968c2ecf20Sopenharmony_ci /* arg3 (flags) */ 12978c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 0), 12988c2ecf20Sopenharmony_ci 12998c2ecf20Sopenharmony_ci /* arg4 (res) */ 13008c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 13018c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 13028c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_7), 13038c2ecf20Sopenharmony_ci 13048c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_strtol), 13058c2ecf20Sopenharmony_ci 13068c2ecf20Sopenharmony_ci /* if (ret == expected && */ 13078c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 19, 6), 13088c2ecf20Sopenharmony_ci /* res == expected) */ 13098c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_8, 0x7fffffffffffffffULL), 13108c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), 13118c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), 13128c2ecf20Sopenharmony_ci 13138c2ecf20Sopenharmony_ci /* return ALLOW; */ 13148c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 13158c2ecf20Sopenharmony_ci BPF_JMP_A(1), 13168c2ecf20Sopenharmony_ci 13178c2ecf20Sopenharmony_ci /* else return DENY; */ 13188c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 13198c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 13208c2ecf20Sopenharmony_ci }, 13218c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 13228c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 13238c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 13248c2ecf20Sopenharmony_ci .result = SUCCESS, 13258c2ecf20Sopenharmony_ci }, 13268c2ecf20Sopenharmony_ci { 13278c2ecf20Sopenharmony_ci "bpf_strtol overflow, ERANGE", 13288c2ecf20Sopenharmony_ci .insns = { 13298c2ecf20Sopenharmony_ci /* arg1 (buf) 9223372036854775808 */ 13308c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 13318c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -24), 13328c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 13338c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x3932323333373230ULL)), 13348c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 13358c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 13368c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x3336383534373735ULL)), 13378c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 8), 13388c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 13398c2ecf20Sopenharmony_ci bpf_be64_to_cpu(0x3830380000000000ULL)), 13408c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 16), 13418c2ecf20Sopenharmony_ci 13428c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 13438c2ecf20Sopenharmony_ci 13448c2ecf20Sopenharmony_ci /* arg2 (buf_len) */ 13458c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 19), 13468c2ecf20Sopenharmony_ci 13478c2ecf20Sopenharmony_ci /* arg3 (flags) */ 13488c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 0), 13498c2ecf20Sopenharmony_ci 13508c2ecf20Sopenharmony_ci /* arg4 (res) */ 13518c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), 13528c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 13538c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_7), 13548c2ecf20Sopenharmony_ci 13558c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_strtol), 13568c2ecf20Sopenharmony_ci 13578c2ecf20Sopenharmony_ci /* if (ret == expected) */ 13588c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -ERANGE, 2), 13598c2ecf20Sopenharmony_ci 13608c2ecf20Sopenharmony_ci /* return ALLOW; */ 13618c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 13628c2ecf20Sopenharmony_ci BPF_JMP_A(1), 13638c2ecf20Sopenharmony_ci 13648c2ecf20Sopenharmony_ci /* else return DENY; */ 13658c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 13668c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 13678c2ecf20Sopenharmony_ci }, 13688c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 13698c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 13708c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 13718c2ecf20Sopenharmony_ci .result = SUCCESS, 13728c2ecf20Sopenharmony_ci }, 13738c2ecf20Sopenharmony_ci { 13748c2ecf20Sopenharmony_ci "C prog: deny all writes", 13758c2ecf20Sopenharmony_ci .prog_file = "./test_sysctl_prog.o", 13768c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 13778c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/tcp_mem", 13788c2ecf20Sopenharmony_ci .open_flags = O_WRONLY, 13798c2ecf20Sopenharmony_ci .newval = "123 456 789", 13808c2ecf20Sopenharmony_ci .result = OP_EPERM, 13818c2ecf20Sopenharmony_ci }, 13828c2ecf20Sopenharmony_ci { 13838c2ecf20Sopenharmony_ci "C prog: deny access by name", 13848c2ecf20Sopenharmony_ci .prog_file = "./test_sysctl_prog.o", 13858c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 13868c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/route/mtu_expires", 13878c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 13888c2ecf20Sopenharmony_ci .result = OP_EPERM, 13898c2ecf20Sopenharmony_ci }, 13908c2ecf20Sopenharmony_ci { 13918c2ecf20Sopenharmony_ci "C prog: read tcp_mem", 13928c2ecf20Sopenharmony_ci .prog_file = "./test_sysctl_prog.o", 13938c2ecf20Sopenharmony_ci .attach_type = BPF_CGROUP_SYSCTL, 13948c2ecf20Sopenharmony_ci .sysctl = "net/ipv4/tcp_mem", 13958c2ecf20Sopenharmony_ci .open_flags = O_RDONLY, 13968c2ecf20Sopenharmony_ci .result = SUCCESS, 13978c2ecf20Sopenharmony_ci }, 13988c2ecf20Sopenharmony_ci}; 13998c2ecf20Sopenharmony_ci 14008c2ecf20Sopenharmony_cistatic size_t probe_prog_length(const struct bpf_insn *fp) 14018c2ecf20Sopenharmony_ci{ 14028c2ecf20Sopenharmony_ci size_t len; 14038c2ecf20Sopenharmony_ci 14048c2ecf20Sopenharmony_ci for (len = MAX_INSNS - 1; len > 0; --len) 14058c2ecf20Sopenharmony_ci if (fp[len].code != 0 || fp[len].imm != 0) 14068c2ecf20Sopenharmony_ci break; 14078c2ecf20Sopenharmony_ci return len + 1; 14088c2ecf20Sopenharmony_ci} 14098c2ecf20Sopenharmony_ci 14108c2ecf20Sopenharmony_cistatic int fixup_sysctl_value(const char *buf, size_t buf_len, 14118c2ecf20Sopenharmony_ci struct bpf_insn *prog, size_t insn_num) 14128c2ecf20Sopenharmony_ci{ 14138c2ecf20Sopenharmony_ci union { 14148c2ecf20Sopenharmony_ci uint8_t raw[sizeof(uint64_t)]; 14158c2ecf20Sopenharmony_ci uint64_t num; 14168c2ecf20Sopenharmony_ci } value = {}; 14178c2ecf20Sopenharmony_ci 14188c2ecf20Sopenharmony_ci if (buf_len > sizeof(value)) { 14198c2ecf20Sopenharmony_ci log_err("Value is too big (%zd) to use in fixup", buf_len); 14208c2ecf20Sopenharmony_ci return -1; 14218c2ecf20Sopenharmony_ci } 14228c2ecf20Sopenharmony_ci if (prog[insn_num].code != (BPF_LD | BPF_DW | BPF_IMM)) { 14238c2ecf20Sopenharmony_ci log_err("Can fixup only BPF_LD_IMM64 insns"); 14248c2ecf20Sopenharmony_ci return -1; 14258c2ecf20Sopenharmony_ci } 14268c2ecf20Sopenharmony_ci 14278c2ecf20Sopenharmony_ci memcpy(value.raw, buf, buf_len); 14288c2ecf20Sopenharmony_ci prog[insn_num].imm = (uint32_t)value.num; 14298c2ecf20Sopenharmony_ci prog[insn_num + 1].imm = (uint32_t)(value.num >> 32); 14308c2ecf20Sopenharmony_ci 14318c2ecf20Sopenharmony_ci return 0; 14328c2ecf20Sopenharmony_ci} 14338c2ecf20Sopenharmony_ci 14348c2ecf20Sopenharmony_cistatic int load_sysctl_prog_insns(struct sysctl_test *test, 14358c2ecf20Sopenharmony_ci const char *sysctl_path) 14368c2ecf20Sopenharmony_ci{ 14378c2ecf20Sopenharmony_ci struct bpf_insn *prog = test->insns; 14388c2ecf20Sopenharmony_ci struct bpf_load_program_attr attr; 14398c2ecf20Sopenharmony_ci int ret; 14408c2ecf20Sopenharmony_ci 14418c2ecf20Sopenharmony_ci memset(&attr, 0, sizeof(struct bpf_load_program_attr)); 14428c2ecf20Sopenharmony_ci attr.prog_type = BPF_PROG_TYPE_CGROUP_SYSCTL; 14438c2ecf20Sopenharmony_ci attr.insns = prog; 14448c2ecf20Sopenharmony_ci attr.insns_cnt = probe_prog_length(attr.insns); 14458c2ecf20Sopenharmony_ci attr.license = "GPL"; 14468c2ecf20Sopenharmony_ci 14478c2ecf20Sopenharmony_ci if (test->fixup_value_insn) { 14488c2ecf20Sopenharmony_ci char buf[128]; 14498c2ecf20Sopenharmony_ci ssize_t len; 14508c2ecf20Sopenharmony_ci int fd; 14518c2ecf20Sopenharmony_ci 14528c2ecf20Sopenharmony_ci fd = open(sysctl_path, O_RDONLY | O_CLOEXEC); 14538c2ecf20Sopenharmony_ci if (fd < 0) { 14548c2ecf20Sopenharmony_ci log_err("open(%s) failed", sysctl_path); 14558c2ecf20Sopenharmony_ci return -1; 14568c2ecf20Sopenharmony_ci } 14578c2ecf20Sopenharmony_ci len = read(fd, buf, sizeof(buf)); 14588c2ecf20Sopenharmony_ci if (len == -1) { 14598c2ecf20Sopenharmony_ci log_err("read(%s) failed", sysctl_path); 14608c2ecf20Sopenharmony_ci close(fd); 14618c2ecf20Sopenharmony_ci return -1; 14628c2ecf20Sopenharmony_ci } 14638c2ecf20Sopenharmony_ci close(fd); 14648c2ecf20Sopenharmony_ci if (fixup_sysctl_value(buf, len, prog, test->fixup_value_insn)) 14658c2ecf20Sopenharmony_ci return -1; 14668c2ecf20Sopenharmony_ci } 14678c2ecf20Sopenharmony_ci 14688c2ecf20Sopenharmony_ci ret = bpf_load_program_xattr(&attr, bpf_log_buf, BPF_LOG_BUF_SIZE); 14698c2ecf20Sopenharmony_ci if (ret < 0 && test->result != LOAD_REJECT) { 14708c2ecf20Sopenharmony_ci log_err(">>> Loading program error.\n" 14718c2ecf20Sopenharmony_ci ">>> Verifier output:\n%s\n-------\n", bpf_log_buf); 14728c2ecf20Sopenharmony_ci } 14738c2ecf20Sopenharmony_ci 14748c2ecf20Sopenharmony_ci return ret; 14758c2ecf20Sopenharmony_ci} 14768c2ecf20Sopenharmony_ci 14778c2ecf20Sopenharmony_cistatic int load_sysctl_prog_file(struct sysctl_test *test) 14788c2ecf20Sopenharmony_ci{ 14798c2ecf20Sopenharmony_ci struct bpf_prog_load_attr attr; 14808c2ecf20Sopenharmony_ci struct bpf_object *obj; 14818c2ecf20Sopenharmony_ci int prog_fd; 14828c2ecf20Sopenharmony_ci 14838c2ecf20Sopenharmony_ci memset(&attr, 0, sizeof(struct bpf_prog_load_attr)); 14848c2ecf20Sopenharmony_ci attr.file = test->prog_file; 14858c2ecf20Sopenharmony_ci attr.prog_type = BPF_PROG_TYPE_CGROUP_SYSCTL; 14868c2ecf20Sopenharmony_ci 14878c2ecf20Sopenharmony_ci if (bpf_prog_load_xattr(&attr, &obj, &prog_fd)) { 14888c2ecf20Sopenharmony_ci if (test->result != LOAD_REJECT) 14898c2ecf20Sopenharmony_ci log_err(">>> Loading program (%s) error.\n", 14908c2ecf20Sopenharmony_ci test->prog_file); 14918c2ecf20Sopenharmony_ci return -1; 14928c2ecf20Sopenharmony_ci } 14938c2ecf20Sopenharmony_ci 14948c2ecf20Sopenharmony_ci return prog_fd; 14958c2ecf20Sopenharmony_ci} 14968c2ecf20Sopenharmony_ci 14978c2ecf20Sopenharmony_cistatic int load_sysctl_prog(struct sysctl_test *test, const char *sysctl_path) 14988c2ecf20Sopenharmony_ci{ 14998c2ecf20Sopenharmony_ci return test->prog_file 15008c2ecf20Sopenharmony_ci ? load_sysctl_prog_file(test) 15018c2ecf20Sopenharmony_ci : load_sysctl_prog_insns(test, sysctl_path); 15028c2ecf20Sopenharmony_ci} 15038c2ecf20Sopenharmony_ci 15048c2ecf20Sopenharmony_cistatic int access_sysctl(const char *sysctl_path, 15058c2ecf20Sopenharmony_ci const struct sysctl_test *test) 15068c2ecf20Sopenharmony_ci{ 15078c2ecf20Sopenharmony_ci int err = 0; 15088c2ecf20Sopenharmony_ci int fd; 15098c2ecf20Sopenharmony_ci 15108c2ecf20Sopenharmony_ci fd = open(sysctl_path, test->open_flags | O_CLOEXEC); 15118c2ecf20Sopenharmony_ci if (fd < 0) 15128c2ecf20Sopenharmony_ci return fd; 15138c2ecf20Sopenharmony_ci 15148c2ecf20Sopenharmony_ci if (test->seek && lseek(fd, test->seek, SEEK_SET) == -1) { 15158c2ecf20Sopenharmony_ci log_err("lseek(%d) failed", test->seek); 15168c2ecf20Sopenharmony_ci goto err; 15178c2ecf20Sopenharmony_ci } 15188c2ecf20Sopenharmony_ci 15198c2ecf20Sopenharmony_ci if (test->open_flags == O_RDONLY) { 15208c2ecf20Sopenharmony_ci char buf[128]; 15218c2ecf20Sopenharmony_ci 15228c2ecf20Sopenharmony_ci if (read(fd, buf, sizeof(buf)) == -1) 15238c2ecf20Sopenharmony_ci goto err; 15248c2ecf20Sopenharmony_ci if (test->oldval && 15258c2ecf20Sopenharmony_ci strncmp(buf, test->oldval, strlen(test->oldval))) { 15268c2ecf20Sopenharmony_ci log_err("Read value %s != %s", buf, test->oldval); 15278c2ecf20Sopenharmony_ci goto err; 15288c2ecf20Sopenharmony_ci } 15298c2ecf20Sopenharmony_ci } else if (test->open_flags == O_WRONLY) { 15308c2ecf20Sopenharmony_ci if (!test->newval) { 15318c2ecf20Sopenharmony_ci log_err("New value for sysctl is not set"); 15328c2ecf20Sopenharmony_ci goto err; 15338c2ecf20Sopenharmony_ci } 15348c2ecf20Sopenharmony_ci if (write(fd, test->newval, strlen(test->newval)) == -1) 15358c2ecf20Sopenharmony_ci goto err; 15368c2ecf20Sopenharmony_ci } else { 15378c2ecf20Sopenharmony_ci log_err("Unexpected sysctl access: neither read nor write"); 15388c2ecf20Sopenharmony_ci goto err; 15398c2ecf20Sopenharmony_ci } 15408c2ecf20Sopenharmony_ci 15418c2ecf20Sopenharmony_ci goto out; 15428c2ecf20Sopenharmony_cierr: 15438c2ecf20Sopenharmony_ci err = -1; 15448c2ecf20Sopenharmony_ciout: 15458c2ecf20Sopenharmony_ci close(fd); 15468c2ecf20Sopenharmony_ci return err; 15478c2ecf20Sopenharmony_ci} 15488c2ecf20Sopenharmony_ci 15498c2ecf20Sopenharmony_cistatic int run_test_case(int cgfd, struct sysctl_test *test) 15508c2ecf20Sopenharmony_ci{ 15518c2ecf20Sopenharmony_ci enum bpf_attach_type atype = test->attach_type; 15528c2ecf20Sopenharmony_ci char sysctl_path[128]; 15538c2ecf20Sopenharmony_ci int progfd = -1; 15548c2ecf20Sopenharmony_ci int err = 0; 15558c2ecf20Sopenharmony_ci 15568c2ecf20Sopenharmony_ci printf("Test case: %s .. ", test->descr); 15578c2ecf20Sopenharmony_ci 15588c2ecf20Sopenharmony_ci snprintf(sysctl_path, sizeof(sysctl_path), "/proc/sys/%s", 15598c2ecf20Sopenharmony_ci test->sysctl); 15608c2ecf20Sopenharmony_ci 15618c2ecf20Sopenharmony_ci progfd = load_sysctl_prog(test, sysctl_path); 15628c2ecf20Sopenharmony_ci if (progfd < 0) { 15638c2ecf20Sopenharmony_ci if (test->result == LOAD_REJECT) 15648c2ecf20Sopenharmony_ci goto out; 15658c2ecf20Sopenharmony_ci else 15668c2ecf20Sopenharmony_ci goto err; 15678c2ecf20Sopenharmony_ci } 15688c2ecf20Sopenharmony_ci 15698c2ecf20Sopenharmony_ci if (bpf_prog_attach(progfd, cgfd, atype, BPF_F_ALLOW_OVERRIDE) == -1) { 15708c2ecf20Sopenharmony_ci if (test->result == ATTACH_REJECT) 15718c2ecf20Sopenharmony_ci goto out; 15728c2ecf20Sopenharmony_ci else 15738c2ecf20Sopenharmony_ci goto err; 15748c2ecf20Sopenharmony_ci } 15758c2ecf20Sopenharmony_ci 15768c2ecf20Sopenharmony_ci errno = 0; 15778c2ecf20Sopenharmony_ci if (access_sysctl(sysctl_path, test) == -1) { 15788c2ecf20Sopenharmony_ci if (test->result == OP_EPERM && errno == EPERM) 15798c2ecf20Sopenharmony_ci goto out; 15808c2ecf20Sopenharmony_ci else 15818c2ecf20Sopenharmony_ci goto err; 15828c2ecf20Sopenharmony_ci } 15838c2ecf20Sopenharmony_ci 15848c2ecf20Sopenharmony_ci if (test->result != SUCCESS) { 15858c2ecf20Sopenharmony_ci log_err("Unexpected success"); 15868c2ecf20Sopenharmony_ci goto err; 15878c2ecf20Sopenharmony_ci } 15888c2ecf20Sopenharmony_ci 15898c2ecf20Sopenharmony_ci goto out; 15908c2ecf20Sopenharmony_cierr: 15918c2ecf20Sopenharmony_ci err = -1; 15928c2ecf20Sopenharmony_ciout: 15938c2ecf20Sopenharmony_ci /* Detaching w/o checking return code: best effort attempt. */ 15948c2ecf20Sopenharmony_ci if (progfd != -1) 15958c2ecf20Sopenharmony_ci bpf_prog_detach(cgfd, atype); 15968c2ecf20Sopenharmony_ci close(progfd); 15978c2ecf20Sopenharmony_ci printf("[%s]\n", err ? "FAIL" : "PASS"); 15988c2ecf20Sopenharmony_ci return err; 15998c2ecf20Sopenharmony_ci} 16008c2ecf20Sopenharmony_ci 16018c2ecf20Sopenharmony_cistatic int run_tests(int cgfd) 16028c2ecf20Sopenharmony_ci{ 16038c2ecf20Sopenharmony_ci int passes = 0; 16048c2ecf20Sopenharmony_ci int fails = 0; 16058c2ecf20Sopenharmony_ci int i; 16068c2ecf20Sopenharmony_ci 16078c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(tests); ++i) { 16088c2ecf20Sopenharmony_ci if (run_test_case(cgfd, &tests[i])) 16098c2ecf20Sopenharmony_ci ++fails; 16108c2ecf20Sopenharmony_ci else 16118c2ecf20Sopenharmony_ci ++passes; 16128c2ecf20Sopenharmony_ci } 16138c2ecf20Sopenharmony_ci printf("Summary: %d PASSED, %d FAILED\n", passes, fails); 16148c2ecf20Sopenharmony_ci return fails ? -1 : 0; 16158c2ecf20Sopenharmony_ci} 16168c2ecf20Sopenharmony_ci 16178c2ecf20Sopenharmony_ciint main(int argc, char **argv) 16188c2ecf20Sopenharmony_ci{ 16198c2ecf20Sopenharmony_ci int cgfd = -1; 16208c2ecf20Sopenharmony_ci int err = 0; 16218c2ecf20Sopenharmony_ci 16228c2ecf20Sopenharmony_ci cgfd = cgroup_setup_and_join(CG_PATH); 16238c2ecf20Sopenharmony_ci if (cgfd < 0) 16248c2ecf20Sopenharmony_ci goto err; 16258c2ecf20Sopenharmony_ci 16268c2ecf20Sopenharmony_ci if (run_tests(cgfd)) 16278c2ecf20Sopenharmony_ci goto err; 16288c2ecf20Sopenharmony_ci 16298c2ecf20Sopenharmony_ci goto out; 16308c2ecf20Sopenharmony_cierr: 16318c2ecf20Sopenharmony_ci err = -1; 16328c2ecf20Sopenharmony_ciout: 16338c2ecf20Sopenharmony_ci close(cgfd); 16348c2ecf20Sopenharmony_ci cleanup_cgroup_environment(); 16358c2ecf20Sopenharmony_ci return err; 16368c2ecf20Sopenharmony_ci} 1637