|
|
|
@ -7,7 +7,7 @@ use std::{
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
use crate::{
|
|
|
|
|
maps::{check_kv_size, IterableMap, MapData, MapError},
|
|
|
|
|
maps::{check_kv_size, IterableMap, MapData, MapError, MapIter, MapKeys},
|
|
|
|
|
sys::{bpf_map_delete_elem, bpf_map_lookup_elem, bpf_map_update_elem},
|
|
|
|
|
Pod,
|
|
|
|
|
};
|
|
|
|
@ -125,6 +125,18 @@ impl<T: AsRef<MapData>, K: Pod, V: Pod> LpmTrie<T, K, V> {
|
|
|
|
|
})?;
|
|
|
|
|
value.ok_or(MapError::KeyNotFound)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// An iterator visiting all key-value pairs in arbitrary order. The
|
|
|
|
|
/// iterator item type is `Result<(K, V), MapError>`.
|
|
|
|
|
pub fn iter(&self) -> MapIter<'_, K, V, Self> {
|
|
|
|
|
MapIter::new(self)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// An iterator visiting all keys in arbitrary order. The iterator element
|
|
|
|
|
/// type is `Result<Key<K>, MapError>`.
|
|
|
|
|
pub fn keys(&self) -> MapKeys<'_, Key<K>> {
|
|
|
|
|
MapKeys::new(self.inner.as_ref())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<T: AsMut<MapData>, K: Pod, V: Pod> LpmTrie<T, K, V> {
|
|
|
|
@ -433,4 +445,32 @@ mod tests {
|
|
|
|
|
|
|
|
|
|
assert!(matches!(trie.get(&key, 0), Err(MapError::KeyNotFound)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// #[test]
|
|
|
|
|
// // Syscall overrides are performing integer-to-pointer conversions, which
|
|
|
|
|
// // should be done with `ptr::from_exposed_addr` in Rust nightly, but we have
|
|
|
|
|
// // to support stable as well.
|
|
|
|
|
// #[cfg_attr(miri, ignore)]
|
|
|
|
|
// fn test_iter() {
|
|
|
|
|
// override_syscall(|call| match call {
|
|
|
|
|
// Syscall::Bpf {
|
|
|
|
|
// cmd: bpf_cmd::BPF_MAP_GET_NEXT_KEY,
|
|
|
|
|
// attr,
|
|
|
|
|
// } => get_next_key(attr),
|
|
|
|
|
// Syscall::Bpf {
|
|
|
|
|
// cmd: bpf_cmd::BPF_MAP_LOOKUP_ELEM,
|
|
|
|
|
// attr,
|
|
|
|
|
// } => lookup_elem(attr),
|
|
|
|
|
// _ => sys_error(EFAULT),
|
|
|
|
|
// });
|
|
|
|
|
// let map = MapData {
|
|
|
|
|
// obj: new_obj_map(),
|
|
|
|
|
// fd: None,
|
|
|
|
|
// pinned: false,
|
|
|
|
|
// btf_fd: None,
|
|
|
|
|
// };
|
|
|
|
|
// let hm = LpmTrie::<_, u32, u32>::new(&map).unwrap();
|
|
|
|
|
// let items = hm.iter().collect::<Result<Vec<_>, _>>().unwrap();
|
|
|
|
|
// assert_eq!(&items, &[(10, 100), (20, 200), (30, 300)])
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|