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