xref: /webrtc/turn/src/client/permission.rs (revision 97921129)
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