flex_dns/rdata/
svcb.rs

1use crate::{Buffer, DnsMessage, DnsMessageError, MutBuffer};
2use crate::characters::Characters;
3use crate::name::DnsName;
4use crate::parse::Parse;
5use crate::rdata::{RData, RDataParse};
6use crate::write::WriteBytes;
7
8/// # Service binding record (SVCB)
9/// This record is used to describe the parameters of a service binding.
10#[derive(Copy, Clone, Debug, PartialEq)]
11pub struct Svcb<'a> {
12    /// The priority of this target host
13    pub priority: u16,
14    /// The relative weight for entries with the same priority
15    pub weight: u16,
16    /// The TCP or UDP port on which the service is to be found
17    pub port: u16,
18    /// The domain name of the target host
19    pub target: DnsName<'a>,
20    /// The parameters of the service binding
21    pub parameters: Characters<'a>,
22}
23
24impl<'a> RDataParse<'a> for Svcb<'a> {
25    #[inline]
26    fn parse(rdata: &RData<'a>, i: &mut usize) -> Result<Self, DnsMessageError> {
27        let priority = u16::parse(rdata, i)?;
28        let weight = u16::parse(rdata, i)?;
29        let port = u16::parse(rdata, i)?;
30        let target = DnsName::parse(rdata, i)?;
31        let parameters = Characters::parse(rdata, i)?;
32
33        Ok(Self {
34            priority,
35            weight,
36            port,
37            target,
38            parameters
39        })
40    }
41}
42
43impl<'a> WriteBytes for Svcb<'a> {
44    #[inline]
45    fn write<
46        const PTR_STORAGE: usize,
47        const DNS_SECTION: usize,
48        B: MutBuffer + Buffer,
49    >(&self, message: &mut DnsMessage<PTR_STORAGE, DNS_SECTION, B>) -> Result<usize, DnsMessageError> {
50        let mut bytes = 0;
51
52        bytes += self.priority.write(message)?;
53        bytes += self.weight.write(message)?;
54        bytes += self.port.write(message)?;
55        bytes += self.target.write(message)?;
56        bytes += self.parameters.write(message)?;
57
58        Ok(bytes)
59    }
60}
61
62#[cfg(test)]
63mod test {
64    use crate::rdata::testutils::parse_write_test;
65
66    use super::*;
67
68    parse_write_test!(
69        15,
70        [
71            0x00, 0x0e, // priority
72            0x00, 0x0e, // weight
73            0x00, 0x0e, // port
74            0x03, // length of "www"
75            b'w', b'w', b'w', // "www"
76            0x00, // end of name
77            0x03, // length of "www"
78            b'w', b'w', b'w', // "www"
79        ],
80        Svcb {
81            priority: 14,
82            weight: 14,
83            port: 14,
84            target: unsafe { DnsName::new_unchecked(b"\x03www\x00") },
85            parameters: unsafe { Characters::new_unchecked(b"www") },
86        },
87    );
88}