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 "ONU_Rx_Report.h" 00012 #include "GATE_m.h" 00013 #include "REPORT_m.h" 00014 #include "ETHERNET_m.h" 00015 #include <omnetpp.h> 00016 #include <vector> 00017 #include <time.h> 00018 #include "analysis.h" 00019 /* 00020 * MODULO ONU_Rx_Report: 00021 */ 00022 Define_Module(ONU_Rx_Report); 00023 00025 //FUNCION INITIALIZE()--> ESTA FUNCION SE INVOCA DESPUES DE QUE OMNET++ HA PUESTO EN MARCHA LA RED, EN LA CUAL SE LEEN LOS // 00026 // PARAMETROS DEL MODULO Y SE INICIALIZAN TODAS DAS LAS VARIABLES DECLARADAS PARA ESTE MODULO SIMPLE, SE // 00027 // ASIGNAN ESTRUCTURAS DE DATOS DINAMICOS Y SE ASIGNAN E INICIALIZAN LOS AUTOMENSAJES SI SON NECESARIOS // 00028 // PARA EL FUNCIONAMIENTO DE ESTE MODULO. // 00030 void ONU_Rx_Report::initialize() 00031 { 00032 // INICIALIZACION AL VALOR 0 DE VARIABLES 00033 sumpacketextrac = 0; // SUMA DE LOS PAQUETES QUE SE CHEQUEAN EN EL METODO DE EXTRACION ESTRICTA DE PAQUETES 00034 sumextract = 0; // VARIABLE DE LA SUMA DE LOS PAQUETES QUE SE EXTRAEN EN EL METODO DE EXTRACION ESTRICTA DE PAQUETES 00035 tamsumqueue = 0; // TAMANYO DE LA SUMA DEL TAMANYO DE LOS PAQUETES QUE LLEGAN A LAS COLAS DE LA ONU 00036 sumpacket.resize((int)par("numqueue"),0); // RESERVAMOS TAMANYO E INICIALIZAMOS A 0 EL VECTOR DE LA SUMA DE LOS PAQUETES QUE SE CHEQUEAN EN LAS COLAS 00037 sumqueuepop.resize((int)par("numqueue"),0); // RESERVAMOS TAMANYO E INICIALIZAMOS A 0 EL VECTOR DE LA SUMA TOTAL DE BYTES EXTRAIDOS DE LAS COLAS 00038 bytes_queue.resize((int)par("numqueue"),0); // VECTOR DE LOS BYTES QUE QUEDAN EN LA COLA DESPUES DE CADA CICLO. SE INICIALIZA A 0 CON UN TAMANYO IGUAL AL NUMERO DE COLAS O SERVICIOS DE NUESTRA RED 00039 media.resize((int)par("numqueue"),0); // VECTOR QUE NOS INDICA LA MEDIA. SE INICIALIZA A 0 CON UN TAMANYO IGUAL AL NUMERO DE COLAS O SERVICIOS DE NUESTRA RED 00040 media_bytes_queue.resize((int)par("numqueue")); 00041 } 00042 00044 //FUNCION HANDLEMESSAGE(CMESSAGE *MSG)--> ESTA FUNCION SE INVOCA CON EL MENSAJE COMO PARAMETRO CADA VEZ QUE EL MODULO RECIBE UN // 00045 // UN MENSAJE O PAQUETE. SE RECORRE EL CODIGO IMPLEMENTADO PARA DEVOLVER UN VALOR O // 00046 // EJECUTAR UNA FUNCION DENTRO DEL MODULO SIMPLE. EL TIEMPO DE SIMULACION NO TRANSCURRE // 00047 // DENTRO DE LA LLAMADA DE LA FUNCION HANDLEMESSAGE(CMESSAGE *MSG) MIENTRAS RECORRE EL // 00048 // CODIGO IMPLEMENTADO. // // 00050 void ONU_Rx_Report::handleMessage(cMessage *msg) 00051 { 00052 // VARIABLES 00053 int type = msg->getKind(); // VARIABLE TYPE PARA IDENTIFICAR LOS MENSAJES DE LA RED 00054 int extraction = (int)par("extractionmethod_StrictPQ0_Centralized1"); // PARAMETRO PARA ELEGIR EL METODO DE EXTRACCION DE COLAS ( METODO DE EXTRACCION DE COLAS DE PRIORIDAD EXTRICTA O METODO DE EXTRACCION DE COLAS CENTRALIZADO ) 00055 00056 // ESTRUCTURA CONDICIONAL SWITCH QUE NOS DIFERENCIA LOS MENSAJES QUE LLEGUEN A ESTE MODULO 00057 switch(type) 00058 { 00059 case 2: 00060 // LLEGA UN PAQUETE REPORT CON IDENTIFICADOR = 2 00061 if(msg->getKind()==2) 00062 { 00063 //ev<<" Recibimos paquete Report y sacamos paquetes de las colas."<<endl; 00064 00065 // ESTRUCTURA CONDICIONAL SWITCH QUE NOS DIFERENCIA EL METODO DE EXTRACCION DE PAQUETES DE LAS COLAS 00066 switch(extraction) 00067 { 00068 case 0: 00069 //ev<<" Metodo de Extracción de Colas de Prioridad Estricta."<<endl; 00070 strictpriorityqueue(msg); // LLAMADA A LA FUNCION DEL METODO DE EXTRACCION DE PAQUETES DE COLAS DE PRIORIDAD ESTRICTA 00071 break; 00072 00073 case 1: 00074 //ev<<" Metodo de Extracción de Colas Centralizado."<<endl; 00075 centralizedmethod(msg); // LLAMADA A LA FUNCION DEL METODO DE EXTRACCION DE PAQUETES DE COLAS CENTRALIZADO 00076 break; 00077 00078 default: 00079 ev<<" ERROR AL ELEGIR EL METODO DE EXTRACCION DE PAQUETES DE COLAS, ELEGIR 0 ó 1."<<endl; 00080 delete msg; 00081 break; 00082 } 00083 } 00084 break; 00085 } 00086 } 00087 00089 //FUNCION STRICTPRIORITYQUEUE(CMESSAGE *MSG)--> FUNCION QUE NOS INDICA UN METODO PARA LA EXTRACCION DE PAQUETES DE LAS COLAS. // 00090 // ESTE METODO ES DE EXTRACCION DE PAQUETES DE LAS COLAS DE PRIORIDAD ESTRICTA. EL TAMANYO EN BYTES QUE TENEMOS // 00091 // PARA TRANSMITIR PAQUETES DE LAS COLAS SE NOS INDICA PARA TODAS LAS COLA JUNTAS EN GLOBAL. CUANDO LLEGA EL // 00092 // PAQUETE REPORT AL MODULO SIMPLE ONU_Rx_Report, RECORREMOS LAS COLAS DE MAYOR PRIORIDAD A MENOR PRIORIDAD PARA// 00093 // OBTENER EL TAMANYO DEL PRIMER PAQUETE QUE ESTA INSERTADO EN LA COLA A EXTRAER, Y DEPENDIENDO DEL TAMANYO TOTAL // 00094 // EN BYTES DE TODAS LAS COLAS QUE TENEMOS PARA TRANSMITIR, EXTRAEMOS PAQUETES DE LA COLA DE MAYOR PRIORIDAD // 00095 // HASTA QUE SE QUEDA SIN PAQUETES Y SEGUIMOS HACIA COLAS DE MENOR PRIORIDAD HASTA QUE COMPLETAMOS EL TAMANYO // 00096 // TOTAL DE BYTES QUE TIENE LA ONU PARA TRANSMITIR. // 00097 // MEDIANTE ESTE METODO DAMOS PRIORIDAD AL TRAFICO DE MAYOR PRIORIDAD. // 00099 void ONU_Rx_Report::strictpriorityqueue(cMessage *msg) 00100 { 00101 // EJECUTAMOS EL METODO DE EXTRACCION DE COLAS DE PRIORIDAD ESTRICTA 00102 REPORTmsg *reportmsg=check_and_cast<REPORTmsg*>(msg); // CHEQUEAMOS EL PAQUETE REPORT 00103 // RECORREMOS LAS COLAS PARA VISUALIZAR POR PANTALLA EL TAMANYO DE LAS COLAS 00104 for(int i=0; i<(int)par("numqueue"); i++) 00105 { 00106 // VARIABLES PARA PODER ENTRAR DESTE ESTE MODULO AL MODULO ONU_SISTQUEUE Y PODER OBTENER INFORMACION SOBRE LAS COLAS 00107 cModule *c_onu_queue; 00108 c_onu_queue = getParentModule()->getParentModule()->getSubmodule("onu_squeue")->getSubmodule("onu_sistqueue",i); 00109 onu_queue = check_and_cast<ONU_SISTqueue *>(c_onu_queue); 00110 tamsumqueue = tamsumqueue + onu_queue->tamqueue[i]; 00112 00113 } 00114 // RECORREMOS LAS COLAS PARA COMPROBAR SI TIENEN PAQUETES Y EXTRAER LOS BYTES QUE NOS PROPORCION EL OLT 00115 for(int i=0; i<(int)par("numqueue"); i++) 00116 { 00117 // VARIABLES PARA PODER ENTRAR DESTE ESTE MODULO AL MODULO ONU_SISTQUEUE Y PODER OBTENER INFORMACION SOBRE LAS COLAS 00118 cModule *c_onu_queue; 00119 c_onu_queue = getParentModule()->getParentModule()->getSubmodule("onu_squeue")->getSubmodule("onu_sistqueue",i); 00120 onu_queue = check_and_cast<ONU_SISTqueue *>(c_onu_queue); 00121 00122 // COMPARAMOS SI LA COLA EN LA QUE NOS ENCONTRAMOS TIENE PAQUETES INSERTADOS EN ELLA, 00123 // ADEMAS COMPARAMOS SI EL ANCHO DE BANDA ASIGANDO POR EL OLT ES MAYOR O IGUAL A LA SUMA DE PAQUETES QUE EXTRAEMOS MAS EL TAMANYO DEL PAQUETE REPORT QUE SE MANDA EN ESE ANCHO DE BANDA ASIGNADO HACIA LA ONU 00124 if(onu_queue->queue.getLength()>0 && reportmsg->getBandwitch(0) >= sumpacketextrac + reportmsg->getByteLength()) 00125 { 00126 // RECORREMOS TODOS LOS PAQUETES DE LA COLA DESDE EL MAS ANTIGUO PARA EXTRAERLOS 00127 for(int j=0; (j=onu_queue->queue.getLength()); j++) 00128 { 00129 // LLAMAMOS A LA FUNCION CHEQUEAR PAQUETE PARA COMPROBAR QUE PODEMOS EXTRAERLO Y LO VISUALIZAMOS POR LA PANTALLA 00130 onu_queue->checkpacket(); 00131 //ev<<" "<<endl; 00132 //ev<<" Tamaño paquete chequeado cola "<<i<<"-> "<< onu_queue->tamqueueextract<<"Bytes"<<endl; 00133 // SUMA DE LOS PAQUETES QUE SE CHEQUEAN Y LO VISUALIZAMOS POR PANTALLA 00134 sumpacketextrac = sumpacketextrac + onu_queue->tamqueueextract; 00135 //ev<<" Suma paquetes que se extraen-> "<<sumpacketextrac<<"Bytes"<<endl; 00136 00137 // COMPROBAMOS SI EL ANCHO DE BANDA ASIGANDO POR EL OLT ES MAYOR O MENOR QUE LA SUMA DE PAQUETES QUE EXTRAEMOS MAS EL TAMANYO DEL PAQUETE REPORT QUE SE MANDA EN ESE ANCHO DE BANDA ASIGNADO HACIA LA ONU 00138 if(reportmsg->getBandwitch(0) >= sumpacketextrac + reportmsg->getByteLength()) 00139 { 00140 // SI EL ANCHO DE BANDA ASIGNADO ES MAYOR, SE EXTRAE EL PAQUETE Y SE ENVIA HACIA EL OLT 00141 //ev<<" Extraemos y enviamos paquete a el OLT."<<endl; 00142 onu_queue->extractionelement(i); // LLAMAMOS DE FORMA REMOTA A LA FUNCION EXTRAER PAQUETES IMPLEMENTADA EN EL MODULO ONU_SISTQUEUE 00143 // SUMA DE LOS PAQUETES QUE EXTRAEMOS EN ESTA COLA 00144 sumextract = sumextract + onu_queue->tamextract; 00145 } 00146 else if(reportmsg->getBandwitch(0) < sumpacketextrac + reportmsg->getByteLength()) 00147 { 00148 // SI EL ANCHO DE BANDA ASIGNADO ES MENOR, NO SE EXTRAEN MAS PAQUETES 00149 //ev<<" No extraemos más paquetes porque no entra en el Ancho de Banda de Slot."<<endl; 00150 break; // SALIMOS DEL BUCLE FOR QUE RECORRE TODOS LOS PAQUETES DE LA COLA EN LA QUE NOS ENCONTRAMOS 00151 } 00152 } 00153 } 00154 else if(reportmsg->getBandwitch(0) < sumpacketextrac + reportmsg->getByteLength()) 00155 { 00156 tamsumqueue = tamsumqueue - sumextract; // RESTAMOS EL TAMANYO DE LOS PAQUETES QUE HEMOS EXTRAIDO A LA SUMA DEL TAMANYO DE LOS PAQUETES DE LAS COLAS 00157 break; // SALIMOS DEL BUCLE FOR QUE RECORRE TODAS LAS COLAS 00158 } 00159 } 00160 00161 // COMPROBAMOS SI EL ANCHO DE BANDA ASIGANDO POR EL OLT ES MAYOR QUE LA SUMA DE PAQUETES QUE EXTRAEMOS MAS EL TAMANYO DEL PAQUETE REPORT QUE SE MANDA EN ESE ANCHO DE BANDA ASIGNADO HACIA LA ONU 00162 if(reportmsg->getBandwitch(0) >= sumpacketextrac + reportmsg->getByteLength()) 00163 { 00164 tamsumqueue = tamsumqueue - sumextract; // RESTAMOS EL TAMANYO DE LOS PAQUETES QUE HEMOS EXTRAIDO A LA SUMA DEL TAMANYO DE LOS PAQUETES DE LAS COLAS 00165 } 00166 /* Hasta aqui es la extraccion de paquetes Ethernet */ 00167 00168 //ev<<endl<<" Actualizamos el tamaño de las colas y lo reescribimos en el Report."<<endl; 00169 // ACTUALIZAMOS EL VALOR DE LAS COLAS QUE LLEVARA EL REPORT HASTA EL OLT Y LO VISUALIZAMOS POR PANTALLA 00170 for(int i=0; i<(int)par("numqueue"); i++) 00171 { 00172 // VARIABLES PARA PODER ENTRAR DESTE ESTE MODULO AL MODULO ONU_SISTQUEUE Y PODER OBTENER INFORMACION SOBRE LAS COLAS 00173 cModule *c_onu_queue; 00174 c_onu_queue = getParentModule()->getParentModule()->getSubmodule("onu_squeue")->getSubmodule("onu_sistqueue",i); 00175 onu_queue = check_and_cast<ONU_SISTqueue *>(c_onu_queue); 00176 00177 // VISUALIZAMOS POR PANTALLA EL TAMANYO DE LAS COLAS Y LO INTRODUCIMOS EN EL PAQUETE REPORT PARA MANDARLO HACIA EL OLT 00178 //ev<<" Tamaño cola "<<i<<"-> "<<onu_queue->tamqueue[i]<<"Bytes"<<endl; 00179 reportmsg->setQueue_estado(i,onu_queue->tamqueue[i]); // INTRODUCIMOS EL VALOR OBTENIDO ANTERIORMENTE PARA MANDARLO EN EL PAQUETE REPORT 00180 //reportmsg->setQueue_size(i,(int)onu_queue->queue.getLength()); // INTRODUCIMOS EL VALOR OBTENIDO ANTERIORMENTE PARA MANDARLO EN EL PAQUETE REPORT 00181 bytes_queue[i] = reportmsg->getQueue_estado(i); // INTRODUCIMOS EN LA VARIABLE bytes_queue[] EL VALOR DEL TAMANYO DE LOS BYTES QUE QUEDAN LA COLA 00182 //ev<<" Bytes que quedan en la cola"<<i<<": "<<bytes_queue[i]<<endl; // VISUALIZAMOS EL VALOR POR PANTALLA 00183 } 00184 // CALCULAMOS LA MEDIA DE LOS BYTES QUE SE QUEDAN EN LA COLA CADA CICLO 00185 if(simTime()>=1)// && getIndex()==0) 00186 { 00187 // BUCLE FOR PARA RECORRER TODAS LAS COLAS QUE TENGAMOS Y GUARDAR EN LA VARIABLE media[] LOS BYTES QUE QUEDAN EN LAS COLAS DESPUES DE CADA CICLO 00188 for(int i=0; i<(int)par("numqueue"); i++) 00189 { 00190 media[i] = bytes_queue[i]; // GUARDAMOS EN LA VARIABLE media[] LOS BYTES QUE QUEDAN EN LAS COLAS DESPUES DE CADA CICLO 00191 media_bytes_queue[i].analyze(media[i]); 00192 } 00193 // SI QUEREMOS QUE LA SIMULACION TERMINE Y LLAME A LA FUNCION FINISH() PARA RECOGER LAS ESTADASTICAS DE LA MEDIA DE LOS 00194 // BYTES QUE QUEDAN EN LAS COLAS DESPUES DE CADA CICLO. 00195 // PARA PARAR LA SIMULACION EL VALOR DEL NUMERO DE ITERACIONES DE LA CLASE ANALISIS DEL PARAMETRO QUE CALCULA LA MEDIA 00196 // DEBE SER IGUAL O MAYOR AL QUE INTRODUZCAMOS MANUALMENTE 00197 // DEPENDIENDO DEL NUMERO DE COLAS QUE TENGAMOS, DEBEMOS INTRODUCIR LAS VARIABLES CORESPONDIENTES 00198 00199 //if( media_bytes_queue[0].number_iterations() >= 20) 00200 //{ 00201 // endSimulation(); // LLAMAMOS A LA FUNCION TERMINAR SIMULACION 00202 // callFinish(); // LLAMAMOS A LA FUNCION FINISH() 00203 //} 00204 } 00205 //ENVIAMOS EL PAQUETE REPORT HACIA LA COLA DE ALMACENAMIENTO DE ESTOS PAQUETES DESPUES DE ACTUALIZAR EL ESTADO DE LAS COLAS 00206 send(reportmsg, "rxqueuereportOut");//, (int)par("numqueue")); 00207 sumpacketextrac = 0; // ACTUALIZAMOS EL VALOR DE LA VARIABLE sumpacketextra A UN VALOR DE 0 PARA EL PROXIMO CICLO DE EXTRACCION DE PAQUETES 00208 } 00209 00211 //FUNCION CENTRALIZEDMETHOD(CMESSAGE *MSG)--> FUNCION QUE NOS INDICA UN METODO PARA LA EXTRACCION DE PAQUETES DE LAS COLAS. // 00212 // ESTE METODO ES DE EXTRACCION DE PAQUETES DE LAS COLAS CENTRALIZADO. EL TAMANYO EN BYTES QUE TENEMOS PARA // 00213 // TRANSMITIR PAQUETES DE LAS COLAS SE NOS INDICA PARA COLA POR SEPARADO. CUANDO LLEGA EL PAQUETE REPORT AL // 00214 // MODULO SIMPLE ONU_Rx_Report, RECORREMOS LAS COLAS DE MAYOR PRIORIDAD A MENOR PRIORIDAD PARA OBTENER EL // 00215 // TAMANYO DEL PRIMER PAQUETE QUE ESTA INSERTADO EN LA COLA A EXTRAER, Y DEPENDIENDO DEL TAMANYO EN BYTES // 00216 // ASIGNADO A LA COLA EN LA EXTRAEMOS PAQUETES, SACAMOS PAQUETES DE LA COLA DE MAYOR PRIORIDAD A COLAS DE MENOR// 00217 // PRIORIDAD HASTA QUE COMPLETAMOS EL TAMANYO TOTAL DE BYTES QUE TIENE ESA ONU PARA TRANSMITIR. // 00219 void ONU_Rx_Report::centralizedmethod(cMessage *msg) 00220 { 00221 00222 // EJECUTAMOS EL METODO DE EXTRACCION DE COLAS CENTRALIZADO 00223 REPORTmsg *reportmsg=check_and_cast<REPORTmsg*>(msg); // CHEQUEAMOS EL PAQUETE REPORT 00224 00225 // RECORREMOS LAS COLAS PARA COMPROBAR SI TIENEN PAQUETES Y EXTRAER LOS BYTES QUE NOS PROPORCION EL OLT 00226 for(int i=0; i<(int)par("numqueue"); i++) 00227 { 00228 // VARIABLES PARA PODER ENTRAR DESTE ESTE MODULO AL MODULO ONU_SISTQUEUE Y PODER OBTENER INFORMACION SOBRE LAS COLAS 00229 cModule *c_onu_queue; 00230 c_onu_queue = getParentModule()->getParentModule()->getSubmodule("onu_squeue")->getSubmodule("onu_sistqueue",i); 00231 onu_queue = check_and_cast<ONU_SISTqueue *>(c_onu_queue); 00232 00233 // COMPARAMOS SI LA COLA EN LA QUE NOS ENCONTRAMOS TIENE PAQUETES INSERTADOS EN ELLA, 00234 // ADEMAS COMPARAMOS SI EL ANCHO DE BANDA ASIGANDO POR EL OLT ES MAYOR O IGUAL A LA SUMA DE PAQUETES QUE EXTRAEMOS EN LA COLA EN LA QUE NOS ENCONTRAMOS MAS EL TAMANYO DEL PAQUETE REPORT QUE SE MANDA EN ESE ANCHO DE BANDA ASIGNADO HACIA LA ONU 00235 if(onu_queue->queue.getLength()>0 && reportmsg->getBandwitch(i) >= sumpacket[i] + reportmsg->getByteLength()) 00236 { 00237 // RECORREMOS TODOS LOS PAQUETES DE LA COLA DESDE EL MAS ANTIGUO PARA EXTRAERLOS 00238 for(int j=0; (j=onu_queue->queue.getLength()); j++) 00239 { 00240 // LLAMAMOS A LA FUNCION CHEQUEAR PAQUETE PARA COMPROBAR QUE PODEMOS EXTRAERLO Y LO VISUALIZAMOS POR LA PANTALLA 00241 onu_queue->checkpacket(); 00242 //ev<<" "<<endl; 00243 //ev<<" Tamaño paquete chequeado cola "<<i<<"-> "<< onu_queue->tamqueueextract<<"Bytes"<<endl; 00244 // SUMA DE LOS PAQUETES QUE SE CHEQUEAN EN LA COLA QUE NOS ENCONTRAMOS 00245 sumpacket[i] = sumpacket[i] + onu_queue->tamqueueextract; 00246 //ev<<" Suma paquetes que se extraen en la cola "<<i<<"-> "<<sumpacket[i]<<"Bytes"<<endl; 00247 00248 // COMPROBAMOS SI EL ANCHO DE BANDA ASIGANDO POR EL OLT ES MAYOR O MENOR QUE LA SUMA DE PAQUETES QUE EXTRAEMOS EN LA COLA EN LA QUE NOS ENCONTRAMOS MAS EL TAMANYO DEL PAQUETE REPORT QUE SE MANDA EN ESE ANCHO DE BANDA ASIGNADO HACIA LA ONU 00249 if(reportmsg->getBandwitch(i) >= sumpacket[i] + reportmsg->getByteLength()) 00250 { 00251 // SI EL ANCHO DE BANDA ASIGNADO ES MAYOR, SE EXTRAE EL PAQUETE Y SE ENVIA HACIA EL OLT 00252 //ev<<" Extraemos y enviamos paquete a la Onu."<<endl; 00253 onu_queue->extractionelement(i); // LLAMAMOS DE FORMA REMOTA A LA FUNCION EXTRAER PAQUETES IMPLEMENTADA EN EL MODULO ONU_SISTQUEUE 00254 // SUMA DE LOS PAQUETES QUE EXTRAEMOS EN TODAS LAS COLAS Y LO VISUALIZAMOS POR PANTALLA 00255 sumextract = sumextract + onu_queue->tamextract; 00256 //ev<<" Suma total de Bytes Extraidos-> "<<sumextract<<"Bytes"<<endl; 00257 // SUMA TOTAL DEL TAMANYO DE LOS PAQUETES EXTRAIDOS EN LA COLA EN LA QUE NOS ENCONTRAMOS Y LO VISUALIZAMOS POR PANTALLA 00258 sumqueuepop[i] = sumqueuepop[i] + onu_queue->tamextract; 00259 //ev<<" Suma total de Bytes Extraidos de la cola "<<i<<"-> "<<sumqueuepop[i]<<"Bytes"<<endl; 00260 } 00261 else if(reportmsg->getBandwitch(i) < sumpacket[i] + reportmsg->getByteLength()) 00262 { 00263 // SI EL ANCHO DE BANDA ASIGNADO ES MENOR, NO SE EXTRAEN MAS PAQUETES 00264 //ev<<" No extraemos más paquetes porque no entra en el Ancho de Banda de Slot."<<endl; 00265 break; // SALIMOS DEL BUCLE FOR QUE RECORRE TODOS LOS PAQUETES DE LA COLA EN LA QUE NOS ENCONTRAMOS 00266 } 00267 } 00268 } 00269 } 00270 00271 00272 // RESTAMOS EL TAMANYO DE LOS PAQUETES QUE HEMOS EXTRAIDO A LA SUMA DEL TAMANYO DE LOS PAQUETES DE LAS COLAS 00273 tamsumqueue = tamsumqueue - sumextract; 00274 00275 //ev<<" "<<endl; 00276 //ev<<" Actualizamos el tamaño de las colas y lo reescribimos en el Report."<<endl; 00277 00278 // ACTUALIZAMOS EL VALOR DE LAS COLAS QUE LLEVARA EL REPORT HASTA EL OLT Y LO VISUALIZAMOS POR PANTALLA 00279 for(int i=0; i<(int)par("numqueue"); i++) 00280 { 00281 // VARIABLES PARA PODER ENTRAR DESTE ESTE MODULO AL MODULO ONU_SISTQUEUE Y PODER OBTENER INFORMACION SOBRE LAS COLAS 00282 cModule *c_onu_queue; 00283 c_onu_queue = getParentModule()->getParentModule()->getSubmodule("onu_squeue")->getSubmodule("onu_sistqueue",i); 00284 onu_queue = check_and_cast<ONU_SISTqueue *>(c_onu_queue); 00285 00286 // VISUALIZAMOS POR PANTALLA EL TAMANYO DE LAS COLAS Y LO INTRODUCIMOS EN EL PAQUETE REPORT PARA MANDARLO HACIA EL OLT 00287 //ev<<" Tamaño cola "<<i<<"-> "<<onu_queue->tamqueue[i]<<"Bytes"<<endl; 00288 reportmsg->setQueue_estado(i,onu_queue->tamqueue[i]); 00289 //reportmsg->setQueue_size(i,(int)onu_queue->queue.getLength()); // INTRODUCIMOS EL VALOR OBTENIDO ANTERIORMENTE PARA MANDARLO EN EL PAQUETE REPORT 00290 bytes_queue[i] = reportmsg->getQueue_estado(i); // INTRODUCIMOS EN LA VARIABLE bytes_queue[] EL VALOR DEL TAMANYO DE LOS BYTES QUE QUEDAN LA COLA 00291 //ev<<" Bytes que quedan en la cola"<<i<<": "<<bytes_queue[i]<<endl; // VISUALIZAMOS EL VALOR POR PANTALLA 00292 } 00293 00294 // CALCULAMOS LA MEDIA DE LOS BYTES QUE SE QUEDAN EN LA COLA CADA CICLO 00295 if(simTime()>=1) 00296 { 00297 // BUCLE FOR PARA RECORRER TODAS LAS COLAS QUE TENGAMOS Y GUARDAR EN LA VARIABLE media[] LOS BYTES QUE QUEDAN EN LAS COLAS DESPUES DE CADA CICLO 00298 // BUCLE FOR PARA RECORRER TODAS LAS COLAS QUE TENGAMOS Y GUARDAR EN LA VARIABLE media[] LOS BYTES QUE QUEDAN EN LAS COLAS DESPUES DE CADA CICLO 00299 for(int i=0; i<(int)par("numqueue"); i++) 00300 { 00301 media[i] = bytes_queue[i]; // GUARDAMOS EN LA VARIABLE media[] LOS BYTES QUE QUEDAN EN LAS COLAS DESPUES DE CADA CICLO 00302 media_bytes_queue[i].analyze(media[i]); 00303 } 00304 00305 // SI QUEREMOS QUE LA SIMULACION TERMINE Y LLAME A LA FUNCION FINISH() PARA RECOGER LAS ESTADASTICAS DE LA MEDIA DE LOS 00306 // BYTES QUE QUEDAN EN LAS COLAS DESPUES DE CADA CICLO. 00307 // PARA PARAR LA SIMULACION EL VALOR DEL NUMERO DE ITERACIONES DE LA CLASE ANALISIS DEL PARAMETRO QUE CALCULA LA MEDIA 00308 // DEBE SER IGUAL O MAYOR AL QUE INTRODUZCAMOS MANUALMENTE 00309 // DEPENDIENDO DEL NUMERO DE COLAS QUE TENGAMOS, DEBEMOS INTRODUCIR LAS VARIABLES CORESPONDIENTES 00310 00311 //if( media_bytes_queue[0].number_iterations() >= 30) 00312 //{ 00313 // endSimulation(); // LLAMAMOS A LA FUNCION TERMINAR SIMULACION 00314 // callFinish(); // LLAMAMOS A LA FUNCION FINISH() 00315 //} 00316 } 00317 00318 //ENVIAMOS EL PAQUETE REPORTR HACIA LA COLA DE ALMACENAMIENTO DE ESTOS PAQUETES DESPUES DE ACTUALIZAR EL ESTADO DE LAS COLAS 00319 send(reportmsg, "rxqueuereportOut");//, (int)par("numqueue")); 00320 00321 } 00322 00323 void ONU_Rx_Report::finish() 00324 { 00325 00326 // RECOGIDA DE ESTADISTICAS DE LAS MEDIAS DE LOS BYTES QUE QUEDAN EN LAS COLAS DESPUES DE CADA CICLO CON LA CLASE ANALISIS Y LO GUARDAMOS LOS DATOS EN UN ARCHIVO 00327 // SE PONE LA RUTA DONDE SE VAN A CREAR LOS ARCHIVOS 00328 media_queue_onu=fopen("results/media_queue_onu.txt", "a+"); // ABRIMOS EL ARCHIVO EN EL QUE GUARDAREMOS LOS RESULTADOS 00329 if(this->getParentModule()->getParentModule()->getIndex()==0) 00330 { 00331 fprintf(media_queue_onu,"Cantidad promedio de Bytes que quedan en las colas tras cada ciclo: \n"); 00332 for(int i=0; i<(int)par("numqueue"); i++) 00333 { 00334 fprintf(media_queue_onu,"P%i \t\t\t",i); 00335 } 00336 fprintf(media_queue_onu,"\n"); 00337 } 00338 for(int i=0; i<(int)par("numqueue"); i++) 00339 { 00340 fprintf(media_queue_onu,"%g\t", (double)media_bytes_queue[i].average()); // MEDIA DE LOS BYTES QUE QUEDAN EN LAS COLAS DESPUES DE CADA CICLO 00341 } 00342 fprintf(media_queue_onu,"\n"); 00343 fclose(media_queue_onu); // CERRAMOS EL ARCHIVO EN EL QUE GUARDAMOS LOS DATOS 00344 } 00345 00346