flex_dns/rdata/
kx.rs

1use crate::{Buffer, DnsMessage, DnsMessageError, MutBuffer};
2use crate::name::DnsName;
3use crate::parse::Parse;
4use crate::rdata::{RData, RDataParse};
5use crate::write::WriteBytes;
6
7/// # Key exchange delegation record
8/// This record describes a mechanism whereby authorization for one node
9/// to act as a key exchange for another is delegated and made available
10/// with the secure DNS protocol.
11#[derive(Copy, Clone, Debug, PartialEq)]
12pub struct Kx<'a> {
13    /// The preference given to this record among others at the same owner.
14    pub preference: u16,
15    /// The key exchange host name.
16    pub exchange: DnsName<'a>,
17}
18
19impl<'a> RDataParse<'a> for Kx<'a> {
20    #[inline]
21    fn parse(rdata: &RData<'a>, i: &mut usize) -> Result<Self, DnsMessageError> {
22        let preference = u16::parse(rdata.buffer, i)?;
23        let exchange = DnsName::parse(rdata.buffer, i)?;
24
25        Ok(Self {
26            preference,
27            exchange,
28        })
29    }
30}
31
32impl<'a> WriteBytes for Kx<'a> {
33    #[inline]
34    fn write<
35        const PTR_STORAGE: usize,
36        const DNS_SECTION: usize,
37        B: MutBuffer + Buffer,
38    >(&self, message: &mut DnsMessage<PTR_STORAGE, DNS_SECTION, B>) -> Result<usize, DnsMessageError> {
39        let mut bytes = 0;
40
41        bytes += self.preference.write(message)?;
42        bytes += self.exchange.write(message)?;
43
44        Ok(bytes)
45    }
46}
47
48#[cfg(test)]
49mod test {
50    use crate::rdata::testutils::parse_write_test;
51
52    use super::*;
53
54    parse_write_test!(
55        7,
56        [
57            0x00, 0x0e, // preference
58            0x03, b'w', b'w', b'w', 0x00, // exchange
59        ],
60        Kx {
61            preference: 14,
62            exchange: unsafe { DnsName::new_unchecked(b"\x03www\x00") },
63        },
64    );
65}