/* * Copyright (c) 2012 Jiri Svoboda * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @addtogroup dnsrsrv * @{ */ /** * @file DNS Standard definitions. * * From RFC 1035 Domain Names - Implementation and Specification */ #ifndef DNS_STD_H #define DNS_STD_H #include <stdint.h> /** From 2.3.4. Size Limits */ enum dns_limits { DNS_LABEL_MAX_SIZE = 63, DNS_NAME_MAX_SIZE = 255, DNS_UDP_MSG_MAX_SIZE = 512 }; typedef enum dns_qtype { DTYPE_A = 1, DTYPE_NS = 2, DTYPE_MD = 3, DTYPE_MF = 4, DTYPE_CNAME = 5, DTYPE_SOA = 6, DTYPE_MB = 7, DTYPE_MG = 8, DTYPE_MR = 9, DTYPE_NULL = 10, DTYPE_WKS = 11, DTYPE_PTR = 12, DTYPE_HINFO = 13, DTYPE_MINFO = 14, DTYPE_MX = 15, DTYPE_TXT = 16, DTYPE_AAAA = 28, DQTYPE_AXFR = 252, DQTYPE_MAILB = 253, DQTYPE_MAILA = 254, DQTYPE_ALL = 255 } dns_type_t, dns_qtype_t; typedef enum dns_qclass { /** Internet */ DC_IN = 1, /** CSNET */ DC_CS = 2, /** CHAOS */ DC_CH = 3, /** Hesiod */ DC_HS = 4, /** Any class */ DQC_ANY = 255 } dns_class_t, dns_qclass_t; typedef struct { /** Identifier assigned by the query originator */ uint16_t id; /** QR, Opcode, AA, TC,RD, RA, Z, Rcode */ uint16_t opbits; /** Number of entries in query section */ uint16_t qd_count; /** Number of RRs in the answer section */ uint16_t an_count; /** Number of name server RRs in the authority records section */ uint16_t ns_count; /** Number of RRs in the additional records section */ uint16_t ar_count; } dns_header_t; /** Bits in dns_header_t.opbits. * * Note that bit numbers in RFC 1035 are reversed (0 is the most significant) * but we use the standard notation (0 is the least significant). */ enum dns_opbits { OPB_QR = 15, OPB_OPCODE_h = 14, OPB_OPCODE_l = 11, OPB_AA = 10, OPB_TC = 9, OPB_RD = 8, OPB_RA = 7, OPB_Z_h = 6, OPB_Z_l = 4, OPB_RCODE_h = 3, OPB_RCODE_l = 0 }; typedef enum dns_query_response { QR_QUERY = 0, QR_RESPONSE = 1 } dns_query_response_t; typedef enum dns_opcode { OPC_QUERY = 0, OPC_IQUERY = 1, OPC_STATUS = 2 } dns_opcode_t; typedef enum dns_rcode { RC_OK = 0, RC_FMT_ERR = 1, RC_SRV_FAIL = 2, RC_NAME_ERR = 3, RC_NOT_IMPL = 4, RC_REFUSED = 5 } dns_rcode_t; #endif /** @} */