webrtc_turn/client/
binding.rs

1#[cfg(test)]
2mod binding_test;
3
4use std::collections::HashMap;
5use std::net::SocketAddr;
6
7use tokio::time::Instant;
8
9//  Chanel number:
10//    0x4000 through 0x7FFF: These values are the allowed channel
11//    numbers (16,383 possible values).
12const 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        //atomic.StoreInt32((*int32)(&b.st), int32(state))
35        self.st = state;
36    }
37
38    pub(crate) fn state(&self) -> BindingState {
39        //return BindingState(atomic.LoadInt32((*int32)(&b.st)))
40        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// Thread-safe Binding map
52#[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}