1 #[cfg(test)] 2 mod binding_test; 3 4 use std::collections::HashMap; 5 use std::net::SocketAddr; 6 7 use tokio::time::Instant; 8 9 // Chanel number: 10 // 0x4000 through 0x7FFF: These values are the allowed channel 11 // numbers (16,383 possible values). 12 const MIN_CHANNEL_NUMBER: u16 = 0x4000; 13 const MAX_CHANNEL_NUMBER: u16 = 0x7fff; 14 15 #[derive(Copy, Clone, Debug, PartialEq)] 16 pub(crate) enum BindingState { 17 Idle, 18 Request, 19 Ready, 20 Refresh, 21 Failed, 22 } 23 24 #[derive(Copy, Clone, Debug, PartialEq)] 25 pub(crate) struct Binding { 26 pub(crate) number: u16, 27 pub(crate) st: BindingState, 28 pub(crate) addr: SocketAddr, 29 pub(crate) refreshed_at: Instant, 30 } 31 32 impl Binding { set_state(&mut self, state: BindingState)33 pub(crate) fn set_state(&mut self, state: BindingState) { 34 //atomic.StoreInt32((*int32)(&b.st), int32(state)) 35 self.st = state; 36 } 37 state(&self) -> BindingState38 pub(crate) fn state(&self) -> BindingState { 39 //return BindingState(atomic.LoadInt32((*int32)(&b.st))) 40 self.st 41 } 42 set_refreshed_at(&mut self, at: Instant)43 pub(crate) fn set_refreshed_at(&mut self, at: Instant) { 44 self.refreshed_at = at; 45 } 46 refreshed_at(&self) -> Instant47 pub(crate) fn refreshed_at(&self) -> Instant { 48 self.refreshed_at 49 } 50 } 51 // Thread-safe Binding map 52 #[derive(Default)] 53 pub(crate) struct BindingManager { 54 chan_map: HashMap<u16, String>, 55 addr_map: HashMap<String, Binding>, 56 next: u16, 57 } 58 59 impl BindingManager { new() -> Self60 pub(crate) fn new() -> Self { 61 BindingManager { 62 chan_map: HashMap::new(), 63 addr_map: HashMap::new(), 64 next: MIN_CHANNEL_NUMBER, 65 } 66 } 67 assign_channel_number(&mut self) -> u1668 pub(crate) fn assign_channel_number(&mut self) -> u16 { 69 let n = self.next; 70 if self.next == MAX_CHANNEL_NUMBER { 71 self.next = MIN_CHANNEL_NUMBER; 72 } else { 73 self.next += 1; 74 } 75 n 76 } 77 create(&mut self, addr: SocketAddr) -> Option<&Binding>78 pub(crate) fn create(&mut self, addr: SocketAddr) -> Option<&Binding> { 79 let b = Binding { 80 number: self.assign_channel_number(), 81 st: BindingState::Idle, 82 addr, 83 refreshed_at: Instant::now(), 84 }; 85 86 self.chan_map.insert(b.number, b.addr.to_string()); 87 self.addr_map.insert(b.addr.to_string(), b); 88 self.addr_map.get(&addr.to_string()) 89 } 90 find_by_addr(&self, addr: &SocketAddr) -> Option<&Binding>91 pub(crate) fn find_by_addr(&self, addr: &SocketAddr) -> Option<&Binding> { 92 self.addr_map.get(&addr.to_string()) 93 } 94 get_by_addr(&mut self, addr: &SocketAddr) -> Option<&mut Binding>95 pub(crate) fn get_by_addr(&mut self, addr: &SocketAddr) -> Option<&mut Binding> { 96 self.addr_map.get_mut(&addr.to_string()) 97 } 98 find_by_number(&self, number: u16) -> Option<&Binding>99 pub(crate) fn find_by_number(&self, number: u16) -> Option<&Binding> { 100 if let Some(s) = self.chan_map.get(&number) { 101 self.addr_map.get(s) 102 } else { 103 None 104 } 105 } 106 get_by_number(&mut self, number: u16) -> Option<&mut Binding>107 pub(crate) fn get_by_number(&mut self, number: u16) -> Option<&mut Binding> { 108 if let Some(s) = self.chan_map.get(&number) { 109 self.addr_map.get_mut(s) 110 } else { 111 None 112 } 113 } 114 delete_by_addr(&mut self, addr: &SocketAddr) -> bool115 pub(crate) fn delete_by_addr(&mut self, addr: &SocketAddr) -> bool { 116 if let Some(b) = self.addr_map.remove(&addr.to_string()) { 117 self.chan_map.remove(&b.number); 118 true 119 } else { 120 false 121 } 122 } 123 delete_by_number(&mut self, number: u16) -> bool124 pub(crate) fn delete_by_number(&mut self, number: u16) -> bool { 125 if let Some(s) = self.chan_map.remove(&number) { 126 self.addr_map.remove(&s); 127 true 128 } else { 129 false 130 } 131 } 132 size(&self) -> usize133 pub(crate) fn size(&self) -> usize { 134 self.addr_map.len() 135 } 136 } 137