Configurator module for the InetUnderlay. More...
#include <InetUnderlayConfigurator.h>
Public Member Functions | |
| TransportAddress * | createNode (NodeType type, bool initialize=false) |
| Creates an overlay node. | |
| void | preKillNode (NodeType type, TransportAddress *addr=NULL) |
| Notifies and schedules overlay nodes for removal. | |
| void | migrateNode (NodeType type, TransportAddress *addr=NULL) |
| Migrates overlay nodes from one access net to another. | |
Protected Member Functions | |
| void | initializeUnderlay (int stage) |
| Sets up backbone, assigns ip addresses, calculates routing tables, sets some parameters and adds the initial number of nodes to the network. | |
| void | setUpIPv4 (cTopology &topo) |
| void | setUpIPv6 (cTopology &topo) |
| void | handleTimerEvent (cMessage *msg) |
| process timer messages | |
| void | finishUnderlay () |
| Saves statistics, prints simulation time. | |
| void | setDisplayString () |
| Updates the statistics display string. | |
Protected Attributes | |
| std::vector< cModule * > | accessNode |
| stores accessRouter | |
| std::deque< IPvXAddress > | killList |
| stores nodes scheduled to be killed | |
| std::set< int > | scheduledID |
| stores nodeIds to prevent migration of prekilled nodes | |
| int | numCreated |
| number of overall created overlay terminals | |
| int | numKilled |
| number of overall killed overlay terminals | |
Private Attributes | |
| int | accessRouterNum |
| number of access router | |
| int | overlayAccessRouterNum |
| number of overlayAccessRouter | |
| int | overlayTerminalNum |
| number of terminal in the overlay | |
Configurator module for the InetUnderlay.
Definition at line 41 of file InetUnderlayConfigurator.h.
| TransportAddress * InetUnderlayConfigurator::createNode | ( | NodeType | type, | |
| bool | initialize = false | |||
| ) | [virtual] |
Creates an overlay node.
| type | the NodeType of the node to create | |
| initialize | creation during init phase? |
Implements UnderlayConfigurator.
Definition at line 87 of file InetUnderlayConfigurator.cc.
{
Enter_Method_Silent();
// derive overlay node from ned
std::string nameStr = "overlayTerminal";
if( churnGenerator.size() > 1 ){
nameStr += "-" + convertToString<uint32_t>(type.typeID);
}
cModuleType* moduleType = cModuleType::get(type.terminalType.c_str());
cModule* node = moduleType->create(nameStr.c_str(), getParentModule(),
numCreated + 1, numCreated);
if (type.channelTypesTx.size() > 0) {
throw cRuntimeError("InetUnderlayConfigurator::createNode(): Setting "
"channel types via the churn generator is not allowed "
"with the InetUnderlay. Use **.accessNet.channelTypes instead!");
}
node->setGateSize("pppg", 1);
std::string displayString;
if ((type.typeID > 0) && (type.typeID <= NUM_COLORS)) {
((displayString += "i=device/wifilaptop_l,")
+= colorNames[type.typeID - 1])
+= ",40;i2=block/circle_s";
} else {
displayString = "i=device/wifilaptop_l;i2=block/circle_s";
}
node->finalizeParameters();
node->setDisplayString(displayString.c_str());
node->buildInside();
node->scheduleStart(simTime());
// create meta information
InetInfo* info = new InetInfo(type.typeID, node->getId(), type.context);
AccessNet* accessNet= check_and_cast<AccessNet*>
(accessNode[intuniform(0, accessNode.size() - 1)]
->getSubmodule("accessNet"));
info->setAccessNetModule(accessNet);
info->setNodeID(node->getId());
// add node to a randomly chosen access net and bootstrap oracle
globalNodeList->addPeer(accessNet->addOverlayNode(node), info);
// if the node was not created during startup we have to
// finish the initialization process manually
if (!initialize) {
for (int i = MAX_STAGE_UNDERLAY + 1; i < NUM_STAGES_ALL; i++) {
node->callInitialize(i);
}
}
overlayTerminalCount++;
numCreated++;
churnGenerator[type.typeID]->terminalCount++;
TransportAddress *address = new TransportAddress(
IPAddressResolver().addressOf(node));
// update display
setDisplayString();
return address;
}
| void InetUnderlayConfigurator::finishUnderlay | ( | ) | [protected, virtual] |
Saves statistics, prints simulation time.
Reimplemented from UnderlayConfigurator.
Definition at line 324 of file InetUnderlayConfigurator.cc.
{
// statistics
recordScalar("Terminals added", numCreated);
recordScalar("Terminals removed", numKilled);
if (!isInInitPhase()) {
struct timeval now, diff;
gettimeofday(&now, NULL);
timersub(&now, &initFinishedTime, &diff);
printf("Simulation time: %li.%06li\n", diff.tv_sec, diff.tv_usec);
}
}
| void InetUnderlayConfigurator::handleTimerEvent | ( | cMessage * | msg | ) | [protected, virtual] |
process timer messages
| msg | the received message |
Reimplemented from UnderlayConfigurator.
Definition at line 283 of file InetUnderlayConfigurator.cc.
{
Enter_Method_Silent();
// get next scheduled node from the kill list
IPvXAddress addr = killList.back();
killList.pop_back();
AccessNet* accessNetModule = NULL;
int nodeID = -1;
InetInfo* info = dynamic_cast<InetInfo*>(globalNodeList->getPeerInfo(addr));
if(info != NULL) {
accessNetModule = info->getAccessNetModule();
nodeID = info->getNodeID();
} else {
opp_error("IPv4UnderlayConfigurator: Trying to kill node with nonexistant TransportAddress!");
}
scheduledID.erase(nodeID);
globalNodeList->killPeer(addr);
cModule* node = accessNetModule->removeOverlayNode(nodeID);
if(node == NULL)
opp_error("IPv4UnderlayConfigurator: Trying to remove node which is nonexistant in AccessNet!");
node->callFinish();
node->deleteModule();
delete msg;
}
| void InetUnderlayConfigurator::initializeUnderlay | ( | int | stage | ) | [protected, virtual] |
Sets up backbone, assigns ip addresses, calculates routing tables, sets some parameters and adds the initial number of nodes to the network.
| stage | the phase of the initialisation |
Implements UnderlayConfigurator.
Definition at line 43 of file InetUnderlayConfigurator.cc.
{
//backbone configuration
if (stage == MIN_STAGE_UNDERLAY) {
// Find all router modules.
cTopology topo("topo");
topo.extractByProperty("node");
if (par("useIPv6Addresses").boolValue()) {
setUpIPv6(topo);
//opp_error("IPv6 is not supported in this release but is coming soon.");
} else {
setUpIPv4(topo);
}
}
//access net configuration
else if(stage == MAX_STAGE_UNDERLAY) {
// fetch some parameters
accessRouterNum = getParentModule()->par("accessRouterNum");
overlayAccessRouterNum = getParentModule()->par("overlayAccessRouterNum");
// count the overlay clients
overlayTerminalCount = 0;
numCreated = 0;
numKilled = 0;
// add access node modules to access node vector
cModule* node;
for (int i = 0; i < accessRouterNum; i++) {
node = getParentModule()->getSubmodule("accessRouter", i);
accessNode.push_back( node );
}
for (int i = 0; i < overlayAccessRouterNum; i++) {
node = getParentModule()->getSubmodule("overlayAccessRouter", i);
accessNode.push_back( node );
}
// debug stuff
WATCH_PTRVECTOR(accessNode);
}
}
| void InetUnderlayConfigurator::migrateNode | ( | NodeType | type, | |
| TransportAddress * | addr = NULL | |||
| ) | [virtual] |
Migrates overlay nodes from one access net to another.
| type | the NodeType of the node to migrate | |
| addr | NULL for random node |
Implements UnderlayConfigurator.
Definition at line 225 of file InetUnderlayConfigurator.cc.
{
Enter_Method_Silent();
AccessNet* accessNetModule = NULL;
int nodeID = -1;
InetInfo* info;
// If no address given, get random node
if(addr == NULL) {
info = dynamic_cast<InetInfo*>(globalNodeList->getRandomPeerInfo(type.typeID));
} else {
// get node information
info = dynamic_cast<InetInfo*>(globalNodeList->getPeerInfo(*addr));
}
if(info != NULL) {
accessNetModule = info->getAccessNetModule();
nodeID = info->getNodeID();
} else {
opp_error("IPv4UnderlayConfigurator: Trying to pre kill node with nonexistant TransportAddress!");
}
// do not migrate node that is already scheduled
if(scheduledID.count(nodeID))
return;
cModule* node = accessNetModule->removeOverlayNode(nodeID);//intuniform(0, accessNetModule->size() - 1));
if(node == NULL)
opp_error("IPv4UnderlayConfigurator: Trying to remove node which is nonexistant in AccessNet!");
//remove node from bootstrap oracle
globalNodeList->killPeer(IPAddressResolver().addressOf(node));
node->bubble("I am migrating!");
// connect the node to another access net
AccessNet* newAccessNetModule;
do {
newAccessNetModule = check_and_cast<AccessNet*>(accessNode[intuniform(0, accessNode.size() - 1)]->getSubmodule("accessNet"));
} while((newAccessNetModule == accessNetModule) && (accessNode.size() != 1));
// create meta information
InetInfo* newinfo = new InetInfo(type.typeID, node->getId(), type.context);
newinfo->setAccessNetModule(newAccessNetModule);
newinfo->setNodeID(node->getId());
//add node to a randomly chosen access net bootstrap oracle
globalNodeList->addPeer(newAccessNetModule->addOverlayNode(node, true), newinfo);
// inform the notification board about the migration
NotificationBoard* nb = check_and_cast<NotificationBoard*>(node->getSubmodule("notificationBoard"));
nb->fireChangeNotification(NF_OVERLAY_TRANSPORTADDRESS_CHANGED);
}
| void InetUnderlayConfigurator::preKillNode | ( | NodeType | type, | |
| TransportAddress * | addr = NULL | |||
| ) | [virtual] |
Notifies and schedules overlay nodes for removal.
| type | NodeType of the node to remove | |
| addr | NULL for random node |
Implements UnderlayConfigurator.
Definition at line 158 of file InetUnderlayConfigurator.cc.
{
Enter_Method_Silent();
AccessNet* accessNetModule = NULL;
int nodeID;
InetInfo* info;
// If no address given, get random node
if (addr == NULL) {
addr = globalNodeList->getRandomAliveNode(type.typeID);
if (addr == NULL) {
// all nodes are already prekilled
std::cout << "all nodes are already prekilled" << std::endl;
return;
}
}
// get node information
info = dynamic_cast<InetInfo*>(globalNodeList->getPeerInfo(*addr));
if (info != NULL) {
accessNetModule = info->getAccessNetModule();
nodeID = info->getNodeID();
} else {
opp_error("IPv4UnderlayConfigurator: Trying to pre kill node "
"with nonexistant TransportAddress!");
}
uint32_t effectiveType = info->getTypeID();
// do not kill node that is already scheduled
if(scheduledID.count(nodeID))
return;
cModule* node = accessNetModule->getOverlayNode(nodeID);
globalNodeList->removePeer(IPAddressResolver().addressOf(node));
//put node into the kill list and schedule a message for final removal of the node
killList.push_front(IPAddressResolver().addressOf(node));
scheduledID.insert(nodeID);
overlayTerminalCount--;
numKilled++;
churnGenerator[effectiveType]->terminalCount--;
// update display
setDisplayString();
// inform the notification board about the removal
NotificationBoard* nb = check_and_cast<NotificationBoard*>(
node->getSubmodule("notificationBoard"));
nb->fireChangeNotification(NF_OVERLAY_NODE_LEAVE);
double random = uniform(0, 1);
if (random < gracefulLeaveProbability) {
nb->fireChangeNotification(NF_OVERLAY_NODE_GRACEFUL_LEAVE);
}
cMessage* msg = new cMessage();
scheduleAt(simTime() + gracefulLeaveDelay, msg);
}
| void InetUnderlayConfigurator::setDisplayString | ( | ) | [protected, virtual] |
Updates the statistics display string.
Implements UnderlayConfigurator.
Definition at line 316 of file InetUnderlayConfigurator.cc.
Referenced by createNode(), and preKillNode().
{
char buf[80];
sprintf(buf, "%i overlay terminals\n%i access router\n%i overlay access router",
overlayTerminalCount, accessRouterNum, overlayAccessRouterNum);
getDisplayString().setTagArg("t", 0, buf);
}
| void InetUnderlayConfigurator::setUpIPv4 | ( | cTopology & | topo | ) | [protected] |
Definition at line 338 of file InetUnderlayConfigurator.cc.
Referenced by initializeUnderlay().
{
// Assign IP addresses to all router modules.
std::vector<uint32> nodeAddresses;
nodeAddresses.resize(topo.getNumNodes());
// IP addresses for backbone
// Take start IP from config file
// FIXME: Make Netmask for Routers configurable!
uint32 lowIPBoundary = IPAddress(par("startIPv4").stringValue()).getInt();
// uint32 lowIPBoundary = uint32((1 << 24) + 1);
int numIPNodes = 0;
for (int i = 0; i < topo.getNumNodes(); i++) {
++numIPNodes;
uint32 addr = lowIPBoundary + uint32(numIPNodes << 16);
nodeAddresses[i] = addr;
// update ip display string
if (ev.isGUI()) {
topo.getNode(i)->getModule()->getDisplayString().insertTag("t", 0);
topo.getNode(i)->getModule()->getDisplayString().setTagArg("t", 0,
const_cast<char*>(IPAddress(addr).str().c_str()));
topo.getNode(i)->getModule()->getDisplayString().setTagArg("t", 1, "l");
topo.getNode(i)->getModule()->getDisplayString().setTagArg("t", 2, "red");
}
// find interface table and assign address to all (non-loopback) interfaces
IInterfaceTable* ift = IPAddressResolver().interfaceTableOf(topo.getNode(i)->getModule());
for ( int k = 0; k < ift->getNumInterfaces(); k++ ) {
InterfaceEntry* ie = ift->getInterface(k);
if (!ie->isLoopback()) {
ie->ipv4Data()->setIPAddress(IPAddress(addr));
// full address must match for local delivery
ie->ipv4Data()->setNetmask(IPAddress::ALLONES_ADDRESS);
}
}
}
// Fill in routing tables.
for (int i = 0; i < topo.getNumNodes(); i++) {
cTopology::Node* destNode = topo.getNode(i);
uint32 destAddr = nodeAddresses[i];
// calculate shortest paths from everywhere towards destNode
topo.calculateUnweightedSingleShortestPathsTo(destNode);
// add overlayAccessRouters and overlayBackboneRouters
// to the GlobalNodeList
if ((strcmp(destNode->getModule()->getName(), "overlayBackboneRouter") == 0) ||
(strcmp(destNode->getModule()->getName(), "overlayAccessRouter") == 0)) {
//add node to bootstrap oracle
PeerInfo* info = new PeerInfo(0, destNode->getModule()->getId(), NULL);
globalNodeList->addPeer(IPvXAddress(nodeAddresses[i]), info);
}
// If destNode is the outRouter, add a default route
// to outside network via the TunOutDevice and a route to the
// Gateway
if ( strcmp(destNode->getModule()->getName(), "outRouter" ) == 0 ) {
IPRoute* defRoute = new IPRoute();
defRoute->setHost(IPAddress::UNSPECIFIED_ADDRESS);
defRoute->setNetmask(IPAddress::UNSPECIFIED_ADDRESS);
defRoute->setGateway(IPAddress(par("gatewayIP").stringValue()));
defRoute->setInterface(IPAddressResolver().interfaceTableOf(destNode->getModule())->getInterfaceByName("tunDev"));
defRoute->setType(IPRoute::REMOTE);
defRoute->setSource(IPRoute::MANUAL);
IPAddressResolver().routingTableOf(destNode->getModule())->addRoute(defRoute);
IPRoute* gwRoute = new IPRoute();
gwRoute->setHost(IPAddress(par("gatewayIP").stringValue()));
gwRoute->setNetmask(IPAddress(255, 255, 255, 255));
gwRoute->setInterface(IPAddressResolver().interfaceTableOf(destNode->getModule())->getInterfaceByName("tunDev"));
gwRoute->setType(IPRoute::DIRECT);
gwRoute->setSource(IPRoute::MANUAL);
IPAddressResolver().routingTableOf(destNode->getModule())->addRoute(gwRoute);
}
// add route (with host=destNode) to every routing table in the network
for (int j = 0; j < topo.getNumNodes(); j++) {
// continue if same node
if (i == j)
continue;
// cancel simulation if node is not connected with destination
cTopology::Node* atNode = topo.getNode(j);
if (atNode->getNumPaths() == 0) {
error((std::string(atNode->getModule()->getName()) + ": Network is not entirely connected."
"Please increase your value for the "
"connectivity parameter").c_str());
}
//
// Add routes at the atNode.
//
// find atNode's interface and routing table
IInterfaceTable* ift = IPAddressResolver().interfaceTableOf(atNode->getModule());
IRoutingTable* rt = IPAddressResolver().routingTableOf(atNode->getModule());
// find atNode's interface entry for the next hop node
int outputGateId = atNode->getPath(0)->getLocalGate()->getId();
InterfaceEntry *ie = ift->getInterfaceByNodeOutputGateId(outputGateId);
// find the next hop node on the path towards destNode
cModule* next_hop = atNode->getPath(0)->getRemoteNode()->getModule();
IPAddress next_hop_ip = IPAddressResolver().addressOf(next_hop).get4();
// Requirement 1: Each router has exactly one routing entry
// (netmask 255.255.0.0) to each other router
IPRoute* re = new IPRoute();
re->setHost(IPAddress(destAddr));
re->setInterface(ie);
re->setSource(IPRoute::MANUAL);
re->setNetmask(IPAddress(255, 255, 0, 0));
re->setGateway(IPAddress(next_hop_ip));
re->setType(IPRoute::REMOTE);
rt->addRoute(re);
// Requirement 2: Each router has a point-to-point routing
// entry (netmask 255.255.255.255) for each immediate neighbour
if (atNode->getDistanceToTarget() == 1) {
IPRoute* re2 = new IPRoute();
re2->setHost(IPAddress(destAddr));
re2->setInterface(ie);
re2->setSource(IPRoute::MANUAL);
re2->setNetmask(IPAddress(255, 255, 255, 255));
re2->setType(IPRoute::DIRECT);
rt->addRoute(re2);
}
// If destNode is the outRouter, add a default route
// to the next hop in the direction of the outRouter
if (strcmp(destNode->getModule()->getName(), "outRouter" ) == 0) {
IPRoute* defRoute = new IPRoute();
defRoute->setHost(IPAddress::UNSPECIFIED_ADDRESS);
defRoute->setNetmask(IPAddress::UNSPECIFIED_ADDRESS);
defRoute->setGateway(IPAddress(next_hop_ip));
defRoute->setInterface(ie);
defRoute->setType(IPRoute::REMOTE);
defRoute->setSource(IPRoute::MANUAL);
rt->addRoute(defRoute);
}
}
}
}
| void InetUnderlayConfigurator::setUpIPv6 | ( | cTopology & | topo | ) | [protected] |
Definition at line 496 of file InetUnderlayConfigurator.cc.
Referenced by initializeUnderlay().
{
// Assign IP addresses to all router modules.
std::vector<IPv6Words> nodeAddresses;
nodeAddresses.resize(topo.getNumNodes());
// IP addresses for backbone
// Take start IP from config file
// FIXME: Make Netmask for Routers configurable!
IPv6Words lowIPBoundary(IPv6Address(par("startIPv6").stringValue()));
// uint32 lowIPBoundary = uint32((1 << 24) + 1);
int numIPNodes = 0;
for (int i = 0; i < topo.getNumNodes(); i++) {
++numIPNodes;
IPv6Words addr = lowIPBoundary;
addr.d0 += numIPNodes;
nodeAddresses[i] = addr;
// update ip display string
if (ev.isGUI()) {
topo.getNode(i)->getModule()->getDisplayString().insertTag("t", 0);
topo.getNode(i)->getModule()->getDisplayString().setTagArg("t", 0,
const_cast<char*>(IPv6Address(addr.d0, addr.d1, addr.d2, addr.d3).str().c_str()));
topo.getNode(i)->getModule()->getDisplayString().setTagArg("t", 1, "l");
topo.getNode(i)->getModule()->getDisplayString().setTagArg("t", 2, "red");
}
// find interface table and assign address to all (non-loopback) interfaces
IInterfaceTable* ift = IPAddressResolver().interfaceTableOf(topo.getNode(i)->getModule());
for ( int k = 0; k < ift->getNumInterfaces(); k++ ) {
InterfaceEntry* ie = ift->getInterface(k);
if (!ie->isLoopback() && ie->ipv6Data()) {
//ie->ipv6Data()->assignAddress(IPv6Address(addr.d0, addr.d1, addr.d2, addr.d3), false, 0, 0);
// full address must match for local delivery
IPv6Address prefix(addr.d0, addr.d1, addr.d2, addr.d3);
IPv6InterfaceData::AdvPrefix p;
p.prefix = prefix;
p.prefixLength = 32;
p.advAutonomousFlag = true;
p.advPreferredLifetime = 0;
p.advValidLifetime = 0;
p.advOnLinkFlag = true;
ie->ipv6Data()->addAdvPrefix(p);
ie->setMACAddress(MACAddress::generateAutoAddress());
ie->ipv6Data()->assignAddress(prefix,false, 0, 0);
if (ie->ipv6Data()->getLinkLocalAddress().isUnspecified()) {
ie->ipv6Data()->assignAddress(IPv6Address::formLinkLocalAddress(ie->getInterfaceToken()),false, 0, 0);
}
}
}
}
// Fill in routing tables.
for (int i = 0; i < topo.getNumNodes(); i++) {
cTopology::Node* destNode = topo.getNode(i);
IPv6Words destAddr = nodeAddresses[i];
// calculate shortest paths from everywhere towards destNode
topo.calculateUnweightedSingleShortestPathsTo(destNode);
// add overlayAccessRouters and overlayBackboneRouters
// to the GlobalNodeList
if ((strcmp(destNode->getModule()->getName(), "overlayBackboneRouter") == 0) ||
(strcmp(destNode->getModule()->getName(), "overlayAccessRouter") == 0)) {
//add node to bootstrap oracle
PeerInfo* info = new PeerInfo(0, destNode->getModule()->getId(), NULL);
globalNodeList->addPeer(IPvXAddress(IPv6Address(nodeAddresses[i].d0, nodeAddresses[i].d1, nodeAddresses[i].d2, nodeAddresses[i].d3)), info);
}
// add route (with host=destNode) to every routing table in the network
for (int j = 0; j < topo.getNumNodes(); j++) {
// continue if same node
if (i == j)
continue;
// cancel simulation if node is not connected with destination
cTopology::Node* atNode = topo.getNode(j);
if (atNode->getNumPaths() == 0) {
error((std::string(atNode->getModule()->getName()) + ": Network is not entirely connected."
"Please increase your value for the "
"connectivity parameter").c_str());
}
//
// Add routes at the atNode.
//
// find atNode's interface and routing table
IInterfaceTable* ift = IPAddressResolver().interfaceTableOf(atNode->getModule());
RoutingTable6* rt = IPAddressResolver().routingTable6Of(atNode->getModule());
// find atNode's interface entry for the next hop node
int outputGateId = atNode->getPath(0)->getLocalGate()->getId();
InterfaceEntry *ie = ift->getInterfaceByNodeOutputGateId(outputGateId);
// find the next hop node on the path towards destNode
cModule* next_hop = atNode->getPath(0)->getRemoteNode()->getModule();
int destGateId = destNode->getLinkIn(0)->getLocalGateId();
IInterfaceTable* destIft = IPAddressResolver().interfaceTableOf(destNode->getModule());
int remoteGateId = atNode->getPath(0)->getRemoteGateId();
IInterfaceTable* remoteIft = IPAddressResolver().interfaceTableOf(next_hop);
IPv6Address next_hop_ip = remoteIft->getInterfaceByNodeInputGateId(remoteGateId)->ipv6Data()->getLinkLocalAddress();
IPv6InterfaceData::AdvPrefix destPrefix = destIft->getInterfaceByNodeInputGateId(destGateId)->ipv6Data()->getAdvPrefix(0);
// create routing entry for next hop
rt->addStaticRoute(destPrefix.prefix, destPrefix.prefixLength, ie->getInterfaceId(), next_hop_ip);
}
}
}
std::vector<cModule*> InetUnderlayConfigurator::accessNode [protected] |
stores accessRouter
Definition at line 104 of file InetUnderlayConfigurator.h.
Referenced by createNode(), initializeUnderlay(), and migrateNode().
int InetUnderlayConfigurator::accessRouterNum [private] |
number of access router
Definition at line 70 of file InetUnderlayConfigurator.h.
Referenced by initializeUnderlay(), and setDisplayString().
std::deque<IPvXAddress> InetUnderlayConfigurator::killList [protected] |
stores nodes scheduled to be killed
Definition at line 105 of file InetUnderlayConfigurator.h.
Referenced by handleTimerEvent(), and preKillNode().
int InetUnderlayConfigurator::numCreated [protected] |
number of overall created overlay terminals
Definition at line 109 of file InetUnderlayConfigurator.h.
Referenced by createNode(), finishUnderlay(), and initializeUnderlay().
int InetUnderlayConfigurator::numKilled [protected] |
number of overall killed overlay terminals
Definition at line 110 of file InetUnderlayConfigurator.h.
Referenced by finishUnderlay(), initializeUnderlay(), and preKillNode().
int InetUnderlayConfigurator::overlayAccessRouterNum [private] |
number of overlayAccessRouter
Definition at line 71 of file InetUnderlayConfigurator.h.
Referenced by initializeUnderlay(), and setDisplayString().
int InetUnderlayConfigurator::overlayTerminalNum [private] |
number of terminal in the overlay
Definition at line 72 of file InetUnderlayConfigurator.h.
std::set<int> InetUnderlayConfigurator::scheduledID [protected] |
stores nodeIds to prevent migration of prekilled nodes
Definition at line 106 of file InetUnderlayConfigurator.h.
Referenced by handleTimerEvent(), migrateNode(), and preKillNode().
1.7.1