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