1*387f9dfdSAndroid Build Coastguard Worker /* 2*387f9dfdSAndroid Build Coastguard Worker * Copyright (c) 2015 PLUMgrid, Inc. 3*387f9dfdSAndroid Build Coastguard Worker * 4*387f9dfdSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*387f9dfdSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*387f9dfdSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*387f9dfdSAndroid Build Coastguard Worker * 8*387f9dfdSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*387f9dfdSAndroid Build Coastguard Worker * 10*387f9dfdSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*387f9dfdSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*387f9dfdSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*387f9dfdSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*387f9dfdSAndroid Build Coastguard Worker * limitations under the License. 15*387f9dfdSAndroid Build Coastguard Worker */ 16*387f9dfdSAndroid Build Coastguard Worker /* eBPF mini library */ 17*387f9dfdSAndroid Build Coastguard Worker 18*387f9dfdSAndroid Build Coastguard Worker #ifndef LIBBPF_H 19*387f9dfdSAndroid Build Coastguard Worker #define LIBBPF_H 20*387f9dfdSAndroid Build Coastguard Worker 21*387f9dfdSAndroid Build Coastguard Worker #include "linux/bpf.h" 22*387f9dfdSAndroid Build Coastguard Worker #include <stdbool.h> 23*387f9dfdSAndroid Build Coastguard Worker #include <stdint.h> 24*387f9dfdSAndroid Build Coastguard Worker #include <sys/types.h> 25*387f9dfdSAndroid Build Coastguard Worker 26*387f9dfdSAndroid Build Coastguard Worker #ifdef __cplusplus 27*387f9dfdSAndroid Build Coastguard Worker extern "C" { 28*387f9dfdSAndroid Build Coastguard Worker #endif 29*387f9dfdSAndroid Build Coastguard Worker 30*387f9dfdSAndroid Build Coastguard Worker struct bcc_create_map_attr { 31*387f9dfdSAndroid Build Coastguard Worker const char *name; 32*387f9dfdSAndroid Build Coastguard Worker enum bpf_map_type map_type; 33*387f9dfdSAndroid Build Coastguard Worker __u32 map_flags; 34*387f9dfdSAndroid Build Coastguard Worker __u32 key_size; 35*387f9dfdSAndroid Build Coastguard Worker __u32 value_size; 36*387f9dfdSAndroid Build Coastguard Worker __u32 max_entries; 37*387f9dfdSAndroid Build Coastguard Worker __u32 numa_node; 38*387f9dfdSAndroid Build Coastguard Worker __u32 btf_fd; 39*387f9dfdSAndroid Build Coastguard Worker __u32 btf_key_type_id; 40*387f9dfdSAndroid Build Coastguard Worker __u32 btf_value_type_id; 41*387f9dfdSAndroid Build Coastguard Worker __u32 map_ifindex; 42*387f9dfdSAndroid Build Coastguard Worker union { 43*387f9dfdSAndroid Build Coastguard Worker __u32 inner_map_fd; 44*387f9dfdSAndroid Build Coastguard Worker __u32 btf_vmlinux_value_type_id; 45*387f9dfdSAndroid Build Coastguard Worker }; 46*387f9dfdSAndroid Build Coastguard Worker }; 47*387f9dfdSAndroid Build Coastguard Worker 48*387f9dfdSAndroid Build Coastguard Worker struct bpf_prog_load_opts; 49*387f9dfdSAndroid Build Coastguard Worker 50*387f9dfdSAndroid Build Coastguard Worker enum bpf_probe_attach_type { 51*387f9dfdSAndroid Build Coastguard Worker BPF_PROBE_ENTRY, 52*387f9dfdSAndroid Build Coastguard Worker BPF_PROBE_RETURN 53*387f9dfdSAndroid Build Coastguard Worker }; 54*387f9dfdSAndroid Build Coastguard Worker 55*387f9dfdSAndroid Build Coastguard Worker struct bcc_perf_buffer_opts { 56*387f9dfdSAndroid Build Coastguard Worker int pid; 57*387f9dfdSAndroid Build Coastguard Worker int cpu; 58*387f9dfdSAndroid Build Coastguard Worker int wakeup_events; 59*387f9dfdSAndroid Build Coastguard Worker }; 60*387f9dfdSAndroid Build Coastguard Worker 61*387f9dfdSAndroid Build Coastguard Worker int bcc_create_map(enum bpf_map_type map_type, const char *name, 62*387f9dfdSAndroid Build Coastguard Worker int key_size, int value_size, int max_entries, 63*387f9dfdSAndroid Build Coastguard Worker int map_flags); 64*387f9dfdSAndroid Build Coastguard Worker int bcc_create_map_xattr(struct bcc_create_map_attr *attr, bool allow_rlimit); 65*387f9dfdSAndroid Build Coastguard Worker int bpf_update_elem(int fd, void *key, void *value, unsigned long long flags); 66*387f9dfdSAndroid Build Coastguard Worker int bpf_lookup_elem(int fd, void *key, void *value); 67*387f9dfdSAndroid Build Coastguard Worker int bpf_delete_elem(int fd, void *key); 68*387f9dfdSAndroid Build Coastguard Worker int bpf_get_first_key(int fd, void *key, size_t key_size); 69*387f9dfdSAndroid Build Coastguard Worker int bpf_get_next_key(int fd, void *key, void *next_key); 70*387f9dfdSAndroid Build Coastguard Worker int bpf_lookup_and_delete(int fd, void *key, void *value); 71*387f9dfdSAndroid Build Coastguard Worker 72*387f9dfdSAndroid Build Coastguard Worker /* 73*387f9dfdSAndroid Build Coastguard Worker * Load a BPF program, and return the FD of the loaded program. 74*387f9dfdSAndroid Build Coastguard Worker * 75*387f9dfdSAndroid Build Coastguard Worker * On newer Kernels, the parameter name is used to identify the loaded program 76*387f9dfdSAndroid Build Coastguard Worker * for inspection and debugging. It could be different from the function name. 77*387f9dfdSAndroid Build Coastguard Worker * 78*387f9dfdSAndroid Build Coastguard Worker * If log_level has value greater than 0, or the load failed, it will enable 79*387f9dfdSAndroid Build Coastguard Worker * extra logging of loaded BPF bytecode and register status, and will print the 80*387f9dfdSAndroid Build Coastguard Worker * logging message to stderr. In such cases: 81*387f9dfdSAndroid Build Coastguard Worker * - If log_buf and log_buf_size are provided, it will use and also write the 82*387f9dfdSAndroid Build Coastguard Worker * log messages to the provided log_buf. If log_buf is insufficient in size, 83*387f9dfdSAndroid Build Coastguard Worker * it will not to any additional memory allocation. 84*387f9dfdSAndroid Build Coastguard Worker * - Otherwise, it will allocate an internal temporary buffer for log message 85*387f9dfdSAndroid Build Coastguard Worker * printing, and continue to attempt increase that allocated buffer size if 86*387f9dfdSAndroid Build Coastguard Worker * initial attempt was insufficient in size. 87*387f9dfdSAndroid Build Coastguard Worker */ 88*387f9dfdSAndroid Build Coastguard Worker int bcc_prog_load(enum bpf_prog_type prog_type, const char *name, 89*387f9dfdSAndroid Build Coastguard Worker const struct bpf_insn *insns, int prog_len, 90*387f9dfdSAndroid Build Coastguard Worker const char *license, unsigned kern_version, 91*387f9dfdSAndroid Build Coastguard Worker int log_level, char *log_buf, unsigned log_buf_size); 92*387f9dfdSAndroid Build Coastguard Worker int bcc_prog_load_xattr(enum bpf_prog_type prog_type, const char *prog_name, 93*387f9dfdSAndroid Build Coastguard Worker const char *license, const struct bpf_insn *insns, 94*387f9dfdSAndroid Build Coastguard Worker struct bpf_prog_load_opts *opts, 95*387f9dfdSAndroid Build Coastguard Worker int prog_len, char *log_buf, 96*387f9dfdSAndroid Build Coastguard Worker unsigned log_buf_size, bool allow_rlimit); 97*387f9dfdSAndroid Build Coastguard Worker int bpf_attach_socket(int sockfd, int progfd); 98*387f9dfdSAndroid Build Coastguard Worker 99*387f9dfdSAndroid Build Coastguard Worker /* create RAW socket. If name is not NULL/a non-empty null-terminated string, 100*387f9dfdSAndroid Build Coastguard Worker * bind the raw socket to the interface 'name' */ 101*387f9dfdSAndroid Build Coastguard Worker int bpf_open_raw_sock(const char *name); 102*387f9dfdSAndroid Build Coastguard Worker 103*387f9dfdSAndroid Build Coastguard Worker typedef void (*perf_reader_raw_cb)(void *cb_cookie, void *raw, int raw_size); 104*387f9dfdSAndroid Build Coastguard Worker typedef void (*perf_reader_lost_cb)(void *cb_cookie, uint64_t lost); 105*387f9dfdSAndroid Build Coastguard Worker 106*387f9dfdSAndroid Build Coastguard Worker int bpf_attach_kprobe(int progfd, enum bpf_probe_attach_type attach_type, 107*387f9dfdSAndroid Build Coastguard Worker const char *ev_name, const char *fn_name, uint64_t fn_offset, 108*387f9dfdSAndroid Build Coastguard Worker int maxactive); 109*387f9dfdSAndroid Build Coastguard Worker int bpf_detach_kprobe(const char *ev_name); 110*387f9dfdSAndroid Build Coastguard Worker 111*387f9dfdSAndroid Build Coastguard Worker int bpf_attach_uprobe(int progfd, enum bpf_probe_attach_type attach_type, 112*387f9dfdSAndroid Build Coastguard Worker const char *ev_name, const char *binary_path, 113*387f9dfdSAndroid Build Coastguard Worker uint64_t offset, pid_t pid, uint32_t ref_ctr_offset); 114*387f9dfdSAndroid Build Coastguard Worker int bpf_detach_uprobe(const char *ev_name); 115*387f9dfdSAndroid Build Coastguard Worker 116*387f9dfdSAndroid Build Coastguard Worker int bpf_attach_tracepoint(int progfd, const char *tp_category, 117*387f9dfdSAndroid Build Coastguard Worker const char *tp_name); 118*387f9dfdSAndroid Build Coastguard Worker int bpf_detach_tracepoint(const char *tp_category, const char *tp_name); 119*387f9dfdSAndroid Build Coastguard Worker 120*387f9dfdSAndroid Build Coastguard Worker int bpf_attach_raw_tracepoint(int progfd, const char *tp_name); 121*387f9dfdSAndroid Build Coastguard Worker 122*387f9dfdSAndroid Build Coastguard Worker int bpf_attach_kfunc(int prog_fd); 123*387f9dfdSAndroid Build Coastguard Worker 124*387f9dfdSAndroid Build Coastguard Worker int bpf_attach_lsm(int prog_fd); 125*387f9dfdSAndroid Build Coastguard Worker 126*387f9dfdSAndroid Build Coastguard Worker bool bpf_has_kernel_btf(void); 127*387f9dfdSAndroid Build Coastguard Worker 128*387f9dfdSAndroid Build Coastguard Worker int kernel_struct_has_field(const char *struct_name, const char *field_name); 129*387f9dfdSAndroid Build Coastguard Worker 130*387f9dfdSAndroid Build Coastguard Worker void * bpf_open_perf_buffer(perf_reader_raw_cb raw_cb, 131*387f9dfdSAndroid Build Coastguard Worker perf_reader_lost_cb lost_cb, void *cb_cookie, 132*387f9dfdSAndroid Build Coastguard Worker int pid, int cpu, int page_cnt); 133*387f9dfdSAndroid Build Coastguard Worker 134*387f9dfdSAndroid Build Coastguard Worker void * bpf_open_perf_buffer_opts(perf_reader_raw_cb raw_cb, 135*387f9dfdSAndroid Build Coastguard Worker perf_reader_lost_cb lost_cb, void *cb_cookie, 136*387f9dfdSAndroid Build Coastguard Worker int page_cnt, struct bcc_perf_buffer_opts *opts); 137*387f9dfdSAndroid Build Coastguard Worker 138*387f9dfdSAndroid Build Coastguard Worker /* attached a prog expressed by progfd to the device specified in dev_name */ 139*387f9dfdSAndroid Build Coastguard Worker int bpf_attach_xdp(const char *dev_name, int progfd, uint32_t flags); 140*387f9dfdSAndroid Build Coastguard Worker 141*387f9dfdSAndroid Build Coastguard Worker // attach a prog expressed by progfd to run on a specific perf event. The perf 142*387f9dfdSAndroid Build Coastguard Worker // event will be created using the perf_event_attr pointer provided. 143*387f9dfdSAndroid Build Coastguard Worker int bpf_attach_perf_event_raw(int progfd, void *perf_event_attr, pid_t pid, 144*387f9dfdSAndroid Build Coastguard Worker int cpu, int group_fd, unsigned long extra_flags); 145*387f9dfdSAndroid Build Coastguard Worker // attach a prog expressed by progfd to run on a specific perf event, with 146*387f9dfdSAndroid Build Coastguard Worker // certain sample period or sample frequency 147*387f9dfdSAndroid Build Coastguard Worker int bpf_attach_perf_event(int progfd, uint32_t ev_type, uint32_t ev_config, 148*387f9dfdSAndroid Build Coastguard Worker uint64_t sample_period, uint64_t sample_freq, 149*387f9dfdSAndroid Build Coastguard Worker pid_t pid, int cpu, int group_fd); 150*387f9dfdSAndroid Build Coastguard Worker 151*387f9dfdSAndroid Build Coastguard Worker int bpf_open_perf_event(uint32_t type, uint64_t config, int pid, int cpu); 152*387f9dfdSAndroid Build Coastguard Worker 153*387f9dfdSAndroid Build Coastguard Worker int bpf_close_perf_event_fd(int fd); 154*387f9dfdSAndroid Build Coastguard Worker 155*387f9dfdSAndroid Build Coastguard Worker typedef int (*ring_buffer_sample_fn)(void *ctx, void *data, size_t size); 156*387f9dfdSAndroid Build Coastguard Worker 157*387f9dfdSAndroid Build Coastguard Worker struct ring_buffer; 158*387f9dfdSAndroid Build Coastguard Worker 159*387f9dfdSAndroid Build Coastguard Worker void * bpf_new_ringbuf(int map_fd, ring_buffer_sample_fn sample_cb, void *ctx); 160*387f9dfdSAndroid Build Coastguard Worker void bpf_free_ringbuf(struct ring_buffer *rb); 161*387f9dfdSAndroid Build Coastguard Worker int bpf_add_ringbuf(struct ring_buffer *rb, int map_fd, 162*387f9dfdSAndroid Build Coastguard Worker ring_buffer_sample_fn sample_cb, void *ctx); 163*387f9dfdSAndroid Build Coastguard Worker int bpf_poll_ringbuf(struct ring_buffer *rb, int timeout_ms); 164*387f9dfdSAndroid Build Coastguard Worker int bpf_consume_ringbuf(struct ring_buffer *rb); 165*387f9dfdSAndroid Build Coastguard Worker 166*387f9dfdSAndroid Build Coastguard Worker int bpf_obj_pin(int fd, const char *pathname); 167*387f9dfdSAndroid Build Coastguard Worker int bpf_obj_get(const char *pathname); 168*387f9dfdSAndroid Build Coastguard Worker int bpf_obj_get_info(int prog_map_fd, void *info, uint32_t *info_len); 169*387f9dfdSAndroid Build Coastguard Worker int bpf_prog_compute_tag(const struct bpf_insn *insns, int prog_len, 170*387f9dfdSAndroid Build Coastguard Worker unsigned long long *tag); 171*387f9dfdSAndroid Build Coastguard Worker int bpf_prog_get_tag(int fd, unsigned long long *tag); 172*387f9dfdSAndroid Build Coastguard Worker int bpf_prog_get_next_id(uint32_t start_id, uint32_t *next_id); 173*387f9dfdSAndroid Build Coastguard Worker int bpf_prog_get_fd_by_id(uint32_t id); 174*387f9dfdSAndroid Build Coastguard Worker int bpf_map_get_fd_by_id(uint32_t id); 175*387f9dfdSAndroid Build Coastguard Worker int bpf_obj_get_info_by_fd(int prog_fd, void *info, uint32_t *info_len); 176*387f9dfdSAndroid Build Coastguard Worker 177*387f9dfdSAndroid Build Coastguard Worker int bcc_iter_attach(int prog_fd, union bpf_iter_link_info *link_info, 178*387f9dfdSAndroid Build Coastguard Worker uint32_t link_info_len); 179*387f9dfdSAndroid Build Coastguard Worker int bcc_iter_create(int link_fd); 180*387f9dfdSAndroid Build Coastguard Worker int bcc_make_parent_dir(const char *path); 181*387f9dfdSAndroid Build Coastguard Worker int bcc_check_bpffs_path(const char *path); 182*387f9dfdSAndroid Build Coastguard Worker int bpf_lookup_batch(int fd, __u32 *in_batch, __u32 *out_batch, void *keys, 183*387f9dfdSAndroid Build Coastguard Worker void *values, __u32 *count); 184*387f9dfdSAndroid Build Coastguard Worker int bpf_delete_batch(int fd, void *keys, __u32 *count); 185*387f9dfdSAndroid Build Coastguard Worker int bpf_update_batch(int fd, void *keys, void *values, __u32 *count); 186*387f9dfdSAndroid Build Coastguard Worker int bpf_lookup_and_delete_batch(int fd, __u32 *in_batch, __u32 *out_batch, 187*387f9dfdSAndroid Build Coastguard Worker void *keys, void *values, __u32 *count); 188*387f9dfdSAndroid Build Coastguard Worker 189*387f9dfdSAndroid Build Coastguard Worker #define LOG_BUF_SIZE 65536 190*387f9dfdSAndroid Build Coastguard Worker 191*387f9dfdSAndroid Build Coastguard Worker // Put non-static/inline functions in their own section with this prefix + 192*387f9dfdSAndroid Build Coastguard Worker // fn_name to enable discovery by the bcc library. 193*387f9dfdSAndroid Build Coastguard Worker #define BPF_FN_PREFIX ".bpf.fn." 194*387f9dfdSAndroid Build Coastguard Worker 195*387f9dfdSAndroid Build Coastguard Worker /* ALU ops on registers, bpf_add|sub|...: dst_reg += src_reg */ 196*387f9dfdSAndroid Build Coastguard Worker 197*387f9dfdSAndroid Build Coastguard Worker #define BPF_ALU64_REG(OP, DST, SRC) \ 198*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 199*387f9dfdSAndroid Build Coastguard Worker .code = BPF_ALU64 | BPF_OP(OP) | BPF_X, \ 200*387f9dfdSAndroid Build Coastguard Worker .dst_reg = DST, \ 201*387f9dfdSAndroid Build Coastguard Worker .src_reg = SRC, \ 202*387f9dfdSAndroid Build Coastguard Worker .off = 0, \ 203*387f9dfdSAndroid Build Coastguard Worker .imm = 0 }) 204*387f9dfdSAndroid Build Coastguard Worker 205*387f9dfdSAndroid Build Coastguard Worker #define BPF_ALU32_REG(OP, DST, SRC) \ 206*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 207*387f9dfdSAndroid Build Coastguard Worker .code = BPF_ALU | BPF_OP(OP) | BPF_X, \ 208*387f9dfdSAndroid Build Coastguard Worker .dst_reg = DST, \ 209*387f9dfdSAndroid Build Coastguard Worker .src_reg = SRC, \ 210*387f9dfdSAndroid Build Coastguard Worker .off = 0, \ 211*387f9dfdSAndroid Build Coastguard Worker .imm = 0 }) 212*387f9dfdSAndroid Build Coastguard Worker 213*387f9dfdSAndroid Build Coastguard Worker /* ALU ops on immediates, bpf_add|sub|...: dst_reg += imm32 */ 214*387f9dfdSAndroid Build Coastguard Worker 215*387f9dfdSAndroid Build Coastguard Worker #define BPF_ALU64_IMM(OP, DST, IMM) \ 216*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 217*387f9dfdSAndroid Build Coastguard Worker .code = BPF_ALU64 | BPF_OP(OP) | BPF_K, \ 218*387f9dfdSAndroid Build Coastguard Worker .dst_reg = DST, \ 219*387f9dfdSAndroid Build Coastguard Worker .src_reg = 0, \ 220*387f9dfdSAndroid Build Coastguard Worker .off = 0, \ 221*387f9dfdSAndroid Build Coastguard Worker .imm = IMM }) 222*387f9dfdSAndroid Build Coastguard Worker 223*387f9dfdSAndroid Build Coastguard Worker #define BPF_ALU32_IMM(OP, DST, IMM) \ 224*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 225*387f9dfdSAndroid Build Coastguard Worker .code = BPF_ALU | BPF_OP(OP) | BPF_K, \ 226*387f9dfdSAndroid Build Coastguard Worker .dst_reg = DST, \ 227*387f9dfdSAndroid Build Coastguard Worker .src_reg = 0, \ 228*387f9dfdSAndroid Build Coastguard Worker .off = 0, \ 229*387f9dfdSAndroid Build Coastguard Worker .imm = IMM }) 230*387f9dfdSAndroid Build Coastguard Worker 231*387f9dfdSAndroid Build Coastguard Worker /* Short form of mov, dst_reg = src_reg */ 232*387f9dfdSAndroid Build Coastguard Worker 233*387f9dfdSAndroid Build Coastguard Worker #define BPF_MOV64_REG(DST, SRC) \ 234*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 235*387f9dfdSAndroid Build Coastguard Worker .code = BPF_ALU64 | BPF_MOV | BPF_X, \ 236*387f9dfdSAndroid Build Coastguard Worker .dst_reg = DST, \ 237*387f9dfdSAndroid Build Coastguard Worker .src_reg = SRC, \ 238*387f9dfdSAndroid Build Coastguard Worker .off = 0, \ 239*387f9dfdSAndroid Build Coastguard Worker .imm = 0 }) 240*387f9dfdSAndroid Build Coastguard Worker 241*387f9dfdSAndroid Build Coastguard Worker /* Short form of mov, dst_reg = imm32 */ 242*387f9dfdSAndroid Build Coastguard Worker 243*387f9dfdSAndroid Build Coastguard Worker #define BPF_MOV64_IMM(DST, IMM) \ 244*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 245*387f9dfdSAndroid Build Coastguard Worker .code = BPF_ALU64 | BPF_MOV | BPF_K, \ 246*387f9dfdSAndroid Build Coastguard Worker .dst_reg = DST, \ 247*387f9dfdSAndroid Build Coastguard Worker .src_reg = 0, \ 248*387f9dfdSAndroid Build Coastguard Worker .off = 0, \ 249*387f9dfdSAndroid Build Coastguard Worker .imm = IMM }) 250*387f9dfdSAndroid Build Coastguard Worker 251*387f9dfdSAndroid Build Coastguard Worker /* BPF_LD_IMM64 macro encodes single 'load 64-bit immediate' insn */ 252*387f9dfdSAndroid Build Coastguard Worker #define BPF_LD_IMM64(DST, IMM) \ 253*387f9dfdSAndroid Build Coastguard Worker BPF_LD_IMM64_RAW(DST, 0, IMM) 254*387f9dfdSAndroid Build Coastguard Worker 255*387f9dfdSAndroid Build Coastguard Worker #define BPF_LD_IMM64_RAW(DST, SRC, IMM) \ 256*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 257*387f9dfdSAndroid Build Coastguard Worker .code = BPF_LD | BPF_DW | BPF_IMM, \ 258*387f9dfdSAndroid Build Coastguard Worker .dst_reg = DST, \ 259*387f9dfdSAndroid Build Coastguard Worker .src_reg = SRC, \ 260*387f9dfdSAndroid Build Coastguard Worker .off = 0, \ 261*387f9dfdSAndroid Build Coastguard Worker .imm = (__u32) (IMM) }), \ 262*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 263*387f9dfdSAndroid Build Coastguard Worker .code = 0, /* zero is reserved opcode */ \ 264*387f9dfdSAndroid Build Coastguard Worker .dst_reg = 0, \ 265*387f9dfdSAndroid Build Coastguard Worker .src_reg = 0, \ 266*387f9dfdSAndroid Build Coastguard Worker .off = 0, \ 267*387f9dfdSAndroid Build Coastguard Worker .imm = ((__u64) (IMM)) >> 32 }) 268*387f9dfdSAndroid Build Coastguard Worker 269*387f9dfdSAndroid Build Coastguard Worker #define BPF_PSEUDO_MAP_FD 1 270*387f9dfdSAndroid Build Coastguard Worker 271*387f9dfdSAndroid Build Coastguard Worker /* pseudo BPF_LD_IMM64 insn used to refer to process-local map_fd */ 272*387f9dfdSAndroid Build Coastguard Worker #define BPF_LD_MAP_FD(DST, MAP_FD) \ 273*387f9dfdSAndroid Build Coastguard Worker BPF_LD_IMM64_RAW(DST, BPF_PSEUDO_MAP_FD, MAP_FD) 274*387f9dfdSAndroid Build Coastguard Worker 275*387f9dfdSAndroid Build Coastguard Worker 276*387f9dfdSAndroid Build Coastguard Worker /* Direct packet access, R0 = *(uint *) (skb->data + imm32) */ 277*387f9dfdSAndroid Build Coastguard Worker 278*387f9dfdSAndroid Build Coastguard Worker #define BPF_LD_ABS(SIZE, IMM) \ 279*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 280*387f9dfdSAndroid Build Coastguard Worker .code = BPF_LD | BPF_SIZE(SIZE) | BPF_ABS, \ 281*387f9dfdSAndroid Build Coastguard Worker .dst_reg = 0, \ 282*387f9dfdSAndroid Build Coastguard Worker .src_reg = 0, \ 283*387f9dfdSAndroid Build Coastguard Worker .off = 0, \ 284*387f9dfdSAndroid Build Coastguard Worker .imm = IMM }) 285*387f9dfdSAndroid Build Coastguard Worker 286*387f9dfdSAndroid Build Coastguard Worker /* Memory load, dst_reg = *(uint *) (src_reg + off16) */ 287*387f9dfdSAndroid Build Coastguard Worker 288*387f9dfdSAndroid Build Coastguard Worker #define BPF_LDX_MEM(SIZE, DST, SRC, OFF) \ 289*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 290*387f9dfdSAndroid Build Coastguard Worker .code = BPF_LDX | BPF_SIZE(SIZE) | BPF_MEM, \ 291*387f9dfdSAndroid Build Coastguard Worker .dst_reg = DST, \ 292*387f9dfdSAndroid Build Coastguard Worker .src_reg = SRC, \ 293*387f9dfdSAndroid Build Coastguard Worker .off = OFF, \ 294*387f9dfdSAndroid Build Coastguard Worker .imm = 0 }) 295*387f9dfdSAndroid Build Coastguard Worker 296*387f9dfdSAndroid Build Coastguard Worker /* Memory store, *(uint *) (dst_reg + off16) = src_reg */ 297*387f9dfdSAndroid Build Coastguard Worker 298*387f9dfdSAndroid Build Coastguard Worker #define BPF_STX_MEM(SIZE, DST, SRC, OFF) \ 299*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 300*387f9dfdSAndroid Build Coastguard Worker .code = BPF_STX | BPF_SIZE(SIZE) | BPF_MEM, \ 301*387f9dfdSAndroid Build Coastguard Worker .dst_reg = DST, \ 302*387f9dfdSAndroid Build Coastguard Worker .src_reg = SRC, \ 303*387f9dfdSAndroid Build Coastguard Worker .off = OFF, \ 304*387f9dfdSAndroid Build Coastguard Worker .imm = 0 }) 305*387f9dfdSAndroid Build Coastguard Worker 306*387f9dfdSAndroid Build Coastguard Worker /* Memory store, *(uint *) (dst_reg + off16) = imm32 */ 307*387f9dfdSAndroid Build Coastguard Worker 308*387f9dfdSAndroid Build Coastguard Worker #define BPF_ST_MEM(SIZE, DST, OFF, IMM) \ 309*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 310*387f9dfdSAndroid Build Coastguard Worker .code = BPF_ST | BPF_SIZE(SIZE) | BPF_MEM, \ 311*387f9dfdSAndroid Build Coastguard Worker .dst_reg = DST, \ 312*387f9dfdSAndroid Build Coastguard Worker .src_reg = 0, \ 313*387f9dfdSAndroid Build Coastguard Worker .off = OFF, \ 314*387f9dfdSAndroid Build Coastguard Worker .imm = IMM }) 315*387f9dfdSAndroid Build Coastguard Worker 316*387f9dfdSAndroid Build Coastguard Worker /* Conditional jumps against registers, if (dst_reg 'op' src_reg) goto pc + off16 */ 317*387f9dfdSAndroid Build Coastguard Worker 318*387f9dfdSAndroid Build Coastguard Worker #define BPF_JMP_REG(OP, DST, SRC, OFF) \ 319*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 320*387f9dfdSAndroid Build Coastguard Worker .code = BPF_JMP | BPF_OP(OP) | BPF_X, \ 321*387f9dfdSAndroid Build Coastguard Worker .dst_reg = DST, \ 322*387f9dfdSAndroid Build Coastguard Worker .src_reg = SRC, \ 323*387f9dfdSAndroid Build Coastguard Worker .off = OFF, \ 324*387f9dfdSAndroid Build Coastguard Worker .imm = 0 }) 325*387f9dfdSAndroid Build Coastguard Worker 326*387f9dfdSAndroid Build Coastguard Worker /* Conditional jumps against immediates, if (dst_reg 'op' imm32) goto pc + off16 */ 327*387f9dfdSAndroid Build Coastguard Worker 328*387f9dfdSAndroid Build Coastguard Worker #define BPF_JMP_IMM(OP, DST, IMM, OFF) \ 329*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 330*387f9dfdSAndroid Build Coastguard Worker .code = BPF_JMP | BPF_OP(OP) | BPF_K, \ 331*387f9dfdSAndroid Build Coastguard Worker .dst_reg = DST, \ 332*387f9dfdSAndroid Build Coastguard Worker .src_reg = 0, \ 333*387f9dfdSAndroid Build Coastguard Worker .off = OFF, \ 334*387f9dfdSAndroid Build Coastguard Worker .imm = IMM }) 335*387f9dfdSAndroid Build Coastguard Worker 336*387f9dfdSAndroid Build Coastguard Worker /* Raw code statement block */ 337*387f9dfdSAndroid Build Coastguard Worker 338*387f9dfdSAndroid Build Coastguard Worker #define BPF_RAW_INSN(CODE, DST, SRC, OFF, IMM) \ 339*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 340*387f9dfdSAndroid Build Coastguard Worker .code = CODE, \ 341*387f9dfdSAndroid Build Coastguard Worker .dst_reg = DST, \ 342*387f9dfdSAndroid Build Coastguard Worker .src_reg = SRC, \ 343*387f9dfdSAndroid Build Coastguard Worker .off = OFF, \ 344*387f9dfdSAndroid Build Coastguard Worker .imm = IMM }) 345*387f9dfdSAndroid Build Coastguard Worker 346*387f9dfdSAndroid Build Coastguard Worker /* Program exit */ 347*387f9dfdSAndroid Build Coastguard Worker 348*387f9dfdSAndroid Build Coastguard Worker #define BPF_EXIT_INSN() \ 349*387f9dfdSAndroid Build Coastguard Worker ((struct bpf_insn) { \ 350*387f9dfdSAndroid Build Coastguard Worker .code = BPF_JMP | BPF_EXIT, \ 351*387f9dfdSAndroid Build Coastguard Worker .dst_reg = 0, \ 352*387f9dfdSAndroid Build Coastguard Worker .src_reg = 0, \ 353*387f9dfdSAndroid Build Coastguard Worker .off = 0, \ 354*387f9dfdSAndroid Build Coastguard Worker .imm = 0 }) 355*387f9dfdSAndroid Build Coastguard Worker 356*387f9dfdSAndroid Build Coastguard Worker #ifdef __cplusplus 357*387f9dfdSAndroid Build Coastguard Worker } 358*387f9dfdSAndroid Build Coastguard Worker #endif 359*387f9dfdSAndroid Build Coastguard Worker 360*387f9dfdSAndroid Build Coastguard Worker #endif 361