1 // SPDX-License-Identifier: GPL-2.0
2
3 #include <linux/bpf.h>
4
5 #include <bpf/bpf_helpers.h>
6
7 struct S {
8 int v;
9 };
10
11 struct S global_variable = {};
12
13 struct {
14 __uint(type, BPF_MAP_TYPE_ARRAY);
15 __uint(max_entries, 7);
16 __type(key, __u32);
17 __type(value, int);
18 } values SEC(".maps");
19
save_value(__u32 index,int value)20 static void save_value(__u32 index, int value)
21 {
22 bpf_map_update_elem(&values, &index, &value, 0);
23 }
24
foo(__u32 index,struct S * s)25 __noinline int foo(__u32 index, struct S *s)
26 {
27 if (s) {
28 save_value(index, s->v);
29 return ++s->v;
30 }
31
32 save_value(index, 0);
33
34 return 1;
35 }
36
bar(__u32 index,volatile struct S * s)37 __noinline int bar(__u32 index, volatile struct S *s)
38 {
39 if (s) {
40 save_value(index, s->v);
41 return ++s->v;
42 }
43
44 save_value(index, 0);
45
46 return 1;
47 }
48
baz(struct S ** s)49 __noinline int baz(struct S **s)
50 {
51 if (s)
52 *s = 0;
53
54 return 0;
55 }
56
57 SEC("cgroup_skb/ingress")
test_cls(struct __sk_buff * skb)58 int test_cls(struct __sk_buff *skb)
59 {
60 __u32 index = 0;
61
62 {
63 const int v = foo(index++, 0);
64
65 save_value(index++, v);
66 }
67
68 {
69 struct S s = { .v = 100 };
70
71 foo(index++, &s);
72 save_value(index++, s.v);
73 }
74
75 {
76 global_variable.v = 42;
77 bar(index++, &global_variable);
78 save_value(index++, global_variable.v);
79 }
80
81 {
82 struct S v, *p = &v;
83
84 baz(&p);
85 save_value(index++, !p);
86 }
87
88 return 0;
89 }
90
91 char _license[] SEC("license") = "GPL";
92