use core::net::{Ipv4Addr, Ipv6Addr};
use crate::MacAddr;
pub const DNS_HEADER_LEN: usize = 12;
pub const DNS_PORT: u16 = 53;
pub const MDNS_PORT: u16 = 5353;
pub const MDNS_IPV4_MULTICAST: Ipv4Addr = Ipv4Addr::new(224, 0, 0, 251);
pub const MDNS_IPV6_MULTICAST: Ipv6Addr = Ipv6Addr::new(0xff02, 0, 0, 0, 0, 0, 0, 0x00fb);
pub const MDNS_IPV6_LINK_LOCAL_MULTICAST: Ipv6Addr = MDNS_IPV6_MULTICAST;
pub const MDNS_IPV4_ETHERNET_MULTICAST: MacAddr =
MacAddr::new([0x01, 0x00, 0x5e, 0x00, 0x00, 0xfb]);
pub const MDNS_IPV6_ETHERNET_MULTICAST: MacAddr =
MacAddr::new([0x33, 0x33, 0x00, 0x00, 0x00, 0xfb]);
pub const MDNS_RESPONSE_TTL: u8 = 255;
pub const MDNS_RESPONSE_HOP_LIMIT: u8 = MDNS_RESPONSE_TTL;
pub const MDNS_CLASS_BIT: u16 = 0x8000;
pub const MDNS_CLASS_MASK: u16 = 0x7fff;
pub const MDNS_GOODBYE_TTL: u32 = 0;
pub const DNS_SD_DEFAULT_DOMAIN: &str = "local.";
pub const DNS_SD_SERVICE_ENUMERATION_NAME: &str = "_services._dns-sd._udp.local.";
pub const DNS_CLASS_IN: u16 = 1;
pub const DNS_CLASS_CH: u16 = 3;
pub const DNS_CLASS_HS: u16 = 4;
pub const DNS_CLASS_NONE: u16 = 254;
pub const DNS_CLASS_ANY: u16 = 255;
pub const DNS_TYPE_A: u16 = 1;
pub const DNS_TYPE_NS: u16 = 2;
pub const DNS_TYPE_CNAME: u16 = 5;
pub const DNS_TYPE_SOA: u16 = 6;
pub const DNS_TYPE_PTR: u16 = 12;
pub const DNS_TYPE_MX: u16 = 15;
pub const DNS_TYPE_TXT: u16 = 16;
pub const DNS_TYPE_AAAA: u16 = 28;
pub const DNS_TYPE_SRV: u16 = 33;
pub const DNS_TYPE_OPT: u16 = 41;
pub const DNS_TYPE_DS: u16 = 43;
pub const DNS_TYPE_RRSIG: u16 = 46;
pub const DNS_TYPE_NSEC: u16 = 47;
pub const DNS_TYPE_DNSKEY: u16 = 48;
pub const DNS_TYPE_NSEC3: u16 = 50;
pub const DNS_TYPE_NSEC3PARAM: u16 = 51;
pub const DNS_TYPE_TLSA: u16 = 52;
pub const DNS_TYPE_SVCB: u16 = 64;
pub const DNS_TYPE_HTTPS: u16 = 65;
pub const DNS_OPCODE_QUERY: u8 = 0;
pub const DNS_OPCODE_IQUERY: u8 = 1;
pub const DNS_OPCODE_STATUS: u8 = 2;
pub const DNS_OPCODE_NOTIFY: u8 = 4;
pub const DNS_OPCODE_UPDATE: u8 = 5;
pub const DNS_OPCODE_DSO: u8 = 6;
pub const DNS_RCODE_NOERROR: u8 = 0;
pub const DNS_RCODE_FORMERR: u8 = 1;
pub const DNS_RCODE_SERVFAIL: u8 = 2;
pub const DNS_RCODE_NXDOMAIN: u8 = 3;
pub const DNS_RCODE_NOTIMP: u8 = 4;
pub const DNS_RCODE_REFUSED: u8 = 5;
pub const DNS_RCODE_YXDOMAIN: u8 = 6;
pub const DNS_RCODE_YXRRSET: u8 = 7;
pub const DNS_RCODE_NXRRSET: u8 = 8;
pub const DNS_RCODE_NOTAUTH: u8 = 9;
pub const DNS_RCODE_NOTZONE: u8 = 10;
pub const DNS_RCODE_DSOTYPENI: u8 = 11;
pub const DNS_EDNS_OPTION_NSID: u16 = 3;
pub const DNS_EDNS_OPTION_DAU: u16 = 5;
pub const DNS_EDNS_OPTION_DHU: u16 = 6;
pub const DNS_EDNS_OPTION_N3U: u16 = 7;
pub const DNS_EDNS_OPTION_CLIENT_SUBNET: u16 = 8;
pub const DNS_EDNS_OPTION_EXPIRE: u16 = 9;
pub const DNS_EDNS_OPTION_COOKIE: u16 = 10;
pub const DNS_EDNS_OPTION_TCP_KEEPALIVE: u16 = 11;
pub const DNS_EDNS_OPTION_PADDING: u16 = 12;
pub const DNS_EDNS_OPTION_EXTENDED_ERROR: u16 = 15;
pub const DNS_EDNS_DEFAULT_UDP_PAYLOAD_SIZE: u16 = 4096;
pub const DNS_SVCB_KEY_MANDATORY: u16 = 0;
pub const DNS_SVCB_KEY_ALPN: u16 = 1;
pub const DNS_SVCB_KEY_NO_DEFAULT_ALPN: u16 = 2;
pub const DNS_SVCB_KEY_PORT: u16 = 3;
pub const DNS_SVCB_KEY_IPV4HINT: u16 = 4;
pub const DNS_SVCB_KEY_ECH: u16 = 5;
pub const DNS_SVCB_KEY_IPV6HINT: u16 = 6;
pub const DNS_SVCB_KEY_DOHPATH: u16 = 7;
pub const DNS_EDNS_FLAG_DO: u16 = 0x8000;
pub const DNS_FLAG_QR_RESPONSE: u16 = 0x8000;
pub const DNS_FLAG_AUTHORITATIVE: u16 = 0x0400;
pub const DNS_FLAG_TRUNCATED: u16 = 0x0200;
pub const DNS_FLAG_RECURSION_DESIRED: u16 = 0x0100;
pub const DNS_FLAG_RECURSION_AVAILABLE: u16 = 0x0080;
pub const DNS_FLAG_AUTHENTIC_DATA: u16 = 0x0020;
pub const DNS_FLAG_CHECKING_DISABLED: u16 = 0x0010;
#[cfg(test)]
mod mdns_constants_tests {
use super::*;
mod prelude_mdns_constants {
use core::net::{Ipv4Addr, Ipv6Addr};
use crate::prelude::*;
pub(super) const PORT: u16 = MDNS_PORT;
pub(super) const IPV4_MULTICAST: Ipv4Addr = MDNS_IPV4_MULTICAST;
pub(super) const IPV6_MULTICAST: Ipv6Addr = MDNS_IPV6_MULTICAST;
pub(super) const CLASS_BIT: u16 = MDNS_CLASS_BIT;
pub(super) const SERVICE_ENUMERATION_NAME: &str = DNS_SD_SERVICE_ENUMERATION_NAME;
}
#[test]
fn mdns_constants_match_source_backed_transport_and_multicast_values() {
assert_eq!(MDNS_PORT, 5353);
assert_eq!(MDNS_IPV4_MULTICAST, Ipv4Addr::new(224, 0, 0, 251));
assert_eq!(
MDNS_IPV6_MULTICAST,
Ipv6Addr::new(0xff02, 0, 0, 0, 0, 0, 0, 0x00fb)
);
assert_eq!(MDNS_IPV6_LINK_LOCAL_MULTICAST, MDNS_IPV6_MULTICAST);
assert!(MDNS_IPV4_MULTICAST.is_multicast());
assert!(MDNS_IPV6_MULTICAST.is_multicast());
assert_eq!(
MDNS_IPV4_ETHERNET_MULTICAST,
MacAddr::new([0x01, 0x00, 0x5e, 0x00, 0x00, 0xfb])
);
assert_eq!(
MDNS_IPV6_ETHERNET_MULTICAST,
MacAddr::new([0x33, 0x33, 0x00, 0x00, 0x00, 0xfb])
);
assert!(MDNS_IPV4_ETHERNET_MULTICAST.is_multicast());
assert!(MDNS_IPV6_ETHERNET_MULTICAST.is_multicast());
}
#[test]
fn mdns_constants_match_source_backed_class_ttl_and_dns_sd_values() {
assert_eq!(MDNS_RESPONSE_TTL, 255);
assert_eq!(MDNS_RESPONSE_HOP_LIMIT, 255);
assert_eq!(MDNS_CLASS_BIT, 0x8000);
assert_eq!(MDNS_CLASS_MASK, 0x7fff);
assert_eq!(MDNS_CLASS_BIT | DNS_CLASS_IN, 0x8001);
assert_eq!(
(MDNS_CLASS_BIT | DNS_CLASS_IN) & MDNS_CLASS_MASK,
DNS_CLASS_IN
);
assert_eq!(MDNS_GOODBYE_TTL, 0);
assert_eq!(DNS_SD_DEFAULT_DOMAIN, "local.");
assert_eq!(
DNS_SD_SERVICE_ENUMERATION_NAME,
"_services._dns-sd._udp.local."
);
}
#[test]
fn mdns_constants_are_exported_through_prelude() {
assert_eq!(prelude_mdns_constants::PORT, 5353);
assert_eq!(
prelude_mdns_constants::IPV4_MULTICAST,
Ipv4Addr::new(224, 0, 0, 251)
);
assert_eq!(
prelude_mdns_constants::IPV6_MULTICAST,
Ipv6Addr::new(0xff02, 0, 0, 0, 0, 0, 0, 0x00fb)
);
assert_eq!(prelude_mdns_constants::CLASS_BIT, 0x8000);
assert_eq!(
prelude_mdns_constants::SERVICE_ENUMERATION_NAME,
"_services._dns-sd._udp.local."
);
}
}