Skip to main content

wireforge_app/mdns/
mod.rs

1//! mDNS (Multicast DNS) parser (RFC 6762). Internally delegates to DnsPacket.
2use crate::dns::parser::{DnsPacket,DnsQuestionIter,DnsRecordIter};
3
4pub struct MdnsPacket<'a> { dns: DnsPacket<'a> }
5impl<'a> MdnsPacket<'a> {
6    pub fn new(buf:&'a[u8])->Option<Self> { DnsPacket::new(buf).map(|dns|Self{dns}) }
7    pub fn is_query(&self)->bool { !self.dns.qr() }
8    pub fn is_response(&self)->bool { self.dns.qr() }
9    pub fn questions(&self)->DnsQuestionIter<'a> { self.dns.questions() }
10    pub fn answers(&self)->DnsRecordIter<'a> { self.dns.answers() }
11    pub fn authorities(&self)->DnsRecordIter<'a> { self.dns.authorities() }
12    pub fn additionals(&self)->DnsRecordIter<'a> { self.dns.additionals() }
13}
14
15#[cfg(test)]mod tests{use super::*;use crate::dns::builder::DnsPacketBuilder;use crate::dns::types::{DnsType,DnsClass};
16    #[test]fn parse_mdns_query(){
17        let q=DnsPacketBuilder::query().add_question("_http._tcp.local",DnsType::PTR,DnsClass::IN).build();
18        let p=MdnsPacket::new(&q).unwrap();
19        assert!(p.is_query());let qs:Vec<_>=p.questions().collect();assert_eq!(qs.len(),1);
20    }
21    #[test]fn parse_mdns_response(){
22        let r=DnsPacketBuilder::response().add_question("printer.local",DnsType::A,DnsClass::IN).add_raw_answer("printer.local",DnsType::A,120,&[192,168,1,100]).build();
23        let p=MdnsPacket::new(&r).unwrap();assert!(p.is_response());
24    }
25}