summaryrefslogtreecommitdiffstats
path: root/src/lib/dns/rrtype.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/dns/rrtype.h')
-rw-r--r--src/lib/dns/rrtype.h748
1 files changed, 748 insertions, 0 deletions
diff --git a/src/lib/dns/rrtype.h b/src/lib/dns/rrtype.h
new file mode 100644
index 0000000..e752253
--- /dev/null
+++ b/src/lib/dns/rrtype.h
@@ -0,0 +1,748 @@
+///////////////
+///////////////
+/////////////// THIS FILE IS AUTOMATICALLY GENERATED BY gen-rdatacode.py.
+/////////////// DO NOT EDIT!
+///////////////
+///////////////
+
+// Copyright (C) 2010-2021 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef RRTYPE_H
+#define RRTYPE_H 1
+
+#include <stdint.h>
+
+#include <string>
+#include <ostream>
+
+#include <dns/exceptions.h>
+
+// Solaris x86 defines DS in <sys/regset.h>, which gets pulled in by Boost
+#if defined(__sun) && defined(DS)
+# undef DS
+#endif
+
+namespace isc {
+namespace util {
+class InputBuffer;
+class OutputBuffer;
+}
+
+namespace dns {
+
+// forward declarations
+class AbstractMessageRenderer;
+
+///
+/// \brief A standard DNS module exception that is thrown if an RRType object
+/// is being constructed from an unrecognized string.
+///
+class InvalidRRType : public DNSTextError {
+public:
+ InvalidRRType(const char* file, size_t line, const char* what) :
+ DNSTextError(file, line, what) {}
+};
+
+///
+/// \brief A standard DNS module exception that is thrown if an RRType object
+/// is being constructed from a incomplete (too short) wire-format data.
+///
+class IncompleteRRType : public isc::dns::Exception {
+public:
+ IncompleteRRType(const char* file, size_t line, const char* what) :
+ isc::dns::Exception(file, line, what) {}
+};
+
+///
+/// The \c RRType class encapsulates DNS resource record types.
+///
+/// This class manages the 16-bit integer type codes in quite a straightforward
+/// way. The only non trivial task is to handle textual representations of
+/// RR types, such as "A", "AAAA", or "TYPE65534".
+///
+/// This class consults a helper \c RRParamRegistry class, which is a registry
+/// of RR related parameters and has the singleton object. This registry
+/// provides a mapping between RR type codes and their "well-known" textual
+/// representations.
+/// Parameters of RR types defined by DNS protocol standards are automatically
+/// registered at initialization time and are ensured to be always available for
+/// applications unless the application explicitly modifies the registry.
+///
+/// For convenience, this class defines constant class objects corresponding to
+/// standard RR types. These are generally referred to as the form of
+/// <code>RRType::{type-text}()</code>.
+/// For example, \c RRType::NS() is an \c RRType object corresponding to the NS
+/// resource record (type code 2).
+/// Note that these constants are used through a "proxy" function.
+/// This is because they may be used to initialize another non-local (e.g.
+/// global or namespace-scope) static object as follows:
+///
+/// \code
+/// namespace foo {
+/// const RRType default_type = RRType::A();
+/// } \endcode
+///
+/// In order to ensure that the constant RRType object has been initialized
+/// before the initialization for \c default_type, we need help from
+/// the proxy function.
+///
+/// In the current implementation, the initialization of the well-known
+/// static objects is not thread safe. The same consideration as the
+/// \c RRParamRegistry class applies. We may extend the implementation so
+/// that the initialization is ensured to be thread safe in a future version.
+///
+/// Note to developers: since it's expected that some of these constant
+/// \c RRType objects are frequently used in a performance sensitive path,
+/// we define these proxy functions as inline. This makes sense only when
+/// the corresponding static objects are defined only once even if they used
+/// in different source files. Sufficiently modern compilers should meet
+/// this assumption, but if we encounter memory bloat due to this problem with
+/// particular compilers we need to revisit the design or think about
+/// workaround.
+class RRType {
+public:
+ ///
+ /// \name Constructors and Destructor
+ ///
+ //@{
+ /// Constructor from an integer type code.
+ ///
+ /// This constructor never throws an exception.
+ ///
+ /// \param typecode An 16-bit integer code corresponding to the RRType.
+ explicit RRType(uint16_t typecode) : typecode_(typecode) {}
+ /// Constructor from a string.
+ ///
+ /// A valid string is one of "well-known" textual type representations
+ /// such as "A", "AAAA", or "NS", or in the standard format for "unknown"
+ /// RR types as defined in RFC3597, i.e., "TYPEnnnn".
+ ///
+ /// More precisely, the "well-known" representations are the ones stored
+ /// in the \c RRParamRegistry registry (see the class description).
+ ///
+ /// As for the format of "TYPEnnnn", "nnnn" must represent a valid 16-bit
+ /// unsigned integer, which may contain leading 0's as long as it consists
+ /// of at most 5 characters (inclusive).
+ /// For example, "TYPE1" and "TYPE001" are valid and represent the same
+ /// RR type, but "TYPE65536" and "TYPE000001" are invalid.
+ /// A "TYPEnnnn" representation is valid even if the corresponding type code
+ /// is registered in the \c RRParamRegistry object. For example, both
+ /// "A" and "TYPE1" are valid and represent the same RR type.
+ ///
+ /// All of these representations are case insensitive; "NS" and "ns", and
+ /// "TYPE1" and "type1" are all valid and represent the same RR types,
+ /// respectively.
+ ///
+ /// If the given string is not recognized as a valid representation of
+ /// an RR type, an exception of class \c InvalidRRType will be thrown.
+ ///
+ /// \param typestr A string representation of the \c RRType
+ explicit RRType(const std::string& typestr);
+ /// Constructor from wire-format data.
+ ///
+ /// The \c buffer parameter normally stores a complete DNS message
+ /// containing the RRType to be constructed. The current read position of
+ /// the buffer points to the head of the type.
+ ///
+ /// If the given data does not large enough to contain a 16-bit integer,
+ /// an exception of class \c IncompleteRRType will be thrown.
+ ///
+ /// \param buffer A buffer storing the wire format data.
+ explicit RRType(isc::util::InputBuffer& buffer);
+ ///
+ /// We use the default copy constructor intentionally.
+ //@}
+ /// We use the default copy assignment operator intentionally.
+ ///
+
+ ///
+ /// \name Converter methods
+ ///
+ //@{
+ /// \brief Convert the \c RRType to a string.
+ ///
+ /// If a "well known" textual representation for the type code is registered
+ /// in the RR parameter registry (see the class description), that will be
+ /// used as the return value of this method. Otherwise, this method creates
+ /// a new string for an "unknown" RR type in the format defined in RFC3597,
+ /// i.e., "TYPEnnnn", and returns it.
+ ///
+ /// If resource allocation for the string fails, a corresponding standard
+ /// exception will be thrown.
+ ///
+ /// \return A string representation of the \c RRType.
+ const std::string toText() const;
+ /// \brief Render the \c RRType in the wire format.
+ ///
+ /// This method renders the type code in network byte order via \c renderer,
+ /// which encapsulates output buffer and other rendering contexts.
+ ///
+ /// If resource allocation in rendering process fails, a corresponding
+ /// standard exception will be thrown.
+ ///
+ /// \param renderer DNS message rendering context that encapsulates the
+ /// output buffer in which the RRType is to be stored.
+ void toWire(AbstractMessageRenderer& renderer) const;
+ /// \brief Render the \c RRType in the wire format.
+ ///
+ /// This method renders the type code in network byte order into the
+ /// \c buffer.
+ ///
+ /// If resource allocation in rendering process fails, a corresponding
+ /// standard exception will be thrown.
+ ///
+ /// \param buffer An output buffer to store the wire data.
+ void toWire(isc::util::OutputBuffer& buffer) const;
+ //@}
+
+ ///
+ /// \name Getter Methods
+ ///
+ //@{
+ /// \brief Returns the RR type code as a 16-bit unsigned integer.
+ ///
+ /// This method never throws an exception.
+ ///
+ /// \return An 16-bit integer code corresponding to the RRType.
+ uint16_t getCode() const { return (typecode_); }
+ //@}
+
+ ///
+ /// \name Comparison methods
+ ///
+ //@{
+ /// \brief Return true iff two RRTypes are equal.
+ ///
+ /// Two RRTypes are equal iff their type codes are equal.
+ ///
+ /// This method never throws an exception.
+ ///
+ /// \param other the \c RRType object to compare against.
+ /// \return true if the two RRTypes are equal; otherwise false.
+ bool equals(const RRType& other) const
+ { return (typecode_ == other.typecode_); }
+ /// \brief Same as \c equals().
+ bool operator==(const RRType& other) const { return (equals(other)); }
+
+ /// \brief Return true iff two RRTypes are not equal.
+ ///
+ /// This method never throws an exception.
+ ///
+ /// \param other the \c RRType object to compare against.
+ /// \return true if the two RRTypes are not equal; otherwise false.
+ bool nequals(const RRType& other) const
+ { return (typecode_ != other.typecode_); }
+ /// \brief Same as \c nequals().
+ bool operator!=(const RRType& other) const { return (nequals(other)); }
+
+ /// \brief Less-than comparison for RRType against \c other
+ ///
+ /// We define the less-than relationship based on their type codes;
+ /// one RRType is less than the other iff the code of the former is less
+ /// than that of the other as unsigned integers.
+ /// The relationship is meaningless in terms of DNS protocol; the only
+ /// reason we define this method is that RRType objects can be stored in
+ /// STL containers without requiring user-defined less-than relationship.
+ /// We therefore don't define other comparison operators.
+ ///
+ /// This method never throws an exception.
+ ///
+ /// \param other the \c RRType object to compare against.
+ /// \return true if \c this RRType is less than the \c other; otherwise
+ /// false.
+ bool operator<(const RRType& other) const
+ { return (typecode_ < other.typecode_); }
+ //@}
+
+ // BEGIN_WELL_KNOWN_TYPE_DECLARATIONS
+ static const RRType& TSIG();
+ static const RRType& A();
+ static const RRType& AFSDB();
+ static const RRType& CAA();
+ static const RRType& CNAME();
+ static const RRType& DLV();
+ static const RRType& DNAME();
+ static const RRType& DNSKEY();
+ static const RRType& DS();
+ static const RRType& HINFO();
+ static const RRType& MINFO();
+ static const RRType& MX();
+ static const RRType& NAPTR();
+ static const RRType& NS();
+ static const RRType& NSEC3();
+ static const RRType& NSEC3PARAM();
+ static const RRType& NSEC();
+ static const RRType& OPT();
+ static const RRType& PTR();
+ static const RRType& RP();
+ static const RRType& RRSIG();
+ static const RRType& SOA();
+ static const RRType& SPF();
+ static const RRType& SSHFP();
+ static const RRType& TKEY();
+ static const RRType& TLSA();
+ static const RRType& TXT();
+ static const RRType& AAAA();
+ static const RRType& DHCID();
+ static const RRType& SRV();
+ static const RRType& IXFR();
+ static const RRType& AXFR();
+ static const RRType& ANY();
+ static const RRType& MD();
+ static const RRType& MF();
+ static const RRType& MB();
+ static const RRType& MG();
+ static const RRType& MR();
+ static const RRType& NXT();
+ static const RRType& A6();
+ static const RRType& MAILA();
+ static const RRType& Null();
+ static const RRType& WKS();
+ static const RRType& X25();
+ static const RRType& RT();
+ static const RRType& NSAP();
+ static const RRType& NSAP_PTR();
+ static const RRType& SIG();
+ static const RRType& ISDN();
+ static const RRType& KEY();
+ static const RRType& PX();
+ static const RRType& GPOS();
+ static const RRType& LOC();
+ static const RRType& KX();
+ static const RRType& CERT();
+ static const RRType& APL();
+ static const RRType& IPSECKEY();
+ static const RRType& HIP();
+ static const RRType& UNSPEC();
+ static const RRType& NID();
+ static const RRType& L32();
+ static const RRType& L64();
+ static const RRType& LP();
+ static const RRType& MAILB();
+ static const RRType& URI();
+ // END_WELL_KNOWN_TYPE_DECLARATIONS
+
+private:
+ uint16_t typecode_;
+};
+
+// BEGIN_WELL_KNOWN_TYPE_DEFINITIONS
+inline const RRType&
+RRType::TSIG() {
+ static RRType rrtype(250);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::A() {
+ static RRType rrtype(1);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::AFSDB() {
+ static RRType rrtype(18);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::CAA() {
+ static RRType rrtype(257);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::CNAME() {
+ static RRType rrtype(5);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::DLV() {
+ static RRType rrtype(32769);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::DNAME() {
+ static RRType rrtype(39);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::DNSKEY() {
+ static RRType rrtype(48);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::DS() {
+ static RRType rrtype(43);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::HINFO() {
+ static RRType rrtype(13);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::MINFO() {
+ static RRType rrtype(14);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::MX() {
+ static RRType rrtype(15);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::NAPTR() {
+ static RRType rrtype(35);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::NS() {
+ static RRType rrtype(2);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::NSEC3() {
+ static RRType rrtype(50);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::NSEC3PARAM() {
+ static RRType rrtype(51);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::NSEC() {
+ static RRType rrtype(47);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::OPT() {
+ static RRType rrtype(41);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::PTR() {
+ static RRType rrtype(12);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::RP() {
+ static RRType rrtype(17);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::RRSIG() {
+ static RRType rrtype(46);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::SOA() {
+ static RRType rrtype(6);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::SPF() {
+ static RRType rrtype(99);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::SSHFP() {
+ static RRType rrtype(44);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::TKEY() {
+ static RRType rrtype(249);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::TLSA() {
+ static RRType rrtype(52);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::TXT() {
+ static RRType rrtype(16);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::AAAA() {
+ static RRType rrtype(28);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::DHCID() {
+ static RRType rrtype(49);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::SRV() {
+ static RRType rrtype(33);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::IXFR() {
+ static RRType rrtype(251);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::AXFR() {
+ static RRType rrtype(252);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::ANY() {
+ static RRType rrtype(255);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::MD() {
+ static RRType rrtype(3);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::MF() {
+ static RRType rrtype(4);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::MB() {
+ static RRType rrtype(7);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::MG() {
+ static RRType rrtype(8);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::MR() {
+ static RRType rrtype(9);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::NXT() {
+ static RRType rrtype(30);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::A6() {
+ static RRType rrtype(38);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::MAILA() {
+ static RRType rrtype(254);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::Null() {
+ static RRType rrtype(10);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::WKS() {
+ static RRType rrtype(11);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::X25() {
+ static RRType rrtype(19);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::RT() {
+ static RRType rrtype(21);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::NSAP() {
+ static RRType rrtype(22);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::NSAP_PTR() {
+ static RRType rrtype(23);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::SIG() {
+ static RRType rrtype(24);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::ISDN() {
+ static RRType rrtype(20);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::KEY() {
+ static RRType rrtype(25);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::PX() {
+ static RRType rrtype(26);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::GPOS() {
+ static RRType rrtype(27);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::LOC() {
+ static RRType rrtype(29);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::KX() {
+ static RRType rrtype(36);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::CERT() {
+ static RRType rrtype(37);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::APL() {
+ static RRType rrtype(42);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::IPSECKEY() {
+ static RRType rrtype(45);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::HIP() {
+ static RRType rrtype(55);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::UNSPEC() {
+ static RRType rrtype(103);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::NID() {
+ static RRType rrtype(104);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::L32() {
+ static RRType rrtype(105);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::L64() {
+ static RRType rrtype(106);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::LP() {
+ static RRType rrtype(107);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::MAILB() {
+ static RRType rrtype(253);
+ return (rrtype);
+}
+
+inline const RRType&
+RRType::URI() {
+ static RRType rrtype(256);
+ return (rrtype);
+}
+
+// END_WELL_KNOWN_TYPE_DEFINITIONS
+
+///
+/// \brief Insert the \c RRType as a string into stream.
+///
+/// This method convert the \c rrtype into a string and inserts it into the
+/// output stream \c os.
+///
+/// This function overloads the global operator<< to behave as described in
+/// ostream::operator<< but applied to \c RRType objects.
+///
+/// \param os A \c std::ostream object on which the insertion operation is
+/// performed.
+/// \param rrtype The \c RRType object output by the operation.
+/// \return A reference to the same \c std::ostream object referenced by
+/// parameter \c os after the insertion operation.
+std::ostream&
+operator<<(std::ostream& os, const RRType& rrtype);
+}
+}
+#endif // RRTYPE_H
+
+// Local Variables:
+// mode: c++
+// End: