4
0

allowed_memory.rs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. // SPDX-License-Identifier: (Apache-2.0 OR MIT)
  2. // Copyright 2024 Akenes SA <wouter.dullaert@exoscale.ch>
  3. #![allow(clippy::unreadable_literal)]
  4. extern crate elf;
  5. use std::{iter::FromIterator, ptr::addr_of};
  6. extern crate rbpf;
  7. const OBJ_FILE_PATH: &str = "examples/allowed-memory/allowed-memory.o";
  8. const BPF_MAP_LOOKUP_ELEM_IDX: u32 = 1;
  9. #[repr(C, packed)]
  10. #[derive(Clone, Copy)]
  11. pub struct Key {
  12. pub protocol: u8,
  13. }
  14. #[repr(C, packed)]
  15. pub struct Value {
  16. pub result: i32,
  17. }
  18. static MAP_VALUE: Value = Value { result: 1 };
  19. fn bpf_lookup_elem(_map: u64, key_addr: u64, _flags: u64, _u4: u64, _u5: u64) -> u64 {
  20. let key: Key = unsafe { *(key_addr as *const Key) };
  21. if key.protocol == 1 {
  22. return addr_of!(MAP_VALUE) as u64;
  23. }
  24. 0
  25. }
  26. fn main() {
  27. let file = elf::File::open_path(OBJ_FILE_PATH).unwrap();
  28. let func = file.get_section("classifier").unwrap();
  29. let mut vm = rbpf::EbpfVmNoData::new(Some(&func.data)).unwrap();
  30. vm.register_helper(BPF_MAP_LOOKUP_ELEM_IDX, bpf_lookup_elem)
  31. .unwrap();
  32. let start = addr_of!(MAP_VALUE) as u64;
  33. let addrs = Vec::from_iter(start..start + size_of::<Value>() as u64);
  34. vm.register_allowed_memory(&addrs);
  35. let res = vm.execute_program().unwrap();
  36. assert_eq!(res, 1);
  37. }