1 use std::collections::HashMap; 2 use std::net::SocketAddr; 3 use std::sync::atomic::{AtomicU8, Ordering}; 4 use std::sync::Arc; 5 6 #[derive(Default, Copy, Clone, PartialEq, Debug)] 7 pub(crate) enum PermState { 8 #[default] 9 Idle = 0, 10 Permitted = 1, 11 } 12 13 impl From<u8> for PermState { from(v: u8) -> Self14 fn from(v: u8) -> Self { 15 match v { 16 0 => PermState::Idle, 17 _ => PermState::Permitted, 18 } 19 } 20 } 21 22 #[derive(Default)] 23 pub(crate) struct Permission { 24 st: AtomicU8, //PermState, 25 } 26 27 impl Permission { set_state(&self, state: PermState)28 pub(crate) fn set_state(&self, state: PermState) { 29 self.st.store(state as u8, Ordering::SeqCst); 30 } 31 state(&self) -> PermState32 pub(crate) fn state(&self) -> PermState { 33 self.st.load(Ordering::SeqCst).into() 34 } 35 } 36 37 // Thread-safe Permission map 38 #[derive(Default)] 39 pub(crate) struct PermissionMap { 40 perm_map: HashMap<String, Arc<Permission>>, 41 } 42 43 impl PermissionMap { new() -> PermissionMap44 pub(crate) fn new() -> PermissionMap { 45 PermissionMap { 46 perm_map: HashMap::new(), 47 } 48 } 49 insert(&mut self, addr: &SocketAddr, p: Arc<Permission>)50 pub(crate) fn insert(&mut self, addr: &SocketAddr, p: Arc<Permission>) { 51 self.perm_map.insert(addr.ip().to_string(), p); 52 } 53 find(&self, addr: &SocketAddr) -> Option<&Arc<Permission>>54 pub(crate) fn find(&self, addr: &SocketAddr) -> Option<&Arc<Permission>> { 55 self.perm_map.get(&addr.ip().to_string()) 56 } 57 delete(&mut self, addr: &SocketAddr)58 pub(crate) fn delete(&mut self, addr: &SocketAddr) { 59 self.perm_map.remove(&addr.ip().to_string()); 60 } 61 addrs(&self) -> Vec<SocketAddr>62 pub(crate) fn addrs(&self) -> Vec<SocketAddr> { 63 let mut a = vec![]; 64 for k in self.perm_map.keys() { 65 if let Ok(ip) = k.parse() { 66 a.push(SocketAddr::new(ip, 0)); 67 } 68 } 69 a 70 } 71 } 72