1612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann#include "../../include/bpf_api.h"
2612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann
3612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann#define MAP_INNER_ID	42
4612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann
5612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmannstruct bpf_elf_map __section_maps map_inner = {
6612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	.type		= BPF_MAP_TYPE_ARRAY,
7612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	.size_key	= sizeof(uint32_t),
8612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	.size_value	= sizeof(uint32_t),
9612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	.id		= MAP_INNER_ID,
10612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	.inner_idx	= 0,
11612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	.pinning	= PIN_GLOBAL_NS,
12612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	.max_elem	= 1,
13612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann};
14612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann
15612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmannstruct bpf_elf_map __section_maps map_outer = {
16612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	.type		= BPF_MAP_TYPE_ARRAY_OF_MAPS,
17612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	.size_key	= sizeof(uint32_t),
18612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	.size_value	= sizeof(uint32_t),
19612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	.inner_id	= MAP_INNER_ID,
20612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	.pinning	= PIN_GLOBAL_NS,
21612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	.max_elem	= 1,
22612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann};
23612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann
24612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann__section("egress")
25612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmannint emain(struct __sk_buff *skb)
26612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann{
27612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	struct bpf_elf_map *map_inner;
28612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	int key = 0, *val;
29612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann
30612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	map_inner = map_lookup_elem(&map_outer, &key);
31612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	if (map_inner) {
32612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann		val = map_lookup_elem(map_inner, &key);
33612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann		if (val)
34612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann			lock_xadd(val, 1);
35612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	}
36612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann
37612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	return BPF_H_DEFAULT;
38612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann}
39612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann
40612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann__section("ingress")
41612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmannint imain(struct __sk_buff *skb)
42612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann{
43612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	struct bpf_elf_map *map_inner;
44612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	int key = 0, *val;
45612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann
46612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	map_inner = map_lookup_elem(&map_outer, &key);
47612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	if (map_inner) {
48612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann		val = map_lookup_elem(map_inner, &key);
49612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann		if (val)
50612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann			printt("map val: %d\n", *val);
51612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	}
52612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann
53612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann	return BPF_H_DEFAULT;
54612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann}
55612ff099a11092a6ed4084b84a8810155884bacaDaniel Borkmann
56612ff099a11092a6ed4084b84a8810155884bacaDaniel BorkmannBPF_LICENSE("GPL");
57