flex_dns/rdata/
ipseckey.rs1use crate::{Buffer, DnsMessage, DnsMessageError, MutBuffer};
2use crate::characters::Characters;
3use crate::parse::Parse;
4use crate::rdata::{RData, RDataParse};
5use crate::write::WriteBytes;
6
7#[derive(Copy, Clone, Debug, PartialEq)]
10pub struct IpSecKey<'a> {
11 pub precedence: u16,
13 pub gateway_type: u8,
15 pub algorithm: u8,
17 pub gateway: Characters<'a>,
19 pub public_key: Characters<'a>,
21}
22
23impl<'a> RDataParse<'a> for IpSecKey<'a> {
24 #[inline]
25 fn parse(rdata: &RData<'a>, i: &mut usize) -> Result<Self, DnsMessageError> {
26 let precedence = u16::parse(rdata.buffer, i)?;
27 let gateway_type = u8::parse(rdata.buffer, i)?;
28 let algorithm = u8::parse(rdata.buffer, i)?;
29 let gateway = Characters::parse(rdata.buffer, i)?;
30 let public_key = Characters::parse(rdata.buffer, i)?;
31
32 Ok(Self {
33 precedence,
34 gateway_type,
35 algorithm,
36 gateway,
37 public_key,
38 })
39 }
40}
41
42impl<'a> WriteBytes for IpSecKey<'a> {
43 #[inline]
44 fn write<
45 const PTR_STORAGE: usize,
46 const DNS_SECTION: usize,
47 B: MutBuffer + Buffer,
48 >(&self, message: &mut DnsMessage<PTR_STORAGE, DNS_SECTION, B>) -> Result<usize, DnsMessageError> {
49 let mut bytes = 0;
50
51 bytes += self.precedence.write(message)?;
52 bytes += self.gateway_type.write(message)?;
53 bytes += self.algorithm.write(message)?;
54 bytes += self.gateway.write(message)?;
55 bytes += self.public_key.write(message)?;
56
57 Ok(bytes)
58 }
59}
60
61#[cfg(test)]
62mod test {
63 use crate::rdata::testutils::parse_write_test;
64
65 use super::*;
66
67 parse_write_test!(
68 12,
69 [
70 0x01, 0x02, 0x03, 0x04, 0x03, b'w', b'w', b'w', 0x03, b'w', b'w', b'w', ],
76 IpSecKey {
77 precedence: 0x0102,
78 gateway_type: 0x03,
79 algorithm: 0x04,
80 gateway: unsafe { Characters::new_unchecked(b"www") },
81 public_key: unsafe { Characters::new_unchecked(b"www") },
82 },
83 );
84}