1 pub mod helper; 2 pub mod map; 3 pub mod prog; 4 use crate::include::bindings::linux_bpf::{bpf_attr, bpf_cmd}; 5 use crate::syscall::user_access::UserBufferReader; 6 use crate::syscall::Syscall; 7 use log::error; 8 use num_traits::FromPrimitive; 9 use system_error::SystemError; 10 11 type Result<T> = core::result::Result<T, SystemError>; 12 13 impl Syscall { 14 pub fn sys_bpf(cmd: u32, attr: *mut u8, size: u32) -> Result<usize> { 15 let buf = UserBufferReader::new(attr, size as usize, true)?; 16 let attr = buf.read_one_from_user::<bpf_attr>(0)?; 17 let cmd = bpf_cmd::from_u32(cmd).ok_or(SystemError::EINVAL)?; 18 bpf(cmd, attr) 19 } 20 } 21 22 pub fn bpf(cmd: bpf_cmd, attr: &bpf_attr) -> Result<usize> { 23 let res = match cmd { 24 // Map related commands 25 bpf_cmd::BPF_MAP_CREATE => map::bpf_map_create(attr), 26 bpf_cmd::BPF_MAP_UPDATE_ELEM => map::bpf_map_update_elem(attr), 27 bpf_cmd::BPF_MAP_LOOKUP_ELEM => map::bpf_lookup_elem(attr), 28 bpf_cmd::BPF_MAP_GET_NEXT_KEY => map::bpf_map_get_next_key(attr), 29 bpf_cmd::BPF_MAP_DELETE_ELEM => map::bpf_map_delete_elem(attr), 30 bpf_cmd::BPF_MAP_LOOKUP_AND_DELETE_ELEM => map::bpf_map_lookup_and_delete_elem(attr), 31 bpf_cmd::BPF_MAP_LOOKUP_BATCH => map::bpf_map_lookup_batch(attr), 32 bpf_cmd::BPF_MAP_FREEZE => map::bpf_map_freeze(attr), 33 // Program related commands 34 bpf_cmd::BPF_PROG_LOAD => prog::bpf_prog_load(attr), 35 // Object creation commands 36 bpf_cmd::BPF_BTF_LOAD => { 37 error!("bpf cmd {:?} not implemented", cmd); 38 return Err(SystemError::ENOSYS); 39 } 40 ty => { 41 unimplemented!("bpf cmd {:?} not implemented", ty) 42 } 43 }; 44 res 45 } 46 47 /// Initialize the BPF system 48 pub fn init_bpf_system() { 49 helper::init_helper_functions(); 50 } 51