2018-09-28 14:46:00 +00:00
// SPDX-License-Identifier: GPL-2.0
# include <linux/bpf.h>
# include <linux/version.h>
2020-01-20 14:06:45 +01:00
# include <bpf/bpf_helpers.h>
2018-09-28 14:46:00 +00:00
# include "netcnt_common.h"
# define MAX_BPS (3 * 1024 * 1024)
# define REFRESH_TIME_NS 100000000
# define NS_PER_SEC 1000000000
2019-06-17 12:26:58 -07:00
struct {
2019-07-05 08:50:11 -07:00
__uint ( type , BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE ) ;
__type ( key , struct bpf_cgroup_storage_key ) ;
__type ( value , struct percpu_net_cnt ) ;
} percpu_netcnt SEC ( " .maps " ) ;
2018-09-28 14:46:00 +00:00
2019-06-17 12:26:58 -07:00
struct {
2019-07-05 08:50:11 -07:00
__uint ( type , BPF_MAP_TYPE_CGROUP_STORAGE ) ;
__type ( key , struct bpf_cgroup_storage_key ) ;
__type ( value , struct net_cnt ) ;
} netcnt SEC ( " .maps " ) ;
2018-09-28 14:46:00 +00:00
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 ;