webrtc_turn/proto/
reqfamily.rs

1#[cfg(test)]
2mod reqfamily_test;
3
4use stun::attributes::*;
5use stun::checks::*;
6use stun::message::*;
7
8use crate::errors::*;
9
10use util::Error;
11
12use std::fmt;
13
14// Values for RequestedAddressFamily as defined in RFC 6156 Section 4.1.1.
15pub const REQUESTED_FAMILY_IPV4: RequestedAddressFamily = RequestedAddressFamily(0x01);
16pub const REQUESTED_FAMILY_IPV6: RequestedAddressFamily = RequestedAddressFamily(0x02);
17
18// RequestedAddressFamily represents the REQUESTED-ADDRESS-FAMILY Attribute as
19// defined in RFC 6156 Section 4.1.1.
20#[derive(Debug, Default, PartialEq, Eq)]
21pub struct RequestedAddressFamily(pub u8);
22
23impl fmt::Display for RequestedAddressFamily {
24    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25        let s = match *self {
26            REQUESTED_FAMILY_IPV4 => "IPv4",
27            REQUESTED_FAMILY_IPV6 => "IPv6",
28            _ => "unknown",
29        };
30        write!(f, "{}", s)
31    }
32}
33
34const REQUESTED_FAMILY_SIZE: usize = 4;
35
36impl Setter for RequestedAddressFamily {
37    // AddTo adds REQUESTED-ADDRESS-FAMILY to message.
38    fn add_to(&self, m: &mut Message) -> Result<(), Error> {
39        let mut v = vec![0; REQUESTED_FAMILY_SIZE];
40        v[0] = self.0;
41        // b[1:4] is RFFU = 0.
42        // The RFFU field MUST be set to zero on transmission and MUST be
43        // ignored on reception. It is reserved for future uses.
44        m.add(ATTR_REQUESTED_ADDRESS_FAMILY, &v);
45        Ok(())
46    }
47}
48
49impl Getter for RequestedAddressFamily {
50    // GetFrom decodes REQUESTED-ADDRESS-FAMILY from message.
51    fn get_from(&mut self, m: &Message) -> Result<(), Error> {
52        let v = m.get(ATTR_REQUESTED_ADDRESS_FAMILY)?;
53        check_size(
54            ATTR_REQUESTED_ADDRESS_FAMILY,
55            v.len(),
56            REQUESTED_FAMILY_SIZE,
57        )?;
58
59        if v[0] != REQUESTED_FAMILY_IPV4.0 && v[0] != REQUESTED_FAMILY_IPV6.0 {
60            return Err(ERR_INVALID_REQUESTED_FAMILY_VALUE.to_owned());
61        }
62        self.0 = v[0];
63        Ok(())
64    }
65}