1*30dee2c1SLin Ma // SPDX-License-Identifier: GPL-2.0 2*30dee2c1SLin Ma 3*30dee2c1SLin Ma #include <vmlinux.h> 4*30dee2c1SLin Ma #include <bpf/bpf_helpers.h> 5*30dee2c1SLin Ma 6*30dee2c1SLin Ma struct { 7*30dee2c1SLin Ma __uint(type, BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE); 8*30dee2c1SLin Ma __type(key, struct bpf_cgroup_storage_key); 9*30dee2c1SLin Ma __type(value, __u64); 10*30dee2c1SLin Ma } storage_map SEC(".maps"); 11*30dee2c1SLin Ma 12*30dee2c1SLin Ma struct { 13*30dee2c1SLin Ma __uint(type, BPF_MAP_TYPE_PROG_ARRAY); 14*30dee2c1SLin Ma __uint(max_entries, 1); 15*30dee2c1SLin Ma __uint(key_size, sizeof(__u32)); 16*30dee2c1SLin Ma __uint(value_size, sizeof(__u32)); 17*30dee2c1SLin Ma } prog_array SEC(".maps"); 18*30dee2c1SLin Ma 19*30dee2c1SLin Ma SEC("cgroup_skb/egress") 20*30dee2c1SLin Ma int caller_prog(struct __sk_buff *skb) 21*30dee2c1SLin Ma { 22*30dee2c1SLin Ma __u64 *storage; 23*30dee2c1SLin Ma 24*30dee2c1SLin Ma storage = bpf_get_local_storage(&storage_map, 0); 25*30dee2c1SLin Ma if (storage) 26*30dee2c1SLin Ma *storage = 1; 27*30dee2c1SLin Ma 28*30dee2c1SLin Ma bpf_tail_call(skb, &prog_array, 0); 29*30dee2c1SLin Ma return 1; 30*30dee2c1SLin Ma } 31*30dee2c1SLin Ma 32*30dee2c1SLin Ma SEC("cgroup_skb/egress") 33*30dee2c1SLin Ma int callee_prog(struct __sk_buff *skb) 34*30dee2c1SLin Ma { 35*30dee2c1SLin Ma __u64 *storage; 36*30dee2c1SLin Ma 37*30dee2c1SLin Ma storage = bpf_get_local_storage(&storage_map, 0); 38*30dee2c1SLin Ma if (storage) 39*30dee2c1SLin Ma *storage = 1; 40*30dee2c1SLin Ma 41*30dee2c1SLin Ma return 1; 42*30dee2c1SLin Ma } 43*30dee2c1SLin Ma 44*30dee2c1SLin Ma char _license[] SEC("license") = "GPL"; 45