1*387f9dfdSAndroid Build Coastguard Worker R"********( 2*387f9dfdSAndroid Build Coastguard Worker /* 3*387f9dfdSAndroid Build Coastguard Worker * Copyright (c) 2015 PLUMgrid, Inc. 4*387f9dfdSAndroid Build Coastguard Worker * 5*387f9dfdSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 6*387f9dfdSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 7*387f9dfdSAndroid Build Coastguard Worker * You may obtain a copy of the License at 8*387f9dfdSAndroid Build Coastguard Worker * 9*387f9dfdSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 10*387f9dfdSAndroid Build Coastguard Worker * 11*387f9dfdSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 12*387f9dfdSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 13*387f9dfdSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*387f9dfdSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 15*387f9dfdSAndroid Build Coastguard Worker * limitations under the License. 16*387f9dfdSAndroid Build Coastguard Worker */ 17*387f9dfdSAndroid Build Coastguard Worker #ifndef __BPF_HELPERS_H 18*387f9dfdSAndroid Build Coastguard Worker #define __BPF_HELPERS_H 19*387f9dfdSAndroid Build Coastguard Worker 20*387f9dfdSAndroid Build Coastguard Worker /* In Linux 5.4 asm_inline was introduced, but it's not supported by clang. 21*387f9dfdSAndroid Build Coastguard Worker * Redefine it to just asm to enable successful compilation. 22*387f9dfdSAndroid Build Coastguard Worker */ 23*387f9dfdSAndroid Build Coastguard Worker #ifdef asm_inline 24*387f9dfdSAndroid Build Coastguard Worker #undef asm_inline 25*387f9dfdSAndroid Build Coastguard Worker #define asm_inline asm 26*387f9dfdSAndroid Build Coastguard Worker #endif 27*387f9dfdSAndroid Build Coastguard Worker 28*387f9dfdSAndroid Build Coastguard Worker /* Before bpf_helpers.h is included, uapi bpf.h has been 29*387f9dfdSAndroid Build Coastguard Worker * included, which references linux/types.h. This may bring 30*387f9dfdSAndroid Build Coastguard Worker * in asm_volatile_goto definition if permitted based on 31*387f9dfdSAndroid Build Coastguard Worker * compiler setup and kernel configs. 32*387f9dfdSAndroid Build Coastguard Worker * 33*387f9dfdSAndroid Build Coastguard Worker * clang does not support "asm volatile goto" yet. 34*387f9dfdSAndroid Build Coastguard Worker * So redefine asm_volatile_goto to some invalid asm code. 35*387f9dfdSAndroid Build Coastguard Worker * If asm_volatile_goto is actually used by the bpf program, 36*387f9dfdSAndroid Build Coastguard Worker * a compilation error will appear. 37*387f9dfdSAndroid Build Coastguard Worker */ 38*387f9dfdSAndroid Build Coastguard Worker #ifdef asm_volatile_goto 39*387f9dfdSAndroid Build Coastguard Worker #undef asm_volatile_goto 40*387f9dfdSAndroid Build Coastguard Worker #endif 41*387f9dfdSAndroid Build Coastguard Worker #define asm_volatile_goto(x...) asm volatile("invalid use of asm_volatile_goto") 42*387f9dfdSAndroid Build Coastguard Worker 43*387f9dfdSAndroid Build Coastguard Worker /* In 4.18 and later, when CONFIG_FUNCTION_TRACER is defined, kernel Makefile adds 44*387f9dfdSAndroid Build Coastguard Worker * -DCC_USING_FENTRY. Let do the same for bpf programs. 45*387f9dfdSAndroid Build Coastguard Worker */ 46*387f9dfdSAndroid Build Coastguard Worker #if defined(CONFIG_FUNCTION_TRACER) 47*387f9dfdSAndroid Build Coastguard Worker #define CC_USING_FENTRY 48*387f9dfdSAndroid Build Coastguard Worker #endif 49*387f9dfdSAndroid Build Coastguard Worker 50*387f9dfdSAndroid Build Coastguard Worker #include <uapi/linux/bpf.h> 51*387f9dfdSAndroid Build Coastguard Worker #include <uapi/linux/if_packet.h> 52*387f9dfdSAndroid Build Coastguard Worker #include <linux/version.h> 53*387f9dfdSAndroid Build Coastguard Worker #include <linux/log2.h> 54*387f9dfdSAndroid Build Coastguard Worker #include <asm/page.h> 55*387f9dfdSAndroid Build Coastguard Worker 56*387f9dfdSAndroid Build Coastguard Worker #ifndef CONFIG_BPF_SYSCALL 57*387f9dfdSAndroid Build Coastguard Worker #error "CONFIG_BPF_SYSCALL is undefined, please check your .config or ask your Linux distro to enable this feature" 58*387f9dfdSAndroid Build Coastguard Worker #endif 59*387f9dfdSAndroid Build Coastguard Worker 60*387f9dfdSAndroid Build Coastguard Worker #ifdef PERF_MAX_STACK_DEPTH 61*387f9dfdSAndroid Build Coastguard Worker #define BPF_MAX_STACK_DEPTH PERF_MAX_STACK_DEPTH 62*387f9dfdSAndroid Build Coastguard Worker #else 63*387f9dfdSAndroid Build Coastguard Worker #define BPF_MAX_STACK_DEPTH 127 64*387f9dfdSAndroid Build Coastguard Worker #endif 65*387f9dfdSAndroid Build Coastguard Worker 66*387f9dfdSAndroid Build Coastguard Worker /* helper macro to place programs, maps, license in 67*387f9dfdSAndroid Build Coastguard Worker * different sections in elf_bpf file. Section names 68*387f9dfdSAndroid Build Coastguard Worker * are interpreted by elf_bpf loader 69*387f9dfdSAndroid Build Coastguard Worker */ 70*387f9dfdSAndroid Build Coastguard Worker #define BCC_SEC(NAME) __attribute__((section(NAME), used)) 71*387f9dfdSAndroid Build Coastguard Worker 72*387f9dfdSAndroid Build Coastguard Worker #ifdef B_WORKAROUND 73*387f9dfdSAndroid Build Coastguard Worker #define BCC_SEC_HELPERS BCC_SEC("helpers") 74*387f9dfdSAndroid Build Coastguard Worker #else 75*387f9dfdSAndroid Build Coastguard Worker #define BCC_SEC_HELPERS 76*387f9dfdSAndroid Build Coastguard Worker #endif 77*387f9dfdSAndroid Build Coastguard Worker 78*387f9dfdSAndroid Build Coastguard Worker // Associate map with its key/value types 79*387f9dfdSAndroid Build Coastguard Worker #define BPF_ANNOTATE_KV_PAIR(name, type_key, type_val) \ 80*387f9dfdSAndroid Build Coastguard Worker struct ____btf_map_##name { \ 81*387f9dfdSAndroid Build Coastguard Worker type_key key; \ 82*387f9dfdSAndroid Build Coastguard Worker type_val value; \ 83*387f9dfdSAndroid Build Coastguard Worker }; \ 84*387f9dfdSAndroid Build Coastguard Worker struct ____btf_map_##name \ 85*387f9dfdSAndroid Build Coastguard Worker __attribute__ ((section(".maps." #name), used)) \ 86*387f9dfdSAndroid Build Coastguard Worker ____btf_map_##name = { } 87*387f9dfdSAndroid Build Coastguard Worker 88*387f9dfdSAndroid Build Coastguard Worker // Associate map with its key/value types for QUEUE/STACK map types 89*387f9dfdSAndroid Build Coastguard Worker #define BPF_ANNOTATE_KV_PAIR_QUEUESTACK(name, type_val) \ 90*387f9dfdSAndroid Build Coastguard Worker struct ____btf_map_##name { \ 91*387f9dfdSAndroid Build Coastguard Worker type_val value; \ 92*387f9dfdSAndroid Build Coastguard Worker }; \ 93*387f9dfdSAndroid Build Coastguard Worker struct ____btf_map_##name \ 94*387f9dfdSAndroid Build Coastguard Worker __attribute__ ((section(".maps." #name), used)) \ 95*387f9dfdSAndroid Build Coastguard Worker ____btf_map_##name = { } 96*387f9dfdSAndroid Build Coastguard Worker 97*387f9dfdSAndroid Build Coastguard Worker // Changes to the macro require changes in BFrontendAction classes 98*387f9dfdSAndroid Build Coastguard Worker #define BPF_F_TABLE(_table_type, _key_type, _leaf_type, _name, _max_entries, _flags) \ 99*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \ 100*387f9dfdSAndroid Build Coastguard Worker _key_type key; \ 101*387f9dfdSAndroid Build Coastguard Worker _leaf_type leaf; \ 102*387f9dfdSAndroid Build Coastguard Worker _leaf_type * (*lookup) (_key_type *); \ 103*387f9dfdSAndroid Build Coastguard Worker _leaf_type * (*lookup_or_init) (_key_type *, _leaf_type *); \ 104*387f9dfdSAndroid Build Coastguard Worker _leaf_type * (*lookup_or_try_init) (_key_type *, _leaf_type *); \ 105*387f9dfdSAndroid Build Coastguard Worker int (*update) (_key_type *, _leaf_type *); \ 106*387f9dfdSAndroid Build Coastguard Worker int (*insert) (_key_type *, _leaf_type *); \ 107*387f9dfdSAndroid Build Coastguard Worker int (*delete) (_key_type *); \ 108*387f9dfdSAndroid Build Coastguard Worker void (*call) (void *, int index); \ 109*387f9dfdSAndroid Build Coastguard Worker void (*increment) (_key_type, ...); \ 110*387f9dfdSAndroid Build Coastguard Worker void (*atomic_increment) (_key_type, ...); \ 111*387f9dfdSAndroid Build Coastguard Worker int (*get_stackid) (void *, u64); \ 112*387f9dfdSAndroid Build Coastguard Worker void * (*sk_storage_get) (void *, void *, int); \ 113*387f9dfdSAndroid Build Coastguard Worker int (*sk_storage_delete) (void *); \ 114*387f9dfdSAndroid Build Coastguard Worker void * (*inode_storage_get) (void *, void *, int); \ 115*387f9dfdSAndroid Build Coastguard Worker int (*inode_storage_delete) (void *); \ 116*387f9dfdSAndroid Build Coastguard Worker void * (*task_storage_get) (void *, void *, int); \ 117*387f9dfdSAndroid Build Coastguard Worker int (*task_storage_delete) (void *); \ 118*387f9dfdSAndroid Build Coastguard Worker u32 max_entries; \ 119*387f9dfdSAndroid Build Coastguard Worker int flags; \ 120*387f9dfdSAndroid Build Coastguard Worker }; \ 121*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/" _table_type))) \ 122*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .flags = (_flags), .max_entries = (_max_entries) }; \ 123*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR(_name, _key_type, _leaf_type) 124*387f9dfdSAndroid Build Coastguard Worker 125*387f9dfdSAndroid Build Coastguard Worker 126*387f9dfdSAndroid Build Coastguard Worker // Changes to the macro require changes in BFrontendAction classes 127*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUESTACK(_table_type, _name, _leaf_type, _max_entries, _flags) \ 128*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \ 129*387f9dfdSAndroid Build Coastguard Worker _leaf_type leaf; \ 130*387f9dfdSAndroid Build Coastguard Worker int * (*peek) (_leaf_type *); \ 131*387f9dfdSAndroid Build Coastguard Worker int * (*pop) (_leaf_type *); \ 132*387f9dfdSAndroid Build Coastguard Worker int * (*push) (_leaf_type *, u64); \ 133*387f9dfdSAndroid Build Coastguard Worker u32 max_entries; \ 134*387f9dfdSAndroid Build Coastguard Worker int flags; \ 135*387f9dfdSAndroid Build Coastguard Worker }; \ 136*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/" _table_type))) \ 137*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .flags = (_flags), .max_entries = (_max_entries) }; \ 138*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR_QUEUESTACK(_name, _leaf_type) 139*387f9dfdSAndroid Build Coastguard Worker 140*387f9dfdSAndroid Build Coastguard Worker // define queue with 3 parameters (_type=queue/stack automatically) and default flags to 0 141*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUE_STACK3(_type, _name, _leaf_type, _max_entries) \ 142*387f9dfdSAndroid Build Coastguard Worker BPF_QUEUESTACK(_type, _name, _leaf_type, _max_entries, 0) 143*387f9dfdSAndroid Build Coastguard Worker 144*387f9dfdSAndroid Build Coastguard Worker // define queue with 4 parameters (_type=queue/stack automatically) 145*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUE_STACK4(_type, _name, _leaf_type, _max_entries, _flags) \ 146*387f9dfdSAndroid Build Coastguard Worker BPF_QUEUESTACK(_type, _name, _leaf_type, _max_entries, _flags) 147*387f9dfdSAndroid Build Coastguard Worker 148*387f9dfdSAndroid Build Coastguard Worker // helper for default-variable macro function 149*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUE_STACKX(_1, _2, _3, _4, NAME, ...) NAME 150*387f9dfdSAndroid Build Coastguard Worker 151*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUE(...) \ 152*387f9dfdSAndroid Build Coastguard Worker BPF_QUEUE_STACKX(__VA_ARGS__, BPF_QUEUE_STACK4, BPF_QUEUE_STACK3)("queue", __VA_ARGS__) 153*387f9dfdSAndroid Build Coastguard Worker 154*387f9dfdSAndroid Build Coastguard Worker #define BPF_STACK(...) \ 155*387f9dfdSAndroid Build Coastguard Worker BPF_QUEUE_STACKX(__VA_ARGS__, BPF_QUEUE_STACK4, BPF_QUEUE_STACK3)("stack", __VA_ARGS__) 156*387f9dfdSAndroid Build Coastguard Worker 157*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUESTACK_PINNED(_table_type, _name, _leaf_type, _max_entries, _flags, _pinned) \ 158*387f9dfdSAndroid Build Coastguard Worker BPF_QUEUESTACK(_table_type ":" _pinned, _name, _leaf_type, _max_entries, _flags) 159*387f9dfdSAndroid Build Coastguard Worker 160*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUESTACK_PUBLIC(_table_type, _name, _leaf_type, _max_entries, _flags) \ 161*387f9dfdSAndroid Build Coastguard Worker BPF_QUEUESTACK(_table_type, _name, _leaf_type, _max_entries, _flags); \ 162*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/export"))) \ 163*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t __##_name 164*387f9dfdSAndroid Build Coastguard Worker 165*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUESTACK_SHARED(_table_type, _name, _leaf_type, _max_entries, _flags) \ 166*387f9dfdSAndroid Build Coastguard Worker BPF_QUEUESTACK(_table_type, _name, _leaf_type, _max_entries, _flags); \ 167*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/shared"))) \ 168*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t __##_name 169*387f9dfdSAndroid Build Coastguard Worker 170*387f9dfdSAndroid Build Coastguard Worker #define BPF_TABLE(_table_type, _key_type, _leaf_type, _name, _max_entries) \ 171*387f9dfdSAndroid Build Coastguard Worker BPF_F_TABLE(_table_type, _key_type, _leaf_type, _name, _max_entries, 0) 172*387f9dfdSAndroid Build Coastguard Worker 173*387f9dfdSAndroid Build Coastguard Worker #define BPF_TABLE_PINNED7(_table_type, _key_type, _leaf_type, _name, _max_entries, _pinned, _flags) \ 174*387f9dfdSAndroid Build Coastguard Worker BPF_F_TABLE(_table_type ":" _pinned, _key_type, _leaf_type, _name, _max_entries, _flags) 175*387f9dfdSAndroid Build Coastguard Worker 176*387f9dfdSAndroid Build Coastguard Worker #define BPF_TABLE_PINNED6(_table_type, _key_type, _leaf_type, _name, _max_entries, _pinned) \ 177*387f9dfdSAndroid Build Coastguard Worker BPF_F_TABLE(_table_type ":" _pinned, _key_type, _leaf_type, _name, _max_entries, 0) 178*387f9dfdSAndroid Build Coastguard Worker 179*387f9dfdSAndroid Build Coastguard Worker #define BPF_TABLE_PINNEDX(_1, _2, _3, _4, _5, _6, _7, NAME, ...) NAME 180*387f9dfdSAndroid Build Coastguard Worker 181*387f9dfdSAndroid Build Coastguard Worker // Define a pinned table with optional flags argument 182*387f9dfdSAndroid Build Coastguard Worker #define BPF_TABLE_PINNED(...) \ 183*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE_PINNEDX(__VA_ARGS__, BPF_TABLE_PINNED7, BPF_TABLE_PINNED6)(__VA_ARGS__) 184*387f9dfdSAndroid Build Coastguard Worker 185*387f9dfdSAndroid Build Coastguard Worker // define a table same as above but allow it to be referenced by other modules 186*387f9dfdSAndroid Build Coastguard Worker #define BPF_TABLE_PUBLIC(_table_type, _key_type, _leaf_type, _name, _max_entries) \ 187*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE(_table_type, _key_type, _leaf_type, _name, _max_entries); \ 188*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/export"))) \ 189*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t __##_name 190*387f9dfdSAndroid Build Coastguard Worker 191*387f9dfdSAndroid Build Coastguard Worker // define a table that is shared across the programs in the same namespace 192*387f9dfdSAndroid Build Coastguard Worker #define BPF_TABLE_SHARED(_table_type, _key_type, _leaf_type, _name, _max_entries) \ 193*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE(_table_type, _key_type, _leaf_type, _name, _max_entries); \ 194*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/shared"))) \ 195*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t __##_name 196*387f9dfdSAndroid Build Coastguard Worker 197*387f9dfdSAndroid Build Coastguard Worker // Identifier for current CPU used in perf_submit and perf_read 198*387f9dfdSAndroid Build Coastguard Worker // Prefer BPF_F_CURRENT_CPU flag, falls back to call helper for older kernel 199*387f9dfdSAndroid Build Coastguard Worker // Can be overridden from BCC 200*387f9dfdSAndroid Build Coastguard Worker #ifndef CUR_CPU_IDENTIFIER 201*387f9dfdSAndroid Build Coastguard Worker #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) 202*387f9dfdSAndroid Build Coastguard Worker #define CUR_CPU_IDENTIFIER BPF_F_CURRENT_CPU 203*387f9dfdSAndroid Build Coastguard Worker #else 204*387f9dfdSAndroid Build Coastguard Worker #define CUR_CPU_IDENTIFIER bpf_get_smp_processor_id() 205*387f9dfdSAndroid Build Coastguard Worker #endif 206*387f9dfdSAndroid Build Coastguard Worker #endif 207*387f9dfdSAndroid Build Coastguard Worker 208*387f9dfdSAndroid Build Coastguard Worker // Table for pushing custom events to userspace via perf ring buffer 209*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERF_OUTPUT(_name) \ 210*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \ 211*387f9dfdSAndroid Build Coastguard Worker int key; \ 212*387f9dfdSAndroid Build Coastguard Worker u32 leaf; \ 213*387f9dfdSAndroid Build Coastguard Worker /* map.perf_submit(ctx, data, data_size) */ \ 214*387f9dfdSAndroid Build Coastguard Worker int (*perf_submit) (void *, void *, u32); \ 215*387f9dfdSAndroid Build Coastguard Worker int (*perf_submit_skb) (void *, u32, void *, u32); \ 216*387f9dfdSAndroid Build Coastguard Worker u32 max_entries; \ 217*387f9dfdSAndroid Build Coastguard Worker }; \ 218*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/perf_output"))) \ 219*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = 0 } 220*387f9dfdSAndroid Build Coastguard Worker 221*387f9dfdSAndroid Build Coastguard Worker // Table for pushing custom events to userspace via ring buffer 222*387f9dfdSAndroid Build Coastguard Worker #define BPF_RINGBUF_OUTPUT(_name, _num_pages) \ 223*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \ 224*387f9dfdSAndroid Build Coastguard Worker int key; \ 225*387f9dfdSAndroid Build Coastguard Worker u32 leaf; \ 226*387f9dfdSAndroid Build Coastguard Worker /* map.ringbuf_output(data, data_size, flags) */ \ 227*387f9dfdSAndroid Build Coastguard Worker int (*ringbuf_output) (void *, u64, u64); \ 228*387f9dfdSAndroid Build Coastguard Worker /* map.ringbuf_reserve(data_size) */ \ 229*387f9dfdSAndroid Build Coastguard Worker void* (*ringbuf_reserve) (u64); \ 230*387f9dfdSAndroid Build Coastguard Worker /* map.ringbuf_discard(data, flags) */ \ 231*387f9dfdSAndroid Build Coastguard Worker void (*ringbuf_discard) (void *, u64); \ 232*387f9dfdSAndroid Build Coastguard Worker /* map.ringbuf_submit(data, flags) */ \ 233*387f9dfdSAndroid Build Coastguard Worker void (*ringbuf_submit) (void *, u64); \ 234*387f9dfdSAndroid Build Coastguard Worker /* map.ringbuf_query(flags) */ \ 235*387f9dfdSAndroid Build Coastguard Worker u64 (*ringbuf_query) (u64); \ 236*387f9dfdSAndroid Build Coastguard Worker u32 max_entries; \ 237*387f9dfdSAndroid Build Coastguard Worker }; \ 238*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/ringbuf"))) \ 239*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = ((_num_pages) * PAGE_SIZE) } 240*387f9dfdSAndroid Build Coastguard Worker 241*387f9dfdSAndroid Build Coastguard Worker // Table for reading hw perf cpu counters 242*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERF_ARRAY(_name, _max_entries) \ 243*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \ 244*387f9dfdSAndroid Build Coastguard Worker int key; \ 245*387f9dfdSAndroid Build Coastguard Worker u32 leaf; \ 246*387f9dfdSAndroid Build Coastguard Worker /* counter = map.perf_read(index) */ \ 247*387f9dfdSAndroid Build Coastguard Worker u64 (*perf_read) (int); \ 248*387f9dfdSAndroid Build Coastguard Worker int (*perf_counter_value) (int, void *, u32); \ 249*387f9dfdSAndroid Build Coastguard Worker u32 max_entries; \ 250*387f9dfdSAndroid Build Coastguard Worker }; \ 251*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/perf_array"))) \ 252*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = (_max_entries) } 253*387f9dfdSAndroid Build Coastguard Worker 254*387f9dfdSAndroid Build Coastguard Worker // Table for cgroup file descriptors 255*387f9dfdSAndroid Build Coastguard Worker #define BPF_CGROUP_ARRAY(_name, _max_entries) \ 256*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \ 257*387f9dfdSAndroid Build Coastguard Worker int key; \ 258*387f9dfdSAndroid Build Coastguard Worker u32 leaf; \ 259*387f9dfdSAndroid Build Coastguard Worker int (*check_current_task) (int); \ 260*387f9dfdSAndroid Build Coastguard Worker u32 max_entries; \ 261*387f9dfdSAndroid Build Coastguard Worker }; \ 262*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/cgroup_array"))) \ 263*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = (_max_entries) } 264*387f9dfdSAndroid Build Coastguard Worker 265*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH1(_name) \ 266*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("hash", u64, u64, _name, 10240) 267*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH2(_name, _key_type) \ 268*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("hash", _key_type, u64, _name, 10240) 269*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH3(_name, _key_type, _leaf_type) \ 270*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("hash", _key_type, _leaf_type, _name, 10240) 271*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH4(_name, _key_type, _leaf_type, _size) \ 272*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("hash", _key_type, _leaf_type, _name, _size) 273*387f9dfdSAndroid Build Coastguard Worker 274*387f9dfdSAndroid Build Coastguard Worker // helper for default-variable macro function 275*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASHX(_1, _2, _3, _4, NAME, ...) NAME 276*387f9dfdSAndroid Build Coastguard Worker 277*387f9dfdSAndroid Build Coastguard Worker // Define a hash function, some arguments optional 278*387f9dfdSAndroid Build Coastguard Worker // BPF_HASH(name, key_type=u64, leaf_type=u64, size=10240) 279*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH(...) \ 280*387f9dfdSAndroid Build Coastguard Worker BPF_HASHX(__VA_ARGS__, BPF_HASH4, BPF_HASH3, BPF_HASH2, BPF_HASH1)(__VA_ARGS__) 281*387f9dfdSAndroid Build Coastguard Worker 282*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_HASH1(_name) \ 283*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("percpu_hash", u64, u64, _name, 10240) 284*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_HASH2(_name, _key_type) \ 285*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("percpu_hash", _key_type, u64, _name, 10240) 286*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_HASH3(_name, _key_type, _leaf_type) \ 287*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("percpu_hash", _key_type, _leaf_type, _name, 10240) 288*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_HASH4(_name, _key_type, _leaf_type, _size) \ 289*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("percpu_hash", _key_type, _leaf_type, _name, _size) 290*387f9dfdSAndroid Build Coastguard Worker 291*387f9dfdSAndroid Build Coastguard Worker // helper for default-variable macro function 292*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_HASHX(_1, _2, _3, _4, NAME, ...) NAME 293*387f9dfdSAndroid Build Coastguard Worker 294*387f9dfdSAndroid Build Coastguard Worker // Define a hash function, some arguments optional 295*387f9dfdSAndroid Build Coastguard Worker // BPF_PERCPU_HASH(name, key_type=u64, leaf_type=u64, size=10240) 296*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_HASH(...) \ 297*387f9dfdSAndroid Build Coastguard Worker BPF_PERCPU_HASHX( \ 298*387f9dfdSAndroid Build Coastguard Worker __VA_ARGS__, BPF_PERCPU_HASH4, BPF_PERCPU_HASH3, BPF_PERCPU_HASH2, BPF_PERCPU_HASH1) \ 299*387f9dfdSAndroid Build Coastguard Worker (__VA_ARGS__) 300*387f9dfdSAndroid Build Coastguard Worker 301*387f9dfdSAndroid Build Coastguard Worker #define BPF_ARRAY1(_name) \ 302*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("array", int, u64, _name, 10240) 303*387f9dfdSAndroid Build Coastguard Worker #define BPF_ARRAY2(_name, _leaf_type) \ 304*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("array", int, _leaf_type, _name, 10240) 305*387f9dfdSAndroid Build Coastguard Worker #define BPF_ARRAY3(_name, _leaf_type, _size) \ 306*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("array", int, _leaf_type, _name, _size) 307*387f9dfdSAndroid Build Coastguard Worker 308*387f9dfdSAndroid Build Coastguard Worker // helper for default-variable macro function 309*387f9dfdSAndroid Build Coastguard Worker #define BPF_ARRAYX(_1, _2, _3, NAME, ...) NAME 310*387f9dfdSAndroid Build Coastguard Worker 311*387f9dfdSAndroid Build Coastguard Worker // Define an array function, some arguments optional 312*387f9dfdSAndroid Build Coastguard Worker // BPF_ARRAY(name, leaf_type=u64, size=10240) 313*387f9dfdSAndroid Build Coastguard Worker #define BPF_ARRAY(...) \ 314*387f9dfdSAndroid Build Coastguard Worker BPF_ARRAYX(__VA_ARGS__, BPF_ARRAY3, BPF_ARRAY2, BPF_ARRAY1)(__VA_ARGS__) 315*387f9dfdSAndroid Build Coastguard Worker 316*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_ARRAY1(_name) \ 317*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("percpu_array", int, u64, _name, 10240) 318*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_ARRAY2(_name, _leaf_type) \ 319*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("percpu_array", int, _leaf_type, _name, 10240) 320*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_ARRAY3(_name, _leaf_type, _size) \ 321*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("percpu_array", int, _leaf_type, _name, _size) 322*387f9dfdSAndroid Build Coastguard Worker 323*387f9dfdSAndroid Build Coastguard Worker // helper for default-variable macro function 324*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_ARRAYX(_1, _2, _3, NAME, ...) NAME 325*387f9dfdSAndroid Build Coastguard Worker 326*387f9dfdSAndroid Build Coastguard Worker // Define an array function (per CPU), some arguments optional 327*387f9dfdSAndroid Build Coastguard Worker // BPF_PERCPU_ARRAY(name, leaf_type=u64, size=10240) 328*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_ARRAY(...) \ 329*387f9dfdSAndroid Build Coastguard Worker BPF_PERCPU_ARRAYX( \ 330*387f9dfdSAndroid Build Coastguard Worker __VA_ARGS__, BPF_PERCPU_ARRAY3, BPF_PERCPU_ARRAY2, BPF_PERCPU_ARRAY1) \ 331*387f9dfdSAndroid Build Coastguard Worker (__VA_ARGS__) 332*387f9dfdSAndroid Build Coastguard Worker 333*387f9dfdSAndroid Build Coastguard Worker #define BPF_HIST1(_name) \ 334*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("histogram", int, u64, _name, 64) 335*387f9dfdSAndroid Build Coastguard Worker #define BPF_HIST2(_name, _key_type) \ 336*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("histogram", _key_type, u64, _name, 64) 337*387f9dfdSAndroid Build Coastguard Worker #define BPF_HIST3(_name, _key_type, _size) \ 338*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("histogram", _key_type, u64, _name, _size) 339*387f9dfdSAndroid Build Coastguard Worker #define BPF_HISTX(_1, _2, _3, NAME, ...) NAME 340*387f9dfdSAndroid Build Coastguard Worker 341*387f9dfdSAndroid Build Coastguard Worker // Define a histogram, some arguments optional 342*387f9dfdSAndroid Build Coastguard Worker // BPF_HISTOGRAM(name, key_type=int, size=64) 343*387f9dfdSAndroid Build Coastguard Worker #define BPF_HISTOGRAM(...) \ 344*387f9dfdSAndroid Build Coastguard Worker BPF_HISTX(__VA_ARGS__, BPF_HIST3, BPF_HIST2, BPF_HIST1)(__VA_ARGS__) 345*387f9dfdSAndroid Build Coastguard Worker 346*387f9dfdSAndroid Build Coastguard Worker #define BPF_LPM_TRIE1(_name) \ 347*387f9dfdSAndroid Build Coastguard Worker BPF_F_TABLE("lpm_trie", u64, u64, _name, 10240, BPF_F_NO_PREALLOC) 348*387f9dfdSAndroid Build Coastguard Worker #define BPF_LPM_TRIE2(_name, _key_type) \ 349*387f9dfdSAndroid Build Coastguard Worker BPF_F_TABLE("lpm_trie", _key_type, u64, _name, 10240, BPF_F_NO_PREALLOC) 350*387f9dfdSAndroid Build Coastguard Worker #define BPF_LPM_TRIE3(_name, _key_type, _leaf_type) \ 351*387f9dfdSAndroid Build Coastguard Worker BPF_F_TABLE("lpm_trie", _key_type, _leaf_type, _name, 10240, BPF_F_NO_PREALLOC) 352*387f9dfdSAndroid Build Coastguard Worker #define BPF_LPM_TRIE4(_name, _key_type, _leaf_type, _size) \ 353*387f9dfdSAndroid Build Coastguard Worker BPF_F_TABLE("lpm_trie", _key_type, _leaf_type, _name, _size, BPF_F_NO_PREALLOC) 354*387f9dfdSAndroid Build Coastguard Worker #define BPF_LPM_TRIEX(_1, _2, _3, _4, NAME, ...) NAME 355*387f9dfdSAndroid Build Coastguard Worker 356*387f9dfdSAndroid Build Coastguard Worker // Define a LPM trie function, some arguments optional 357*387f9dfdSAndroid Build Coastguard Worker // BPF_LPM_TRIE(name, key_type=u64, leaf_type=u64, size=10240) 358*387f9dfdSAndroid Build Coastguard Worker #define BPF_LPM_TRIE(...) \ 359*387f9dfdSAndroid Build Coastguard Worker BPF_LPM_TRIEX(__VA_ARGS__, BPF_LPM_TRIE4, BPF_LPM_TRIE3, BPF_LPM_TRIE2, BPF_LPM_TRIE1)(__VA_ARGS__) 360*387f9dfdSAndroid Build Coastguard Worker 361*387f9dfdSAndroid Build Coastguard Worker struct bpf_stacktrace { 362*387f9dfdSAndroid Build Coastguard Worker u64 ip[BPF_MAX_STACK_DEPTH]; 363*387f9dfdSAndroid Build Coastguard Worker }; 364*387f9dfdSAndroid Build Coastguard Worker 365*387f9dfdSAndroid Build Coastguard Worker struct bpf_stacktrace_buildid { 366*387f9dfdSAndroid Build Coastguard Worker struct bpf_stack_build_id trace[BPF_MAX_STACK_DEPTH]; 367*387f9dfdSAndroid Build Coastguard Worker }; 368*387f9dfdSAndroid Build Coastguard Worker 369*387f9dfdSAndroid Build Coastguard Worker #define BPF_STACK_TRACE(_name, _max_entries) \ 370*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("stacktrace", int, struct bpf_stacktrace, _name, roundup_pow_of_two(_max_entries)) 371*387f9dfdSAndroid Build Coastguard Worker 372*387f9dfdSAndroid Build Coastguard Worker #define BPF_STACK_TRACE_BUILDID(_name, _max_entries) \ 373*387f9dfdSAndroid Build Coastguard Worker BPF_F_TABLE("stacktrace", int, struct bpf_stacktrace_buildid, _name, roundup_pow_of_two(_max_entries), BPF_F_STACK_BUILD_ID) 374*387f9dfdSAndroid Build Coastguard Worker 375*387f9dfdSAndroid Build Coastguard Worker #define BPF_PROG_ARRAY(_name, _max_entries) \ 376*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("prog", u32, u32, _name, _max_entries) 377*387f9dfdSAndroid Build Coastguard Worker 378*387f9dfdSAndroid Build Coastguard Worker #define BPF_XDP_REDIRECT_MAP(_table_type, _leaf_type, _name, _max_entries) \ 379*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \ 380*387f9dfdSAndroid Build Coastguard Worker u32 key; \ 381*387f9dfdSAndroid Build Coastguard Worker _leaf_type leaf; \ 382*387f9dfdSAndroid Build Coastguard Worker /* xdp_act = map.redirect_map(index, flag) */ \ 383*387f9dfdSAndroid Build Coastguard Worker u64 (*redirect_map) (int, int); \ 384*387f9dfdSAndroid Build Coastguard Worker u32 max_entries; \ 385*387f9dfdSAndroid Build Coastguard Worker }; \ 386*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/"_table_type))) \ 387*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = (_max_entries) } 388*387f9dfdSAndroid Build Coastguard Worker 389*387f9dfdSAndroid Build Coastguard Worker #define BPF_DEVMAP(_name, _max_entries) \ 390*387f9dfdSAndroid Build Coastguard Worker BPF_XDP_REDIRECT_MAP("devmap", int, _name, _max_entries) 391*387f9dfdSAndroid Build Coastguard Worker 392*387f9dfdSAndroid Build Coastguard Worker #define BPF_CPUMAP(_name, _max_entries) \ 393*387f9dfdSAndroid Build Coastguard Worker BPF_XDP_REDIRECT_MAP("cpumap", u32, _name, _max_entries) 394*387f9dfdSAndroid Build Coastguard Worker 395*387f9dfdSAndroid Build Coastguard Worker #define _BPF_XSKMAP(_name, _max_entries, _pinned) \ 396*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \ 397*387f9dfdSAndroid Build Coastguard Worker u32 key; \ 398*387f9dfdSAndroid Build Coastguard Worker int leaf; \ 399*387f9dfdSAndroid Build Coastguard Worker int * (*lookup) (int *); \ 400*387f9dfdSAndroid Build Coastguard Worker /* xdp_act = map.redirect_map(index, flag) */ \ 401*387f9dfdSAndroid Build Coastguard Worker u64 (*redirect_map) (int, int); \ 402*387f9dfdSAndroid Build Coastguard Worker u32 max_entries; \ 403*387f9dfdSAndroid Build Coastguard Worker }; \ 404*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/xskmap" _pinned))) \ 405*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = (_max_entries) } 406*387f9dfdSAndroid Build Coastguard Worker #define BPF_XSKMAP2(_name, _max_entries) _BPF_XSKMAP(_name, _max_entries, "") 407*387f9dfdSAndroid Build Coastguard Worker #define BPF_XSKMAP3(_name, _max_entries, _pinned) _BPF_XSKMAP(_name, _max_entries, ":" _pinned) 408*387f9dfdSAndroid Build Coastguard Worker #define BPF_XSKMAPX(_1, _2, _3, NAME, ...) NAME 409*387f9dfdSAndroid Build Coastguard Worker #define BPF_XSKMAP(...) BPF_XSKMAPX(__VA_ARGS__, BPF_XSKMAP3, BPF_XSKMAP2)(__VA_ARGS__) 410*387f9dfdSAndroid Build Coastguard Worker 411*387f9dfdSAndroid Build Coastguard Worker #define BPF_ARRAY_OF_MAPS(_name, _inner_map_name, _max_entries) \ 412*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("array_of_maps$" _inner_map_name, int, int, _name, _max_entries) 413*387f9dfdSAndroid Build Coastguard Worker 414*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH_OF_MAPS2(_name, _inner_map_name) \ 415*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("hash_of_maps$" _inner_map_name, int, int, _name, 10240) 416*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH_OF_MAPS3(_name, _key_type, _inner_map_name) \ 417*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("hash_of_maps$" _inner_map_name, _key_type, int, _name, 10240) 418*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH_OF_MAPS4(_name, _key_type, _inner_map_name, _max_entries) \ 419*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE("hash_of_maps$" _inner_map_name, _key_type, int, _name, _max_entries) 420*387f9dfdSAndroid Build Coastguard Worker 421*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH_OF_MAPSX(_name, _2, _3, _4, NAME, ...) NAME 422*387f9dfdSAndroid Build Coastguard Worker 423*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH_OF_MAPS(...) \ 424*387f9dfdSAndroid Build Coastguard Worker BPF_HASH_OF_MAPSX(__VA_ARGS__, BPF_HASH_OF_MAPS4, BPF_HASH_OF_MAPS3, BPF_HASH_OF_MAPS2)(__VA_ARGS__) 425*387f9dfdSAndroid Build Coastguard Worker 426*387f9dfdSAndroid Build Coastguard Worker #define BPF_SK_STORAGE(_name, _leaf_type) \ 427*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \ 428*387f9dfdSAndroid Build Coastguard Worker int key; \ 429*387f9dfdSAndroid Build Coastguard Worker _leaf_type leaf; \ 430*387f9dfdSAndroid Build Coastguard Worker void * (*sk_storage_get) (void *, void *, int); \ 431*387f9dfdSAndroid Build Coastguard Worker int (*sk_storage_delete) (void *); \ 432*387f9dfdSAndroid Build Coastguard Worker u32 flags; \ 433*387f9dfdSAndroid Build Coastguard Worker }; \ 434*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/sk_storage"))) \ 435*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .flags = BPF_F_NO_PREALLOC }; \ 436*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR(_name, int, _leaf_type) 437*387f9dfdSAndroid Build Coastguard Worker 438*387f9dfdSAndroid Build Coastguard Worker #define BPF_INODE_STORAGE(_name, _leaf_type) \ 439*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \ 440*387f9dfdSAndroid Build Coastguard Worker int key; \ 441*387f9dfdSAndroid Build Coastguard Worker _leaf_type leaf; \ 442*387f9dfdSAndroid Build Coastguard Worker void * (*inode_storage_get) (void *, void *, int); \ 443*387f9dfdSAndroid Build Coastguard Worker int (*inode_storage_delete) (void *); \ 444*387f9dfdSAndroid Build Coastguard Worker u32 flags; \ 445*387f9dfdSAndroid Build Coastguard Worker }; \ 446*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/inode_storage"))) \ 447*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .flags = BPF_F_NO_PREALLOC }; \ 448*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR(_name, int, _leaf_type) 449*387f9dfdSAndroid Build Coastguard Worker 450*387f9dfdSAndroid Build Coastguard Worker #define BPF_TASK_STORAGE(_name, _leaf_type) \ 451*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \ 452*387f9dfdSAndroid Build Coastguard Worker int key; \ 453*387f9dfdSAndroid Build Coastguard Worker _leaf_type leaf; \ 454*387f9dfdSAndroid Build Coastguard Worker void * (*task_storage_get) (void *, void *, int); \ 455*387f9dfdSAndroid Build Coastguard Worker int (*task_storage_delete) (void *); \ 456*387f9dfdSAndroid Build Coastguard Worker u32 flags; \ 457*387f9dfdSAndroid Build Coastguard Worker }; \ 458*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/task_storage"))) \ 459*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .flags = BPF_F_NO_PREALLOC }; \ 460*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR(_name, int, _leaf_type) 461*387f9dfdSAndroid Build Coastguard Worker 462*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKMAP_COMMON(_name, _max_entries, _kind, _helper_name) \ 463*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \ 464*387f9dfdSAndroid Build Coastguard Worker u32 key; \ 465*387f9dfdSAndroid Build Coastguard Worker int leaf; \ 466*387f9dfdSAndroid Build Coastguard Worker int (*update) (u32 *, int *); \ 467*387f9dfdSAndroid Build Coastguard Worker int (*delete) (u32 *); \ 468*387f9dfdSAndroid Build Coastguard Worker /* ret = map.sock_map_update(ctx, key, flag) */ \ 469*387f9dfdSAndroid Build Coastguard Worker int (* _helper_name) (void *, void *, u64); \ 470*387f9dfdSAndroid Build Coastguard Worker u32 max_entries; \ 471*387f9dfdSAndroid Build Coastguard Worker }; \ 472*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/" _kind))) \ 473*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = (_max_entries) }; \ 474*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR(_name, u32, int) 475*387f9dfdSAndroid Build Coastguard Worker 476*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKMAP(_name, _max_entries) \ 477*387f9dfdSAndroid Build Coastguard Worker BPF_SOCKMAP_COMMON(_name, _max_entries, "sockmap", sock_map_update) 478*387f9dfdSAndroid Build Coastguard Worker 479*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKHASH_COMMON(_name, _key_type, _max_entries) \ 480*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t {\ 481*387f9dfdSAndroid Build Coastguard Worker _key_type key;\ 482*387f9dfdSAndroid Build Coastguard Worker int leaf; \ 483*387f9dfdSAndroid Build Coastguard Worker int (*update) (_key_type *, int *); \ 484*387f9dfdSAndroid Build Coastguard Worker int (*delete) (_key_type *); \ 485*387f9dfdSAndroid Build Coastguard Worker int (*sock_hash_update) (void *, void *, u64); \ 486*387f9dfdSAndroid Build Coastguard Worker int (*msg_redirect_hash) (void *, void *, u64); \ 487*387f9dfdSAndroid Build Coastguard Worker int (*sk_redirect_hash) (void *, void *, u64); \ 488*387f9dfdSAndroid Build Coastguard Worker u32 max_entries; \ 489*387f9dfdSAndroid Build Coastguard Worker }; \ 490*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/sockhash"))) \ 491*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = (_max_entries) }; \ 492*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR(_name, _key_type, int) 493*387f9dfdSAndroid Build Coastguard Worker 494*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKHASH1(_name) \ 495*387f9dfdSAndroid Build Coastguard Worker BPF_SOCKHASH_COMMON(_name, u32, 10240) 496*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKHASH2(_name, _key_type) \ 497*387f9dfdSAndroid Build Coastguard Worker BPF_SOCKHASH_COMMON(_name, _key_type, 10240) 498*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKHASH3(_name, _key_type, _max_entries) \ 499*387f9dfdSAndroid Build Coastguard Worker BPF_SOCKHASH_COMMON(_name, _key_type, _max_entries) 500*387f9dfdSAndroid Build Coastguard Worker 501*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKHASHX(_1, _2, _3, NAME, ...) NAME 502*387f9dfdSAndroid Build Coastguard Worker // We can define a five-tuple as the key, and basically never define the val type. 503*387f9dfdSAndroid Build Coastguard Worker // BPF_SOCKHASH(name, key_type=u64, size=10240) 504*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKHASH(...) \ 505*387f9dfdSAndroid Build Coastguard Worker BPF_SOCKHASHX(__VA_ARGS__, BPF_SOCKHASH3, BPF_SOCKHASH2, BPF_SOCKHASH1)(__VA_ARGS__) 506*387f9dfdSAndroid Build Coastguard Worker 507*387f9dfdSAndroid Build Coastguard Worker #define BPF_CGROUP_STORAGE_COMMON(_name, _leaf_type, _kind) \ 508*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \ 509*387f9dfdSAndroid Build Coastguard Worker struct bpf_cgroup_storage_key key; \ 510*387f9dfdSAndroid Build Coastguard Worker _leaf_type leaf; \ 511*387f9dfdSAndroid Build Coastguard Worker _leaf_type * (*lookup) (struct bpf_cgroup_storage_key *); \ 512*387f9dfdSAndroid Build Coastguard Worker int (*update) (struct bpf_cgroup_storage_key *, _leaf_type *); \ 513*387f9dfdSAndroid Build Coastguard Worker int (*get_local_storage) (u64); \ 514*387f9dfdSAndroid Build Coastguard Worker }; \ 515*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/" _kind))) \ 516*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { 0 }; \ 517*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR(_name, struct bpf_cgroup_storage_key, _leaf_type) 518*387f9dfdSAndroid Build Coastguard Worker 519*387f9dfdSAndroid Build Coastguard Worker #define BPF_CGROUP_STORAGE(_name, _leaf_type) \ 520*387f9dfdSAndroid Build Coastguard Worker BPF_CGROUP_STORAGE_COMMON(_name, _leaf_type, "cgroup_storage") 521*387f9dfdSAndroid Build Coastguard Worker 522*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_CGROUP_STORAGE(_name, _leaf_type) \ 523*387f9dfdSAndroid Build Coastguard Worker BPF_CGROUP_STORAGE_COMMON(_name, _leaf_type, "percpu_cgroup_storage") 524*387f9dfdSAndroid Build Coastguard Worker 525*387f9dfdSAndroid Build Coastguard Worker // packet parsing state machine helpers 526*387f9dfdSAndroid Build Coastguard Worker #define cursor_advance(_cursor, _len) \ 527*387f9dfdSAndroid Build Coastguard Worker ({ void *_tmp = _cursor; _cursor += _len; _tmp; }) 528*387f9dfdSAndroid Build Coastguard Worker 529*387f9dfdSAndroid Build Coastguard Worker #ifdef LINUX_VERSION_CODE_OVERRIDE 530*387f9dfdSAndroid Build Coastguard Worker unsigned _version BCC_SEC("version") = LINUX_VERSION_CODE_OVERRIDE; 531*387f9dfdSAndroid Build Coastguard Worker #else 532*387f9dfdSAndroid Build Coastguard Worker unsigned _version BCC_SEC("version") = LINUX_VERSION_CODE; 533*387f9dfdSAndroid Build Coastguard Worker #endif 534*387f9dfdSAndroid Build Coastguard Worker 535*387f9dfdSAndroid Build Coastguard Worker /* helper functions called from eBPF programs written in C */ 536*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_map_lookup_elem)(void *map, void *key) = 537*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_map_lookup_elem; 538*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_map_update_elem)(void *map, void *key, void *value, u64 flags) = 539*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_map_update_elem; 540*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_map_delete_elem)(void *map, void *key) = 541*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_map_delete_elem; 542*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_probe_read)(void *dst, u64 size, const void *unsafe_ptr) = 543*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_probe_read; 544*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_ktime_get_ns)(void) = 545*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_ktime_get_ns; 546*387f9dfdSAndroid Build Coastguard Worker static u32 (*bpf_get_prandom_u32)(void) = 547*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_prandom_u32; 548*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_trace_printk_)(const char *fmt, u64 fmt_size, ...) = 549*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_trace_printk; 550*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_probe_read_str)(void *dst, u64 size, const void *unsafe_ptr) = 551*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_probe_read_str; 552*387f9dfdSAndroid Build Coastguard Worker int bpf_trace_printk(const char *fmt, ...) asm("llvm.bpf.extra"); 553*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 554*387f9dfdSAndroid Build Coastguard Worker void bpf_tail_call_(void *map_fd, void *ctx, int index) { 555*387f9dfdSAndroid Build Coastguard Worker ((void (*)(void *, u64, int))BPF_FUNC_tail_call)(ctx, (u64)map_fd, index); 556*387f9dfdSAndroid Build Coastguard Worker } 557*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_clone_redirect)(void *ctx, int ifindex, u32 flags) = 558*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_clone_redirect; 559*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_get_smp_processor_id)(void) = 560*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_smp_processor_id; 561*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_get_current_pid_tgid)(void) = 562*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_current_pid_tgid; 563*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_get_current_uid_gid)(void) = 564*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_current_uid_gid; 565*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_get_current_comm)(void *buf, int buf_size) = 566*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_current_comm; 567*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_get_cgroup_classid)(void *ctx) = 568*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_cgroup_classid; 569*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_skb_vlan_push)(void *ctx, u16 proto, u16 vlan_tci) = 570*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_vlan_push; 571*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_skb_vlan_pop)(void *ctx) = 572*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_vlan_pop; 573*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_get_tunnel_key)(void *ctx, void *to, u32 size, u64 flags) = 574*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_get_tunnel_key; 575*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_set_tunnel_key)(void *ctx, void *from, u32 size, u64 flags) = 576*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_set_tunnel_key; 577*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_perf_event_read)(void *map, u64 flags) = 578*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_perf_event_read; 579*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_redirect)(int ifindex, u32 flags) = 580*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_redirect; 581*387f9dfdSAndroid Build Coastguard Worker static u32 (*bpf_get_route_realm)(void *ctx) = 582*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_route_realm; 583*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_perf_event_output)(void *ctx, void *map, u64 index, void *data, u32 size) = 584*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_perf_event_output; 585*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_load_bytes)(void *ctx, int offset, void *to, u32 len) = 586*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_load_bytes; 587*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_perf_event_read_value)(void *map, u64 flags, void *buf, u32 buf_size) = 588*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_perf_event_read_value; 589*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_perf_prog_read_value)(void *ctx, void *buf, u32 buf_size) = 590*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_perf_prog_read_value; 591*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_current_task_under_cgroup)(void *map, int index) = 592*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_current_task_under_cgroup; 593*387f9dfdSAndroid Build Coastguard Worker static u32 (*bpf_get_socket_cookie)(void *ctx) = 594*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_socket_cookie; 595*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_get_socket_uid)(void *ctx) = 596*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_socket_uid; 597*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_getsockopt)(void *ctx, int level, int optname, void *optval, int optlen) = 598*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_getsockopt; 599*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_redirect_map)(void *map, int key, int flags) = 600*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_redirect_map; 601*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_set_hash)(void *ctx, u32 hash) = 602*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_set_hash; 603*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_setsockopt)(void *ctx, int level, int optname, void *optval, int optlen) = 604*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_setsockopt; 605*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_adjust_room)(void *ctx, int len_diff, u32 mode, u64 flags) = 606*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_adjust_room; 607*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_under_cgroup)(void *ctx, void *map, int index) = 608*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_under_cgroup; 609*387f9dfdSAndroid Build Coastguard Worker static struct bpf_sock *(*bpf_skc_lookup_tcp)(void *ctx, struct bpf_sock_tuple *tuple, int size, 610*387f9dfdSAndroid Build Coastguard Worker unsigned long long netns_id, 611*387f9dfdSAndroid Build Coastguard Worker unsigned long long flags) = 612*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skc_lookup_tcp; 613*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sk_redirect_map)(void *ctx, void *map, int key, int flags) = 614*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_sk_redirect_map; 615*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sock_map_update)(void *map, void *key, void *value, unsigned long long flags) = 616*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_sock_map_update; 617*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_strtol)(const char *buf, size_t buf_len, u64 flags, long *res) = 618*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_strtol; 619*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_strtoul)(const char *buf, size_t buf_len, u64 flags, unsigned long *res) = 620*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_strtoul; 621*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sysctl_get_current_value)(struct bpf_sysctl *ctx, char *buf, size_t buf_len) = 622*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_sysctl_get_current_value; 623*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sysctl_get_name)(struct bpf_sysctl *ctx, char *buf, size_t buf_len, u64 flags) = 624*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_sysctl_get_name; 625*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sysctl_get_new_value)(struct bpf_sysctl *ctx, char *buf, size_t buf_len) = 626*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_sysctl_get_new_value; 627*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sysctl_set_new_value)(struct bpf_sysctl *ctx, const char *buf, size_t buf_len) = 628*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_sysctl_set_new_value; 629*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_tcp_check_syncookie)(void *sk, void *ip, int ip_len, void *tcp, 630*387f9dfdSAndroid Build Coastguard Worker int tcp_len) = 631*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_tcp_check_syncookie; 632*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_xdp_adjust_meta)(void *ctx, int offset) = 633*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_xdp_adjust_meta; 634*387f9dfdSAndroid Build Coastguard Worker 635*387f9dfdSAndroid Build Coastguard Worker /* bcc_get_stackid will return a negative value in the case of an error 636*387f9dfdSAndroid Build Coastguard Worker * 637*387f9dfdSAndroid Build Coastguard Worker * BPF_STACK_TRACE(_name, _size) will allocate space for _size stack traces. 638*387f9dfdSAndroid Build Coastguard Worker * -ENOMEM will be returned when this limit is reached. 639*387f9dfdSAndroid Build Coastguard Worker * 640*387f9dfdSAndroid Build Coastguard Worker * -EFAULT is typically returned when requesting user-space stack straces (using 641*387f9dfdSAndroid Build Coastguard Worker * BPF_F_USER_STACK) for kernel threads. However, a valid stackid may be 642*387f9dfdSAndroid Build Coastguard Worker * returned in some cases; consider a tracepoint or kprobe executing in the 643*387f9dfdSAndroid Build Coastguard Worker * kernel context. Given this you can typically ignore -EFAULT errors when 644*387f9dfdSAndroid Build Coastguard Worker * retrieving user-space stack traces. 645*387f9dfdSAndroid Build Coastguard Worker */ 646*387f9dfdSAndroid Build Coastguard Worker static int (*bcc_get_stackid_)(void *ctx, void *map, u64 flags) = 647*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_stackid; 648*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 649*387f9dfdSAndroid Build Coastguard Worker int bcc_get_stackid(uintptr_t map, void *ctx, u64 flags) { 650*387f9dfdSAndroid Build Coastguard Worker return bcc_get_stackid_(ctx, (void *)map, flags); 651*387f9dfdSAndroid Build Coastguard Worker } 652*387f9dfdSAndroid Build Coastguard Worker 653*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_csum_diff)(void *from, u64 from_size, void *to, u64 to_size, u64 seed) = 654*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_csum_diff; 655*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_get_tunnel_opt)(void *ctx, void *md, u32 size) = 656*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_get_tunnel_opt; 657*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_set_tunnel_opt)(void *ctx, void *md, u32 size) = 658*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_set_tunnel_opt; 659*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_change_proto)(void *ctx, u16 proto, u64 flags) = 660*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_change_proto; 661*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_change_type)(void *ctx, u32 type) = 662*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_change_type; 663*387f9dfdSAndroid Build Coastguard Worker static u32 (*bpf_get_hash_recalc)(void *ctx) = 664*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_hash_recalc; 665*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_get_current_task)(void) = 666*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_current_task; 667*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_probe_write_user)(void *dst, void *src, u32 size) = 668*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_probe_write_user; 669*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_change_tail)(void *ctx, u32 new_len, u64 flags) = 670*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_change_tail; 671*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_pull_data)(void *ctx, u32 len) = 672*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_pull_data; 673*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_csum_update)(void *ctx, u16 csum) = 674*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_csum_update; 675*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_set_hash_invalid)(void *ctx) = 676*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_set_hash_invalid; 677*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_get_numa_node_id)(void) = 678*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_numa_node_id; 679*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_change_head)(void *ctx, u32 len, u64 flags) = 680*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_change_head; 681*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_xdp_adjust_head)(void *ctx, int offset) = 682*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_xdp_adjust_head; 683*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_override_return)(void *pt_regs, unsigned long rc) = 684*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_override_return; 685*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sock_ops_cb_flags_set)(void *skops, int flags) = 686*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_sock_ops_cb_flags_set; 687*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_msg_redirect_map)(void *msg, void *map, u32 key, u64 flags) = 688*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_msg_redirect_map; 689*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_msg_apply_bytes)(void *msg, u32 bytes) = 690*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_msg_apply_bytes; 691*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_msg_cork_bytes)(void *msg, u32 bytes) = 692*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_msg_cork_bytes; 693*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_msg_pull_data)(void *msg, u32 start, u32 end, u64 flags) = 694*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_msg_pull_data; 695*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_bind)(void *ctx, void *addr, int addr_len) = 696*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_bind; 697*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_xdp_adjust_tail)(void *ctx, int offset) = 698*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_xdp_adjust_tail; 699*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_get_xfrm_state)(void *ctx, u32 index, void *xfrm_state, u32 size, u64 flags) = 700*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_get_xfrm_state; 701*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_get_stack)(void *ctx, void *buf, u32 size, u64 flags) = 702*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_stack; 703*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_load_bytes_relative)(void *ctx, u32 offset, void *to, u32 len, u32 start_header) = 704*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_load_bytes_relative; 705*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_fib_lookup)(void *ctx, void *params, int plen, u32 flags) = 706*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_fib_lookup; 707*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sock_hash_update)(void *ctx, void *map, void *key, u64 flags) = 708*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_sock_hash_update; 709*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_msg_redirect_hash)(void *ctx, void *map, void *key, u64 flags) = 710*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_msg_redirect_hash; 711*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sk_redirect_hash)(void *ctx, void *map, void *key, u64 flags) = 712*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_sk_redirect_hash; 713*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_lwt_push_encap)(void *skb, u32 type, void *hdr, u32 len) = 714*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_lwt_push_encap; 715*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_lwt_seg6_store_bytes)(void *ctx, u32 offset, const void *from, u32 len) = 716*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_lwt_seg6_store_bytes; 717*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_lwt_seg6_adjust_srh)(void *ctx, u32 offset, s32 delta) = 718*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_lwt_seg6_adjust_srh; 719*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_lwt_seg6_action)(void *ctx, u32 action, void *param, u32 param_len) = 720*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_lwt_seg6_action; 721*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_rc_keydown)(void *ctx, u32 protocol, u64 scancode, u32 toggle) = 722*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_rc_keydown; 723*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_rc_repeat)(void *ctx) = 724*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_rc_repeat; 725*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_skb_cgroup_id)(void *skb) = 726*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_cgroup_id; 727*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_get_current_cgroup_id)(void) = 728*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_current_cgroup_id; 729*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_skb_ancestor_cgroup_id)(void *skb, int ancestor_level) = 730*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_ancestor_cgroup_id; 731*387f9dfdSAndroid Build Coastguard Worker static void * (*bpf_get_local_storage)(void *map, u64 flags) = 732*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_local_storage; 733*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sk_select_reuseport)(void *reuse, void *map, void *key, u64 flags) = 734*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_sk_select_reuseport; 735*387f9dfdSAndroid Build Coastguard Worker static struct bpf_sock *(*bpf_sk_lookup_tcp)(void *ctx, 736*387f9dfdSAndroid Build Coastguard Worker struct bpf_sock_tuple *tuple, 737*387f9dfdSAndroid Build Coastguard Worker int size, unsigned int netns_id, 738*387f9dfdSAndroid Build Coastguard Worker unsigned long long flags) = 739*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_sk_lookup_tcp; 740*387f9dfdSAndroid Build Coastguard Worker static struct bpf_sock *(*bpf_sk_lookup_udp)(void *ctx, 741*387f9dfdSAndroid Build Coastguard Worker struct bpf_sock_tuple *tuple, 742*387f9dfdSAndroid Build Coastguard Worker int size, unsigned int netns_id, 743*387f9dfdSAndroid Build Coastguard Worker unsigned long long flags) = 744*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_sk_lookup_udp; 745*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sk_release)(void *sk) = 746*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_sk_release; 747*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_map_push_elem)(void *map, const void *value, u64 flags) = 748*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_map_push_elem; 749*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_map_pop_elem)(void *map, void *value) = 750*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_map_pop_elem; 751*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_map_peek_elem)(void *map, void *value) = 752*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_map_peek_elem; 753*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_msg_push_data)(void *skb, u32 start, u32 len, u64 flags) = 754*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_msg_push_data; 755*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_msg_pop_data)(void *msg, u32 start, u32 pop, u64 flags) = 756*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_msg_pop_data; 757*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_rc_pointer_rel)(void *ctx, s32 rel_x, s32 rel_y) = 758*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_rc_pointer_rel; 759*387f9dfdSAndroid Build Coastguard Worker static void (*bpf_spin_lock)(struct bpf_spin_lock *lock) = 760*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_spin_lock; 761*387f9dfdSAndroid Build Coastguard Worker static void (*bpf_spin_unlock)(struct bpf_spin_lock *lock) = 762*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_spin_unlock; 763*387f9dfdSAndroid Build Coastguard Worker static struct bpf_sock *(*bpf_sk_fullsock)(struct bpf_sock *sk) = 764*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_sk_fullsock; 765*387f9dfdSAndroid Build Coastguard Worker static struct bpf_tcp_sock *(*bpf_tcp_sock)(struct bpf_sock *sk) = 766*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_tcp_sock; 767*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_ecn_set_ce)(void *ctx) = 768*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_ecn_set_ce; 769*387f9dfdSAndroid Build Coastguard Worker static struct bpf_sock *(*bpf_get_listener_sock)(struct bpf_sock *sk) = 770*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_get_listener_sock; 771*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_sk_storage_get)(void *map, void *sk, 772*387f9dfdSAndroid Build Coastguard Worker void *value, __u64 flags) = 773*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_sk_storage_get; 774*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sk_storage_delete)(void *map, void *sk) = 775*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_sk_storage_delete; 776*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_send_signal)(unsigned sig) = (void *)BPF_FUNC_send_signal; 777*387f9dfdSAndroid Build Coastguard Worker static long long (*bpf_tcp_gen_syncookie)(void *sk, void *ip, 778*387f9dfdSAndroid Build Coastguard Worker int ip_len, void *tcp, int tcp_len) = 779*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_tcp_gen_syncookie; 780*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_output)(void *ctx, void *map, __u64 flags, void *data, 781*387f9dfdSAndroid Build Coastguard Worker __u64 size) = 782*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_skb_output; 783*387f9dfdSAndroid Build Coastguard Worker 784*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_probe_read_user)(void *dst, __u32 size, 785*387f9dfdSAndroid Build Coastguard Worker const void *unsafe_ptr) = 786*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_probe_read_user; 787*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_probe_read_kernel)(void *dst, __u32 size, 788*387f9dfdSAndroid Build Coastguard Worker const void *unsafe_ptr) = 789*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_probe_read_kernel; 790*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_probe_read_user_str)(void *dst, __u32 size, 791*387f9dfdSAndroid Build Coastguard Worker const void *unsafe_ptr) = 792*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_probe_read_user_str; 793*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_probe_read_kernel_str)(void *dst, __u32 size, 794*387f9dfdSAndroid Build Coastguard Worker const void *unsafe_ptr) = 795*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_probe_read_kernel_str; 796*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_tcp_send_ack)(void *tp, __u32 rcv_nxt) = 797*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_tcp_send_ack; 798*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_send_signal_thread)(__u32 sig) = 799*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_send_signal_thread; 800*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_jiffies64)(void) = (void *)BPF_FUNC_jiffies64; 801*387f9dfdSAndroid Build Coastguard Worker 802*387f9dfdSAndroid Build Coastguard Worker struct bpf_perf_event_data; 803*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_read_branch_records)(struct bpf_perf_event_data *ctx, void *buf, 804*387f9dfdSAndroid Build Coastguard Worker __u32 size, __u64 flags) = 805*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_read_branch_records; 806*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_get_ns_current_pid_tgid)(__u64 dev, __u64 ino, 807*387f9dfdSAndroid Build Coastguard Worker struct bpf_pidns_info *nsdata, 808*387f9dfdSAndroid Build Coastguard Worker __u32 size) = 809*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_get_ns_current_pid_tgid; 810*387f9dfdSAndroid Build Coastguard Worker 811*387f9dfdSAndroid Build Coastguard Worker struct bpf_map; 812*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_xdp_output)(void *ctx, struct bpf_map *map, __u64 flags, 813*387f9dfdSAndroid Build Coastguard Worker void *data, __u64 size) = 814*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_xdp_output; 815*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_get_netns_cookie)(void *ctx) = (void *)BPF_FUNC_get_netns_cookie; 816*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_get_current_ancestor_cgroup_id)(int ancestor_level) = 817*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_get_current_ancestor_cgroup_id; 818*387f9dfdSAndroid Build Coastguard Worker 819*387f9dfdSAndroid Build Coastguard Worker struct sk_buff; 820*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sk_assign)(void *skb, void *sk, __u64 flags) = 821*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_sk_assign; 822*387f9dfdSAndroid Build Coastguard Worker 823*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_ktime_get_boot_ns)(void) = (void *)BPF_FUNC_ktime_get_boot_ns; 824*387f9dfdSAndroid Build Coastguard Worker 825*387f9dfdSAndroid Build Coastguard Worker struct seq_file; 826*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_seq_printf)(struct seq_file *m, const char *fmt, __u32 fmt_size, 827*387f9dfdSAndroid Build Coastguard Worker const void *data, __u32 data_len) = 828*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_seq_printf; 829*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_seq_write)(struct seq_file *m, const void *data, __u32 len) = 830*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_seq_write; 831*387f9dfdSAndroid Build Coastguard Worker 832*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_sk_cgroup_id)(void *sk) = (void *)BPF_FUNC_sk_cgroup_id; 833*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_sk_ancestor_cgroup_id)(void *sk, int ancestor_level) = 834*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_sk_ancestor_cgroup_id; 835*387f9dfdSAndroid Build Coastguard Worker 836*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_ringbuf_output)(void *ringbuf, void *data, __u64 size, __u64 flags) = 837*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_ringbuf_output; 838*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_ringbuf_reserve)(void *ringbuf, __u64 size, __u64 flags) = 839*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_ringbuf_reserve; 840*387f9dfdSAndroid Build Coastguard Worker static void (*bpf_ringbuf_submit)(void *data, __u64 flags) = 841*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_ringbuf_submit; 842*387f9dfdSAndroid Build Coastguard Worker static void (*bpf_ringbuf_discard)(void *data, __u64 flags) = 843*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_ringbuf_discard; 844*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_ringbuf_query)(void *ringbuf, __u64 flags) = 845*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_ringbuf_query; 846*387f9dfdSAndroid Build Coastguard Worker 847*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_csum_level)(struct __sk_buff *skb, __u64 level) = 848*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_csum_level; 849*387f9dfdSAndroid Build Coastguard Worker 850*387f9dfdSAndroid Build Coastguard Worker struct tcp6_sock; 851*387f9dfdSAndroid Build Coastguard Worker struct tcp_sock; 852*387f9dfdSAndroid Build Coastguard Worker struct tcp_timewait_sock; 853*387f9dfdSAndroid Build Coastguard Worker struct tcp_request_sock; 854*387f9dfdSAndroid Build Coastguard Worker struct udp6_sock; 855*387f9dfdSAndroid Build Coastguard Worker static struct tcp6_sock *(*bpf_skc_to_tcp6_sock)(void *sk) = 856*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_skc_to_tcp6_sock; 857*387f9dfdSAndroid Build Coastguard Worker static struct tcp_sock *(*bpf_skc_to_tcp_sock)(void *sk) = 858*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_skc_to_tcp_sock; 859*387f9dfdSAndroid Build Coastguard Worker static struct tcp_timewait_sock *(*bpf_skc_to_tcp_timewait_sock)(void *sk) = 860*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_skc_to_tcp_timewait_sock; 861*387f9dfdSAndroid Build Coastguard Worker static struct tcp_request_sock *(*bpf_skc_to_tcp_request_sock)(void *sk) = 862*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_skc_to_tcp_request_sock; 863*387f9dfdSAndroid Build Coastguard Worker static struct udp6_sock *(*bpf_skc_to_udp6_sock)(void *sk) = 864*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_skc_to_udp6_sock; 865*387f9dfdSAndroid Build Coastguard Worker 866*387f9dfdSAndroid Build Coastguard Worker struct task_struct; 867*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_get_task_stack)(struct task_struct *task, void *buf, 868*387f9dfdSAndroid Build Coastguard Worker __u32 size, __u64 flags) = 869*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_get_task_stack; 870*387f9dfdSAndroid Build Coastguard Worker 871*387f9dfdSAndroid Build Coastguard Worker struct bpf_sock_ops; 872*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_load_hdr_opt)(struct bpf_sock_ops *skops, void *searchby_res, 873*387f9dfdSAndroid Build Coastguard Worker u32 len, u64 flags) = 874*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_load_hdr_opt; 875*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_store_hdr_opt)(struct bpf_sock_ops *skops, const void *from, 876*387f9dfdSAndroid Build Coastguard Worker u32 len, u64 flags) = 877*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_store_hdr_opt; 878*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_reserve_hdr_opt)(struct bpf_sock_ops *skops, u32 len, 879*387f9dfdSAndroid Build Coastguard Worker u64 flags) = 880*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_reserve_hdr_opt; 881*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_inode_storage_get)(struct bpf_map *map, void *inode, 882*387f9dfdSAndroid Build Coastguard Worker void *value, u64 flags) = 883*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_inode_storage_get; 884*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_inode_storage_delete)(struct bpf_map *map, void *inode) = 885*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_inode_storage_delete; 886*387f9dfdSAndroid Build Coastguard Worker struct path; 887*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_d_path)(struct path *path, char *buf, u32 sz) = 888*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_d_path; 889*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_copy_from_user)(void *dst, u32 size, const void *user_ptr) = 890*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_copy_from_user; 891*387f9dfdSAndroid Build Coastguard Worker 892*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_snprintf_btf)(char *str, u32 str_size, struct btf_ptr *ptr, 893*387f9dfdSAndroid Build Coastguard Worker u32 btf_ptr_size, u64 flags) = 894*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_snprintf_btf; 895*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_seq_printf_btf)(struct seq_file *m, struct btf_ptr *ptr, 896*387f9dfdSAndroid Build Coastguard Worker u32 ptr_size, u64 flags) = 897*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_seq_printf_btf; 898*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_skb_cgroup_classid)(struct sk_buff *skb) = 899*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_skb_cgroup_classid; 900*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_redirect_neigh)(u32 ifindex, struct bpf_redir_neigh *params, 901*387f9dfdSAndroid Build Coastguard Worker u64 flags) = 902*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_redirect_neigh; 903*387f9dfdSAndroid Build Coastguard Worker static void * (*bpf_per_cpu_ptr)(const void *percpu_ptr, u32 cpu) = 904*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_per_cpu_ptr; 905*387f9dfdSAndroid Build Coastguard Worker static void * (*bpf_this_cpu_ptr)(const void *percpu_ptr) = 906*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_this_cpu_ptr; 907*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_redirect_peer)(u32 ifindex, u64 flags) = (void *)BPF_FUNC_redirect_peer; 908*387f9dfdSAndroid Build Coastguard Worker 909*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_task_storage_get)(void *map, struct task_struct *task, 910*387f9dfdSAndroid Build Coastguard Worker void *value, __u64 flags) = 911*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_task_storage_get; 912*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_task_storage_delete)(void *map, struct task_struct *task) = 913*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_task_storage_delete; 914*387f9dfdSAndroid Build Coastguard Worker static struct task_struct *(*bpf_get_current_task_btf)(void) = 915*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_get_current_task_btf; 916*387f9dfdSAndroid Build Coastguard Worker struct linux_binprm; 917*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_bprm_opts_set)(struct linux_binprm *bprm, __u64 flags) = 918*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_bprm_opts_set; 919*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_ktime_get_coarse_ns)(void) = (void *)BPF_FUNC_ktime_get_coarse_ns; 920*387f9dfdSAndroid Build Coastguard Worker struct inode; 921*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_ima_inode_hash)(struct inode *inode, void *dst, __u32 size) = 922*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_ima_inode_hash; 923*387f9dfdSAndroid Build Coastguard Worker struct file; 924*387f9dfdSAndroid Build Coastguard Worker static struct socket *(*bpf_sock_from_file)(struct file *file) = 925*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_sock_from_file; 926*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_check_mtu)(void *ctx, __u32 ifindex, __u32 *mtu_len, 927*387f9dfdSAndroid Build Coastguard Worker __s32 len_diff, __u64 flags) = 928*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_check_mtu; 929*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_for_each_map_elem)(void *map, void *callback_fn, 930*387f9dfdSAndroid Build Coastguard Worker void *callback_ctx, __u64 flags) = 931*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_for_each_map_elem; 932*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_snprintf)(char *str, __u32 str_size, const char *fmt, 933*387f9dfdSAndroid Build Coastguard Worker __u64 *data, __u32 data_len) = 934*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_snprintf; 935*387f9dfdSAndroid Build Coastguard Worker 936*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_sys_bpf)(__u32 cmd, void *attr, __u32 attr_size) = 937*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_sys_bpf; 938*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_btf_find_by_name_kind)(char *name, int name_sz, __u32 kind, int flags) = 939*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_btf_find_by_name_kind; 940*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_sys_close)(__u32 fd) = (void *)BPF_FUNC_sys_close; 941*387f9dfdSAndroid Build Coastguard Worker 942*387f9dfdSAndroid Build Coastguard Worker struct bpf_timer; 943*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_timer_init)(struct bpf_timer *timer, void *map, __u64 flags) = 944*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_timer_init; 945*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_timer_set_callback)(struct bpf_timer *timer, void *callback_fn) = 946*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_timer_set_callback; 947*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_timer_start)(struct bpf_timer *timer, __u64 nsecs, __u64 flags) = 948*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_timer_start; 949*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_timer_cancel)(struct bpf_timer *timer) = (void *)BPF_FUNC_timer_cancel; 950*387f9dfdSAndroid Build Coastguard Worker 951*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_get_func_ip)(void *ctx) = (void *)BPF_FUNC_get_func_ip; 952*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_get_attach_cookie)(void *ctx) = (void *)BPF_FUNC_get_attach_cookie; 953*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_task_pt_regs)(struct task_struct *task) = (void *)BPF_FUNC_task_pt_regs; 954*387f9dfdSAndroid Build Coastguard Worker 955*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_get_branch_snapshot)(void *entries, __u32 size, __u64 flags) = 956*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_get_branch_snapshot; 957*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_trace_vprintk)(const char *fmt, __u32 fmt_size, const void *data, 958*387f9dfdSAndroid Build Coastguard Worker __u32 data_len) = 959*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_trace_vprintk; 960*387f9dfdSAndroid Build Coastguard Worker static struct unix_sock *(*bpf_skc_to_unix_sock)(void *sk) = 961*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_skc_to_unix_sock; 962*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_kallsyms_lookup_name)(const char *name, int name_sz, int flags, 963*387f9dfdSAndroid Build Coastguard Worker __u64 *res) = 964*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_kallsyms_lookup_name; 965*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_find_vma)(struct task_struct *task, __u64 addr, void *callback_fn, 966*387f9dfdSAndroid Build Coastguard Worker void *callback_ctx, __u64 flags) = 967*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_find_vma; 968*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_loop)(__u32 nr_loops, void *callback_fn, void *callback_ctx, __u64 flags) = 969*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_loop; 970*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_strncmp)(const char *s1, __u32 s1_sz, const char *s2) = 971*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_strncmp; 972*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_get_func_arg)(void *ctx, __u32 n, __u64 *value) = 973*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_get_func_arg; 974*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_get_func_ret)(void *ctx, __u64 *value) = (void *)BPF_FUNC_get_func_ret; 975*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_get_func_arg_cnt)(void *ctx) = (void *)BPF_FUNC_get_func_arg_cnt; 976*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_get_retval)(void) = (void *)BPF_FUNC_get_retval; 977*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_set_retval)(int retval) = (void *)BPF_FUNC_set_retval; 978*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_xdp_get_buff_len)(struct xdp_md *xdp_md) = (void *)BPF_FUNC_xdp_get_buff_len; 979*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_xdp_load_bytes)(struct xdp_md *xdp_md, __u32 offset, void *buf, __u32 len) = 980*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_xdp_load_bytes; 981*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_xdp_store_bytes)(struct xdp_md *xdp_md, __u32 offset, void *buf, __u32 len) = 982*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_xdp_store_bytes; 983*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_copy_from_user_task)(void *dst, __u32 size, const void *user_ptr, 984*387f9dfdSAndroid Build Coastguard Worker struct task_struct *tsk, __u64 flags) = 985*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_copy_from_user_task; 986*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_skb_set_tstamp)(struct __sk_buff *skb, __u64 tstamp, __u32 tstamp_type) = 987*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_skb_set_tstamp; 988*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_ima_file_hash)(struct file *file, void *dst, __u32 size) = 989*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_ima_file_hash; 990*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_kptr_xchg)(void *map_value, void *ptr) = (void *)BPF_FUNC_kptr_xchg; 991*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_map_lookup_percpu_elem)(void *map, const void *key, __u32 cpu) = 992*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_map_lookup_percpu_elem; 993*387f9dfdSAndroid Build Coastguard Worker 994*387f9dfdSAndroid Build Coastguard Worker struct mptcp_sock; 995*387f9dfdSAndroid Build Coastguard Worker struct bpf_dynptr; 996*387f9dfdSAndroid Build Coastguard Worker struct iphdr; 997*387f9dfdSAndroid Build Coastguard Worker struct ipv6hdr; 998*387f9dfdSAndroid Build Coastguard Worker struct tcphdr; 999*387f9dfdSAndroid Build Coastguard Worker static struct mptcp_sock *(*bpf_skc_to_mptcp_sock)(void *sk) = 1000*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_skc_to_mptcp_sock; 1001*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_dynptr_from_mem)(void *data, __u32 size, __u64 flags, 1002*387f9dfdSAndroid Build Coastguard Worker struct bpf_dynptr *ptr) = 1003*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_dynptr_from_mem; 1004*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_ringbuf_reserve_dynptr)(void *ringbuf, __u32 size, __u64 flags, 1005*387f9dfdSAndroid Build Coastguard Worker struct bpf_dynptr *ptr) = 1006*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_ringbuf_reserve_dynptr; 1007*387f9dfdSAndroid Build Coastguard Worker static void (*bpf_ringbuf_submit_dynptr)(struct bpf_dynptr *ptr, __u64 flags) = 1008*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_ringbuf_submit_dynptr; 1009*387f9dfdSAndroid Build Coastguard Worker static void (*bpf_ringbuf_discard_dynptr)(struct bpf_dynptr *ptr, __u64 flags) = 1010*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_ringbuf_discard_dynptr; 1011*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_dynptr_read)(void *dst, __u32 len, const struct bpf_dynptr *src, __u32 offset, 1012*387f9dfdSAndroid Build Coastguard Worker __u64 flags) = 1013*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_dynptr_read; 1014*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_dynptr_write)(const struct bpf_dynptr *dst, __u32 offset, void *src, __u32 len, 1015*387f9dfdSAndroid Build Coastguard Worker __u64 flags) = 1016*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_dynptr_write; 1017*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_dynptr_data)(const struct bpf_dynptr *ptr, __u32 offset, __u32 len) = 1018*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_dynptr_data; 1019*387f9dfdSAndroid Build Coastguard Worker static __s64 (*bpf_tcp_raw_gen_syncookie_ipv4)(struct iphdr *iph, struct tcphdr *th, 1020*387f9dfdSAndroid Build Coastguard Worker __u32 th_len) = 1021*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_tcp_raw_gen_syncookie_ipv4; 1022*387f9dfdSAndroid Build Coastguard Worker static __s64 (*bpf_tcp_raw_gen_syncookie_ipv6)(struct ipv6hdr *iph, struct tcphdr *th, 1023*387f9dfdSAndroid Build Coastguard Worker __u32 th_len) = 1024*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_tcp_raw_gen_syncookie_ipv6; 1025*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_tcp_raw_check_syncookie_ipv4)(struct iphdr *iph, struct tcphdr *th) = 1026*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_tcp_raw_check_syncookie_ipv4; 1027*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_tcp_raw_check_syncookie_ipv6)(struct ipv6hdr *iph, struct tcphdr *th) = 1028*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_tcp_raw_check_syncookie_ipv6; 1029*387f9dfdSAndroid Build Coastguard Worker 1030*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_ktime_get_tai_ns)(void) = (void *)BPF_FUNC_ktime_get_tai_ns; 1031*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_user_ringbuf_drain)(void *map, void *callback_fn, void *ctx, __u64 flags) = 1032*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_user_ringbuf_drain; 1033*387f9dfdSAndroid Build Coastguard Worker 1034*387f9dfdSAndroid Build Coastguard Worker struct cgroup; 1035*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_cgrp_storage_get)(void *map, struct cgroup *cgroup, void *value, __u64 flags) = 1036*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_cgrp_storage_get; 1037*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_cgrp_storage_delete)(void *map, struct cgroup *cgroup) = 1038*387f9dfdSAndroid Build Coastguard Worker (void *)BPF_FUNC_cgrp_storage_delete; 1039*387f9dfdSAndroid Build Coastguard Worker 1040*387f9dfdSAndroid Build Coastguard Worker /* llvm builtin functions that eBPF C program may use to 1041*387f9dfdSAndroid Build Coastguard Worker * emit BPF_LD_ABS and BPF_LD_IND instructions 1042*387f9dfdSAndroid Build Coastguard Worker */ 1043*387f9dfdSAndroid Build Coastguard Worker unsigned long long load_byte(void *skb, 1044*387f9dfdSAndroid Build Coastguard Worker unsigned long long off) asm("llvm.bpf.load.byte"); 1045*387f9dfdSAndroid Build Coastguard Worker unsigned long long load_half(void *skb, 1046*387f9dfdSAndroid Build Coastguard Worker unsigned long long off) asm("llvm.bpf.load.half"); 1047*387f9dfdSAndroid Build Coastguard Worker unsigned long long load_word(void *skb, 1048*387f9dfdSAndroid Build Coastguard Worker unsigned long long off) asm("llvm.bpf.load.word"); 1049*387f9dfdSAndroid Build Coastguard Worker 1050*387f9dfdSAndroid Build Coastguard Worker /* a helper structure used by eBPF C program 1051*387f9dfdSAndroid Build Coastguard Worker * to describe map attributes to elf_bpf loader 1052*387f9dfdSAndroid Build Coastguard Worker */ 1053*387f9dfdSAndroid Build Coastguard Worker struct bpf_map_def { 1054*387f9dfdSAndroid Build Coastguard Worker unsigned int type; 1055*387f9dfdSAndroid Build Coastguard Worker unsigned int key_size; 1056*387f9dfdSAndroid Build Coastguard Worker unsigned int value_size; 1057*387f9dfdSAndroid Build Coastguard Worker unsigned int max_entries; 1058*387f9dfdSAndroid Build Coastguard Worker }; 1059*387f9dfdSAndroid Build Coastguard Worker 1060*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_store_bytes)(void *ctx, unsigned long long off, void *from, 1061*387f9dfdSAndroid Build Coastguard Worker unsigned long long len, unsigned long long flags) = 1062*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_skb_store_bytes; 1063*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_l3_csum_replace)(void *ctx, unsigned long long off, unsigned long long from, 1064*387f9dfdSAndroid Build Coastguard Worker unsigned long long to, unsigned long long flags) = 1065*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_l3_csum_replace; 1066*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_l4_csum_replace)(void *ctx, unsigned long long off, unsigned long long from, 1067*387f9dfdSAndroid Build Coastguard Worker unsigned long long to, unsigned long long flags) = 1068*387f9dfdSAndroid Build Coastguard Worker (void *) BPF_FUNC_l4_csum_replace; 1069*387f9dfdSAndroid Build Coastguard Worker 1070*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1071*387f9dfdSAndroid Build Coastguard Worker u16 bpf_ntohs(u16 val) { 1072*387f9dfdSAndroid Build Coastguard Worker /* will be recognized by gcc into rotate insn and eventually rolw 8 */ 1073*387f9dfdSAndroid Build Coastguard Worker return (val << 8) | (val >> 8); 1074*387f9dfdSAndroid Build Coastguard Worker } 1075*387f9dfdSAndroid Build Coastguard Worker 1076*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1077*387f9dfdSAndroid Build Coastguard Worker u32 bpf_ntohl(u32 val) { 1078*387f9dfdSAndroid Build Coastguard Worker /* gcc will use bswapsi2 insn */ 1079*387f9dfdSAndroid Build Coastguard Worker return __builtin_bswap32(val); 1080*387f9dfdSAndroid Build Coastguard Worker } 1081*387f9dfdSAndroid Build Coastguard Worker 1082*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1083*387f9dfdSAndroid Build Coastguard Worker u64 bpf_ntohll(u64 val) { 1084*387f9dfdSAndroid Build Coastguard Worker /* gcc will use bswapdi2 insn */ 1085*387f9dfdSAndroid Build Coastguard Worker return __builtin_bswap64(val); 1086*387f9dfdSAndroid Build Coastguard Worker } 1087*387f9dfdSAndroid Build Coastguard Worker 1088*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1089*387f9dfdSAndroid Build Coastguard Worker unsigned __int128 bpf_ntoh128(unsigned __int128 val) { 1090*387f9dfdSAndroid Build Coastguard Worker return (((unsigned __int128)bpf_ntohll(val) << 64) | (u64)bpf_ntohll(val >> 64)); 1091*387f9dfdSAndroid Build Coastguard Worker } 1092*387f9dfdSAndroid Build Coastguard Worker 1093*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1094*387f9dfdSAndroid Build Coastguard Worker u16 bpf_htons(u16 val) { 1095*387f9dfdSAndroid Build Coastguard Worker return bpf_ntohs(val); 1096*387f9dfdSAndroid Build Coastguard Worker } 1097*387f9dfdSAndroid Build Coastguard Worker 1098*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1099*387f9dfdSAndroid Build Coastguard Worker u32 bpf_htonl(u32 val) { 1100*387f9dfdSAndroid Build Coastguard Worker return bpf_ntohl(val); 1101*387f9dfdSAndroid Build Coastguard Worker } 1102*387f9dfdSAndroid Build Coastguard Worker 1103*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1104*387f9dfdSAndroid Build Coastguard Worker u64 bpf_htonll(u64 val) { 1105*387f9dfdSAndroid Build Coastguard Worker return bpf_ntohll(val); 1106*387f9dfdSAndroid Build Coastguard Worker } 1107*387f9dfdSAndroid Build Coastguard Worker 1108*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1109*387f9dfdSAndroid Build Coastguard Worker unsigned __int128 bpf_hton128(unsigned __int128 val) { 1110*387f9dfdSAndroid Build Coastguard Worker return bpf_ntoh128(val); 1111*387f9dfdSAndroid Build Coastguard Worker } 1112*387f9dfdSAndroid Build Coastguard Worker 1113*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1114*387f9dfdSAndroid Build Coastguard Worker u64 load_dword(void *skb, u64 off) { 1115*387f9dfdSAndroid Build Coastguard Worker return ((u64)load_word(skb, off) << 32) | load_word(skb, off + 4); 1116*387f9dfdSAndroid Build Coastguard Worker } 1117*387f9dfdSAndroid Build Coastguard Worker 1118*387f9dfdSAndroid Build Coastguard Worker void bpf_store_byte(void *skb, u64 off, u64 val) asm("llvm.bpf.store.byte"); 1119*387f9dfdSAndroid Build Coastguard Worker void bpf_store_half(void *skb, u64 off, u64 val) asm("llvm.bpf.store.half"); 1120*387f9dfdSAndroid Build Coastguard Worker void bpf_store_word(void *skb, u64 off, u64 val) asm("llvm.bpf.store.word"); 1121*387f9dfdSAndroid Build Coastguard Worker u64 bpf_pseudo_fd(u64, u64) asm("llvm.bpf.pseudo"); 1122*387f9dfdSAndroid Build Coastguard Worker 1123*387f9dfdSAndroid Build Coastguard Worker static inline void __attribute__((always_inline)) 1124*387f9dfdSAndroid Build Coastguard Worker bpf_store_dword(void *skb, u64 off, u64 val) { 1125*387f9dfdSAndroid Build Coastguard Worker bpf_store_word(skb, off, (u32)val); 1126*387f9dfdSAndroid Build Coastguard Worker bpf_store_word(skb, off + 4, val >> 32); 1127*387f9dfdSAndroid Build Coastguard Worker } 1128*387f9dfdSAndroid Build Coastguard Worker 1129*387f9dfdSAndroid Build Coastguard Worker #define MASK(_n) ((_n) < 64 ? (1ull << (_n)) - 1 : ((u64)-1LL)) 1130*387f9dfdSAndroid Build Coastguard Worker #define MASK128(_n) ((_n) < 128 ? ((unsigned __int128)1 << (_n)) - 1 : ((unsigned __int128)-1)) 1131*387f9dfdSAndroid Build Coastguard Worker 1132*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1133*387f9dfdSAndroid Build Coastguard Worker unsigned int bpf_log2(unsigned int v) 1134*387f9dfdSAndroid Build Coastguard Worker { 1135*387f9dfdSAndroid Build Coastguard Worker unsigned int r; 1136*387f9dfdSAndroid Build Coastguard Worker unsigned int shift; 1137*387f9dfdSAndroid Build Coastguard Worker 1138*387f9dfdSAndroid Build Coastguard Worker r = (v > 0xFFFF) << 4; v >>= r; 1139*387f9dfdSAndroid Build Coastguard Worker shift = (v > 0xFF) << 3; v >>= shift; r |= shift; 1140*387f9dfdSAndroid Build Coastguard Worker shift = (v > 0xF) << 2; v >>= shift; r |= shift; 1141*387f9dfdSAndroid Build Coastguard Worker shift = (v > 0x3) << 1; v >>= shift; r |= shift; 1142*387f9dfdSAndroid Build Coastguard Worker r |= (v >> 1); 1143*387f9dfdSAndroid Build Coastguard Worker return r; 1144*387f9dfdSAndroid Build Coastguard Worker } 1145*387f9dfdSAndroid Build Coastguard Worker 1146*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1147*387f9dfdSAndroid Build Coastguard Worker unsigned int bpf_log2l(unsigned long v) 1148*387f9dfdSAndroid Build Coastguard Worker { 1149*387f9dfdSAndroid Build Coastguard Worker unsigned int hi = v >> 32; 1150*387f9dfdSAndroid Build Coastguard Worker if (hi) 1151*387f9dfdSAndroid Build Coastguard Worker return bpf_log2(hi) + 32 + 1; 1152*387f9dfdSAndroid Build Coastguard Worker else 1153*387f9dfdSAndroid Build Coastguard Worker return bpf_log2(v) + 1; 1154*387f9dfdSAndroid Build Coastguard Worker } 1155*387f9dfdSAndroid Build Coastguard Worker 1156*387f9dfdSAndroid Build Coastguard Worker struct bpf_context; 1157*387f9dfdSAndroid Build Coastguard Worker 1158*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1159*387f9dfdSAndroid Build Coastguard Worker BCC_SEC_HELPERS 1160*387f9dfdSAndroid Build Coastguard Worker u64 bpf_dext_pkt(void *pkt, u64 off, u64 bofs, u64 bsz) { 1161*387f9dfdSAndroid Build Coastguard Worker if (bofs == 0 && bsz == 8) { 1162*387f9dfdSAndroid Build Coastguard Worker return load_byte(pkt, off); 1163*387f9dfdSAndroid Build Coastguard Worker } else if (bofs + bsz <= 8) { 1164*387f9dfdSAndroid Build Coastguard Worker return load_byte(pkt, off) >> (8 - (bofs + bsz)) & MASK(bsz); 1165*387f9dfdSAndroid Build Coastguard Worker } else if (bofs == 0 && bsz == 16) { 1166*387f9dfdSAndroid Build Coastguard Worker return load_half(pkt, off); 1167*387f9dfdSAndroid Build Coastguard Worker } else if (bofs + bsz <= 16) { 1168*387f9dfdSAndroid Build Coastguard Worker return load_half(pkt, off) >> (16 - (bofs + bsz)) & MASK(bsz); 1169*387f9dfdSAndroid Build Coastguard Worker } else if (bofs == 0 && bsz == 32) { 1170*387f9dfdSAndroid Build Coastguard Worker return load_word(pkt, off); 1171*387f9dfdSAndroid Build Coastguard Worker } else if (bofs + bsz <= 32) { 1172*387f9dfdSAndroid Build Coastguard Worker return load_word(pkt, off) >> (32 - (bofs + bsz)) & MASK(bsz); 1173*387f9dfdSAndroid Build Coastguard Worker } else if (bofs == 0 && bsz == 64) { 1174*387f9dfdSAndroid Build Coastguard Worker return load_dword(pkt, off); 1175*387f9dfdSAndroid Build Coastguard Worker } else if (bofs + bsz <= 64) { 1176*387f9dfdSAndroid Build Coastguard Worker return load_dword(pkt, off) >> (64 - (bofs + bsz)) & MASK(bsz); 1177*387f9dfdSAndroid Build Coastguard Worker } 1178*387f9dfdSAndroid Build Coastguard Worker return 0; 1179*387f9dfdSAndroid Build Coastguard Worker } 1180*387f9dfdSAndroid Build Coastguard Worker 1181*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1182*387f9dfdSAndroid Build Coastguard Worker BCC_SEC_HELPERS 1183*387f9dfdSAndroid Build Coastguard Worker void bpf_dins_pkt(void *pkt, u64 off, u64 bofs, u64 bsz, u64 val) { 1184*387f9dfdSAndroid Build Coastguard Worker // The load_xxx function does a bswap before returning the short/word/dword, 1185*387f9dfdSAndroid Build Coastguard Worker // so the value in register will always be host endian. However, the bytes 1186*387f9dfdSAndroid Build Coastguard Worker // written back need to be in network order. 1187*387f9dfdSAndroid Build Coastguard Worker if (bofs == 0 && bsz == 8) { 1188*387f9dfdSAndroid Build Coastguard Worker bpf_skb_store_bytes(pkt, off, &val, 1, 0); 1189*387f9dfdSAndroid Build Coastguard Worker } else if (bofs + bsz <= 8) { 1190*387f9dfdSAndroid Build Coastguard Worker u8 v = load_byte(pkt, off); 1191*387f9dfdSAndroid Build Coastguard Worker v &= ~(MASK(bsz) << (8 - (bofs + bsz))); 1192*387f9dfdSAndroid Build Coastguard Worker v |= ((val & MASK(bsz)) << (8 - (bofs + bsz))); 1193*387f9dfdSAndroid Build Coastguard Worker bpf_skb_store_bytes(pkt, off, &v, 1, 0); 1194*387f9dfdSAndroid Build Coastguard Worker } else if (bofs == 0 && bsz == 16) { 1195*387f9dfdSAndroid Build Coastguard Worker u16 v = bpf_htons(val); 1196*387f9dfdSAndroid Build Coastguard Worker bpf_skb_store_bytes(pkt, off, &v, 2, 0); 1197*387f9dfdSAndroid Build Coastguard Worker } else if (bofs + bsz <= 16) { 1198*387f9dfdSAndroid Build Coastguard Worker u16 v = load_half(pkt, off); 1199*387f9dfdSAndroid Build Coastguard Worker v &= ~(MASK(bsz) << (16 - (bofs + bsz))); 1200*387f9dfdSAndroid Build Coastguard Worker v |= ((val & MASK(bsz)) << (16 - (bofs + bsz))); 1201*387f9dfdSAndroid Build Coastguard Worker v = bpf_htons(v); 1202*387f9dfdSAndroid Build Coastguard Worker bpf_skb_store_bytes(pkt, off, &v, 2, 0); 1203*387f9dfdSAndroid Build Coastguard Worker } else if (bofs == 0 && bsz == 32) { 1204*387f9dfdSAndroid Build Coastguard Worker u32 v = bpf_htonl(val); 1205*387f9dfdSAndroid Build Coastguard Worker bpf_skb_store_bytes(pkt, off, &v, 4, 0); 1206*387f9dfdSAndroid Build Coastguard Worker } else if (bofs + bsz <= 32) { 1207*387f9dfdSAndroid Build Coastguard Worker u32 v = load_word(pkt, off); 1208*387f9dfdSAndroid Build Coastguard Worker v &= ~(MASK(bsz) << (32 - (bofs + bsz))); 1209*387f9dfdSAndroid Build Coastguard Worker v |= ((val & MASK(bsz)) << (32 - (bofs + bsz))); 1210*387f9dfdSAndroid Build Coastguard Worker v = bpf_htonl(v); 1211*387f9dfdSAndroid Build Coastguard Worker bpf_skb_store_bytes(pkt, off, &v, 4, 0); 1212*387f9dfdSAndroid Build Coastguard Worker } else if (bofs == 0 && bsz == 64) { 1213*387f9dfdSAndroid Build Coastguard Worker u64 v = bpf_htonll(val); 1214*387f9dfdSAndroid Build Coastguard Worker bpf_skb_store_bytes(pkt, off, &v, 8, 0); 1215*387f9dfdSAndroid Build Coastguard Worker } else if (bofs + bsz <= 64) { 1216*387f9dfdSAndroid Build Coastguard Worker u64 v = load_dword(pkt, off); 1217*387f9dfdSAndroid Build Coastguard Worker v &= ~(MASK(bsz) << (64 - (bofs + bsz))); 1218*387f9dfdSAndroid Build Coastguard Worker v |= ((val & MASK(bsz)) << (64 - (bofs + bsz))); 1219*387f9dfdSAndroid Build Coastguard Worker v = bpf_htonll(v); 1220*387f9dfdSAndroid Build Coastguard Worker bpf_skb_store_bytes(pkt, off, &v, 8, 0); 1221*387f9dfdSAndroid Build Coastguard Worker } 1222*387f9dfdSAndroid Build Coastguard Worker } 1223*387f9dfdSAndroid Build Coastguard Worker 1224*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1225*387f9dfdSAndroid Build Coastguard Worker BCC_SEC_HELPERS 1226*387f9dfdSAndroid Build Coastguard Worker void * bpf_map_lookup_elem_(uintptr_t map, void *key) { 1227*387f9dfdSAndroid Build Coastguard Worker return bpf_map_lookup_elem((void *)map, key); 1228*387f9dfdSAndroid Build Coastguard Worker } 1229*387f9dfdSAndroid Build Coastguard Worker 1230*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1231*387f9dfdSAndroid Build Coastguard Worker BCC_SEC_HELPERS 1232*387f9dfdSAndroid Build Coastguard Worker int bpf_map_update_elem_(uintptr_t map, void *key, void *value, u64 flags) { 1233*387f9dfdSAndroid Build Coastguard Worker return bpf_map_update_elem((void *)map, key, value, flags); 1234*387f9dfdSAndroid Build Coastguard Worker } 1235*387f9dfdSAndroid Build Coastguard Worker 1236*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1237*387f9dfdSAndroid Build Coastguard Worker BCC_SEC_HELPERS 1238*387f9dfdSAndroid Build Coastguard Worker int bpf_map_delete_elem_(uintptr_t map, void *key) { 1239*387f9dfdSAndroid Build Coastguard Worker return bpf_map_delete_elem((void *)map, key); 1240*387f9dfdSAndroid Build Coastguard Worker } 1241*387f9dfdSAndroid Build Coastguard Worker 1242*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1243*387f9dfdSAndroid Build Coastguard Worker BCC_SEC_HELPERS 1244*387f9dfdSAndroid Build Coastguard Worker int bpf_l3_csum_replace_(void *ctx, u64 off, u64 from, u64 to, u64 flags) { 1245*387f9dfdSAndroid Build Coastguard Worker switch (flags & 0xf) { 1246*387f9dfdSAndroid Build Coastguard Worker case 2: 1247*387f9dfdSAndroid Build Coastguard Worker return bpf_l3_csum_replace(ctx, off, bpf_htons(from), bpf_htons(to), flags); 1248*387f9dfdSAndroid Build Coastguard Worker case 4: 1249*387f9dfdSAndroid Build Coastguard Worker return bpf_l3_csum_replace(ctx, off, bpf_htonl(from), bpf_htonl(to), flags); 1250*387f9dfdSAndroid Build Coastguard Worker case 8: 1251*387f9dfdSAndroid Build Coastguard Worker return bpf_l3_csum_replace(ctx, off, bpf_htonll(from), bpf_htonll(to), flags); 1252*387f9dfdSAndroid Build Coastguard Worker default: 1253*387f9dfdSAndroid Build Coastguard Worker {} 1254*387f9dfdSAndroid Build Coastguard Worker } 1255*387f9dfdSAndroid Build Coastguard Worker return bpf_l3_csum_replace(ctx, off, from, to, flags); 1256*387f9dfdSAndroid Build Coastguard Worker } 1257*387f9dfdSAndroid Build Coastguard Worker 1258*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline)) 1259*387f9dfdSAndroid Build Coastguard Worker BCC_SEC_HELPERS 1260*387f9dfdSAndroid Build Coastguard Worker int bpf_l4_csum_replace_(void *ctx, u64 off, u64 from, u64 to, u64 flags) { 1261*387f9dfdSAndroid Build Coastguard Worker switch (flags & 0xf) { 1262*387f9dfdSAndroid Build Coastguard Worker case 2: 1263*387f9dfdSAndroid Build Coastguard Worker return bpf_l4_csum_replace(ctx, off, bpf_htons(from), bpf_htons(to), flags); 1264*387f9dfdSAndroid Build Coastguard Worker case 4: 1265*387f9dfdSAndroid Build Coastguard Worker return bpf_l4_csum_replace(ctx, off, bpf_htonl(from), bpf_htonl(to), flags); 1266*387f9dfdSAndroid Build Coastguard Worker case 8: 1267*387f9dfdSAndroid Build Coastguard Worker return bpf_l4_csum_replace(ctx, off, bpf_htonll(from), bpf_htonll(to), flags); 1268*387f9dfdSAndroid Build Coastguard Worker default: 1269*387f9dfdSAndroid Build Coastguard Worker {} 1270*387f9dfdSAndroid Build Coastguard Worker } 1271*387f9dfdSAndroid Build Coastguard Worker return bpf_l4_csum_replace(ctx, off, from, to, flags); 1272*387f9dfdSAndroid Build Coastguard Worker } 1273*387f9dfdSAndroid Build Coastguard Worker 1274*387f9dfdSAndroid Build Coastguard Worker int incr_cksum_l3(void *off, u64 oldval, u64 newval) asm("llvm.bpf.extra"); 1275*387f9dfdSAndroid Build Coastguard Worker int incr_cksum_l4(void *off, u64 oldval, u64 newval, u64 flags) asm("llvm.bpf.extra"); 1276*387f9dfdSAndroid Build Coastguard Worker int bpf_num_cpus() asm("llvm.bpf.extra"); 1277*387f9dfdSAndroid Build Coastguard Worker 1278*387f9dfdSAndroid Build Coastguard Worker struct pt_regs; 1279*387f9dfdSAndroid Build Coastguard Worker int bpf_usdt_readarg(int argc, struct pt_regs *ctx, void *arg) asm("llvm.bpf.extra"); 1280*387f9dfdSAndroid Build Coastguard Worker int bpf_usdt_readarg_p(int argc, struct pt_regs *ctx, void *buf, u64 len) asm("llvm.bpf.extra"); 1281*387f9dfdSAndroid Build Coastguard Worker 1282*387f9dfdSAndroid Build Coastguard Worker /* Scan the ARCH passed in from ARCH env variable (see kbuild_helper.cc) */ 1283*387f9dfdSAndroid Build Coastguard Worker #if defined(__TARGET_ARCH_x86) 1284*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_x86 1285*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_defined 1286*387f9dfdSAndroid Build Coastguard Worker #elif defined(__TARGET_ARCH_s390x) 1287*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_s390x 1288*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_defined 1289*387f9dfdSAndroid Build Coastguard Worker #elif defined(__TARGET_ARCH_arm64) 1290*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_arm64 1291*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_defined 1292*387f9dfdSAndroid Build Coastguard Worker #elif defined(__TARGET_ARCH_powerpc) 1293*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_powerpc 1294*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_defined 1295*387f9dfdSAndroid Build Coastguard Worker #elif defined(__TARGET_ARCH_mips) 1296*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_mips 1297*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_defined 1298*387f9dfdSAndroid Build Coastguard Worker #elif defined(__TARGET_ARCH_riscv64) 1299*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_riscv64 1300*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_defined 1301*387f9dfdSAndroid Build Coastguard Worker #elif defined(__TARGET_ARCH_loongarch) 1302*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_loongarch 1303*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_defined 1304*387f9dfdSAndroid Build Coastguard Worker #else 1305*387f9dfdSAndroid Build Coastguard Worker #undef bpf_target_defined 1306*387f9dfdSAndroid Build Coastguard Worker #endif 1307*387f9dfdSAndroid Build Coastguard Worker 1308*387f9dfdSAndroid Build Coastguard Worker /* Fall back to what the compiler says */ 1309*387f9dfdSAndroid Build Coastguard Worker #ifndef bpf_target_defined 1310*387f9dfdSAndroid Build Coastguard Worker #if defined(__x86_64__) 1311*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_x86 1312*387f9dfdSAndroid Build Coastguard Worker #elif defined(__s390x__) 1313*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_s390x 1314*387f9dfdSAndroid Build Coastguard Worker #elif defined(__aarch64__) 1315*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_arm64 1316*387f9dfdSAndroid Build Coastguard Worker #elif defined(__powerpc__) 1317*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_powerpc 1318*387f9dfdSAndroid Build Coastguard Worker #elif defined(__mips__) 1319*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_mips 1320*387f9dfdSAndroid Build Coastguard Worker #elif defined(__riscv) && (__riscv_xlen == 64) 1321*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_riscv64 1322*387f9dfdSAndroid Build Coastguard Worker #elif defined(__loongarch__) 1323*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_loongarch 1324*387f9dfdSAndroid Build Coastguard Worker #endif 1325*387f9dfdSAndroid Build Coastguard Worker #endif 1326*387f9dfdSAndroid Build Coastguard Worker 1327*387f9dfdSAndroid Build Coastguard Worker #if defined(bpf_target_powerpc) 1328*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1(ctx) ((ctx)->gpr[3]) 1329*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2(ctx) ((ctx)->gpr[4]) 1330*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3(ctx) ((ctx)->gpr[5]) 1331*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4(ctx) ((ctx)->gpr[6]) 1332*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5(ctx) ((ctx)->gpr[7]) 1333*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM6(ctx) ((ctx)->gpr[8]) 1334*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RC(ctx) ((ctx)->gpr[3]) 1335*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_IP(ctx) ((ctx)->nip) 1336*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SP(ctx) ((ctx)->gpr[1]) 1337*387f9dfdSAndroid Build Coastguard Worker #elif defined(bpf_target_s390x) 1338*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1(x) ((x)->gprs[2]) 1339*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2(x) ((x)->gprs[3]) 1340*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3(x) ((x)->gprs[4]) 1341*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4(x) ((x)->gprs[5]) 1342*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5(x) ((x)->gprs[6]) 1343*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RET(x) ((x)->gprs[14]) 1344*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_FP(x) ((x)->gprs[11]) /* Works only with CONFIG_FRAME_POINTER */ 1345*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RC(x) ((x)->gprs[2]) 1346*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SP(x) ((x)->gprs[15]) 1347*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_IP(x) ((x)->psw.addr) 1348*387f9dfdSAndroid Build Coastguard Worker #elif defined(bpf_target_x86) 1349*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1(ctx) ((ctx)->di) 1350*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2(ctx) ((ctx)->si) 1351*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3(ctx) ((ctx)->dx) 1352*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4(ctx) ((ctx)->cx) 1353*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5(ctx) ((ctx)->r8) 1354*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM6(ctx) ((ctx)->r9) 1355*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RET(ctx) ((ctx)->sp) 1356*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_FP(ctx) ((ctx)->bp) /* Works only with CONFIG_FRAME_POINTER */ 1357*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RC(ctx) ((ctx)->ax) 1358*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_IP(ctx) ((ctx)->ip) 1359*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SP(ctx) ((ctx)->sp) 1360*387f9dfdSAndroid Build Coastguard Worker #elif defined(bpf_target_arm64) 1361*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1(x) ((x)->regs[0]) 1362*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2(x) ((x)->regs[1]) 1363*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3(x) ((x)->regs[2]) 1364*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4(x) ((x)->regs[3]) 1365*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5(x) ((x)->regs[4]) 1366*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM6(x) ((x)->regs[5]) 1367*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RET(x) ((x)->regs[30]) 1368*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_FP(x) ((x)->regs[29]) /* Works only with CONFIG_FRAME_POINTER */ 1369*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RC(x) ((x)->regs[0]) 1370*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SP(x) ((x)->sp) 1371*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_IP(x) ((x)->pc) 1372*387f9dfdSAndroid Build Coastguard Worker #elif defined(bpf_target_mips) 1373*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1(x) ((x)->regs[4]) 1374*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2(x) ((x)->regs[5]) 1375*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3(x) ((x)->regs[6]) 1376*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4(x) ((x)->regs[7]) 1377*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5(x) ((x)->regs[8]) 1378*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM6(x) ((x)->regs[9]) 1379*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RET(x) ((x)->regs[31]) 1380*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_FP(x) ((x)->regs[30]) /* Works only with CONFIG_FRAME_POINTER */ 1381*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RC(x) ((x)->regs[2]) 1382*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SP(x) ((x)->regs[29]) 1383*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_IP(x) ((x)->cp0_epc) 1384*387f9dfdSAndroid Build Coastguard Worker #elif defined(bpf_target_riscv64) 1385*387f9dfdSAndroid Build Coastguard Worker /* riscv64 provides struct user_pt_regs instead of struct pt_regs to userspace */ 1386*387f9dfdSAndroid Build Coastguard Worker #define __PT_REGS_CAST(x) ((const struct user_regs_struct *)(x)) 1387*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1(x) (__PT_REGS_CAST(x)->a0) 1388*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2(x) (__PT_REGS_CAST(x)->a1) 1389*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3(x) (__PT_REGS_CAST(x)->a2) 1390*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4(x) (__PT_REGS_CAST(x)->a3) 1391*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5(x) (__PT_REGS_CAST(x)->a4) 1392*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM6(x) (__PT_REGS_CAST(x)->a5) 1393*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RET(x) (__PT_REGS_CAST(x)->ra) 1394*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_FP(x) (__PT_REGS_CAST(x)->s0) /* Works only with CONFIG_FRAME_POINTER */ 1395*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RC(x) (__PT_REGS_CAST(x)->a0) 1396*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SP(x) (__PT_REGS_CAST(x)->sp) 1397*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_IP(x) (__PT_REGS_CAST(x)->pc) 1398*387f9dfdSAndroid Build Coastguard Worker #elif defined(bpf_target_loongarch) 1399*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1(x) ((x)->regs[4]) 1400*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2(x) ((x)->regs[5]) 1401*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3(x) ((x)->regs[6]) 1402*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4(x) ((x)->regs[7]) 1403*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5(x) ((x)->regs[8]) 1404*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM6(x) ((x)->regs[9]) 1405*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RET(x) ((x)->regs[1]) 1406*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_FP(x) ((x)->regs[22]) /* Works only with CONFIG_FRAME_POINTER */ 1407*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RC(x) ((x)->regs[4]) 1408*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SP(x) ((x)->regs[3]) 1409*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_IP(x) ((x)->csr_era) 1410*387f9dfdSAndroid Build Coastguard Worker #else 1411*387f9dfdSAndroid Build Coastguard Worker #error "bcc does not support this platform yet" 1412*387f9dfdSAndroid Build Coastguard Worker #endif 1413*387f9dfdSAndroid Build Coastguard Worker 1414*387f9dfdSAndroid Build Coastguard Worker #if defined(CONFIG_ARCH_HAS_SYSCALL_WRAPPER) && !defined(__s390x__) 1415*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SYSCALL_CTX(ctx) ((struct pt_regs *)PT_REGS_PARM1(ctx)) 1416*387f9dfdSAndroid Build Coastguard Worker #else 1417*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SYSCALL_CTX(ctx) (ctx) 1418*387f9dfdSAndroid Build Coastguard Worker #endif 1419*387f9dfdSAndroid Build Coastguard Worker /* Helpers for syscall params. Pass in a ctx returned from PT_REGS_SYSCALL_CTX. 1420*387f9dfdSAndroid Build Coastguard Worker */ 1421*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1_SYSCALL(ctx) PT_REGS_PARM1(ctx) 1422*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2_SYSCALL(ctx) PT_REGS_PARM2(ctx) 1423*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3_SYSCALL(ctx) PT_REGS_PARM3(ctx) 1424*387f9dfdSAndroid Build Coastguard Worker #if defined(bpf_target_x86) 1425*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4_SYSCALL(ctx) ((ctx)->r10) /* for syscall only */ 1426*387f9dfdSAndroid Build Coastguard Worker #else 1427*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4_SYSCALL(ctx) PT_REGS_PARM4(ctx) 1428*387f9dfdSAndroid Build Coastguard Worker #endif 1429*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5_SYSCALL(ctx) PT_REGS_PARM5(ctx) 1430*387f9dfdSAndroid Build Coastguard Worker #ifdef PT_REGS_PARM6 1431*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM6_SYSCALL(ctx) PT_REGS_PARM6(ctx) 1432*387f9dfdSAndroid Build Coastguard Worker #endif 1433*387f9dfdSAndroid Build Coastguard Worker 1434*387f9dfdSAndroid Build Coastguard Worker #define lock_xadd(ptr, val) ((void)__sync_fetch_and_add(ptr, val)) 1435*387f9dfdSAndroid Build Coastguard Worker 1436*387f9dfdSAndroid Build Coastguard Worker #define TRACEPOINT_PROBE(category, event) \ 1437*387f9dfdSAndroid Build Coastguard Worker int tracepoint__##category##__##event(struct tracepoint__##category##__##event *args) 1438*387f9dfdSAndroid Build Coastguard Worker 1439*387f9dfdSAndroid Build Coastguard Worker #define RAW_TRACEPOINT_PROBE(event) \ 1440*387f9dfdSAndroid Build Coastguard Worker int raw_tracepoint__##event(struct bpf_raw_tracepoint_args *ctx) 1441*387f9dfdSAndroid Build Coastguard Worker 1442*387f9dfdSAndroid Build Coastguard Worker /* BPF_PROG macro allows to define trampoline function, 1443*387f9dfdSAndroid Build Coastguard Worker * borrowed from kernel bpf selftest code. 1444*387f9dfdSAndroid Build Coastguard Worker */ 1445*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_concat(a, b) a ## b 1446*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_apply(fn, n) ___bpf_concat(fn, n) 1447*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_nth(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c, N, ...) N 1448*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_narg(...) \ 1449*387f9dfdSAndroid Build Coastguard Worker ___bpf_nth(_, ##__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) 1450*387f9dfdSAndroid Build Coastguard Worker 1451*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast0() ctx 1452*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast1(x) ___bpf_ctx_cast0(), (void *)ctx[0] 1453*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast2(x, args...) ___bpf_ctx_cast1(args), (void *)ctx[1] 1454*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast3(x, args...) ___bpf_ctx_cast2(args), (void *)ctx[2] 1455*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast4(x, args...) ___bpf_ctx_cast3(args), (void *)ctx[3] 1456*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast5(x, args...) ___bpf_ctx_cast4(args), (void *)ctx[4] 1457*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast6(x, args...) ___bpf_ctx_cast5(args), (void *)ctx[5] 1458*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast7(x, args...) ___bpf_ctx_cast6(args), (void *)ctx[6] 1459*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast8(x, args...) ___bpf_ctx_cast7(args), (void *)ctx[7] 1460*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast9(x, args...) ___bpf_ctx_cast8(args), (void *)ctx[8] 1461*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast10(x, args...) ___bpf_ctx_cast9(args), (void *)ctx[9] 1462*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast11(x, args...) ___bpf_ctx_cast10(args), (void *)ctx[10] 1463*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast12(x, args...) ___bpf_ctx_cast11(args), (void *)ctx[11] 1464*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast(args...) \ 1465*387f9dfdSAndroid Build Coastguard Worker ___bpf_apply(___bpf_ctx_cast, ___bpf_narg(args))(args) 1466*387f9dfdSAndroid Build Coastguard Worker 1467*387f9dfdSAndroid Build Coastguard Worker #define BPF_PROG(name, args...) \ 1468*387f9dfdSAndroid Build Coastguard Worker int name(unsigned long long *ctx); \ 1469*387f9dfdSAndroid Build Coastguard Worker __attribute__((always_inline)) \ 1470*387f9dfdSAndroid Build Coastguard Worker static int ____##name(unsigned long long *ctx, ##args); \ 1471*387f9dfdSAndroid Build Coastguard Worker int name(unsigned long long *ctx) \ 1472*387f9dfdSAndroid Build Coastguard Worker { \ 1473*387f9dfdSAndroid Build Coastguard Worker int __ret; \ 1474*387f9dfdSAndroid Build Coastguard Worker \ 1475*387f9dfdSAndroid Build Coastguard Worker _Pragma("GCC diagnostic push") \ 1476*387f9dfdSAndroid Build Coastguard Worker _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ 1477*387f9dfdSAndroid Build Coastguard Worker __ret = ____##name(___bpf_ctx_cast(args)); \ 1478*387f9dfdSAndroid Build Coastguard Worker _Pragma("GCC diagnostic pop") \ 1479*387f9dfdSAndroid Build Coastguard Worker return __ret; \ 1480*387f9dfdSAndroid Build Coastguard Worker } \ 1481*387f9dfdSAndroid Build Coastguard Worker static int ____##name(unsigned long long *ctx, ##args) 1482*387f9dfdSAndroid Build Coastguard Worker 1483*387f9dfdSAndroid Build Coastguard Worker #define KFUNC_PROBE(event, args...) \ 1484*387f9dfdSAndroid Build Coastguard Worker BPF_PROG(kfunc__vmlinux__ ## event, ##args) 1485*387f9dfdSAndroid Build Coastguard Worker 1486*387f9dfdSAndroid Build Coastguard Worker #define KRETFUNC_PROBE(event, args...) \ 1487*387f9dfdSAndroid Build Coastguard Worker BPF_PROG(kretfunc__vmlinux__ ## event, ##args) 1488*387f9dfdSAndroid Build Coastguard Worker 1489*387f9dfdSAndroid Build Coastguard Worker #define MODULE_KFUNC_PROBE(module, event, args...) \ 1490*387f9dfdSAndroid Build Coastguard Worker BPF_PROG(kfunc__ ## module ## __ ## event, ##args) 1491*387f9dfdSAndroid Build Coastguard Worker 1492*387f9dfdSAndroid Build Coastguard Worker #define MODULE_KRETFUNC_PROBE(module, event, args...) \ 1493*387f9dfdSAndroid Build Coastguard Worker BPF_PROG(kretfunc__ ## module ## __ ## event, ##args) 1494*387f9dfdSAndroid Build Coastguard Worker 1495*387f9dfdSAndroid Build Coastguard Worker #define KMOD_RET(event, args...) \ 1496*387f9dfdSAndroid Build Coastguard Worker BPF_PROG(kmod_ret__ ## event, ##args) 1497*387f9dfdSAndroid Build Coastguard Worker 1498*387f9dfdSAndroid Build Coastguard Worker #define LSM_PROBE(event, args...) \ 1499*387f9dfdSAndroid Build Coastguard Worker BPF_PROG(lsm__ ## event, ##args) 1500*387f9dfdSAndroid Build Coastguard Worker 1501*387f9dfdSAndroid Build Coastguard Worker #define BPF_ITER(target) \ 1502*387f9dfdSAndroid Build Coastguard Worker int bpf_iter__ ## target (struct bpf_iter__ ## target *ctx) 1503*387f9dfdSAndroid Build Coastguard Worker 1504*387f9dfdSAndroid Build Coastguard Worker #define TP_DATA_LOC_READ_CONST(dst, field, length) \ 1505*387f9dfdSAndroid Build Coastguard Worker do { \ 1506*387f9dfdSAndroid Build Coastguard Worker unsigned short __offset = args->data_loc_##field & 0xFFFF; \ 1507*387f9dfdSAndroid Build Coastguard Worker bpf_probe_read((void *)dst, length, (char *)args + __offset); \ 1508*387f9dfdSAndroid Build Coastguard Worker } while (0) 1509*387f9dfdSAndroid Build Coastguard Worker 1510*387f9dfdSAndroid Build Coastguard Worker #define TP_DATA_LOC_READ(dst, field) \ 1511*387f9dfdSAndroid Build Coastguard Worker do { \ 1512*387f9dfdSAndroid Build Coastguard Worker unsigned short __offset = args->data_loc_##field & 0xFFFF; \ 1513*387f9dfdSAndroid Build Coastguard Worker unsigned short __length = args->data_loc_##field >> 16; \ 1514*387f9dfdSAndroid Build Coastguard Worker bpf_probe_read((void *)dst, __length, (char *)args + __offset); \ 1515*387f9dfdSAndroid Build Coastguard Worker } while (0) 1516*387f9dfdSAndroid Build Coastguard Worker 1517*387f9dfdSAndroid Build Coastguard Worker #define TP_DATA_LOC_READ_STR(dst, field, length) \ 1518*387f9dfdSAndroid Build Coastguard Worker do { \ 1519*387f9dfdSAndroid Build Coastguard Worker unsigned short __offset = args->data_loc_##field & 0xFFFF; \ 1520*387f9dfdSAndroid Build Coastguard Worker bpf_probe_read_str((void *)dst, length, (char *)args + __offset); \ 1521*387f9dfdSAndroid Build Coastguard Worker } while (0) 1522*387f9dfdSAndroid Build Coastguard Worker 1523*387f9dfdSAndroid Build Coastguard Worker #endif 1524*387f9dfdSAndroid Build Coastguard Worker )********" 1525