📄 simple.cpp
字号:
#include "simple.h"
#include "cProbeMsg_m.h"
Define_Module( recei );
double nblock[100],totalreq[100];
bool test[100];
int wgtable[50][100][10];
void recei::activity()
{
for(;;)
{
packet *msg=(packet *)receive();
ev << "Received from:" << msg->getSnode() << endl;
int dur=msg->getPdelay();
send(msg,"rout");
}
}
Define_Module( proce );
void proce::activity()
{
int nodeid=par("nodeID");
for(;;)
{
packet *msg=(packet *)receive();
int dur=msg->getPdelay();
if (nodeid==msg->getDnode()) delete msg;
else
{ send( msg, "pout");
};
}
}
Define_Module( gene );
void gene::activity()
{
int nodeid=par("nodeID");
int numnode=par("num_node");
cPar& IaTime = par("interArrivalTime" );
cPar& duration = par("holdTime" );
for(;;)
{
totalreq[nodeid]++;
char msgname[70];
ev << "Generating " << msgname << endl;
int desnode=(int)intuniform(0,numnode-1,nodeid);
int timeout=poisson(10, 0);
//simtime_t duration=(simtime_t)timeout;
//duration=strToSimtime("60s");
//t duration=timeout;
while (desnode==nodeid)
{
desnode=(int)intuniform(0,numnode-1,0);
};
sprintf( msgname, "From-%d to -%d",nodeid, desnode);
packet *msg=new packet(msgname);
msg->setSnode(nodeid);
msg->setDnode(desnode);
msg->setPdelay(duration);
msg->setTimestamp();
send( msg, "gout");
wait(IaTime);
};
}
Define_Module(trans);
void trans::initialize()
{
int nodeid= parentModule()->par("nodeID");
int numnode=par("num_node");
int nwavelength=par("nwavelength");
test[nodeid]=true;
for (int i=0;i<numnode;i++)
for (int j=0;j<nwavelength;j++)
{
wgtable[nodeid][i][j]=1; //available
};
//Reset all
for (i=0;i<numnode;i++)
{
nblock[i]=0;
totalreq[i]=0;
};
//
// Brute force approach -- every node does topology discovery on its own,
// and finds routes to all other nodes independently, at the beginning
// of the simulation. This could be improved: (1) central routing database,
// (2) on-demand route calculation
//
cTopology *topo = new cTopology("topo");
topo->extractByModuleType(parentModule()->className(), NULL);
ev << "cTopology found: " << topo->nodes() << " nodes\n";
cTopology::Node *thisNode = topo->nodeFor(parentModule());
// find and store next hops
for (i=0; i<topo->nodes(); i++)
{
if (topo->node(i)==thisNode) continue; // skip ourselves
topo->unweightedSingleShortestPathsTo(topo->node(i));
if (thisNode->paths()==0) continue; // not connected
cGate *parentModuleGate = thisNode->path(0)->localGate();
/*int gateId = parentModuleGate->fromGate()->id();
char *full=(char*)parentModuleGate->fullName();
if nodeid<10 int gateId=atoi(&full[5]);
else int gateId=atoi(&full[5]);
*/
int gateId=thisNode->path(0)->remoteNode()->module()->par("nodeID");
int address = topo->node(i)->module()->par("nodeID");
rtable[address] = gateId;
ev << " towards address " << address << " gateId is " << gateId << endl;
}
delete topo;
}
void trans::activity()
{
int nodeid=par("nodeID");
int gate1,num;
int myAddress = nodeid;
double timerec[100][10];
int numnode=par("num_node");
int nwavelength=par("nwavelength");
int Isconvert=par("convert"); // indicate the node whether has WC or not
/*sTopoLinkOut *path=NULL;
cTopology *topo = new cTopology("topo");
topo->extractByModuleType(parentModule()->className(), NULL);
ev << "cTopology found: " << topo->nodes() << " nodes\n";
ev << "Parentmodule:" << parentModule()->className() << " \n";
int dur=0;
cTopology::Node *thisNode = topo->nodeFor(parentModule());
for(;;)
{
packet *msg=(packet *)receive();
int desnode=msg->getDnode()-1;
ev << "This node:" << topo->node(nodeid-1)->module()->par("nodeID") << " \n";
topo->unweightedSingleShortestPathsTo(topo->node(desnode));
if (thisNode->paths()==0)
{
delete msg;
nblock=nblock+1;
ev<< "number of packets have been block:"<<nblock<<"\n";
continue; // not connected
}
cGate *parentModuleGate = thisNode->path(0)->localGate();
int gateId = parentModuleGate->toGate()->id();
int address = topo->node(desnode)->module()->par("nodeID");
ev << "Target node:" << address << " \n";
char *full=(char*)parentModuleGate->fullName();
gateId=atoi(&full[5]);
ev << "GateId:" <<gateId<<"\n";
send(msg,"tout",gateId);
ev<<"simstamp:"<<msg->timestamp()<<"\n";
if (dur<=simTime()-timerec)
{
dur=msg->getPdelay();
timerec=simTime();
if (path!=NULL) path->enable();
path = thisNode->path(0);
path->disable();
};
*/
packet *pk;
int destAddr,i,j;
bool found;
int dur;
for (;;)
{
pk=(packet *)receive();
int Cwavelength=pk->kind();
destAddr = pk->getDnode();
if (destAddr == myAddress)
{
ev << "local delivery of packet " << pk->name() << endl;
send(pk,"localOut");
continue;
}
RoutingTable::iterator it = rtable.find(destAddr);
if (it==rtable.end())
{
ev << "address " << destAddr << " unreachable, discarding packet "<< endl;
delete pk;
nblock[nodeid]=nblock[nodeid]+1;
ev<< "number of packets of node "<<nodeid<<" have been block:"<<nblock[nodeid]<<"\n";
continue;
}
int outGate = (*it).second;
ev << "forwarding packet " << " on gate id=" << outGate << endl;
//release wavelengths when it was no longer used
for (i=0;i<numnode;i++)
{
for (j=0;j<nwavelength;j++)
{
if ((timerec[i][j]<=simTime())&&(wgtable[nodeid][i][j]==0))
{wgtable[nodeid][i][j]=1; //available
ev<<"Wavelength:"<<j<<" at gate "<<i<<" of node "<<nodeid<<" is available!"<<endl;
};
};
};
dur=pk->getPdelay();
found=false; //variety indicate a wavelength not used
if (Isconvert==0)
{
if (wgtable[nodeid][outGate][Cwavelength]==1)
{
wgtable[nodeid][outGate][Cwavelength]=0;
timerec[outGate][Cwavelength]=simTime()+dur;
found=true;
j=Cwavelength;
ev<<"Wavelength:"<<j<<" at gate "<<outGate<<" of node "<<nodeid<<" is used"<<endl;
};
}
else
{
for (j=0;j<nwavelength;j++)
{
if (wgtable[nodeid][outGate][j]==1)
{
wgtable[nodeid][outGate][j]=0;
timerec[outGate][j]=simTime()+dur;
found=true;
ev<<"Wavelength:"<<j<<" at gate "<<outGate<<" of node "<<nodeid<<" is used"<<endl;
break;
};
};
};
if (found==false) {
delete pk;
nblock[nodeid]=nblock[nodeid]+1;
ev<< "number of packets have been blocked:"<<nblock[nodeid]<<"\n";
continue;}
pk->setKind(j);
send(pk,"tout", outGate);
}
}
void trans::finish()
{
int nodeid=par("nodeID");
int numnode=par("num_node");
int nwavelength=par("nwavelength");
double total=0,block=0;
ev<< "----------------The report of node "<<nodeid<<" ------------------ \n";
ev<< "number of packets have been blocked:"<< nblock[nodeid]<<"\n";
ev<< "Total of packets:"<<totalreq[nodeid]<<"\n";
ev<< "Blocking Rate="<<nblock[nodeid]/totalreq[nodeid]<< "\n";
recordScalar("----------------The report of node ",nodeid);
recordScalar("Number of requirements = ",totalreq[nodeid]);
recordScalar("Number of blocked requirements= ",nblock[nodeid]);
recordScalar("Blocking Rate=",nblock[nodeid]/totalreq[nodeid]);
if (nodeid==numnode-1)
{ for (int i=0;i<numnode;i++)
{ total=total+totalreq[i];
block=block+nblock[i];
};
recordScalar("--------------------","The final report of all nodes---------------- ");
recordScalar("Total number of requirements = ",total);
recordScalar("Total number of blocked requirements= ",block);
recordScalar("Mean blocking Rate=",block/total);
//The final report of all nodes
ev<< "****************The report of all nodes **************************\n";
ev<< "Number of packets have been blocked:"<< block<<"\n";
ev<< "Total of packets:"<<total<<"\n";
ev<< "Blocking Rate="<<block/total<< "\n";
};
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -