1bd4aed0eSJiong Wang // SPDX-License-Identifier: GPL-2.0
2bd4aed0eSJiong Wang /* Copyright (c) 2018 Facebook */
3bd4aed0eSJiong Wang #include <stddef.h>
4bd4aed0eSJiong Wang #include <linux/bpf.h>
5bd4aed0eSJiong Wang #include <linux/types.h>
6bd4aed0eSJiong Wang #include "bpf_helpers.h"
7bd4aed0eSJiong Wang 
81639b17cSAndrii Nakryiko struct {
91639b17cSAndrii Nakryiko 	__uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);
101639b17cSAndrii Nakryiko 	__uint(max_entries, 1);
111639b17cSAndrii Nakryiko 	__uint(map_flags, 0);
121639b17cSAndrii Nakryiko 	__uint(key_size, sizeof(__u32));
13bd4aed0eSJiong Wang 	/* must be sizeof(__u32) for map in map */
141639b17cSAndrii Nakryiko 	__uint(value_size, sizeof(__u32));
151639b17cSAndrii Nakryiko } mim_array SEC(".maps");
16bd4aed0eSJiong Wang 
171639b17cSAndrii Nakryiko struct {
181639b17cSAndrii Nakryiko 	__uint(type, BPF_MAP_TYPE_HASH_OF_MAPS);
191639b17cSAndrii Nakryiko 	__uint(max_entries, 1);
201639b17cSAndrii Nakryiko 	__uint(map_flags, 0);
211639b17cSAndrii Nakryiko 	__uint(key_size, sizeof(int));
22bd4aed0eSJiong Wang 	/* must be sizeof(__u32) for map in map */
231639b17cSAndrii Nakryiko 	__uint(value_size, sizeof(__u32));
241639b17cSAndrii Nakryiko } mim_hash SEC(".maps");
25bd4aed0eSJiong Wang 
26bd4aed0eSJiong Wang SEC("xdp_mimtest")
27bd4aed0eSJiong Wang int xdp_mimtest0(struct xdp_md *ctx)
28bd4aed0eSJiong Wang {
29bd4aed0eSJiong Wang 	int value = 123;
309eca5083SYonghong Song 	int *value_p;
31bd4aed0eSJiong Wang 	int key = 0;
32bd4aed0eSJiong Wang 	void *map;
33bd4aed0eSJiong Wang 
34bd4aed0eSJiong Wang 	map = bpf_map_lookup_elem(&mim_array, &key);
35bd4aed0eSJiong Wang 	if (!map)
36bd4aed0eSJiong Wang 		return XDP_DROP;
37bd4aed0eSJiong Wang 
38bd4aed0eSJiong Wang 	bpf_map_update_elem(map, &key, &value, 0);
399eca5083SYonghong Song 	value_p = bpf_map_lookup_elem(map, &key);
409eca5083SYonghong Song 	if (!value_p || *value_p != 123)
419eca5083SYonghong Song 		return XDP_DROP;
42bd4aed0eSJiong Wang 
43bd4aed0eSJiong Wang 	map = bpf_map_lookup_elem(&mim_hash, &key);
44bd4aed0eSJiong Wang 	if (!map)
45bd4aed0eSJiong Wang 		return XDP_DROP;
46bd4aed0eSJiong Wang 
47bd4aed0eSJiong Wang 	bpf_map_update_elem(map, &key, &value, 0);
48bd4aed0eSJiong Wang 
49bd4aed0eSJiong Wang 	return XDP_PASS;
50bd4aed0eSJiong Wang }
51bd4aed0eSJiong Wang 
52bd4aed0eSJiong Wang int _version SEC("version") = 1;
53bd4aed0eSJiong Wang char _license[] SEC("license") = "GPL";
54