/* http://www.iana.org/assignments/dns-parameters */

namespace Zeroconf.DNS
{
    #region TYPE values
    /*
     * 3.2.2. TYPE values
     *
     * TYPE fields are used in resource records.
     * Note that these types are a subset of QTYPEs.
     *
     *        TYPE        value            meaning
     */
    #endregion

    internal enum Type : ushort
    {
        A = 1,              // a IPV4 host address
        NS = 2,             // an authoritative name server
        MD = 3,             // a mail destination (Obsolete - use MX)
        MF = 4,             // a mail forwarder (Obsolete - use MX)
        CNAME = 5,          // the canonical name for an alias
        SOA = 6,            // marks the start of a zone of authority
        MB = 7,             // a mailbox domain name (EXPERIMENTAL)
        MG = 8,             // a mail group member (EXPERIMENTAL)
        MR = 9,             // a mail rename domain name (EXPERIMENTAL)
        NULL = 10,          // a null RR (EXPERIMENTAL)
        WKS = 11,           // a well known service description
        PTR = 12,           // a domain name pointer
        HINFO = 13,         // host information
        MINFO = 14,         // mailbox or mail list information
        MX = 15,            // mail exchange
        TXT = 16,           // text strings

        RP = 17,            // The Responsible Person rfc1183
        AFSDB = 18,         // AFS Data Base location
        X25 = 19,           // X.25 address rfc1183
        ISDN = 20,          // ISDN address rfc1183 
        RT = 21,            // The Route Through rfc1183

        NSAP = 22,          // Network service access point address rfc1706
        NSAPPTR = 23,       // Obsolete, rfc1348

        SIG = 24,           // Cryptographic public key signature rfc2931 / rfc2535
        KEY = 25,           // Public key as used in DNSSEC rfc2535

        PX = 26,            // Pointer to X.400/RFC822 mail mapping information rfc2163

        GPOS = 27,          // Geographical position rfc1712 (obsolete)

        AAAA = 28,          // a IPV6 host address, rfc3596

        LOC = 29,           // Location information rfc1876

        NXT = 30,           // Next Domain, Obsolete rfc2065 / rfc2535

        EID = 31,           // *** Endpoint Identifier (Patton)
        NIMLOC = 32,        // *** Nimrod Locator (Patton)

        SRV = 33,           // Location of services rfc2782

        ATMA = 34,          // *** ATM Address (Dobrowski)

        NAPTR = 35,         // The Naming Authority Pointer rfc3403

        KX = 36,            // Key Exchange Delegation Record rfc2230

        CERT = 37,          // *** CERT RFC2538

        A6 = 38,            // IPv6 address rfc3363 (rfc2874 rfc3226)
        DNAME = 39,         // A way to provide aliases for a whole domain, not just a single domain name as with CNAME. rfc2672

        SINK = 40,          // *** SINK Eastlake
        OPT = 41,           // *** OPT RFC2671

        APL = 42,           // *** APL [RFC3123]

        DS = 43,            // Delegation Signer rfc3658

        SSHFP = 44,         // SSH Key Fingerprint rfc4255
        IPSECKEY = 45,      // IPSECKEY rfc4025
        RRSIG = 46,         // RRSIG rfc3755
        NSEC = 47,          // NSEC rfc3755
        DNSKEY = 48,        // DNSKEY 3755
        DHCID = 49,         // DHCID rfc4701

        NSEC3 = 50,         // NSEC3 rfc5155
        NSEC3PARAM = 51,    // NSEC3PARAM rfc5155

        HIP = 55,           // Host Identity Protocol  [RFC-ietf-hip-dns-09.txt]

        SPF = 99,           // SPF rfc4408

        UINFO = 100,        // *** IANA-Reserved
        UID = 101,          // *** IANA-Reserved
        GID = 102,          // *** IANA-Reserved
        UNSPEC = 103,       // *** IANA-Reserved

        TKEY = 249,         // Transaction key rfc2930
        TSIG = 250,         // Transaction signature rfc2845

        TA = 32768,         // DNSSEC Trust Authorities          [Weiler]  13 December 2005
        DLV = 32769         // DNSSEC Lookaside Validation       [RFC4431]
    }

    #region QTYPE values
    /*
     * 3.2.3. QTYPE values
     *
     * QTYPE fields appear in the question part of a query.  QTYPES are a
     * superset of TYPEs, hence all TYPEs are valid QTYPEs.  In addition, the
     * following QTYPEs are defined:
     *
     *        QTYPE        value            meaning
     */
    #endregion

