QuON: An overlay network based on quadtrees. More...
#include <Quon.h>
QuON: An overlay network based on quadtrees.
Definition at line 41 of file Quon.h.
| Quon::~Quon | ( | ) |
Definition at line 1142 of file Quon.cc.
{
// destroy self timer messages
cancelAndDelete(join_timer);
cancelAndDelete(sec_timer);
cancelAndDelete(alive_timer);
cancelAndDelete(backup_timer);
delete thisSite;
QuonSiteMap::iterator itSites = Sites.begin();
while(itSites != Sites.end()) {
delete itSites->second;
++itSites;
}
}
| void Quon::adaptAoI | ( | ) | [private] |
Definition at line 483 of file Quon.cc.
Referenced by handleMove().
{
// adjust AOIWidth
double oldAOI = AOIWidth;
if( linearAdaption ) {
AOIWidth -= (maxAOI - minAOI) * ((double) Sites.size() - (double) connectionLimit) * adaptionSensitivity / (double) connectionLimit;
} else if( Sites.size() > 0 ){
AOIWidth *= (1-adaptionSensitivity) + (double) connectionLimit * adaptionSensitivity / (double) Sites.size();
}
if( gossipSensitivity > 0 && Sites.size() > 0 ) {
double avgNeighborAOI = 0;
for( QuonSiteMap::iterator itSites = Sites.begin(); itSites != Sites.end(); ++itSites ){
avgNeighborAOI += itSites->second->AOIwidth;
}
avgNeighborAOI /= Sites.size();
AOIWidth = AOIWidth*(1-gossipSensitivity) + avgNeighborAOI*gossipSensitivity;
}
if(AOIWidth > maxAOI) {
AOIWidth = maxAOI;
}
else if(AOIWidth < minAOI) {
AOIWidth = minAOI;
}
if( oldAOI != AOIWidth ){
GameAPIResizeAOIMessage* gameMsg = new GameAPIResizeAOIMessage("RESIZE_AOI");
gameMsg->setCommand(RESIZE_AOI);
gameMsg->setAOIsize(AOIWidth);
sendToApp(gameMsg);
}
}
| bool Quon::addSite | ( | Vector2D | p, | |
| NodeHandle | node, | |||
| double | AOI, | |||
| bool | isSoft = false, |
|||
| QUpdateType | update = QFOREIGN | |||
| ) | [private] |
Definition at line 300 of file Quon.cc.
Referenced by handleJoinAcknowledge(), handleNewNeighbors(), handleNodeLeave(), and handleNodeMove().
{
aloneInOverlay = false;
QuonSiteMap::iterator itSites = Sites.find(node.getKey());
QDeleteMap::iterator delIt = deletedSites.find(node.getKey());
// add node if he is not in the delete list OR has changed position since
// put in the delete list. don't add node if he has signled his leave himself
// (i.e. his position in the delete list is 0,0)
if(node.getKey() != thisSite->address.getKey() &&
(delIt == deletedSites.end() || (delIt->second != Vector2D(0,0) && delIt->second != p) )){
if(itSites == Sites.end()) {
if(debugOutput) {
EV << "[Quon::addSite() @ " << thisNode.getIp()
<< " (" << thisNode.getKey().toString(16) << ")]\n"
<< " Site " << node.getIp() << " at " << p << " has been added to the list."
<< endl;
}
QuonSite* temp = new QuonSite();
temp->position = p;
temp->address = node;
if(update == QDIRECT) {
temp->dirty = true;
}
temp->alive = true;
temp->type = QUNDEFINED;
temp->softNeighbor = isSoft;
temp->AOIwidth = AOI;
Sites.insert(std::make_pair(temp->address.getKey(), temp));
}
else if(update == QDIRECT || !itSites->second->alive) {
if(debugOutput) {
EV << "[Quon::addSite() @ " << thisNode.getIp()
<< " (" << thisNode.getKey().toString(16) << ")]\n"
<< " Site " << node.getIp() << " at " << p << " has been updated in the list."
<< endl;
}
itSites->second->position = p;
itSites->second->dirty = true;
itSites->second->alive = true;
itSites->second->softNeighbor = isSoft;
itSites->second->type = QUNDEFINED;
itSites->second->AOIwidth = AOI;
}
return true;
}
return false;
}
| void Quon::changeState | ( | QState | qstate | ) | [private] |
Definition at line 115 of file Quon.cc.
Referenced by classifySites(), finishOverlay(), handleJoin(), handleJoinAcknowledge(), handleNodeGracefulLeaveNotification(), and initializeOverlay().
{
this->qstate = qstate;
switch(qstate) {
case QUNINITIALIZED:
globalNodeList->removePeer(thisSite->address);
cancelEvent(join_timer);
cancelEvent(sec_timer);
cancelEvent(alive_timer);
cancelEvent(backup_timer);
break;
case QJOINING:
scheduleAt(simTime(), join_timer);
scheduleAt(simTime() + 1.0, sec_timer);
break;
case QREADY:
cancelEvent(join_timer);
globalNodeList->registerPeer(thisSite->address);
// tell the application we are ready unless we are rejoining the overlay
//if(rejoinCount == 0) {
CompReadyMessage* readyMsg = new CompReadyMessage("OVERLAY_READY");
readyMsg->setReady(true);
readyMsg->setComp(getThisCompType());
// TODO/FIXME: use overlay->sendMessageToAllComp(msg, getThisCompType())?
sendToApp(readyMsg);
//}
// set initial AOI size
AOIWidth = maxAOI;
GameAPIResizeAOIMessage* gameMsg = new GameAPIResizeAOIMessage("RESIZE_AOI");
gameMsg->setCommand(RESIZE_AOI);
gameMsg->setAOIsize(AOIWidth);
sendToApp(gameMsg);
if(aliveTimeout > 0.0) {
scheduleAt(simTime() + aliveTimeout, alive_timer);
}
if(backupIntervall > 0.0) {
scheduleAt(simTime() + backupIntervall, backup_timer);
}
break;
}
setBootstrapedIcon();
// debug output
if(debugOutput) {
EV << "[Quon::changeState() @ " << thisNode.getIp()
<< " (" << thisNode.getKey().toString(16) << ")]\n"
<< " Node " << thisSite->address.getIp() << " entered ";
switch(qstate) {
case QUNINITIALIZED:
EV << "UNINITIALIZED";
break;
case QJOINING:
EV << "JOINING";
break;
case QREADY:
EV << "READY";
break;
}
EV << " state." << endl;
}
}
| void Quon::classifySites | ( | ) | [private] |
Definition at line 360 of file Quon.cc.
Referenced by handleJoinAcknowledge(), handleMove(), handleNewNeighbors(), handleNodeLeave(), handleNodeMove(), and processAliveTimer().
{
if(Sites.size() > 0) {
QuonAOI AOI(thisSite->position, AOIWidth, useSquareMetric);
QuonSite* (*bindingCandidates)[4] = new QuonSite*[numBackups+1][4];
for( int i = 0; i <= numBackups; ++i ){
for( int ii = 0; ii < 4; ++ii ){
bindingCandidates[i][ii] = 0;
}
}
double (*bindingDistance)[4] = new double[numBackups+1][4];
for( int i = 0; i <= numBackups; ++i ){
for( int ii = 0; ii < 4; ++ii ){
bindingDistance[i][ii] = std::numeric_limits<double>::infinity();
}
}
for(QuonSiteMap::iterator itSites = Sites.begin(); itSites != Sites.end(); ++itSites) {
QuonAOI NeighborAOI(itSites->second->position, itSites->second->AOIwidth, useSquareMetric);
if(AOI.collide(itSites->second->position) || NeighborAOI.collide(thisSite->position)) {
if(itSites->second->type != QNEIGHBOR) {
itSites->second->type = QNEIGHBOR;
itSites->second->dirty = true;
}
}
else if(itSites->second->type != QUNDEFINED) {
itSites->second->type = QUNDEFINED;
itSites->second->dirty = true;
}
int quad = thisSite->position.getQuadrant( itSites->second->position );
double dist;
if( useSquareMetric ) {
dist = thisSite->position.xyMaxDistance(itSites->second->position);
} else {
dist = thisSite->position.distanceSqr(itSites->second->position);
}
// if dist is smaller than the most far binding candidate
if( dist < bindingDistance[numBackups][quad] ){
// Go through list of binding candidates until distance to current candidate
// is greater than distance to new candidate (i.e. look where in the binding
// candidate list the node belongs)
int backupPos = numBackups-1;
while( backupPos >= 0 && dist < bindingDistance[backupPos][quad] ){
// move old candidate one position back in the queue to make
// room for new candidate
bindingCandidates[backupPos+1][quad] = bindingCandidates[backupPos][quad];
bindingDistance[backupPos+1][quad] = bindingDistance[backupPos][quad];
--backupPos;
}
// place new candidate at appropriate position in candidate list
bindingCandidates[backupPos+1][quad] = itSites->second;
bindingDistance[backupPos+1][quad] = dist;
}
}
for( int i = 0; i < 4; ++i ){
if( bindingCandidates[0][i] ){
bindingCandidates[0][i]->type = QBINDING;
bindingCandidates[0][i]->dirty = true;
for( int ii = 1; ii <= numBackups; ++ii ){
if( bindingCandidates[ii][i] ){
bindingBackup[ii-1][i] = bindingCandidates[ii][i]->address;
}
}
}
}
delete[] bindingCandidates;
delete[] bindingDistance;
}
else {
if( !aloneInOverlay) {
++rejoinCount;
changeState(QUNINITIALIZED);
changeState(QJOINING);
}
}
}
| void Quon::deleteAppNeighbor | ( | NodeHandle | node | ) | [private] |
Definition at line 993 of file Quon.cc.
Referenced by handleNodeLeave(), and processAliveTimer().
{
GameAPIListMessage* gameMsg = new GameAPIListMessage("NEIGHBOR_UPDATE");
gameMsg->setCommand(NEIGHBOR_UPDATE);
gameMsg->setRemoveNeighborArraySize(1);
gameMsg->setAddNeighborArraySize(0);
gameMsg->setNeighborPositionArraySize(0);
gameMsg->setRemoveNeighbor(0, node);
sendToApp(gameMsg);
}
| bool Quon::deleteSite | ( | NodeHandle | node | ) | [private] |
Definition at line 441 of file Quon.cc.
Referenced by handleNodeLeave(), and processAliveTimer().
{
QuonSiteMap::iterator itSites = Sites.find(node.getKey());
if(itSites != Sites.end()) {
if(debugOutput) {
EV << "[Quon::deleteSite() @ " << thisNode.getIp()
<< " (" << thisNode.getKey().toString(16) << ")]\n"
<< " Site " << node.getIp() << " at " << itSites->second->position << " has been removed from the list."
<< endl;
}
delete itSites->second;
Sites.erase(itSites);
return true;
}
return false;
}
| void Quon::finishOverlay | ( | ) | [virtual] |
collects statistical data in derived class
Reimplemented from BaseOverlay.
Definition at line 1072 of file Quon.cc.
{
double overallBytesSend = joinRequestBytesSend
+ joinAcknowledgeBytesSend
+ nodeMoveBytesSend
+ newNeighborsBytesSend
+ nodeLeaveBytesSend;
if(overallBytesSend != 0.0) {
// collect statistics in percent
globalStatistics->addStdDev("Quon: fraction of JOIN_REQUEST bytes sent ", joinRequestBytesSend / overallBytesSend);
globalStatistics->addStdDev("Quon: fraction of JOIN_ACKNOWLEDGE bytes sent", joinAcknowledgeBytesSend / overallBytesSend);
globalStatistics->addStdDev("Quon: fraction of NODE_MOVE bytes sent", nodeMoveBytesSend / overallBytesSend);
globalStatistics->addStdDev("Quon: fraction of NEW_NEIGHBORS bytes sent", newNeighborsBytesSend / overallBytesSend);
globalStatistics->addStdDev("Quon: fraction of NODE_LEAVE bytes sent", nodeLeaveBytesSend / overallBytesSend);
}
globalStatistics->addStdDev("Quon: max bytes/second sent", maxBytesPerSecondSend);
// We use our own time count to avoid rounding errors
// simtime_t time = globalStatistics->calcMeasuredLifetime(creationTime);
// if(time != 0.0) {
if(secTimerCount != 0) {
globalStatistics->addStdDev("Quon: average bytes/second sent", averageBytesPerSecondSend / (double) secTimerCount);
globalStatistics->addStdDev("Quon: average direct-neighbor count", directNeighborCount / (double) secTimerCount);
globalStatistics->addStdDev("Quon: average binding-neighbor count", bindingNeighborCount / (double) secTimerCount);
globalStatistics->addStdDev("Quon: average soft-neighbor count", softNeighborCount / (double) secTimerCount);
//globalStatistics->addStdDev("Quon: average rejoin count", rejoinCount);
globalStatistics->addStdDev("Quon: average AOI width", avgAOI / (double) secTimerCount);
}
changeState(QUNINITIALIZED);
}
| double Quon::getAOI | ( | ) |
| double Quon::getAreaDimension | ( | ) |
Definition at line 1122 of file Quon.cc.
{
Enter_Method_Silent();
return areaDimension;
}
| OverlayKey Quon::getKey | ( | ) |
| Vector2D Quon::getPosition | ( | ) |
| long Quon::getSoftNeighborCount | ( | ) |
Definition at line 1134 of file Quon.cc.
{
Enter_Method_Silent();
long temp = softConnections;
softConnections = 0;
return temp;
}
| QState Quon::getState | ( | ) |
Reimplemented from BaseOverlay.
Definition at line 1104 of file Quon.cc.
Referenced by ConnectivityProbeQuon::extractTopology().
{
Enter_Method_Silent();
return qstate;
}
| void Quon::handleAppMessage | ( | cMessage * | msg | ) | [virtual] |
Processes "timer" self-messages.
| msg | A self-message Processes non-commonAPI messages | |
| msg | non-commonAPIMessage |
Reimplemented from BaseOverlay.
Definition at line 214 of file Quon.cc.
{
GameAPIMessage* gameAPIMsg = dynamic_cast<GameAPIMessage*>(msg);
if(gameAPIMsg != NULL) {
// debug output
if(debugOutput) {
EV << "[Quon::handleAppMessage() @ " << thisNode.getIp()
<< " (" << thisNode.getKey().toString(16) << ")]\n"
<< " Node " << thisSite->address.getIp() << " received " << gameAPIMsg->getName() << " from application."
<< endl;
}
switch(gameAPIMsg->getCommand()) {
case MOVEMENT_INDICATION: {
GameAPIPositionMessage* gameAPIPositionMsg = dynamic_cast<GameAPIPositionMessage*>(msg);
if(qstate == QJOINING) {
handleJoin(gameAPIPositionMsg);
}
else if(qstate == QREADY) {
handleMove(gameAPIPositionMsg);
}
} break;
case GAMEEVENT_CHAT:
case GAMEEVENT_SNOW:
case GAMEEVENT_FROZEN: {
handleEvent(gameAPIMsg);
} break;
}
}
delete msg;
}
| void Quon::handleEvent | ( | GameAPIMessage * | msg | ) | [private] |
Definition at line 736 of file Quon.cc.
Referenced by handleAppMessage().
{
// send event to neighbors
for(QuonSiteMap::iterator itSites = Sites.begin(); itSites != Sites.end(); ++itSites) {
QuonEventMessage *quonMsg = new QuonEventMessage("EVENT");
quonMsg->setCommand(QUON_EVENT);
quonMsg->encapsulate((cPacket*)msg->dup());
// FIXME: Message length!
sendMessage(quonMsg, itSites->second->address);
}
}
| void Quon::handleInvalidNode | ( | QuonListMessage * | quonListMsg | ) | [private] |
Definition at line 930 of file Quon.cc.
Referenced by handleNewNeighbors(), handleNodeLeave(), and handleNodeMove().
{
return;
for(unsigned int i=0; i<quonListMsg->getNeighborHandleArraySize(); i++) {
if(deletedSites.find(quonListMsg->getNeighborHandle(i).getKey()) != deletedSites.end()) {
QuonListMessage* quonLeaveMsg = new QuonListMessage("NODE_LEAVE");
quonLeaveMsg->setCommand(NODE_LEAVE);
quonLeaveMsg->setSender(quonListMsg->getNeighborHandle(i));
quonLeaveMsg->setPosition(quonListMsg->getNeighborPosition(i));
quonLeaveMsg->setAOIsize(AOIWidth);
quonLeaveMsg->setNeighborHandleArraySize(Sites.size());
quonLeaveMsg->setNeighborPositionArraySize(Sites.size());
int i = 0;
for(QuonSiteMap::iterator itSites = Sites.begin(); itSites != Sites.end(); ++itSites) {
if(itSites->second->type == QBINDING) {
quonLeaveMsg->setNeighborHandle(i, itSites->second->address);
quonLeaveMsg->setNeighborPosition(i, itSites->second->position);
++i;
}
}
quonLeaveMsg->setNeighborHandleArraySize(i);
quonLeaveMsg->setNeighborPositionArraySize(i);
quonLeaveMsg->setBitLength(QUONLIST_L(quonLeaveMsg));
sendMessage(quonLeaveMsg, quonListMsg->getSender());
}
}
}
| void Quon::handleJoin | ( | GameAPIPositionMessage * | gameMsg | ) | [private] |
Definition at line 651 of file Quon.cc.
Referenced by handleAppMessage().
{
TransportAddress joinNode = bootstrapList->getBootstrapNode();
thisSite->position = gameMsg->getPosition();
// check if this is the only node in the overlay
if(joinNode.isUnspecified()) {
changeState(QREADY);
aloneInOverlay = true;
}
else {
QuonMessage* quonMsg = new QuonMessage("JOIN_REQUEST");
quonMsg->setCommand(JOIN_REQUEST);
quonMsg->setSender(thisSite->address);
quonMsg->setPosition(thisSite->position);
quonMsg->setAOIsize(AOIWidth);
quonMsg->setBitLength(QUON_L(quonMsg));
sendMessage(quonMsg, joinNode);
}
}
| void Quon::handleJoinAcknowledge | ( | QuonListMessage * | quonListMsg | ) | [private] |
Definition at line 793 of file Quon.cc.
Referenced by handleUDPMessage().
{
// add acceptor node
changeState(QREADY);
addSite(quonListMsg->getPosition(), quonListMsg->getSender(), quonListMsg->getAOIsize(), false, QDIRECT);
// add new neighbors
for(unsigned int i=0; i<quonListMsg->getNeighborHandleArraySize(); i++) {
addSite(quonListMsg->getNeighborPosition(i), quonListMsg->getNeighborHandle(i), quonListMsg->getAOIsize());
}
classifySites();
// update simple client
synchronizeAppNeighbors();
purgeSites();
// contact new neighbors
for(QuonSiteMap::iterator itSites = Sites.begin(); itSites != Sites.end(); ++itSites) {
QuonMoveMessage* quonMoveMsg = new QuonMoveMessage("NODE_MOVE");
quonMoveMsg->setCommand(NODE_MOVE);
quonMoveMsg->setSender(thisSite->address);
quonMoveMsg->setPosition(quonListMsg->getPosition());
quonMoveMsg->setAOIsize(AOIWidth);
quonMoveMsg->setNewPosition(thisSite->position);
if(itSites->second->type == QBINDING) {
quonMoveMsg->setIsBinding(true);
}
quonMoveMsg->setBitLength(QUONMOVE_L(quonMoveMsg));
sendMessage(quonMoveMsg, itSites->second->address);
}
bytesPerSecond = 0.0;
}
| void Quon::handleJoinRequest | ( | QuonMessage * | quonMsg | ) | [private] |
Definition at line 748 of file Quon.cc.
Referenced by handleUDPMessage().
{
Vector2D joinPosition = quonMsg->getPosition();
// start with this node
double min_dist = thisSite->position.distanceSqr(joinPosition);
QuonSite* forwardSite = thisSite;
// iterate through all neighbors
for(QuonSiteMap::iterator itSites = Sites.begin(); itSites != Sites.end(); ++itSites) {
if(itSites->second->position.distanceSqr(joinPosition) < min_dist) { //FIXME: use xy metric if desired?
min_dist = itSites->second->position.distanceSqr(joinPosition);
forwardSite = itSites->second;
}
}
// do nothing and let node retry with new position if current position is illegal
if(min_dist == 0.0) {
delete quonMsg;
}
else if(forwardSite->type == QTHIS) {
QuonListMessage* quonListMsg = new QuonListMessage("JOIN_ACKNOWLEDGE");
quonListMsg->setCommand(JOIN_ACKNOWLEDGE);
quonListMsg->setSender(thisSite->address);
quonListMsg->setPosition(thisSite->position);
quonListMsg->setAOIsize(AOIWidth);
// fill neighbors list
quonListMsg->setNeighborHandleArraySize(Sites.size());
quonListMsg->setNeighborPositionArraySize(Sites.size());
int i = 0;
for(QuonSiteMap::iterator itSites = Sites.begin(); itSites != Sites.end(); ++itSites) {
quonListMsg->setNeighborHandle(i, itSites->second->address);
quonListMsg->setNeighborPosition(i, itSites->second->position);
++i;
}
quonListMsg->setNeighborHandleArraySize(i);
quonListMsg->setNeighborPositionArraySize(i);
quonListMsg->setBitLength(QUONLIST_L(quonListMsg));
sendMessage(quonListMsg, quonMsg->getSender());
delete quonMsg;
}
else {
sendMessage(quonMsg, forwardSite->address);
}
}
| void Quon::handleMove | ( | GameAPIPositionMessage * | gameMsg | ) | [private] |
Definition at line 671 of file Quon.cc.
Referenced by handleAppMessage().
{
// adapt aoi
if(useDynamicAOI) {
adaptAoI();
classifySites();
}
Vector2D position = gameMsg->getPosition();
// send position update to neighbors
QuonMoveMessage* quonMoveMsg = new QuonMoveMessage("NODE_MOVE");
quonMoveMsg->setCommand(NODE_MOVE);
quonMoveMsg->setSender(thisSite->address);
quonMoveMsg->setPosition(thisSite->position);
quonMoveMsg->setAOIsize(AOIWidth);
quonMoveMsg->setNewPosition(position);
quonMoveMsg->setBitLength(QUONMOVE_L(quonMoveMsg));
QuonMoveMessage* quonMoveBindingMsg = new QuonMoveMessage(*quonMoveMsg);
quonMoveBindingMsg->setNeighborHandleArraySize(Sites.size());
quonMoveBindingMsg->setNeighborPositionArraySize(Sites.size());
int i = 0;
for(QuonSiteMap::iterator itSites = Sites.begin(); itSites != Sites.end(); ++itSites) {
if(itSites->second->type == QBINDING || itSites->second->softNeighbor ) {
quonMoveBindingMsg->setNeighborHandle(i, itSites->second->address);
quonMoveBindingMsg->setNeighborPosition(i, itSites->second->position);
++i;
}
}
quonMoveBindingMsg->setNeighborHandleArraySize(i);
quonMoveBindingMsg->setNeighborPositionArraySize(i);
if(i > 0) {
// speedhack:
// instead of building individual MoveMessages for every binding and softstate neighbor,
// we just send all binding/soft to every other binding/soft neighbor and pretend we did not send neighbors their own neighborslistentry
quonMoveBindingMsg->setBitLength(QUONMOVE_L(quonMoveBindingMsg) - QUONENTRY_L);
}
for(QuonSiteMap::iterator itSites = Sites.begin(); itSites != Sites.end(); ++itSites) {
QuonMoveMessage* copyMsg;
if(itSites->second->type == QBINDING || itSites->second->softNeighbor ) {
copyMsg = new QuonMoveMessage(*quonMoveBindingMsg);
if(itSites->second->type == QBINDING) {
copyMsg->setIsBinding(true);
}
else {
++softConnections;
}
}
else {
copyMsg = new QuonMoveMessage(*quonMoveMsg);
}
sendMessage(copyMsg, itSites->second->address);
}
delete quonMoveMsg;
delete quonMoveBindingMsg;
// update position
updateThisSite(position);
classifySites();
// update simple client
synchronizeAppNeighbors(QPURGESOFT);
purgeSites(QPURGESOFT);
}
| void Quon::handleNewNeighbors | ( | QuonListMessage * | quonListMsg | ) | [private] |
Definition at line 891 of file Quon.cc.
Referenced by handleUDPMessage().
{
addSite(quonListMsg->getPosition(), quonListMsg->getSender(), quonListMsg->getAOIsize(), false, QDIRECT);
// add new neighbors
handleInvalidNode(quonListMsg);
for(unsigned int i=0; i<quonListMsg->getNeighborHandleArraySize(); i++) {
addSite(quonListMsg->getNeighborPosition(i), quonListMsg->getNeighborHandle(i), quonListMsg->getAOIsize());
}
classifySites();
// update simple client
synchronizeAppNeighbors();
purgeSites();
}
| void Quon::handleNodeGracefulLeaveNotification | ( | ) | [virtual] |
This method gets call **.gracefulLeaveDelay seconds before it is killed if this node is among the gracefulLeaveProbability nodes.
Reimplemented from BaseOverlay.
Definition at line 515 of file Quon.cc.
{
if(qstate == QREADY) {
CompReadyMessage* readyMsg = new CompReadyMessage("OVERLAY_FINISHED");
readyMsg->setReady(false);
readyMsg->setComp(getThisCompType());
// TODO/FIXME: use overlay->sendMessageToAllComp(msg, getThisCompType())?
sendToApp(readyMsg);
if(Sites.size() > 0) {
// generate node leave messages
QuonListMessage* quonListMsg = new QuonListMessage("NODE_LEAVE");
quonListMsg->setCommand(NODE_LEAVE);
quonListMsg->setSender(thisSite->address);
quonListMsg->setPosition(thisSite->position);
quonListMsg->setAOIsize(AOIWidth);
// fill neighbors list
quonListMsg->setNeighborHandleArraySize(Sites.size());
quonListMsg->setNeighborPositionArraySize(Sites.size());
int i = 0;
for(QuonSiteMap::iterator itSites = Sites.begin(); itSites != Sites.end(); ++itSites) {
quonListMsg->setNeighborHandle(i, itSites->second->address);
quonListMsg->setNeighborPosition(i, itSites->second->position);
++i;
}
quonListMsg->setBitLength(QUONLIST_L(quonListMsg));
for(QuonSiteMap::iterator itSites = Sites.begin(); itSites != Sites.end(); ++itSites) {
QuonListMessage* quonCopyMsg = new QuonListMessage(*quonListMsg);
sendMessage(quonCopyMsg, itSites->second->address);
}
delete quonListMsg;
}
changeState(QUNINITIALIZED);
}
}
| void Quon::handleNodeLeave | ( | QuonListMessage * | quonListMsg | ) | [private] |
Definition at line 906 of file Quon.cc.
Referenced by handleUDPMessage().
{
deleteSite(quonListMsg->getSender());
// update simple client
deleteAppNeighbor(quonListMsg->getSender());
// insert into delete list
QuonSelfMessage* msg = new QuonSelfMessage("delete_timer");
msg->setKey(quonListMsg->getSender().getKey());
scheduleAt(simTime() + deleteTimeout, msg);
deletedSites.insert(std::make_pair(quonListMsg->getSender().getKey(), Vector2D(0,0)));
// add possible new neighbors
handleInvalidNode(quonListMsg);
for(unsigned int i=0; i<quonListMsg->getNeighborHandleArraySize(); i++) {
addSite(quonListMsg->getNeighborPosition(i), quonListMsg->getNeighborHandle(i), quonListMsg->getAOIsize(), true);
}
classifySites();
// update simple client
synchronizeAppNeighbors();
purgeSites();
}
| void Quon::handleNodeMove | ( | QuonMoveMessage * | quonMoveMsg | ) | [private] |
Definition at line 823 of file Quon.cc.
Referenced by handleUDPMessage().
{
RECORD_STATS(
globalStatistics->addStdDev(
"QuON: MoveDelay",
SIMTIME_DBL(simTime()) - SIMTIME_DBL(quonMoveMsg->getCreationTime())
);
);
// IF node was marked for deletetion, remove it from the delete list
QDeleteMap::iterator delIt = deletedSites.find(quonMoveMsg->getSender().getKey());
if( delIt != deletedSites.end() ){
deletedSites.erase( delIt );
}
// Compute old and new AOI of moving node
QuonAOI oldAOI(quonMoveMsg->getPosition(), quonMoveMsg->getAOIsize(), useSquareMetric);
QuonAOI newAOI(quonMoveMsg->getNewPosition(), quonMoveMsg->getAOIsize(), useSquareMetric);
if(useDynamicAOI) {
QuonSiteMap::iterator itSites = Sites.find(quonMoveMsg->getSender().getKey());
if(itSites != Sites.end() && itSites->second->AOIwidth < quonMoveMsg->getAOIsize()) {
oldAOI.resize(itSites->second->AOIwidth);
}
}
addSite(quonMoveMsg->getNewPosition(), quonMoveMsg->getSender(), quonMoveMsg->getAOIsize(), quonMoveMsg->getIsBinding(), QDIRECT);
// add new neighbors
handleInvalidNode(quonMoveMsg);
for(unsigned int i=0; i<quonMoveMsg->getNeighborHandleArraySize(); i++) {
addSite(quonMoveMsg->getNeighborPosition(i), quonMoveMsg->getNeighborHandle(i), quonMoveMsg->getAOIsize());
}
classifySites();
// update simple client
synchronizeAppNeighbors();
purgeSites();
// send new neighbors
QuonListMessage* quonListMsg = new QuonListMessage("NEW_NEIGHBORS");
quonListMsg->setCommand(NEW_NEIGHBORS);
quonListMsg->setSender(thisSite->address);
quonListMsg->setPosition(thisSite->position);
quonListMsg->setAOIsize(AOIWidth);
quonListMsg->setNeighborHandleArraySize(Sites.size());
quonListMsg->setNeighborPositionArraySize(Sites.size());
int i = 0;
for(QuonSiteMap::iterator itSites = Sites.begin(); itSites != Sites.end(); ++itSites) {
if(quonMoveMsg->getSender() != itSites->second->address &&
!oldAOI.collide(itSites->second->position) &&
newAOI.collide(itSites->second->position)) {
quonListMsg->setNeighborHandle(i, itSites->second->address);
quonListMsg->setNeighborPosition(i, itSites->second->position);
++i;
}
}
if(i > 0) {
quonListMsg->setNeighborHandleArraySize(i);
quonListMsg->setNeighborPositionArraySize(i);
quonListMsg->setBitLength(QUONLIST_L(quonListMsg));
sendMessage(quonListMsg, quonMoveMsg->getSender());
}
else {
delete quonListMsg;
}
}
| void Quon::handleTimerEvent | ( | cMessage * | msg | ) |
Definition at line 176 of file Quon.cc.
{
if(msg->isName("join_timer")) {
//reset timer
cancelEvent(join_timer);
if(qstate != QREADY) {
scheduleAt(simTime() + joinTimeout, msg);
// handle event
processJoinTimer();
}
}
else if(msg->isName("sec_timer")) {
//reset timer
cancelEvent(sec_timer);
scheduleAt(simTime() + 1, msg);
// handle event
processSecTimer();
}
else if(msg->isName("delete_timer")) {
// handle event
processDeleteTimer(msg);
}
else if(msg->isName("alive_timer")) {
//reset timer
cancelEvent(alive_timer);
scheduleAt(simTime() + aliveTimeout, msg);
// handle event
processAliveTimer();
}
else if(msg->isName("backup_timer")) {
//reset timer
cancelEvent(backup_timer);
scheduleAt(simTime() + backupIntervall, msg);
// handle event
processBackupTimer();
}
}
| void Quon::handleUDPMessage | ( | BaseOverlayMessage * | msg | ) | [virtual] |
Processes messages from underlay.
| msg | Message from UDP |
Reimplemented from BaseOverlay.
Definition at line 245 of file Quon.cc.
{
if(qstate == QUNINITIALIZED) {
delete msg;
return;
}
QuonMessage* quonMsg = dynamic_cast<QuonMessage*>(msg);
if(quonMsg != NULL) {
// debug output
if(debugOutput) {
EV << "[Quon::handleUDPMessage() @ " << thisNode.getIp()
<< " (" << thisNode.getKey().toString(16) << ")]\n"
<< " Node " << thisSite->address.getIp() << " received " << quonMsg->getName() << " from " << quonMsg->getSender().getIp() << "."
<< endl;
}
if(qstate == QREADY) {
switch(quonMsg->getCommand()) {
case JOIN_REQUEST: {
handleJoinRequest(quonMsg);
} break;
case NODE_MOVE: {
QuonMoveMessage* quonMoveMsg = dynamic_cast<QuonMoveMessage*>(msg);
handleNodeMove(quonMoveMsg);
delete msg;
} break;
case NEW_NEIGHBORS: {
QuonListMessage* quonListMsg = dynamic_cast<QuonListMessage*>(msg);
handleNewNeighbors(quonListMsg);
delete msg;
} break;
case NODE_LEAVE: {
QuonListMessage* quonListMsg = dynamic_cast<QuonListMessage*>(msg);
handleNodeLeave(quonListMsg);
delete msg;
} break;
case QUON_EVENT: {
sendToApp(quonMsg->decapsulate());
delete quonMsg;
} break;
}
}
else if(qstate == QJOINING && quonMsg->getCommand() == JOIN_ACKNOWLEDGE) {
QuonListMessage* quonListMsg = dynamic_cast<QuonListMessage*>(msg);
handleJoinAcknowledge(quonListMsg);
delete msg;
}
else {
delete msg;
}
}
else {
delete msg;
}
}
| void Quon::initializeOverlay | ( | int | stage | ) | [virtual] |
Initializes derived-class-attributes.
Initializes derived-class-attributes, called by BaseOverlay::initialize(). By default this method is called once. If more stages are needed one can overload numInitStages() and add more stages.
| stage | the init stage |
Reimplemented from BaseOverlay.
Definition at line 31 of file Quon.cc.
{
// because of IPAddressResolver, we need to wait until interfaces are registered,
// address auto-assignment takes place etc.
if(stage != MIN_STAGE_OVERLAY) {
return;
}
// fetch parameters
minAOI = (double)par("minAOIWidth") + (double)par("AOIBuffer"); // FIXME: use buffer only where required
maxAOI = (double)par("AOIWidth") + (double)par("AOIBuffer"); // FIXME: use buffer only where required
AOIWidth = maxAOI;
connectionLimit = par("connectionLimit");
areaDimension = par("areaDimension");
joinTimeout = par("joinTimeout");
deleteTimeout = par("deleteTimeout");
aliveTimeout = (double)par("aliveTimeout") / 2.0;
backupIntervall = par("contactBackupIntervall");
numBackups = par("numBackups");
linearAdaption = par("AOIAdaptLinear");
adaptionSensitivity = par("AOIAdaptionSensitivity");
gossipSensitivity = par("AOIGossipSensitivity");
useSquareMetric = par("useSquareMetric");
bindingBackup = new NodeHandle[numBackups][4];
// determine wether we want dynamic AOI or not
useDynamicAOI = connectionLimit > 0 && minAOI < maxAOI;
// set node key and thisSite pointer
thisNode.setKey(OverlayKey::random());
thisSite = new QuonSite();
thisSite->address = thisNode;
thisSite->type = QTHIS;
// initialize self-messages
join_timer = new cMessage("join_timer");
sec_timer = new cMessage("sec_timer");
alive_timer = new cMessage("alive_timer");
backup_timer = new cMessage("backup_timer");
// statistics
joinRequestBytesSend = 0.0;
joinAcknowledgeBytesSend = 0.0;
nodeMoveBytesSend = 0.0;
newNeighborsBytesSend = 0.0;
nodeLeaveBytesSend = 0.0;
maxBytesPerSecondSend = 0.0;
averageBytesPerSecondSend = 0.0;
bytesPerSecond = 0.0;
softConnections = 0;
softNeighborCount = 0;
bindingNeighborCount = 0;
directNeighborCount = 0;
secTimerCount = 0;
//rejoinCount = 0;
avgAOI= 0 ;
// watch some variables
WATCH(thisSite->address);
WATCH(thisSite->position);
WATCH(AOIWidth);
//WATCH_POINTER_MAP(Sites);
//WATCH_POINTER_MAP(deletedSites);
//WATCH_SET(Positions);
WATCH(joinRequestBytesSend);
WATCH(joinAcknowledgeBytesSend);
WATCH(nodeMoveBytesSend);
WATCH(newNeighborsBytesSend);
WATCH(nodeLeaveBytesSend);
WATCH(maxBytesPerSecondSend);
WATCH(bytesPerSecond);
WATCH(softConnections);
WATCH(softNeighborCount);
WATCH(bindingNeighborCount);
WATCH(directNeighborCount);
//WATCH(rejoinCount);
// set initial state
aloneInOverlay = false;
changeState(QUNINITIALIZED);
changeState(QJOINING);
}
| void Quon::processAliveTimer | ( | ) | [private] |
Definition at line 598 of file Quon.cc.
Referenced by handleTimerEvent().
{
bool rebuild = false;
QuonSiteMap::iterator itSites = Sites.begin();
while(itSites != Sites.end()) {
if(itSites->second->alive) {
itSites->second->alive = false;
++itSites;
}
else {
NodeHandle node = itSites->second->address;
QuonSelfMessage* msg = new QuonSelfMessage("delete_timer");
msg->setKey(node.getKey());
scheduleAt(simTime() + deleteTimeout, msg);
deletedSites.insert(std::make_pair(node.getKey(), itSites->second->position));
++itSites;
deleteSite(node);
// update simple client
deleteAppNeighbor(node);
if(!rebuild) {
rebuild = true;
}
}
}
if(rebuild) {
classifySites();
// update simple client
synchronizeAppNeighbors();
purgeSites();
}
}
| void Quon::processBackupTimer | ( | ) | [private] |
Definition at line 630 of file Quon.cc.
Referenced by handleTimerEvent().
{
QuonMoveMessage* quonMoveMsg = new QuonMoveMessage("NODE_MOVE");
quonMoveMsg->setCommand(NODE_MOVE);
quonMoveMsg->setSender(thisSite->address);
quonMoveMsg->setPosition(thisSite->position);
quonMoveMsg->setAOIsize(AOIWidth);
quonMoveMsg->setNewPosition(thisSite->position);
quonMoveMsg->setIsBinding(true);
for(unsigned int i=0; i<4; i++) {
for( int ii = 0; ii < numBackups; ++ii ){
if(!bindingBackup[ii][i].isUnspecified()) {
QuonMoveMessage* copyMsg = new QuonMoveMessage(*quonMoveMsg);
copyMsg->setBitLength(QUONMOVE_L(copyMsg));
sendMessage(copyMsg, bindingBackup[ii][i]);
}
}
}
delete quonMoveMsg;
}
| void Quon::processDeleteTimer | ( | cMessage * | msg | ) | [private] |
Definition at line 588 of file Quon.cc.
Referenced by handleTimerEvent().
{
QuonSelfMessage* quonMsg = dynamic_cast<QuonSelfMessage*>(msg);
QDeleteMap::iterator itSite = deletedSites.find(quonMsg->getKey());
if(itSite != deletedSites.end()) {
deletedSites.erase(itSite);
}
cancelAndDelete(quonMsg);
}
| void Quon::processJoinTimer | ( | ) | [private] |
Definition at line 551 of file Quon.cc.
Referenced by handleTimerEvent().
{
GameAPIMessage* gameMsg = new GameAPIMessage("MOVEMENT_REQUEST");
gameMsg->setCommand(MOVEMENT_REQUEST);
sendToApp(gameMsg);
}
| void Quon::processSecTimer | ( | ) | [private] |
Definition at line 558 of file Quon.cc.
Referenced by handleTimerEvent().
{
RECORD_STATS(
if(bytesPerSecond > maxBytesPerSecondSend) {
maxBytesPerSecondSend = bytesPerSecond;
}
avgAOI += AOIWidth;
averageBytesPerSecondSend += bytesPerSecond;
for(QuonSiteMap::iterator itSites = Sites.begin(); itSites != Sites.end(); ++itSites) {
switch(itSites->second->type) {
case QNEIGHBOR:
directNeighborCount++;
break;
case QBINDING:
bindingNeighborCount++;
break;
case QUNDEFINED:
if( itSites->second->softNeighbor ){
softNeighborCount++;
}
break;
case QTHIS:
break;
}
}
++secTimerCount;
);
bytesPerSecond = 0.0;
}
| int Quon::purgeSites | ( | QPurgeType | purgeSoftSites = QKEEPSOFT |
) | [private] |
Definition at line 458 of file Quon.cc.
Referenced by handleJoinAcknowledge(), handleMove(), handleNewNeighbors(), handleNodeLeave(), handleNodeMove(), and processAliveTimer().
{
int purged = 0;
QuonSiteMap::iterator itSites = Sites.begin();
while(itSites != Sites.end()) {
// Purge softNeighbors only if QPURGESOFT is set
if(itSites->second->type == QUNDEFINED && ( purgeSoftSites == QPURGESOFT || !itSites->second->softNeighbor) ) {
if(debugOutput) {
EV << "[Quon::purgeSites() @ " << thisNode.getIp()
<< " (" << thisNode.getKey().toString(16) << ")]\n"
<< " Site " << itSites->second->address.getIp() << " at " << itSites->second->position << " has been removed from the list.\n"
<< " Status: " << ((itSites->second->type == QUNDEFINED) ? "QUNDEFINED" : "QSOFT")
<< endl;
}
delete itSites->second;
Sites.erase(itSites++);
++purged;
}
else {
++itSites;
}
}
return purged;
}
| void Quon::sendMessage | ( | QuonMessage * | quonMsg, | |
| NodeHandle | destination | |||
| ) | [private] |
Definition at line 1016 of file Quon.cc.
Referenced by handleEvent(), handleInvalidNode(), handleJoin(), handleJoinAcknowledge(), handleJoinRequest(), handleMove(), handleNodeGracefulLeaveNotification(), handleNodeMove(), and processBackupTimer().
{
// collect statistics
RECORD_STATS(
switch(quonMsg->getCommand()) {
case JOIN_REQUEST:
joinRequestBytesSend += quonMsg->getByteLength();
break;
case JOIN_ACKNOWLEDGE:
joinAcknowledgeBytesSend += quonMsg->getByteLength();
break;
case NODE_MOVE:
nodeMoveBytesSend += quonMsg->getByteLength();
break;
case NEW_NEIGHBORS:
newNeighborsBytesSend += quonMsg->getByteLength();
break;
case NODE_LEAVE:
nodeLeaveBytesSend += quonMsg->getByteLength();
break;
}
if(qstate == QREADY) {
bytesPerSecond += quonMsg->getByteLength();
}
);
// debug output
if(debugOutput) {
EV << "[Quon::sendMessage() @ " << thisNode.getIp()
<< " (" << thisNode.getKey().toString(16) << ")]\n"
<< " Node " << thisSite->address.getIp() << " sending " << quonMsg->getName() << " to " << destination.getIp() << "."
<< endl;
}
sendMessageToUDP(destination, quonMsg);
}
| void Quon::sendToApp | ( | cMessage * | msg | ) | [private] |
Definition at line 1004 of file Quon.cc.
Referenced by adaptAoI(), changeState(), deleteAppNeighbor(), handleNodeGracefulLeaveNotification(), handleUDPMessage(), processJoinTimer(), and synchronizeAppNeighbors().
| void Quon::setBootstrapedIcon | ( | ) | [private] |
Definition at line 1052 of file Quon.cc.
Referenced by changeState().
{
if(ev.isGUI()) {
switch(qstate) {
case QUNINITIALIZED:
getParentModule()->getParentModule()->getDisplayString().setTagArg("i2", 1, "red");
getDisplayString().setTagArg("i", 1, "red");
break;
case QJOINING:
getParentModule()->getParentModule()->getDisplayString().setTagArg("i2", 1, "yellow");
getDisplayString().setTagArg("i", 1, "yellow");
break;
case QREADY:
getParentModule()->getParentModule()->getDisplayString().setTagArg("i2", 1, "green");
getDisplayString().setTagArg("i", 1, "green");
break;
}
}
}
| void Quon::synchronizeAppNeighbors | ( | QPurgeType | purgeSoftSites = QKEEPSOFT |
) | [private] |
Definition at line 958 of file Quon.cc.
Referenced by handleJoinAcknowledge(), handleMove(), handleNewNeighbors(), handleNodeLeave(), handleNodeMove(), and processAliveTimer().
{
GameAPIListMessage* gameMsg = new GameAPIListMessage("NEIGHBOR_UPDATE");
gameMsg->setCommand(NEIGHBOR_UPDATE);
gameMsg->setRemoveNeighborArraySize(Sites.size());
gameMsg->setAddNeighborArraySize(Sites.size());
gameMsg->setNeighborPositionArraySize(Sites.size());
int remSize, addSize;
remSize = addSize = 0;
for(QuonSiteMap::iterator itSites = Sites.begin(); itSites != Sites.end(); ++itSites) {
if(itSites->second->type == QUNDEFINED && (purgeSoftSites == QPURGESOFT || !itSites->second->softNeighbor) && itSites->second->dirty) {
gameMsg->setRemoveNeighbor(remSize, itSites->second->address);
++remSize;
}
else if(itSites->second->dirty) {
gameMsg->setAddNeighbor(addSize, itSites->second->address);
gameMsg->setNeighborPosition(addSize, itSites->second->position);
itSites->second->dirty = false;
++addSize;
}
}
if(remSize > 0 || addSize > 0) {
gameMsg->setRemoveNeighborArraySize(remSize);
gameMsg->setAddNeighborArraySize(addSize);
gameMsg->setNeighborPositionArraySize(addSize);
sendToApp(gameMsg);
}
else {
delete gameMsg;
}
}
| void Quon::updateThisSite | ( | Vector2D | p | ) | [private] |
double Quon::adaptionSensitivity [private] |
Definition at line 77 of file Quon.h.
Referenced by adaptAoI(), and initializeOverlay().
cMessage* Quon::alive_timer [private] |
Definition at line 83 of file Quon.h.
Referenced by changeState(), handleTimerEvent(), initializeOverlay(), and ~Quon().
simtime_t Quon::aliveTimeout [private] |
Definition at line 66 of file Quon.h.
Referenced by changeState(), handleTimerEvent(), and initializeOverlay().
bool Quon::aloneInOverlay [private] |
Definition at line 148 of file Quon.h.
Referenced by addSite(), classifySites(), handleJoin(), and initializeOverlay().
double Quon::AOIWidth [private] |
Definition at line 67 of file Quon.h.
Referenced by adaptAoI(), changeState(), classifySites(), getAOI(), handleInvalidNode(), handleJoin(), handleJoinAcknowledge(), handleJoinRequest(), handleMove(), handleNodeGracefulLeaveNotification(), handleNodeMove(), initializeOverlay(), processBackupTimer(), and processSecTimer().
double Quon::areaDimension [private] |
Definition at line 71 of file Quon.h.
Referenced by getAreaDimension(), and initializeOverlay().
double Quon::averageBytesPerSecondSend [private] |
Definition at line 122 of file Quon.h.
Referenced by finishOverlay(), initializeOverlay(), and processSecTimer().
unsigned long Quon::avgAOI [private] |
Definition at line 130 of file Quon.h.
Referenced by finishOverlay(), initializeOverlay(), and processSecTimer().
cMessage* Quon::backup_timer [private] |
Definition at line 84 of file Quon.h.
Referenced by changeState(), handleTimerEvent(), initializeOverlay(), and ~Quon().
simtime_t Quon::backupIntervall [private] |
Definition at line 72 of file Quon.h.
Referenced by changeState(), handleTimerEvent(), and initializeOverlay().
NodeHandle(* Quon::bindingBackup)[4] [private] |
Definition at line 143 of file Quon.h.
Referenced by classifySites(), initializeOverlay(), and processBackupTimer().
long Quon::bindingNeighborCount [private] |
Definition at line 126 of file Quon.h.
Referenced by finishOverlay(), initializeOverlay(), and processSecTimer().
double Quon::bytesPerSecond [private] |
Definition at line 123 of file Quon.h.
Referenced by handleJoinAcknowledge(), initializeOverlay(), processSecTimer(), and sendMessage().
unsigned int Quon::connectionLimit [private] |
Definition at line 70 of file Quon.h.
Referenced by adaptAoI(), and initializeOverlay().
QDeleteMap Quon::deletedSites [private] |
Definition at line 142 of file Quon.h.
Referenced by addSite(), handleInvalidNode(), handleNodeLeave(), handleNodeMove(), processAliveTimer(), and processDeleteTimer().
simtime_t Quon::deleteTimeout [private] |
Definition at line 65 of file Quon.h.
Referenced by handleNodeLeave(), initializeOverlay(), and processAliveTimer().
long Quon::directNeighborCount [private] |
Definition at line 127 of file Quon.h.
Referenced by finishOverlay(), initializeOverlay(), and processSecTimer().
double Quon::gossipSensitivity [private] |
Definition at line 78 of file Quon.h.
Referenced by adaptAoI(), and initializeOverlay().
cMessage* Quon::join_timer [private] |
Definition at line 81 of file Quon.h.
Referenced by changeState(), handleTimerEvent(), initializeOverlay(), and ~Quon().
double Quon::joinAcknowledgeBytesSend [private] |
Definition at line 117 of file Quon.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage().
double Quon::joinRequestBytesSend [private] |
Definition at line 116 of file Quon.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage().
simtime_t Quon::joinTimeout [private] |
Definition at line 64 of file Quon.h.
Referenced by handleTimerEvent(), and initializeOverlay().
bool Quon::linearAdaption [private] |
Definition at line 76 of file Quon.h.
Referenced by adaptAoI(), and initializeOverlay().
double Quon::maxAOI [private] |
Definition at line 69 of file Quon.h.
Referenced by adaptAoI(), changeState(), and initializeOverlay().
double Quon::maxBytesPerSecondSend [private] |
Definition at line 121 of file Quon.h.
Referenced by finishOverlay(), initializeOverlay(), and processSecTimer().
double Quon::minAOI [private] |
Definition at line 68 of file Quon.h.
Referenced by adaptAoI(), and initializeOverlay().
double Quon::newNeighborsBytesSend [private] |
Definition at line 119 of file Quon.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage().
double Quon::nodeLeaveBytesSend [private] |
Definition at line 120 of file Quon.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage().
double Quon::nodeMoveBytesSend [private] |
Definition at line 118 of file Quon.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage().
int Quon::numBackups [private] |
Definition at line 144 of file Quon.h.
Referenced by classifySites(), initializeOverlay(), and processBackupTimer().
QState Quon::qstate [private] |
Definition at line 147 of file Quon.h.
Referenced by getState(), handleAppMessage(), handleNodeGracefulLeaveNotification(), handleTimerEvent(), handleUDPMessage(), sendMessage(), and setBootstrapedIcon().
long Quon::rejoinCount [private] |
Definition at line 129 of file Quon.h.
Referenced by classifySites().
cMessage* Quon::sec_timer [private] |
Definition at line 82 of file Quon.h.
Referenced by changeState(), handleTimerEvent(), initializeOverlay(), and ~Quon().
unsigned int Quon::secTimerCount [private] |
Definition at line 128 of file Quon.h.
Referenced by finishOverlay(), initializeOverlay(), and processSecTimer().
Definition at line 60 of file Quon.h.
Referenced by adaptAoI(), addSite(), classifySites(), deleteSite(), ConnectivityProbeQuon::getComponentSize(), handleEvent(), handleInvalidNode(), handleJoinAcknowledge(), handleJoinRequest(), handleMove(), handleNodeGracefulLeaveNotification(), handleNodeMove(), processAliveTimer(), processSecTimer(), purgeSites(), synchronizeAppNeighbors(), and ~Quon().
long Quon::softConnections [private] |
Definition at line 124 of file Quon.h.
Referenced by getSoftNeighborCount(), handleMove(), and initializeOverlay().
long Quon::softNeighborCount [private] |
Definition at line 125 of file Quon.h.
Referenced by finishOverlay(), initializeOverlay(), and processSecTimer().
QuonSite* Quon::thisSite [private] |
Definition at line 141 of file Quon.h.
Referenced by addSite(), changeState(), classifySites(), getKey(), getPosition(), handleAppMessage(), handleJoin(), handleJoinAcknowledge(), handleJoinRequest(), handleMove(), handleNodeGracefulLeaveNotification(), handleNodeMove(), handleUDPMessage(), initializeOverlay(), processBackupTimer(), sendMessage(), sendToApp(), updateThisSite(), and ~Quon().
bool Quon::useDynamicAOI [private] |
Definition at line 73 of file Quon.h.
Referenced by handleMove(), handleNodeMove(), and initializeOverlay().
bool Quon::useSquareMetric [private] |
Definition at line 74 of file Quon.h.
Referenced by classifySites(), handleNodeMove(), and initializeOverlay().
1.7.1