mirror of
https://git.proxmox.com/git/mirror_iproute2
synced 2025-10-04 21:40:34 +00:00

This work finalizes both eBPF front-ends for the classifier and action part in tc, it allows for custom ELF section selection, a simplified tc command frontend (while keeping compat), reusing of common maps between classifier and actions residing in the same object file, and exporting of all map fds to an eBPF agent for handing off further control in user space. It also adds an extensive example of how eBPF can be used, and a minimal self-contained example agent that dumps map data. The example is well documented and hopefully provides a good starting point into programming cls_bpf and act_bpf. Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Cc: Alexei Starovoitov <ast@plumgrid.com> Cc: Jiri Pirko <jiri@resnulli.us> Cc: Jamal Hadi Salim <jhs@mojatatu.com> Acked-by: Alexei Starovoitov <ast@plumgrid.com> Acked-by: Thomas Graf <tgraf@suug.ch> Acked-by: Jiri Pirko <jiri@resnulli.us> Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
59 lines
1.5 KiB
C
59 lines
1.5 KiB
C
#ifndef __BPF_FUNCS__
|
|
#define __BPF_FUNCS__
|
|
|
|
/* Misc macros. */
|
|
#ifndef __maybe_unused
|
|
# define __maybe_unused __attribute__ ((__unused__))
|
|
#endif
|
|
|
|
#ifndef __section
|
|
# define __section(NAME) __attribute__((section(NAME), used))
|
|
#endif
|
|
|
|
#ifndef offsetof
|
|
# define offsetof __builtin_offsetof
|
|
#endif
|
|
|
|
#ifndef htons
|
|
# define htons(x) __constant_htons((x))
|
|
#endif
|
|
|
|
#ifndef likely
|
|
# define likely(x) __builtin_expect(!!(x), 1)
|
|
#endif
|
|
|
|
#ifndef unlikely
|
|
# define unlikely(x) __builtin_expect(!!(x), 0)
|
|
#endif
|
|
|
|
/* The verifier will translate them to actual function calls. */
|
|
static void *(*bpf_map_lookup_elem)(void *map, void *key) __maybe_unused =
|
|
(void *) BPF_FUNC_map_lookup_elem;
|
|
|
|
static int (*bpf_map_update_elem)(void *map, void *key, void *value,
|
|
unsigned long long flags) __maybe_unused =
|
|
(void *) BPF_FUNC_map_update_elem;
|
|
|
|
static int (*bpf_map_delete_elem)(void *map, void *key) __maybe_unused =
|
|
(void *) BPF_FUNC_map_delete_elem;
|
|
|
|
static unsigned int (*get_smp_processor_id)(void) __maybe_unused =
|
|
(void *) BPF_FUNC_get_smp_processor_id;
|
|
|
|
static unsigned int (*get_prandom_u32)(void) __maybe_unused =
|
|
(void *) BPF_FUNC_get_prandom_u32;
|
|
|
|
/* LLVM built-in functions that an eBPF C program may use to emit
|
|
* BPF_LD_ABS and BPF_LD_IND instructions.
|
|
*/
|
|
unsigned long long load_byte(void *skb, unsigned long long off)
|
|
asm ("llvm.bpf.load.byte");
|
|
|
|
unsigned long long load_half(void *skb, unsigned long long off)
|
|
asm ("llvm.bpf.load.half");
|
|
|
|
unsigned long long load_word(void *skb, unsigned long long off)
|
|
asm ("llvm.bpf.load.word");
|
|
|
|
#endif /* __BPF_FUNCS__ */
|