dns_message_parser/decode/rr/
rfc_3123.rs1use super::Header;
2use crate::decode::Decoder;
3use crate::rr::{APItem, Class, APL, APL_NEGATION_MASK};
4use crate::{DecodeError, DecodeResult};
5
6const ADDRESS_LENGTH_MASK: u8 = 0b0111_1111;
7
8impl<'a, 'b: 'a> Decoder<'b, 'b> {
9 pub(super) fn rr_apl_apitem(&'a mut self) -> DecodeResult<APItem> {
10 let address_family_number = self.rr_address_family_number()?;
11 let prefix = self.u8()?;
12 let buffer = self.u8()?;
13 let negation = (buffer & APL_NEGATION_MASK) == APL_NEGATION_MASK;
14 let address_length = buffer & ADDRESS_LENGTH_MASK;
15 let mut address_data = self.sub(address_length as u16)?;
16 let address = address_data.rr_address(address_family_number)?;
17 address_data.finished()?;
18 let apitem = APItem::new(prefix, negation, address)?;
19 Ok(apitem)
20 }
21
22 pub(super) fn rr_apl(&'a mut self, header: Header) -> DecodeResult<APL> {
23 match header.get_class()? {
24 Class::IN => {
25 let mut apitems = Vec::new();
26 while !self.is_finished()? {
27 apitems.push(self.rr_apl_apitem()?);
28 }
29 let apl = APL {
30 domain_name: header.domain_name,
31 ttl: header.ttl,
32 apitems,
33 };
34 Ok(apl)
35 }
36 class => Err(DecodeError::APLClass(class)),
37 }
38 }
39}