]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/nameserver.h
Bugfix al mostrar request/response para debug en send_loop().
[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         /// Time to live
67         size_t ttl;
68         /// Dirección IP del registro
69         typedef ResolvProtoResponse::ipvec_t ipvec_t;
70         ipvec_t ips;
71         /// Constructor
72         CacheRecord(): ttl(0) {}
73         CacheRecord(size_t ttl, const ipvec_t& ips):
74             ttl(ttl), ips(ips) {}
75     };
76
77     /// Cache de records
78     typedef std::map< Name, CacheRecord > cache_t;
79     cache_t cache;
80
81     /// IP
82     IPIn& ipin;
83     IPOut& ipout;
84
85     /// Colas de recepción
86     DevQue& req_que; // De requests
87     DevQue& res_que; // De responses
88
89     /// Cola de envío
90     DevQue& snd_que;
91
92     /// Constructor
93     NameServer(std::istream& is, IPIn& ipin, IPOut& ipout, DevQue& req_que,
94             DevQue& res_que, DevQue& snd_que) throw (std::runtime_error);
95
96     /// Resuelve un nombre de forma directa (no recursiva)
97     ResolvProtoResponse resolv_direct(const Name& n);
98
99     /// Resuelve un nombre de forma recursiva
100     ResolvProtoResponse resolv_recursive(const Name& n);
101
102     /// Consulta a otro name server sobre un nombre
103     ResolvProtoResponse query(const Name&n, const IPAddr& ip);
104
105     /// Loop que recibe y carga los paquetes en las colas para ser procesados
106     void recv_loop();
107
108     /// Loop que envía los paquetes de la cola de envío
109     void send_loop();
110
111     /// Loop que procesa los requests
112     void req_loop();
113
114     private:
115     /// Resuelve un nombre de forma recursiva entrando a otros ns
116     ResolvProtoResponse resolv_recursive_r(const Name& n,
117             ResolvProtoResponse rpr);
118
119 };
120
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);
127
128 #endif // _NAMESERVER_H_
129
130 // vim: set et sw=4 sts=4 :