github.com/kubeshark/ebpf@v0.9.2/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  #if __clang_major__ >= 9
     6  
     7  int __section("socket/tail") tail_1() {
     8  	return 42;
     9  }
    10  
    11  // Tail call map (program array) initialized with program pointers.
    12  struct {
    13  	__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
    14  	__uint(key_size, sizeof(uint32_t));
    15  	__uint(max_entries, 2);
    16  	__array(values, int());
    17  } prog_array_init __section(".maps") = {
    18  	.values =
    19  		{
    20  			// Skip index 0 to exercise empty array slots.
    21  			[1] = &tail_1,
    22  		},
    23  };
    24  
    25  int __section("socket/main") tail_main(void *ctx) {
    26  	// If prog_array_init is correctly populated, the tail call
    27  	// will succeed and the program will continue in tail_1 and
    28  	// not return here.
    29  	tail_call(ctx, &prog_array_init, 1);
    30  
    31  	return 0;
    32  }
    33  
    34  // Inner map with a single possible entry.
    35  struct {
    36  	__uint(type, BPF_MAP_TYPE_ARRAY);
    37  	__uint(max_entries, 1);
    38  	__type(key, uint32_t);
    39  	__type(value, uint32_t);
    40  } inner_map __section(".maps");
    41  
    42  // Outer map carrying a reference to the inner map.
    43  struct {
    44  	__uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);
    45  	__uint(max_entries, 2);
    46  	__uint(key_size, sizeof(uint32_t));
    47  	__uint(value_size, sizeof(uint32_t));
    48  	__array(values, typeof(inner_map));
    49  } outer_map_init __section(".maps") = {
    50  	.values =
    51  		{
    52  			// Skip index 0 to exercise empty array slots.
    53  			[1] = &inner_map,
    54  		},
    55  };
    56  
    57  #else
    58  #error This file has to be compiled with clang >= 9
    59  #endif