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 | |
20 | static 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, value: s->v); |
29 | return ++s->v; |
30 | } |
31 | |
32 | save_value(index, value: 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, value: s->v); |
41 | return ++s->v; |
42 | } |
43 | |
44 | save_value(index, value: 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 | |
57 | SEC("cgroup_skb/ingress" ) |
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: index++, value: v); |
66 | } |
67 | |
68 | { |
69 | struct S s = { .v = 100 }; |
70 | |
71 | foo(index++, &s); |
72 | save_value(index: index++, value: s.v); |
73 | } |
74 | |
75 | { |
76 | global_variable.v = 42; |
77 | bar(index++, &global_variable); |
78 | save_value(index: index++, value: global_variable.v); |
79 | } |
80 | |
81 | { |
82 | struct S v, *p = &v; |
83 | |
84 | baz(&p); |
85 | save_value(index: index++, value: !p); |
86 | } |
87 | |
88 | return 0; |
89 | } |
90 | |
91 | char _license[] SEC("license" ) = "GPL" ; |
92 | |