#ifndef _NAMESERVER_H_
#define _NAMESERVER_H_
+#include "devque.h"
#include "ipaddr.h"
-//XXX#include "resolvproto.h"
+#include "resolvproto.h"
#include <string>
#include <vector>
#include <map>
/// Constructor
Name() {}
Name(const std::string& name);
- operator std::string ();
+ operator std::string () const;
};
/// Registro de una zona
/// Time to live
size_t ttl;
/// Dirección IP del registro
- typedef std::vector< Record > records_t;
- records_t records;
+ typedef ResolvProtoResponse::ipvec_t ipvec_t;
+ ipvec_t ips;
/// Constructor
CacheRecord(): ttl(0) {}
- CacheRecord(size_t ttl, const records_t& records):
- ttl(ttl), records(records) {}
+ CacheRecord(size_t ttl, const ipvec_t& ips):
+ ttl(ttl), ips(ips) {}
};
/// Cache de records
typedef std::map< Name, CacheRecord > cache_t;
cache_t cache;
+ /// IP
+ IPIn& ipin;
+ IPOut& ipout;
+
+ /// Colas de recepción
+ DevQue& req_que; // De requests
+ DevQue& res_que; // De responses
+
+ /// Cola de envío
+ DevQue& snd_que;
+
/// Constructor
- NameServer(std::istream& is) throw (std::runtime_error);
+ NameServer(std::istream& is, IPIn& ipin, IPOut& ipout, DevQue& req_que,
+ DevQue& res_que, DevQue& snd_que) throw (std::runtime_error);
+
+ /// Resuelve un nombre de forma directa (no recursiva)
+ ResolvProtoResponse resolv_direct(const Name& n);
+
+ /// Resuelve un nombre de forma recursiva
+ ResolvProtoResponse resolv_recursive(const Name& n);
+
+ /// Consulta a otro name server sobre un nombre
+ ResolvProtoResponse query(const Name&n, const IPAddr& ip);
+
+ /// Loop que recibe y carga los paquetes en las colas para ser procesados
+ void recv_loop();
+
+ /// Loop que envía los paquetes de la cola de envío
+ void send_loop();
+
+ /// Loop que procesa los requests
+ void req_loop();
+
+ private:
+ /// Resuelve un nombre de forma recursiva entrando a otros ns
+ ResolvProtoResponse resolv_recursive_r(const Name& n,
+ ResolvProtoResponse rpr);
- /// Resuelve un nombre de forma no recursiva
- void resolv_next(const Name& n);
};
/// Impresión (para debug)