]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/nameserver.h
Se verifica si expiró el cache y se lo elimina si así fuere.
[z.facultad/75.74/practicos.git] / practicas / pipi / src / nameserver.h
1 #ifndef _NAMESERVER_H_
2 #define _NAMESERVER_H_
3
4 #include "devque.h"
5 #include "ipaddr.h"
6 #include "resolvproto.h"
7 #include <string>
8 #include <vector>
9 #include <map>
10 #include <istream>
11 #include <ostream>
12 #include <stdexcept>
13
14 /// Petición del resolver a un nameserver
15 struct NameServer
16 {
17
18     /// Nombre de un dominio dividido en tokens
19     struct Name: std::vector< std::string >
20     {
21         /// Constructor
22         Name() {}
23         Name(const std::string& name);
24         operator std::string () const;
25     };
26
27     /// Registro de una zona
28     struct Record
29     {
30         /// Tipo de registro
31         enum type_t { A, NS };
32         type_t type;
33         /// Dirección IP del registro
34         IPAddr ip;
35         /// Constructor
36         Record(type_t t, const IPAddr& i): type(t), ip(i) {}
37     };
38
39     /// Zona
40     struct Zone
41     {
42         /// Nombre
43         Name name;
44         /// Time to live
45         size_t ttl;
46         /// Nodo padre
47         IPAddr parent;
48         /// Registros
49         typedef std::multimap< std::string, Record > records_t;
50         records_t records;
51         /// Constructores
52         Zone() {}
53         Zone(std::string sname, size_t ttl, const IPAddr& parent);
54         Zone(std::istream& is) throw (std::runtime_error);
55         /// Limpia una zona
56         void clear();
57     };
58
59     /// Zonas para las que este servidor de nombres es autoridad
60     typedef std::vector< Zone > zones_t;
61     zones_t zones;
62
63     /// Cache de un registro
64     struct CacheRecord
65     {
66         /// Tiempo de expiración (segundos desde el epoch)
67         size_t expire;
68         /// Time to live
69         size_t ttl;
70         /// Dirección IP del registro
71         typedef ResolvProtoResponse::ipvec_t ipvec_t;
72         ipvec_t ips;
73         /// Constructor
74         CacheRecord(): ttl(0) {}
75         CacheRecord(size_t expire, size_t ttl, const ipvec_t& ips):
76             expire(expire), ttl(ttl), ips(ips) {}
77     };
78
79     /// Cache de records
80     typedef std::map< Name, CacheRecord > cache_t;
81     cache_t cache;
82
83     /// IP
84     IPIn& ipin;
85     IPOut& ipout;
86
87     /// Colas de recepción
88     DevQue& req_que; // De requests
89     DevQue& res_que; // De responses
90
91     /// Cola de envío
92     DevQue& snd_que;
93
94     /// Constructor
95     NameServer(std::istream& is, IPIn& ipin, IPOut& ipout, DevQue& req_que,
96             DevQue& res_que, DevQue& snd_que) throw (std::runtime_error);
97
98     /// Resuelve un nombre de forma directa (no recursiva)
99     ResolvProtoResponse resolv_direct(const Name& n);
100
101     /// Resuelve un nombre de forma recursiva
102     ResolvProtoResponse resolv_recursive(const Name& n);
103
104     /// Consulta a otro name server sobre un nombre
105     ResolvProtoResponse query(const Name&n, const IPAddr& ip);
106
107     /// Loop que recibe y carga los paquetes en las colas para ser procesados
108     void recv_loop();
109
110     /// Loop que envía los paquetes de la cola de envío
111     void send_loop();
112
113     /// Loop que procesa los requests
114     void req_loop();
115
116     private:
117     /// Resuelve un nombre de forma recursiva entrando a otros ns
118     ResolvProtoResponse resolv_recursive_r(const Name& n,
119             ResolvProtoResponse rpr);
120
121 };
122
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);
129
130 #endif // _NAMESERVER_H_
131
132 // vim: set et sw=4 sts=4 :