4
0

allowed_memory.rs 1.2 KB

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