#include <MAC_ONU.h>
Public Member Functions | |
int | numInitStages () const |
Public Attributes | |
double | T_cycle_prev |
double | T_init_prev |
double | B_alloc_prev |
int_vector_t | numsla_onu |
Protected Member Functions | |
virtual void | initialize (int stage) |
virtual void | handleMessage (cMessage *msg) |
Private Attributes | |
ONU_Table * | onutable_module |
int | lambda |
Definition at line 28 of file MAC_ONU.h.
void MAC_ONU::handleMessage | ( | cMessage * | msg | ) | [protected, virtual] |
Reimplemented from cSimpleModule.
Definition at line 59 of file MAC_ONU.cc.
00060 { 00061 // VARIABLES 00062 int type = msg->getKind(); // VARIABLE TYPE PARA IDENTIFICAR LOS MENSAJES DE LA RED 00063 int destAddress = 9; // DEFINIMOS EL IDENTIFICADOR DE LA DIRECCION DE DESTINO DE LOS PAQUETES REPORT 00064 int srcAddress = getParentModule()->getIndex(); // DEFINIMOS EL IDENTIFICADOR DE LA DIRECCION FUENTE DE LOS PAQUETES GATE 00065 int tamqueuereport[(int)par("numqueue")]; // VARIABLE DE TAMANYO DE LAS COLAS DEL MENSAJE REPORT CON TAMANYO IGUAL AL NUMERO DE COLAS QUE DEFINAMOS 00066 00067 // GENERAMOS CON EL BUCLE FOR LA VARIABLE DEL TAMANYO DE LAS COLAS 00068 for(int b=0; b<(int)par("numqueue"); b++) 00069 { 00070 tamqueuereport[b] = 0; // DAMOS EL VALOR 0 A LA VARIABLE DEL TAMANYO DE LAS COLAS DEL PAQUETE REPORT 00071 } 00072 double bandwitch; 00073 double T_init_actual = 0.0; 00074 // ESTRUCTURA CONDICIONAL SWITCH QUE NOS DIFERENCIA LOS MENSAJES QUE LLEGUEN A ESTE MODULO 00075 switch(type) 00076 { 00077 case 0: 00078 // LLEGA UN PAQUETE GATE CON IDENTIFICADOR = 0 00079 if(msg->getKind()==0) 00080 { 00081 GATEmsg *gatemsg = check_and_cast<GATEmsg *>(msg); // CHEQUEAMOS EL PAQUETE GATE 00082 00083 lambda=gatemsg->getLambdagate(); 00084 //ev<<" Paquete 'Gate' recibido por lambda: "<<lambda<<endl; 00085 00086 numsla_onu[this->getParentModule()->getIndex()] = gatemsg->getNumsla(); // ASIGNAMOS EL IDENTIFICADOR DEL SLA ASOCIADO A LA ONU AL VECTOR numsla_onu[] 00087 00088 // COMPARAMOS EL METODO DE EXTRACCION DE PAQUETES QUE SE DEFINE EN OMNETPP.INI 00089 if((int)par("extractionmethod_StrictPQ0_Centralized1")==0) 00090 { 00091 // VISUALIZAMOS POR PANTALLA CAMPOS DEL PAQUETE GATE 00092 //ev<<" Onu "<<gatemsg->getDestAddress()<<endl; 00093 //ev<<" Tiempo de comienzo a transmitir: "<<gatemsg->getGrant_IniTime()<<endl; 00094 //ev<<" Ancho de Banda de slot: "<<gatemsg->getGrant_IntervalTx(0)<<endl; 00095 00096 // GUARDAMOS EN LA TABLA CREADA EN EL MODULO ONU_TABLE LOS VALORES DEL TIEMPO DE INICIO DE TRANSMISION Y DE ANCHO DE BANDA DE SLOT 00097 onutable_module->table_onu_gate_time[0] = gatemsg->getGrant_IniTime(); 00098 onutable_module->table_onu_gate[0] = gatemsg->getGrant_IntervalTx(0); 00099 00100 T_init_actual = SIMTIME_DBL(onutable_module->table_onu_gate_time[0]); 00101 T_cycle_prev = T_init_actual - T_init_prev; 00102 //ev<<" Tiempo de incio de tx del ciclo anterior: " << T_init_pr//ev<<endl; 00103 //ev<<" Tiempo de incio de tx del ciclo siguiente: " << T_init_actual << endl; 00104 //ev<<" Duracion del ciclo anterior: " << T_cycle_pr//ev<<endl; 00105 // Para el proximo ciclo: 00106 T_init_prev = T_init_actual; 00107 B_alloc_prev = (double) 8*onutable_module->table_onu_gate[0]; 00108 } 00109 else if((int)par("extractionmethod_StrictPQ0_Centralized1")==1) 00110 { 00111 // GUARDAMOS EN LA TABLA DEL MODULO ONU_TABLE EL TIEMPO DE INICIO DE TRANSMISION Y LO VISUALIZAMOS POR PANTALLA 00112 onutable_module->table_onu_gate_time[0] = gatemsg->getGrant_IniTime(); 00113 //ev<<" Tiempo de comienzo a transmitir: "<<gatemsg->getGrant_IniTime()<<endl; 00114 00115 // MEDIANTE EL FOR, GUARDAMOS EN LA TABLA DEL MODULO ONU_TABLE EL ANCHO DE BANDA DE SLOT DE CADA COLA Y LO VISUALIZAMOS POR PANTALLA 00116 for(int i=0; i<(int)par("numqueue"); i++) 00117 { 00118 onutable_module->table_onu_gate[i] = gatemsg->getGrant_IntervalTx(i); 00119 //ev<<" Ancho de Banda de slot de la cola "<<i<<": "<<gatemsg->getGrant_IntervalTx(i)<<"Bytes"<<endl; 00120 } 00121 } 00122 00123 // COMPARAMOS EL IDENTIFICADOR DE LA DIRECCION DE DESTINO CON EL PROPIO IDENTIFICADOR DE LA ONU 00124 if(gatemsg->getDestAddress() == getParentModule()->getIndex()) 00125 { 00126 // CREAMOS UN AUTOMENSAJE PARA GENERAR EL MENSAJE REPORT 00127 cMessage *msg = new cMessage ("mensaje inicial report"); 00128 msg->setKind(5); // IDENTIFICADOR DEL AUTOMENSAJE 00129 scheduleAt(onutable_module->table_onu_gate_time[0], msg); 00130 // EL AUTOMENSAJE SE MANDA EN EL INSTANTE QUE CONTENIA EL CAMPO getGrant_IniTime() DEL PAQUETE GATE 00131 } 00132 00133 delete gatemsg; // BORRAMOS EL PAQUETE GATE 00134 } 00135 break; 00136 00137 case 1: 00138 // LLEGA UN PAQUETE ETHERNET CON IDENTIFICADOR = 1 00139 if(msg->getKind()==1) 00140 { 00141 //ev<<" Envio mensaje Ethernet (Id. " << msg->getId() << ") al modulo 'ONU_WDMSplitter'." << endl; 00142 send(msg, "macrxuserOut"); // ENVIA EL PAQUETE ETHERNET QUE SON PARA ELLA HACIA EL MODULO ONU_RXUSER 00143 } 00144 break; 00145 00146 case 5: 00147 // LLEGA UN AUTOMENSAJE CON IDENTIFICADOR = 5 PARA GENERAR EL PAQUETE REPORT 00148 if(msg->getKind()==5) 00149 { 00150 delete msg; // BORRAMOS EL AUTOMENSAJE YA QUE NO SE UTILIZA MAS VECES 00151 00152 //CREAMOS EL PAQUETE REPORT 00153 REPORTmsg *packet = new REPORTmsg("report"); 00154 packet->setByteLength(64); // TAMANYO DEL PAQUETE REPORT 00155 packet->setSrcAddress(srcAddress); // DIRECCION DE ORIGEN O FUENTE 00156 packet->setDestAddress(destAddress); // DIRECCION DE DESTINO 00157 packet->setPriority((int)par("numqueue")); // PRIORIDAD DEL PAQUETE REPORT 00158 packet->setLambdareport(lambda); // LONGITUD DE ONDA POR LA QUE SE TRANSMITE EL PAQUETE REPORT 00159 packet->setKind(2);// IDENTIFICADOR DEL PAQUETE REPORT 00160 packet->setQueue_estadoArraySize((int)par("numqueue")); // TAMANYO DEL ARRAY QUE CONTIENE EL ESTADO DE LAS COLAS DE LA ONU 00161 packet->setNumsla(numsla_onu[getIndex()]); // IDENTIFICADOR DEL SLA DE LA ONU 00162 //packet->setQueue_sizeArraySize((int)par("numqueue")); 00163 // BUCLE FOR PARA ASIGNAR EL ESTADO DE LAS COLAS 00164 //int aux_pckts = 0; 00165 for(int i=0; i<(int)par("numqueue"); i++) 00166 { 00167 //aux_pckts = (int) check_and_cast<ONU_SISTqueue *>(getParentModule()->getSubmodule("onu_squeue")->getSubmodule("onu_sistqueue",i))->queue.getLength(); 00168 packet->setQueue_estado(i,tamqueuereport[i]); 00169 //packet->setQueue_size(i,aux_pckts); 00170 } 00171 packet->setBandwitchArraySize((int)par("numqueue")); // TAMANYO DEL ARRAY QUE CONTIENE EL ANCHO DE BANDA DEMANDADO DE LA ONU 00172 00173 // DEPENDIENDO DEL METODO DE EXTRACCION DE PAQUETES, SE DEFINE UN ANCHO DE BANDA GENERAL O UNO PARA CADA COLA 00174 if((int)par("extractionmethod_StrictPQ0_Centralized1")==0) 00175 { 00176 // DAMOS A LA VARIABLE bandwitch EL VALOR QUE ESTABA GUARDADO EN LA TABLA DEL MODULO ONU_TABLE 00177 // TAMANYO TOTAL DE BYTES QUE TENEMOS PARA SACAR MENSAJES DE LAS COLAS 00178 bandwitch = onutable_module->table_onu_gate[0]; 00179 packet->setBandwitch(0,bandwitch); 00180 //ev<<" Bandwitch para transmitir paquetes: "<<packet->getBandwitch(0)<<endl; 00181 } 00182 else if((int)par("extractionmethod_StrictPQ0_Centralized1")==1) 00183 { 00184 // BUCLE FOR PARA DEFINIR UN ANCHO DE BANDA PARA CADA COLA 00185 for(int i=0; i<(int)par("numqueue"); i++) 00186 { 00187 // DEFINIMOS EL ANCHO DE BANDA PARA CADA COLA 00188 // TAMANYO TOTAL DE BYTES QUE TENEMOS PARA SACAR MENSAJES DE CADA COLA 00189 bandwitch = onutable_module->table_onu_gate[i]; 00190 packet->setBandwitch(i,bandwitch); 00191 //ev<<" Bandwitch para transmitir paquetes cola "<<i<<": "<<packet->getBandwitch(i)<<endl; 00192 } 00193 } 00194 00195 /* 00196 // VISUALIZAMOS POR PANTALLA TODOS LOS CAMPOS DEL PAQUETE REPORT 00197 ev<<" Paquete Report "<<endl; 00198 ev<<" Origen ONU "<<packet->getSrcAddress()<<endl; 00199 ev<<" Destino OLT con ID "<<packet->getDestAddress()<<endl; 00200 ev<<" Prioridad: "<<packet->getPriority()<<endl; 00201 ev<<" Longitud de onda de envio, Lambda "<<packet->getLambdareport()<<endl; 00202 ev<<" Longitud Paquete Report: "<<packet->getByteLength()<<endl; 00203 ev<<" Tipo "<<packet->getKind()<<endl; 00204 ev<<" SLA: "<<packet->getNumsla()<<endl; 00205 */ 00206 // ENVIAMOS LOS PAQUETES REPORT HACIA EL MODULO DEL GENERADOR 00207 send(packet, "macgenOut"); 00208 } 00209 break; 00210 00211 default: 00212 delete msg; 00213 break; 00214 } 00215 }
void MAC_ONU::initialize | ( | int | stage | ) | [protected, virtual] |
Reimplemented from cComponent.
Definition at line 35 of file MAC_ONU.cc.
00036 { 00037 numsla_onu.resize((int)par("numOnu"),0); // VECTOR QUE GUARDA EL IDENTIFICADOR DE SLA ASOCIADO A LA ONU. SE INICIALIZA A 0 CON UN TAMANYO IGUAL AL NUMERO DE ONUS DE NUESTRA RED 00038 //lambda; //VARIABLE PARA ESTABLECER PORQUE LAMBDA ENVIAREMOS EL PAQUETE REPORT 00039 00040 // DEFININOS EL PROCESO PARA PODER ENTRAR DESDE ESTE MODULO AL MODULO ONU_TABLE 00041 cModule *c_onutable_module; 00042 if(stage==0) 00043 { 00044 c_onutable_module = getParentModule()->getSubmodule("onu_table"); // CAMINO PARA LLEGAR HASTA EL MODULO ONU_TABLE 00045 onutable_module = check_and_cast<ONU_Table *>(c_onutable_module); // ENTRAMOS Y CHEQUEAMOS EL MODULO ONU_TABLE 00046 } 00047 T_cycle_prev = 0.0; 00048 T_init_prev = 0.0; 00049 B_alloc_prev = 0.0; 00050 }
int MAC_ONU::numInitStages | ( | ) | const [virtual] |
double MAC_ONU::B_alloc_prev |
int MAC_ONU::lambda [private] |
ONU_Table* MAC_ONU::onutable_module [private] |
double MAC_ONU::T_cycle_prev |
double MAC_ONU::T_init_prev |