00001 00002 // PROYECTO FIN DE CARRERA // 00003 // TITULO: Disenyo de nuevas arquitecturas y algoritmos de gestión de recursos en // 00004 // redes de acceso FiWi // 00005 // AUTOR: Ana Emma Lopez Mato // 00006 // TUTOR: Noemi Merayo Alvarez // 00007 // INGENIERIA TECNICA DE TELECOMUNICACIONES, SISTEMAS DE TELECOMUNICACION // 00008 // UNIVERSIDAD DE VALLADOLID // 00010 00011 #include "SPLITTER.h" 00012 #include "GATE_m.h" 00013 #include "REPORT_m.h" 00014 #include "ETHERNET_m.h" 00015 #include "DATA_m.h" 00016 /* 00017 * MODULO SPLITTER: 00018 */ 00019 Define_Module(SPLITTER); 00020 00022 //FUNCION INITIALIZE()--> ESTA FUNCION SE INVOCA DESPUES DE QUE OMNET++ HA PUESTO EN MARCHA LA RED, EN LA CUAL SE LEEN LOS // 00023 // PARAMETROS DEL MODULO Y SE INICIALIZAN TODAS DAS LAS VARIABLES DECLARADAS PARA ESTE MODULO SIMPLE, SE // 00024 // ASIGNAN ESTRUCTURAS DE DATOS DINAMICOS Y SE ASIGNAN E INICIALIZAN LOS AUTOMENSAJES SI SON NECESARIOS // 00025 // PARA EL FUNCIONAMIENTO DE ESTE MODULO. // 00027 void SPLITTER::initialize() 00028 { 00029 } 00030 00032 //FUNCION HANDLEMESSAGE(CMESSAGE *MSG)--> ESTA FUNCION SE INVOCA CON EL MENSAJE COMO PARAMETRO CADA VEZ QUE EL MODULO RECIBE UN // 00033 // UN MENSAJE O PAQUETE. SE RECORRE EL CODIGO IMPLEMENTADO PARA DEVOLVER UN VALOR O // 00034 // EJECUTAR UNA FUNCION DENTRO DEL MODULO SIMPLE. EL TIEMPO DE SIMULACION NO TRANSCURRE // 00035 // DENTRO DE LA LLAMADA DE LA FUNCION HANDLEMESSAGE(CMESSAGE *MSG) MIENTRAS RECORRE EL // 00036 // CODIGO IMPLEMENTADO. // // 00038 void SPLITTER::handleMessage(cMessage *msg) 00039 { 00040 // VARIABLES 00041 int type = msg->getKind(); // VARIABLE TYPE PARA IDENTIFICAR LOS MENSAJES DE LA RED 00042 00043 // ESTRUCTURA CONDICIONAL SWITCH QUE NOS DIFERENCIA LOS MENSAJES QUE LLEGUEN A ESTE MODULO 00044 switch(type) 00045 { 00046 case 0: 00047 // LLEGA UN PAQUETE GATE CON IDENTIFICADOR = 0 00048 if(msg->getKind()==0) 00049 { 00050 GATEmsg *gatemsg=check_and_cast<GATEmsg*>(msg); // CHEQUEAMOS EL PAQUETE GATE 00051 00052 00053 // BUCLE FOR PARA GENERAR UNA COPIA DEL MENSAJE GATE QUE SE MANDA A TODAS LAS ONUS DE LA RED 00054 for( int k=gatemsg->getLambdagate(); k<gateSize("splitterOut"); k=k+(int)par("numlong")) 00055 { 00056 GATEmsg *copy = gatemsg->dup(); // DUPLICAMOS EL PAQUETE GATE QUE SE MANDA A TODAS LAS ONUS DE LA RED 00057 send(copy, "splitterOut$o", k); // ENVIAMOS TODAS LAS COPIAS DEL PAQUETE GATE HACIA TODAS LAS ONUS DE LA RED 00058 } 00059 00060 delete msg; // BORRAMOS EL MENSAJE 00061 } 00062 break; 00063 00064 case 1: 00065 // LLEGA UN PAQUETE ETHERNET CON IDENTIFICADOR = 1 00066 if(msg->getKind()==1) 00067 { 00068 ETHERNETmsg *ethernetmsg=check_and_cast<ETHERNETmsg*>(msg); // CHEQUEAMOS EL PAQUETE ETHERNET 00069 00070 // COMPARAMOS SI LA EL IDENTIFICADOR DE LA DIRECCION DE DESTINO ES IGUAL AL IDENTIFICADOR = 9 QUE CORRESPONDE CON EL OLT 00071 if(ethernetmsg->getDestAddress()==9) 00072 { 00073 // VISUALIZAMOS EL TAMANYO DEL PAQUETE ETHERNET QUE SE MANDA HACIA EL OLT 00074 // //ev<<" Longitud del paquete Ethernet que se manda hacia el OLT: " << ethernetmsg->getByteLength() << " Bytes" << endl; 00075 // ENVIAMOS EL PAQUETE ETHERNET POR LA SALIDA DEL MODULO SPLITTER HACIA EL OLT 00076 if(ethernetmsg->getIsWireless()==1) 00077 { 00078 ev<<" Envio de paquete Ethernet de origen inalambrico al modulo 'OLT_WDMSplitter'."<<endl; 00079 } 00080 else 00081 { 00082 //ev<<" Envio mensaje Ethernet (Id. " << ethernetmsg->getId() << ") al modulo 'OLT_WDMSplitter'." << endl; 00083 } 00084 send(ethernetmsg, "splitterIn$o", ethernetmsg->getLambdaethernet()); 00085 } 00086 else 00087 { 00088 // BUCLE FOR PARA GENERAR UNA COPIA DEL MENSAJE ETHERNET QUE SE MANDA A TODAS LAS ONUS DE LA RED 00089 for( int k=ethernetmsg->getLambdaethernet(); k<gateSize("splitterOut"); k=k+(int)par("numlong")) 00090 { 00091 ETHERNETmsg *copy = ethernetmsg->dup(); // DUPLICAMOS EL PAQUETE ETHERNET QUE SE MANDA A TODAS LAS ONUS DE LA RED 00092 send(copy, "splitterOut$o", k); // ENVIAMOS TODAS LAS COPIAS DEL PAQUETE ETHERNET HACIA TODAS LAS ONUS DE LA RED 00093 } 00094 00095 delete msg; // BORRAMOS EL MENSAJE 00096 } 00097 } 00098 break; 00099 00100 case 2: 00101 // LLEGA UN PAQUETE REPORT CON IDENTIFICADOR = 2 00102 if(msg->getKind()==2) 00103 { 00104 00105 REPORTmsg *reportmsg=check_and_cast<REPORTmsg*>(msg); // CHEQUEAMOS EL PAQUETE REPORT 00106 // ENVIAMOS EL PAQUETE REPORT POR LA SALIDA DEL MODULO SPLITTER HACIA EL OLT 00107 send(reportmsg, "splitterIn$o", reportmsg->getLambdareport()); 00108 } 00109 break; 00110 00111 default: 00112 delete msg; 00113 break; 00114 } 00115 }