Skip to main content

rtc_turn/client/
binding.rs

1#[cfg(test)]
2mod binding_test;
3
4use std::collections::HashMap;
5use std::net::SocketAddr;
6use std::time::Instant;
7
8//  Channel number:
9//    0x4000 through 0x7FFF: These values are the allowed channel
10//    numbers (16,383 possible values).
11const 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/// Thread-safe Binding map.
49#[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}