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 #include "BS_queue.h" 00011 #include "BS_table.h" 00012 #include "DATA_m.h" 00013 #include <string.h> 00014 /* 00015 * MODULO BS_queue: 00016 * Almacena en sus subcolas (tantas como prioridades de servicio) los paquetes cuyo 00017 * proximo destino es el que se indica en el parametro 'target', para luego transmitirlos 00018 * cuando se tiene el testigo, siguiendo el metodo de extraccion de paquetes de prioridad 00019 * estricta. 00020 * La gestion del paso del testigo se realiza de forma centralizada con el módulo BS_MAC. 00021 * En cada módulo compuesto BS hay tantos módulos BS_queue como BSs hay en la red. 00022 */ 00023 Define_Module(BS_queue) 00024 ; 00025 00027 //FUNCION INITIALIZE()--> ESTA FUNCION SE INVOCA DESPUES DE QUE OMNET++ HA PUESTO EN MARCHA LA RED, EN LA CUAL SE LEEN LOS // 00028 // PARIMETROS DEL MODULO Y SE INICIALIZAN TODAS DAS LAS VARIABLES DECLARADAS PARA ESTE MODULO SIMPLE, SE // 00029 // ASIGNAN ESTRUCTURAS DE DATOS DINIMICOS Y SE ASIGNAN E INICIALIZAN LOS AUTOMENSAJES SI SON NECESARIOS // 00030 // PARA EL FUNCIONAMIENTO DE ESTE MODULO. // 00032 void BS_queue::initialize() 00033 { 00034 // Se incluyen en la topologia los nodos que contienen el parametro 'aux' (Users, BSs y ONUs): 00035 top.extractByParameter("aux"); 00036 // Se extrae el nodo correspondiente al modulo compuesto que contiene este submodulo: 00037 cModule *origen = (cModule*) this->getParentModule(); 00038 top_node = top.getNodeFor(origen); 00039 00041 Tabla = check_and_cast<BS_table *> (getParentModule()->getSubmodule("bs_table")); 00042 00043 // Obtencion parametros del fichero omnetpp.ini: 00044 //int indice = (int) this->getParentModule()->par("indice"); // Indice de la BS 00045 //int indice = (int) this->getParentModule()->getIndex(); // Indice de la BS /////// CAMBIO_RED /////// 00046 int conexiones = (int) this->getParentModule()->par("conexiones"); // Numero de puertas de salida de la BS 00047 txrate = (double) this->par("tasabinaria"); // Tasa de transmision wireless (bps) 00048 prioridades = (int) this->getParentModule()->par("numcolas"); // Numero de colas (clases de servicio) 00049 00050 // Inicializacion de variables: 00051 int links = top_node->getNumOutLinks(); // Total conexiones con usuario/onu/BSs 00052 int link_2 = links-1; //Total conexiones onu/BSs 00053 colas_salida = link_2; // Numero de posibles modulos BS_queue[] en uso 00054 colas_totales = conexiones-1; // Numero de modulos BS_queue que contiene en total cada BS 00055 used_bs_queues = 0; 00056 paquetes_recibidos = 0; // Cantidad de paquetes recibidos 00057 volcado = 0; // Variable auxiliar para entrar en la funcion VolcadoFicheros() 00058 contador = 0; // Variable auxiliar para gestionar la inactividad de una BS_queue 00059 remaining_bw = 0; // Ancho de banda sobrante en cada slot 00060 bw_left = 0; // Ancho de banda que aun queda para transmitir en cada slot 00061 bw_tx = 0; // Ancho de banda que se ha transmitido en un slot 00062 bw_tx_anterior = 1; // Ancho de banda que se ha transmitido en el solt anterior 00063 time_tx = 0; // Tiempo de slot consumido para transmitir 00064 time_resto = 0; // Tiempo de slot sobrante 00065 queue.resize(prioridades, 0); // Tantas subcolas como prioridades hay 00066 user_tamqueuepop.resize(prioridades, 0); // Longitud de los paquetes que se borran de cada cola 00067 user_tamqueueextract.resize(prioridades, 0); // Longitud de los paquetes que se checkean antes de sacarlos de cada cola 00068 user_tamextract.resize(prioridades, 0); // Longitud de los paquetes que se extraen de cada cola 00069 tamqueue.resize(prioridades, 0); // Longitud de cada una de las colas (inicialmente, 0 Bytes) 00070 sumcheckedpacket = 0; // Suma de los paquetes checkeados en el metodo de extraccion con prioridad estricta 00071 sumextractedpacket = 0; // Suma de los paquetes extraidos en el metodo de extraccion con prioridad estricta 00072 tamsumcola = 0; // Suma de la longitud de los paquetes que llegan a las colas de la BS_queue 00073 sumpaquete.resize(prioridades, 0); // Suma de los paquetes checkeados en las colas 00074 sumcolapop.resize(prioridades, 0); // Suma total de bytes extraidos de las colas 00075 bytes_cola.resize(prioridades, 0); //Bytes que quedan en las colas tras cada ciclo 00076 Testigo = 0; // Variable para la gestion de los tiempos de slot (TDMA) 00077 Interval = 0.0; // Intervalo de transmision permitido en cada slot (tiepo actual + tiempo de slot) 00078 00079 // Si el enlace num.1 conecta con una ONU, es una pasarela: 00080 if(strcmp(top_node->getLinkOut(1)->getRemoteNode()->getModule()->getName(),"onu")==0) 00081 { 00082 esPasarela = 1; 00083 link_2 = link_2-prioridades; 00084 if(this->getIndex() == 0) 00085 { 00086 //ev << " La estacion base " << origen->getFullName() << " es una pasarela con la parte optica." << endl; 00087 00088 } 00089 } 00090 else 00091 { 00092 esPasarela = 0; 00093 if (this->getIndex() == 0) 00094 { 00095 //ev << " La estacion base " << origen->getFullName() << " no es una pasarela con la parte optica." << endl; 00096 } 00097 } 00098 00099 if (this->getIndex() == 0) 00100 { 00101 // Numero de interfaces de salida del BS que estan en uso: 00102 //ev << " Numero total de conexiones con otras estaciones base: " << link_2 << endl; 00103 //ev << " Total prioridades de servicio de los usuarios: " << prioridades << endl; 00104 // Cuantas conexiones externas con BSs/usuarios/ONU hay? 00105 //ev << " **CONEXIONES DE LA ESTACION BASE n." << indice << "** " << endl; 00106 } 00107 /* 00108 for (int j = 0; j < links; j++) 00109 { 00110 // NOTA: Indices del array de parametros de los canales inalambricos: 00111 // par(0): isEnabled (bool) --> POR DEFECTO 00112 // par(1): delay (s) --> NULO 00113 // par(2): longitud (double) 00114 // par(3): peso (double) --> Inicialmente 0.0, cambia con DARA. 00115 // par(4): retardo_propagacion (double) --> longitud/3ˇ10e8. 00116 top_node->getLinkOut(j); 00117 if (this->getIndex() == 0) 00118 { 00119 char* nombre_nodo = (char*) top_node->getLinkOut(j)->getRemoteNode()->getModule()->getFullName(); 00120 char* nombre_canal = (char*) (check_and_cast<cDelayChannel*>(top_node->getLinkOut(j)->getLocalGate()->getChannel()))->getComponentType()->getName(); 00121 char* nombre_longitud = (char*) (check_and_cast<cDelayChannel*>(top_node->getLinkOut(j)->getLocalGate()->getChannel()))->par(2).getFullName(); 00122 double longitud = (double) (check_and_cast<cDelayChannel*>(top_node->getLinkOut(j)->getLocalGate()->getChannel()))->par(2); 00123 double retardo = (double) (check_and_cast<cDelayChannel*>(top_node->getLinkOut(j)->getLocalGate()->getChannel()))->par(4); 00124 ev << " CANAL '" << nombre_canal << "': " << origen->getFullName() << "<-->" << nombre_nodo << endl; 00125 // Visualizacion 00126 ev << " Longitud ('" << nombre_longitud << "'): " << longitud << " metros" << endl; 00127 ev << " Retardo de propagacion: " << retardo << " segundos." << endl; 00128 } 00129 } 00130 */ 00131 // Si es una BS_queue[] que puede contener paquetes destinados a alguna BS/onu, 00132 // se asigna el target, esto es, el nombre de la BS/ONU destino de los paquetes 00133 // que va a almacenar: 00134 if (this->getIndex() < colas_salida) 00135 { 00136 int j = 1, fin = -1; 00137 char* nombre_cola; 00138 this->setTarget(" "); // Objetivo en blanco 00139 00140 while (j < links && fin < 0) 00141 { 00142 nombre_cola = (char*) top_node->getLinkOut(j)->getRemoteNode()->getModule()->getFullName(); 00143 if (this->getIndex() == 0 || se_repite(nombre_cola) == 0) 00144 { 00145 // Si es el modulo BS_queue[0] o no aparece ya este nodo como Target de otro modulo BS_queue[] de esta BS, 00146 // se asigna como Target a este modulo BS_queue[] el nombre del nodo al otro extremo del enlace con el que 00147 // se asocia este modulo BS_queue[]: 00148 this->setTarget(nombre_cola); 00149 fin = 1; 00150 } 00151 j++; 00152 } 00153 // Si al final del bucle, a este modulo BS_queue[] no se le ha asignado Target, entonces 00154 // es que no se va a usar: 00155 if (strcmp(this->getTarget(), " ") == 0) 00156 { 00157 //ev << " *COLA EN DESUSO* " << endl; 00158 uso = 0; // Esta cola no se va a usar nunca porque no se asocia con nigun enlace de salida de esta BS 00159 usado = 0; // Esta cola no esta activa 00160 } 00161 else 00162 { 00163 //ev << " Cola BS para recibir los mensajes destinados al nodo " << this->getTarget() << endl; 00164 uso = 1; // Esta cola puede ser usada porque corresponde a un enlace entre esta BS y otro nodo (este parametro siempre va a estar a 1) 00165 usado = 1; // Inicialmente se considera que esta cola esta siendo usada (si luego resulta que no recibe paquetes, puede ponerse a cero esta variable y considerarse cola no activa). 00166 if(esPasarela == 1 && getIndex()!=0) 00167 { 00168 usado = 0; // Si es una pasarela, en realidad solo se usa la cola que conecta con la ONU. 00169 } 00170 } 00171 } 00172 else 00173 { 00174 //ev << " *COLA EN DESUSO* " << endl; 00175 uso = 0; 00176 usado = 0; 00177 } 00178 } 00179 00181 //FUNCION HANDLEMESSAGE(CMESSAGE *MSG)--> ESTA FUNCION SE INVOCA CON EL MENSAJE COMO PARAMETRO CADA VEZ QUE EL MODULO RECIBE UN // 00182 // UN MENSAJE O PAQUETE. SE RECORRE EL CODIGO IMPLEMENTADO PARA DEVOLVER UN VALOR O // 00183 // EJECUTAR UNA FUNCION DENTRO DEL MODULO SIMPLE. EL TIEMPO DE SIMULACION NO TRANSCURRE // 00184 // DENTRO DE LA LLAMADA DE LA FUNCION HANDLEMESSAGE(CMESSAGE *MSG) MIENTRAS RECORRE EL // 00185 // CODIGO IMPLEMENTADO. // // 00187 void BS_queue::handleMessage(cMessage *msg) { 00188 int type = msg->getKind(); 00189 switch (type) 00190 { 00191 case 12: // Paquete 'Datos' (mensajes de usuarios wireless) 00192 if(type==12) 00193 { 00194 DATA *msjdatos = check_and_cast<DATA*>(msg); 00195 if(uso == 0) 00196 { 00197 //ev << "ERROR!!!" << endl; 00198 delete msjdatos; 00199 } 00200 if(usado == 0 && uso == 1) 00201 { 00202 usado = 1; 00203 contador = 0; 00204 } 00205 00207 // Introducimos el paquete en la cola de prioridad correspondiente: 00208 tamqueue[msjdatos->getPriority()] = tamqueue[msjdatos->getPriority()] + msjdatos->getByteLength(); 00209 msjdatos->setTime_enter_queue(simTime()); 00210 queue[msjdatos->getPriority()].insert(msjdatos); 00211 } 00212 break; 00213 default: 00214 delete msg; 00215 //ev << " MENSAJE BORRADO" << endl; 00216 break; 00217 } 00218 } 00219 00221 //FUNCION GETTARGET()--> DEVUELVE EL VALOR DEL PARAMETRO TARGET, VARIABLE GLOBAL DE BS_QUEUE / 00223 const char * BS_queue::getTarget() const { 00224 return target.c_str(); 00225 } 00227 //FUNCION SETTARGET(CONST CHAR * TARGET)--> MODIFICA EL VALOR DE TARGET, VARIABLE GLOBAL DE BS_QUEUE / 00229 void BS_queue::setTarget(const char * target) { 00230 this->target = target; 00231 } 00232 00234 //FUNCION SEREPITE(CHAR* NOMBRE)--> COMPRUEBA SI LA CADENA 'nombre' COINCIDE CON EL TARGET DE ALGUN MODULO / 00235 // BS_QUEUE ANTERIOR. DEVUELVE 0 SI ES LA PRIMERA VEZ QUE SE USA 'nombre' / 00236 // Y 1 EN CASO CONTRARIO. / 00238 int BS_queue::se_repite(char* nombre) { 00239 int k = 0, repetido = 0; 00240 while (k < this->getIndex() && repetido == 0) 00241 { 00242 BS_queue *cola_previa; 00243 cola_previa = check_and_cast<BS_queue*>(this->getParentModule()->getSubmodule("bs_queue", k)); 00244 if (strcmp(nombre, cola_previa->getTarget()) == 0) 00245 { 00246 repetido = 1; 00247 } 00248 k++; 00249 } 00250 return repetido; 00251 } 00252 00254 //FUNCION STRICTPRIORITYQUEUE()--> METODO DE EXTRACCION DE PAQUETES EN LAS COLAS TENIENDO EN CUENTA LA PRIORIDAD. / / 00256 void BS_queue::strictpriorityqueue() { 00257 //ev << " **Metodo de extraccion de paquetes en colas con prioridad estricta**" << endl; 00258 // Se recorren todas las colas 'cQueue' para ver si tienen paquetes y extraer los Bytes que se puedan: 00259 int i = 0, salir = -1; // 00260 while (i < prioridades && salir < 0) { 00261 // Se comprueba que la cola i tiene contiene paquetes y se compara el 00262 // ancho de banda total con la suma de todos los paqutes extraidos: 00263 if (queue[i].getLength() > 0 && bandwidth >= sumcheckedpacket) { 00264 // ... Si el BW es mayor que los bytes extraidos Y quedan paquetes en la cola i, se extraen paquetes: 00265 int acabar = -1; // 00266 while (queue[i].getLength() > 0 && acabar < 0) { 00267 // Llamada a la funcion 'chequeoPaquete()' para ver si podemos extraerlo: 00268 chequeoPaquete(i); 00269 //ev << " Suma de los paquetes chequeados: " << sumcheckedpacket << " Bytes" << endl; 00270 // Se comprueba el ancho de banda de la cola con la suma de los paquetes extraidos (y este ultimo): 00271 if (bandwidth >= sumcheckedpacket) { 00272 // ... si el BW es mayor, se extrae un paquete 'DATA' y se envia: 00273 //ev << " EXTRACCION y ENVIO de un paquete inalambrico de prioridad P" << i << " al siguiente nodo: " << this->getTarget() << endl; 00274 // Llamada a la funcion para extraer paquetes: 00275 envioPaquete(i); 00276 } else if (bandwidth < sumcheckedpacket) { 00277 // ... Si el BW es menor, no se extraen mas paquetes: 00278 //ev << " NO se extraen mas paquetes porque no entra en el ancho de banda de slot de la cola P" << i << endl; 00279 acabar = 1; // 00280 salir = 1; // 00281 // Salida del bucle que recorre los paquetes de la cola i 00282 } 00283 } 00284 } else if (bandwidth < sumcheckedpacket) 00285 { 00286 // ... Si el BW es menor que los bytes extraidos: 00287 tamsumcola = tamsumcola - sumextractedpacket; // RESTAMOS EL TAMANYO DE LOS PAQUETES QUE HEMOS EXTRAIDO A LA SUMA DEL TAMANYO DE LOS PAQUETES DE LAS COLAS 00288 //ev << " NO se envian mas paquetes porque con el ultimo que se ha checkeado se excede el ancho de banda disponible(" << bandwidth << ")." << endl; 00289 salir = 1; // 00290 } 00291 i++; 00292 } 00293 // Si se han recorrido todas las colas, y aun queda BW para transmitir: 00294 if (bandwidth >= sumcheckedpacket) 00295 { 00296 // Se restan los bytes de los paquetes extraidos a la suma de bytes en las colas: 00297 tamsumcola = tamsumcola - sumextractedpacket; 00298 //ev << " NO se envian mas paquetes porque las colas estan vacias." << endl; 00299 } 00300 } 00301 00303 //FUNCION CENTRALIZEDMETHOD()--> METODO CENTRALIZADO DE EXTRACCION DE PAQUETES EN LAS COLAS. / / 00305 void BS_queue::centralizedmethod() { 00306 //ev << " **Metodo centralizado de extraccion de paquetes de las colas**" << endl; 00307 double capacidad_real = (double) bandwidth/prioridades; 00308 // Se recorren todas las colas 'cQueue' para ver si tienen paquetes y extraer los Bytes que se puedan: 00309 int i = 0, salir = -1; // 00310 while (i < prioridades && salir < 0) 00311 { 00312 sumpaquete[i] = 0; // Suma de los paquetes checkeados en las colas 00313 sumcolapop[i] = 0; // Suma de los bytes extraidos de las colas 00314 // Se comprueba que la cola i tiene contiene paquetes y se compara el 00315 // ancho de banda total con la suma de todos los paqutes extraidos: 00316 if (queue[i].getLength() > 0 && capacidad_real >= sumpaquete[i]) 00317 { 00318 // ... Si el BW es mayor que los bytes extraidos Y quedan paquetes en la cola i, se extraen paquetes: 00319 int acabar = -1; // 00320 while (queue[i].getLength() > 0 && acabar < 0) 00321 { 00322 // Llamada a la funcion 'chequeoPaquete()' para ver si podemos extraerlo: 00323 chequeoPaquete(i); 00324 //ev << " Suma de los paquetes chequeados en la cola P" << i << ": " << sumpaquete[i] << " Bytes" << endl; 00325 // Se comprueba el ancho de banda de la cola con la suma de los paquetes extraidos (y este ultimo): 00326 if (capacidad_real >= sumpaquete[i]) 00327 { 00328 // ... si el BW es mayor, se extrae un paquete 'DATA' y se envia: 00329 //ev << " EXTRACCION y ENVIO de un paquete inalambrico de prioridad P" << i << " al siguiente nodo: " << this->getTarget() << endl; 00330 // Llamada a la funcion para extraer paquetes: 00331 envioPaquete(i); 00332 } 00333 else if (capacidad_real < sumpaquete[i]) 00334 { 00335 // ... Si el BW es menor, no se extraen mas paquetes: 00336 //ev << " NO se extraen mas paquetes porque no entra en el ancho de banda de slot de la cola P" << i << endl; 00337 acabar = 1; 00338 // Salida del bucle que recorre los paquetes de la cola i 00339 } 00340 } 00341 } 00342 else if (capacidad_real < sumpaquete[i]) 00343 { 00344 // ... Si el BW es menor que los bytes extraidos: 00345 tamsumcola = tamsumcola - sumextractedpacket; // RESTAMOS EL TAMANYO DE LOS PAQUETES QUE HEMOS EXTRAIDO A LA SUMA DEL TAMANYO DE LOS PAQUETES DE LAS COLAS 00346 //ev << " NO se envian mas paquetes porque con el ultimo que se ha checkeado se excede el ancho de banda disponible para esta subcola (" << capacidad_real << ")." << endl; 00347 salir = 1; // 00348 } 00349 i++; 00350 } 00351 // Si se han recorrido todas las colas, y aun queda BW para transmitir: 00352 if (bandwidth >= sumcheckedpacket) 00353 { 00354 // Se restan los bytes de los paquetes extraidos a la suma de bytes en las colas: 00355 tamsumcola = tamsumcola - sumextractedpacket; 00356 //ev << " NO se envian mas paquetes porque las colas estan vacias." << endl; 00357 } 00358 else if (bandwidth < sumcheckedpacket) 00359 { 00360 tamsumcola = tamsumcola - sumextractedpacket; // RESTAMOS EL TAMANYO DE LOS PAQUETES QUE HEMOS EXTRAIDO A LA SUMA DEL TAMANYO DE LOS PAQUETES DE LAS COLAS 00361 //ev << " NO se envian mas paquetes porque con el ultimo que se ha checkeado se excede el ancho de banda disponible(" << bandwidth << ")." << endl; 00362 } 00363 } 00364 00366 //FUNCION DELETEELEMENT(CMESSAGE *MSG, INT PRIORITY)--> ELIMINA UN PAQUETE DE LA COLA CON PRIORIDAD 'priority'. / / 00368 void BS_queue::deleteElement(cMessage *msg, int priority) { 00369 //ETHERNETmsg *msgdata = check_and_cast<ETHERNETmsg*>(msg); 00370 DATA *msgdata = check_and_cast<DATA*> (msg); 00371 // Extraccion del primer paquete ETHERNET de la cola de la prioridad indicada: 00372 //msgdata = (ETHERNETmsg *)queue[priority].pop(); 00373 msgdata = (DATA *) queue[priority].pop(); 00374 // Obtencion de la longitud del paquete extraido: 00375 user_tamqueuepop[priority] = (long) msgdata->getByteLength(); 00376 // Resta de los bytes del paquete borrado al total de bytes de esta cola: 00377 tamqueue[priority] = tamqueue[priority] - user_tamqueuepop[priority]; 00378 // Borrado del paquete 'DATA': 00379 //ev << " MENSAJE 'DATA' (Id." << msgdata->getId() << ") BORRADO" << endl; 00380 delete msgdata; 00381 } 00382 00384 //FUNCION CHEQUEOPAQUETE(INT INDEX)--> CHEQUEA LOS PAQUETES AL PRINCIPIO DE LA COLA DE PRIORIDAD 'index' / 00385 // PARA SABER SU LONGITUD EN BYTES. / 00387 void BS_queue::chequeoPaquete(int index) 00388 { 00389 //ETHERNETmsg *msgdata; 00390 DATA *msgdata; 00391 // Obtencion de informacion del primer paquete de la cola 'index', sin extraerlo: 00392 //msgdata = (ETHERNETmsg *)queue[index].front(); 00393 msgdata = (DATA *) queue[index].front(); 00394 // Almacenamiento en la posicion 'index' de la variable 'user_tamqueueextract' de la longitud del paquete: 00395 user_tamqueueextract[index] = (long) msgdata->getByteLength(); 00396 // Suma de los paquetes chequeados: 00397 //sumcheckedpacket = sumcheckedpacket + user_tamqueueextract[index]; 00398 sumcheckedpacket = sumcheckedpacket + (long) msgdata->getByteLength(); 00399 sumpaquete[index] = sumpaquete[index] + (long) msgdata->getByteLength(); 00400 } 00401 00403 //FUNCION ENVIOPAQUETE(INT PRIORITY)--> EXTRAE UN PAQUETE DEL PRINCIPIO DE LA COLA DE PRIORIDAD 'priority'. / 00405 void BS_queue::envioPaquete(int priority) 00406 { 00407 //ETHERNETmsg *msgdata; 00408 DATA *msgdata; 00409 int num_puertas = (int) this->getParentModule()->gateSize("physicalBS"); 00410 double distancia = 0, Ddistancia = 0; 00411 00412 // Extraccion del primer paquete de la cola de indice 'priority': 00413 take(msgdata = (DATA *) queue[priority].pop()); 00416 // Almacenamiento en la posicion 'priority' de la variable 'user_tamextract' de la longitud del paquete: 00417 user_tamextract[priority] = msgdata->getByteLength(); 00418 // Almacenamiento en la posicion 'priority' de la variable 'user_tamqueuepop' de la longitud del paquete: 00419 user_tamqueuepop[priority] = msgdata->getByteLength(); 00420 // Resta de la longitud del paquete extraido a la longitud de la cola 'priority': 00421 tamqueue[priority] = tamqueue[priority] - msgdata->getByteLength(); 00422 // Suma de la longitud del paquete a los paquetes extraidos de esta cola: 00423 sumextractedpacket = sumextractedpacket + msgdata->getByteLength(); 00425 // Suma total de los bytes de los paquetes extraidos de la cola i, y visualizacion: 00426 sumcolapop[priority] = sumcolapop[priority] + msgdata->getByteLength(); 00428 // Actualizacion del ancho de banda disponible durante este slot: 00429 bw_left = bw_left - msgdata->getByteLength(); 00431 00432 // Busqueda del destino de este paquete 'DATA': 00433 char* nombre_puerta; 00434 cModule *destino; 00435 int x = 0, indice = -1; 00436 while (x < num_puertas && indice < 0) { 00437 if (this->getParentModule()->gate("physicalBS$o", x)->isConnected()) 00438 { 00439 nombre_puerta = (char*) this->getParentModule()->gate("physicalBS$o", x)->getNextGate()->getOwnerModule()->getFullName(); 00440 if (strcmp(this->getTarget(), nombre_puerta) == 0) 00441 { 00442 destino = this->getParentModule()->gate("physicalBS$o", x)->getNextGate()->getOwnerModule(); 00443 indice = x; 00444 } 00445 } 00446 x++; 00447 } 00448 msgdata->setOrigen(this->getParentModule()->getFullName()); 00449 distancia = (double) this->getParentModule()->gate("physicalBS$o", indice)->getChannel()->par(2); 00450 msgdata->setDestino(destino->getFullName()); 00451 if(strcmp(destino->getModuleType()->getName(),"BS")==0) 00452 { 00453 msgdata->setDestAddress(destino->par("indice")); 00454 //msgdata->setDestAddress(destino->getIndex()); /////// CAMBIO_RED /////// 00455 } 00456 else 00457 { 00458 msgdata->setDestAddress(destino->getIndex()); 00459 } 00460 Ddistancia = distancia + (double) msgdata->getMetros(); 00461 msgdata->setMetros(Ddistancia); 00462 int saltos = msgdata->getSaltos() + 1; 00463 msgdata->setSaltos(saltos); 00464 send(msgdata, "bsqueueInOut$o"); 00465 } 00466 00468 //FUNCION VOLCADOFICHEROS()--> ESCRIBE EN UNO O VARIOS FICHEROS DE TEXTO LOS DATOS DE MAYOR INTERES DE LA / 00469 // SIMULACION, PARA SU POSTERIOR ANALISIS. / 00471 void BS_queue::volcadoFicheros() { 00472 volcado = 1; 00473 if (usado == 1) // Si es una cola que esta siendo usada, esto es, se considera activa: 00474 { 00475 // 'LONGITUD_COLAS': NUMERO TOTAL DE PAQUETES PRESENTES EN CADA SUBMODULO BS_QUEUE[], ASOCIADO A UN ENLACE SALIENTE ACTIVO, DE CADA BS. 00476 Longitud_colas = fopen("results/Longitud_colas.txt", "a+"); 00477 for (int p=0; p<prioridades; p++) 00478 { 00479 fprintf(Longitud_colas, "%s.BS_queue[%i] -> Paquetes: %li \t Bytes: %li\n", this->getParentModule()->getFullName(), this->getIndex(), (long int) queue[p].getLength(), (long int) tamqueue[p]); 00480 } 00481 fclose(Longitud_colas); 00482 } 00483 } 00484 00486 //FUNCION FINISH()--> ESTA FUNCION SE INVOCA CUANDO LA SIMULACION HA TERMINADO CON EXITO SIN QUE SE PRODUZCA NINGUN ERROR. // 00487 // LO USAMOS PARA LA RECOGIDA DE ESTADASTICAS Y VISUALIZACION POR PANTALLA O MEDIANTE UN ARCHIVO. // 00489 void BS_queue::finish() { 00490 volcadoFicheros(); 00491 }