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