    internal enum QType : ushort
    {
        A = Type.A,         // a IPV4 host address
        NS = Type.NS,       // an authoritative name server
        MD = Type.MD,       // a mail destination (Obsolete - use MX)
        MF = Type.MF,       // a mail forwarder (Obsolete - use MX)
        CNAME = Type.CNAME, // the canonical name for an alias
        SOA = Type.SOA,     // marks the start of a zone of authority
        MB = Type.MB,       // a mailbox domain name (EXPERIMENTAL)
        MG = Type.MG,       // a mail group member (EXPERIMENTAL)
        MR = Type.MR,       // a mail rename domain name (EXPERIMENTAL)
        NULL = Type.NULL,   // a null RR (EXPERIMENTAL)
        WKS = Type.WKS,     // a well known service description
        PTR = Type.PTR,     // a domain name pointer
        HINFO = Type.HINFO, // host information
        MINFO = Type.MINFO, // mailbox or mail list information
        MX = Type.MX,       // mail exchange
        TXT = Type.TXT,     // text strings

        RP = Type.RP,       // The Responsible Person rfc1183
        AFSDB = Type.AFSDB, // AFS Data Base location
        X25 = Type.X25,     // X.25 address rfc1183
        ISDN = Type.ISDN,   // ISDN address rfc1183
        RT = Type.RT,       // The Route Through rfc1183

        NSAP = Type.NSAP,   // Network service access point address rfc1706
        NSAP_PTR = Type.NSAPPTR, // Obsolete, rfc1348

        SIG = Type.SIG,     // Cryptographic public key signature rfc2931 / rfc2535
        KEY = Type.KEY,     // Public key as used in DNSSEC rfc2535

        PX = Type.PX,       // Pointer to X.400/RFC822 mail mapping information rfc2163

        GPOS = Type.GPOS,   // Geographical position rfc1712 (obsolete)

        AAAA = Type.AAAA,   // a IPV6 host address

        LOC = Type.LOC,     // Location information rfc1876

        NXT = Type.NXT,     // Obsolete rfc2065 / rfc2535

        EID = Type.EID,     // *** Endpoint Identifier (Patton)
        NIMLOC = Type.NIMLOC,// *** Nimrod Locator (Patton)

        SRV = Type.SRV,     // Location of services rfc2782

        ATMA = Type.ATMA,   // *** ATM Address (Dobrowski)

        NAPTR = Type.NAPTR, // The Naming Authority Pointer rfc3403

        KX = Type.KX,       // Key Exchange Delegation Record rfc2230

        CERT = Type.CERT,   // *** CERT RFC2538

        A6 = Type.A6,       // IPv6 address rfc3363
        DNAME = Type.DNAME, // A way to provide aliases for a whole domain, not just a single domain name as with CNAME. rfc2672

        SINK = Type.SINK,   // *** SINK Eastlake
        OPT = Type.OPT,     // *** OPT RFC2671

        APL = Type.APL,     // *** APL [RFC3123]

        DS = Type.DS,       // Delegation Signer rfc3658

        SSHFP = Type.SSHFP, // *** SSH Key Fingerprint RFC-ietf-secsh-dns
        IPSECKEY = Type.IPSECKEY, // rfc4025
        RRSIG = Type.RRSIG, // *** RRSIG RFC-ietf-dnsext-dnssec-2535
        NSEC = Type.NSEC,   // *** NSEC RFC-ietf-dnsext-dnssec-2535
        DNSKEY = Type.DNSKEY,// *** DNSKEY RFC-ietf-dnsext-dnssec-2535
        DHCID = Type.DHCID, // rfc4701

        NSEC3 = Type.NSEC3, // RFC5155
        NSEC3PARAM = Type.NSEC3PARAM, // RFC5155

        HIP = Type.HIP,     // RFC-ietf-hip-dns-09.txt

        SPF = Type.SPF,     // RFC4408
        UINFO = Type.UINFO, // *** IANA-Reserved
        UID = Type.UID,     // *** IANA-Reserved
        GID = Type.GID,     // *** IANA-Reserved
        UNSPEC = Type.UNSPEC,// *** IANA-Reserved

        TKEY = Type.TKEY,   // Transaction key rfc2930
        TSIG = Type.TSIG,   // Transaction signature rfc2845

        IXFR = 251,         // incremental transfer                  [RFC1995]
        AXFR = 252,         // transfer of an entire zone            [RFC1035]
        MAILB = 253,        // mailbox-related RRs (MB, MG or MR)    [RFC1035]
        MAILA = 254,        // mail agent RRs (Obsolete - see MX)    [RFC1035]
        ANY = 255,          // A request for all records             [RFC1035]

