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 "OLT_WDMSplitter.h" 00012 #include "GATE_m.h" 00013 #include "REPORT_m.h" 00014 #include "ETHERNET_m.h" 00015 #include "DATA_m.h" 00016 /* 00017 * MODULO OLT_WDMSplitter: 00018 */ 00019 Define_Module(OLT_WDMSplitter); 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 OLT_WDMSplitter::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 OLT_WDMSplitter::handleMessage(cMessage *msg) 00039 { 00040 // VARIABLES 00041 int type = msg->getKind(); // VARIABLE TYPE PARA IDENTIFICAR LOS MENSAJES DE LA RED 00042 int p= gateSize("wdmnet"); // TAMANYO DE LA PUERTA wdmnet DEL MODULO OLT_WDMSPLITTER 00043 00044 // ESTRUCTURA CONDICIONAL SWITCH QUE NOS DIFERENCIA LOS MENSAJES QUE LLEGUEN A ESTE MODULO 00045 switch(type) 00046 { 00047 case 0: 00048 // LLEGA UN PAQUETE GATE CON IDENTIFICADOR = 0 00049 if(msg->getKind()==0) 00050 { 00051 GATEmsg *gatemsg=check_and_cast<GATEmsg*>(msg); // CHEQUEAMOS EL PAQUETE GATE 00052 00053 // ENVIAMOS EL PAQUETE GATE HACIA EL SPLITTER POR LA LONGITUD DE ONDA QUE NOS INDICA EL PARAMETRO gatemsg->getLambdagate() 00054 send(gatemsg, "wdmnet$o", gatemsg->getLambdagate()); 00055 } 00056 break; 00057 00058 case 1: 00059 // LLEGA UN PAQUETE ETHERNET CON IDENTIFICADOR = 1 00060 if(msg->getKind()==1) 00061 { 00062 ETHERNETmsg *ethernetmsg=check_and_cast<ETHERNETmsg*>(msg); 00063 // DEFINIMOS EL PARAMETRO ingate QUE NOS INDICA EL PUNTERO DE LA PUERTA POR LA CUAL ENTRA EL MENSAJE QUE LLEGA 00064 cGate *ingate = ethernetmsg->getArrivalGate(); 00065 00066 // COMPARAMOS EL NOMBRE DE LA PUERTA POR LA QUE ENTRA EL MENSAJE CON LA PUERTA wdmnet$i 00067 if(ingate->getName() == gate("wdmnet$i",intuniform(0,p-1))->getName()) 00068 { 00069 00070 if(ethernetmsg->getIsWireless()==1) 00071 { 00072 //ev<<" Envio de paquete Ethernet de origen inalambrico al modulo 'OLT_Rx'."<<endl; 00073 } 00074 else 00075 { 00076 received_messages++; 00077 //ev<<" Envio mensaje Ethernet (Id. " << ethernetmsg->getId() << ") al modulo 'OLT_Rx'."<< endl; 00078 //ev<<" Total paquetes Ethernet recibidos de las fuentes opticas: " << received_messages << endl; 00079 } 00080 send(ethernetmsg, "wdmrxOut"); // ENVIAMOS EL PAQUETE ETHERNET HACIA EL RECEPTOR 00081 } 00082 else 00083 { 00084 // ENVIAMOS EL PAQUETE ETHERNET HACIA EL SPLITTER POR LA LONGITUD DE ONDA QUE NOS INDICA EL PARAMETRO ethernetmsg->getLambdaethernet() 00085 send(ethernetmsg, "wdmnet$o", ethernetmsg->getLambdaethernet()); 00086 } 00087 } 00088 break; 00089 00090 case 2: 00091 // LLEGA UN PAQUETE REPORT CON IDENTIFICADOR = 2 00092 if(msg->getKind()==2) 00093 { 00094 REPORTmsg *reportmsg = check_and_cast<REPORTmsg*>(msg); // CHEQUEAMOS EL PAQUETE REPORT 00095 send(reportmsg, "wdmrxOut"); // ENVIAMOS EL PAQUETE REPORT HACIA EL RECEPTOR DEL OLT 00096 } 00097 break; 00098 00099 default: 00100 delete msg; 00101 break; 00102 } 00103 }