webrtc_mdns/message/resource/
soa.rs

1use super::*;
2use crate::error::Result;
3use crate::message::name::*;
4use crate::message::packer::*;
5
6// An SOAResource is an SOA Resource record.
7#[derive(Default, Debug, Clone, PartialEq, Eq)]
8pub struct SoaResource {
9    pub ns: Name,
10    pub mbox: Name,
11    pub serial: u32,
12    pub refresh: u32,
13    pub retry: u32,
14    pub expire: u32,
15
16    // min_ttl the is the default TTL of Resources records which did not
17    // contain a TTL value and the TTL of negative responses. (RFC 2308
18    // Section 4)
19    pub min_ttl: u32,
20}
21
22impl fmt::Display for SoaResource {
23    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24        write!(
25            f,
26            "dnsmessage.SOAResource{{ns: {}, mbox: {}, serial: {}, refresh: {}, retry: {}, expire: {}, min_ttl: {}}}",
27            self.ns,
28            self.mbox,
29            self.serial,
30            self.refresh,
31            self.retry,
32            self.expire,
33            self.min_ttl,
34        )
35    }
36}
37
38impl ResourceBody for SoaResource {
39    fn real_type(&self) -> DnsType {
40        DnsType::Soa
41    }
42
43    // pack appends the wire format of the SOAResource to msg.
44    fn pack(
45        &self,
46        mut msg: Vec<u8>,
47        compression: &mut Option<HashMap<String, usize>>,
48        compression_off: usize,
49    ) -> Result<Vec<u8>> {
50        msg = self.ns.pack(msg, compression, compression_off)?;
51        msg = self.mbox.pack(msg, compression, compression_off)?;
52        msg = pack_uint32(msg, self.serial);
53        msg = pack_uint32(msg, self.refresh);
54        msg = pack_uint32(msg, self.retry);
55        msg = pack_uint32(msg, self.expire);
56        Ok(pack_uint32(msg, self.min_ttl))
57    }
58
59    fn unpack(&mut self, msg: &[u8], mut off: usize, _length: usize) -> Result<usize> {
60        off = self.ns.unpack(msg, off)?;
61        off = self.mbox.unpack(msg, off)?;
62
63        let (serial, off) = unpack_uint32(msg, off)?;
64        self.serial = serial;
65
66        let (refresh, off) = unpack_uint32(msg, off)?;
67        self.refresh = refresh;
68
69        let (retry, off) = unpack_uint32(msg, off)?;
70        self.retry = retry;
71
72        let (expire, off) = unpack_uint32(msg, off)?;
73        self.expire = expire;
74
75        let (min_ttl, off) = unpack_uint32(msg, off)?;
76        self.min_ttl = min_ttl;
77
78        Ok(off)
79    }
80}