// SPDX-License-Identifier: GPL-2.0
#include <linux/bpf.h>
#include <linux/version.h>

#include "bpf_helpers.h"
#include "netcnt_common.h"

#define MAX_BPS	(3 * 1024 * 1024)

#define REFRESH_TIME_NS	100000000
#define NS_PER_SEC	1000000000

struct bpf_map_def SEC("maps") percpu_netcnt = {
	.type = BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE,
	.key_size = sizeof(struct bpf_cgroup_storage_key),
	.value_size = sizeof(struct percpu_net_cnt),
};

BPF_ANNOTATE_KV_PAIR(percpu_netcnt, struct bpf_cgroup_storage_key,
		     struct percpu_net_cnt);

struct bpf_map_def SEC("maps") netcnt = {
	.type = BPF_MAP_TYPE_CGROUP_STORAGE,
	.key_size = sizeof(struct bpf_cgroup_storage_key),
	.value_size = sizeof(struct net_cnt),
};

BPF_ANNOTATE_KV_PAIR(netcnt, struct bpf_cgroup_storage_key,
		     struct net_cnt);

SEC("cgroup/skb")
int bpf_nextcnt(struct __sk_buff *skb)
{
	struct percpu_net_cnt *percpu_cnt;
	char fmt[] = "%d %llu %llu\n";
	struct net_cnt *cnt;
	__u64 ts, dt;
	int ret;

	cnt = bpf_get_local_storage(&netcnt, 0);
	percpu_cnt = bpf_get_local_storage(&percpu_netcnt, 0);

	percpu_cnt->packets++;
	percpu_cnt->bytes += skb->len;

	if (percpu_cnt->packets > MAX_PERCPU_PACKETS) {
		__sync_fetch_and_add(&cnt->packets,
				     percpu_cnt->packets);
		percpu_cnt->packets = 0;

		__sync_fetch_and_add(&cnt->bytes,
				     percpu_cnt->bytes);
		percpu_cnt->bytes = 0;
	}

	ts = bpf_ktime_get_ns();
	dt = ts - percpu_cnt->prev_ts;

	dt *= MAX_BPS;
	dt /= NS_PER_SEC;

	if (cnt->bytes + percpu_cnt->bytes - percpu_cnt->prev_bytes < dt)
		ret = 1;
	else
		ret = 0;

	if (dt > REFRESH_TIME_NS) {
		percpu_cnt->prev_ts = ts;
		percpu_cnt->prev_packets = cnt->packets;
		percpu_cnt->prev_bytes = cnt->bytes;
	}

	return !!ret;
}

char _license[] SEC("license") = "GPL";
__u32 _version SEC("version") = LINUX_VERSION_CODE;
