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