1#include "../../include/bpf_api.h"
2
3#define MAP_INNER_ID	42
4
5struct bpf_elf_map __section_maps map_inner = {
6	.type		= BPF_MAP_TYPE_ARRAY,
7	.size_key	= sizeof(uint32_t),
8	.size_value	= sizeof(uint32_t),
9	.id		= MAP_INNER_ID,
10	.inner_idx	= 0,
11	.pinning	= PIN_GLOBAL_NS,
12	.max_elem	= 1,
13};
14
15struct bpf_elf_map __section_maps map_outer = {
16	.type		= BPF_MAP_TYPE_ARRAY_OF_MAPS,
17	.size_key	= sizeof(uint32_t),
18	.size_value	= sizeof(uint32_t),
19	.inner_id	= MAP_INNER_ID,
20	.pinning	= PIN_GLOBAL_NS,
21	.max_elem	= 1,
22};
23
24__section("egress")
25int emain(struct __sk_buff *skb)
26{
27	struct bpf_elf_map *map_inner;
28	int key = 0, *val;
29
30	map_inner = map_lookup_elem(&map_outer, &key);
31	if (map_inner) {
32		val = map_lookup_elem(map_inner, &key);
33		if (val)
34			lock_xadd(val, 1);
35	}
36
37	return BPF_H_DEFAULT;
38}
39
40__section("ingress")
41int imain(struct __sk_buff *skb)
42{
43	struct bpf_elf_map *map_inner;
44	int key = 0, *val;
45
46	map_inner = map_lookup_elem(&map_outer, &key);
47	if (map_inner) {
48		val = map_lookup_elem(map_inner, &key);
49		if (val)
50			printt("map val: %d\n", *val);
51	}
52
53	return BPF_H_DEFAULT;
54}
55
56BPF_LICENSE("GPL");
57