167 lines
6.1 KiB
C
167 lines
6.1 KiB
C
/*
|
|
* Copyright (C) 2009 Mamadou Diop.
|
|
*
|
|
* Contact: Mamadou Diop <diopmamadou@yahoo.fr>
|
|
*
|
|
* This file is part of Open Source Doubango Framework.
|
|
*
|
|
* DOUBANGO is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* DOUBANGO is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with DOUBANGO.
|
|
*
|
|
*/
|
|
/**@file tnet_dns_rr.h
|
|
* @brief DNS Resource Record (RFCS 1034 and 1035).
|
|
*
|
|
* @author Mamadou Diop <diopmamadou(at)yahoo.fr>
|
|
*
|
|
* @date Created: Sat Nov 8 16:54:58 2009 mdiop
|
|
*/
|
|
|
|
#ifndef TNET_DNS_RR_H
|
|
#define TNET_DNS_RR_H
|
|
|
|
#include "tinyNET_config.h"
|
|
|
|
#include "tsk_list.h"
|
|
#include "tsk_buffer.h"
|
|
|
|
TNET_BEGIN_DECLS
|
|
|
|
#define TNET_DNS_RR_CREATE() tsk_object_new(tnet_dns_rr_def_t)
|
|
|
|
#define TNET_DNS_RR(self) ((tnet_dns_rr_t*)(self))
|
|
|
|
/**
|
|
* RFC 1035 - 3.2.2. TYPE values
|
|
* @sa http://en.wikipedia.org/wiki/List_of_DNS_record_types
|
|
*/
|
|
typedef enum tnet_dns_qtype_e
|
|
{
|
|
qtype_a = 1, /**< A 1 a host address */
|
|
qtype_ns = 2, /**< NS 2 an authoritative name server */
|
|
qtype_md = 3, /**< MD 3 a mail destination (Obsolete - use MX) */
|
|
qtype_mf = 4, /**< MF 4 a mail forwarder (Obsolete - use MX) */
|
|
qtype_cname = 5, /**< CNAME 5 the canonical name for an alias */
|
|
qtype_soa = 6, /**< SOA 6 marks the start of a zone of authority */
|
|
qtype_mb = 7, /**< MB 7 a mailbox domain name (EXPERIMENTAL) */
|
|
qtype_mg = 8, /**< MG 8 a mail group member (EXPERIMENTAL) */
|
|
qtype_mr = 9, /**< MR 9 a mail rename domain name (EXPERIMENTAL) */
|
|
qtype_null = 10, /**< NULL 10 a null RR (EXPERIMENTAL) */
|
|
qtype_wks = 11, /**< WKS 11 a well known service description */
|
|
qtype_ptr = 12, /**< PTR 12 a domain name pointer */
|
|
qtype_hinfo = 13, /**< HINFO 13 host information */
|
|
qtype_minfo = 14, /**< MINFO 14 mailbox or mail list information */
|
|
qtype_mx = 15, /**< MX 15 mail exchange */
|
|
qtype_txt = 16, /**< TXT 16 text strings */
|
|
|
|
qtype_aaa = 28, /**< AAAA 28 IPv6 host address */
|
|
|
|
qtype_srv = 33, /**< SRV 33 Service locator */
|
|
|
|
qtype_naptr = 35, /**< NAPTR 35 Naming Authority Pointer */
|
|
|
|
qtype_opt = 41, /**< OPT 41 Option */
|
|
|
|
qtype_ipseckey = 45,/**< IPSECKEY 45 IPSEC Key */
|
|
|
|
qtype_spf = 99, /**< SPF 99 SPF record */
|
|
|
|
qtype_any = 255 /**< * 255 A request for all records (3.2.3. QTYPE values)*/
|
|
}
|
|
tnet_dns_qtype_t;
|
|
|
|
/**
|
|
* RFC 1035 - 3.2.4. CLASS values
|
|
*/
|
|
typedef enum tnet_dns_qclass_e
|
|
{
|
|
qclass_in = 1, /**< IN 1 the Internet */
|
|
qclass_ics = 2, /**< CS 2 the CSNET class (Obsolete - used only for examples in some obsolete RFCs) */
|
|
qclass_ch = 3, /**< CH 3 the CHAOS class */
|
|
qclass_hs = 4, /**< HS 4 Hesiod [Dyer 87] */
|
|
|
|
qclass_any = 255 /**< * 255 any class (3.2.5. QCLASS values) */
|
|
}
|
|
tnet_dns_qclass_t;
|
|
|
|
/**
|
|
* RFC 1034 (3.6. Resource Records) and 1035 (3.2.1. Format)
|
|
*/
|
|
typedef struct tnet_dns_rr_s
|
|
{
|
|
TSK_DECLARE_OBJECT;
|
|
|
|
/* RFC 1035 - 3.2.1. Format
|
|
1 1 1 1 1 1
|
|
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
|
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
|
| |
|
|
/ /
|
|
/ NAME /
|
|
| |
|
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
|
| TYPE |
|
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
|
| CLASS |
|
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
|
| TTL |
|
|
| |
|
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
|
| RDLENGTH |
|
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
|
|
/ RDATA /
|
|
/ /
|
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
|
*/
|
|
|
|
unsigned initialized:1;
|
|
|
|
/** An owner name, i.e., the name of the node to which this resource record pertains. */
|
|
char* name;
|
|
|
|
/** Two octets containing one of the RR TYPE codes. */
|
|
tnet_dns_qtype_t qtype;
|
|
|
|
/** Two octets containing one of the RR CLASS codes. */
|
|
tnet_dns_qclass_t qclass;
|
|
|
|
/** A 32 bit signed integer that specifies the time interval that the resource record may be cached before the source
|
|
of the information should again be consulted.
|
|
Zero values are interpreted to mean that the RR can only be used for the transaction in progress, and should not be cached.
|
|
For example, SOA records are always distributed with a zero TTL to prohibit caching. Zero values can also be used for extremely volatile data. */
|
|
int32_t ttl;
|
|
|
|
/** An unsigned 16 bit integer that specifies the length in octets of the RDATA field. */
|
|
uint16_t rdlength;
|
|
|
|
/** A variable length string of octets that describes the resource.
|
|
The format of this information varies according to the TYPE and CLASS of the resource record.*/
|
|
void *rpdata;
|
|
}
|
|
tnet_dns_rr_t;
|
|
|
|
#define TNET_DECLARE_DNS_RR tnet_dns_rr_t dns_rr
|
|
|
|
typedef tsk_list_t tnet_dns_rrs_L_t;
|
|
|
|
int tnet_dns_rr_init(tnet_dns_rr_t *rr, tnet_dns_qtype_t qtype, tnet_dns_qclass_t qclass);
|
|
int tnet_dns_rr_deinit(tnet_dns_rr_t *rr);
|
|
|
|
tnet_dns_rr_t* tnet_dns_rr_deserialize(const void* data, size_t size);
|
|
int tnet_dns_rr_serialize(const tnet_dns_rr_t* rr, tsk_buffer_t *output);
|
|
|
|
TINYNET_GEXTERN const void *tnet_dns_rr_def_t;
|
|
|
|
TNET_END_DECLS
|
|
|
|
#endif /* TNET_DNS_RR_H */ |