 249b812d80
			
		
	
	
	249b812d80
	
	
	
		
			
			simple .o parser and loader using BPF syscall. .o is a standard ELF generated by LLVM backend It parses elf file compiled by llvm .c->.o - parses 'maps' section and creates maps via BPF syscall - parses 'license' section and passes it to syscall - parses elf relocations for BPF maps and adjusts BPF_LD_IMM64 insns by storing map_fd into insn->imm and marking such insns as BPF_PSEUDO_MAP_FD - loads eBPF programs via BPF syscall One ELF file can contain multiple BPF programs. int load_bpf_file(char *path); populates prog_fd[] and map_fd[] with FDs received from bpf syscall bpf_helpers.h - helper functions available to eBPF programs written in C Signed-off-by: Alexei Starovoitov <ast@plumgrid.com> Signed-off-by: David S. Miller <davem@davemloft.net>
		
			
				
	
	
		
			40 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef __BPF_HELPERS_H
 | |
| #define __BPF_HELPERS_H
 | |
| 
 | |
| /* helper macro to place programs, maps, license in
 | |
|  * different sections in elf_bpf file. Section names
 | |
|  * are interpreted by elf_bpf loader
 | |
|  */
 | |
| #define SEC(NAME) __attribute__((section(NAME), used))
 | |
| 
 | |
| /* helper functions called from eBPF programs written in C */
 | |
| static void *(*bpf_map_lookup_elem)(void *map, void *key) =
 | |
| 	(void *) BPF_FUNC_map_lookup_elem;
 | |
| static int (*bpf_map_update_elem)(void *map, void *key, void *value,
 | |
| 				  unsigned long long flags) =
 | |
| 	(void *) BPF_FUNC_map_update_elem;
 | |
| static int (*bpf_map_delete_elem)(void *map, void *key) =
 | |
| 	(void *) BPF_FUNC_map_delete_elem;
 | |
| 
 | |
| /* llvm builtin functions that eBPF C program may use to
 | |
|  * emit BPF_LD_ABS and BPF_LD_IND instructions
 | |
|  */
 | |
| struct sk_buff;
 | |
| 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");
 | |
| 
 | |
| /* a helper structure used by eBPF C program
 | |
|  * to describe map attributes to elf_bpf loader
 | |
|  */
 | |
| struct bpf_map_def {
 | |
| 	unsigned int type;
 | |
| 	unsigned int key_size;
 | |
| 	unsigned int value_size;
 | |
| 	unsigned int max_entries;
 | |
| };
 | |
| 
 | |
| #endif
 |