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