]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/nameserver.h
Queda lo mínimo del DNS implementado. Una prueba simple en una red sin routers
[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 #define NAMESERVER_PROTO 59
15
16 /// Petición del resolver a un nameserver
17 struct NameServer
18 {
19
20     /// Nombre de un dominio dividido en tokens
21     struct Name: std::vector< std::string >
22     {
23         /// Constructor
24         Name() {}
25         Name(const std::string& name);
26         operator std::string () const;
27     };
28
29     /// Registro de una zona
30     struct Record
31     {
32         /// Tipo de registro
33         enum type_t { A, NS };
34         type_t type;
35         /// Dirección IP del registro
36         IPAddr ip;
37         /// Constructor
38         Record(type_t t, const IPAddr& i): type(t), ip(i) {}
39     };
40
41     /// Zona
42     struct Zone
43     {
44         /// Nombre
45         Name name;
46         /// Time to live
47         size_t ttl;
48         /// Nodo padre
49         IPAddr parent;
50         /// Registros
51         typedef std::multimap< std::string, Record > records_t;
52         records_t records;
53         /// Constructores
54         Zone() {}
55         Zone(std::string sname, size_t ttl, const IPAddr& parent);
56         Zone(std::istream& is) throw (std::runtime_error);
57         /// Limpia una zona
58         void clear();
59     };
60
61     /// Zonas para las que este servidor de nombres es autoridad
62     typedef std::vector< Zone > zones_t;
63     zones_t zones;
64
65     /// Cache de un registro
66     struct CacheRecord
67     {
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 ttl, const ipvec_t& ips):
76             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     private:
114     /// Resuelve un nombre de forma recursiva entrando a otros ns
115     ResolvProtoResponse resolv_recursive_r(const Name& n,
116             ResolvProtoResponse rpr);
117
118 };
119
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);
126
127 #endif // _NAMESERVER_H_
128
129 // vim: set et sw=4 sts=4 :