6 #include "resolvproto.h"
14 /// Petición del resolver a un nameserver
18 /// Nombre de un dominio dividido en tokens
19 struct Name: std::vector< std::string >
23 Name(const std::string& name);
24 operator std::string () const;
27 /// Registro de una zona
31 enum type_t { A, NS };
33 /// Dirección IP del registro
36 Record(type_t t, const IPAddr& i): type(t), ip(i) {}
49 typedef std::multimap< std::string, Record > records_t;
53 Zone(std::string sname, size_t ttl, const IPAddr& parent);
54 Zone(std::istream& is) throw (std::runtime_error);
59 /// Zonas para las que este servidor de nombres es autoridad
60 typedef std::vector< Zone > zones_t;
63 /// Cache de un registro
66 /// Tiempo de expiración (segundos desde el epoch)
70 /// Dirección IP del registro
71 typedef ResolvProtoResponse::ipvec_t ipvec_t;
74 CacheRecord(): ttl(0) {}
75 CacheRecord(size_t expire, size_t ttl, const ipvec_t& ips):
76 expire(expire), ttl(ttl), ips(ips) {}
80 typedef std::map< Name, CacheRecord > cache_t;
87 /// Colas de recepción
88 DevQue& req_que; // De requests
89 DevQue& res_que; // De responses
95 NameServer(std::istream& is, IPIn& ipin, IPOut& ipout, DevQue& req_que,
96 DevQue& res_que, DevQue& snd_que) throw (std::runtime_error);
98 /// Resuelve un nombre de forma directa (no recursiva)
99 ResolvProtoResponse resolv_direct(const Name& n);
101 /// Resuelve un nombre de forma recursiva
102 ResolvProtoResponse resolv_recursive(const Name& n);
104 /// Consulta a otro name server sobre un nombre
105 ResolvProtoResponse query(const Name&n, const IPAddr& ip);
107 /// Loop que recibe y carga los paquetes en las colas para ser procesados
110 /// Loop que envía los paquetes de la cola de envío
113 /// Loop que procesa los requests
117 /// Resuelve un nombre de forma recursiva entrando a otros ns
118 ResolvProtoResponse resolv_recursive_r(const Name& n,
119 ResolvProtoResponse rpr);
123 /// Impresión (para debug)
124 std::ostream& operator<< (std::ostream& os, const NameServer& ns);
125 std::ostream& operator<< (std::ostream& os, const NameServer::Name& name);
126 std::ostream& operator<< (std::ostream& os, const NameServer::Record& r);
127 std::ostream& operator<< (std::ostream& os, const NameServer::Zone& z);
128 std::ostream& operator<< (std::ostream& os, const NameServer::CacheRecord& cr);
130 #endif // _NAMESERVER_H_
132 // vim: set et sw=4 sts=4 :