1*387f9dfdSAndroid Build Coastguard Workerlocal suite = require("test_helper") 2*387f9dfdSAndroid Build Coastguard Workerlocal TestClang = {} 3*387f9dfdSAndroid Build Coastguard Worker 4*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_probe_read1() 5*387f9dfdSAndroid Build Coastguard Worker local text = [[ 6*387f9dfdSAndroid Build Coastguard Worker#include <linux/sched.h> 7*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h> 8*387f9dfdSAndroid Build Coastguard Workerint count_sched(struct pt_regs *ctx, struct task_struct *prev) { 9*387f9dfdSAndroid Build Coastguard Worker pid_t p = prev->pid; 10*387f9dfdSAndroid Build Coastguard Worker return (p != -1); 11*387f9dfdSAndroid Build Coastguard Worker} 12*387f9dfdSAndroid Build Coastguard Worker]] 13*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=text, debug=0} 14*387f9dfdSAndroid Build Coastguard Worker local fn = b:load_func("count_sched", 'BPF_PROG_TYPE_KPROBE') 15*387f9dfdSAndroid Build Coastguard Workerend 16*387f9dfdSAndroid Build Coastguard Worker 17*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_probe_read2() 18*387f9dfdSAndroid Build Coastguard Worker local text = [[ 19*387f9dfdSAndroid Build Coastguard Worker#include <linux/sched.h> 20*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h> 21*387f9dfdSAndroid Build Coastguard Workerint count_foo(struct pt_regs *ctx, unsigned long a, unsigned long b) { 22*387f9dfdSAndroid Build Coastguard Worker return (a != b); 23*387f9dfdSAndroid Build Coastguard Worker} 24*387f9dfdSAndroid Build Coastguard Worker]] 25*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=text, debug=0} 26*387f9dfdSAndroid Build Coastguard Worker local fn = b:load_func("count_foo", 'BPF_PROG_TYPE_KPROBE') 27*387f9dfdSAndroid Build Coastguard Workerend 28*387f9dfdSAndroid Build Coastguard Worker 29*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_probe_read_keys() 30*387f9dfdSAndroid Build Coastguard Worker local text = [[ 31*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h> 32*387f9dfdSAndroid Build Coastguard Worker#include <linux/blkdev.h> 33*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(start, struct request *); 34*387f9dfdSAndroid Build Coastguard Workerint do_request(struct pt_regs *ctx, struct request *req) { 35*387f9dfdSAndroid Build Coastguard Worker u64 ts = bpf_ktime_get_ns(); 36*387f9dfdSAndroid Build Coastguard Worker start.update(&req, &ts); 37*387f9dfdSAndroid Build Coastguard Worker return 0; 38*387f9dfdSAndroid Build Coastguard Worker} 39*387f9dfdSAndroid Build Coastguard Worker 40*387f9dfdSAndroid Build Coastguard Workerint do_completion(struct pt_regs *ctx, struct request *req) { 41*387f9dfdSAndroid Build Coastguard Worker u64 *tsp = start.lookup(&req); 42*387f9dfdSAndroid Build Coastguard Worker if (tsp != 0) { 43*387f9dfdSAndroid Build Coastguard Worker start.delete(&req); 44*387f9dfdSAndroid Build Coastguard Worker } 45*387f9dfdSAndroid Build Coastguard Worker return 0; 46*387f9dfdSAndroid Build Coastguard Worker} 47*387f9dfdSAndroid Build Coastguard Worker ]] 48*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=text, debug=0} 49*387f9dfdSAndroid Build Coastguard Worker local fns = b:load_funcs('BPF_PROG_TYPE_KPROBE') 50*387f9dfdSAndroid Build Coastguard Workerend 51*387f9dfdSAndroid Build Coastguard Worker 52*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_sscanf() 53*387f9dfdSAndroid Build Coastguard Worker local text = [[ 54*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(stats, int, struct { u64 a; u64 b; u32 c:18; u32 d:14; struct { u32 a; u32 b; } s; }, 10); 55*387f9dfdSAndroid Build Coastguard Worker 56*387f9dfdSAndroid Build Coastguard Workerint foo(void *ctx) { 57*387f9dfdSAndroid Build Coastguard Worker return 0; 58*387f9dfdSAndroid Build Coastguard Worker} 59*387f9dfdSAndroid Build Coastguard Worker]] 60*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=text, debug=0} 61*387f9dfdSAndroid Build Coastguard Worker local fn = b:load_func("foo", 'BPF_PROG_TYPE_KPROBE') 62*387f9dfdSAndroid Build Coastguard Worker local t = b:get_table("stats") 63*387f9dfdSAndroid Build Coastguard Worker local s1 = t:key_sprintf(2) 64*387f9dfdSAndroid Build Coastguard Worker 65*387f9dfdSAndroid Build Coastguard Worker assert_equals(s1, "0x2") 66*387f9dfdSAndroid Build Coastguard Worker 67*387f9dfdSAndroid Build Coastguard Worker local s2 = t:leaf_sprintf({{2, 3, 4, 1, {5, 6}}}) 68*387f9dfdSAndroid Build Coastguard Worker local l = t:leaf_scanf(s2) 69*387f9dfdSAndroid Build Coastguard Worker 70*387f9dfdSAndroid Build Coastguard Worker assert_equals(tonumber(l.a), 2) 71*387f9dfdSAndroid Build Coastguard Worker assert_equals(tonumber(l.b), 3) 72*387f9dfdSAndroid Build Coastguard Worker assert_equals(tonumber(l.c), 4) 73*387f9dfdSAndroid Build Coastguard Worker assert_equals(tonumber(l.d), 1) 74*387f9dfdSAndroid Build Coastguard Worker assert_equals(tonumber(l.s.a), 5) 75*387f9dfdSAndroid Build Coastguard Worker assert_equals(tonumber(l.s.b), 6) 76*387f9dfdSAndroid Build Coastguard Workerend 77*387f9dfdSAndroid Build Coastguard Worker 78*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_sscanf_array() 79*387f9dfdSAndroid Build Coastguard Worker local text = [[ BPF_HASH(stats, int, struct { u32 a[3]; u32 b; }, 10); ]] 80*387f9dfdSAndroid Build Coastguard Worker 81*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=text, debug=0} 82*387f9dfdSAndroid Build Coastguard Worker local t = b:get_table("stats") 83*387f9dfdSAndroid Build Coastguard Worker 84*387f9dfdSAndroid Build Coastguard Worker local s1 = t:key_sprintf(2) 85*387f9dfdSAndroid Build Coastguard Worker assert_equals(s1, "0x2") 86*387f9dfdSAndroid Build Coastguard Worker 87*387f9dfdSAndroid Build Coastguard Worker local s2 = t:leaf_sprintf({{{1, 2, 3}, 4}}) 88*387f9dfdSAndroid Build Coastguard Worker assert_equals(s2, "{ [ 0x1 0x2 0x3 ] 0x4 }") 89*387f9dfdSAndroid Build Coastguard Worker 90*387f9dfdSAndroid Build Coastguard Worker local l = t:leaf_scanf(s2) 91*387f9dfdSAndroid Build Coastguard Worker assert_equals(l.a[0], 1) 92*387f9dfdSAndroid Build Coastguard Worker assert_equals(l.a[1], 2) 93*387f9dfdSAndroid Build Coastguard Worker assert_equals(l.a[2], 3) 94*387f9dfdSAndroid Build Coastguard Worker assert_equals(l.b, 4) 95*387f9dfdSAndroid Build Coastguard Workerend 96*387f9dfdSAndroid Build Coastguard Worker 97*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_iosnoop() 98*387f9dfdSAndroid Build Coastguard Worker local text = [[ 99*387f9dfdSAndroid Build Coastguard Worker#include <linux/blkdev.h> 100*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h> 101*387f9dfdSAndroid Build Coastguard Worker 102*387f9dfdSAndroid Build Coastguard Workerstruct key_t { 103*387f9dfdSAndroid Build Coastguard Worker struct request *req; 104*387f9dfdSAndroid Build Coastguard Worker}; 105*387f9dfdSAndroid Build Coastguard Worker 106*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(start, struct key_t, u64, 1024); 107*387f9dfdSAndroid Build Coastguard Workerint do_request(struct pt_regs *ctx, struct request *req) { 108*387f9dfdSAndroid Build Coastguard Worker struct key_t key = {}; 109*387f9dfdSAndroid Build Coastguard Worker 110*387f9dfdSAndroid Build Coastguard Worker bpf_trace_printk("traced start %d\\n", req->__data_len); 111*387f9dfdSAndroid Build Coastguard Worker 112*387f9dfdSAndroid Build Coastguard Worker return 0; 113*387f9dfdSAndroid Build Coastguard Worker} 114*387f9dfdSAndroid Build Coastguard Worker]] 115*387f9dfdSAndroid Build Coastguard Worker 116*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=text, debug=0} 117*387f9dfdSAndroid Build Coastguard Worker local fn = b:load_func("do_request", 'BPF_PROG_TYPE_KPROBE') 118*387f9dfdSAndroid Build Coastguard Workerend 119*387f9dfdSAndroid Build Coastguard Worker 120*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_blk_start_request() 121*387f9dfdSAndroid Build Coastguard Worker local text = [[ 122*387f9dfdSAndroid Build Coastguard Worker#include <linux/blkdev.h> 123*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h> 124*387f9dfdSAndroid Build Coastguard Workerint do_request(struct pt_regs *ctx, int req) { 125*387f9dfdSAndroid Build Coastguard Worker bpf_trace_printk("req ptr: 0x%x\n", req); 126*387f9dfdSAndroid Build Coastguard Worker return 0; 127*387f9dfdSAndroid Build Coastguard Worker} 128*387f9dfdSAndroid Build Coastguard Worker]] 129*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=text, debug=0} 130*387f9dfdSAndroid Build Coastguard Worker local fn = b:load_func("do_request", 'BPF_PROG_TYPE_KPROBE') 131*387f9dfdSAndroid Build Coastguard Workerend 132*387f9dfdSAndroid Build Coastguard Worker 133*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_bpf_hash() 134*387f9dfdSAndroid Build Coastguard Worker local text = [[ 135*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(table1); 136*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(table2, u32); 137*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(table3, u32, int); 138*387f9dfdSAndroid Build Coastguard Worker]] 139*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=text, debug=0} 140*387f9dfdSAndroid Build Coastguard Workerend 141*387f9dfdSAndroid Build Coastguard Worker 142*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_consecutive_probe_read() 143*387f9dfdSAndroid Build Coastguard Worker local text = [[ 144*387f9dfdSAndroid Build Coastguard Worker#include <linux/fs.h> 145*387f9dfdSAndroid Build Coastguard Worker#include <linux/mount.h> 146*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(table1, struct super_block *); 147*387f9dfdSAndroid Build Coastguard Workerint trace_entry(struct pt_regs *ctx, struct file *file) { 148*387f9dfdSAndroid Build Coastguard Worker if (!file) return 0; 149*387f9dfdSAndroid Build Coastguard Worker struct vfsmount *mnt = file->f_path.mnt; 150*387f9dfdSAndroid Build Coastguard Worker if (mnt) { 151*387f9dfdSAndroid Build Coastguard Worker struct super_block *k = mnt->mnt_sb; 152*387f9dfdSAndroid Build Coastguard Worker u64 zero = 0; 153*387f9dfdSAndroid Build Coastguard Worker table1.update(&k, &zero); 154*387f9dfdSAndroid Build Coastguard Worker k = mnt->mnt_sb; 155*387f9dfdSAndroid Build Coastguard Worker table1.update(&k, &zero); 156*387f9dfdSAndroid Build Coastguard Worker } 157*387f9dfdSAndroid Build Coastguard Worker 158*387f9dfdSAndroid Build Coastguard Worker return 0; 159*387f9dfdSAndroid Build Coastguard Worker} 160*387f9dfdSAndroid Build Coastguard Worker]] 161*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=text, debug=0} 162*387f9dfdSAndroid Build Coastguard Worker local fn = b:load_func("trace_entry", 'BPF_PROG_TYPE_KPROBE') 163*387f9dfdSAndroid Build Coastguard Workerend 164*387f9dfdSAndroid Build Coastguard Worker 165*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_nested_probe_read() 166*387f9dfdSAndroid Build Coastguard Worker local text = [[ 167*387f9dfdSAndroid Build Coastguard Worker#include <linux/fs.h> 168*387f9dfdSAndroid Build Coastguard Workerint trace_entry(struct pt_regs *ctx, struct file *file) { 169*387f9dfdSAndroid Build Coastguard Worker if (!file) return 0; 170*387f9dfdSAndroid Build Coastguard Worker const char *name = file->f_path.dentry->d_name.name; 171*387f9dfdSAndroid Build Coastguard Worker bpf_trace_printk("%s\\n", name); 172*387f9dfdSAndroid Build Coastguard Worker return 0; 173*387f9dfdSAndroid Build Coastguard Worker} 174*387f9dfdSAndroid Build Coastguard Worker]] 175*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=text, debug=0} 176*387f9dfdSAndroid Build Coastguard Worker local fn = b:load_func("trace_entry", 'BPF_PROG_TYPE_KPROBE') 177*387f9dfdSAndroid Build Coastguard Workerend 178*387f9dfdSAndroid Build Coastguard Worker 179*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_char_array_probe() 180*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=[[#include <linux/blkdev.h> 181*387f9dfdSAndroid Build Coastguard Workerint kprobe__blk_update_request(struct pt_regs *ctx, struct request *req) { 182*387f9dfdSAndroid Build Coastguard Worker bpf_trace_printk("%s\\n", req->rq_disk->disk_name); 183*387f9dfdSAndroid Build Coastguard Worker return 0; 184*387f9dfdSAndroid Build Coastguard Worker}]]} 185*387f9dfdSAndroid Build Coastguard Workerend 186*387f9dfdSAndroid Build Coastguard Worker 187*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_probe_read_helper() 188*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=[[ 189*387f9dfdSAndroid Build Coastguard Worker#include <linux/fs.h> 190*387f9dfdSAndroid Build Coastguard Workerstatic void print_file_name(struct file *file) { 191*387f9dfdSAndroid Build Coastguard Worker if (!file) return; 192*387f9dfdSAndroid Build Coastguard Worker const char *name = file->f_path.dentry->d_name.name; 193*387f9dfdSAndroid Build Coastguard Worker bpf_trace_printk("%s\\n", name); 194*387f9dfdSAndroid Build Coastguard Worker} 195*387f9dfdSAndroid Build Coastguard Workerstatic void print_file_name2(int unused, struct file *file) { 196*387f9dfdSAndroid Build Coastguard Worker print_file_name(file); 197*387f9dfdSAndroid Build Coastguard Worker} 198*387f9dfdSAndroid Build Coastguard Workerint trace_entry1(struct pt_regs *ctx, struct file *file) { 199*387f9dfdSAndroid Build Coastguard Worker print_file_name(file); 200*387f9dfdSAndroid Build Coastguard Worker return 0; 201*387f9dfdSAndroid Build Coastguard Worker} 202*387f9dfdSAndroid Build Coastguard Workerint trace_entry2(struct pt_regs *ctx, int unused, struct file *file) { 203*387f9dfdSAndroid Build Coastguard Worker print_file_name2(unused, file); 204*387f9dfdSAndroid Build Coastguard Worker return 0; 205*387f9dfdSAndroid Build Coastguard Worker} 206*387f9dfdSAndroid Build Coastguard Worker]]} 207*387f9dfdSAndroid Build Coastguard Worker local fn1 = b:load_func("trace_entry1", 'BPF_PROG_TYPE_KPROBE') 208*387f9dfdSAndroid Build Coastguard Worker local fn2 = b:load_func("trace_entry2", 'BPF_PROG_TYPE_KPROBE') 209*387f9dfdSAndroid Build Coastguard Workerend 210*387f9dfdSAndroid Build Coastguard Worker 211*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_probe_struct_assign() 212*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text = [[ 213*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h> 214*387f9dfdSAndroid Build Coastguard Workerstruct args_t { 215*387f9dfdSAndroid Build Coastguard Worker const char *filename; 216*387f9dfdSAndroid Build Coastguard Worker int flags; 217*387f9dfdSAndroid Build Coastguard Worker int mode; 218*387f9dfdSAndroid Build Coastguard Worker}; 219*387f9dfdSAndroid Build Coastguard Workerint kprobe__sys_open(struct pt_regs *ctx, const char *filename, 220*387f9dfdSAndroid Build Coastguard Worker int flags, int mode) { 221*387f9dfdSAndroid Build Coastguard Worker struct args_t args = {}; 222*387f9dfdSAndroid Build Coastguard Worker args.filename = filename; 223*387f9dfdSAndroid Build Coastguard Worker args.flags = flags; 224*387f9dfdSAndroid Build Coastguard Worker args.mode = mode; 225*387f9dfdSAndroid Build Coastguard Worker bpf_trace_printk("%s\\n", args.filename); 226*387f9dfdSAndroid Build Coastguard Worker return 0; 227*387f9dfdSAndroid Build Coastguard Worker}; 228*387f9dfdSAndroid Build Coastguard Worker]]} 229*387f9dfdSAndroid Build Coastguard Workerend 230*387f9dfdSAndroid Build Coastguard Worker 231*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_task_switch() 232*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=[[ 233*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h> 234*387f9dfdSAndroid Build Coastguard Worker#include <linux/sched.h> 235*387f9dfdSAndroid Build Coastguard Workerstruct key_t { 236*387f9dfdSAndroid Build Coastguard Worker u32 prev_pid; 237*387f9dfdSAndroid Build Coastguard Worker u32 curr_pid; 238*387f9dfdSAndroid Build Coastguard Worker}; 239*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(stats, struct key_t, u64, 1024); 240*387f9dfdSAndroid Build Coastguard Workerint kprobe__finish_task_switch(struct pt_regs *ctx, struct task_struct *prev) { 241*387f9dfdSAndroid Build Coastguard Worker struct key_t key = {}; 242*387f9dfdSAndroid Build Coastguard Worker u64 zero = 0, *val; 243*387f9dfdSAndroid Build Coastguard Worker key.curr_pid = bpf_get_current_pid_tgid(); 244*387f9dfdSAndroid Build Coastguard Worker key.prev_pid = prev->pid; 245*387f9dfdSAndroid Build Coastguard Worker 246*387f9dfdSAndroid Build Coastguard Worker val = stats.lookup_or_try_init(&key, &zero); 247*387f9dfdSAndroid Build Coastguard Worker if (val) { 248*387f9dfdSAndroid Build Coastguard Worker (*val)++; 249*387f9dfdSAndroid Build Coastguard Worker } 250*387f9dfdSAndroid Build Coastguard Worker return 0; 251*387f9dfdSAndroid Build Coastguard Worker} 252*387f9dfdSAndroid Build Coastguard Worker]]} 253*387f9dfdSAndroid Build Coastguard Workerend 254*387f9dfdSAndroid Build Coastguard Worker 255*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_probe_simple_assign() 256*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=[[ 257*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h> 258*387f9dfdSAndroid Build Coastguard Worker#include <linux/gfp.h> 259*387f9dfdSAndroid Build Coastguard Workerstruct leaf { size_t size; }; 260*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(simple_map, u32, struct leaf); 261*387f9dfdSAndroid Build Coastguard Workerint kprobe____kmalloc(struct pt_regs *ctx, size_t size) { 262*387f9dfdSAndroid Build Coastguard Worker u32 pid = bpf_get_current_pid_tgid(); 263*387f9dfdSAndroid Build Coastguard Worker struct leaf* leaf = simple_map.lookup(&pid); 264*387f9dfdSAndroid Build Coastguard Worker if (leaf) 265*387f9dfdSAndroid Build Coastguard Worker leaf->size += size; 266*387f9dfdSAndroid Build Coastguard Worker return 0; 267*387f9dfdSAndroid Build Coastguard Worker}]]} 268*387f9dfdSAndroid Build Coastguard Workerend 269*387f9dfdSAndroid Build Coastguard Worker 270*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_unop_probe_read() 271*387f9dfdSAndroid Build Coastguard Worker local text = [[ 272*387f9dfdSAndroid Build Coastguard Worker#include <linux/blkdev.h> 273*387f9dfdSAndroid Build Coastguard Workerint trace_entry(struct pt_regs *ctx, struct request *req) { 274*387f9dfdSAndroid Build Coastguard Worker if (!(req->bio->bi_flags & 1)) 275*387f9dfdSAndroid Build Coastguard Worker return 1; 276*387f9dfdSAndroid Build Coastguard Worker if (((req->bio->bi_flags))) 277*387f9dfdSAndroid Build Coastguard Worker return 1; 278*387f9dfdSAndroid Build Coastguard Worker return 0; 279*387f9dfdSAndroid Build Coastguard Worker} 280*387f9dfdSAndroid Build Coastguard Worker]] 281*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=text} 282*387f9dfdSAndroid Build Coastguard Worker local fn = b:load_func("trace_entry", 'BPF_PROG_TYPE_KPROBE') 283*387f9dfdSAndroid Build Coastguard Workerend 284*387f9dfdSAndroid Build Coastguard Worker 285*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_complex_leaf_types() 286*387f9dfdSAndroid Build Coastguard Worker local text = [[ 287*387f9dfdSAndroid Build Coastguard Workerstruct list; 288*387f9dfdSAndroid Build Coastguard Workerstruct list { 289*387f9dfdSAndroid Build Coastguard Worker struct list *selfp; 290*387f9dfdSAndroid Build Coastguard Worker struct list *another_selfp; 291*387f9dfdSAndroid Build Coastguard Worker struct list *selfp_array[2]; 292*387f9dfdSAndroid Build Coastguard Worker}; 293*387f9dfdSAndroid Build Coastguard Workerstruct empty { 294*387f9dfdSAndroid Build Coastguard Worker}; 295*387f9dfdSAndroid Build Coastguard Workerunion emptyu { 296*387f9dfdSAndroid Build Coastguard Worker struct empty *em1; 297*387f9dfdSAndroid Build Coastguard Worker struct empty em2; 298*387f9dfdSAndroid Build Coastguard Worker struct empty em3; 299*387f9dfdSAndroid Build Coastguard Worker struct empty em4; 300*387f9dfdSAndroid Build Coastguard Worker}; 301*387f9dfdSAndroid Build Coastguard WorkerBPF_ARRAY(t1, struct list, 1); 302*387f9dfdSAndroid Build Coastguard WorkerBPF_ARRAY(t2, struct list *, 1); 303*387f9dfdSAndroid Build Coastguard WorkerBPF_ARRAY(t3, union emptyu, 1); 304*387f9dfdSAndroid Build Coastguard Worker]] 305*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=text} 306*387f9dfdSAndroid Build Coastguard Worker local ffi = require("ffi") 307*387f9dfdSAndroid Build Coastguard Worker 308*387f9dfdSAndroid Build Coastguard Worker -- TODO: ptrs? 309*387f9dfdSAndroid Build Coastguard Worker assert_equals(ffi.sizeof(b:get_table("t3").c_leaf), 8) 310*387f9dfdSAndroid Build Coastguard Workerend 311*387f9dfdSAndroid Build Coastguard Worker 312*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_cflags() 313*387f9dfdSAndroid Build Coastguard Worker local text = [[ 314*387f9dfdSAndroid Build Coastguard Worker#ifndef MYFLAG 315*387f9dfdSAndroid Build Coastguard Worker#error "MYFLAG not set as expected" 316*387f9dfdSAndroid Build Coastguard Worker#endif 317*387f9dfdSAndroid Build Coastguard Worker]] 318*387f9dfdSAndroid Build Coastguard Worker local b = BPF:new{text=text, cflags={"-DMYFLAG"}} 319*387f9dfdSAndroid Build Coastguard Workerend 320*387f9dfdSAndroid Build Coastguard Worker 321*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_exported_maps() 322*387f9dfdSAndroid Build Coastguard Worker local b1 = BPF{text=[[BPF_TABLE_PUBLIC("hash", int, int, table1, 10);]]} 323*387f9dfdSAndroid Build Coastguard Worker local b2 = BPF{text=[[BPF_TABLE("extern", int, int, table1, 10);]]} 324*387f9dfdSAndroid Build Coastguard Workerend 325*387f9dfdSAndroid Build Coastguard Worker 326*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_syntax_error() 327*387f9dfdSAndroid Build Coastguard Worker assert_error_msg_contains( 328*387f9dfdSAndroid Build Coastguard Worker "failed to compile BPF module", 329*387f9dfdSAndroid Build Coastguard Worker BPF.new, 330*387f9dfdSAndroid Build Coastguard Worker BPF, {text=[[int failure(void *ctx) { if (); return 0; }]]}) 331*387f9dfdSAndroid Build Coastguard Workerend 332*387f9dfdSAndroid Build Coastguard Worker 333*387f9dfdSAndroid Build Coastguard Workersuite("TestClang", TestClang) 334