diff --git a/aya-obj/src/maps.rs b/aya-obj/src/maps.rs index ca85bba7..db340a35 100644 --- a/aya-obj/src/maps.rs +++ b/aya-obj/src/maps.rs @@ -5,7 +5,7 @@ use core::mem; #[cfg(not(feature = "std"))] use crate::std; -use crate::EbpfSectionKind; +use crate::{generated::bpf_map_type::*, EbpfSectionKind}; /// Invalid map type encontered pub struct InvalidMapTypeError { @@ -17,7 +17,6 @@ impl TryFrom for crate::generated::bpf_map_type { type Error = InvalidMapTypeError; fn try_from(map_type: u32) -> Result { - use crate::generated::bpf_map_type::*; Ok(match map_type { x if x == BPF_MAP_TYPE_UNSPEC as u32 => BPF_MAP_TYPE_UNSPEC, x if x == BPF_MAP_TYPE_HASH as u32 => BPF_MAP_TYPE_HASH, @@ -31,7 +30,6 @@ impl TryFrom for crate::generated::bpf_map_type { x if x == BPF_MAP_TYPE_LRU_HASH as u32 => BPF_MAP_TYPE_LRU_HASH, x if x == BPF_MAP_TYPE_LRU_PERCPU_HASH as u32 => BPF_MAP_TYPE_LRU_PERCPU_HASH, x if x == BPF_MAP_TYPE_LPM_TRIE as u32 => BPF_MAP_TYPE_LPM_TRIE, - x if x == BPF_MAP_TYPE_BLOOM_FILTER as u32 => BPF_MAP_TYPE_BLOOM_FILTER, x if x == BPF_MAP_TYPE_ARRAY_OF_MAPS as u32 => BPF_MAP_TYPE_ARRAY_OF_MAPS, x if x == BPF_MAP_TYPE_HASH_OF_MAPS as u32 => BPF_MAP_TYPE_HASH_OF_MAPS, x if x == BPF_MAP_TYPE_DEVMAP as u32 => BPF_MAP_TYPE_DEVMAP, @@ -42,7 +40,6 @@ impl TryFrom for crate::generated::bpf_map_type { x if x == BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED as u32 => { BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED } - x if x == BPF_MAP_TYPE_CGRP_STORAGE as u32 => BPF_MAP_TYPE_CGRP_STORAGE, x if x == BPF_MAP_TYPE_REUSEPORT_SOCKARRAY as u32 => BPF_MAP_TYPE_REUSEPORT_SOCKARRAY, x if x == BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE_DEPRECATED as u32 => { BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE_DEPRECATED @@ -58,6 +55,7 @@ impl TryFrom for crate::generated::bpf_map_type { x if x == BPF_MAP_TYPE_BLOOM_FILTER as u32 => BPF_MAP_TYPE_BLOOM_FILTER, x if x == BPF_MAP_TYPE_USER_RINGBUF as u32 => BPF_MAP_TYPE_USER_RINGBUF, x if x == BPF_MAP_TYPE_CGRP_STORAGE as u32 => BPF_MAP_TYPE_CGRP_STORAGE, + x if x == BPF_MAP_TYPE_ARENA as u32 => BPF_MAP_TYPE_ARENA, _ => return Err(InvalidMapTypeError { map_type }), }) } @@ -290,3 +288,49 @@ pub struct BtfMap { pub(crate) symbol_index: usize, pub(crate) data: Vec, } + +impl core::fmt::Display for crate::generated::bpf_map_type { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!( + f, + "{}", + match self { + BPF_MAP_TYPE_UNSPEC => "Unspec", + BPF_MAP_TYPE_HASH => "Hash", + BPF_MAP_TYPE_ARRAY => "Array", + BPF_MAP_TYPE_PROG_ARRAY => "ProgArray", + BPF_MAP_TYPE_PERF_EVENT_ARRAY => "PerfEventArray", + BPF_MAP_TYPE_PERCPU_HASH => "PerCpuHash", + BPF_MAP_TYPE_PERCPU_ARRAY => "PerCpuArray", + BPF_MAP_TYPE_STACK_TRACE => "StackTrace", + BPF_MAP_TYPE_CGROUP_ARRAY => "CgroupArray", + BPF_MAP_TYPE_LRU_HASH => "LruHash", + BPF_MAP_TYPE_LRU_PERCPU_HASH => "LruPerCpuHash", + BPF_MAP_TYPE_LPM_TRIE => "LpmTrie", + BPF_MAP_TYPE_ARRAY_OF_MAPS => "ArrayOfMaps", + BPF_MAP_TYPE_HASH_OF_MAPS => "HashOfMaps", + BPF_MAP_TYPE_DEVMAP => "DevMap", + BPF_MAP_TYPE_SOCKMAP => "SockMap", + BPF_MAP_TYPE_CPUMAP => "CpuMap", + BPF_MAP_TYPE_XSKMAP => "XskMap", + BPF_MAP_TYPE_SOCKHASH => "SockHash", + BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED => "CgroupStorageDeprecated", + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY => "ReusePortSockArray", + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE_DEPRECATED => "PerCpuCgroupStorageDeprecated", + BPF_MAP_TYPE_QUEUE => "Queue", + BPF_MAP_TYPE_STACK => "Stack", + BPF_MAP_TYPE_SK_STORAGE => "SkStorage", + BPF_MAP_TYPE_DEVMAP_HASH => "DevMapHash", + BPF_MAP_TYPE_STRUCT_OPS => "StructOps", + BPF_MAP_TYPE_RINGBUF => "RingBuf", + BPF_MAP_TYPE_INODE_STORAGE => "InodeStorage", + BPF_MAP_TYPE_TASK_STORAGE => "TaskStorage", + BPF_MAP_TYPE_BLOOM_FILTER => "BloomFilter", + BPF_MAP_TYPE_USER_RINGBUF => "UserRingBuf", + BPF_MAP_TYPE_CGRP_STORAGE => "CgrpStorage", + BPF_MAP_TYPE_ARENA => "Arena", + __MAX_BPF_MAP_TYPE => "MaxMapType", + } + ) + } +} diff --git a/aya/src/maps/mod.rs b/aya/src/maps/mod.rs index 82467aee..8ef807c2 100644 --- a/aya/src/maps/mod.rs +++ b/aya/src/maps/mod.rs @@ -59,6 +59,7 @@ use std::{ ptr, }; +use aya_obj::generated::bpf_map_type; use libc::{getrlimit, rlim_t, rlimit, RLIMIT_MEMLOCK, RLIM_INFINITY}; use log::warn; use obj::maps::InvalidMapTypeError; @@ -962,6 +963,12 @@ impl MapInfo { self.0.type_ } + /// The map type as defined by the linux kernel enum + /// [`bpf_map_type`](https://elixir.bootlin.com/linux/v6.4.4/source/include/uapi/linux/bpf.h#L905). + pub fn map_type_enum(&self) -> bpf_map_type { + bpf_map_type::try_from(self.0.type_).unwrap_or(bpf_map_type::__MAX_BPF_MAP_TYPE) + } + /// The key size for this map. pub fn key_size(&self) -> u32 { self.0.key_size diff --git a/xtask/public-api/aya.txt b/xtask/public-api/aya.txt index b079e493..c1df237b 100644 --- a/xtask/public-api/aya.txt +++ b/xtask/public-api/aya.txt @@ -1798,6 +1798,7 @@ pub fn aya::maps::MapInfo::id(&self) -> u32 pub fn aya::maps::MapInfo::key_size(&self) -> u32 pub fn aya::maps::MapInfo::map_flags(&self) -> u32 pub fn aya::maps::MapInfo::map_type(&self) -> u32 +pub fn aya::maps::MapInfo::map_type_enum(&self) -> aya_obj::generated::linux_bindings_x86_64::bpf_map_type pub fn aya::maps::MapInfo::max_entries(&self) -> u32 pub fn aya::maps::MapInfo::name(&self) -> &[u8] pub fn aya::maps::MapInfo::name_as_str(&self) -> core::option::Option<&str>