aboutsummaryrefslogtreecommitdiffstats
path: root/include/uapi/linux
diff options
context:
space:
mode:
authorAlexei Starovoitov <ast@plumgrid.com>2014-09-26 03:17:00 -0400
committerDavid S. Miller <davem@davemloft.net>2014-09-26 15:05:14 -0400
commit09756af46893c18839062976c3252e93a1beeba7 (patch)
tree203642a5473496ecb6ff10cd22dba39b22ed5f0a /include/uapi/linux
parentdb20fd2b01087bdfbe30bce314a198eefedcc42e (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.h26
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
104enum bpf_map_type { 111enum bpf_map_type {
105 BPF_MAP_TYPE_UNSPEC, 112 BPF_MAP_TYPE_UNSPEC,
106}; 113};
107 114
115enum bpf_prog_type {
116 BPF_PROG_TYPE_UNSPEC,
117};
118
108union bpf_attr { 119union 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 */
147enum 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__ */