blob: 35cf057cbd29768234192b4ce29e635b972d5614 [file] [log] [blame]
#pragma once
#ifdef ENABLE_LIBBPF
// Either vmlinux.h or linux/types.h must be included before bpf/bpf_helpers.h
#ifdef USE_VMLINUX
// When using vmlinux.h, you can't use any system level headers.
#include <vmlinux.h>
#else
#include <linux/types.h>
#endif // USE_VMLINUX
#include <bpf/bpf_helpers.h>
#define DEFINE_BPF_MAP_BASE(the_map, TYPE, KeyType, ValueType, num_entries, gid) \
struct { \
__uint(type, BPF_MAP_TYPE_##TYPE); \
__type(key, KeyType); \
__type(value, ValueType); \
__uint(max_entries, num_entries); \
} the_map SEC(".maps"); \
\
static inline __always_inline __unused ValueType* bpf_##the_map##_lookup_elem( \
const KeyType* k) { \
return bpf_map_lookup_elem(&the_map, k); \
}; \
\
static inline __always_inline __unused int bpf_##the_map##_update_elem( \
const KeyType* k, const ValueType* v, unsigned long long flags) { \
return bpf_map_update_elem(&the_map, k, v, flags); \
}; \
\
static inline __always_inline __unused int bpf_##the_map##_delete_elem(const KeyType* k) { \
return bpf_map_delete_elem(&the_map, k); \
};
#define DEFINE_BPF_MAP_GRW(the_map, TYPE, KeyType, ValueType, num_entries, gid) \
DEFINE_BPF_MAP_BASE(the_map, TYPE, KeyType, ValueType, num_entries, gid)
#define DEFINE_BPF_MAP_GWO(the_map, TYPE, KeyType, ValueType, num_entries, gid) \
DEFINE_BPF_MAP_BASE(the_map, TYPE, KeyType, ValueType, num_entries, gid)
#define DEFINE_BPF_MAP_GRO(the_map, TYPE, KeyType, ValueType, num_entries, gid) \
DEFINE_BPF_MAP_BASE(the_map, TYPE, KeyType, ValueType, num_entries, gid)
#define DEFINE_BPF_PROG(SECTION_NAME, prog_uid, prog_gid, the_prog) \
SEC(SECTION_NAME) \
int the_prog
#define LICENSE(NAME) char _license[] SEC("license") = (NAME)
#else // LIBBPF DISABLED
#include <bpf_helpers.h>
#define bpf_printk(fmt, ...) \
({ \
char ____fmt[] = fmt; \
bpf_trace_printk(____fmt, sizeof(____fmt), ##__VA_ARGS__); \
})
#endif // ENABLE_LIBBPF