#include <Gia.h>
Public Member Functions | |
void | initializeOverlay (int stage) |
initializes base class-attributes | |
void | finishOverlay () |
Writes statistical data and removes node from bootstrap oracle. | |
virtual void | changeState (int toStage) |
Set state to toStage. | |
void | updateTooltip () |
Marks nodes if they are ready. | |
~Gia () | |
Destructor. | |
void | handleTimerEvent (cMessage *msg) |
void | handleUDPMessage (BaseOverlayMessage *msg) |
Processes messages from underlay. | |
virtual void | getRoute (const OverlayKey &key, CompType destComp, CompType srcComp, cPacket *msg, const std::vector< TransportAddress > &sourceRoute=TransportAddress::UNSPECIFIED_NODES, RoutingType routingType=DEFAULT_ROUTING) |
void | handleAppMessage (cMessage *msg) |
Processes "timer" self-messages. | |
void | sendToken (const GiaNode &dst) |
Protected Member Functions | |
void | joinOverlay () |
Join the overlay with a given nodeID in thisNode.key. | |
bool | acceptNode (const GiaNode &newNode, unsigned int degree) |
Decides if Node newNode will be accepted as new neighor. | |
void | addNeighbor (GiaNode &newNode, unsigned int degree) |
Adds newNode as new neighbor. | |
void | removeNeighbor (const GiaNode &newNode) |
Removes newNode from our NeighborList. | |
double | calculateLevelOfSatisfaction () |
Calculates level of satisfaction. | |
void | sendMessage_JOIN_REQ (const NodeHandle &dst) |
Sends JOIN_REQ_Message from node src to node dst. | |
void | sendMessage_JOIN_RSP (const NodeHandle &dst) |
Sends JOIN_RSP_Message from node src to node dst. | |
void | sendMessage_JOIN_ACK (const NodeHandle &dst) |
Sends JOIN_ACK_Message from node src to node dst. | |
void | sendMessage_JOIN_DNY (const NodeHandle &dst) |
Sends JOIN_DNY_Message from node src to node dst. | |
void | sendMessage_DISCONNECT (const NodeHandle &dst) |
Sends DISCONNECT_Message from node src to node dst. | |
void | sendMessage_UPDATE (const NodeHandle &dst) |
Sends UPDATE_Message from node src to node dst. | |
void | sendKeyListToNeighbor (const NodeHandle &dst) |
Sends KeyList to node dst. | |
void | updateNeighborList (GiaMessage *msg) |
Updates neighborlist with new capacity and connectiondegree informations from received message msg. | |
void | forwardSearchResponseMessage (SearchResponseMessage *msg) |
Forwards a search response message to the next node in reverse-path. | |
void | forwardMessage (GiaIDMessage *msg, bool fromApplication) |
Forwards a message to the next random selected node, biased random walk. | |
void | processSearchMessage (SearchMessage *msg, bool fromApplication) |
Processes search message msg. | |
void | sendSearchResponseMessage (const GiaNode &srcNode, SearchMessage *msg) |
Sends a response message to a received search query. | |
void | deliverSearchResult (SearchResponseMessage *msg) |
Delivers search result to application layer. | |
Protected Attributes | |
uint32_t | maxNeighbors |
maximum number of neighbors | |
uint32_t | minNeighbors |
minimum number of neighbors | |
uint32_t | maxTopAdaptionInterval |
maximum topology adaption interval | |
uint32_t | topAdaptionAggressiveness |
the topology adaption aggressiveness | |
double | maxLevelOfSatisfaction |
maximum level of satisfaction | |
double | updateDelay |
time between to update messages (in ms) | |
uint32_t | maxHopCount |
maximum time to live for sent messages | |
uint32_t | messageTimeout |
timeout for messages | |
uint32_t | neighborTimeout |
timeout for neighbors | |
uint32_t | sendTokenTimeout |
timeout for tokens | |
uint32_t | tokenWaitTime |
delay to send a new token | |
double | keyListDelay |
delay to send the keylist to our neighbors | |
bool | outputNodeDetails |
output of node details? (on std::cout) | |
bool | optimizeReversePath |
use optimized reverse path? | |
double | levelOfSatisfaction |
current level of statisfaction | |
unsigned int | connectionDegree |
unsigned int | receivedTokens |
unsigned int | sentTokens |
GiaNode | thisGiaNode |
this node | |
NodeHandle | bootstrapNode |
next possible neighbor candidate | |
GiaMessageBookkeeping * | msgBookkeepingList |
pointer to a message bookkeeping list | |
uint32_t | stat_joinCount |
number of sent join messages | |
uint32_t | stat_joinBytesSent |
number of sent bytes of join messages | |
uint32_t | stat_joinREQ |
number of sent join request messages | |
uint32_t | stat_joinREQBytesSent |
number of sent bytes of join request messages | |
uint32_t | stat_joinRSP |
number of sent join response messages | |
uint32_t | stat_joinRSPBytesSent |
number of sent bytes of join response messages | |
uint32_t | stat_joinACK |
number of sent join acknowledge messages | |
uint32_t | stat_joinACKBytesSent |
number of sent bytes of join acknowledge messages | |
uint32_t | stat_joinDNY |
number of sent join deny messages | |
uint32_t | stat_joinDNYBytesSent |
number of sent bytes of join deny messages | |
uint32_t | stat_disconnectMessages |
number of sent disconnect messages | |
uint32_t | stat_disconnectMessagesBytesSent |
number of sent bytes of disconnect messages | |
uint32_t | stat_updateMessages |
number of sent update messages | |
uint32_t | stat_updateMessagesBytesSent |
number of sent bytes of update messages | |
uint32_t | stat_tokenMessages |
number of sent token messages | |
uint32_t | stat_tokenMessagesBytesSent |
number of sent bytes of token messages | |
uint32_t | stat_keyListMessages |
number of sent keylist messages | |
uint32_t | stat_keyListMessagesBytesSent |
number of sent bytes of keylist messages | |
uint32_t | stat_routeMessages |
number of sent route messages | |
uint32_t | stat_routeMessagesBytesSent |
number of sent bytes of route messages | |
uint32_t | stat_maxNeighbors |
maximum number of neighbors | |
uint32_t | stat_addedNeighbors |
number of added neighbors during life cycle of this node | |
uint32_t | stat_removedNeighbors |
number of removed neighbors during life cycle of this node | |
uint32_t | stat_numSatisfactionMessages |
number of satisfaction self-messages | |
double | stat_sumLevelOfSatisfaction |
sum of level of satisfaction | |
double | stat_maxLevelOfSatisfaction |
maximum level of satisfaction | |
cMessage * | satisfaction_timer |
timer for satisfaction self-message | |
cMessage * | update_timer |
timer for update self-message | |
cMessage * | timedoutMessages_timer |
timer for message timeout | |
cMessage * | timedoutNeighbors_timer |
timer for neighbors timeout | |
cMessage * | sendKeyList_timer |
timer for send keylist | |
cMessage * | sendToken_timer |
timer for send token | |
GiaKeyListModule * | keyListModule |
pointer to KeyListModule | |
GiaNeighbors * | neighbors |
pointer to neighbor list | |
GiaTokenFactory * | tokenFactory |
pointer to TokenFactory | |
GiaNeighborCandidateList | neighCand |
list of all neighbor candidates | |
GiaNeighborCandidateList | knownNodes |
list of known nodes in the overlay | |
GiaKeyList | keyList |
key list of this node |
Gia overlay module.
Implementation of the Gia overlay as described in "Making Gnutella-like P2P Systems Scalable" by Y. Chawathe et al. published at SIGCOMM'03
Definition at line 61 of file Gia.h.
Gia::~Gia | ( | ) |
Destructor.
Definition at line 1248 of file Gia.cc.
{ cancelAndDelete(satisfaction_timer); cancelAndDelete(update_timer); cancelAndDelete(timedoutMessages_timer); cancelAndDelete(timedoutNeighbors_timer); cancelAndDelete(sendKeyList_timer); cancelAndDelete(sendToken_timer); delete msgBookkeepingList; }
bool Gia::acceptNode | ( | const GiaNode & | newNode, | |
unsigned int | degree | |||
) | [protected] |
Decides if Node newNode will be accepted as new neighor.
newNode | Node to accept or deny | |
degree | the node's connection degree |
Definition at line 569 of file Gia.cc.
Referenced by handleUDPMessage().
{ if (neighbors->contains(nNode)) return false; if (neighbors->getSize() < maxNeighbors) { // we have room for new node: accept node return true; } // we need to drop a neighbor NodeHandle dropCandidate = neighbors->getDropCandidate(nNode.getCapacity(), degree); if(!dropCandidate.isUnspecified()) { if (debugOutput) EV << "(Gia) " << thisGiaNode << " drops " << dropCandidate << endl; neighbors->remove(dropCandidate); sendMessage_DISCONNECT(dropCandidate); return true; } return false; }
void Gia::addNeighbor | ( | GiaNode & | newNode, | |
unsigned int | degree | |||
) | [protected] |
Adds newNode as new neighbor.
newNode | the node to add as a neighbor | |
degree | the node's connection degree |
Definition at line 592 of file Gia.cc.
Referenced by handleUDPMessage().
{ assert(neighbors->getSize() < maxNeighbors); stat_addedNeighbors++; EV << "(Gia) " << thisGiaNode << " accepted new neighbor " << node << endl; getParentModule()->getParentModule()->bubble("New neighbor"); connectionDegree = neighbors->getSize(); changeState(READY); if (stat_maxNeighbors < neighbors->getSize()) { stat_maxNeighbors = neighbors->getSize(); } cancelEvent(update_timer); scheduleAt(simTime() + updateDelay, update_timer); //node.setSentTokens(5); //node.setReceivedTokens(5); // send keyList to new Neighbor if (keyList.getSize() > 0) sendKeyListToNeighbor(node); neighbors->add(node, degree); showOverlayNeighborArrow(node, false, "m=m,50,0,50,0;ls=red,1"); updateTooltip(); }
double Gia::calculateLevelOfSatisfaction | ( | ) | [protected] |
Calculates level of satisfaction.
Definition at line 643 of file Gia.cc.
Referenced by handleTimerEvent().
{ uint32_t neighborsCount = neighbors->getSize(); if(neighborsCount < minNeighbors) return 0.0; double total = 0.0; double levelOfSatisfaction = 0.0; for (uint32_t i=0; i < neighborsCount; i++) total += neighbors->get(i).getCapacity() / neighborsCount; assert(thisGiaNode.getCapacity() != 0); levelOfSatisfaction = total / thisGiaNode.getCapacity(); if ((levelOfSatisfaction > 1.0) || (neighborsCount >= maxNeighbors)) return 1.0; return levelOfSatisfaction; }
void Gia::changeState | ( | int | toStage | ) | [virtual] |
Set state to toStage.
toStage | the stage to change to |
Definition at line 124 of file Gia.cc.
Referenced by addNeighbor(), handleTimerEvent(), joinOverlay(), and removeNeighbor().
{ switch (toState) { case INIT: { state = INIT; setOverlayReady(false); showOverlayNeighborArrow(thisGiaNode); // set up local nodehandle //thisGiaNode.setNodeHandle(thisNode); thisGiaNode = thisNode; callUpdate(thisNode, true); // get possible bandwidth from ppp-Module double capacity = 0; cModule* nodeModule = getParentModule()->getParentModule(); if(!nodeModule->hasGate("pppg$i")) capacity += uniform(1,800000); else { // this relies on IPv4Underlay int gateSize = nodeModule->gateSize("pppg$i"); for (int i=0; i<gateSize; i++) { cGate* currentGate = nodeModule->gate("pppg$i",i); if (currentGate->isConnected()) capacity += check_and_cast<cDatarateChannel *> (currentGate->getPreviousGate()->getChannel())->getDatarate() - uniform(0,800000); } } thisGiaNode.setCapacity(capacity); //thisGiaNode.setConnectionDegree(0); //thisGiaNode.setReceivedTokens(0); //thisGiaNode.setSentTokens(0); connectionDegree = 0; receivedTokens = 0; sentTokens = 0; if (outputNodeDetails) EV << "(Gia) Node details: " << thisGiaNode << endl; // get our entry point to GIA-Overlay bootstrapNode = bootstrapList->getBootstrapNode(); if(!(bootstrapNode.isUnspecified())) knownNodes.add(bootstrapNode); //else { //assert(!(thisGiaNode.getNodeHandle().isUnspecified())); //globalNodeList->registerPeer(thisGiaNode.getNodeHandle()); //} // register node at TokenFactory //tokenFactory->setNode(&thisGiaNode); tokenFactory->setNeighbors(neighbors); tokenFactory->setMaxHopCount(maxHopCount); if (debugOutput) EV << "(Gia) Node " << thisGiaNode.getKey() << " (" << thisGiaNode.getIp() << ":" << thisGiaNode.getPort() << ") with capacity: " << thisGiaNode.getCapacity() << " entered INIT state." << endl; getParentModule()->getParentModule()->bubble("Enter INIT state."); // schedule satisfaction_timer cancelEvent(satisfaction_timer); scheduleAt(simTime(), satisfaction_timer); // schedule timedoutMessages_timer cancelEvent(timedoutMessages_timer); scheduleAt(simTime() + messageTimeout, timedoutMessages_timer); cancelEvent(timedoutNeighbors_timer); scheduleAt(simTime() + neighborTimeout, timedoutNeighbors_timer); cancelEvent(sendToken_timer); scheduleAt(simTime() + sendTokenTimeout, sendToken_timer); break; } case READY: state = READY; setOverlayReady(true); break; } updateTooltip(); }
void Gia::deliverSearchResult | ( | SearchResponseMessage * | msg | ) | [protected] |
Delivers search result to application layer.
msg | Search response message |
Definition at line 1190 of file Gia.cc.
Referenced by forwardSearchResponseMessage(), and sendSearchResponseMessage().
{ OverlayCtrlInfo* overlayCtrlInfo = new OverlayCtrlInfo(); overlayCtrlInfo->setHopCount(msg->getSearchHopCount()); overlayCtrlInfo->setSrcNode(msg->getSrcNode()); overlayCtrlInfo->setTransportType(ROUTE_TRANSPORT); GIAanswer* deliverMsg = new GIAanswer("GIA-Answer"); deliverMsg->setCommand(GIA_ANSWER); deliverMsg->setControlInfo(overlayCtrlInfo); deliverMsg->setSearchKey(msg->getSearchKey()); deliverMsg->setNode(msg->getFoundNode()); deliverMsg->setBitLength(GIAGETRSP_L(msg)); send(deliverMsg, "appOut"); if (debugOutput) EV << "(Gia) Deliver search response " << msg << " to application at " << thisGiaNode << endl; delete msg; }
void Gia::finishOverlay | ( | ) | [virtual] |
Writes statistical data and removes node from bootstrap oracle.
Reimplemented from BaseOverlay.
Definition at line 1212 of file Gia.cc.
{ // statistics globalStatistics->addStdDev("GIA: JOIN-Messages Count", stat_joinCount); globalStatistics->addStdDev("GIA: JOIN Bytes sent", stat_joinBytesSent); globalStatistics->addStdDev("GIA: JOIN::REQ Messages", stat_joinREQ); globalStatistics->addStdDev("GIA: JOIN::REQ Bytes sent", stat_joinREQBytesSent); globalStatistics->addStdDev("GIA: JOIN::RSP Messages", stat_joinRSP); globalStatistics->addStdDev("GIA: JOIN::RSP Bytes sent", stat_joinRSPBytesSent); globalStatistics->addStdDev("GIA: JOIN::ACK Messages", stat_joinACK); globalStatistics->addStdDev("GIA: JOIN::ACK Bytes sent", stat_joinACKBytesSent); globalStatistics->addStdDev("GIA: JOIN::DNY Messages", stat_joinDNY); globalStatistics->addStdDev("GIA: JOIN::DNY Bytes sent", stat_joinDNYBytesSent); globalStatistics->addStdDev("GIA: DISCONNECT:IND Messages", stat_disconnectMessages); globalStatistics->addStdDev("GIA: DISCONNECT:IND Bytes sent", stat_disconnectMessagesBytesSent); globalStatistics->addStdDev("GIA: UPDATE:IND Messages", stat_updateMessages); globalStatistics->addStdDev("GIA: UPDATE:IND Bytes sent", stat_updateMessagesBytesSent); globalStatistics->addStdDev("GIA: TOKEN:IND Messages", stat_tokenMessages); globalStatistics->addStdDev("GIA: TOKEN:IND Bytes sent", stat_tokenMessagesBytesSent); globalStatistics->addStdDev("GIA: KEYLIST:IND Messages", stat_keyListMessages); globalStatistics->addStdDev("GIA: KEYLIST:IND Bytes sent", stat_keyListMessagesBytesSent); globalStatistics->addStdDev("GIA: ROUTE:IND Messages", stat_routeMessages); globalStatistics->addStdDev("GIA: ROUTE:IND Bytes sent", stat_routeMessagesBytesSent); globalStatistics->addStdDev("GIA: Neighbors max", stat_maxNeighbors); globalStatistics->addStdDev("GIA: Neighbors added", stat_addedNeighbors); globalStatistics->addStdDev("GIA: Neighbors removed", stat_removedNeighbors); globalStatistics->addStdDev("GIA: Level of satisfaction messages ", stat_numSatisfactionMessages); globalStatistics->addStdDev("GIA: Level of satisfaction max ",stat_maxLevelOfSatisfaction); globalStatistics->addStdDev("GIA: Level of satisfaction avg ", stat_sumLevelOfSatisfaction / stat_numSatisfactionMessages); bootstrapList->removeBootstrapNode(thisGiaNode); }
void Gia::forwardMessage | ( | GiaIDMessage * | msg, | |
bool | fromApplication | |||
) | [protected] |
Forwards a message to the next random selected node, biased random walk.
msg | Message to forward to next node | |
fromApplication | Marks if message is from application layer |
Definition at line 872 of file Gia.cc.
Referenced by getRoute(), handleTimerEvent(), handleUDPMessage(), and processSearchMessage().
{ if (msg->getHopCount() == 0) { // Max-Hopcount reached. Discard message if (!fromApplication) tokenFactory->grantToken(); RECORD_STATS(numDropped++; bytesDropped += msg->getByteLength()); delete msg; } else { // local delivery? if (msg->getDestKey() == thisGiaNode.getKey()) { if(!fromApplication) tokenFactory->grantToken(); if(debugOutput) EV << "(Gia) Deliver messsage " << msg << " to application at " << thisGiaNode << endl; OverlayCtrlInfo* overlayCtrlInfo = new OverlayCtrlInfo(); overlayCtrlInfo->setHopCount(msg->getHopCount()); overlayCtrlInfo->setSrcNode(msg->getSrcNode()); overlayCtrlInfo->setTransportType(ROUTE_TRANSPORT); overlayCtrlInfo->setDestComp(TIER1_COMP); // workaround overlayCtrlInfo->setSrcComp(TIER1_COMP); msg->setControlInfo(overlayCtrlInfo); callDeliver(msg, msg->getDestKey()); } else { // forward message to next hop // do we know the destination-node? if (neighbors->contains(msg->getDestKey())) { // yes, destination-Node is our neighbor NodeHandle targetNode = neighbors->get(msg->getDestKey()); GiaNeighborInfo* targetInfo= neighbors->get(targetNode); if (targetInfo->receivedTokens == 0) { // wait for free token if (debugOutput) EV << "(Gia) No free Node, wait for free token" << endl; //bad code std::string id; if (!fromApplication) id = "wait-for-token: " + msg->getID().toString(); else id = "wait-for-token-fromapp: " + msg->getID().toString(); cPacket* wait_timer = new cPacket(id.c_str()); wait_timer->encapsulate(msg); scheduleAt(simTime() + tokenWaitTime,wait_timer); return; } else { // decrease nextHop-tokencount neighbors->decreaseReceivedTokens(targetNode); //targetInfo->receivedTokens = targetInfo->receivedTokens - 1; // forward msg to nextHop msg->setHopCount(msg->getHopCount()-1); msg->setSrcNode(thisGiaNode); msg->setSrcCapacity(thisGiaNode.getCapacity()); msg->setSrcDegree(connectionDegree); if (debugOutput) EV << "(Gia) Forwarding message " << msg << " to neighbor " << targetNode << endl; if (!fromApplication) tokenFactory->grantToken(); stat_routeMessagesBytesSent += msg->getByteLength(); stat_routeMessages += 1; if(msg->getHopCount() > 0) RECORD_STATS(numAppDataForwarded++; bytesAppDataForwarded += msg->getByteLength()); sendMessageToUDP(targetNode, msg); } } else { // no => pick node with at least one token and highest capacity if (!msgBookkeepingList->contains(msg)) msgBookkeepingList->addMessage(msg); NodeHandle nextHop = msgBookkeepingList->getNextHop(msg); // do we have a neighbor who send us a token? if(nextHop.isUnspecified()) { // wait for free token if (debugOutput) EV << "(Gia) No free Node, wait for free token" << endl; std::string id; if (!fromApplication) id = "wait-for-token: " + msg->getID().toString(); else id = "wait-for-token-fromapp: " + msg->getID().toString(); cPacket* wait_timer = new cPacket(id.c_str()); wait_timer->encapsulate(msg); scheduleAt(simTime() + tokenWaitTime,wait_timer); return; } else { GiaNeighborInfo* nextHopInfo = neighbors->get(nextHop); if(nextHopInfo == NULL) { delete msg; return; //??? } // decrease nextHop-tokencount neighbors->decreaseReceivedTokens(nextHop); //nextHopInfo->receivedTokens--; // forward msg to nextHop msg->setHopCount(msg->getHopCount()-1); msg->setSrcNode(thisGiaNode); msg->setSrcCapacity(thisGiaNode.getCapacity()); msg->setSrcDegree(connectionDegree); if (debugOutput) EV << "(Gia) Forwarding message " << msg << " to " << nextHop << endl; if (!fromApplication) tokenFactory->grantToken(); stat_routeMessagesBytesSent += msg->getByteLength(); stat_routeMessages += 1; if(msg->getHopCount() > 0) RECORD_STATS(numAppDataForwarded++; bytesAppDataForwarded += msg->getByteLength()); sendMessageToUDP(nextHop, msg); } } } } }
void Gia::forwardSearchResponseMessage | ( | SearchResponseMessage * | msg | ) | [protected] |
Forwards a search response message to the next node in reverse-path.
msg | Message to forward to next node |
Definition at line 828 of file Gia.cc.
Referenced by handleUDPMessage(), and sendSearchResponseMessage().
{ if (responseMsg->getHopCount() != 0) { uint32_t reversePathArraySize = responseMsg->getReversePathArraySize(); // reached node which started search? if (reversePathArraySize == 0) { deliverSearchResult(responseMsg); } // forward message to next node in reverse path list else { NodeHandle targetNode = neighbors->get (responseMsg->getReversePath( reversePathArraySize-1)); if(!(targetNode.isUnspecified())) { responseMsg->setDestKey(targetNode.getKey()); responseMsg->setReversePathArraySize(reversePathArraySize-1); for (uint32_t i=0; i<reversePathArraySize-1; i++) responseMsg->setReversePath(i, responseMsg->getReversePath(i)); responseMsg->setBitLength(responseMsg->getBitLength() - KEY_L); stat_routeMessagesBytesSent += responseMsg->getByteLength(); stat_routeMessages += 1; if(responseMsg->getHopCount() > 0) RECORD_STATS(numAppDataForwarded++; bytesAppDataForwarded += responseMsg->getByteLength()); sendMessageToUDP(targetNode, responseMsg); } else { EV << "(Gia) wrong reverse path in " << *responseMsg << " ... deleted!" << endl; RECORD_STATS(numDropped++; bytesDropped += responseMsg->getByteLength()); delete responseMsg; } } } // max hopcount reached. delete message else delete responseMsg; }
void Gia::getRoute | ( | const OverlayKey & | key, | |
CompType | destComp, | |||
CompType | srcComp, | |||
cPacket * | msg, | |||
const std::vector< TransportAddress > & | sourceRoute = TransportAddress::UNSPECIFIED_NODES , |
|||
RoutingType | routingType = DEFAULT_ROUTING | |||
) | [virtual] |
Definition at line 1006 of file Gia.cc.
{ if ((destComp != TIER1_COMP) || (srcComp != TIER1_COMP)) { throw cRuntimeError("Gia::getRoute(): Works currently " "only with srcComp=destComp=TIER1_COMP!"); } if (state == READY) { GiaRouteMessage* routeMsg = new GiaRouteMessage("ROUTE"); routeMsg->setStatType(APP_DATA_STAT); routeMsg->setCommand(ROUTE); routeMsg->setHopCount(maxHopCount); routeMsg->setDestKey(key); routeMsg->setSrcNode(thisGiaNode); routeMsg->setSrcCapacity(thisGiaNode.getCapacity()); routeMsg->setSrcDegree(connectionDegree); routeMsg->setOriginatorKey(thisGiaNode.getKey()); routeMsg->setOriginatorIP(thisGiaNode.getIp()); routeMsg->setOriginatorPort(thisGiaNode.getPort()); routeMsg->setID(OverlayKey::random()); routeMsg->setBitLength(GIAROUTE_L(routeMsg)); routeMsg->encapsulate(msg); forwardMessage(routeMsg, true); } else { RECORD_STATS(numDropped++; bytesDropped += msg->getByteLength()); delete msg; } }
void Gia::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 1040 of file Gia.cc.
{ // do we receive a keylist? if (dynamic_cast<GIAput*>(msg) != NULL) { GIAput* putMsg = check_and_cast<GIAput*>(msg); uint32_t keyListSize = putMsg->getKeysArraySize(); for (uint32_t k=0; k<keyListSize; k++) keyList.addKeyItem(putMsg->getKeys(k)); // actualize vector in KeyListModule keyListModule->setKeyListVector(keyList.getVector()); scheduleAt(simTime() + keyListDelay, sendKeyList_timer); delete putMsg; } else if (dynamic_cast<GIAsearch*>(msg) != NULL) { if (state == READY) { GIAsearch* getMsg = check_and_cast<GIAsearch*>(msg); SearchMessage* searchMsg = new SearchMessage("SEARCH"); searchMsg->setCommand(SEARCH); searchMsg->setStatType(APP_DATA_STAT); searchMsg->setHopCount(maxHopCount); searchMsg->setDestKey(getMsg->getSearchKey()); searchMsg->setSrcNode(thisGiaNode); searchMsg->setSrcCapacity(thisGiaNode.getCapacity()); searchMsg->setSrcDegree(connectionDegree); searchMsg->setSearchKey(getMsg->getSearchKey()); searchMsg->setMaxResponses(getMsg->getMaxResponses()); searchMsg->setReversePathArraySize(0); searchMsg->setID(OverlayKey::random()); searchMsg->setBitLength(SEARCH_L(searchMsg)); processSearchMessage(searchMsg, true); delete getMsg; } else delete msg; } else { delete msg; EV << "(Gia) unkown message from app deleted!" << endl; } }
void Gia::handleTimerEvent | ( | cMessage * | msg | ) |
Definition at line 261 of file Gia.cc.
{ if (msg == sendToken_timer) { tokenFactory->grantToken(); } else if (msg->isName("satisfaction_timer")) { // calculate level of satisfaction and select new neighbor candidate levelOfSatisfaction = calculateLevelOfSatisfaction(); stat_numSatisfactionMessages++; stat_sumLevelOfSatisfaction += levelOfSatisfaction; if (levelOfSatisfaction > stat_maxLevelOfSatisfaction) stat_maxLevelOfSatisfaction = levelOfSatisfaction; // start again satisfaction_timer scheduleAt(simTime() + (maxTopAdaptionInterval * pow(topAdaptionAggressiveness, -(1 - levelOfSatisfaction))), satisfaction_timer); // Only search a new neighbor if level of satisfaction is // under level of maxLevelOfSatisfaction if(levelOfSatisfaction < maxLevelOfSatisfaction) { if(knownNodes.getSize() == 0) { if(neighbors->getSize() == 0 && neighCand.getSize() == 0) knownNodes.add(globalNodeList->getBootstrapNode()/*bootstrapList->getBootstrapNode()*/); else return; } NodeHandle possibleNeighbor = knownNodes.getRandomCandidate(); if(!(possibleNeighbor.isUnspecified()) && thisGiaNode != possibleNeighbor && !neighbors->contains(possibleNeighbor) && !neighCand.contains(possibleNeighbor)) { // try to add new neighbor neighCand.add(possibleNeighbor); sendMessage_JOIN_REQ(possibleNeighbor); } } } else if (msg->isName("update_timer")) { // send current capacity and degree to all neighbors for (uint32_t i=0; i<neighbors->getSize(); i++) { sendMessage_UPDATE(neighbors->get(i)); } } else if (msg->isName("timedoutMessages_timer")) { // remove timedout messages msgBookkeepingList->removeTimedoutMessages(); scheduleAt(simTime() + messageTimeout, timedoutMessages_timer); } else if (msg->isName("timedoutNeighbors_timer")) { // remove timedout neighbors neighbors->removeTimedoutNodes(); if (neighbors->getSize() == 0) { changeState(INIT); } cancelEvent(timedoutNeighbors_timer); scheduleAt(simTime() + neighborTimeout, timedoutNeighbors_timer); } else if (msg->isName("sendKeyList_timer")) { if (keyList.getSize() > 0) { // send keyList to all of our neighbors for (uint32_t i=0; i<neighbors->getSize(); i++) sendKeyListToNeighbor(neighbors->get(i)); } } else { // other self-messages are notoken-self-messages // with an encapsulated message const std::string id = msg->getName(); if (id.substr(0, 16) == std::string("wait-for-token: ")) { cPacket* packet = check_and_cast<cPacket*>(msg); cMessage* decapsulatedMessage = packet->decapsulate(); if (dynamic_cast<GiaIDMessage*>(decapsulatedMessage) != NULL) { GiaIDMessage* message = check_and_cast<GiaIDMessage*> (decapsulatedMessage); forwardMessage(message, false); } } else if (id.substr(0, 24) == std::string("wait-for-token-fromapp: ")) { cPacket* packet = check_and_cast<cPacket*>(msg); cMessage* decapsulatedMessage = packet->decapsulate(); if (dynamic_cast<GiaIDMessage*>(decapsulatedMessage) != NULL) { GiaIDMessage* message = check_and_cast<GiaIDMessage*> (decapsulatedMessage); forwardMessage(message, true); } } delete msg; } }
void Gia::handleUDPMessage | ( | BaseOverlayMessage * | msg | ) | [virtual] |
Processes messages from underlay.
msg | Message from UDP |
Reimplemented from BaseOverlay.
Definition at line 351 of file Gia.cc.
{ if(debugOutput) EV << "(Gia) " << thisGiaNode << " received udp message" << endl; cPolymorphic* ctrlInfo = msg->removeControlInfo(); if(ctrlInfo != NULL) delete ctrlInfo; // Parse TokenMessages if (dynamic_cast<TokenMessage*>(msg) != NULL) { TokenMessage* giaMsg = check_and_cast<TokenMessage*>(msg); // Process TOKEN-Message if ((giaMsg->getCommand() == TOKEN)) { if(debugOutput) EV << "(Gia) Received Tokenmessage from " << giaMsg->getSrcNode() << endl; //neighbors->setReceivedTokens(giaMsg->getSrcNode(), giaMsg->getDstTokenNr()); neighbors->increaseReceivedTokens(giaMsg->getSrcNode()); updateNeighborList(giaMsg); } delete msg; } // Process Route messages else if (dynamic_cast<GiaRouteMessage*>(msg) != NULL) { GiaRouteMessage* giaMsg = check_and_cast<GiaRouteMessage*>(msg); GiaNode oppositeNode(giaMsg->getSrcNode(), giaMsg->getSrcCapacity(), giaMsg->getSrcDegree()); if((giaMsg->getCommand() == ROUTE)) { if(debugOutput) EV << "(Gia) Received ROUTE::IND from " << oppositeNode << endl; if(state == READY) { //neighbors->decreaseReceivedTokens(giaMsg->getSrcNode()); updateNeighborList(giaMsg); forwardMessage(giaMsg, false); } } } // Process KeyList-Messages else if (dynamic_cast<KeyListMessage*>(msg) != NULL) { KeyListMessage* giaMsg = check_and_cast<KeyListMessage*>(msg); GiaNode oppositeNode(giaMsg->getSrcNode(), giaMsg->getSrcCapacity(), giaMsg->getSrcDegree()); if (giaMsg->getCommand() == KEYLIST) { if (debugOutput) EV << "(Gia) " << thisGiaNode << " received KEYLIST:IND message" << endl; // update KeyList in neighborList uint32_t keyListSize = giaMsg->getKeysArraySize(); GiaKeyList neighborKeyList; for (uint32_t k = 0; k < keyListSize; k++) neighborKeyList.addKeyItem(giaMsg->getKeys(k)); neighbors->setNeighborKeyList(giaMsg->getSrcNode(), neighborKeyList); } delete giaMsg; } // Process Search-Messages else if (dynamic_cast<SearchMessage*>(msg) != NULL) { SearchMessage* giaMsg = check_and_cast<SearchMessage*>(msg); GiaNode oppositeNode(giaMsg->getSrcNode(), giaMsg->getSrcCapacity(), giaMsg->getSrcDegree()); //neighbors->decreaseSentTokens(giaMsg->getSrcNode()); updateNeighborList(giaMsg); processSearchMessage(giaMsg, false); // } else { // EV << "(Gia) Message " << msg << " dropped!" << endl; // RECORD_STATS(numDropped++; bytesDropped += msg->getByteLength()); // delete msg; // } } // Process Search-Response-Messages else if (dynamic_cast<SearchResponseMessage*>(msg) != NULL) { SearchResponseMessage* responseMsg = check_and_cast<SearchResponseMessage*>(msg); forwardSearchResponseMessage(responseMsg); } // Process Gia messages else if (dynamic_cast<GiaMessage*>(msg) != NULL) { GiaMessage* giaMsg = check_and_cast<GiaMessage*>(msg); //assert(giaMsg->getSrcNode().moduleId != -1); GiaNode oppositeNode(giaMsg->getSrcNode(), giaMsg->getSrcCapacity(), giaMsg->getSrcDegree()); if (debugOutput) EV << "(Gia) " << thisGiaNode << " received GIA- message from " << oppositeNode << endl; updateNeighborList(giaMsg); // Process JOIN:REQ messages if (giaMsg->getCommand() == JOIN_REQUEST) { if (debugOutput) EV << "(Gia) " << thisGiaNode << " received JOIN:REQ message" << endl; if (acceptNode(oppositeNode, giaMsg->getSrcDegree())) { neighCand.add(oppositeNode); sendMessage_JOIN_RSP(oppositeNode); } else { if (debugOutput) EV << "(Gia) " << thisGiaNode << " denies node " << oppositeNode << endl; sendMessage_JOIN_DNY(oppositeNode); } } // Process JOIN:RSP messages else if (giaMsg->getCommand() == JOIN_RESPONSE) { if(debugOutput) EV << "(Gia) " << thisGiaNode << " received JOIN:RSP message" << endl; if(neighCand.contains(oppositeNode)) { neighCand.remove(oppositeNode); if(acceptNode(oppositeNode, giaMsg->getSrcDegree())) { addNeighbor(oppositeNode, giaMsg->getSrcDegree()); GiaNeighborMessage* msg = check_and_cast<GiaNeighborMessage*>(giaMsg); for(uint32_t i = 0; i < msg->getNeighborsArraySize(); i++) { GiaNode temp = msg->getNeighbors(i); if(temp != thisGiaNode && temp != oppositeNode) knownNodes.add(temp); } sendMessage_JOIN_ACK(oppositeNode); } else { if (debugOutput) EV << "(Gia) " << thisGiaNode << " denies node " << oppositeNode << endl; sendMessage_JOIN_DNY(oppositeNode); } } } // Process JOIN:ACK messages else if (giaMsg->getCommand() == JOIN_ACK) { if (debugOutput) EV << "(Gia) " << thisGiaNode << " received JOIN:ACK message" << endl; if (neighCand.contains(oppositeNode) && neighbors->getSize() < maxNeighbors) { neighCand.remove(oppositeNode); addNeighbor(oppositeNode, giaMsg->getSrcDegree()); GiaNeighborMessage* msg = check_and_cast<GiaNeighborMessage*>(giaMsg); for(uint32_t i = 0; i < msg->getNeighborsArraySize(); i++) { GiaNode temp = msg->getNeighbors(i); if(temp != thisGiaNode && temp != oppositeNode) knownNodes.add(msg->getNeighbors(i)); } } else { sendMessage_DISCONNECT(oppositeNode); } } // Process JOIN:DNY messages else if (giaMsg->getCommand() == JOIN_DENY) { if (debugOutput) EV << "(Gia) " << thisGiaNode << " received JOIN:DNY message" << endl; if (neighCand.contains(oppositeNode)) neighCand.remove(oppositeNode); knownNodes.remove(oppositeNode); } // Process DISCONNECT-Message else if (giaMsg->getCommand() == DISCONNECT) { if (debugOutput) EV << "(Gia) " << thisGiaNode << " received DISCONNECT:IND message" << endl; removeNeighbor(giaMsg->getSrcNode()); } // Process UPDATE-Message else if (giaMsg->getCommand() == UPDATE) { if (debugOutput) EV << "(Gia) " << thisGiaNode << " received UPDATE:IND message" << endl; neighbors->setConnectionDegree(giaMsg->getSrcNode(), giaMsg->getSrcDegree()); //neighbors->setCapacity(giaMsg->getSrcNode(), //giaMsg->getSrcCapacity()); } else { // Show unknown gia-messages if (debugOutput) { EV << "(Gia) NODE: "<< thisGiaNode << endl << " Command: " << giaMsg->getCommand() << endl << " HopCount: " << giaMsg->getHopCount() << endl << " SrcKey: " << giaMsg->getSrcNode().getKey() << endl << " SrcIP: " << giaMsg->getSrcNode().getKey() << endl << " SrcPort: " << giaMsg->getSrcNode().getPort() << endl << " SrcCapacity: " << giaMsg->getSrcCapacity() << endl << " SrcDegree: " << giaMsg->getSrcDegree() << endl; RECORD_STATS(numDropped++;bytesDropped += giaMsg->getByteLength()); } } delete giaMsg; } else // PROCESS other messages than GiaMessages delete msg; // delete them all }
void Gia::initializeOverlay | ( | int | stage | ) | [virtual] |
initializes base class-attributes
stage | the init stage |
Reimplemented from BaseOverlay.
Definition at line 39 of file Gia.cc.
{ // wait until IPAddressResolver initialized all interfaces and assigns addresses if(stage != MIN_STAGE_OVERLAY) return; // Get parameters from omnetpp.ini maxNeighbors = par("maxNeighbors"); minNeighbors = par("minNeighbors"); maxTopAdaptionInterval = par("maxTopAdaptionInterval"); topAdaptionAggressiveness = par("topAdaptionAggressiveness"); maxLevelOfSatisfaction = par("maxLevelOfSatisfaction"); updateDelay = par("updateDelay"); maxHopCount = par("maxHopCount"); //obsolete messageTimeout = par("messageTimeout"); neighborTimeout = par("neighborTimeout"); sendTokenTimeout = par("sendTokenTimeout"); tokenWaitTime = par("tokenWaitTime"); keyListDelay = par("keyListDelay"); outputNodeDetails = par("outputNodeDetails"); optimizeReversePath = par("optimizeReversePath"); // get references on necessary modules keyListModule = check_and_cast<GiaKeyListModule*> (getParentModule()->getSubmodule("keyListModule")); neighbors = check_and_cast<GiaNeighbors*> (getParentModule()->getSubmodule("neighbors")); tokenFactory = check_and_cast<GiaTokenFactory*> (getParentModule()->getSubmodule("tokenFactory")); msgBookkeepingList = new GiaMessageBookkeeping(neighbors, messageTimeout); // clear neighbor candidate list neighCand.clear(); knownNodes.clear(); WATCH(thisGiaNode); WATCH(bootstrapNode); WATCH(levelOfSatisfaction); // self-messages satisfaction_timer = new cMessage("satisfaction_timer"); update_timer = new cMessage("update_timer"); timedoutMessages_timer = new cMessage("timedoutMessages_timer"); timedoutNeighbors_timer = new cMessage("timedoutNeighbors_timer"); sendKeyList_timer = new cMessage("sendKeyList_timer"); sendToken_timer = new cMessage("sendToken_timer"); // statistics stat_joinCount = 0; stat_joinBytesSent = 0; stat_joinREQ = 0; stat_joinREQBytesSent = 0; stat_joinRSP = 0; stat_joinRSPBytesSent = 0; stat_joinACK = 0; stat_joinACKBytesSent = 0; stat_joinDNY = 0; stat_joinDNYBytesSent = 0; stat_disconnectMessages = 0; stat_disconnectMessagesBytesSent = 0; stat_updateMessages = 0; stat_updateMessagesBytesSent = 0; stat_tokenMessages = 0; stat_tokenMessagesBytesSent = 0; stat_keyListMessages = 0; stat_keyListMessagesBytesSent = 0; stat_routeMessages = 0; stat_routeMessagesBytesSent = 0; stat_maxNeighbors = 0; stat_addedNeighbors = 0; stat_removedNeighbors = 0; stat_numSatisfactionMessages = 0; stat_sumLevelOfSatisfaction = 0.0; stat_maxLevelOfSatisfaction = 0.0; }
void Gia::joinOverlay | ( | ) | [protected, virtual] |
Join the overlay with a given nodeID in thisNode.key.
Join the overlay with a given nodeID in thisNode.key. This method may be called by an application to join the overlay with a specific nodeID. It is also called if the node's IP address changes.
Reimplemented from BaseOverlay.
Definition at line 116 of file Gia.cc.
{ changeState(INIT); if (bootstrapNode.isUnspecified()) changeState(READY); }
void Gia::processSearchMessage | ( | SearchMessage * | msg, | |
bool | fromApplication | |||
) | [protected] |
Processes search message msg.
Generates Search_Response_Messages
msg | Search message | |
fromApplication | Marks if message is from application layer |
Definition at line 1147 of file Gia.cc.
Referenced by handleAppMessage(), and handleUDPMessage().
{ OverlayKey searchKey = msg->getSearchKey(); if (keyList.contains(searchKey)) { // this node contains search key sendSearchResponseMessage(thisGiaNode, msg); } // check if neighbors contain search key for (uint32_t i = 0; i < neighbors->getSize(); i++) { GiaKeyList* keyList = neighbors->getNeighborKeyList(neighbors->get(i)); if (keyList->contains(searchKey)) sendSearchResponseMessage(neighbors->get(i), msg); } // forward search-message to next hop if (msg->getMaxResponses() > 0) { // actualize reverse path uint32_t reversePathSize = msg->getReversePathArraySize(); if (optimizeReversePath) for (uint32_t i=0; i<reversePathSize; i++) { if (msg->getReversePath(i) == thisGiaNode.getKey()) { // Our node already in ReversePath. // Delete successor nodes from ReversePath msg->setBitLength(msg->getBitLength() - (reversePathSize - i)*KEY_L); reversePathSize = i; // set new array size break; } } msg->setReversePathArraySize(reversePathSize+1); msg->setReversePath(reversePathSize, thisGiaNode.getKey()); msg->setBitLength(msg->getBitLength() + KEY_L); forwardMessage(msg, fromApplication); } else { tokenFactory->grantToken(); delete msg; } }
void Gia::removeNeighbor | ( | const GiaNode & | newNode | ) | [protected] |
Removes newNode from our NeighborList.
newNode | NodeHandle of the node to remove from neighbors |
Definition at line 621 of file Gia.cc.
Referenced by handleUDPMessage().
{ stat_removedNeighbors++; if (debugOutput) EV << "(Gia) " << thisGiaNode << " removes " << node << " from neighborlist." << endl; neighbors->remove(node); connectionDegree = neighbors->getSize(); if (neighbors->getSize() == 0) { changeState(INIT); } deleteOverlayNeighborArrow(node); updateTooltip(); cancelEvent(update_timer); scheduleAt(simTime() + updateDelay, update_timer); }
void Gia::sendKeyListToNeighbor | ( | const NodeHandle & | dst | ) | [protected] |
Sends KeyList to node dst.
dst,: | Destination |
Definition at line 780 of file Gia.cc.
Referenced by addNeighbor(), and handleTimerEvent().
{ // send KEYLIST:IND message KeyListMessage* msg = new KeyListMessage("KEYLIST"); msg->setCommand(KEYLIST); msg->setSrcNode(thisGiaNode); msg->setSrcCapacity(thisGiaNode.getCapacity()); msg->setSrcDegree(connectionDegree); msg->setKeysArraySize(keyList.getSize()); for (uint32_t i=0; i<keyList.getSize(); i++) msg->setKeys(i, keyList.get(i)); msg->setBitLength(KEYLIST_L(msg)); stat_keyListMessagesBytesSent += msg->getByteLength(); stat_keyListMessages += 1; sendMessageToUDP(dst, msg); }
void Gia::sendMessage_DISCONNECT | ( | const NodeHandle & | dst | ) | [protected] |
Sends DISCONNECT_Message from node src to node dst.
dst,: | Destination |
Definition at line 748 of file Gia.cc.
Referenced by acceptNode(), and handleUDPMessage().
{ // send DISCONNECT:IND message GiaMessage* msg = new GiaMessage("DISCONNECT"); msg->setCommand(DISCONNECT); msg->setSrcNode(thisGiaNode); msg->setSrcCapacity(thisGiaNode.getCapacity()); msg->setSrcDegree(connectionDegree); msg->setBitLength(GIA_L(msg)); stat_disconnectMessagesBytesSent += msg->getByteLength(); stat_disconnectMessages += 1; sendMessageToUDP(dst, msg); }
void Gia::sendMessage_JOIN_ACK | ( | const NodeHandle & | dst | ) | [protected] |
Sends JOIN_ACK_Message from node src to node dst.
dst,: | Destination |
Definition at line 706 of file Gia.cc.
Referenced by handleUDPMessage().
{ // send JOIN:ACK message GiaNeighborMessage* msg = new GiaNeighborMessage("JOIN_ACK"); msg->setCommand(JOIN_ACK); msg->setSrcNode(thisGiaNode); msg->setSrcCapacity(thisGiaNode.getCapacity()); msg->setSrcDegree(connectionDegree); msg->setNeighborsArraySize(neighbors->getSize()); //TODO: add parameter maxSendNeighbors for(uint32_t i = 0; i < neighbors->getSize(); i++) msg->setNeighbors(i, neighbors->get(i)); msg->setBitLength(GIANEIGHBOR_L(msg)); stat_joinCount += 1; stat_joinBytesSent += msg->getByteLength(); stat_joinACK += 1; stat_joinACKBytesSent += msg->getByteLength(); sendMessageToUDP(dst, msg); }
void Gia::sendMessage_JOIN_DNY | ( | const NodeHandle & | dst | ) | [protected] |
Sends JOIN_DNY_Message from node src to node dst.
dst,: | Destination |
Definition at line 730 of file Gia.cc.
Referenced by handleUDPMessage().
{ // send JOIN:DNY message GiaMessage* msg = new GiaMessage("JOIN_DENY"); msg->setCommand(JOIN_DENY); msg->setSrcNode(thisGiaNode); msg->setSrcCapacity(thisGiaNode.getCapacity()); msg->setSrcDegree(connectionDegree); msg->setBitLength(GIA_L(msg)); stat_joinCount += 1; stat_joinBytesSent += msg->getByteLength(); stat_joinDNY += 1; stat_joinDNYBytesSent += msg->getByteLength(); sendMessageToUDP(dst, msg); }
void Gia::sendMessage_JOIN_REQ | ( | const NodeHandle & | dst | ) | [protected] |
Sends JOIN_REQ_Message from node src to node dst.
dst,: | Destination |
Definition at line 664 of file Gia.cc.
Referenced by handleTimerEvent().
{ // send JOIN:REQ message GiaMessage* msg = new GiaMessage("JOIN_REQ"); msg->setCommand(JOIN_REQUEST); msg->setSrcNode(thisGiaNode); msg->setSrcCapacity(thisGiaNode.getCapacity()); msg->setSrcDegree(connectionDegree); msg->setBitLength(GIA_L(msg)); stat_joinCount += 1; stat_joinBytesSent += msg->getByteLength(); stat_joinREQ += 1; stat_joinREQBytesSent += msg->getByteLength(); sendMessageToUDP(dst, msg); }
void Gia::sendMessage_JOIN_RSP | ( | const NodeHandle & | dst | ) | [protected] |
Sends JOIN_RSP_Message from node src to node dst.
dst,: | Destination |
Definition at line 682 of file Gia.cc.
Referenced by handleUDPMessage().
{ // send JOIN:RSP message GiaNeighborMessage* msg = new GiaNeighborMessage("JOIN_RSP"); msg->setCommand(JOIN_RESPONSE); msg->setSrcNode(thisGiaNode); msg->setSrcCapacity(thisGiaNode.getCapacity()); msg->setSrcDegree(connectionDegree); msg->setNeighborsArraySize(neighbors->getSize()); //TODO: add parameter maxSendNeighbors for(uint32_t i = 0; i < neighbors->getSize(); i++) msg->setNeighbors(i, neighbors->get(i)); msg->setBitLength(GIANEIGHBOR_L(msg)); stat_joinCount += 1; stat_joinBytesSent += msg->getByteLength(); stat_joinRSP += 1; stat_joinRSPBytesSent += msg->getByteLength(); sendMessageToUDP(dst, msg); }
void Gia::sendMessage_UPDATE | ( | const NodeHandle & | dst | ) | [protected] |
Sends UPDATE_Message from node src to node dst.
dst,: | Destination |
Definition at line 764 of file Gia.cc.
Referenced by handleTimerEvent().
{ // send UPDATE:IND message GiaMessage* msg = new GiaMessage("UPDATE"); msg->setCommand(UPDATE); msg->setSrcNode(thisGiaNode); msg->setSrcCapacity(thisGiaNode.getCapacity()); msg->setSrcDegree(connectionDegree); msg->setBitLength(GIA_L(msg)); stat_updateMessagesBytesSent += msg->getByteLength(); stat_updateMessages += 1; sendMessageToUDP(dst, msg); }
void Gia::sendSearchResponseMessage | ( | const GiaNode & | srcNode, | |
SearchMessage * | msg | |||
) | [protected] |
Sends a response message to a received search query.
srcNode | Node which contains the searched key | |
msg | SearchMessage |
Definition at line 1084 of file Gia.cc.
Referenced by processSearchMessage().
{ // does SearchMessage->foundNode[] already contain this node uint32_t foundNodeArraySize = msg->getFoundNodeArraySize(); bool containsNode = false; for (uint32_t i=0; i<foundNodeArraySize; i++) if (srcNode.getKey() == msg->getFoundNode(i)) containsNode = true; if (!containsNode && msg->getMaxResponses() > 0) { // add this node to SearchMessage->foundNode[] msg->setFoundNodeArraySize(foundNodeArraySize+1); msg->setFoundNode(foundNodeArraySize, srcNode.getKey()); // decrease SearchMessage->maxResponses msg->setMaxResponses(msg->getMaxResponses()-1); // get first node in reverse-path uint32_t reversePathArraySize = msg->getReversePathArraySize(); if (reversePathArraySize == 0) { // we have the key // deliver response to application SearchResponseMessage* responseMsg = new SearchResponseMessage("ANSWER"); responseMsg->setCommand(ANSWER); responseMsg->setStatType(APP_DATA_STAT); responseMsg->setHopCount(maxHopCount); responseMsg->setSrcNode(thisGiaNode); responseMsg->setSrcCapacity(thisGiaNode.getCapacity()); responseMsg->setSrcDegree(connectionDegree); responseMsg->setSearchKey(msg->getSearchKey()); responseMsg->setFoundNode(srcNode); responseMsg->setID(OverlayKey::random()); responseMsg->setSearchHopCount(0); responseMsg->setBitLength(SEARCHRESPONSE_L(responseMsg)); deliverSearchResult(responseMsg); } else { uint32_t reversePathArraySize(msg->getReversePathArraySize()); SearchResponseMessage* responseMsg = new SearchResponseMessage("ANSWER"); responseMsg->setCommand(ANSWER); responseMsg->setHopCount(maxHopCount); responseMsg->setSrcNode(srcNode); responseMsg->setSrcCapacity(srcNode.getCapacity()); responseMsg->setSrcDegree(connectionDegree); responseMsg->setSearchKey(msg->getSearchKey()); responseMsg->setFoundNode(srcNode); responseMsg->setReversePathArraySize(reversePathArraySize); for (uint32_t i=0; i<reversePathArraySize; i++) responseMsg->setReversePath(i, msg->getReversePath(i)); responseMsg->setID(OverlayKey::random()); responseMsg->setSearchHopCount(reversePathArraySize); responseMsg->setBitLength(SEARCHRESPONSE_L(responseMsg)); forwardSearchResponseMessage(responseMsg); } } }
void Gia::sendToken | ( | const GiaNode & | dst | ) |
Definition at line 801 of file Gia.cc.
Referenced by GiaTokenFactory::grantToken().
{ TokenMessage* tokenMsg = new TokenMessage("TOKEN"); tokenMsg->setCommand(TOKEN); tokenMsg->setHopCount(maxHopCount); tokenMsg->setSrcNode(thisGiaNode); tokenMsg->setSrcCapacity(thisGiaNode.getCapacity()); tokenMsg->setSrcDegree(connectionDegree); tokenMsg->setSrcTokenNr(0/*dst.getReceivedTokens()*/);//??? tokenMsg->setDstTokenNr(/*dst.getSentTokens()+*/1); tokenMsg->setBitLength(TOKEN_L(tokenMsg)); stat_tokenMessagesBytesSent += tokenMsg->getByteLength(); stat_tokenMessages += 1; sendMessageToUDP(dst, tokenMsg); }
void Gia::updateNeighborList | ( | GiaMessage * | msg | ) | [protected] |
Updates neighborlist with new capacity and connectiondegree informations from received message msg.
msg | Received message |
Definition at line 819 of file Gia.cc.
Referenced by handleUDPMessage().
{ if(neighbors->contains(msg->getSrcNode().getKey())) { neighbors->setConnectionDegree(msg->getSrcNode(),msg->getSrcDegree()); //neighbors->setCapacity(msg->getSrcNode(), msg->getSrcCapacity()); neighbors->updateTimestamp(msg->getSrcNode()); } }
void Gia::updateTooltip | ( | ) |
Marks nodes if they are ready.
Definition at line 234 of file Gia.cc.
Referenced by addNeighbor(), changeState(), and removeNeighbor().
{ if (ev.isGUI()) { // if (state == READY) { // getParentModule()->getParentModule()->getDisplayString(). // setTagArg("i2", 1, ""); // getDisplayString().setTagArg("i", 1, ""); // } else { // getParentModule()->getParentModule()->getDisplayString(). // setTagArg("i2", 1, "red"); // getDisplayString().setTagArg("i", 1, "red"); // } std::stringstream ttString; // show our predecessor and successor in tooltip ttString << thisNode << "\n# Neighbors: " << neighbors->getSize(); getParentModule()->getParentModule()->getDisplayString(). setTagArg("tt", 0, ttString.str().c_str()); getParentModule()->getDisplayString(). setTagArg("tt", 0, ttString.str().c_str()); getDisplayString().setTagArg("tt", 0, ttString.str().c_str()); } }
NodeHandle Gia::bootstrapNode [protected] |
next possible neighbor candidate
Definition at line 134 of file Gia.h.
Referenced by changeState(), initializeOverlay(), and joinOverlay().
unsigned int Gia::connectionDegree [protected] |
Definition at line 128 of file Gia.h.
Referenced by addNeighbor(), changeState(), forwardMessage(), getRoute(), handleAppMessage(), removeNeighbor(), sendKeyListToNeighbor(), sendMessage_DISCONNECT(), sendMessage_JOIN_ACK(), sendMessage_JOIN_DNY(), sendMessage_JOIN_REQ(), sendMessage_JOIN_RSP(), sendMessage_UPDATE(), sendSearchResponseMessage(), and sendToken().
GiaKeyList Gia::keyList [protected] |
key list of this node
Definition at line 181 of file Gia.h.
Referenced by addNeighbor(), handleAppMessage(), handleTimerEvent(), processSearchMessage(), and sendKeyListToNeighbor().
double Gia::keyListDelay [protected] |
delay to send the keylist to our neighbors
Definition at line 123 of file Gia.h.
Referenced by handleAppMessage(), and initializeOverlay().
GiaKeyListModule* Gia::keyListModule [protected] |
pointer to KeyListModule
Definition at line 174 of file Gia.h.
Referenced by handleAppMessage(), and initializeOverlay().
GiaNeighborCandidateList Gia::knownNodes [protected] |
list of known nodes in the overlay
Definition at line 180 of file Gia.h.
Referenced by changeState(), handleTimerEvent(), handleUDPMessage(), and initializeOverlay().
double Gia::levelOfSatisfaction [protected] |
current level of statisfaction
Definition at line 127 of file Gia.h.
Referenced by calculateLevelOfSatisfaction(), handleTimerEvent(), and initializeOverlay().
uint32_t Gia::maxHopCount [protected] |
maximum time to live for sent messages
Definition at line 118 of file Gia.h.
Referenced by changeState(), getRoute(), handleAppMessage(), initializeOverlay(), sendSearchResponseMessage(), and sendToken().
double Gia::maxLevelOfSatisfaction [protected] |
maximum level of satisfaction
Definition at line 116 of file Gia.h.
Referenced by handleTimerEvent(), and initializeOverlay().
uint32_t Gia::maxNeighbors [protected] |
maximum number of neighbors
Definition at line 112 of file Gia.h.
Referenced by acceptNode(), addNeighbor(), calculateLevelOfSatisfaction(), handleUDPMessage(), and initializeOverlay().
uint32_t Gia::maxTopAdaptionInterval [protected] |
maximum topology adaption interval
Definition at line 114 of file Gia.h.
Referenced by handleTimerEvent(), and initializeOverlay().
uint32_t Gia::messageTimeout [protected] |
timeout for messages
Definition at line 119 of file Gia.h.
Referenced by changeState(), handleTimerEvent(), and initializeOverlay().
uint32_t Gia::minNeighbors [protected] |
minimum number of neighbors
Definition at line 113 of file Gia.h.
Referenced by calculateLevelOfSatisfaction(), and initializeOverlay().
GiaMessageBookkeeping* Gia::msgBookkeepingList [protected] |
pointer to a message bookkeeping list
Definition at line 135 of file Gia.h.
Referenced by forwardMessage(), handleTimerEvent(), initializeOverlay(), and ~Gia().
GiaNeighbors* Gia::neighbors [protected] |
pointer to neighbor list
Definition at line 175 of file Gia.h.
Referenced by acceptNode(), addNeighbor(), calculateLevelOfSatisfaction(), changeState(), forwardMessage(), forwardSearchResponseMessage(), handleTimerEvent(), handleUDPMessage(), initializeOverlay(), processSearchMessage(), removeNeighbor(), sendMessage_JOIN_ACK(), sendMessage_JOIN_RSP(), updateNeighborList(), and updateTooltip().
uint32_t Gia::neighborTimeout [protected] |
timeout for neighbors
Definition at line 120 of file Gia.h.
Referenced by changeState(), handleTimerEvent(), and initializeOverlay().
GiaNeighborCandidateList Gia::neighCand [protected] |
list of all neighbor candidates
Definition at line 179 of file Gia.h.
Referenced by handleTimerEvent(), handleUDPMessage(), and initializeOverlay().
bool Gia::optimizeReversePath [protected] |
use optimized reverse path?
Definition at line 125 of file Gia.h.
Referenced by initializeOverlay(), and processSearchMessage().
bool Gia::outputNodeDetails [protected] |
output of node details? (on std::cout)
Definition at line 124 of file Gia.h.
Referenced by changeState(), and initializeOverlay().
unsigned int Gia::receivedTokens [protected] |
Definition at line 129 of file Gia.h.
Referenced by changeState().
cMessage* Gia::satisfaction_timer [protected] |
timer for satisfaction self-message
Definition at line 166 of file Gia.h.
Referenced by changeState(), handleTimerEvent(), initializeOverlay(), and ~Gia().
cMessage* Gia::sendKeyList_timer [protected] |
timer for send keylist
Definition at line 170 of file Gia.h.
Referenced by handleAppMessage(), initializeOverlay(), and ~Gia().
cMessage* Gia::sendToken_timer [protected] |
timer for send token
Definition at line 171 of file Gia.h.
Referenced by changeState(), handleTimerEvent(), initializeOverlay(), and ~Gia().
uint32_t Gia::sendTokenTimeout [protected] |
timeout for tokens
Definition at line 121 of file Gia.h.
Referenced by changeState(), and initializeOverlay().
unsigned int Gia::sentTokens [protected] |
Definition at line 130 of file Gia.h.
Referenced by changeState().
uint32_t Gia::stat_addedNeighbors [protected] |
number of added neighbors during life cycle of this node
Definition at line 159 of file Gia.h.
Referenced by addNeighbor(), finishOverlay(), and initializeOverlay().
uint32_t Gia::stat_disconnectMessages [protected] |
number of sent disconnect messages
Definition at line 148 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage_DISCONNECT().
uint32_t Gia::stat_disconnectMessagesBytesSent [protected] |
number of sent bytes of disconnect messages
Definition at line 149 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage_DISCONNECT().
uint32_t Gia::stat_joinACK [protected] |
number of sent join acknowledge messages
Definition at line 144 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage_JOIN_ACK().
uint32_t Gia::stat_joinACKBytesSent [protected] |
number of sent bytes of join acknowledge messages
Definition at line 145 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage_JOIN_ACK().
uint32_t Gia::stat_joinBytesSent [protected] |
number of sent bytes of join messages
Definition at line 139 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), sendMessage_JOIN_ACK(), sendMessage_JOIN_DNY(), sendMessage_JOIN_REQ(), and sendMessage_JOIN_RSP().
uint32_t Gia::stat_joinCount [protected] |
number of sent join messages
Definition at line 138 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), sendMessage_JOIN_ACK(), sendMessage_JOIN_DNY(), sendMessage_JOIN_REQ(), and sendMessage_JOIN_RSP().
uint32_t Gia::stat_joinDNY [protected] |
number of sent join deny messages
Definition at line 146 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage_JOIN_DNY().
uint32_t Gia::stat_joinDNYBytesSent [protected] |
number of sent bytes of join deny messages
Definition at line 147 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage_JOIN_DNY().
uint32_t Gia::stat_joinREQ [protected] |
number of sent join request messages
Definition at line 140 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage_JOIN_REQ().
uint32_t Gia::stat_joinREQBytesSent [protected] |
number of sent bytes of join request messages
Definition at line 141 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage_JOIN_REQ().
uint32_t Gia::stat_joinRSP [protected] |
number of sent join response messages
Definition at line 142 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage_JOIN_RSP().
uint32_t Gia::stat_joinRSPBytesSent [protected] |
number of sent bytes of join response messages
Definition at line 143 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage_JOIN_RSP().
uint32_t Gia::stat_keyListMessages [protected] |
number of sent keylist messages
Definition at line 154 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendKeyListToNeighbor().
uint32_t Gia::stat_keyListMessagesBytesSent [protected] |
number of sent bytes of keylist messages
Definition at line 155 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendKeyListToNeighbor().
double Gia::stat_maxLevelOfSatisfaction [protected] |
maximum level of satisfaction
Definition at line 163 of file Gia.h.
Referenced by finishOverlay(), handleTimerEvent(), and initializeOverlay().
uint32_t Gia::stat_maxNeighbors [protected] |
maximum number of neighbors
Definition at line 158 of file Gia.h.
Referenced by addNeighbor(), finishOverlay(), and initializeOverlay().
uint32_t Gia::stat_numSatisfactionMessages [protected] |
number of satisfaction self-messages
Definition at line 161 of file Gia.h.
Referenced by finishOverlay(), handleTimerEvent(), and initializeOverlay().
uint32_t Gia::stat_removedNeighbors [protected] |
number of removed neighbors during life cycle of this node
Definition at line 160 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and removeNeighbor().
uint32_t Gia::stat_routeMessages [protected] |
number of sent route messages
Definition at line 156 of file Gia.h.
Referenced by finishOverlay(), forwardMessage(), forwardSearchResponseMessage(), and initializeOverlay().
uint32_t Gia::stat_routeMessagesBytesSent [protected] |
number of sent bytes of route messages
Definition at line 157 of file Gia.h.
Referenced by finishOverlay(), forwardMessage(), forwardSearchResponseMessage(), and initializeOverlay().
double Gia::stat_sumLevelOfSatisfaction [protected] |
sum of level of satisfaction
Definition at line 162 of file Gia.h.
Referenced by finishOverlay(), handleTimerEvent(), and initializeOverlay().
uint32_t Gia::stat_tokenMessages [protected] |
number of sent token messages
Definition at line 152 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendToken().
uint32_t Gia::stat_tokenMessagesBytesSent [protected] |
number of sent bytes of token messages
Definition at line 153 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendToken().
uint32_t Gia::stat_updateMessages [protected] |
number of sent update messages
Definition at line 150 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage_UPDATE().
uint32_t Gia::stat_updateMessagesBytesSent [protected] |
number of sent bytes of update messages
Definition at line 151 of file Gia.h.
Referenced by finishOverlay(), initializeOverlay(), and sendMessage_UPDATE().
GiaNode Gia::thisGiaNode [protected] |
this node
Definition at line 133 of file Gia.h.
Referenced by acceptNode(), addNeighbor(), calculateLevelOfSatisfaction(), changeState(), deliverSearchResult(), finishOverlay(), forwardMessage(), getRoute(), handleAppMessage(), handleTimerEvent(), handleUDPMessage(), initializeOverlay(), processSearchMessage(), removeNeighbor(), sendKeyListToNeighbor(), sendMessage_DISCONNECT(), sendMessage_JOIN_ACK(), sendMessage_JOIN_DNY(), sendMessage_JOIN_REQ(), sendMessage_JOIN_RSP(), sendMessage_UPDATE(), sendSearchResponseMessage(), and sendToken().
cMessage* Gia::timedoutMessages_timer [protected] |
timer for message timeout
Definition at line 168 of file Gia.h.
Referenced by changeState(), handleTimerEvent(), initializeOverlay(), and ~Gia().
cMessage* Gia::timedoutNeighbors_timer [protected] |
timer for neighbors timeout
Definition at line 169 of file Gia.h.
Referenced by changeState(), handleTimerEvent(), initializeOverlay(), and ~Gia().
GiaTokenFactory* Gia::tokenFactory [protected] |
pointer to TokenFactory
Definition at line 176 of file Gia.h.
Referenced by changeState(), forwardMessage(), handleTimerEvent(), initializeOverlay(), and processSearchMessage().
uint32_t Gia::tokenWaitTime [protected] |
delay to send a new token
Definition at line 122 of file Gia.h.
Referenced by forwardMessage(), and initializeOverlay().
uint32_t Gia::topAdaptionAggressiveness [protected] |
the topology adaption aggressiveness
Definition at line 115 of file Gia.h.
Referenced by handleTimerEvent(), and initializeOverlay().
cMessage* Gia::update_timer [protected] |
timer for update self-message
Definition at line 167 of file Gia.h.
Referenced by addNeighbor(), initializeOverlay(), removeNeighbor(), and ~Gia().
double Gia::updateDelay [protected] |
time between to update messages (in ms)
Definition at line 117 of file Gia.h.
Referenced by addNeighbor(), initializeOverlay(), and removeNeighbor().