rtc_turn/proto/
channum.rs1#[cfg(test)]
2mod channnum_test;
3
4use std::fmt;
5
6use stun::attributes::*;
7use stun::checks::*;
8use stun::message::*;
9
10use shared::error::Result;
11
12const CHANNEL_NUMBER_SIZE: usize = 4;
14
15pub const MIN_CHANNEL_NUMBER: u16 = 0x4000;
23pub const MAX_CHANNEL_NUMBER: u16 = 0x7FFF;
25
26#[derive(Default, Eq, PartialEq, Debug, Copy, Clone, Hash)]
32pub struct ChannelNumber(pub u16);
33
34impl fmt::Display for ChannelNumber {
35 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
36 write!(f, "{}", self.0)
37 }
38}
39
40impl Setter for ChannelNumber {
41 fn add_to(&self, m: &mut Message) -> Result<()> {
43 let mut v = vec![0; CHANNEL_NUMBER_SIZE];
44 v[..2].copy_from_slice(&self.0.to_be_bytes());
45 m.add(ATTR_CHANNEL_NUMBER, &v);
47 Ok(())
48 }
49}
50
51impl Getter for ChannelNumber {
52 fn get_from(&mut self, m: &Message) -> Result<()> {
54 let v = m.get(ATTR_CHANNEL_NUMBER)?;
55
56 check_size(ATTR_CHANNEL_NUMBER, v.len(), CHANNEL_NUMBER_SIZE)?;
57
58 self.0 = u16::from_be_bytes([v[0], v[1]]);
60 Ok(())
62 }
63}
64
65impl ChannelNumber {
66 fn is_channel_number_valid(&self) -> bool {
68 self.0 >= MIN_CHANNEL_NUMBER && self.0 <= MAX_CHANNEL_NUMBER
69 }
70
71 pub fn valid(&self) -> bool {
74 self.is_channel_number_valid()
75 }
76}