dns_message_parser/decode/rr/
rfc_3123.rs

1use 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}