From: Paul Chaignon Date: Wed, 13 Oct 2021 14:39:27 +0000 (+0200) Subject: lib/bpf: fix map-in-map creation without prepopulation X-Git-Tag: v5.15.0~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a500c5ac8733a1ea99fbd4ef039a999a93590c45;p=thirdparty%2Fiproute2.git lib/bpf: fix map-in-map creation without prepopulation When creating map-in-maps, the outer map can be prepopulated using the inner_idx field of inner maps. That field defines the index of the inner map in the outer map. It is ignored if set to -1. Commit 6d61a2b55799 ("lib: add libbpf support") however started using that field to identify inner maps. While iterating over all maps looking for inner maps, maps with inner_idx set to -1 are erroneously skipped. As a result, trying to create a map-in-map with prepopulation disabled fails because the inner_id of the outer map is not correctly set. This bug can be observed with strace -ebpf (notice the zero inner_map_fd for the outer map creation): bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_ARRAY, key_size=4, value_size=130996, max_entries=1, map_flags=0, inner_map_fd=0, map_name="maglev_inner", map_ifindex=0, btf_fd=0, btf_key_type_id=0, btf_value_type_id=0}, 128) = 32 bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_HASH_OF_MAPS, key_size=2, value_size=4, max_entries=65536, map_flags=BPF_F_NO_PREALLOC, inner_map_fd=0, map_name="maglev_outer", map_ifindex=0, btf_fd=0, btf_key_type_id=0, btf_value_type_id=0}, 128) = -1 EINVAL (Invalid argument) Fixes: 6d61a2b55799 ("lib: add libbpf support") Signed-off-by: Paul Chaignon Signed-off-by: Stephen Hemminger --- diff --git a/lib/bpf_legacy.c b/lib/bpf_legacy.c index 275941ddc..23854f174 100644 --- a/lib/bpf_legacy.c +++ b/lib/bpf_legacy.c @@ -3287,8 +3287,7 @@ bool iproute2_is_map_in_map(const char *libbpf_map_name, struct bpf_elf_map *ima continue; if (!ctx->maps[i].id || - ctx->maps[i].inner_id || - ctx->maps[i].inner_idx == -1) + ctx->maps[i].inner_id) continue; *imap = ctx->maps[i];