cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

netcnt_prog.c (1532B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include <linux/bpf.h>
      3#include <linux/version.h>
      4
      5#include <bpf/bpf_helpers.h>
      6#include "netcnt_common.h"
      7
      8#define MAX_BPS	(3 * 1024 * 1024)
      9
     10#define REFRESH_TIME_NS	100000000
     11#define NS_PER_SEC	1000000000
     12
     13struct {
     14	__uint(type, BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE);
     15	__type(key, struct bpf_cgroup_storage_key);
     16	__type(value, union percpu_net_cnt);
     17} percpu_netcnt SEC(".maps");
     18
     19struct {
     20	__uint(type, BPF_MAP_TYPE_CGROUP_STORAGE);
     21	__type(key, struct bpf_cgroup_storage_key);
     22	__type(value, union net_cnt);
     23} netcnt SEC(".maps");
     24
     25SEC("cgroup/skb")
     26int bpf_nextcnt(struct __sk_buff *skb)
     27{
     28	union percpu_net_cnt *percpu_cnt;
     29	char fmt[] = "%d %llu %llu\n";
     30	union net_cnt *cnt;
     31	__u64 ts, dt;
     32	int ret;
     33
     34	cnt = bpf_get_local_storage(&netcnt, 0);
     35	percpu_cnt = bpf_get_local_storage(&percpu_netcnt, 0);
     36
     37	percpu_cnt->packets++;
     38	percpu_cnt->bytes += skb->len;
     39
     40	if (percpu_cnt->packets > MAX_PERCPU_PACKETS) {
     41		__sync_fetch_and_add(&cnt->packets,
     42				     percpu_cnt->packets);
     43		percpu_cnt->packets = 0;
     44
     45		__sync_fetch_and_add(&cnt->bytes,
     46				     percpu_cnt->bytes);
     47		percpu_cnt->bytes = 0;
     48	}
     49
     50	ts = bpf_ktime_get_ns();
     51	dt = ts - percpu_cnt->prev_ts;
     52
     53	dt *= MAX_BPS;
     54	dt /= NS_PER_SEC;
     55
     56	if (cnt->bytes + percpu_cnt->bytes - percpu_cnt->prev_bytes < dt)
     57		ret = 1;
     58	else
     59		ret = 0;
     60
     61	if (dt > REFRESH_TIME_NS) {
     62		percpu_cnt->prev_ts = ts;
     63		percpu_cnt->prev_packets = cnt->packets;
     64		percpu_cnt->prev_bytes = cnt->bytes;
     65	}
     66
     67	return !!ret;
     68}
     69
     70char _license[] SEC("license") = "GPL";