1d4a89c1eSYiFei Zhu // SPDX-License-Identifier: GPL-2.0-only
2d4a89c1eSYiFei Zhu 
3d4a89c1eSYiFei Zhu /*
4d4a89c1eSYiFei Zhu  * Copyright 2020 Google LLC.
5d4a89c1eSYiFei Zhu  */
6d4a89c1eSYiFei Zhu 
7d4a89c1eSYiFei Zhu #include <errno.h>
8d4a89c1eSYiFei Zhu #include <linux/bpf.h>
9d4a89c1eSYiFei Zhu #include <linux/ip.h>
10d4a89c1eSYiFei Zhu #include <linux/udp.h>
11d4a89c1eSYiFei Zhu #include <bpf/bpf_helpers.h>
12d4a89c1eSYiFei Zhu 
139e5bd1f7SYiFei Zhu #include "progs/cg_storage_multi.h"
149e5bd1f7SYiFei Zhu 
15d4a89c1eSYiFei Zhu struct {
16d4a89c1eSYiFei Zhu 	__uint(type, BPF_MAP_TYPE_CGROUP_STORAGE);
17d4a89c1eSYiFei Zhu 	__type(key, struct bpf_cgroup_storage_key);
189e5bd1f7SYiFei Zhu 	__type(value, struct cgroup_value);
19d4a89c1eSYiFei Zhu } cgroup_storage SEC(".maps");
20d4a89c1eSYiFei Zhu 
21d4a89c1eSYiFei Zhu __u32 invocations = 0;
22d4a89c1eSYiFei Zhu 
23d4a89c1eSYiFei Zhu SEC("cgroup_skb/egress")
egress(struct __sk_buff * skb)24d4a89c1eSYiFei Zhu int egress(struct __sk_buff *skb)
25d4a89c1eSYiFei Zhu {
269e5bd1f7SYiFei Zhu 	struct cgroup_value *ptr_cg_storage =
279e5bd1f7SYiFei Zhu 		bpf_get_local_storage(&cgroup_storage, 0);
28d4a89c1eSYiFei Zhu 
299e5bd1f7SYiFei Zhu 	__sync_fetch_and_add(&ptr_cg_storage->egress_pkts, 1);
30d4a89c1eSYiFei Zhu 	__sync_fetch_and_add(&invocations, 1);
31d4a89c1eSYiFei Zhu 
32d4a89c1eSYiFei Zhu 	return 1;
33d4a89c1eSYiFei Zhu }
34