MAC_ONU Class Reference

#include <MAC_ONU.h>

Inheritance diagram for MAC_ONU:

cSimpleModule cModule cComponent cDefaultList cNoncopyableOwnedObject cOwnedObject noncopyable cNamedObject cObject

List of all members.

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_Tableonutable_module
int lambda


Detailed Description

Definition at line 28 of file MAC_ONU.h.


Member Function Documentation

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]

Reimplemented from cComponent.

Definition at line 26 of file MAC_ONU.cc.

00026 {return 1;}


Member Data Documentation

Definition at line 42 of file MAC_ONU.h.

int MAC_ONU::lambda [private]

Definition at line 32 of file MAC_ONU.h.

Definition at line 43 of file MAC_ONU.h.

Definition at line 31 of file MAC_ONU.h.

Definition at line 40 of file MAC_ONU.h.

Definition at line 41 of file MAC_ONU.h.


The documentation for this class was generated from the following files:

Generated on Thu Nov 28 14:47:24 2013 for red_wireless by  doxygen 1.5.7.1