1// SPDX-License-Identifier: GPL-2.0
2
3#include <linux/bpf.h>
4
5#include <bpf/bpf_helpers.h>
6
7struct S {
8	int v;
9};
10
11struct S global_variable = {};
12
13struct {
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
20static void save_value(__u32 index, int value)
21{
22	bpf_map_update_elem(&values, &index, &value, 0);
23}
24
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
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
49__noinline int baz(struct S **s)
50{
51	if (s)
52		*s = 0;
53
54	return 0;
55}
56
57SEC("cgroup_skb/ingress")
58int 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
91char _license[] SEC("license") = "GPL";
92