1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 /* This file is separate because it's included both by eBPF programs (via include
20  * in bpf_helpers.h) and directly by the boot time bpfloader (Loader.cpp).
21  */
22 
23 #include <linux/bpf.h>
24 
25 // Pull in AID_* constants from //system/core/libcutils/include/private/android_filesystem_config.h
26 #include <private/android_filesystem_config.h>
27 
28 /*
29  * Map structure to be used by Android eBPF C programs. The Android eBPF loader
30  * uses this structure from eBPF object to create maps at boot time.
31  *
32  * The eBPF C program should define structure in the maps section using
33  * SEC("maps") otherwise it will be ignored by the eBPF loader.
34  *
35  * For example:
36  *   const struct bpf_map_def SEC("maps") mymap { .type=... , .key_size=... }
37  *
38  * See 'bpf_helpers.h' for helpful macros for eBPF program use.
39  */
40 struct bpf_map_def {
41     enum bpf_map_type type;
42     unsigned int key_size;
43     unsigned int value_size;
44     unsigned int max_entries;
45     unsigned int map_flags;
46 
47     // The following are not supported by the Android bpfloader:
48     //   unsigned int inner_map_idx;
49     //   unsigned int numa_node;
50 
51     unsigned int uid;   // uid_t
52     unsigned int gid;   // gid_t
53     unsigned int mode;  // mode_t
54 };
55 
56 struct bpf_prog_def {
57     unsigned int uid;
58     unsigned int gid;
59 
60     unsigned int min_kver;  // KERNEL_MAJOR * 65536 + KERNEL_MINOR * 256 + KERNEL_SUB
61     unsigned int max_kver;  // ie. 0x40900 for Linux 4.9 - but beware of hexadecimal for >= 10
62 
63     bool optional;  // program section (ie. function) may fail to load, continue onto next func.
64 };
65