]> git.llucax.com Git - z.facultad/75.74/practicos.git/blobdiff - practicas/pipi/src/nameserver.h
Se implementa el Resolver.
[z.facultad/75.74/practicos.git] / practicas / pipi / src / nameserver.h
index 686fb52e410d1f81e8abfe12a8435a57863767b5..2dab7a37e9ba4501075f2b11f30ac41a3ab71b16 100644 (file)
@@ -1,8 +1,9 @@
 #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>
@@ -15,7 +16,13 @@ struct NameServer
 {
 
     /// Nombre de un dominio dividido en tokens
-    typedef std::vector< std::string > name_t;
+    struct Name: std::vector< std::string >
+    {
+        /// Constructor
+        Name() {}
+        Name(const std::string& name);
+        operator std::string () const;
+    };
 
     /// Registro de una zona
     struct Record
@@ -33,7 +40,7 @@ struct NameServer
     struct Zone
     {
         /// Nombre
-        name_t name;
+        Name name;
         /// Time to live
         size_t ttl;
         /// Nodo padre
@@ -49,21 +56,74 @@ struct NameServer
         void clear();
     };
 
-    //TODO cache de _records_ (no zonas)
-
     /// Zonas para las que este servidor de nombres es autoridad
     typedef std::vector< Zone > zones_t;
     zones_t zones;
 
+    /// Cache de un registro
+    struct CacheRecord
+    {
+        /// Time to live
+        size_t ttl;
+        /// Dirección IP del registro
+        typedef ResolvProtoResponse::ipvec_t ipvec_t;
+        ipvec_t ips;
+        /// Constructor
+        CacheRecord(): ttl(0) {}
+        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);
 
 };
 
 /// Impresión (para debug)
 std::ostream& operator<< (std::ostream& os, const NameServer& ns);
+std::ostream& operator<< (std::ostream& os, const NameServer::Name& name);
 std::ostream& operator<< (std::ostream& os, const NameServer::Record& r);
 std::ostream& operator<< (std::ostream& os, const NameServer::Zone& z);
+std::ostream& operator<< (std::ostream& os, const NameServer::CacheRecord& cr);
 
 #endif // _NAMESERVER_H_