162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci// Copyright (c) 2019 Facebook
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <fcntl.h>
562306a36Sopenharmony_ci#include <stdint.h>
662306a36Sopenharmony_ci#include <stdio.h>
762306a36Sopenharmony_ci#include <stdlib.h>
862306a36Sopenharmony_ci#include <string.h>
962306a36Sopenharmony_ci#include <unistd.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/filter.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <bpf/bpf.h>
1462306a36Sopenharmony_ci#include <bpf/libbpf.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include <bpf/bpf_endian.h>
1762306a36Sopenharmony_ci#include "bpf_util.h"
1862306a36Sopenharmony_ci#include "cgroup_helpers.h"
1962306a36Sopenharmony_ci#include "testing_helpers.h"
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#define CG_PATH			"/foo"
2262306a36Sopenharmony_ci#define MAX_INSNS		512
2362306a36Sopenharmony_ci#define FIXUP_SYSCTL_VALUE	0
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cichar bpf_log_buf[BPF_LOG_BUF_SIZE];
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistruct sysctl_test {
2862306a36Sopenharmony_ci	const char *descr;
2962306a36Sopenharmony_ci	size_t fixup_value_insn;
3062306a36Sopenharmony_ci	struct bpf_insn	insns[MAX_INSNS];
3162306a36Sopenharmony_ci	const char *prog_file;
3262306a36Sopenharmony_ci	enum bpf_attach_type attach_type;
3362306a36Sopenharmony_ci	const char *sysctl;
3462306a36Sopenharmony_ci	int open_flags;
3562306a36Sopenharmony_ci	int seek;
3662306a36Sopenharmony_ci	const char *newval;
3762306a36Sopenharmony_ci	const char *oldval;
3862306a36Sopenharmony_ci	enum {
3962306a36Sopenharmony_ci		LOAD_REJECT,
4062306a36Sopenharmony_ci		ATTACH_REJECT,
4162306a36Sopenharmony_ci		OP_EPERM,
4262306a36Sopenharmony_ci		SUCCESS,
4362306a36Sopenharmony_ci	} result;
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic struct sysctl_test tests[] = {
4762306a36Sopenharmony_ci	{
4862306a36Sopenharmony_ci		.descr = "sysctl wrong attach_type",
4962306a36Sopenharmony_ci		.insns = {
5062306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
5162306a36Sopenharmony_ci			BPF_EXIT_INSN(),
5262306a36Sopenharmony_ci		},
5362306a36Sopenharmony_ci		.attach_type = 0,
5462306a36Sopenharmony_ci		.sysctl = "kernel/ostype",
5562306a36Sopenharmony_ci		.open_flags = O_RDONLY,
5662306a36Sopenharmony_ci		.result = ATTACH_REJECT,
5762306a36Sopenharmony_ci	},
5862306a36Sopenharmony_ci	{
5962306a36Sopenharmony_ci		.descr = "sysctl:read allow all",
6062306a36Sopenharmony_ci		.insns = {
6162306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
6262306a36Sopenharmony_ci			BPF_EXIT_INSN(),
6362306a36Sopenharmony_ci		},
6462306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
6562306a36Sopenharmony_ci		.sysctl = "kernel/ostype",
6662306a36Sopenharmony_ci		.open_flags = O_RDONLY,
6762306a36Sopenharmony_ci		.result = SUCCESS,
6862306a36Sopenharmony_ci	},
6962306a36Sopenharmony_ci	{
7062306a36Sopenharmony_ci		.descr = "sysctl:read deny all",
7162306a36Sopenharmony_ci		.insns = {
7262306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
7362306a36Sopenharmony_ci			BPF_EXIT_INSN(),
7462306a36Sopenharmony_ci		},
7562306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
7662306a36Sopenharmony_ci		.sysctl = "kernel/ostype",
7762306a36Sopenharmony_ci		.open_flags = O_RDONLY,
7862306a36Sopenharmony_ci		.result = OP_EPERM,
7962306a36Sopenharmony_ci	},
8062306a36Sopenharmony_ci	{
8162306a36Sopenharmony_ci		.descr = "ctx:write sysctl:read read ok",
8262306a36Sopenharmony_ci		.insns = {
8362306a36Sopenharmony_ci			/* If (write) */
8462306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
8562306a36Sopenharmony_ci				    offsetof(struct bpf_sysctl, write)),
8662306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 1, 2),
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci			/* return DENY; */
8962306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
9062306a36Sopenharmony_ci			BPF_JMP_A(1),
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci			/* else return ALLOW; */
9362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
9462306a36Sopenharmony_ci			BPF_EXIT_INSN(),
9562306a36Sopenharmony_ci		},
9662306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
9762306a36Sopenharmony_ci		.sysctl = "kernel/ostype",
9862306a36Sopenharmony_ci		.open_flags = O_RDONLY,
9962306a36Sopenharmony_ci		.result = SUCCESS,
10062306a36Sopenharmony_ci	},
10162306a36Sopenharmony_ci	{
10262306a36Sopenharmony_ci		.descr = "ctx:write sysctl:write read ok",
10362306a36Sopenharmony_ci		.insns = {
10462306a36Sopenharmony_ci			/* If (write) */
10562306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
10662306a36Sopenharmony_ci				    offsetof(struct bpf_sysctl, write)),
10762306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 1, 2),
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci			/* return DENY; */
11062306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
11162306a36Sopenharmony_ci			BPF_JMP_A(1),
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci			/* else return ALLOW; */
11462306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
11562306a36Sopenharmony_ci			BPF_EXIT_INSN(),
11662306a36Sopenharmony_ci		},
11762306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
11862306a36Sopenharmony_ci		.sysctl = "kernel/domainname",
11962306a36Sopenharmony_ci		.open_flags = O_WRONLY,
12062306a36Sopenharmony_ci		.newval = "(none)", /* same as default, should fail anyway */
12162306a36Sopenharmony_ci		.result = OP_EPERM,
12262306a36Sopenharmony_ci	},
12362306a36Sopenharmony_ci	{
12462306a36Sopenharmony_ci		.descr = "ctx:write sysctl:write read ok narrow",
12562306a36Sopenharmony_ci		.insns = {
12662306a36Sopenharmony_ci			/* u64 w = (u16)write & 1; */
12762306a36Sopenharmony_ci#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
12862306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_H, BPF_REG_7, BPF_REG_1,
12962306a36Sopenharmony_ci				    offsetof(struct bpf_sysctl, write)),
13062306a36Sopenharmony_ci#else
13162306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_H, BPF_REG_7, BPF_REG_1,
13262306a36Sopenharmony_ci				    offsetof(struct bpf_sysctl, write) + 2),
13362306a36Sopenharmony_ci#endif
13462306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_AND, BPF_REG_7, 1),
13562306a36Sopenharmony_ci			/* return 1 - w; */
13662306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
13762306a36Sopenharmony_ci			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_7),
13862306a36Sopenharmony_ci			BPF_EXIT_INSN(),
13962306a36Sopenharmony_ci		},
14062306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
14162306a36Sopenharmony_ci		.sysctl = "kernel/domainname",
14262306a36Sopenharmony_ci		.open_flags = O_WRONLY,
14362306a36Sopenharmony_ci		.newval = "(none)", /* same as default, should fail anyway */
14462306a36Sopenharmony_ci		.result = OP_EPERM,
14562306a36Sopenharmony_ci	},
14662306a36Sopenharmony_ci	{
14762306a36Sopenharmony_ci		.descr = "ctx:write sysctl:read write reject",
14862306a36Sopenharmony_ci		.insns = {
14962306a36Sopenharmony_ci			/* write = X */
15062306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
15162306a36Sopenharmony_ci			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
15262306a36Sopenharmony_ci				    offsetof(struct bpf_sysctl, write)),
15362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
15462306a36Sopenharmony_ci			BPF_EXIT_INSN(),
15562306a36Sopenharmony_ci		},
15662306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
15762306a36Sopenharmony_ci		.sysctl = "kernel/ostype",
15862306a36Sopenharmony_ci		.open_flags = O_RDONLY,
15962306a36Sopenharmony_ci		.result = LOAD_REJECT,
16062306a36Sopenharmony_ci	},
16162306a36Sopenharmony_ci	{
16262306a36Sopenharmony_ci		.descr = "ctx:file_pos sysctl:read read ok",
16362306a36Sopenharmony_ci		.insns = {
16462306a36Sopenharmony_ci			/* If (file_pos == X) */
16562306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
16662306a36Sopenharmony_ci				    offsetof(struct bpf_sysctl, file_pos)),
16762306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 3, 2),
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci			/* return ALLOW; */
17062306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
17162306a36Sopenharmony_ci			BPF_JMP_A(1),
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci			/* else return DENY; */
17462306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
17562306a36Sopenharmony_ci			BPF_EXIT_INSN(),
17662306a36Sopenharmony_ci		},
17762306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
17862306a36Sopenharmony_ci		.sysctl = "kernel/ostype",
17962306a36Sopenharmony_ci		.open_flags = O_RDONLY,
18062306a36Sopenharmony_ci		.seek = 3,
18162306a36Sopenharmony_ci		.result = SUCCESS,
18262306a36Sopenharmony_ci	},
18362306a36Sopenharmony_ci	{
18462306a36Sopenharmony_ci		.descr = "ctx:file_pos sysctl:read read ok narrow",
18562306a36Sopenharmony_ci		.insns = {
18662306a36Sopenharmony_ci			/* If (file_pos == X) */
18762306a36Sopenharmony_ci#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
18862306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_B, BPF_REG_7, BPF_REG_1,
18962306a36Sopenharmony_ci				    offsetof(struct bpf_sysctl, file_pos)),
19062306a36Sopenharmony_ci#else
19162306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_B, BPF_REG_7, BPF_REG_1,
19262306a36Sopenharmony_ci				    offsetof(struct bpf_sysctl, file_pos) + 3),
19362306a36Sopenharmony_ci#endif
19462306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 4, 2),
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci			/* return ALLOW; */
19762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
19862306a36Sopenharmony_ci			BPF_JMP_A(1),
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci			/* else return DENY; */
20162306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
20262306a36Sopenharmony_ci			BPF_EXIT_INSN(),
20362306a36Sopenharmony_ci		},
20462306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
20562306a36Sopenharmony_ci		.sysctl = "kernel/ostype",
20662306a36Sopenharmony_ci		.open_flags = O_RDONLY,
20762306a36Sopenharmony_ci		.seek = 4,
20862306a36Sopenharmony_ci		.result = SUCCESS,
20962306a36Sopenharmony_ci	},
21062306a36Sopenharmony_ci	{
21162306a36Sopenharmony_ci		.descr = "ctx:file_pos sysctl:read write ok",
21262306a36Sopenharmony_ci		.insns = {
21362306a36Sopenharmony_ci			/* file_pos = X */
21462306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 2),
21562306a36Sopenharmony_ci			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
21662306a36Sopenharmony_ci				    offsetof(struct bpf_sysctl, file_pos)),
21762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
21862306a36Sopenharmony_ci			BPF_EXIT_INSN(),
21962306a36Sopenharmony_ci		},
22062306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
22162306a36Sopenharmony_ci		.sysctl = "kernel/ostype",
22262306a36Sopenharmony_ci		.open_flags = O_RDONLY,
22362306a36Sopenharmony_ci		.oldval = "nux\n",
22462306a36Sopenharmony_ci		.result = SUCCESS,
22562306a36Sopenharmony_ci	},
22662306a36Sopenharmony_ci	{
22762306a36Sopenharmony_ci		.descr = "sysctl_get_name sysctl_value:base ok",
22862306a36Sopenharmony_ci		.insns = {
22962306a36Sopenharmony_ci			/* sysctl_get_name arg2 (buf) */
23062306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
23162306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
23262306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
23362306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci			/* sysctl_get_name arg3 (buf_len) */
23862306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 8),
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci			/* sysctl_get_name arg4 (flags) */
24162306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_4, BPF_F_SYSCTL_BASE_NAME),
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ci			/* sysctl_get_name(ctx, buf, buf_len, flags) */
24462306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_get_name),
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ci			/* if (ret == expected && */
24762306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, sizeof("tcp_mem") - 1, 6),
24862306a36Sopenharmony_ci			/*     buf == "tcp_mem\0") */
24962306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8,
25062306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x7463705f6d656d00ULL)),
25162306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
25262306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2),
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci			/* return ALLOW; */
25562306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
25662306a36Sopenharmony_ci			BPF_JMP_A(1),
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci			/* else return DENY; */
25962306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
26062306a36Sopenharmony_ci			BPF_EXIT_INSN(),
26162306a36Sopenharmony_ci		},
26262306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
26362306a36Sopenharmony_ci		.sysctl = "net/ipv4/tcp_mem",
26462306a36Sopenharmony_ci		.open_flags = O_RDONLY,
26562306a36Sopenharmony_ci		.result = SUCCESS,
26662306a36Sopenharmony_ci	},
26762306a36Sopenharmony_ci	{
26862306a36Sopenharmony_ci		.descr = "sysctl_get_name sysctl_value:base E2BIG truncated",
26962306a36Sopenharmony_ci		.insns = {
27062306a36Sopenharmony_ci			/* sysctl_get_name arg2 (buf) */
27162306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
27262306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
27362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
27462306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci			/* sysctl_get_name arg3 (buf_len) too small */
27962306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 7),
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci			/* sysctl_get_name arg4 (flags) */
28262306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_4, BPF_F_SYSCTL_BASE_NAME),
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci			/* sysctl_get_name(ctx, buf, buf_len, flags) */
28562306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_get_name),
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci			/* if (ret == expected && */
28862306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 6),
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci			/*     buf[0:7] == "tcp_me\0") */
29162306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8,
29262306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x7463705f6d650000ULL)),
29362306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
29462306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2),
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci			/* return ALLOW; */
29762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
29862306a36Sopenharmony_ci			BPF_JMP_A(1),
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci			/* else return DENY; */
30162306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
30262306a36Sopenharmony_ci			BPF_EXIT_INSN(),
30362306a36Sopenharmony_ci		},
30462306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
30562306a36Sopenharmony_ci		.sysctl = "net/ipv4/tcp_mem",
30662306a36Sopenharmony_ci		.open_flags = O_RDONLY,
30762306a36Sopenharmony_ci		.result = SUCCESS,
30862306a36Sopenharmony_ci	},
30962306a36Sopenharmony_ci	{
31062306a36Sopenharmony_ci		.descr = "sysctl_get_name sysctl:full ok",
31162306a36Sopenharmony_ci		.insns = {
31262306a36Sopenharmony_ci			/* sysctl_get_name arg2 (buf) */
31362306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
31462306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -24),
31562306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
31662306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
31762306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 8),
31862306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 16),
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci			/* sysctl_get_name arg3 (buf_len) */
32362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 17),
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci			/* sysctl_get_name arg4 (flags) */
32662306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_4, 0),
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci			/* sysctl_get_name(ctx, buf, buf_len, flags) */
32962306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_get_name),
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ci			/* if (ret == expected && */
33262306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 16, 14),
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ci			/*     buf[0:8] == "net/ipv4" && */
33562306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8,
33662306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x6e65742f69707634ULL)),
33762306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
33862306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 10),
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci			/*     buf[8:16] == "/tcp_mem" && */
34162306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8,
34262306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x2f7463705f6d656dULL)),
34362306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 8),
34462306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 6),
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ci			/*     buf[16:24] == "\0") */
34762306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8, 0x0ULL),
34862306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 16),
34962306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2),
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci			/* return ALLOW; */
35262306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
35362306a36Sopenharmony_ci			BPF_JMP_A(1),
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_ci			/* else return DENY; */
35662306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
35762306a36Sopenharmony_ci			BPF_EXIT_INSN(),
35862306a36Sopenharmony_ci		},
35962306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
36062306a36Sopenharmony_ci		.sysctl = "net/ipv4/tcp_mem",
36162306a36Sopenharmony_ci		.open_flags = O_RDONLY,
36262306a36Sopenharmony_ci		.result = SUCCESS,
36362306a36Sopenharmony_ci	},
36462306a36Sopenharmony_ci	{
36562306a36Sopenharmony_ci		.descr = "sysctl_get_name sysctl:full E2BIG truncated",
36662306a36Sopenharmony_ci		.insns = {
36762306a36Sopenharmony_ci			/* sysctl_get_name arg2 (buf) */
36862306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
36962306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -16),
37062306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
37162306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
37262306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 8),
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci			/* sysctl_get_name arg3 (buf_len) */
37762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 16),
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ci			/* sysctl_get_name arg4 (flags) */
38062306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_4, 0),
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_ci			/* sysctl_get_name(ctx, buf, buf_len, flags) */
38362306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_get_name),
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci			/* if (ret == expected && */
38662306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 10),
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_ci			/*     buf[0:8] == "net/ipv4" && */
38962306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8,
39062306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x6e65742f69707634ULL)),
39162306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
39262306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 6),
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci			/*     buf[8:16] == "/tcp_me\0") */
39562306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8,
39662306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x2f7463705f6d6500ULL)),
39762306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 8),
39862306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2),
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_ci			/* return ALLOW; */
40162306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
40262306a36Sopenharmony_ci			BPF_JMP_A(1),
40362306a36Sopenharmony_ci
40462306a36Sopenharmony_ci			/* else return DENY; */
40562306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
40662306a36Sopenharmony_ci			BPF_EXIT_INSN(),
40762306a36Sopenharmony_ci		},
40862306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
40962306a36Sopenharmony_ci		.sysctl = "net/ipv4/tcp_mem",
41062306a36Sopenharmony_ci		.open_flags = O_RDONLY,
41162306a36Sopenharmony_ci		.result = SUCCESS,
41262306a36Sopenharmony_ci	},
41362306a36Sopenharmony_ci	{
41462306a36Sopenharmony_ci		.descr = "sysctl_get_name sysctl:full E2BIG truncated small",
41562306a36Sopenharmony_ci		.insns = {
41662306a36Sopenharmony_ci			/* sysctl_get_name arg2 (buf) */
41762306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
41862306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
41962306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
42062306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
42162306a36Sopenharmony_ci
42262306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_ci			/* sysctl_get_name arg3 (buf_len) */
42562306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 7),
42662306a36Sopenharmony_ci
42762306a36Sopenharmony_ci			/* sysctl_get_name arg4 (flags) */
42862306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_4, 0),
42962306a36Sopenharmony_ci
43062306a36Sopenharmony_ci			/* sysctl_get_name(ctx, buf, buf_len, flags) */
43162306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_get_name),
43262306a36Sopenharmony_ci
43362306a36Sopenharmony_ci			/* if (ret == expected && */
43462306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 6),
43562306a36Sopenharmony_ci
43662306a36Sopenharmony_ci			/*     buf[0:8] == "net/ip\0") */
43762306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8,
43862306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x6e65742f69700000ULL)),
43962306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
44062306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2),
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_ci			/* return ALLOW; */
44362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
44462306a36Sopenharmony_ci			BPF_JMP_A(1),
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_ci			/* else return DENY; */
44762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
44862306a36Sopenharmony_ci			BPF_EXIT_INSN(),
44962306a36Sopenharmony_ci		},
45062306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
45162306a36Sopenharmony_ci		.sysctl = "net/ipv4/tcp_mem",
45262306a36Sopenharmony_ci		.open_flags = O_RDONLY,
45362306a36Sopenharmony_ci		.result = SUCCESS,
45462306a36Sopenharmony_ci	},
45562306a36Sopenharmony_ci	{
45662306a36Sopenharmony_ci		.descr = "sysctl_get_current_value sysctl:read ok, gt",
45762306a36Sopenharmony_ci		.insns = {
45862306a36Sopenharmony_ci			/* sysctl_get_current_value arg2 (buf) */
45962306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
46062306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
46162306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
46262306a36Sopenharmony_ci
46362306a36Sopenharmony_ci			/* sysctl_get_current_value arg3 (buf_len) */
46462306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 8),
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_ci			/* sysctl_get_current_value(ctx, buf, buf_len) */
46762306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_get_current_value),
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_ci			/* if (ret == expected && */
47062306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 6, 6),
47162306a36Sopenharmony_ci
47262306a36Sopenharmony_ci			/*     buf[0:6] == "Linux\n\0") */
47362306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8,
47462306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x4c696e75780a0000ULL)),
47562306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
47662306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2),
47762306a36Sopenharmony_ci
47862306a36Sopenharmony_ci			/* return ALLOW; */
47962306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
48062306a36Sopenharmony_ci			BPF_JMP_A(1),
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_ci			/* else return DENY; */
48362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
48462306a36Sopenharmony_ci			BPF_EXIT_INSN(),
48562306a36Sopenharmony_ci		},
48662306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
48762306a36Sopenharmony_ci		.sysctl = "kernel/ostype",
48862306a36Sopenharmony_ci		.open_flags = O_RDONLY,
48962306a36Sopenharmony_ci		.result = SUCCESS,
49062306a36Sopenharmony_ci	},
49162306a36Sopenharmony_ci	{
49262306a36Sopenharmony_ci		.descr = "sysctl_get_current_value sysctl:read ok, eq",
49362306a36Sopenharmony_ci		.insns = {
49462306a36Sopenharmony_ci			/* sysctl_get_current_value arg2 (buf) */
49562306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
49662306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
49762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
49862306a36Sopenharmony_ci			BPF_STX_MEM(BPF_B, BPF_REG_7, BPF_REG_0, 7),
49962306a36Sopenharmony_ci
50062306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_ci			/* sysctl_get_current_value arg3 (buf_len) */
50362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 7),
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci			/* sysctl_get_current_value(ctx, buf, buf_len) */
50662306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_get_current_value),
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_ci			/* if (ret == expected && */
50962306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 6, 6),
51062306a36Sopenharmony_ci
51162306a36Sopenharmony_ci			/*     buf[0:6] == "Linux\n\0") */
51262306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8,
51362306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x4c696e75780a0000ULL)),
51462306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
51562306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2),
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_ci			/* return ALLOW; */
51862306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
51962306a36Sopenharmony_ci			BPF_JMP_A(1),
52062306a36Sopenharmony_ci
52162306a36Sopenharmony_ci			/* else return DENY; */
52262306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
52362306a36Sopenharmony_ci			BPF_EXIT_INSN(),
52462306a36Sopenharmony_ci		},
52562306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
52662306a36Sopenharmony_ci		.sysctl = "kernel/ostype",
52762306a36Sopenharmony_ci		.open_flags = O_RDONLY,
52862306a36Sopenharmony_ci		.result = SUCCESS,
52962306a36Sopenharmony_ci	},
53062306a36Sopenharmony_ci	{
53162306a36Sopenharmony_ci		.descr = "sysctl_get_current_value sysctl:read E2BIG truncated",
53262306a36Sopenharmony_ci		.insns = {
53362306a36Sopenharmony_ci			/* sysctl_get_current_value arg2 (buf) */
53462306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
53562306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
53662306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
53762306a36Sopenharmony_ci			BPF_STX_MEM(BPF_H, BPF_REG_7, BPF_REG_0, 6),
53862306a36Sopenharmony_ci
53962306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
54062306a36Sopenharmony_ci
54162306a36Sopenharmony_ci			/* sysctl_get_current_value arg3 (buf_len) */
54262306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 6),
54362306a36Sopenharmony_ci
54462306a36Sopenharmony_ci			/* sysctl_get_current_value(ctx, buf, buf_len) */
54562306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_get_current_value),
54662306a36Sopenharmony_ci
54762306a36Sopenharmony_ci			/* if (ret == expected && */
54862306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 6),
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_ci			/*     buf[0:6] == "Linux\0") */
55162306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8,
55262306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x4c696e7578000000ULL)),
55362306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
55462306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2),
55562306a36Sopenharmony_ci
55662306a36Sopenharmony_ci			/* return ALLOW; */
55762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
55862306a36Sopenharmony_ci			BPF_JMP_A(1),
55962306a36Sopenharmony_ci
56062306a36Sopenharmony_ci			/* else return DENY; */
56162306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
56262306a36Sopenharmony_ci			BPF_EXIT_INSN(),
56362306a36Sopenharmony_ci		},
56462306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
56562306a36Sopenharmony_ci		.sysctl = "kernel/ostype",
56662306a36Sopenharmony_ci		.open_flags = O_RDONLY,
56762306a36Sopenharmony_ci		.result = SUCCESS,
56862306a36Sopenharmony_ci	},
56962306a36Sopenharmony_ci	{
57062306a36Sopenharmony_ci		.descr = "sysctl_get_current_value sysctl:read EINVAL",
57162306a36Sopenharmony_ci		.insns = {
57262306a36Sopenharmony_ci			/* sysctl_get_current_value arg2 (buf) */
57362306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
57462306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
57562306a36Sopenharmony_ci
57662306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
57762306a36Sopenharmony_ci
57862306a36Sopenharmony_ci			/* sysctl_get_current_value arg3 (buf_len) */
57962306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 8),
58062306a36Sopenharmony_ci
58162306a36Sopenharmony_ci			/* sysctl_get_current_value(ctx, buf, buf_len) */
58262306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_get_current_value),
58362306a36Sopenharmony_ci
58462306a36Sopenharmony_ci			/* if (ret == expected && */
58562306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -EINVAL, 4),
58662306a36Sopenharmony_ci
58762306a36Sopenharmony_ci			/*     buf[0:8] is NUL-filled) */
58862306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
58962306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 0, 2),
59062306a36Sopenharmony_ci
59162306a36Sopenharmony_ci			/* return DENY; */
59262306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
59362306a36Sopenharmony_ci			BPF_JMP_A(1),
59462306a36Sopenharmony_ci
59562306a36Sopenharmony_ci			/* else return ALLOW; */
59662306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
59762306a36Sopenharmony_ci			BPF_EXIT_INSN(),
59862306a36Sopenharmony_ci		},
59962306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
60062306a36Sopenharmony_ci		.sysctl = "net/ipv6/conf/lo/stable_secret", /* -EIO */
60162306a36Sopenharmony_ci		.open_flags = O_RDONLY,
60262306a36Sopenharmony_ci		.result = OP_EPERM,
60362306a36Sopenharmony_ci	},
60462306a36Sopenharmony_ci	{
60562306a36Sopenharmony_ci		.descr = "sysctl_get_current_value sysctl:write ok",
60662306a36Sopenharmony_ci		.fixup_value_insn = 6,
60762306a36Sopenharmony_ci		.insns = {
60862306a36Sopenharmony_ci			/* sysctl_get_current_value arg2 (buf) */
60962306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
61062306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
61162306a36Sopenharmony_ci
61262306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ci			/* sysctl_get_current_value arg3 (buf_len) */
61562306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 8),
61662306a36Sopenharmony_ci
61762306a36Sopenharmony_ci			/* sysctl_get_current_value(ctx, buf, buf_len) */
61862306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_get_current_value),
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_ci			/* if (ret == expected && */
62162306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 4, 6),
62262306a36Sopenharmony_ci
62362306a36Sopenharmony_ci			/*     buf[0:4] == expected) */
62462306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8, FIXUP_SYSCTL_VALUE),
62562306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
62662306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2),
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_ci			/* return DENY; */
62962306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
63062306a36Sopenharmony_ci			BPF_JMP_A(1),
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_ci			/* else return ALLOW; */
63362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
63462306a36Sopenharmony_ci			BPF_EXIT_INSN(),
63562306a36Sopenharmony_ci		},
63662306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
63762306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
63862306a36Sopenharmony_ci		.open_flags = O_WRONLY,
63962306a36Sopenharmony_ci		.newval = "600", /* same as default, should fail anyway */
64062306a36Sopenharmony_ci		.result = OP_EPERM,
64162306a36Sopenharmony_ci	},
64262306a36Sopenharmony_ci	{
64362306a36Sopenharmony_ci		.descr = "sysctl_get_new_value sysctl:read EINVAL",
64462306a36Sopenharmony_ci		.insns = {
64562306a36Sopenharmony_ci			/* sysctl_get_new_value arg2 (buf) */
64662306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
64762306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
64862306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
64962306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
65062306a36Sopenharmony_ci
65162306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
65262306a36Sopenharmony_ci
65362306a36Sopenharmony_ci			/* sysctl_get_new_value arg3 (buf_len) */
65462306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 8),
65562306a36Sopenharmony_ci
65662306a36Sopenharmony_ci			/* sysctl_get_new_value(ctx, buf, buf_len) */
65762306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_get_new_value),
65862306a36Sopenharmony_ci
65962306a36Sopenharmony_ci			/* if (ret == expected) */
66062306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -EINVAL, 2),
66162306a36Sopenharmony_ci
66262306a36Sopenharmony_ci			/* return ALLOW; */
66362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
66462306a36Sopenharmony_ci			BPF_JMP_A(1),
66562306a36Sopenharmony_ci
66662306a36Sopenharmony_ci			/* else return DENY; */
66762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
66862306a36Sopenharmony_ci			BPF_EXIT_INSN(),
66962306a36Sopenharmony_ci		},
67062306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
67162306a36Sopenharmony_ci		.sysctl = "net/ipv4/tcp_mem",
67262306a36Sopenharmony_ci		.open_flags = O_RDONLY,
67362306a36Sopenharmony_ci		.result = SUCCESS,
67462306a36Sopenharmony_ci	},
67562306a36Sopenharmony_ci	{
67662306a36Sopenharmony_ci		.descr = "sysctl_get_new_value sysctl:write ok",
67762306a36Sopenharmony_ci		.insns = {
67862306a36Sopenharmony_ci			/* sysctl_get_new_value arg2 (buf) */
67962306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
68062306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
68162306a36Sopenharmony_ci
68262306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
68362306a36Sopenharmony_ci
68462306a36Sopenharmony_ci			/* sysctl_get_new_value arg3 (buf_len) */
68562306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 4),
68662306a36Sopenharmony_ci
68762306a36Sopenharmony_ci			/* sysctl_get_new_value(ctx, buf, buf_len) */
68862306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_get_new_value),
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_ci			/* if (ret == expected && */
69162306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 3, 4),
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_ci			/*     buf[0:4] == "606\0") */
69462306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_7, 0),
69562306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_9,
69662306a36Sopenharmony_ci				    bpf_ntohl(0x36303600), 2),
69762306a36Sopenharmony_ci
69862306a36Sopenharmony_ci			/* return DENY; */
69962306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
70062306a36Sopenharmony_ci			BPF_JMP_A(1),
70162306a36Sopenharmony_ci
70262306a36Sopenharmony_ci			/* else return ALLOW; */
70362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
70462306a36Sopenharmony_ci			BPF_EXIT_INSN(),
70562306a36Sopenharmony_ci		},
70662306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
70762306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
70862306a36Sopenharmony_ci		.open_flags = O_WRONLY,
70962306a36Sopenharmony_ci		.newval = "606",
71062306a36Sopenharmony_ci		.result = OP_EPERM,
71162306a36Sopenharmony_ci	},
71262306a36Sopenharmony_ci	{
71362306a36Sopenharmony_ci		.descr = "sysctl_get_new_value sysctl:write ok long",
71462306a36Sopenharmony_ci		.insns = {
71562306a36Sopenharmony_ci			/* sysctl_get_new_value arg2 (buf) */
71662306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
71762306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -24),
71862306a36Sopenharmony_ci
71962306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
72062306a36Sopenharmony_ci
72162306a36Sopenharmony_ci			/* sysctl_get_new_value arg3 (buf_len) */
72262306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 24),
72362306a36Sopenharmony_ci
72462306a36Sopenharmony_ci			/* sysctl_get_new_value(ctx, buf, buf_len) */
72562306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_get_new_value),
72662306a36Sopenharmony_ci
72762306a36Sopenharmony_ci			/* if (ret == expected && */
72862306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 23, 14),
72962306a36Sopenharmony_ci
73062306a36Sopenharmony_ci			/*     buf[0:8] == "3000000 " && */
73162306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8,
73262306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x3330303030303020ULL)),
73362306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
73462306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 10),
73562306a36Sopenharmony_ci
73662306a36Sopenharmony_ci			/*     buf[8:16] == "4000000 " && */
73762306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8,
73862306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x3430303030303020ULL)),
73962306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 8),
74062306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 6),
74162306a36Sopenharmony_ci
74262306a36Sopenharmony_ci			/*     buf[16:24] == "6000000\0") */
74362306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8,
74462306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x3630303030303000ULL)),
74562306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 16),
74662306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2),
74762306a36Sopenharmony_ci
74862306a36Sopenharmony_ci			/* return DENY; */
74962306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
75062306a36Sopenharmony_ci			BPF_JMP_A(1),
75162306a36Sopenharmony_ci
75262306a36Sopenharmony_ci			/* else return ALLOW; */
75362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
75462306a36Sopenharmony_ci			BPF_EXIT_INSN(),
75562306a36Sopenharmony_ci		},
75662306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
75762306a36Sopenharmony_ci		.sysctl = "net/ipv4/tcp_mem",
75862306a36Sopenharmony_ci		.open_flags = O_WRONLY,
75962306a36Sopenharmony_ci		.newval = "3000000 4000000 6000000",
76062306a36Sopenharmony_ci		.result = OP_EPERM,
76162306a36Sopenharmony_ci	},
76262306a36Sopenharmony_ci	{
76362306a36Sopenharmony_ci		.descr = "sysctl_get_new_value sysctl:write E2BIG",
76462306a36Sopenharmony_ci		.insns = {
76562306a36Sopenharmony_ci			/* sysctl_get_new_value arg2 (buf) */
76662306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
76762306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
76862306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
76962306a36Sopenharmony_ci			BPF_STX_MEM(BPF_B, BPF_REG_7, BPF_REG_0, 3),
77062306a36Sopenharmony_ci
77162306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
77262306a36Sopenharmony_ci
77362306a36Sopenharmony_ci			/* sysctl_get_new_value arg3 (buf_len) */
77462306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 3),
77562306a36Sopenharmony_ci
77662306a36Sopenharmony_ci			/* sysctl_get_new_value(ctx, buf, buf_len) */
77762306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_get_new_value),
77862306a36Sopenharmony_ci
77962306a36Sopenharmony_ci			/* if (ret == expected && */
78062306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 4),
78162306a36Sopenharmony_ci
78262306a36Sopenharmony_ci			/*     buf[0:3] == "60\0") */
78362306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_7, 0),
78462306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_9,
78562306a36Sopenharmony_ci				    bpf_ntohl(0x36300000), 2),
78662306a36Sopenharmony_ci
78762306a36Sopenharmony_ci			/* return DENY; */
78862306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
78962306a36Sopenharmony_ci			BPF_JMP_A(1),
79062306a36Sopenharmony_ci
79162306a36Sopenharmony_ci			/* else return ALLOW; */
79262306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
79362306a36Sopenharmony_ci			BPF_EXIT_INSN(),
79462306a36Sopenharmony_ci		},
79562306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
79662306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
79762306a36Sopenharmony_ci		.open_flags = O_WRONLY,
79862306a36Sopenharmony_ci		.newval = "606",
79962306a36Sopenharmony_ci		.result = OP_EPERM,
80062306a36Sopenharmony_ci	},
80162306a36Sopenharmony_ci	{
80262306a36Sopenharmony_ci		.descr = "sysctl_set_new_value sysctl:read EINVAL",
80362306a36Sopenharmony_ci		.insns = {
80462306a36Sopenharmony_ci			/* sysctl_set_new_value arg2 (buf) */
80562306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
80662306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
80762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0,
80862306a36Sopenharmony_ci				      bpf_ntohl(0x36303000)),
80962306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
81062306a36Sopenharmony_ci
81162306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
81262306a36Sopenharmony_ci
81362306a36Sopenharmony_ci			/* sysctl_set_new_value arg3 (buf_len) */
81462306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 3),
81562306a36Sopenharmony_ci
81662306a36Sopenharmony_ci			/* sysctl_set_new_value(ctx, buf, buf_len) */
81762306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_set_new_value),
81862306a36Sopenharmony_ci
81962306a36Sopenharmony_ci			/* if (ret == expected) */
82062306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -EINVAL, 2),
82162306a36Sopenharmony_ci
82262306a36Sopenharmony_ci			/* return ALLOW; */
82362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
82462306a36Sopenharmony_ci			BPF_JMP_A(1),
82562306a36Sopenharmony_ci
82662306a36Sopenharmony_ci			/* else return DENY; */
82762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
82862306a36Sopenharmony_ci			BPF_EXIT_INSN(),
82962306a36Sopenharmony_ci		},
83062306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
83162306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
83262306a36Sopenharmony_ci		.open_flags = O_RDONLY,
83362306a36Sopenharmony_ci		.result = SUCCESS,
83462306a36Sopenharmony_ci	},
83562306a36Sopenharmony_ci	{
83662306a36Sopenharmony_ci		.descr = "sysctl_set_new_value sysctl:write ok",
83762306a36Sopenharmony_ci		.fixup_value_insn = 2,
83862306a36Sopenharmony_ci		.insns = {
83962306a36Sopenharmony_ci			/* sysctl_set_new_value arg2 (buf) */
84062306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
84162306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
84262306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_0, FIXUP_SYSCTL_VALUE),
84362306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
84462306a36Sopenharmony_ci
84562306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
84662306a36Sopenharmony_ci
84762306a36Sopenharmony_ci			/* sysctl_set_new_value arg3 (buf_len) */
84862306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 3),
84962306a36Sopenharmony_ci
85062306a36Sopenharmony_ci			/* sysctl_set_new_value(ctx, buf, buf_len) */
85162306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_sysctl_set_new_value),
85262306a36Sopenharmony_ci
85362306a36Sopenharmony_ci			/* if (ret == expected) */
85462306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
85562306a36Sopenharmony_ci
85662306a36Sopenharmony_ci			/* return ALLOW; */
85762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
85862306a36Sopenharmony_ci			BPF_JMP_A(1),
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_ci			/* else return DENY; */
86162306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
86262306a36Sopenharmony_ci			BPF_EXIT_INSN(),
86362306a36Sopenharmony_ci		},
86462306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
86562306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
86662306a36Sopenharmony_ci		.open_flags = O_WRONLY,
86762306a36Sopenharmony_ci		.newval = "606",
86862306a36Sopenharmony_ci		.result = SUCCESS,
86962306a36Sopenharmony_ci	},
87062306a36Sopenharmony_ci	{
87162306a36Sopenharmony_ci		"bpf_strtoul one number string",
87262306a36Sopenharmony_ci		.insns = {
87362306a36Sopenharmony_ci			/* arg1 (buf) */
87462306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
87562306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
87662306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0,
87762306a36Sopenharmony_ci				      bpf_ntohl(0x36303000)),
87862306a36Sopenharmony_ci			BPF_STX_MEM(BPF_W, BPF_REG_7, BPF_REG_0, 0),
87962306a36Sopenharmony_ci
88062306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
88162306a36Sopenharmony_ci
88262306a36Sopenharmony_ci			/* arg2 (buf_len) */
88362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_2, 4),
88462306a36Sopenharmony_ci
88562306a36Sopenharmony_ci			/* arg3 (flags) */
88662306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 0),
88762306a36Sopenharmony_ci
88862306a36Sopenharmony_ci			/* arg4 (res) */
88962306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
89062306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
89162306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
89262306a36Sopenharmony_ci
89362306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_strtoul),
89462306a36Sopenharmony_ci
89562306a36Sopenharmony_ci			/* if (ret == expected && */
89662306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 3, 4),
89762306a36Sopenharmony_ci			/*     res == expected) */
89862306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
89962306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 600, 2),
90062306a36Sopenharmony_ci
90162306a36Sopenharmony_ci			/* return ALLOW; */
90262306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
90362306a36Sopenharmony_ci			BPF_JMP_A(1),
90462306a36Sopenharmony_ci
90562306a36Sopenharmony_ci			/* else return DENY; */
90662306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
90762306a36Sopenharmony_ci			BPF_EXIT_INSN(),
90862306a36Sopenharmony_ci		},
90962306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
91062306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
91162306a36Sopenharmony_ci		.open_flags = O_RDONLY,
91262306a36Sopenharmony_ci		.result = SUCCESS,
91362306a36Sopenharmony_ci	},
91462306a36Sopenharmony_ci	{
91562306a36Sopenharmony_ci		"bpf_strtoul multi number string",
91662306a36Sopenharmony_ci		.insns = {
91762306a36Sopenharmony_ci			/* arg1 (buf) */
91862306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
91962306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
92062306a36Sopenharmony_ci			/* "600 602\0" */
92162306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_0,
92262306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x3630302036303200ULL)),
92362306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
92462306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
92562306a36Sopenharmony_ci
92662306a36Sopenharmony_ci			/* arg2 (buf_len) */
92762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_2, 8),
92862306a36Sopenharmony_ci
92962306a36Sopenharmony_ci			/* arg3 (flags) */
93062306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 0),
93162306a36Sopenharmony_ci
93262306a36Sopenharmony_ci			/* arg4 (res) */
93362306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
93462306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
93562306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
93662306a36Sopenharmony_ci
93762306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_strtoul),
93862306a36Sopenharmony_ci
93962306a36Sopenharmony_ci			/* if (ret == expected && */
94062306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 3, 18),
94162306a36Sopenharmony_ci			/*     res == expected) */
94262306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
94362306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 600, 16),
94462306a36Sopenharmony_ci
94562306a36Sopenharmony_ci			/*     arg1 (buf) */
94662306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
94762306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
94862306a36Sopenharmony_ci			BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
94962306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
95062306a36Sopenharmony_ci
95162306a36Sopenharmony_ci			/*     arg2 (buf_len) */
95262306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_2, 8),
95362306a36Sopenharmony_ci			BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_0),
95462306a36Sopenharmony_ci
95562306a36Sopenharmony_ci			/*     arg3 (flags) */
95662306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 0),
95762306a36Sopenharmony_ci
95862306a36Sopenharmony_ci			/*     arg4 (res) */
95962306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
96062306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -16),
96162306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
96262306a36Sopenharmony_ci
96362306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_strtoul),
96462306a36Sopenharmony_ci
96562306a36Sopenharmony_ci			/*     if (ret == expected && */
96662306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 4, 4),
96762306a36Sopenharmony_ci			/*         res == expected) */
96862306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
96962306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 602, 2),
97062306a36Sopenharmony_ci
97162306a36Sopenharmony_ci			/* return ALLOW; */
97262306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
97362306a36Sopenharmony_ci			BPF_JMP_A(1),
97462306a36Sopenharmony_ci
97562306a36Sopenharmony_ci			/* else return DENY; */
97662306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
97762306a36Sopenharmony_ci			BPF_EXIT_INSN(),
97862306a36Sopenharmony_ci		},
97962306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
98062306a36Sopenharmony_ci		.sysctl = "net/ipv4/tcp_mem",
98162306a36Sopenharmony_ci		.open_flags = O_RDONLY,
98262306a36Sopenharmony_ci		.result = SUCCESS,
98362306a36Sopenharmony_ci	},
98462306a36Sopenharmony_ci	{
98562306a36Sopenharmony_ci		"bpf_strtoul buf_len = 0, reject",
98662306a36Sopenharmony_ci		.insns = {
98762306a36Sopenharmony_ci			/* arg1 (buf) */
98862306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
98962306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
99062306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0,
99162306a36Sopenharmony_ci				      bpf_ntohl(0x36303000)),
99262306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
99362306a36Sopenharmony_ci
99462306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
99562306a36Sopenharmony_ci
99662306a36Sopenharmony_ci			/* arg2 (buf_len) */
99762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_2, 0),
99862306a36Sopenharmony_ci
99962306a36Sopenharmony_ci			/* arg3 (flags) */
100062306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 0),
100162306a36Sopenharmony_ci
100262306a36Sopenharmony_ci			/* arg4 (res) */
100362306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
100462306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
100562306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
100662306a36Sopenharmony_ci
100762306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_strtoul),
100862306a36Sopenharmony_ci
100962306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
101062306a36Sopenharmony_ci			BPF_EXIT_INSN(),
101162306a36Sopenharmony_ci		},
101262306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
101362306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
101462306a36Sopenharmony_ci		.open_flags = O_RDONLY,
101562306a36Sopenharmony_ci		.result = LOAD_REJECT,
101662306a36Sopenharmony_ci	},
101762306a36Sopenharmony_ci	{
101862306a36Sopenharmony_ci		"bpf_strtoul supported base, ok",
101962306a36Sopenharmony_ci		.insns = {
102062306a36Sopenharmony_ci			/* arg1 (buf) */
102162306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
102262306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
102362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0,
102462306a36Sopenharmony_ci				      bpf_ntohl(0x30373700)),
102562306a36Sopenharmony_ci			BPF_STX_MEM(BPF_W, BPF_REG_7, BPF_REG_0, 0),
102662306a36Sopenharmony_ci
102762306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
102862306a36Sopenharmony_ci
102962306a36Sopenharmony_ci			/* arg2 (buf_len) */
103062306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_2, 4),
103162306a36Sopenharmony_ci
103262306a36Sopenharmony_ci			/* arg3 (flags) */
103362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 8),
103462306a36Sopenharmony_ci
103562306a36Sopenharmony_ci			/* arg4 (res) */
103662306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
103762306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
103862306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_strtoul),
104162306a36Sopenharmony_ci
104262306a36Sopenharmony_ci			/* if (ret == expected && */
104362306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 3, 4),
104462306a36Sopenharmony_ci			/*     res == expected) */
104562306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
104662306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 63, 2),
104762306a36Sopenharmony_ci
104862306a36Sopenharmony_ci			/* return ALLOW; */
104962306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
105062306a36Sopenharmony_ci			BPF_JMP_A(1),
105162306a36Sopenharmony_ci
105262306a36Sopenharmony_ci			/* else return DENY; */
105362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
105462306a36Sopenharmony_ci			BPF_EXIT_INSN(),
105562306a36Sopenharmony_ci		},
105662306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
105762306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
105862306a36Sopenharmony_ci		.open_flags = O_RDONLY,
105962306a36Sopenharmony_ci		.result = SUCCESS,
106062306a36Sopenharmony_ci	},
106162306a36Sopenharmony_ci	{
106262306a36Sopenharmony_ci		"bpf_strtoul unsupported base, EINVAL",
106362306a36Sopenharmony_ci		.insns = {
106462306a36Sopenharmony_ci			/* arg1 (buf) */
106562306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
106662306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
106762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0,
106862306a36Sopenharmony_ci				      bpf_ntohl(0x36303000)),
106962306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
107062306a36Sopenharmony_ci
107162306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
107262306a36Sopenharmony_ci
107362306a36Sopenharmony_ci			/* arg2 (buf_len) */
107462306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_2, 4),
107562306a36Sopenharmony_ci
107662306a36Sopenharmony_ci			/* arg3 (flags) */
107762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 3),
107862306a36Sopenharmony_ci
107962306a36Sopenharmony_ci			/* arg4 (res) */
108062306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
108162306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
108262306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
108362306a36Sopenharmony_ci
108462306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_strtoul),
108562306a36Sopenharmony_ci
108662306a36Sopenharmony_ci			/* if (ret == expected) */
108762306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -EINVAL, 2),
108862306a36Sopenharmony_ci
108962306a36Sopenharmony_ci			/* return ALLOW; */
109062306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
109162306a36Sopenharmony_ci			BPF_JMP_A(1),
109262306a36Sopenharmony_ci
109362306a36Sopenharmony_ci			/* else return DENY; */
109462306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
109562306a36Sopenharmony_ci			BPF_EXIT_INSN(),
109662306a36Sopenharmony_ci		},
109762306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
109862306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
109962306a36Sopenharmony_ci		.open_flags = O_RDONLY,
110062306a36Sopenharmony_ci		.result = SUCCESS,
110162306a36Sopenharmony_ci	},
110262306a36Sopenharmony_ci	{
110362306a36Sopenharmony_ci		"bpf_strtoul buf with spaces only, EINVAL",
110462306a36Sopenharmony_ci		.insns = {
110562306a36Sopenharmony_ci			/* arg1 (buf) */
110662306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
110762306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
110862306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0,
110962306a36Sopenharmony_ci				      bpf_ntohl(0x0d0c0a09)),
111062306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
111162306a36Sopenharmony_ci
111262306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
111362306a36Sopenharmony_ci
111462306a36Sopenharmony_ci			/* arg2 (buf_len) */
111562306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_2, 4),
111662306a36Sopenharmony_ci
111762306a36Sopenharmony_ci			/* arg3 (flags) */
111862306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 0),
111962306a36Sopenharmony_ci
112062306a36Sopenharmony_ci			/* arg4 (res) */
112162306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
112262306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
112362306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
112462306a36Sopenharmony_ci
112562306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_strtoul),
112662306a36Sopenharmony_ci
112762306a36Sopenharmony_ci			/* if (ret == expected) */
112862306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -EINVAL, 2),
112962306a36Sopenharmony_ci
113062306a36Sopenharmony_ci			/* return ALLOW; */
113162306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
113262306a36Sopenharmony_ci			BPF_JMP_A(1),
113362306a36Sopenharmony_ci
113462306a36Sopenharmony_ci			/* else return DENY; */
113562306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
113662306a36Sopenharmony_ci			BPF_EXIT_INSN(),
113762306a36Sopenharmony_ci		},
113862306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
113962306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
114062306a36Sopenharmony_ci		.open_flags = O_RDONLY,
114162306a36Sopenharmony_ci		.result = SUCCESS,
114262306a36Sopenharmony_ci	},
114362306a36Sopenharmony_ci	{
114462306a36Sopenharmony_ci		"bpf_strtoul negative number, EINVAL",
114562306a36Sopenharmony_ci		.insns = {
114662306a36Sopenharmony_ci			/* arg1 (buf) */
114762306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
114862306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
114962306a36Sopenharmony_ci			/* " -6\0" */
115062306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0,
115162306a36Sopenharmony_ci				      bpf_ntohl(0x0a2d3600)),
115262306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
115362306a36Sopenharmony_ci
115462306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
115562306a36Sopenharmony_ci
115662306a36Sopenharmony_ci			/* arg2 (buf_len) */
115762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_2, 4),
115862306a36Sopenharmony_ci
115962306a36Sopenharmony_ci			/* arg3 (flags) */
116062306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 0),
116162306a36Sopenharmony_ci
116262306a36Sopenharmony_ci			/* arg4 (res) */
116362306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
116462306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
116562306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
116662306a36Sopenharmony_ci
116762306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_strtoul),
116862306a36Sopenharmony_ci
116962306a36Sopenharmony_ci			/* if (ret == expected) */
117062306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -EINVAL, 2),
117162306a36Sopenharmony_ci
117262306a36Sopenharmony_ci			/* return ALLOW; */
117362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
117462306a36Sopenharmony_ci			BPF_JMP_A(1),
117562306a36Sopenharmony_ci
117662306a36Sopenharmony_ci			/* else return DENY; */
117762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
117862306a36Sopenharmony_ci			BPF_EXIT_INSN(),
117962306a36Sopenharmony_ci		},
118062306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
118162306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
118262306a36Sopenharmony_ci		.open_flags = O_RDONLY,
118362306a36Sopenharmony_ci		.result = SUCCESS,
118462306a36Sopenharmony_ci	},
118562306a36Sopenharmony_ci	{
118662306a36Sopenharmony_ci		"bpf_strtol negative number, ok",
118762306a36Sopenharmony_ci		.insns = {
118862306a36Sopenharmony_ci			/* arg1 (buf) */
118962306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
119062306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
119162306a36Sopenharmony_ci			/* " -6\0" */
119262306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0,
119362306a36Sopenharmony_ci				      bpf_ntohl(0x0a2d3600)),
119462306a36Sopenharmony_ci			BPF_STX_MEM(BPF_W, BPF_REG_7, BPF_REG_0, 0),
119562306a36Sopenharmony_ci
119662306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
119762306a36Sopenharmony_ci
119862306a36Sopenharmony_ci			/* arg2 (buf_len) */
119962306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_2, 4),
120062306a36Sopenharmony_ci
120162306a36Sopenharmony_ci			/* arg3 (flags) */
120262306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 10),
120362306a36Sopenharmony_ci
120462306a36Sopenharmony_ci			/* arg4 (res) */
120562306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
120662306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
120762306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
120862306a36Sopenharmony_ci
120962306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_strtol),
121062306a36Sopenharmony_ci
121162306a36Sopenharmony_ci			/* if (ret == expected && */
121262306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 3, 4),
121362306a36Sopenharmony_ci			/*     res == expected) */
121462306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
121562306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_9, -6, 2),
121662306a36Sopenharmony_ci
121762306a36Sopenharmony_ci			/* return ALLOW; */
121862306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
121962306a36Sopenharmony_ci			BPF_JMP_A(1),
122062306a36Sopenharmony_ci
122162306a36Sopenharmony_ci			/* else return DENY; */
122262306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
122362306a36Sopenharmony_ci			BPF_EXIT_INSN(),
122462306a36Sopenharmony_ci		},
122562306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
122662306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
122762306a36Sopenharmony_ci		.open_flags = O_RDONLY,
122862306a36Sopenharmony_ci		.result = SUCCESS,
122962306a36Sopenharmony_ci	},
123062306a36Sopenharmony_ci	{
123162306a36Sopenharmony_ci		"bpf_strtol hex number, ok",
123262306a36Sopenharmony_ci		.insns = {
123362306a36Sopenharmony_ci			/* arg1 (buf) */
123462306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
123562306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
123662306a36Sopenharmony_ci			/* "0xfe" */
123762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0,
123862306a36Sopenharmony_ci				      bpf_ntohl(0x30786665)),
123962306a36Sopenharmony_ci			BPF_STX_MEM(BPF_W, BPF_REG_7, BPF_REG_0, 0),
124062306a36Sopenharmony_ci
124162306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
124262306a36Sopenharmony_ci
124362306a36Sopenharmony_ci			/* arg2 (buf_len) */
124462306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_2, 4),
124562306a36Sopenharmony_ci
124662306a36Sopenharmony_ci			/* arg3 (flags) */
124762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 0),
124862306a36Sopenharmony_ci
124962306a36Sopenharmony_ci			/* arg4 (res) */
125062306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
125162306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
125262306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
125362306a36Sopenharmony_ci
125462306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_strtol),
125562306a36Sopenharmony_ci
125662306a36Sopenharmony_ci			/* if (ret == expected && */
125762306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 4, 4),
125862306a36Sopenharmony_ci			/*     res == expected) */
125962306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
126062306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 254, 2),
126162306a36Sopenharmony_ci
126262306a36Sopenharmony_ci			/* return ALLOW; */
126362306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
126462306a36Sopenharmony_ci			BPF_JMP_A(1),
126562306a36Sopenharmony_ci
126662306a36Sopenharmony_ci			/* else return DENY; */
126762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
126862306a36Sopenharmony_ci			BPF_EXIT_INSN(),
126962306a36Sopenharmony_ci		},
127062306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
127162306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
127262306a36Sopenharmony_ci		.open_flags = O_RDONLY,
127362306a36Sopenharmony_ci		.result = SUCCESS,
127462306a36Sopenharmony_ci	},
127562306a36Sopenharmony_ci	{
127662306a36Sopenharmony_ci		"bpf_strtol max long",
127762306a36Sopenharmony_ci		.insns = {
127862306a36Sopenharmony_ci			/* arg1 (buf) 9223372036854775807 */
127962306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
128062306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -24),
128162306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_0,
128262306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x3932323333373230ULL)),
128362306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
128462306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_0,
128562306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x3336383534373735ULL)),
128662306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 8),
128762306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_0,
128862306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x3830370000000000ULL)),
128962306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 16),
129062306a36Sopenharmony_ci
129162306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
129262306a36Sopenharmony_ci
129362306a36Sopenharmony_ci			/* arg2 (buf_len) */
129462306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_2, 19),
129562306a36Sopenharmony_ci
129662306a36Sopenharmony_ci			/* arg3 (flags) */
129762306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 0),
129862306a36Sopenharmony_ci
129962306a36Sopenharmony_ci			/* arg4 (res) */
130062306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
130162306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
130262306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
130362306a36Sopenharmony_ci
130462306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_strtol),
130562306a36Sopenharmony_ci
130662306a36Sopenharmony_ci			/* if (ret == expected && */
130762306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 19, 6),
130862306a36Sopenharmony_ci			/*     res == expected) */
130962306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_8, 0x7fffffffffffffffULL),
131062306a36Sopenharmony_ci			BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0),
131162306a36Sopenharmony_ci			BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2),
131262306a36Sopenharmony_ci
131362306a36Sopenharmony_ci			/* return ALLOW; */
131462306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
131562306a36Sopenharmony_ci			BPF_JMP_A(1),
131662306a36Sopenharmony_ci
131762306a36Sopenharmony_ci			/* else return DENY; */
131862306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
131962306a36Sopenharmony_ci			BPF_EXIT_INSN(),
132062306a36Sopenharmony_ci		},
132162306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
132262306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
132362306a36Sopenharmony_ci		.open_flags = O_RDONLY,
132462306a36Sopenharmony_ci		.result = SUCCESS,
132562306a36Sopenharmony_ci	},
132662306a36Sopenharmony_ci	{
132762306a36Sopenharmony_ci		"bpf_strtol overflow, ERANGE",
132862306a36Sopenharmony_ci		.insns = {
132962306a36Sopenharmony_ci			/* arg1 (buf) 9223372036854775808 */
133062306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
133162306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -24),
133262306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_0,
133362306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x3932323333373230ULL)),
133462306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
133562306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_0,
133662306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x3336383534373735ULL)),
133762306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 8),
133862306a36Sopenharmony_ci			BPF_LD_IMM64(BPF_REG_0,
133962306a36Sopenharmony_ci				     bpf_be64_to_cpu(0x3830380000000000ULL)),
134062306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 16),
134162306a36Sopenharmony_ci
134262306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
134362306a36Sopenharmony_ci
134462306a36Sopenharmony_ci			/* arg2 (buf_len) */
134562306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_2, 19),
134662306a36Sopenharmony_ci
134762306a36Sopenharmony_ci			/* arg3 (flags) */
134862306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_3, 0),
134962306a36Sopenharmony_ci
135062306a36Sopenharmony_ci			/* arg4 (res) */
135162306a36Sopenharmony_ci			BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8),
135262306a36Sopenharmony_ci			BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
135362306a36Sopenharmony_ci			BPF_MOV64_REG(BPF_REG_4, BPF_REG_7),
135462306a36Sopenharmony_ci
135562306a36Sopenharmony_ci			BPF_EMIT_CALL(BPF_FUNC_strtol),
135662306a36Sopenharmony_ci
135762306a36Sopenharmony_ci			/* if (ret == expected) */
135862306a36Sopenharmony_ci			BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -ERANGE, 2),
135962306a36Sopenharmony_ci
136062306a36Sopenharmony_ci			/* return ALLOW; */
136162306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 1),
136262306a36Sopenharmony_ci			BPF_JMP_A(1),
136362306a36Sopenharmony_ci
136462306a36Sopenharmony_ci			/* else return DENY; */
136562306a36Sopenharmony_ci			BPF_MOV64_IMM(BPF_REG_0, 0),
136662306a36Sopenharmony_ci			BPF_EXIT_INSN(),
136762306a36Sopenharmony_ci		},
136862306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
136962306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
137062306a36Sopenharmony_ci		.open_flags = O_RDONLY,
137162306a36Sopenharmony_ci		.result = SUCCESS,
137262306a36Sopenharmony_ci	},
137362306a36Sopenharmony_ci	{
137462306a36Sopenharmony_ci		"C prog: deny all writes",
137562306a36Sopenharmony_ci		.prog_file = "./test_sysctl_prog.bpf.o",
137662306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
137762306a36Sopenharmony_ci		.sysctl = "net/ipv4/tcp_mem",
137862306a36Sopenharmony_ci		.open_flags = O_WRONLY,
137962306a36Sopenharmony_ci		.newval = "123 456 789",
138062306a36Sopenharmony_ci		.result = OP_EPERM,
138162306a36Sopenharmony_ci	},
138262306a36Sopenharmony_ci	{
138362306a36Sopenharmony_ci		"C prog: deny access by name",
138462306a36Sopenharmony_ci		.prog_file = "./test_sysctl_prog.bpf.o",
138562306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
138662306a36Sopenharmony_ci		.sysctl = "net/ipv4/route/mtu_expires",
138762306a36Sopenharmony_ci		.open_flags = O_RDONLY,
138862306a36Sopenharmony_ci		.result = OP_EPERM,
138962306a36Sopenharmony_ci	},
139062306a36Sopenharmony_ci	{
139162306a36Sopenharmony_ci		"C prog: read tcp_mem",
139262306a36Sopenharmony_ci		.prog_file = "./test_sysctl_prog.bpf.o",
139362306a36Sopenharmony_ci		.attach_type = BPF_CGROUP_SYSCTL,
139462306a36Sopenharmony_ci		.sysctl = "net/ipv4/tcp_mem",
139562306a36Sopenharmony_ci		.open_flags = O_RDONLY,
139662306a36Sopenharmony_ci		.result = SUCCESS,
139762306a36Sopenharmony_ci	},
139862306a36Sopenharmony_ci};
139962306a36Sopenharmony_ci
140062306a36Sopenharmony_cistatic size_t probe_prog_length(const struct bpf_insn *fp)
140162306a36Sopenharmony_ci{
140262306a36Sopenharmony_ci	size_t len;
140362306a36Sopenharmony_ci
140462306a36Sopenharmony_ci	for (len = MAX_INSNS - 1; len > 0; --len)
140562306a36Sopenharmony_ci		if (fp[len].code != 0 || fp[len].imm != 0)
140662306a36Sopenharmony_ci			break;
140762306a36Sopenharmony_ci	return len + 1;
140862306a36Sopenharmony_ci}
140962306a36Sopenharmony_ci
141062306a36Sopenharmony_cistatic int fixup_sysctl_value(const char *buf, size_t buf_len,
141162306a36Sopenharmony_ci			      struct bpf_insn *prog, size_t insn_num)
141262306a36Sopenharmony_ci{
141362306a36Sopenharmony_ci	union {
141462306a36Sopenharmony_ci		uint8_t raw[sizeof(uint64_t)];
141562306a36Sopenharmony_ci		uint64_t num;
141662306a36Sopenharmony_ci	} value = {};
141762306a36Sopenharmony_ci
141862306a36Sopenharmony_ci	if (buf_len > sizeof(value)) {
141962306a36Sopenharmony_ci		log_err("Value is too big (%zd) to use in fixup", buf_len);
142062306a36Sopenharmony_ci		return -1;
142162306a36Sopenharmony_ci	}
142262306a36Sopenharmony_ci	if (prog[insn_num].code != (BPF_LD | BPF_DW | BPF_IMM)) {
142362306a36Sopenharmony_ci		log_err("Can fixup only BPF_LD_IMM64 insns");
142462306a36Sopenharmony_ci		return -1;
142562306a36Sopenharmony_ci	}
142662306a36Sopenharmony_ci
142762306a36Sopenharmony_ci	memcpy(value.raw, buf, buf_len);
142862306a36Sopenharmony_ci	prog[insn_num].imm = (uint32_t)value.num;
142962306a36Sopenharmony_ci	prog[insn_num + 1].imm = (uint32_t)(value.num >> 32);
143062306a36Sopenharmony_ci
143162306a36Sopenharmony_ci	return 0;
143262306a36Sopenharmony_ci}
143362306a36Sopenharmony_ci
143462306a36Sopenharmony_cistatic int load_sysctl_prog_insns(struct sysctl_test *test,
143562306a36Sopenharmony_ci				  const char *sysctl_path)
143662306a36Sopenharmony_ci{
143762306a36Sopenharmony_ci	struct bpf_insn *prog = test->insns;
143862306a36Sopenharmony_ci	LIBBPF_OPTS(bpf_prog_load_opts, opts);
143962306a36Sopenharmony_ci	int ret, insn_cnt;
144062306a36Sopenharmony_ci
144162306a36Sopenharmony_ci	insn_cnt = probe_prog_length(prog);
144262306a36Sopenharmony_ci
144362306a36Sopenharmony_ci	if (test->fixup_value_insn) {
144462306a36Sopenharmony_ci		char buf[128];
144562306a36Sopenharmony_ci		ssize_t len;
144662306a36Sopenharmony_ci		int fd;
144762306a36Sopenharmony_ci
144862306a36Sopenharmony_ci		fd = open(sysctl_path, O_RDONLY | O_CLOEXEC);
144962306a36Sopenharmony_ci		if (fd < 0) {
145062306a36Sopenharmony_ci			log_err("open(%s) failed", sysctl_path);
145162306a36Sopenharmony_ci			return -1;
145262306a36Sopenharmony_ci		}
145362306a36Sopenharmony_ci		len = read(fd, buf, sizeof(buf));
145462306a36Sopenharmony_ci		if (len == -1) {
145562306a36Sopenharmony_ci			log_err("read(%s) failed", sysctl_path);
145662306a36Sopenharmony_ci			close(fd);
145762306a36Sopenharmony_ci			return -1;
145862306a36Sopenharmony_ci		}
145962306a36Sopenharmony_ci		close(fd);
146062306a36Sopenharmony_ci		if (fixup_sysctl_value(buf, len, prog, test->fixup_value_insn))
146162306a36Sopenharmony_ci			return -1;
146262306a36Sopenharmony_ci	}
146362306a36Sopenharmony_ci
146462306a36Sopenharmony_ci	opts.log_buf = bpf_log_buf;
146562306a36Sopenharmony_ci	opts.log_size = BPF_LOG_BUF_SIZE;
146662306a36Sopenharmony_ci
146762306a36Sopenharmony_ci	ret = bpf_prog_load(BPF_PROG_TYPE_CGROUP_SYSCTL, NULL, "GPL", prog, insn_cnt, &opts);
146862306a36Sopenharmony_ci	if (ret < 0 && test->result != LOAD_REJECT) {
146962306a36Sopenharmony_ci		log_err(">>> Loading program error.\n"
147062306a36Sopenharmony_ci			">>> Verifier output:\n%s\n-------\n", bpf_log_buf);
147162306a36Sopenharmony_ci	}
147262306a36Sopenharmony_ci
147362306a36Sopenharmony_ci	return ret;
147462306a36Sopenharmony_ci}
147562306a36Sopenharmony_ci
147662306a36Sopenharmony_cistatic int load_sysctl_prog_file(struct sysctl_test *test)
147762306a36Sopenharmony_ci{
147862306a36Sopenharmony_ci	struct bpf_object *obj;
147962306a36Sopenharmony_ci	int prog_fd;
148062306a36Sopenharmony_ci
148162306a36Sopenharmony_ci	if (bpf_prog_test_load(test->prog_file, BPF_PROG_TYPE_CGROUP_SYSCTL, &obj, &prog_fd)) {
148262306a36Sopenharmony_ci		if (test->result != LOAD_REJECT)
148362306a36Sopenharmony_ci			log_err(">>> Loading program (%s) error.\n",
148462306a36Sopenharmony_ci				test->prog_file);
148562306a36Sopenharmony_ci		return -1;
148662306a36Sopenharmony_ci	}
148762306a36Sopenharmony_ci
148862306a36Sopenharmony_ci	return prog_fd;
148962306a36Sopenharmony_ci}
149062306a36Sopenharmony_ci
149162306a36Sopenharmony_cistatic int load_sysctl_prog(struct sysctl_test *test, const char *sysctl_path)
149262306a36Sopenharmony_ci{
149362306a36Sopenharmony_ci		return test->prog_file
149462306a36Sopenharmony_ci			? load_sysctl_prog_file(test)
149562306a36Sopenharmony_ci			: load_sysctl_prog_insns(test, sysctl_path);
149662306a36Sopenharmony_ci}
149762306a36Sopenharmony_ci
149862306a36Sopenharmony_cistatic int access_sysctl(const char *sysctl_path,
149962306a36Sopenharmony_ci			 const struct sysctl_test *test)
150062306a36Sopenharmony_ci{
150162306a36Sopenharmony_ci	int err = 0;
150262306a36Sopenharmony_ci	int fd;
150362306a36Sopenharmony_ci
150462306a36Sopenharmony_ci	fd = open(sysctl_path, test->open_flags | O_CLOEXEC);
150562306a36Sopenharmony_ci	if (fd < 0)
150662306a36Sopenharmony_ci		return fd;
150762306a36Sopenharmony_ci
150862306a36Sopenharmony_ci	if (test->seek && lseek(fd, test->seek, SEEK_SET) == -1) {
150962306a36Sopenharmony_ci		log_err("lseek(%d) failed", test->seek);
151062306a36Sopenharmony_ci		goto err;
151162306a36Sopenharmony_ci	}
151262306a36Sopenharmony_ci
151362306a36Sopenharmony_ci	if (test->open_flags == O_RDONLY) {
151462306a36Sopenharmony_ci		char buf[128];
151562306a36Sopenharmony_ci
151662306a36Sopenharmony_ci		if (read(fd, buf, sizeof(buf)) == -1)
151762306a36Sopenharmony_ci			goto err;
151862306a36Sopenharmony_ci		if (test->oldval &&
151962306a36Sopenharmony_ci		    strncmp(buf, test->oldval, strlen(test->oldval))) {
152062306a36Sopenharmony_ci			log_err("Read value %s != %s", buf, test->oldval);
152162306a36Sopenharmony_ci			goto err;
152262306a36Sopenharmony_ci		}
152362306a36Sopenharmony_ci	} else if (test->open_flags == O_WRONLY) {
152462306a36Sopenharmony_ci		if (!test->newval) {
152562306a36Sopenharmony_ci			log_err("New value for sysctl is not set");
152662306a36Sopenharmony_ci			goto err;
152762306a36Sopenharmony_ci		}
152862306a36Sopenharmony_ci		if (write(fd, test->newval, strlen(test->newval)) == -1)
152962306a36Sopenharmony_ci			goto err;
153062306a36Sopenharmony_ci	} else {
153162306a36Sopenharmony_ci		log_err("Unexpected sysctl access: neither read nor write");
153262306a36Sopenharmony_ci		goto err;
153362306a36Sopenharmony_ci	}
153462306a36Sopenharmony_ci
153562306a36Sopenharmony_ci	goto out;
153662306a36Sopenharmony_cierr:
153762306a36Sopenharmony_ci	err = -1;
153862306a36Sopenharmony_ciout:
153962306a36Sopenharmony_ci	close(fd);
154062306a36Sopenharmony_ci	return err;
154162306a36Sopenharmony_ci}
154262306a36Sopenharmony_ci
154362306a36Sopenharmony_cistatic int run_test_case(int cgfd, struct sysctl_test *test)
154462306a36Sopenharmony_ci{
154562306a36Sopenharmony_ci	enum bpf_attach_type atype = test->attach_type;
154662306a36Sopenharmony_ci	char sysctl_path[128];
154762306a36Sopenharmony_ci	int progfd = -1;
154862306a36Sopenharmony_ci	int err = 0;
154962306a36Sopenharmony_ci
155062306a36Sopenharmony_ci	printf("Test case: %s .. ", test->descr);
155162306a36Sopenharmony_ci
155262306a36Sopenharmony_ci	snprintf(sysctl_path, sizeof(sysctl_path), "/proc/sys/%s",
155362306a36Sopenharmony_ci		 test->sysctl);
155462306a36Sopenharmony_ci
155562306a36Sopenharmony_ci	progfd = load_sysctl_prog(test, sysctl_path);
155662306a36Sopenharmony_ci	if (progfd < 0) {
155762306a36Sopenharmony_ci		if (test->result == LOAD_REJECT)
155862306a36Sopenharmony_ci			goto out;
155962306a36Sopenharmony_ci		else
156062306a36Sopenharmony_ci			goto err;
156162306a36Sopenharmony_ci	}
156262306a36Sopenharmony_ci
156362306a36Sopenharmony_ci	if (bpf_prog_attach(progfd, cgfd, atype, BPF_F_ALLOW_OVERRIDE) < 0) {
156462306a36Sopenharmony_ci		if (test->result == ATTACH_REJECT)
156562306a36Sopenharmony_ci			goto out;
156662306a36Sopenharmony_ci		else
156762306a36Sopenharmony_ci			goto err;
156862306a36Sopenharmony_ci	}
156962306a36Sopenharmony_ci
157062306a36Sopenharmony_ci	errno = 0;
157162306a36Sopenharmony_ci	if (access_sysctl(sysctl_path, test) == -1) {
157262306a36Sopenharmony_ci		if (test->result == OP_EPERM && errno == EPERM)
157362306a36Sopenharmony_ci			goto out;
157462306a36Sopenharmony_ci		else
157562306a36Sopenharmony_ci			goto err;
157662306a36Sopenharmony_ci	}
157762306a36Sopenharmony_ci
157862306a36Sopenharmony_ci	if (test->result != SUCCESS) {
157962306a36Sopenharmony_ci		log_err("Unexpected success");
158062306a36Sopenharmony_ci		goto err;
158162306a36Sopenharmony_ci	}
158262306a36Sopenharmony_ci
158362306a36Sopenharmony_ci	goto out;
158462306a36Sopenharmony_cierr:
158562306a36Sopenharmony_ci	err = -1;
158662306a36Sopenharmony_ciout:
158762306a36Sopenharmony_ci	/* Detaching w/o checking return code: best effort attempt. */
158862306a36Sopenharmony_ci	if (progfd != -1)
158962306a36Sopenharmony_ci		bpf_prog_detach(cgfd, atype);
159062306a36Sopenharmony_ci	close(progfd);
159162306a36Sopenharmony_ci	printf("[%s]\n", err ? "FAIL" : "PASS");
159262306a36Sopenharmony_ci	return err;
159362306a36Sopenharmony_ci}
159462306a36Sopenharmony_ci
159562306a36Sopenharmony_cistatic int run_tests(int cgfd)
159662306a36Sopenharmony_ci{
159762306a36Sopenharmony_ci	int passes = 0;
159862306a36Sopenharmony_ci	int fails = 0;
159962306a36Sopenharmony_ci	int i;
160062306a36Sopenharmony_ci
160162306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(tests); ++i) {
160262306a36Sopenharmony_ci		if (run_test_case(cgfd, &tests[i]))
160362306a36Sopenharmony_ci			++fails;
160462306a36Sopenharmony_ci		else
160562306a36Sopenharmony_ci			++passes;
160662306a36Sopenharmony_ci	}
160762306a36Sopenharmony_ci	printf("Summary: %d PASSED, %d FAILED\n", passes, fails);
160862306a36Sopenharmony_ci	return fails ? -1 : 0;
160962306a36Sopenharmony_ci}
161062306a36Sopenharmony_ci
161162306a36Sopenharmony_ciint main(int argc, char **argv)
161262306a36Sopenharmony_ci{
161362306a36Sopenharmony_ci	int cgfd = -1;
161462306a36Sopenharmony_ci	int err = 0;
161562306a36Sopenharmony_ci
161662306a36Sopenharmony_ci	cgfd = cgroup_setup_and_join(CG_PATH);
161762306a36Sopenharmony_ci	if (cgfd < 0)
161862306a36Sopenharmony_ci		goto err;
161962306a36Sopenharmony_ci
162062306a36Sopenharmony_ci	/* Use libbpf 1.0 API mode */
162162306a36Sopenharmony_ci	libbpf_set_strict_mode(LIBBPF_STRICT_ALL);
162262306a36Sopenharmony_ci
162362306a36Sopenharmony_ci	if (run_tests(cgfd))
162462306a36Sopenharmony_ci		goto err;
162562306a36Sopenharmony_ci
162662306a36Sopenharmony_ci	goto out;
162762306a36Sopenharmony_cierr:
162862306a36Sopenharmony_ci	err = -1;
162962306a36Sopenharmony_ciout:
163062306a36Sopenharmony_ci	close(cgfd);
163162306a36Sopenharmony_ci	cleanup_cgroup_environment();
163262306a36Sopenharmony_ci	return err;
163362306a36Sopenharmony_ci}
1634