webrtc_turn/proto/
reqfamily.rs1#[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
14pub const REQUESTED_FAMILY_IPV4: RequestedAddressFamily = RequestedAddressFamily(0x01);
16pub const REQUESTED_FAMILY_IPV6: RequestedAddressFamily = RequestedAddressFamily(0x02);
17
18#[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 fn add_to(&self, m: &mut Message) -> Result<(), Error> {
39 let mut v = vec![0; REQUESTED_FAMILY_SIZE];
40 v[0] = self.0;
41 m.add(ATTR_REQUESTED_ADDRESS_FAMILY, &v);
45 Ok(())
46 }
47}
48
49impl Getter for RequestedAddressFamily {
50 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}