1ed9109adSJoanne Koong // SPDX-License-Identifier: GPL-2.0
2ed9109adSJoanne Koong /* Copyright (c) 2021 Facebook */
3ed9109adSJoanne Koong 
4ed9109adSJoanne Koong #include <linux/bpf.h>
5ed9109adSJoanne Koong #include <bpf/bpf_helpers.h>
6*e91d280cSNaveen N. Rao #include "bpf_misc.h"
7ed9109adSJoanne Koong 
8ed9109adSJoanne Koong char _license[] SEC("license") = "GPL";
9ed9109adSJoanne Koong 
10ed9109adSJoanne Koong struct bpf_map;
11ed9109adSJoanne Koong 
12ed9109adSJoanne Koong struct {
13ed9109adSJoanne Koong 	__uint(type, BPF_MAP_TYPE_ARRAY);
14ed9109adSJoanne Koong 	__type(key, __u32);
15ed9109adSJoanne Koong 	__type(value, __u32);
16ed9109adSJoanne Koong 	__uint(max_entries, 1000);
17ed9109adSJoanne Koong } map_random_data SEC(".maps");
18ed9109adSJoanne Koong 
19ed9109adSJoanne Koong struct map_bloom_type {
20ed9109adSJoanne Koong 	__uint(type, BPF_MAP_TYPE_BLOOM_FILTER);
21ed9109adSJoanne Koong 	__type(value, __u32);
22ed9109adSJoanne Koong 	__uint(max_entries, 10000);
23ed9109adSJoanne Koong 	__uint(map_extra, 5);
24ed9109adSJoanne Koong } map_bloom SEC(".maps");
25ed9109adSJoanne Koong 
26ed9109adSJoanne Koong struct {
27ed9109adSJoanne Koong 	__uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);
28ed9109adSJoanne Koong 	__type(key, int);
29ed9109adSJoanne Koong 	__type(value, int);
30ed9109adSJoanne Koong 	__uint(max_entries, 1);
31ed9109adSJoanne Koong 	__array(values, struct map_bloom_type);
32ed9109adSJoanne Koong } outer_map SEC(".maps");
33ed9109adSJoanne Koong 
34ed9109adSJoanne Koong struct callback_ctx {
35ed9109adSJoanne Koong 	struct bpf_map *map;
36ed9109adSJoanne Koong };
37ed9109adSJoanne Koong 
38ed9109adSJoanne Koong int error = 0;
39ed9109adSJoanne Koong 
40ed9109adSJoanne Koong static __u64
check_elem(struct bpf_map * map,__u32 * key,__u32 * val,struct callback_ctx * data)41ed9109adSJoanne Koong check_elem(struct bpf_map *map, __u32 *key, __u32 *val,
42ed9109adSJoanne Koong 	   struct callback_ctx *data)
43ed9109adSJoanne Koong {
44ed9109adSJoanne Koong 	int err;
45ed9109adSJoanne Koong 
46ed9109adSJoanne Koong 	err = bpf_map_peek_elem(data->map, val);
47ed9109adSJoanne Koong 	if (err) {
48ed9109adSJoanne Koong 		error |= 1;
49ed9109adSJoanne Koong 		return 1; /* stop the iteration */
50ed9109adSJoanne Koong 	}
51ed9109adSJoanne Koong 
52ed9109adSJoanne Koong 	return 0;
53ed9109adSJoanne Koong }
54ed9109adSJoanne Koong 
55*e91d280cSNaveen N. Rao SEC("fentry/" SYS_PREFIX "sys_getpgid")
inner_map(void * ctx)56ed9109adSJoanne Koong int inner_map(void *ctx)
57ed9109adSJoanne Koong {
58ed9109adSJoanne Koong 	struct bpf_map *inner_map;
59ed9109adSJoanne Koong 	struct callback_ctx data;
60ed9109adSJoanne Koong 	int key = 0;
61ed9109adSJoanne Koong 
62ed9109adSJoanne Koong 	inner_map = bpf_map_lookup_elem(&outer_map, &key);
63ed9109adSJoanne Koong 	if (!inner_map) {
64ed9109adSJoanne Koong 		error |= 2;
65ed9109adSJoanne Koong 		return 0;
66ed9109adSJoanne Koong 	}
67ed9109adSJoanne Koong 
68ed9109adSJoanne Koong 	data.map = inner_map;
69ed9109adSJoanne Koong 	bpf_for_each_map_elem(&map_random_data, check_elem, &data, 0);
70ed9109adSJoanne Koong 
71ed9109adSJoanne Koong 	return 0;
72ed9109adSJoanne Koong }
73ed9109adSJoanne Koong 
74*e91d280cSNaveen N. Rao SEC("fentry/" SYS_PREFIX "sys_getpgid")
check_bloom(void * ctx)75ed9109adSJoanne Koong int check_bloom(void *ctx)
76ed9109adSJoanne Koong {
77ed9109adSJoanne Koong 	struct callback_ctx data;
78ed9109adSJoanne Koong 
79ed9109adSJoanne Koong 	data.map = (struct bpf_map *)&map_bloom;
80ed9109adSJoanne Koong 	bpf_for_each_map_elem(&map_random_data, check_elem, &data, 0);
81ed9109adSJoanne Koong 
82ed9109adSJoanne Koong 	return 0;
83ed9109adSJoanne Koong }
84