Skip to main content

wireforge_app/llmnr/
mod.rs

1//! LLMNR (Link-Local Multicast Name Resolution) parser (RFC 4795).
2use crate::dns::parser::{DnsPacket,DnsQuestionIter,DnsRecordIter};
3
4pub struct LlmrPacket<'a> { dns: DnsPacket<'a> }
5impl<'a> LlmrPacket<'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}
12
13#[cfg(test)]mod tests{use super::*;use crate::dns::builder::DnsPacketBuilder;use crate::dns::types::{DnsType,DnsClass};
14    #[test]fn parse_llmnr_query(){
15        let q=DnsPacketBuilder::query().add_question("wpad",DnsType::A,DnsClass::IN).build();
16        let p=LlmrPacket::new(&q).unwrap();assert!(p.is_query());
17    }
18    #[test]fn parse_llmnr_response(){
19        let r=DnsPacketBuilder::response().add_raw_answer("wpad",DnsType::A,30,&[10,0,0,1]).build();
20        assert!(LlmrPacket::new(&r).unwrap().is_response());
21    }
22}