#define _RESOLVPROTO_H_
#include "ipaddr.h"
+#include "ipin.h"
+#include "ipout.h"
#include <string>
#include <vector>
#include <stdexcept>
#include <stdint.h>
-/// Petición del resolver a un nameserver
-struct ResolvProtoRequest
+/// Número de protocolo del resolver
+#define RESOLV_PROTO 59
+
+/// Tipo de petición
+enum rp_pkt_type_t
{
+ // requests
+ RP_REQ_DIRECT, ///> Búsqueda directa (inter nameservers)
+ RP_REQ_RECURSIVE, ///> Búsqueda recursiva (para resolvers)
+ // responses
+ RP_RES_A, ///> OK, se devolvió un registro A
+ RP_RES_NS, ///> OK, se devolvió un registro NS (sólo en directo)
+ RP_RES_NOTFOUND, ///> No se encontró
+ RP_RES_TIMEOUT ///> Tardó demasiado la consulta
+};
- /// Tipo de petición, por ahora sólo QUERY
- enum { TYPE_QUERY };
+/// Petición de un nameserver
+/// +------------+------------+------------+
+/// | QUERY_TYPE | SIZE | NAME |
+/// +------------+------------+------------+
+/// /-- 1 byte --/- 2 bytes --/- variable -/
+struct ResolvProtoRequest
+{
- /// Tipo de petición, por ahora sólo QUERY
- uint8_t type;
+ /// Tipo de petición (de tipo rp_pkt_type_t)
+ uint8_t query_type;
/// Nombre a buscar
std::string name;
- /// Constructor
- ResolvProtoRequest(int fd);
-
- /// Constructor
- ResolvProtoRequest(std::string name, uint8_t type = TYPE_QUERY);
+ /// Constructores
+ ResolvProtoRequest(std::string name, rp_pkt_type_t query_type);
+ ResolvProtoRequest(std::string buf);
/// Envía por socket
- void send(int sockfd) const throw (std::runtime_error);
+ void send(IPOut& ipo) const throw (std::runtime_error);
/// Recibe por socket
- void recv(int sockfd) throw (std::runtime_error);
+ void recv(IPIn& ipi) throw (std::runtime_error);
+
+ /// Obtiene tamaño del paquete
+ size_t packet_size() const;
+
+ /// Convierte a un string
+ operator std::string () const;
};
std::ostream& operator<< (std::ostream& os, const ResolvProtoRequest& rpr);
-/// Respuesta del resolver a un nameserver
+/// Respuesta de un nameserver
+/// +-----------+-----------+-----------+-----------+-----------+-----------+
+/// | RET | TTL | COUNT | IP 1 | ... | IP N |
+/// +-----------+-----------+-----------+-----------+-----------+-----------+
+/// /-- 1 byte -/- 4 bytes -/-- 1 byte -/- 4 bytes -/- 4 bytes -/- 4 bytes -/
struct ResolvProtoResponse
{
- /// Resultado de la respuesta
- enum ret_t { RET_OK, RET_NOTFOUND, RET_TIMEOUT };
-
- /// Resultado de la respuesta
+ /// Resultado de la respuesta (de tipo rp_pkt_type_t)
uint8_t ret;
+ /// TTL (sólo útil para búsquedas (inter nameserver)
+ uint32_t ttl;
+
/// IPs devueltas
typedef std::vector< IPAddr > ipvec_t;
ipvec_t ips;
- /// Constructor
- ResolvProtoResponse(int fd);
-
- /// Constructor
- ResolvProtoResponse(ret_t ret);
+ /// Constructores
+ ResolvProtoResponse();
+ ResolvProtoResponse(rp_pkt_type_t ret, uint32_t ttl = 0,
+ const ipvec_t& ips = ipvec_t());
+ ResolvProtoResponse(std::string buf);
/// Envía por socket
- void send(int sockfd) const throw (std::runtime_error);
+ void send(IPOut& ipo) const throw (std::runtime_error);
/// Recibe por socket
- void recv(int sockfd) throw (std::runtime_error);
+ void recv(IPIn& ipi) throw (std::runtime_error);
+
+ /// Obtiene tamaño del paquete
+ size_t packet_size() const;
+
+ /// Convierte a un string
+ operator std::string () const;
};