ebpf_exporter
39 строк · 1.0 Кб
1#include <vmlinux.h>2#include <bpf/bpf_core_read.h>3#include <bpf/bpf_tracing.h>4#include "maps.bpf.h"5
6struct inet_frags_key_t {7u32 ifindex;8u8 ip_version;9};10
11struct {12__uint(type, BPF_MAP_TYPE_LRU_HASH);13__uint(max_entries, 64);14__type(key, struct inet_frags_key_t);15__type(value, u64);16} inet_frags_total SEC(".maps");17
18static __always_inline void increment_map_for_skb(void *map, struct sk_buff *skb)19{
20void *skb_head = BPF_CORE_READ(skb, head);21u16 skb_l3_off = BPF_CORE_READ(skb, network_header);22
23struct iphdr *iph = (struct iphdr *) (skb_head + skb_l3_off);24struct inet_frags_key_t key = { 0 };25
26key.ip_version = BPF_CORE_READ_BITFIELD_PROBED(iph, version);27key.ifindex = BPF_CORE_READ(skb, skb_iif);28
29increment_map(map, &key, 1);30}
31
32SEC("kprobe/inet_frag_queue_insert")33int BPF_KPROBE(inet_frag_queue_insert, struct inet_frag_queue *q, struct sk_buff *skb, int offset)34{
35increment_map_for_skb(&inet_frags_total, skb);36return 0;37}
38
39char LICENSE[] SEC("license") = "GPL";40