1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright (c) 2018 Facebook */ 3 #include <stddef.h> 4 #include <linux/bpf.h> 5 #include <linux/types.h> 6 #include <bpf/bpf_helpers.h> 7 8 struct { 9 __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS); 10 __uint(max_entries, 1); 11 __uint(map_flags, 0); 12 __type(key, __u32); 13 __type(value, __u32); 14 } mim_array SEC(".maps"); 15 16 struct { 17 __uint(type, BPF_MAP_TYPE_HASH_OF_MAPS); 18 __uint(max_entries, 1); 19 __uint(map_flags, 0); 20 __type(key, int); 21 __type(value, __u32); 22 } mim_hash SEC(".maps"); 23 24 /* The following three maps are used to test 25 * perf_event_array map can be an inner 26 * map of hash/array_of_maps. 27 */ 28 struct perf_event_array { 29 __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); 30 __type(key, __u32); 31 __type(value, __u32); 32 } inner_map0 SEC(".maps"); 33 34 struct { 35 __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS); 36 __uint(max_entries, 1); 37 __type(key, __u32); 38 __array(values, struct perf_event_array); 39 } mim_array_pe SEC(".maps") = { 40 .values = {&inner_map0}}; 41 42 struct { 43 __uint(type, BPF_MAP_TYPE_HASH_OF_MAPS); 44 __uint(max_entries, 1); 45 __type(key, __u32); 46 __array(values, struct perf_event_array); 47 } mim_hash_pe SEC(".maps") = { 48 .values = {&inner_map0}}; 49 50 SEC("xdp") 51 int xdp_mimtest0(struct xdp_md *ctx) 52 { 53 int value = 123; 54 int *value_p; 55 int key = 0; 56 void *map; 57 58 map = bpf_map_lookup_elem(&mim_array, &key); 59 if (!map) 60 return XDP_DROP; 61 62 bpf_map_update_elem(map, &key, &value, 0); 63 value_p = bpf_map_lookup_elem(map, &key); 64 if (!value_p || *value_p != 123) 65 return XDP_DROP; 66 67 map = bpf_map_lookup_elem(&mim_hash, &key); 68 if (!map) 69 return XDP_DROP; 70 71 bpf_map_update_elem(map, &key, &value, 0); 72 73 return XDP_PASS; 74 } 75 76 char _license[] SEC("license") = "GPL"; 77