        TA = Type.TA,       // DNSSEC Trust Authorities    [Weiler]  13 December 2005
        DLV = Type.DLV      // DNSSEC Lookaside Validation [RFC4431]
    }

    #region CLASS values
    /*
     * 3.2.4. CLASS values
     *
     * CLASS fields appear in resource records.  The following CLASS mnemonics
     *and values are defined:
     *
     *        CLASS        value            meaning
     */
    #endregion

    internal enum Class : ushort
    {
        IN = 1,             // the Internet
        CS = 2,             // the CSNET class (Obsolete - used only for examples in some obsolete RFCs)
        CH = 3,             // the CHAOS class
        HS = 4              // Hesiod [Dyer 87]
    }

    #region QCLASS values
    /*
     * 3.2.5. QCLASS values
     *
     * QCLASS fields appear in the question section of a query.  QCLASS values
     * are a superset of CLASS values; every CLASS is a valid QCLASS.  In
     * addition to CLASS values, the following QCLASSes are defined:
     *
     *        QCLASS        value            meaning
     */
    #endregion

    internal enum QClass : ushort
    {
        IN = Class.IN,      // the Internet
        CS = Class.CS,      // the CSNET class (Obsolete - used only for examples in some obsolete RFCs)
        CH = Class.CH,      // the CHAOS class
        HS = Class.HS,      // Hesiod [Dyer 87]

        ANY = 255           // any class
    }

    #region RCODE
    /*
RCODE           Response code - this 4 bit field is set as part of
                responses.  The values have the following
                interpretation:
     */
    #endregion

    internal enum RCode
    {
        NoError = 0,        // No Error                           [RFC1035]
        FormErr = 1,        // Format Error                       [RFC1035]
        ServFail = 2,       // Server Failure                     [RFC1035]
        NXDomain = 3,       // Non-Existent Domain                [RFC1035]
        NotImp = 4,         // Not Implemented                    [RFC1035]
        Refused = 5,        // Query Refused                      [RFC1035]
        YXDomain = 6,       // Name Exists when it should not     [RFC2136]
        YXRRSet = 7,        // RR Set Exists when it should not   [RFC2136]
        NXRRSet = 8,        // RR Set that should exist does not  [RFC2136]
        NotAuth = 9,        // Server Not Authoritative for zone  [RFC2136]
        NotZone = 10,       // Name not contained in zone         [RFC2136]

        RESERVED11 = 11,    // Reserved
        RESERVED12 = 12,    // Reserved
        RESERVED13 = 13,    // Reserved
        RESERVED14 = 14,    // Reserved
        RESERVED15 = 15,    // Reserved

        BADVERSSIG = 16,    // Bad OPT Version                    [RFC2671]
                            // TSIG Signature Failure             [RFC2845]
        BADKEY = 17,        // Key not recognized                 [RFC2845]
        BADTIME = 18,       // Signature out of time window       [RFC2845]
        BADMODE = 19,       // Bad TKEY Mode                      [RFC2930]
        BADNAME = 20,       // Duplicate key name                 [RFC2930]
        BADALG = 21,        // Algorithm not supported            [RFC2930]
        BADTRUNC = 22       // Bad Truncation                     [RFC4635]
        /*
            23-3840              available for assignment
                0x0016-0x0F00
            3841-4095            Private Use
                0x0F01-0x0FFF
            4096-65535           available for assignment
                0x1000-0xFFFF
        */

    }

    #region OPCODE
    /*
OPCODE          A four bit field that specifies kind of query in this
                message.  This value is set by the originator of a query
                and copied into the response.  The values are:

                0               a standard query (QUERY)

                1               an inverse query (IQUERY)

                2               a server status request (STATUS)

                3-15            reserved for future use
     */
    #endregion

    internal enum OPCode
    {
        Query = 0,              // a standard query (QUERY)
        IQUERY = 1,             // OpCode Retired (previously IQUERY - No further [RFC3425]
                                // assignment of this code available)
        Status = 2,             // a server status request (STATUS) RFC1035
        RESERVED3 = 3,          // IANA

        Notify = 4,             // RFC1996
        Update = 5,             // RFC2136

        RESERVED6 = 6,
        RESERVED7 = 7,
        RESERVED8 = 8,
        RESERVED9 = 9,
        RESERVED10 = 10,
        RESERVED11 = 11,
        RESERVED12 = 12,
        RESERVED13 = 13,
        RESERVED14 = 14,
        RESERVED15 = 15,
    }

    internal enum TransportType
    {
        Udp,
        Tcp
    }
}
