18b08807dSDmitrii Banshchikov // SPDX-License-Identifier: GPL-2.0
28b08807dSDmitrii Banshchikov
38b08807dSDmitrii Banshchikov #include <linux/bpf.h>
48b08807dSDmitrii Banshchikov
58b08807dSDmitrii Banshchikov #include <bpf/bpf_helpers.h>
68b08807dSDmitrii Banshchikov
78b08807dSDmitrii Banshchikov struct S {
88b08807dSDmitrii Banshchikov int v;
98b08807dSDmitrii Banshchikov };
108b08807dSDmitrii Banshchikov
11*256eab48SAndrii Nakryiko struct S global_variable = {};
128b08807dSDmitrii Banshchikov
138b08807dSDmitrii Banshchikov struct {
148b08807dSDmitrii Banshchikov __uint(type, BPF_MAP_TYPE_ARRAY);
158b08807dSDmitrii Banshchikov __uint(max_entries, 7);
168b08807dSDmitrii Banshchikov __type(key, __u32);
178b08807dSDmitrii Banshchikov __type(value, int);
188b08807dSDmitrii Banshchikov } values SEC(".maps");
198b08807dSDmitrii Banshchikov
save_value(__u32 index,int value)208b08807dSDmitrii Banshchikov static void save_value(__u32 index, int value)
218b08807dSDmitrii Banshchikov {
228b08807dSDmitrii Banshchikov bpf_map_update_elem(&values, &index, &value, 0);
238b08807dSDmitrii Banshchikov }
248b08807dSDmitrii Banshchikov
foo(__u32 index,struct S * s)258b08807dSDmitrii Banshchikov __noinline int foo(__u32 index, struct S *s)
268b08807dSDmitrii Banshchikov {
278b08807dSDmitrii Banshchikov if (s) {
288b08807dSDmitrii Banshchikov save_value(index, s->v);
298b08807dSDmitrii Banshchikov return ++s->v;
308b08807dSDmitrii Banshchikov }
318b08807dSDmitrii Banshchikov
328b08807dSDmitrii Banshchikov save_value(index, 0);
338b08807dSDmitrii Banshchikov
348b08807dSDmitrii Banshchikov return 1;
358b08807dSDmitrii Banshchikov }
368b08807dSDmitrii Banshchikov
bar(__u32 index,volatile struct S * s)378b08807dSDmitrii Banshchikov __noinline int bar(__u32 index, volatile struct S *s)
388b08807dSDmitrii Banshchikov {
398b08807dSDmitrii Banshchikov if (s) {
408b08807dSDmitrii Banshchikov save_value(index, s->v);
418b08807dSDmitrii Banshchikov return ++s->v;
428b08807dSDmitrii Banshchikov }
438b08807dSDmitrii Banshchikov
448b08807dSDmitrii Banshchikov save_value(index, 0);
458b08807dSDmitrii Banshchikov
468b08807dSDmitrii Banshchikov return 1;
478b08807dSDmitrii Banshchikov }
488b08807dSDmitrii Banshchikov
baz(struct S ** s)498b08807dSDmitrii Banshchikov __noinline int baz(struct S **s)
508b08807dSDmitrii Banshchikov {
518b08807dSDmitrii Banshchikov if (s)
528b08807dSDmitrii Banshchikov *s = 0;
538b08807dSDmitrii Banshchikov
548b08807dSDmitrii Banshchikov return 0;
558b08807dSDmitrii Banshchikov }
568b08807dSDmitrii Banshchikov
578b08807dSDmitrii Banshchikov SEC("cgroup_skb/ingress")
test_cls(struct __sk_buff * skb)588b08807dSDmitrii Banshchikov int test_cls(struct __sk_buff *skb)
598b08807dSDmitrii Banshchikov {
608b08807dSDmitrii Banshchikov __u32 index = 0;
618b08807dSDmitrii Banshchikov
628b08807dSDmitrii Banshchikov {
638b08807dSDmitrii Banshchikov const int v = foo(index++, 0);
648b08807dSDmitrii Banshchikov
658b08807dSDmitrii Banshchikov save_value(index++, v);
668b08807dSDmitrii Banshchikov }
678b08807dSDmitrii Banshchikov
688b08807dSDmitrii Banshchikov {
698b08807dSDmitrii Banshchikov struct S s = { .v = 100 };
708b08807dSDmitrii Banshchikov
718b08807dSDmitrii Banshchikov foo(index++, &s);
728b08807dSDmitrii Banshchikov save_value(index++, s.v);
738b08807dSDmitrii Banshchikov }
748b08807dSDmitrii Banshchikov
758b08807dSDmitrii Banshchikov {
768b08807dSDmitrii Banshchikov global_variable.v = 42;
778b08807dSDmitrii Banshchikov bar(index++, &global_variable);
788b08807dSDmitrii Banshchikov save_value(index++, global_variable.v);
798b08807dSDmitrii Banshchikov }
808b08807dSDmitrii Banshchikov
818b08807dSDmitrii Banshchikov {
828b08807dSDmitrii Banshchikov struct S v, *p = &v;
838b08807dSDmitrii Banshchikov
848b08807dSDmitrii Banshchikov baz(&p);
858b08807dSDmitrii Banshchikov save_value(index++, !p);
868b08807dSDmitrii Banshchikov }
878b08807dSDmitrii Banshchikov
888b08807dSDmitrii Banshchikov return 0;
898b08807dSDmitrii Banshchikov }
908b08807dSDmitrii Banshchikov
918b08807dSDmitrii Banshchikov char _license[] SEC("license") = "GPL";
92