use common_types::*; use std::net::{Ipv4Addr, Ipv6Addr}; // unless otherwise documented, class should probably be IN (0x0001) // deriving RRData will add a unit test to make sure the type is // registered; there must be a records::types::$name `Type` constant // with the same name as the struct. // class IN #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug, DnsPacketData, DnsTextData, RRData)] pub struct A { addr: Ipv4Addr, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct NS { nsdname: DnsCompressedName, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct MD { madname: DnsCompressedName, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct MF { madname: DnsCompressedName, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct CNAME { cname: DnsCompressedName, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct SOA { mname: DnsCompressedName, rname: DnsCompressedName, serial: u32, refresh: u32, retry: u32, expire: u32, minimum: u32, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct MB { madname: DnsCompressedName, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct MG { mgmname: DnsCompressedName, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct MR { newname: DnsCompressedName, } // not allowed in zone files anyway, i.e. no text representation. // content not restricted either, just some bytes. no need to parse it. // // class independent pub struct NULL; // text representation like: `WKS 127.0.0.1 TCP smtp http 110`. would // have to parse protocol and service names. // // class IN // #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] // pub struct WKS { // address: Ipv4Addr, // protocol: u8, // bitmap: ..., // remaining bytes // } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct PTR { ptrdname: DnsCompressedName, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct HINFO { cpu: ShortText, os: ShortText, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct MINFO { rmailbx: DnsCompressedName, emailbx: DnsCompressedName, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct MX { preference: u16, mxname: DnsCompressedName, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct TXT { text: LongText, } // end of RFC 1035: no DnsCompressedName below! // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct RP { mbox: DnsCanonicalName, txt: DnsCanonicalName, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct AFSDB { subtype: u16, hostname: DnsCanonicalName, } // https://tools.ietf.org/html/rfc1183#section-3.1 says "its format in // master files is a " which say nothing about the // binary encoding; later it says " is a string of decimal // digits", so it would seem that there is no length encoding or // restriction. // // wireshark and bind use though (bind also wants at // least 4 bytes in the field: probably due to "beginning with the 4 // digit DNIC"). // // class independent // pub struct X25 { // psdn_address: ShortText, // } // class independent // pub struct ISDN { // isdn_address: ShortText, // subaddress: Option, // } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct RT { preference: u16, intermediate: DnsCanonicalName, } // pub struct NSAP; #[allow(non_camel_case_types)] #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] #[RRTypeName = "NSAP-PTR"] pub struct NSAP_PTR { owner: DnsCanonicalName, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct SIG { rr_type: Type, algorithm: u8, labels: u8, // RFC says this can be omitted in text form if it is the same as // the TTL on the SIG record. not supported to be omitted here // (TODO?). original_ttl: u32, signature_expiration: Time, signature_inception: Time, key_tag: u16, signers_name: DnsCanonicalName, signature: Base64RemainingBlob, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct KEY { flags: u16, protocol: u8, algorithm: u8, public_key: Base64RemainingBlob, } // class IN #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct PX { preference: u16, map822: DnsCanonicalName, mapx400: DnsCanonicalName, } // pub struct GPOS; // class IN #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct AAAA { addr: Ipv6Addr, } pub use super::weird_structs::LOC; #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct NXT { next: DnsCanonicalName, types: NxtTypeBitmap, } // pub struct EID; // pub struct NIMLOC; // class IN #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct SRV { preference: u16, weight: u16, port: u16, target: DnsCanonicalName, } // pub struct ATMA; // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct NAPTR { order: u16, preference: u16, flags: ShortText, service: ShortText, regexp: ShortText, replacement: DnsCanonicalName, } // class IN #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct KX { preference: u16, exchanger: DnsCanonicalName, } // class ?? #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct CERT { cert_type: u16, key_tag: u16, algorithm: u8, certificate: Base64RemainingBlob, } pub use super::weird_structs::A6; // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct DNAME { target: DnsCanonicalName, } // pub struct SINK; // OPT should be decoded at "transport level", abuses ttl and class // fields too. // pub struct OPT; // pub struct APL; #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct DS { key_tag: u16, algorithm: u8, digest_type: u8, digest: HexRemainingBlob, } #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct SSHFP { algorithm: u8, fingerprint_type: u8, // RFC 4255 doesn't specify whether whitespace is allowed. // `HexRemainingBlob` allows whitespace. fingerprint: HexRemainingBlob, } // #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] // pub struct IPSECKEY; // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct RRSIG { rr_type: Type, algorithm: u8, labels: u8, original_ttl: u32, signature_expiration: Time, signature_inception: Time, key_tag: u16, signers_name: DnsCanonicalName, signature: Base64RemainingBlob, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct NSEC { next: DnsCanonicalName, types: NsecTypeBitmap, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct DNSKEY { flags: u16, protocol: u8, algorithm: u8, public_key: Base64RemainingBlob, } // #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] // pub struct DHCID; // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct NSEC3 { hash_algorithm: u8, flags: u8, iterations: u16, salt: HexShortBlob, next_hashed: NextHashedOwnerName, types: NsecTypeBitmap, } // class independent #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct NSEC3PARAM { hash_algorithm: u8, flags: u8, iterations: u16, salt: HexShortBlob, } // #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] // pub struct TLSA; // #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] // pub struct SMIMEA; // pub struct HIP; // pub struct NINFO; // #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] // pub struct RKEY; // pub struct TALINK; // #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] // pub struct CDS; // #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] // pub struct CDNSKEY; // #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] // pub struct OPENPGPKEY; // pub struct CSYNC; #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct SPF { text: LongText, } // pub struct UINFO; // pub struct UID; // pub struct GID; // pub struct UNSPEC; // pub struct NID; // pub struct L32; // pub struct L64; // pub struct LP; // #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] // pub struct EUI48; // #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] // pub struct EUI64; // #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] // pub struct TKEY; // #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] // pub struct TSIG; // pub struct IXFR; // qtype only? // pub struct AXFR; // qtype only? // pub struct MAILB; // qtype only? // pub struct MAILA; // qtype only? // pub struct ANY; // qtype only? #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct URI { priority: u16, weight: u16, target: UriText, } #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] pub struct CAA { flags: u8, tag: UnquotedShortText, value: RemainingText, } // pub struct AVC; // pub struct DOA; // #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] // pub struct DLV; // pub struct ADDR; // #[derive(Clone, PartialEq, Eq, Debug, DnsPacketData, DnsTextData, RRData)] // pub struct ALIAS;