1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2021 Facebook */
3 #include "vmlinux.h"
4 #include <bpf/bpf_helpers.h>
5 
6 char _license[] SEC("license") = "GPL";
7 
8 struct {
9 	__uint(type, BPF_MAP_TYPE_ARRAY);
10 	__uint(max_entries, 3);
11 	__type(key, __u32);
12 	__type(value, __u64);
13 } arraymap SEC(".maps");
14 
15 struct {
16 	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
17 	__uint(max_entries, 1);
18 	__type(key, __u32);
19 	__type(value, __u64);
20 } percpu_map SEC(".maps");
21 
22 struct callback_ctx {
23 	int output;
24 };
25 
26 static __u64
27 check_array_elem(struct bpf_map *map, __u32 *key, __u64 *val,
28 		 struct callback_ctx *data)
29 {
30 	data->output += *val;
31 	if (*key == 1)
32 		return 1; /* stop the iteration */
33 	return 0;
34 }
35 
36 __u32 cpu = 0;
37 __u64 percpu_val = 0;
38 
39 static __u64
40 check_percpu_elem(struct bpf_map *map, __u32 *key, __u64 *val,
41 		  struct callback_ctx *data)
42 {
43 	cpu = bpf_get_smp_processor_id();
44 	percpu_val = *val;
45 	return 0;
46 }
47 
48 u32 arraymap_output = 0;
49 
50 SEC("classifier")
51 int test_pkt_access(struct __sk_buff *skb)
52 {
53 	struct callback_ctx data;
54 
55 	data.output = 0;
56 	bpf_for_each_map_elem(&arraymap, check_array_elem, &data, 0);
57 	arraymap_output = data.output;
58 
59 	bpf_for_each_map_elem(&percpu_map, check_percpu_elem, (void *)0, 0);
60 	return 0;
61 }
62