Skip to main content

rtc_turn/proto/
chandata.rs

1#[cfg(test)]
2mod chandata_test;
3
4use super::channum::*;
5use shared::error::{Error, Result};
6
7const PADDING: usize = 4;
8
9fn nearest_padded_value_length(l: usize) -> usize {
10    let mut n = PADDING * (l / PADDING);
11    if n < l {
12        n += PADDING;
13    }
14    n
15}
16
17const CHANNEL_DATA_LENGTH_SIZE: usize = 2;
18const CHANNEL_DATA_NUMBER_SIZE: usize = CHANNEL_DATA_LENGTH_SIZE;
19const CHANNEL_DATA_HEADER_SIZE: usize = CHANNEL_DATA_LENGTH_SIZE + CHANNEL_DATA_NUMBER_SIZE;
20
21/// `ChannelData` represents the `ChannelData` Message defined in
22/// [RFC 5766 Section 11.4](https://www.rfc-editor.org/rfc/rfc5766#section-11.4).
23#[derive(Default, Debug)]
24pub struct ChannelData {
25    pub data: Vec<u8>, // can be subslice of Raw
26    pub number: ChannelNumber,
27    pub raw: Vec<u8>,
28}
29
30impl PartialEq for ChannelData {
31    fn eq(&self, other: &Self) -> bool {
32        self.data == other.data && self.number == other.number
33    }
34}
35
36impl ChannelData {
37    /// Resets length, [`Self::data`] and [`Self::raw`] length.
38    #[inline]
39    pub fn reset(&mut self) {
40        self.raw.clear();
41        self.data.clear();
42    }
43
44    /// Encodes this to [`Self::raw`].
45    pub fn encode(&mut self) {
46        self.raw.clear();
47        self.write_header();
48        self.raw.extend_from_slice(&self.data);
49        let padded = nearest_padded_value_length(self.raw.len());
50        let bytes_to_add = padded - self.raw.len();
51        if bytes_to_add > 0 {
52            self.raw.extend_from_slice(&vec![0; bytes_to_add]);
53        }
54    }
55
56    /// Decodes this from [`Self::raw`].
57    pub fn decode(&mut self) -> Result<()> {
58        let buf = &self.raw;
59        if buf.len() < CHANNEL_DATA_HEADER_SIZE {
60            return Err(Error::ErrUnexpectedEof);
61        }
62        let num = u16::from_be_bytes([buf[0], buf[1]]);
63        self.number = ChannelNumber(num);
64        if !self.number.valid() {
65            return Err(Error::ErrInvalidChannelNumber);
66        }
67        let l = u16::from_be_bytes([
68            buf[CHANNEL_DATA_NUMBER_SIZE],
69            buf[CHANNEL_DATA_NUMBER_SIZE + 1],
70        ]) as usize;
71        if l > buf[CHANNEL_DATA_HEADER_SIZE..].len() {
72            return Err(Error::ErrBadChannelDataLength);
73        }
74        self.data = buf[CHANNEL_DATA_HEADER_SIZE..CHANNEL_DATA_HEADER_SIZE + l].to_vec();
75
76        Ok(())
77    }
78
79    /// Writes channel number and length.
80    pub fn write_header(&mut self) {
81        if self.raw.len() < CHANNEL_DATA_HEADER_SIZE {
82            // Making WriteHeader call valid even when c.Raw
83            // is nil or len(c.Raw) is less than needed for header.
84            self.raw
85                .resize(self.raw.len() + CHANNEL_DATA_HEADER_SIZE, 0);
86        }
87        self.raw[..CHANNEL_DATA_NUMBER_SIZE].copy_from_slice(&self.number.0.to_be_bytes());
88        self.raw[CHANNEL_DATA_NUMBER_SIZE..CHANNEL_DATA_HEADER_SIZE]
89            .copy_from_slice(&(self.data.len() as u16).to_be_bytes());
90    }
91
92    /// Returns `true` if `buf` looks like the `ChannelData` Message.
93    pub fn is_channel_data(buf: &[u8]) -> bool {
94        if buf.len() < CHANNEL_DATA_HEADER_SIZE {
95            return false;
96        }
97
98        if u16::from_be_bytes([
99            buf[CHANNEL_DATA_NUMBER_SIZE],
100            buf[CHANNEL_DATA_NUMBER_SIZE + 1],
101        ]) > buf[CHANNEL_DATA_HEADER_SIZE..].len() as u16
102        {
103            return false;
104        }
105
106        // Quick check for channel number.
107        let num = ChannelNumber(u16::from_be_bytes([buf[0], buf[1]]));
108        num.valid()
109    }
110}