92 lines · c
1// SPDX-License-Identifier: GPL-2.02 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