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, 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 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++, 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