// Copyright 2019 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef DISCOVERY_MDNS_PUBLIC_MDNS_RECORDS_H_ #define DISCOVERY_MDNS_PUBLIC_MDNS_RECORDS_H_ #include <algorithm> #include <chrono> #include <functional> #include <initializer_list> #include <ostream> #include <string> #include <string_view> #include <utility> #include <vector> #include "absl/types/variant.h" #include "discovery/mdns/public/mdns_constants.h" #include "platform/base/error.h" #include "platform/base/interface_info.h" #include "platform/base/ip_address.h" #include "util/osp_logging.h" #include "util/string_util.h" namespace openscreen::discovery { bool IsValidDomainLabel(std::string_view label); // Represents domain name as a collection of labels, ensures label length and // domain name length requirements are met. class DomainName { … }; // Parsed representation of the extra data in a record. Does not include // standard DNS record data such as TTL, Name, Type, and Class. We use it to // distinguish a raw record type that we do not know the identity of. class RawRecordRdata { … }; // SRV record format (http://www.ietf.org/rfc/rfc2782.txt): // 2 bytes network-order unsigned priority // 2 bytes network-order unsigned weight // 2 bytes network-order unsigned port // target: domain name (on-the-wire representation) class SrvRecordRdata { … }; // A Record format (http://www.ietf.org/rfc/rfc1035.txt): // 4 bytes for IP address. class ARecordRdata { … }; // AAAA Record format (http://www.ietf.org/rfc/rfc1035.txt): // 16 bytes for IP address. class AAAARecordRdata { … }; // PTR record format (http://www.ietf.org/rfc/rfc1035.txt): // domain: On the wire representation of domain name. class PtrRecordRdata { … }; // TXT record format (http://www.ietf.org/rfc/rfc1035.txt). // texts: One or more <entries>. // An <entry> is a length octet followed by as many data octets. // // DNS-SD interprets <entries> as a list of boolean keys and key=value // attributes. See https://tools.ietf.org/html/rfc6763#section-6 for details. class TxtRecordRdata { … }; // NSEC record format (https://tools.ietf.org/html/rfc4034#section-4). // In mDNS, this record type is used for representing negative responses to // queries. // // next_domain_name: The next domain to process. In mDNS, this value is expected // to match the record-level domain name in a negative response. // // An example of how the |types_| vector is serialized is as follows: // When encoding the following DNS types: // - A (value 1) // - MX (value 15) // - RRSIG (value 46) // - NSEC (value 47) // - TYPE1234 (value 1234) // The result would be: // 0x00 0x06 0x40 0x01 0x00 0x00 0x00 0x03 // 0x04 0x1b 0x00 0x00 0x00 0x00 0x00 0x00 // 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 // 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 // 0x00 0x00 0x00 0x00 0x20 class NsecRecordRdata { … }; // The OPT pseudo-record / meta-record as defined by RFC6891. class OptRecordRdata { … }; Rdata; // Resource record top level format (http://www.ietf.org/rfc/rfc1035.txt): // name: the name of the node to which this resource record pertains. // type: 2 bytes network-order RR TYPE code. // class: 2 bytes network-order RR CLASS code. // ttl: 4 bytes network-order cache time interval. // rdata: RDATA describing the resource. The format of this information varies // according to the TYPE and CLASS of the resource record. class MdnsRecord { … }; // Creates an A or AAAA record as appropriate for the provided parameters. MdnsRecord CreateAddressRecord(DomainName name, const IPAddress& address); // Question top level format (http://www.ietf.org/rfc/rfc1035.txt): // name: a domain name which identifies the target resource set. // type: 2 bytes network-order RR TYPE code. // class: 2 bytes network-order RR CLASS code. class MdnsQuestion { … }; // Message top level format (http://www.ietf.org/rfc/rfc1035.txt): // id: 2 bytes network-order identifier assigned by the program that generates // any kind of query. This identifier is copied to the corresponding reply and // can be used by the requester to match up replies to outstanding queries. // flags: 2 bytes network-order flags bitfield. // questions: questions in the message. // answers: resource records that answer the questions. // authority_records: resource records that point toward authoritative name. // servers additional_records: additional resource records that relate to the // query. class MdnsMessage { … }; uint16_t CreateMessageId(); // Determines whether a record of the given type can be published. bool CanBePublished(DnsType type); // Determines whether a record of the given type can be queried for. bool CanBeQueried(DnsType type); // Determines whether a record of the given type received over the network // should be processed. bool CanBeProcessed(DnsType type); } // namespace openscreen::discovery #endif // DISCOVERY_MDNS_PUBLIC_MDNS_RECORDS_H_