#include <ConnectReaSE.h>
Public Member Functions | |
| virtual int | addOverlayNode (AccessInfo *overlayNode, bool migrate=false) |
| Gathers some information about the terminal and appends it to the overlay terminal vector. | |
| virtual AccessInfo | getAccessNode () |
| Getter for router module. | |
| virtual cModule * | removeOverlayNode (int ID) |
| Removes a node from the network. | |
| virtual cModule * | getOverlayNode (int ID) |
| searches overlayTerminal[] for a given node | |
| virtual AccessInfo | migrateNode (int ID) |
Protected Member Functions | |
| virtual int | numInitStages () const |
| OMNeT number of init stages. | |
| virtual void | initialize (int stage) |
| Gather some information about the router node. | |
| virtual void | handleMessage (cMessage *msg) |
| OMNeT handleMessage method. | |
| virtual void | updateDisplayString () |
| Displays the current number of terminals connected to the network. | |
Protected Attributes | |
| std::vector< std::string > | channelTypesRx |
| vector of possible access channels (rx) | |
| std::vector< std::string > | channelTypesTx |
| vector of possible access channels (tx) | |
| std::vector< terminalInfo > | overlayTerminal |
| the terminals at this access router | |
| cOutVector | lifetimeVector |
| vector of node lifetimes | |
| std::vector< autoSystem > | AS_Pool |
| std::vector< edgePool > | globalEdgePool |
| uint32 | totalCountOfAS |
| uint32 | nextPow |
| uint32 | ASShift |
| double | channelDiversity |
Private Member Functions | |
| cGate * | firstUnusedGate (cModule *owner, const char *name, cGate::Type type=cGate::NONE) |
| Returns a module's fist unconnected gate. | |
| void | setUpAS (cModule *currAS) |
| Gathers all needed edge router information of a specified autonomous system. | |
Static Private Member Functions | |
| static bool | extractFromParentModule (cModule *currModule, void *properties) |
| Finds submodules with special properties. | |
Definition at line 106 of file ConnectReaSE.h.
| int ConnectReaSE::addOverlayNode | ( | AccessInfo * | overlayNode, | |
| bool | migrate = false | |||
| ) | [virtual] |
Gathers some information about the terminal and appends it to the overlay terminal vector.
Definition at line 194 of file ConnectReaSE.cc.
Referenced by ReaSEUnderlayConfigurator::createNode(), and ReaSEUnderlayConfigurator::migrateNode().
{
Enter_Method("addOverlayNode()");
cModule* node = overlayNode->terminal;
terminalInfo terminal;
terminal.module = node;
terminal.interfaceTable = IPAddressResolver().interfaceTableOf(node);
terminal.remoteInterfaceTable = overlayNode->edge->interfaceTable;
terminal.routingTable = IPAddressResolver().routingTableOf(node);
terminal.PPPInterface = node->getSubmodule("ppp", 0);
terminal.createdAt = simTime();
terminal.IPAddress = overlayNode->IPAddress;
terminal.edgeRouter = overlayNode->edge;
terminal.ASindex = overlayNode->ASindex;
// update display
if (ev.isGUI()) {
const char* ip_disp = const_cast<char*>
(IPAddress(terminal.IPAddress).str().c_str());
terminal.module->getDisplayString().insertTag("t", 0);
terminal.module->getDisplayString().setTagArg("t", 0, ip_disp);
terminal.module->getDisplayString().setTagArg("t", 1, "l");
}
//find first unused interface
int k = 1;
while ( overlayNode->edge->Router->findSubmodule("ppp", k) != -1 )
k++;
cModuleType* pppInterfaceModuleType = cModuleType::get("inet.linklayer.ppp.PPPInterface");
terminal.remotePPPInterface = pppInterfaceModuleType->
create("ppp", overlayNode->edge->Router, 0, k);
overlayNode->edge->countPPPInterfaces++;
// connect terminal to access router and vice versa
cGate* routerInGate = firstUnusedGate(overlayNode->edge->Router, "pppg", cGate::INPUT);
cGate* routerOutGate = firstUnusedGate(overlayNode->edge->Router, "pppg", cGate::OUTPUT);
cChannelType* channelTypeRx = cChannelType::find( overlayNode->edge->channelTypeRxStr.c_str() );
cChannelType* channelTypeTx = cChannelType::find( overlayNode->edge->channelTypeTxStr.c_str() );
if (!channelTypeRx || !channelTypeTx)
opp_error("Could not find Channel or ChannelRx Type. Most likely "
"parameter channelTypes does not match the channels defined "
"in channels.ned");
//create channels
cDatarateChannel* channelRx = check_and_cast<cDatarateChannel*>(channelTypeRx->create(overlayNode->edge->channelTypeRxStr.c_str()));
cDatarateChannel* channelTx = check_and_cast<cDatarateChannel*>(channelTypeTx->create(overlayNode->edge->channelTypeTxStr.c_str()));
//connect terminal
terminal.module->gate("pppg$o", 0)->connectTo(routerInGate,channelRx);
routerOutGate->connectTo(terminal.module->gate("pppg$i", 0),channelTx);
// connect ppp interface module to router module and vice versa
routerInGate->connectTo(terminal.remotePPPInterface->gate("phys$i"));
terminal.remotePPPInterface->gate("phys$o")->connectTo(routerOutGate);
// connect ppp interface module to network layer module and vice versa
cModule* netwModule = overlayNode->edge->Router->getSubmodule("networkLayer");
cGate* netwInGate = firstUnusedGate(netwModule, "ifIn");
cGate* netwOutGate = firstUnusedGate(netwModule, "ifOut");
netwOutGate->connectTo(terminal.remotePPPInterface->gate("netwIn"));
terminal.remotePPPInterface->gate("netwOut")->connectTo(netwInGate);
// connect network layer module to ip and arp modules
cModule* ipModule = overlayNode->edge->Router->getSubmodule("networkLayer")->
getSubmodule("ip");
cGate* ipIn = firstUnusedGate(ipModule, "queueIn");
netwInGate->connectTo(ipIn);
//
// Start ppp interface modules
//
terminal.remotePPPInterface->finalizeParameters();
terminal.remotePPPInterface->setDisplayString("i=block/ifcard");
terminal.remotePPPInterface->buildInside();
terminal.remotePPPInterface->scheduleStart(simTime());
terminal.remotePPPInterface->callInitialize();
if ( !migrate) {
// we are already in stage 4 and need to call initialize
// for all previous stages manually
for (int i=0; i < MAX_STAGE_UNDERLAY + 1; i++) {
terminal.module->callInitialize(i);
}
}
//calculate diversity factor for both channels (+/- diversity)
double diversityFactor = (uniform(0 , 2*channelDiversity) + (100-channelDiversity))/100;
//customize channel delays
channelRx->setDelay(SIMTIME_DBL(channelRx->getDelay()*diversityFactor));
channelTx->setDelay(SIMTIME_DBL(channelTx->getDelay()*diversityFactor));
terminal.remoteInterfaceEntry = overlayNode->edge->interfaceTable->getInterface(
overlayNode->edge->interfaceTable->getNumInterfaces() - 1);
terminal.interfaceEntry = terminal.interfaceTable->getInterfaceByName("ppp0");
//
// Fill in interface table.
//
// router
IPv4InterfaceData* interfaceData = new IPv4InterfaceData;
interfaceData->setIPAddress(overlayNode->edge->IPAddress);
interfaceData->setNetmask(IPAddress::ALLONES_ADDRESS);
terminal.remoteInterfaceEntry->setIPv4Data(interfaceData);
// terminal
terminal.interfaceEntry->ipv4Data()->setIPAddress(IPAddress(terminal.IPAddress));
terminal.interfaceEntry->ipv4Data()->setNetmask(IPAddress::ALLONES_ADDRESS);
//
// Fill in routing table.
//
// add edge routing entry
IPRoute* re = new IPRoute();
re->setHost(IPAddress(terminal.IPAddress));
re->setNetmask(IPAddress::ALLONES_ADDRESS);
re->setInterface(terminal.remoteInterfaceEntry);
re->setType(IPRoute::DIRECT);
re->setSource(IPRoute::MANUAL);
overlayNode->edge->routingTable->addRoute(re);
terminal.remoteRoutingEntry = re;
// add terminal routing entry
IPRoute* te = new IPRoute();
te->setHost(IPAddress::UNSPECIFIED_ADDRESS);
te->setNetmask(IPAddress::UNSPECIFIED_ADDRESS);
te->setGateway(overlayNode->edge->IPAddress);
te->setInterface(terminal.interfaceEntry);
te->setType(IPRoute::REMOTE);
te->setSource(IPRoute::MANUAL);
terminal.routingTable->addRoute(te);
terminal.routingEntry = te;
// append module to overlay terminal vector
overlayTerminal.push_back(terminal);
updateDisplayString();
int ID = node->getId();
return ID;
}
| bool ConnectReaSE::extractFromParentModule | ( | cModule * | currModule, | |
| void * | properties | |||
| ) | [static, private] |
Finds submodules with special properties.
| currModule | currently tested module | |
| properties | pointer to topologyProperty (parent module and special property) |
Definition at line 497 of file ConnectReaSE.cc.
Referenced by setUpAS().
{
topologyProperty* currProp = (topologyProperty*)properties;
if (currModule->getParentModule() == currProp->pModule) {
if (currModule->getProperties()->get(currProp->property)) {
return true;
}
}
return false;
}
| cGate * ConnectReaSE::firstUnusedGate | ( | cModule * | owner, | |
| const char * | name, | |||
| cGate::Type | type = cGate::NONE | |||
| ) | [private] |
Returns a module's fist unconnected gate.
| owner | gate owner module | |
| name | name of the gate vector | |
| type | gate type (input or output) |
Definition at line 483 of file ConnectReaSE.cc.
Referenced by addOverlayNode().
{
int index;
for (index = 0; index < owner->gateSize(name); index++) {
cGate *gate = type == cGate::NONE ? owner->gate(name, index) : owner->gateHalf(name, type, index);
if (!gate->isConnectedOutside()) {
return gate;
}
}
owner->setGateSize(name, index + 2);
return type == cGate::NONE ? owner->gate(name, index + 1) : owner->gateHalf(name, type, index + 1);
}
| AccessInfo ConnectReaSE::getAccessNode | ( | ) | [virtual] |
Getter for router module.
Definition at line 137 of file ConnectReaSE.cc.
Referenced by ReaSEUnderlayConfigurator::createNode(), and migrateNode().
{
Enter_Method("getAccessNode()");
bool candidateOK = false;
int numTries = 10;
uint32 test_IP = 0;
AccessInfo node;
edgeRoutes* connectionCandidate;
uint32 tempIndex, tempASindex;
while ((numTries > 0)&&(!candidateOK)) {
numTries--;
tempIndex = intuniform(0, globalEdgePool.size()-1);
connectionCandidate = globalEdgePool[tempIndex].edge;
tempASindex = globalEdgePool[tempIndex].indexAS;
//limit terminals per edge router
if (connectionCandidate->IPAddresses.size() >= ((uint32_t) 1 << AS_Pool[tempASindex].edgeShift)) // maximum reached?
continue;
// test_IP = connectionCandidate->IPAddress + 1; // begin with first IP after the edge router
// for (int i = 0; i < (1 << AS_Pool[tempASindex].edgeShift); i++ ) {
// test_IP += i;
// candidateOK = true;
// for (uint32 j = 0; j < connectionCandidate->IPAddresses.size(); j++) {
// if (connectionCandidate->IPAddresses[j] == test_IP) {
// candidateOK =false;
// break;
// }
// }
// if (candidateOK) {
// connectionCandidate->IPAddresses.push_back(test_IP);
// break;
// }
// }
// FIXME: check overlays for side effects of reused IP addresses
test_IP = ++connectionCandidate->lastIP;
connectionCandidate->IPAddresses.push_back(test_IP);
break;
}
// no free IP address after 10 tries
if (numTries == 0) {
opp_error("Error creating node: No available IP found after four tries!");
}
EV << "Found available IP: " << test_IP;
node.ASindex = tempASindex;
node.IPAddress = test_IP;
node.edge = connectionCandidate;
return node;
}
| cModule * ConnectReaSE::getOverlayNode | ( | int | ID | ) | [virtual] |
searches overlayTerminal[] for a given node
| ID | position of the node in overlayTerminal |
Definition at line 419 of file ConnectReaSE.cc.
Referenced by ReaSEUnderlayConfigurator::preKillNode().
{
Enter_Method("getOverlayNode()");
cModule* node = NULL;
for (unsigned int i=0; i<overlayTerminal.size(); i++) {
if (overlayTerminal[i].module->getId() == ID) {
node = overlayTerminal[i].module;
return node;
}
}
opp_error("Node was not found in global list of overlay terminals");
return node;
}
| void ConnectReaSE::handleMessage | ( | cMessage * | msg | ) | [protected, virtual] |
OMNeT handleMessage method.
| msg | the message to handle |
Definition at line 460 of file ConnectReaSE.cc.
{
error("this module doesn't handle messages, it runs only in initialize()");
}
| void ConnectReaSE::initialize | ( | int | stage | ) | [protected, virtual] |
Gather some information about the router node.
Definition at line 47 of file ConnectReaSE.cc.
{
//EV << "Connector Stage" << stage;
if (stage != MAX_STAGE_UNDERLAY)
return;
//get parameters
channelTypesTx = cStringTokenizer(par("channelTypes"), " ").asVector();
channelTypesRx = cStringTokenizer(par("channelTypesRx"), " ").asVector();
channelDiversity = par("channelDiversity");
if (channelTypesTx.size() < channelTypesRx.size()) {
channelTypesTx = channelTypesRx;
}
else if (channelTypesTx.size() > channelTypesRx.size()) {
channelTypesRx = channelTypesTx;
}
// make sure that delay cannot be zero and diversity cannot be below zero
if (channelDiversity>=100)
channelDiversity = 99.99f;
else if (channelDiversity<0)
channelDiversity = 0;
// statistics
lifetimeVector.setName("Terminal Lifetime");
// set up network
cModule* tempModule;
cTopology tempTopology("tempTopo");
edgePool tempEdgePool;
tempTopology.extractByProperty("AS");
totalCountOfAS = tempTopology.getNumNodes();
nextPow = 0;
while (((uint32_t) 1 << nextPow) < totalCountOfAS + 1) {
nextPow++;
}
ASShift = 32 - nextPow;
if (tempTopology.getNumNodes() == 0) {
//no AS topology
tempTopology.extractByProperty("RL");
if (tempTopology.getNumNodes() == 0)
//no router topology
opp_error("ConnectReaSE: Neither an AS topology nor a router topology was detected.");
setUpAS(getParentModule());
}
else {
// set up all autonomous systems (AS)
int index = 0;
std::vector<cModule*> Modules;
for (int i=0; i<tempTopology.getNumNodes(); i++) {
tempModule = tempTopology.getNode(i)->getModule();
Modules.push_back(tempModule);
index++;
}
for (uint32 i=0; i< Modules.size(); i++) {
setUpAS(Modules[i]);
}
}
// put all edge router in one data structure to get a equal probability of selection
for (uint32 i=0; i<AS_Pool.size(); i++) {
for (uint32 j=0; j< AS_Pool[i].edgeRouter.size(); j++) {
tempEdgePool.edge = &AS_Pool[i].edgeRouter[j];
tempEdgePool.indexAS = i;
globalEdgePool.push_back(tempEdgePool);
}
}
//cout << "Number of Edges in Network: " << globalEdgePool.size() << endl;
for (uint32 i=0; i<globalEdgePool.size(); i++) {
//select channel
globalEdgePool[i].edge->channelTypeTxStr = channelTypesTx[intuniform(0,channelTypesTx.size()-1)];
globalEdgePool[i].edge->channelTypeRxStr = channelTypesRx[intuniform(0,channelTypesRx.size()-1)];
}
}
| AccessInfo ConnectReaSE::migrateNode | ( | int | ID | ) | [virtual] |
Definition at line 435 of file ConnectReaSE.cc.
Referenced by ReaSEUnderlayConfigurator::migrateNode().
{
Enter_Method("migrateNode()");
AccessInfo newEdgeRouter;
terminalInfo terminal;
for (unsigned int i=0; i<overlayTerminal.size(); i++) {
if (overlayTerminal[i].module->getId() == ID) {
terminal = overlayTerminal[i];
break;
}
}
if (terminal.module == NULL) opp_error("ConnectReaSE: Cannot find migrating node");
do {
newEdgeRouter = getAccessNode();
}
while ((newEdgeRouter.edge->Router->getId() == terminal.edgeRouter->Router->getId()) && (AS_Pool[terminal.ASindex].edgeRouter.size()!= 1));
return newEdgeRouter;
}
| virtual int ConnectReaSE::numInitStages | ( | void | ) | const [inline, protected, virtual] |
OMNeT number of init stages.
Definition at line 144 of file ConnectReaSE.h.
{
return MAX_STAGE_UNDERLAY + 1;
}
| cModule * ConnectReaSE::removeOverlayNode | ( | int | ID | ) | [virtual] |
Removes a node from the network.
Definition at line 350 of file ConnectReaSE.cc.
Referenced by ReaSEUnderlayConfigurator::handleTimerEvent(), and ReaSEUnderlayConfigurator::migrateNode().
{
Enter_Method("removeOverlayNode()");
cModule* node = NULL;
terminalInfo terminal;
int index = 0;
uint32 releasedIP;
// find module
for (unsigned int i=0; i<overlayTerminal.size(); i++) {
if (overlayTerminal[i].module->getId() == ID) {
terminal = overlayTerminal[i];
node = terminal.module;
index = i;
break;
}
}
if (node == NULL) return NULL;
releasedIP = IPAddressResolver().addressOf(terminal.module).get4().getInt();;
// free IP address
for (unsigned int i=0; i < terminal.edgeRouter->IPAddresses.size(); i++) {
if (terminal.edgeRouter->IPAddresses[i] == releasedIP) {
terminal.edgeRouter->IPAddresses.erase(terminal.edgeRouter->IPAddresses.begin() + i);
break;
}
}
cModule* ppp = terminal.remotePPPInterface;
// disconnect terminal
node->gate("pppg$o", 0)->disconnect();
node->gate("pppg$i", 0)->getPreviousGate()->disconnect();
// disconnect ip and arp modules
ppp->gate("netwIn")->getPathStartGate()->disconnect();
ppp->gate("netwOut")->getNextGate()->disconnect();
// remove associated ppp interface module
ppp->callFinish();
ppp->deleteModule();
terminal.edgeRouter->countPPPInterfaces--;
// remove associated interface table entry
terminal.edgeRouter->interfaceTable->deleteInterface(terminal.remoteInterfaceEntry);
// remove routing entries
terminal.routingTable->deleteRoute(terminal.routingEntry);
terminal.edgeRouter->routingTable ->deleteRoute(terminal.remoteRoutingEntry);
//TODO: implement life vector statistics
lifetimeVector.record(simTime() - overlayTerminal[index].createdAt);
// remove terminal from overlay terminal vector
overlayTerminal.erase(overlayTerminal.begin() + index);
updateDisplayString();
return node;
}
| void ConnectReaSE::setUpAS | ( | cModule * | currAS | ) | [private] |
Gathers all needed edge router information of a specified autonomous system.
This method gathers all edge routers, their IPs and the IPs of all connected hosts.
| currAS | AS module |
Definition at line 509 of file ConnectReaSE.cc.
Referenced by initialize().
{
cTopology edgeTopo("Edges");
cTopology Topo("All nodes");
topologyProperty* tempProp = new topologyProperty;
cModule* tempNode;
uint32 tempIP;
edgeRoutes tempEdge;
autoSystem tempAS;
int k;
tempProp->pModule = currAS;
tempProp->property = "EdgeRouter";
edgeTopo.extractFromNetwork(extractFromParentModule, (void*) tempProp);
tempProp->property = "RL";
Topo.extractFromNetwork(extractFromParentModule, (void*) tempProp);
//get net shift for IP address
nextPow = 1;
while ((1 << nextPow) < edgeTopo.getNumNodes() + 2) {
nextPow++;
}
tempAS.edgeShift = ASShift - nextPow;
// add information about edge router
for (int i=0; i< edgeTopo.getNumNodes(); i++) {
tempEdge.Router = edgeTopo.getNode(i)->getModule();
tempEdge.IPAddress = IPAddressResolver().addressOf(tempEdge.Router).get4().getInt();
tempEdge.IPAddresses.push_back(IPAddressResolver().addressOf(tempEdge.Router).get4().getInt());
tempEdge.interfaceTable = IPAddressResolver().interfaceTableOf(tempEdge.Router);
tempEdge.routingTable = IPAddressResolver().routingTableOf(tempEdge.Router);
k = 0;
while ( tempEdge.Router->findSubmodule("ppp", k) != -1 )
k++;
tempEdge.countPPPInterfaces = k;
// the last allocated IP is the router address plus the (k - 1) connected ReaSE hosts
tempEdge.lastIP = tempEdge.IPAddress + k - 1; // FIXME: check overlays for side effects of reused IP addresses
// find hosts
Topo.calculateUnweightedSingleShortestPathsTo(Topo.getNodeFor(edgeTopo.getNode(i)->getModule()));
for (int j=0; j< Topo.getNumNodes(); j++) {
tempNode = Topo.getNode(j)->getModule();
if (tempNode->getProperties()->get("CoreRouter"))
continue;
if (tempNode->getProperties()->get("GatewayRouter"))
continue;
if (tempNode->getProperties()->get("EdgeRouter"))
continue;
if (Topo.getNode(j)->getPath(0)->getRemoteNode()->getModule() != edgeTopo.getNode(i)->getModule())
continue;
//fill IP table
tempIP = IPAddressResolver().addressOf(Topo.getNode(j)->getModule()).get4().getInt();
tempEdge.IPAddresses.push_back(tempIP);
}
tempAS.edgeRouter.push_back(tempEdge);
}
delete tempProp;
AS_Pool.push_back(tempAS);
}
| void ConnectReaSE::updateDisplayString | ( | ) | [protected, virtual] |
Displays the current number of terminals connected to the network.
Definition at line 465 of file ConnectReaSE.cc.
Referenced by addOverlayNode(), and removeOverlayNode().
{
if (ev.isGUI()) {
char buf[80];
if ( overlayTerminal.size() == 1 ) {
sprintf(buf, "1 terminal connected");
} else {
sprintf(buf, "%zi terminals connected", overlayTerminal.size());
}
getDisplayString().setTagArg("t", 0, buf);
getDisplayString().setTagArg("t", 2, "blue");
if ((overlayTerminal.size() % 100) == 0) {
cerr << "ConnectReaSE: " << overlayTerminal.size() << " Terminals connected in network." <<endl;
}
}
}
std::vector<autoSystem> ConnectReaSE::AS_Pool [protected] |
Definition at line 176 of file ConnectReaSE.h.
Referenced by getAccessNode(), initialize(), migrateNode(), and setUpAS().
uint32 ConnectReaSE::ASShift [protected] |
Definition at line 178 of file ConnectReaSE.h.
Referenced by initialize(), and setUpAS().
double ConnectReaSE::channelDiversity [protected] |
Definition at line 179 of file ConnectReaSE.h.
Referenced by addOverlayNode(), and initialize().
std::vector<std::string> ConnectReaSE::channelTypesRx [protected] |
vector of possible access channels (rx)
Definition at line 166 of file ConnectReaSE.h.
Referenced by initialize().
std::vector<std::string> ConnectReaSE::channelTypesTx [protected] |
vector of possible access channels (tx)
Definition at line 168 of file ConnectReaSE.h.
Referenced by initialize().
std::vector<edgePool> ConnectReaSE::globalEdgePool [protected] |
Definition at line 177 of file ConnectReaSE.h.
Referenced by getAccessNode(), and initialize().
cOutVector ConnectReaSE::lifetimeVector [protected] |
vector of node lifetimes
Definition at line 174 of file ConnectReaSE.h.
Referenced by initialize(), and removeOverlayNode().
uint32 ConnectReaSE::nextPow [protected] |
Definition at line 178 of file ConnectReaSE.h.
Referenced by initialize(), and setUpAS().
std::vector<terminalInfo> ConnectReaSE::overlayTerminal [protected] |
the terminals at this access router
Definition at line 171 of file ConnectReaSE.h.
Referenced by addOverlayNode(), getOverlayNode(), migrateNode(), removeOverlayNode(), and updateDisplayString().
uint32 ConnectReaSE::totalCountOfAS [protected] |
Definition at line 178 of file ConnectReaSE.h.
Referenced by initialize().
1.7.1