mirror of
				https://git.proxmox.com/git/mirror_iproute2
				synced 2025-10-31 19:18:00 +00:00 
			
		
		
		
	 612ff099a1
			
		
	
	
		612ff099a1
		
	
	
	
	
		
			
			Add support for map in map in the loader and add a small example program. The outer map uses inner_id to reference a bpf_elf_map with a given ID as the inner type. Loading maps is done in three passes, i) all non-map in map maps are loaded, ii) all map in map maps are loaded based on the inner_id map spec of a non-map in map with corresponding id, and iii) related inner maps are attached to the map in map with given inner_idx key. Pinned objetcs are assumed to be managed externally, so they are only retrieved from BPF fs. Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "../../include/bpf_api.h"
 | |
| 
 | |
| #define MAP_INNER_ID	42
 | |
| 
 | |
| struct bpf_elf_map __section_maps map_inner = {
 | |
| 	.type		= BPF_MAP_TYPE_ARRAY,
 | |
| 	.size_key	= sizeof(uint32_t),
 | |
| 	.size_value	= sizeof(uint32_t),
 | |
| 	.id		= MAP_INNER_ID,
 | |
| 	.inner_idx	= 0,
 | |
| 	.pinning	= PIN_GLOBAL_NS,
 | |
| 	.max_elem	= 1,
 | |
| };
 | |
| 
 | |
| struct bpf_elf_map __section_maps map_outer = {
 | |
| 	.type		= BPF_MAP_TYPE_ARRAY_OF_MAPS,
 | |
| 	.size_key	= sizeof(uint32_t),
 | |
| 	.size_value	= sizeof(uint32_t),
 | |
| 	.inner_id	= MAP_INNER_ID,
 | |
| 	.pinning	= PIN_GLOBAL_NS,
 | |
| 	.max_elem	= 1,
 | |
| };
 | |
| 
 | |
| __section("egress")
 | |
| int emain(struct __sk_buff *skb)
 | |
| {
 | |
| 	struct bpf_elf_map *map_inner;
 | |
| 	int key = 0, *val;
 | |
| 
 | |
| 	map_inner = map_lookup_elem(&map_outer, &key);
 | |
| 	if (map_inner) {
 | |
| 		val = map_lookup_elem(map_inner, &key);
 | |
| 		if (val)
 | |
| 			lock_xadd(val, 1);
 | |
| 	}
 | |
| 
 | |
| 	return BPF_H_DEFAULT;
 | |
| }
 | |
| 
 | |
| __section("ingress")
 | |
| int imain(struct __sk_buff *skb)
 | |
| {
 | |
| 	struct bpf_elf_map *map_inner;
 | |
| 	int key = 0, *val;
 | |
| 
 | |
| 	map_inner = map_lookup_elem(&map_outer, &key);
 | |
| 	if (map_inner) {
 | |
| 		val = map_lookup_elem(map_inner, &key);
 | |
| 		if (val)
 | |
| 			printt("map val: %d\n", *val);
 | |
| 	}
 | |
| 
 | |
| 	return BPF_H_DEFAULT;
 | |
| }
 | |
| 
 | |
| BPF_LICENSE("GPL");
 |