diff options
| author | Alexei Starovoitov <ast@plumgrid.com> | 2014-09-26 03:17:00 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2014-09-26 15:05:14 -0400 |
| commit | 09756af46893c18839062976c3252e93a1beeba7 (patch) | |
| tree | 203642a5473496ecb6ff10cd22dba39b22ed5f0a /include/uapi/linux | |
| parent | db20fd2b01087bdfbe30bce314a198eefedcc42e (diff) | |
bpf: expand BPF syscall with program load/unload
eBPF programs are similar to kernel modules. They are loaded by the user
process and automatically unloaded when process exits. Each eBPF program is
a safe run-to-completion set of instructions. eBPF verifier statically
determines that the program terminates and is safe to execute.
The following syscall wrapper can be used to load the program:
int bpf_prog_load(enum bpf_prog_type prog_type,
const struct bpf_insn *insns, int insn_cnt,
const char *license)
{
union bpf_attr attr = {
.prog_type = prog_type,
.insns = ptr_to_u64(insns),
.insn_cnt = insn_cnt,
.license = ptr_to_u64(license),
};
return bpf(BPF_PROG_LOAD, &attr, sizeof(attr));
}
where 'insns' is an array of eBPF instructions and 'license' is a string
that must be GPL compatible to call helper functions marked gpl_only
Upon succesful load the syscall returns prog_fd.
Use close(prog_fd) to unload the program.
User space tests and examples follow in the later patches
Signed-off-by: Alexei Starovoitov <ast@plumgrid.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/uapi/linux')
| -rw-r--r-- | include/uapi/linux/bpf.h | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 395cabd2ca0a..424f442016e7 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h | |||
| @@ -99,12 +99,23 @@ enum bpf_cmd { | |||
| 99 | * returns zero and stores next key or negative error | 99 | * returns zero and stores next key or negative error |
| 100 | */ | 100 | */ |
| 101 | BPF_MAP_GET_NEXT_KEY, | 101 | BPF_MAP_GET_NEXT_KEY, |
| 102 | |||
| 103 | /* verify and load eBPF program | ||
| 104 | * prog_fd = bpf(BPF_PROG_LOAD, union bpf_attr *attr, u32 size) | ||
| 105 | * Using attr->prog_type, attr->insns, attr->license | ||
| 106 | * returns fd or negative error | ||
| 107 | */ | ||
| 108 | BPF_PROG_LOAD, | ||
| 102 | }; | 109 | }; |
| 103 | 110 | ||
| 104 | enum bpf_map_type { | 111 | enum bpf_map_type { |
| 105 | BPF_MAP_TYPE_UNSPEC, | 112 | BPF_MAP_TYPE_UNSPEC, |
| 106 | }; | 113 | }; |
| 107 | 114 | ||
| 115 | enum bpf_prog_type { | ||
| 116 | BPF_PROG_TYPE_UNSPEC, | ||
| 117 | }; | ||
| 118 | |||
| 108 | union bpf_attr { | 119 | union bpf_attr { |
| 109 | struct { /* anonymous struct used by BPF_MAP_CREATE command */ | 120 | struct { /* anonymous struct used by BPF_MAP_CREATE command */ |
| 110 | __u32 map_type; /* one of enum bpf_map_type */ | 121 | __u32 map_type; /* one of enum bpf_map_type */ |
| @@ -121,6 +132,21 @@ union bpf_attr { | |||
| 121 | __aligned_u64 next_key; | 132 | __aligned_u64 next_key; |
| 122 | }; | 133 | }; |
| 123 | }; | 134 | }; |
| 135 | |||
| 136 | struct { /* anonymous struct used by BPF_PROG_LOAD command */ | ||
| 137 | __u32 prog_type; /* one of enum bpf_prog_type */ | ||
| 138 | __u32 insn_cnt; | ||
| 139 | __aligned_u64 insns; | ||
| 140 | __aligned_u64 license; | ||
| 141 | }; | ||
| 124 | } __attribute__((aligned(8))); | 142 | } __attribute__((aligned(8))); |
| 125 | 143 | ||
| 144 | /* integer value in 'imm' field of BPF_CALL instruction selects which helper | ||
| 145 | * function eBPF program intends to call | ||
| 146 | */ | ||
| 147 | enum bpf_func_id { | ||
| 148 | BPF_FUNC_unspec, | ||
| 149 | __BPF_FUNC_MAX_ID, | ||
| 150 | }; | ||
| 151 | |||
| 126 | #endif /* _UAPI__LINUX_BPF_H__ */ | 152 | #endif /* _UAPI__LINUX_BPF_H__ */ |
