Document

Anuncio
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
//============================================================================//
//
BGPnode.h
//
//Francisco Guerrero de Leste
//
//Cabecera para los *.cc del simulador.
//
//============================================================================//
#ifndef _bgpnode_h_
#define _bgpnode_h_
//Includes del sistema
#include <vector.h>
#include
#include
#include
#include
#include
"libr.h"
"../simul/module.h"
"../simul/packet.h"
"../simul/timer.h"
"../simul/scheduler.h"
//Declaraciones previas--------------------------------------------------------class Message;
class MessageOpen;
class MessageNotif;
class MessageUpdate;
class gestConn;
//Estructura que servirá a la clase BGPnode para almacenar cada conexión, con el
//identificador de conexión y el puntero al gestor de conexión correspondiente,
//de este modo un nodo puede acceder al gestor de conexión apropiado en función
//del identificador de conexión, por ejemplo para llamar al gestor de conexión
//en función del identificador de conexión de un determinado mensaje recibido.
struct links{
int idc;
gestConn * pgest;
};
//=============//
//Clase BGPnode//
//=============//
class BGPnode : public Module{
public:
BGPnode (int n_as, int hold_t, ip dir, bool * pb, double * pd, double rbin =
64000);
42:
virtual ~BGPnode();
43:
44:
//Métodos para iniciar o parar un nodo y para para una conexión.
45:
void start (double tinit);
46:
void stop (double tstop);
47:
virtual void startNode (double now, Packet *p = NULL);
48:
virtual void stopNode (double now = 0, Packet *p = NULL);
49:
virtual void stop_link(double tsLink, int id);
50:
virtual void crashLink(double now, Packet * p = NULL);
51:
52:
//Método para recibir mensajes y determinar su tipo.
53:
virtual void recvUp (double now, Packet * msg);
54:
55:
//Métodos que generan y envían los mensajes.
56:
virtual void sendOpen(double now, unsigned short int h_t, int conn, MessageOpen
* pp);
57:
virtual void sendNotif(double now, char err, char err_subc, void * pd, int conn,
MessageNotif * pn);
58:
virtual void sendKeep(double now, int conn, Message * pm);
59:
virtual void sendUpd(double now, data_update * upd, int conn, MessageUpdate *
pu/*,double ht*/);
60:
61:
//Métodos que analizan los mensajes en función de su tipo, estos métodos se
62:
//declaran como "friend" de la clase del mensaje concreto.
63:
virtual void analyseOpen(double now, Packet * pmsg);
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
virtual void analyseNotif(double now, Packet * pmsg);
virtual void analyseKeep(double now, Packet * pmsg);
virtual void analyseUpd(double now, Packet * pmsg);
//Método para introducir una conexión en la lista de conexiones posibles
//de un nodo.
virtual void link(int id_con);
//Indica si el nodo está parado ('0'=Activo, '1'=Parado).
bool stopped(){return stopped_;}
//Chequea Hold Time para ver si las conexiones de un nodo están activas.
virtual void check_ht(double now, Packet * p = NULL);
//Procesa las rutas tachadas de withdrawn.
virtual void withdrProcess(list <nlri> wd, int ident, double now);
//Proceso de decisión.
virtual void decisionProcess(rib p_rib, bool nueva, double now, int con_origin);
//Busca el gestor de conexión apropiado en función del id de conexión.
gestConn* findgestconn(int to_find);
//Comprueba que no haya bucles en una ruta.
bool check_loop(list <unsigned short int> check);
//Funciones de comparación.
bool compare_nlri(nlri m, nlri n);
bool compare_rib(rib m, rib n);
//Pasa Loc_RIB a fichero txt cuando ésta cambia, también Adj_RIB_In en
//ese instante.
void printLRIB(double now);
unsigned short int as;
unsigned short int hold_time;
ip ide;
header h; //ESTO PUEDE SER FUENTE DE PROBLEMAS Y, EN PPIO, NO NOS HACE FALTA
vector <rib> loc_rib;
vector <rib> adj_rib_in;
vector <links> connections;
int version_rib;
int id_to_crash;
private:
bool stopped_;
double * p_terrorTx;
bool * p_errorTx;
};
//-----------------------------------------------------------------------------//=============//
//Clase Message//
//=============//
class Message : public Packet {
public:
Message(header h, double size);
Message();
virtual ~Message();
header h_;
};
//=================//
//Clase MessageOpen//
//=================//
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
class MessageOpen : public Message{
public:
MessageOpen(BGPnode * nodo, header h, double size, unsigned short int h_time);
MessageOpen();
virtual ~MessageOpen();
BGPnode * nodo_; //sirve para poder tomar los datos del nodo que lo crea
friend void BGPnode::analyseOpen(double now, Packet * pmsg);
private:
data_open open;
};
//==================//
//Clase MessageNotif//
//==================//
class MessageNotif : public Message{
public:
MessageNotif(header h, char err, char err_subc, void * pd, double size);
MessageNotif();
virtual ~MessageNotif();
friend void BGPnode::analyseNotif(double now, Packet * pmsg);
private:
data_notification not;
};
//PARA LOS MENSAJES KEEPALIVE SÓLO SE ENVÍAN CABECERAS, POR LO QUE NO SE HACE
//NECESARIA UNA CLASE ESPECÍFICA PARA ESTE TIPO DE MENSAJES. NOS BASTA LA CLASE
//PADRE (Message).
//===================//
//Clase MessageUpdate//
//===================//
class MessageUpdate : public Message{
public:
MessageUpdate(header h, data_update * upd, double size);
MessageUpdate();
virtual ~MessageUpdate();
friend void BGPnode::analyseUpd(double now, Packet * pmsg);
private:
data_update dat_;
};
//-----------------------------------------------------------------------------//==============//
//Clase gestConn//
//==============//
class gestConn {
public:
gestConn(BGPnode * nodo, int conn);
virtual ~gestConn();
virtual void init(double now); //para entrar en el estado OPEN_SENT
virtual void initResp(double now, data_open data);
virtual void keepResp(double now);
int status() {return status_;}
virtual void notification(double now, char err, char err_subc);
virtual void notifResp(double now);
double now_old; //para comprobar que no expira el Hold Timer
friend void
friend void
friend void
con_origin);
195:
friend void
196:
BGPnode::check_ht(double now, Packet * p);
BGPnode::withdrProcess(list <nlri> wd, int ident, double now);
BGPnode::decisionProcess(rib p_rib, bool nueva, double now, int
BGPnode::crashLink(double now, Packet * p);
197:
list <nlri> entries; //NLRIs que se conocen a través de esta conexión.
198:
MessageOpen mopen;
199:
MessageNotif mnotif;
200:
Message mm;
201:
MessageUpdate mupd;
202:
203: private:
204:
BGPnode * nodo_;
205:
//identificador de conexión
int idcon_;
206:
vector <rib> adj_rib_out_;
207:
unsigned short int holdT;
208:
bool firstKeep;
209:
list <nlri> withdrawn;
210:
//Estado desocupado
enum{ IDLE = 0,
211:
OPEN_SENT = 1,
//Se pasa a este estado para enviar mensaje OPEN o al
recibirlo
212:
OPEN_CONFIRM = 2, //Aclarados los términos de conexión, entro en este estado
al enviar KEEPALIVE, e inicio el Hold Timer
213:
ESTABLISHED= 3
//Si recibo KEEPALIVE entro en este estado y ya puedo
enviar UPD, NOTIF o KEEPALV
214:
} status_;
215: };
216:
217:
218: #endif
219:
Descargar