16b9e3331SYonghong Song // SPDX-License-Identifier: GPL-2.0
26b9e3331SYonghong Song /* Copyright (c) 2021 Facebook */
36b9e3331SYonghong Song #include "vmlinux.h"
46b9e3331SYonghong Song #include <bpf/bpf_helpers.h>
56b9e3331SYonghong Song 
66b9e3331SYonghong Song char _license[] SEC("license") = "GPL";
76b9e3331SYonghong Song 
86b9e3331SYonghong Song struct {
96b9e3331SYonghong Song 	__uint(type, BPF_MAP_TYPE_ARRAY);
106b9e3331SYonghong Song 	__uint(max_entries, 3);
116b9e3331SYonghong Song 	__type(key, __u32);
126b9e3331SYonghong Song 	__type(value, __u64);
136b9e3331SYonghong Song } arraymap SEC(".maps");
146b9e3331SYonghong Song 
156b9e3331SYonghong Song struct {
166b9e3331SYonghong Song 	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
176b9e3331SYonghong Song 	__uint(max_entries, 1);
186b9e3331SYonghong Song 	__type(key, __u32);
196b9e3331SYonghong Song 	__type(value, __u64);
206b9e3331SYonghong Song } percpu_map SEC(".maps");
216b9e3331SYonghong Song 
226b9e3331SYonghong Song struct callback_ctx {
236b9e3331SYonghong Song 	int output;
246b9e3331SYonghong Song };
256b9e3331SYonghong Song 
26*d99341b3SMartin KaFai Lau const volatile int bypass_unused = 1;
27*d99341b3SMartin KaFai Lau 
28*d99341b3SMartin KaFai Lau static __u64
unused_subprog(struct bpf_map * map,__u32 * key,__u64 * val,struct callback_ctx * data)29*d99341b3SMartin KaFai Lau unused_subprog(struct bpf_map *map, __u32 *key, __u64 *val,
30*d99341b3SMartin KaFai Lau 	       struct callback_ctx *data)
31*d99341b3SMartin KaFai Lau {
32*d99341b3SMartin KaFai Lau 	data->output = 0;
33*d99341b3SMartin KaFai Lau 	return 1;
34*d99341b3SMartin KaFai Lau }
35*d99341b3SMartin KaFai Lau 
366b9e3331SYonghong Song static __u64
check_array_elem(struct bpf_map * map,__u32 * key,__u64 * val,struct callback_ctx * data)376b9e3331SYonghong Song check_array_elem(struct bpf_map *map, __u32 *key, __u64 *val,
386b9e3331SYonghong Song 		 struct callback_ctx *data)
396b9e3331SYonghong Song {
406b9e3331SYonghong Song 	data->output += *val;
416b9e3331SYonghong Song 	if (*key == 1)
426b9e3331SYonghong Song 		return 1; /* stop the iteration */
436b9e3331SYonghong Song 	return 0;
446b9e3331SYonghong Song }
456b9e3331SYonghong Song 
466b9e3331SYonghong Song __u32 cpu = 0;
476b9e3331SYonghong Song __u64 percpu_val = 0;
486b9e3331SYonghong Song 
496b9e3331SYonghong Song static __u64
check_percpu_elem(struct bpf_map * map,__u32 * key,__u64 * val,struct callback_ctx * data)506b9e3331SYonghong Song check_percpu_elem(struct bpf_map *map, __u32 *key, __u64 *val,
516b9e3331SYonghong Song 		  struct callback_ctx *data)
526b9e3331SYonghong Song {
536b9e3331SYonghong Song 	cpu = bpf_get_smp_processor_id();
546b9e3331SYonghong Song 	percpu_val = *val;
556b9e3331SYonghong Song 	return 0;
566b9e3331SYonghong Song }
576b9e3331SYonghong Song 
586b9e3331SYonghong Song u32 arraymap_output = 0;
596b9e3331SYonghong Song 
60c22bdd28SAndrii Nakryiko SEC("tc")
test_pkt_access(struct __sk_buff * skb)616b9e3331SYonghong Song int test_pkt_access(struct __sk_buff *skb)
626b9e3331SYonghong Song {
636b9e3331SYonghong Song 	struct callback_ctx data;
646b9e3331SYonghong Song 
656b9e3331SYonghong Song 	data.output = 0;
666b9e3331SYonghong Song 	bpf_for_each_map_elem(&arraymap, check_array_elem, &data, 0);
67*d99341b3SMartin KaFai Lau 	if (!bypass_unused)
68*d99341b3SMartin KaFai Lau 		bpf_for_each_map_elem(&arraymap, unused_subprog, &data, 0);
696b9e3331SYonghong Song 	arraymap_output = data.output;
706b9e3331SYonghong Song 
716b9e3331SYonghong Song 	bpf_for_each_map_elem(&percpu_map, check_percpu_elem, (void *)0, 0);
726b9e3331SYonghong Song 	return 0;
736b9e3331SYonghong Song }
74