1 /*
2 * Copyright (c) 2015 PLUMgrid, Inc.
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 #include "bcc_common.h"
17 #include "bpf_module.h"
18
19 extern "C" {
bpf_module_create_c(const char * filename,unsigned flags,const char * cflags[],int ncflags,bool allow_rlimit,const char * dev_name)20 void * bpf_module_create_c(const char *filename, unsigned flags, const char *cflags[],
21 int ncflags, bool allow_rlimit, const char *dev_name) {
22 auto mod = new ebpf::BPFModule(flags, nullptr, true, "", allow_rlimit, dev_name);
23 if (mod->load_c(filename, cflags, ncflags) != 0) {
24 delete mod;
25 return nullptr;
26 }
27 return mod;
28 }
29
bpf_module_create_c_from_string(const char * text,unsigned flags,const char * cflags[],int ncflags,bool allow_rlimit,const char * dev_name)30 void * bpf_module_create_c_from_string(const char *text, unsigned flags, const char *cflags[],
31 int ncflags, bool allow_rlimit, const char *dev_name) {
32 auto mod = new ebpf::BPFModule(flags, nullptr, true, "", allow_rlimit, dev_name);
33 if (mod->load_string(text, cflags, ncflags) != 0) {
34 delete mod;
35 return nullptr;
36 }
37 return mod;
38 }
39
bpf_module_rw_engine_enabled()40 bool bpf_module_rw_engine_enabled() {
41 return ebpf::bpf_module_rw_engine_enabled();
42 }
43
bpf_module_destroy(void * program)44 void bpf_module_destroy(void *program) {
45 auto mod = static_cast<ebpf::BPFModule *>(program);
46 if (!mod) return;
47 delete mod;
48 }
49
bpf_num_functions(void * program)50 size_t bpf_num_functions(void *program) {
51 auto mod = static_cast<ebpf::BPFModule *>(program);
52 if (!mod) return 0;
53 return mod->num_functions();
54 }
55
bpf_function_name(void * program,size_t id)56 const char * bpf_function_name(void *program, size_t id) {
57 auto mod = static_cast<ebpf::BPFModule *>(program);
58 if (!mod) return nullptr;
59 return mod->function_name(id);
60 }
61
bpf_function_start(void * program,const char * name)62 void * bpf_function_start(void *program, const char *name) {
63 auto mod = static_cast<ebpf::BPFModule *>(program);
64 if (!mod) return nullptr;
65 return mod->function_start(name);
66 }
67
bpf_function_start_id(void * program,size_t id)68 void * bpf_function_start_id(void *program, size_t id) {
69 auto mod = static_cast<ebpf::BPFModule *>(program);
70 if (!mod) return nullptr;
71 return mod->function_start(id);
72 }
73
bpf_function_size(void * program,const char * name)74 size_t bpf_function_size(void *program, const char *name) {
75 auto mod = static_cast<ebpf::BPFModule *>(program);
76 if (!mod) return 0;
77 return mod->function_size(name);
78 }
79
bpf_function_size_id(void * program,size_t id)80 size_t bpf_function_size_id(void *program, size_t id) {
81 auto mod = static_cast<ebpf::BPFModule *>(program);
82 if (!mod) return 0;
83 return mod->function_size(id);
84 }
85
bpf_module_license(void * program)86 char * bpf_module_license(void *program) {
87 auto mod = static_cast<ebpf::BPFModule *>(program);
88 if (!mod) return nullptr;
89 return mod->license();
90 }
91
bpf_module_kern_version(void * program)92 unsigned bpf_module_kern_version(void *program) {
93 auto mod = static_cast<ebpf::BPFModule *>(program);
94 if (!mod) return 0;
95 return mod->kern_version();
96 }
97
bpf_num_tables(void * program)98 size_t bpf_num_tables(void *program) {
99 auto mod = static_cast<ebpf::BPFModule *>(program);
100 if (!mod) return -1;
101 return mod->num_tables();
102 }
103
bpf_table_id(void * program,const char * table_name)104 size_t bpf_table_id(void *program, const char *table_name) {
105 auto mod = static_cast<ebpf::BPFModule *>(program);
106 if (!mod) return ~0ull;
107 return mod->table_id(table_name);
108 }
109
bpf_table_fd(void * program,const char * table_name)110 int bpf_table_fd(void *program, const char *table_name) {
111 auto mod = static_cast<ebpf::BPFModule *>(program);
112 if (!mod) return -1;
113 return mod->table_fd(table_name);
114 }
115
bpf_table_fd_id(void * program,size_t id)116 int bpf_table_fd_id(void *program, size_t id) {
117 auto mod = static_cast<ebpf::BPFModule *>(program);
118 if (!mod) return -1;
119 return mod->table_fd(id);
120 }
121
bpf_table_type(void * program,const char * table_name)122 int bpf_table_type(void *program, const char *table_name) {
123 auto mod = static_cast<ebpf::BPFModule *>(program);
124 if (!mod) return -1;
125 return mod->table_type(table_name);
126 }
127
bpf_table_type_id(void * program,size_t id)128 int bpf_table_type_id(void *program, size_t id) {
129 auto mod = static_cast<ebpf::BPFModule *>(program);
130 if (!mod) return -1;
131 return mod->table_type(id);
132 }
133
bpf_table_max_entries(void * program,const char * table_name)134 size_t bpf_table_max_entries(void *program, const char *table_name) {
135 auto mod = static_cast<ebpf::BPFModule *>(program);
136 if (!mod) return 0;
137 return mod->table_max_entries(table_name);
138 }
139
bpf_table_max_entries_id(void * program,size_t id)140 size_t bpf_table_max_entries_id(void *program, size_t id) {
141 auto mod = static_cast<ebpf::BPFModule *>(program);
142 if (!mod) return 0;
143 return mod->table_max_entries(id);
144 }
145
bpf_table_flags(void * program,const char * table_name)146 int bpf_table_flags(void *program, const char *table_name) {
147 auto mod = static_cast<ebpf::BPFModule *>(program);
148 if (!mod) return -1;
149 return mod->table_flags(table_name);
150 }
151
bpf_table_flags_id(void * program,size_t id)152 int bpf_table_flags_id(void *program, size_t id) {
153 auto mod = static_cast<ebpf::BPFModule *>(program);
154 if (!mod) return -1;
155 return mod->table_flags(id);
156 }
157
bpf_table_name(void * program,size_t id)158 const char * bpf_table_name(void *program, size_t id) {
159 auto mod = static_cast<ebpf::BPFModule *>(program);
160 if (!mod) return nullptr;
161 return mod->table_name(id);
162 }
163
bpf_table_key_desc(void * program,const char * table_name)164 const char * bpf_table_key_desc(void *program, const char *table_name) {
165 auto mod = static_cast<ebpf::BPFModule *>(program);
166 if (!mod) return nullptr;
167 return mod->table_key_desc(table_name);
168 }
169
bpf_table_key_desc_id(void * program,size_t id)170 const char * bpf_table_key_desc_id(void *program, size_t id) {
171 auto mod = static_cast<ebpf::BPFModule *>(program);
172 if (!mod) return nullptr;
173 return mod->table_key_desc(id);
174 }
175
bpf_table_leaf_desc(void * program,const char * table_name)176 const char * bpf_table_leaf_desc(void *program, const char *table_name) {
177 auto mod = static_cast<ebpf::BPFModule *>(program);
178 if (!mod) return nullptr;
179 return mod->table_leaf_desc(table_name);
180 }
181
bpf_table_leaf_desc_id(void * program,size_t id)182 const char * bpf_table_leaf_desc_id(void *program, size_t id) {
183 auto mod = static_cast<ebpf::BPFModule *>(program);
184 if (!mod) return nullptr;
185 return mod->table_leaf_desc(id);
186 }
187
bpf_table_key_size(void * program,const char * table_name)188 size_t bpf_table_key_size(void *program, const char *table_name) {
189 auto mod = static_cast<ebpf::BPFModule *>(program);
190 if (!mod) return 0;
191 return mod->table_key_size(table_name);
192 }
193
bpf_table_key_size_id(void * program,size_t id)194 size_t bpf_table_key_size_id(void *program, size_t id) {
195 auto mod = static_cast<ebpf::BPFModule *>(program);
196 if (!mod) return 0;
197 return mod->table_key_size(id);
198 }
199
bpf_table_leaf_size(void * program,const char * table_name)200 size_t bpf_table_leaf_size(void *program, const char *table_name) {
201 auto mod = static_cast<ebpf::BPFModule *>(program);
202 if (!mod) return 0;
203 return mod->table_leaf_size(table_name);
204 }
205
bpf_table_leaf_size_id(void * program,size_t id)206 size_t bpf_table_leaf_size_id(void *program, size_t id) {
207 auto mod = static_cast<ebpf::BPFModule *>(program);
208 if (!mod) return 0;
209 return mod->table_leaf_size(id);
210 }
211
bpf_table_key_snprintf(void * program,size_t id,char * buf,size_t buflen,const void * key)212 int bpf_table_key_snprintf(void *program, size_t id, char *buf, size_t buflen, const void *key) {
213 auto mod = static_cast<ebpf::BPFModule *>(program);
214 if (!mod) return -1;
215 return mod->table_key_printf(id, buf, buflen, key);
216 }
bpf_table_leaf_snprintf(void * program,size_t id,char * buf,size_t buflen,const void * leaf)217 int bpf_table_leaf_snprintf(void *program, size_t id, char *buf, size_t buflen, const void *leaf) {
218 auto mod = static_cast<ebpf::BPFModule *>(program);
219 if (!mod) return -1;
220 return mod->table_leaf_printf(id, buf, buflen, leaf);
221 }
222
bpf_table_key_sscanf(void * program,size_t id,const char * buf,void * key)223 int bpf_table_key_sscanf(void *program, size_t id, const char *buf, void *key) {
224 auto mod = static_cast<ebpf::BPFModule *>(program);
225 if (!mod) return -1;
226 return mod->table_key_scanf(id, buf, key);
227 }
228
bpf_table_leaf_sscanf(void * program,size_t id,const char * buf,void * leaf)229 int bpf_table_leaf_sscanf(void *program, size_t id, const char *buf, void *leaf) {
230 auto mod = static_cast<ebpf::BPFModule *>(program);
231 if (!mod) return -1;
232 return mod->table_leaf_scanf(id, buf, leaf);
233 }
234
bcc_func_load(void * program,int prog_type,const char * name,const struct bpf_insn * insns,int prog_len,const char * license,unsigned kern_version,int log_level,char * log_buf,unsigned log_buf_size,const char * dev_name,int attach_type)235 int bcc_func_load(void *program, int prog_type, const char *name,
236 const struct bpf_insn *insns, int prog_len,
237 const char *license, unsigned kern_version,
238 int log_level, char *log_buf, unsigned log_buf_size,
239 const char *dev_name, int attach_type) {
240 auto mod = static_cast<ebpf::BPFModule *>(program);
241 if (!mod) return -1;
242 return mod->bcc_func_load(prog_type, name, insns, prog_len,
243 license, kern_version, log_level,
244 log_buf, log_buf_size, dev_name, 0, attach_type);
245
246 }
247
bpf_perf_event_fields(void * program,const char * event)248 size_t bpf_perf_event_fields(void *program, const char *event) {
249 auto mod = static_cast<ebpf::BPFModule *>(program);
250 if (!mod)
251 return 0;
252 return mod->perf_event_fields(event);
253 }
254
bpf_perf_event_field(void * program,const char * event,size_t i)255 const char * bpf_perf_event_field(void *program, const char *event, size_t i) {
256 auto mod = static_cast<ebpf::BPFModule *>(program);
257 if (!mod)
258 return nullptr;
259 return mod->perf_event_field(event, i);
260 }
261
262 }
263