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: