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
68 /// Dirección IP del registro
69 typedef ResolvProtoResponse::ipvec_t ipvec_t;
72 CacheRecord(): ttl(0) {}
73 CacheRecord(size_t ttl, const ipvec_t& ips):
78 typedef std::map< Name, CacheRecord > cache_t;
85 /// Colas de recepción
86 DevQue& req_que; // De requests
87 DevQue& res_que; // De responses
93 NameServer(std::istream& is, IPIn& ipin, IPOut& ipout, DevQue& req_que,
94 DevQue& res_que, DevQue& snd_que) throw (std::runtime_error);
96 /// Resuelve un nombre de forma directa (no recursiva)
97 ResolvProtoResponse resolv_direct(const Name& n);
99 /// Resuelve un nombre de forma recursiva
100 ResolvProtoResponse resolv_recursive(const Name& n);
102 /// Consulta a otro name server sobre un nombre
103 ResolvProtoResponse query(const Name&n, const IPAddr& ip);
105 /// Loop que recibe y carga los paquetes en las colas para ser procesados
108 /// Loop que envía los paquetes de la cola de envío
111 /// Loop que procesa los requests
115 /// Resuelve un nombre de forma recursiva entrando a otros ns
116 ResolvProtoResponse resolv_recursive_r(const Name& n,
117 ResolvProtoResponse rpr);
121 /// Impresión (para debug)
122 std::ostream& operator<< (std::ostream& os, const NameServer& ns);
123 std::ostream& operator<< (std::ostream& os, const NameServer::Name& name);
124 std::ostream& operator<< (std::ostream& os, const NameServer::Record& r);
125 std::ostream& operator<< (std::ostream& os, const NameServer::Zone& z);
126 std::ostream& operator<< (std::ostream& os, const NameServer::CacheRecord& cr);
128 #endif // _NAMESERVER_H_
130 // vim: set et sw=4 sts=4 :