1
2
3#include "vmlinux.h"
4#include <bpf/bpf_helpers.h>
5
6char _license[] SEC("license") = "GPL";
7
8struct {
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
15struct {
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
22struct callback_ctx {
23 int output;
24};
25
26static __u64
27check_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;
33 return 0;
34}
35
36__u32 cpu = 0;
37__u64 percpu_val = 0;
38
39static __u64
40check_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
48u32 arraymap_output = 0;
49
50SEC("classifier")
51int 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