#include "../../include/bpf_api.h" struct inner_map { __uint(type, BPF_MAP_TYPE_ARRAY); __uint(key_size, sizeof(uint32_t)); __uint(value_size, sizeof(uint32_t)); __uint(max_entries, 1); } map_inner __section(".maps"); struct { __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS); __uint(key_size, sizeof(uint32_t)); __uint(value_size, sizeof(uint32_t)); __uint(max_entries, 1); __uint(pinning, LIBBPF_PIN_BY_NAME); __array(values, struct inner_map); } map_outer __section(".maps") = { .values = { [0] = &map_inner, }, }; __section("egress") int emain(struct __sk_buff *skb) { struct bpf_elf_map *map_inner; int key = 0, *val; map_inner = map_lookup_elem(&map_outer, &key); if (map_inner) { val = map_lookup_elem(map_inner, &key); if (val) lock_xadd(val, 1); } return BPF_H_DEFAULT; } __section("ingress") int imain(struct __sk_buff *skb) { struct bpf_elf_map *map_inner; int key = 0, *val; map_inner = map_lookup_elem(&map_outer, &key); if (map_inner) { val = map_lookup_elem(map_inner, &key); if (val) printt("map val: %d\n", *val); } return BPF_H_DEFAULT; } BPF_LICENSE("GPL");