xref: /linux/tools/testing/selftests/bpf/progs/tailcall_cgrp_storage.c (revision b2128290c29902315e632ea59e0504d6bc9e9b42)
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