github.com/cilium/ebpf@v0.15.1-0.20240517100537-8079b37aa138/testdata/btf_map_init.c (about) 1 /* This file excercises the ELF loader. It is not a valid BPF program. */ 2 3 #include "common.h" 4 5 int __section("socket/tail") tail_1() { 6 return 42; 7 } 8 9 // Tail call map (program array) initialized with program pointers. 10 struct { 11 __uint(type, BPF_MAP_TYPE_PROG_ARRAY); 12 __type(key, uint32_t); 13 __type(value, uint32_t); 14 __uint(max_entries, 2); 15 __array(values, int()); 16 } prog_array_init __section(".maps") = { 17 .values = 18 { 19 // Skip index 0 to exercise empty array slots. 20 [1] = &tail_1, 21 }, 22 }; 23 24 int __section("socket/main") tail_main(void *ctx) { 25 // If prog_array_init is correctly populated, the tail call 26 // will succeed and the program will continue in tail_1 and 27 // not return here. 28 tail_call(ctx, &prog_array_init, 1); 29 30 return 0; 31 } 32 33 // Inner map with a single possible entry. 34 struct { 35 __uint(type, BPF_MAP_TYPE_ARRAY); 36 __uint(max_entries, 1); 37 __type(key, uint32_t); 38 __type(value, uint32_t); 39 } inner_map __section(".maps"); 40 41 // Outer map carrying a reference to the inner map. 42 struct { 43 __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS); 44 __uint(max_entries, 2); 45 __type(key, uint32_t); 46 __type(value, uint32_t); 47 __array(values, typeof(inner_map)); 48 } outer_map_init __section(".maps") = { 49 .values = 50 { 51 // Skip index 0 to exercise empty array slots. 52 [1] = &inner_map, 53 }, 54 };