6 #include "resolvproto.h"
14 #define NAMESERVER_PROTO 59
16 /// Petición del resolver a un nameserver
20 /// Nombre de un dominio dividido en tokens
21 struct Name: std::vector< std::string >
25 Name(const std::string& name);
26 operator std::string () const;
29 /// Registro de una zona
33 enum type_t { A, NS };
35 /// Dirección IP del registro
38 Record(type_t t, const IPAddr& i): type(t), ip(i) {}
51 typedef std::multimap< std::string, Record > records_t;
55 Zone(std::string sname, size_t ttl, const IPAddr& parent);
56 Zone(std::istream& is) throw (std::runtime_error);
61 /// Zonas para las que este servidor de nombres es autoridad
62 typedef std::vector< Zone > zones_t;
65 /// Cache de un registro
70 /// Dirección IP del registro
71 typedef ResolvProtoResponse::ipvec_t ipvec_t;
74 CacheRecord(): ttl(0) {}
75 CacheRecord(size_t ttl, const ipvec_t& 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
114 /// Resuelve un nombre de forma recursiva entrando a otros ns
115 ResolvProtoResponse resolv_recursive_r(const Name& n,
116 ResolvProtoResponse rpr);
120 /// Impresión (para debug)
121 std::ostream& operator<< (std::ostream& os, const NameServer& ns);
122 std::ostream& operator<< (std::ostream& os, const NameServer::Name& name);
123 std::ostream& operator<< (std::ostream& os, const NameServer::Record& r);
124 std::ostream& operator<< (std::ostream& os, const NameServer::Zone& z);
125 std::ostream& operator<< (std::ostream& os, const NameServer::CacheRecord& cr);
127 #endif // _NAMESERVER_H_
129 // vim: set et sw=4 sts=4 :