webrtc_turn/client/
binding.rs1#[cfg(test)]
2mod binding_test;
3
4use std::collections::HashMap;
5use std::net::SocketAddr;
6
7use tokio::time::Instant;
8
9const MIN_CHANNEL_NUMBER: u16 = 0x4000;
13const MAX_CHANNEL_NUMBER: u16 = 0x7fff;
14
15#[derive(Copy, Clone, Debug, PartialEq)]
16pub(crate) enum BindingState {
17 Idle,
18 Request,
19 Ready,
20 Refresh,
21 Failed,
22}
23
24#[derive(Copy, Clone, Debug, PartialEq)]
25pub(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
32impl Binding {
33 pub(crate) fn set_state(&mut self, state: BindingState) {
34 self.st = state;
36 }
37
38 pub(crate) fn state(&self) -> BindingState {
39 self.st
41 }
42
43 pub(crate) fn set_refreshed_at(&mut self, at: Instant) {
44 self.refreshed_at = at;
45 }
46
47 pub(crate) fn refreshed_at(&self) -> Instant {
48 self.refreshed_at
49 }
50}
51#[derive(Default)]
53pub(crate) struct BindingManager {
54 chan_map: HashMap<u16, String>,
55 addr_map: HashMap<String, Binding>,
56 next: u16,
57}
58
59impl BindingManager {
60 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
68 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
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
91 pub(crate) fn find_by_addr(&self, addr: &SocketAddr) -> Option<&Binding> {
92 self.addr_map.get(&addr.to_string())
93 }
94
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
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
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
115 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
124 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
133 pub(crate) fn size(&self) -> usize {
134 self.addr_map.len()
135 }
136}