Basic template class for I3 applications. More...
#include <I3BaseApp.h>
Classes | |
| struct | I3CachedServer |
Public Member Functions | |
| I3BaseApp () | |
| Constructor. | |
| ~I3BaseApp () | |
| Destructor. | |
Protected Types | |
| enum | I3MobilityStage { I3_MOBILITY_BEFORE_UPDATE, I3_MOBILITY_UPDATED } |
Protected Member Functions | |
| int | numInitStages () const |
| Returns number of init stages required. | |
| void | initialize (int stage) |
| Basic initialization. | |
| virtual void | initializeApp (int stage) |
| App initialization - should be overwritten by application. | |
| void | bootstrapI3 () |
| Internal I3 bootstrap - connects to I3, inserts sampling triggers and initializes timers. | |
| virtual void | initializeI3 () |
| Application I3 initialize - should be overwritten by application. | |
| virtual void | handleTimerEvent (cMessage *msg) |
| Handles timers - should be overwritten by application. | |
| virtual void | handleUDPMessage (cMessage *msg) |
| Handles messages incoming from UDP gate. | |
| void | handleMessage (cMessage *msg) |
| Handles incoming messages. | |
| virtual void | deliver (I3Trigger &trigger, I3IdentifierStack &stack, cPacket *msg) |
| Delivers packets coming from I3 - should be overwritten by application. | |
| void | sendToI3 (I3Message *msg) |
| Sends a message to I3. | |
| void | sendThroughUDP (cMessage *msg, const I3IPAddress &ip) |
| Sends a message through UDP. | |
| void | refreshTriggers () |
| Refreshes (reinserts) stored triggers. | |
| void | refreshSamples () |
| Refreshes sampling triggers and selects fastest server as gateway. | |
| I3Identifier | retrieveClosestIdentifier () |
| void | sendPacket (const I3Identifier &id, cPacket *msg, bool useHint=false) |
| Routes a packet through I3, passing an identifier stack composed of a single identifier. | |
| void | sendPacket (const I3IdentifierStack &stack, cPacket *msg, bool useHint=false) |
| Routes a packet through I3. | |
| void | insertTrigger (const I3Identifier &identifier, bool store=true) |
| Inserts a trigger into I3, composed by the given identifier and an identifier stack containing only this node's IP address. | |
| void | insertTrigger (const I3Identifier &identifier, const I3IdentifierStack &stack, bool store=true) |
| Inserts a trigger into I3 with the given identifier and identifier stack. | |
| void | insertTrigger (const I3Trigger &t, bool store=true) |
| Inserts the given trigger into I3. | |
| void | removeTrigger (const I3Identifier &identifier) |
| Removes all triggers from the list of inserted triggers whose identifiers equal the one given. | |
| void | removeTrigger (const I3Trigger &trigger) |
| Removes a trigger from I3. | |
| std::set< I3Trigger > & | getInsertedTriggers () |
| Returns the list of inserted triggers. | |
| void | receiveChangeNotification (int category, const cPolymorphic *details) |
| virtual void | doMobilityEvent (I3MobilityStage stage) |
Protected Attributes | |
| int | numSent |
| Number of sent messages. | |
| int | sentBytes |
| int | numReceived |
| Number of received messages. | |
| int | receivedBytes |
| int | numIsolations |
| Number of times this node has been isolated - i.e. | |
| IPvXAddress | nodeIPAddress |
| Cached IP address of this node. | |
| std::set< I3Trigger > | insertedTriggers |
| Stored I3 triggers sent from this node, to be refreshed automatically. | |
| std::map< I3Identifier, I3CachedServer > | samplingCache |
| std::map< I3Identifier, I3CachedServer > | identifierCache |
| I3CachedServer | gateway |
| cMessage * | refreshTriggersTimer |
| int | refreshTriggersTime |
| cMessage * | refreshSamplesTimer |
| int | refreshSamplesTime |
| cMessage * | initializeTimer |
| cMessage * | bootstrapTimer |
Private Attributes | |
| bool | mobilityInStages |
Basic template class for I3 applications.
Definition at line 41 of file I3BaseApp.h.
enum I3BaseApp::I3MobilityStage [protected] |
Definition at line 62 of file I3BaseApp.h.
{
I3_MOBILITY_BEFORE_UPDATE,
I3_MOBILITY_UPDATED
};
| I3BaseApp::I3BaseApp | ( | ) |
| I3BaseApp::~I3BaseApp | ( | ) |
| void I3BaseApp::bootstrapI3 | ( | ) | [protected] |
Internal I3 bootstrap - connects to I3, inserts sampling triggers and initializes timers.
Definition at line 121 of file I3BaseApp.cc.
Referenced by handleMessage().
{
I3IPAddress myAddress(nodeIPAddress, par("clientPort"));
// TODO: use BootstrapList instead of GlobalNodeList
const NodeHandle handle = GlobalNodeListAccess().get()->getBootstrapNode();
gateway.address = I3IPAddress(handle.getIp(), par("serverPort"));
int cacheSize = par("cacheSize");
for (int i = 0; i < cacheSize; i++) {
I3Identifier id;
id.createRandomKey();
ostringstream os;
os << myAddress << " sample" << i;
id.setName(os.str());
samplingCache[id] = I3CachedServer(); // placeholder
insertTrigger(id, false);
}
refreshTriggersTimer = new cMessage();
refreshTriggersTime = par("triggerRefreshTime");
scheduleAt(simTime() + truncnormal(refreshTriggersTime, refreshTriggersTime / 10),
refreshTriggersTimer);
refreshSamplesTimer = new cMessage();
refreshSamplesTime = par("sampleRefreshTime");
scheduleAt(simTime() + truncnormal(refreshSamplesTime, refreshSamplesTime / 10),
refreshSamplesTimer);
}
| void I3BaseApp::deliver | ( | I3Trigger & | trigger, | |
| I3IdentifierStack & | stack, | |||
| cPacket * | msg | |||
| ) | [protected, virtual] |
Delivers packets coming from I3 - should be overwritten by application.
| trigger | Application trigger to which the packet was sent | |
| stack | Identifier stack passed from I3 | |
| msg | Arriving message |
Reimplemented in I3Anycast, I3Composite, I3HostMobility, I3LatencyStretch, I3Multicast, I3SessionServer, I3SessionClient, and I3Triggers.
Definition at line 189 of file I3BaseApp.cc.
Referenced by handleUDPMessage().
{
delete msg;
}
| void I3BaseApp::doMobilityEvent | ( | I3MobilityStage | stage | ) | [protected, virtual] |
| set< I3Trigger > & I3BaseApp::getInsertedTriggers | ( | ) | [protected] |
Returns the list of inserted triggers.
Definition at line 472 of file I3BaseApp.cc.
{
return insertedTriggers;
}
| void I3BaseApp::handleMessage | ( | cMessage * | msg | ) | [protected] |
Handles incoming messages.
| msg | Incoming message |
Definition at line 160 of file I3BaseApp.cc.
{
if (msg->isSelfMessage()) {
if (msg == bootstrapTimer) {
bootstrapI3();
delete msg;
bootstrapTimer = 0;
} else if (msg == initializeTimer) {
initializeI3();
delete msg;
initializeTimer = 0;
} else if (msg == refreshTriggersTimer) {
refreshTriggers();
scheduleAt(simTime() + truncnormal(refreshTriggersTime, refreshTriggersTime / 10),
refreshTriggersTimer);
} else if (msg == refreshSamplesTimer) {
refreshSamples();
scheduleAt(simTime() + truncnormal(refreshSamplesTime, refreshSamplesTime / 10),
refreshSamplesTimer);
} else {
handleTimerEvent(msg);
}
} else if (msg->arrivedOn("udpIn")) {
handleUDPMessage(msg);
} else {
delete msg;
}
}
| void I3BaseApp::handleTimerEvent | ( | cMessage * | msg | ) | [protected, virtual] |
Handles timers - should be overwritten by application.
| msg | Timer to be handled |
Reimplemented in I3Anycast, I3Composite, I3HostMobility, I3LatencyStretch, I3Multicast, I3SessionClient, I3TRTClient, and I3Triggers.
Definition at line 194 of file I3BaseApp.cc.
Referenced by handleMessage().
{
delete msg;
}
| void I3BaseApp::handleUDPMessage | ( | cMessage * | msg | ) | [protected, virtual] |
Handles messages incoming from UDP gate.
| msg | Message sent |
Reimplemented in I3HostMobility, and I3LatencyStretch.
Definition at line 199 of file I3BaseApp.cc.
Referenced by handleMessage().
{
I3Message *i3msg;
i3msg = dynamic_cast<I3Message*>(msg);
if (i3msg) {
switch (i3msg->getType()) {
case SEND_PACKET:
{
I3SendPacketMessage *smsg;
smsg = check_and_cast<I3SendPacketMessage*>(msg);
numReceived++;
receivedBytes += smsg->getByteLength();
/* deliver to app */
cPacket *newMessage = smsg->decapsulate();
deliver(smsg->getMatchedTrigger(), smsg->getIdentifierStack(), newMessage);
break;
}
case QUERY_REPLY:
{
I3QueryReplyMessage *pmsg;
pmsg = check_and_cast<I3QueryReplyMessage*>(msg);
I3Identifier &id = pmsg->getIdentifier();
identifierCache[id].address = pmsg->getSource();
identifierCache[id].lastReply = simTime();
identifierCache[id].roundTripTime = simTime() - pmsg->getSendingTime();
if (samplingCache.count(id) != 0) {
samplingCache[id] = identifierCache[id];
}
break;
}
default:
/* shouldn't get here */
break;
}
}
delete msg;
}
| void I3BaseApp::initialize | ( | int | stage | ) | [protected] |
Basic initialization.
Definition at line 71 of file I3BaseApp.cc.
{
if (stage != MIN_STAGE_APP) return;
nodeIPAddress = IPAddressResolver().addressOf(getParentModule());
bindToPort(par("clientPort"));
/* NotificationBoardAccess().get()->subscribe(this, NF_HOSTPOSITION_BEFOREUPDATE);
NotificationBoardAccess().get()->subscribe(this, NF_HOSTPOSITION_UPDATED);*/
getDisplayString().setTagArg("i", 0, "i3c");
getParentModule()->getDisplayString().removeTag("i2");
if (int(par("bootstrapTime")) >= int(par("initTime"))) {
opp_error("Parameter bootstrapTime must be smaller than initTime");
}
bootstrapTimer = new cMessage();
scheduleAt(simTime() + int(par("bootstrapTime")), bootstrapTimer);
initializeTimer = new cMessage();
scheduleAt(simTime() + int(par("initTime")), initializeTimer);
numSent = 0;
sentBytes = 0;
numReceived = 0;
receivedBytes = 0;
numIsolations = 0;
mobilityInStages = false;
WATCH(nodeIPAddress);
WATCH(numSent);
WATCH(sentBytes);
WATCH(numReceived);
WATCH(receivedBytes);
WATCH(numIsolations);
WATCH_SET(insertedTriggers);
WATCH(gateway);
WATCH_MAP(samplingCache);
WATCH_MAP(identifierCache);
initializeApp(stage);
}
| void I3BaseApp::initializeApp | ( | int | stage | ) | [protected, virtual] |
App initialization - should be overwritten by application.
I3 related commands should go in initializeI3.
| stage | Initialization stage passed from initialize() |
Reimplemented in I3Anycast, I3Composite, I3HostMobility, I3LatencyStretch, I3Multicast, I3SessionClient, and I3Triggers.
Definition at line 117 of file I3BaseApp.cc.
Referenced by initialize().
{
}
| void I3BaseApp::initializeI3 | ( | ) | [protected, virtual] |
Application I3 initialize - should be overwritten by application.
Reimplemented in I3Anycast, I3Composite, I3HostMobility, I3LatencyStretch, I3Multicast, I3SessionServer, I3SessionClient, I3SessionClientStarter, I3TRTClient, and I3Triggers.
Definition at line 155 of file I3BaseApp.cc.
Referenced by handleMessage().
{
}
| void I3BaseApp::insertTrigger | ( | const I3Identifier & | identifier, | |
| bool | store = true | |||
| ) | [protected] |
Inserts a trigger into I3, composed by the given identifier and an identifier stack containing only this node's IP address.
| identifier | Trigger's identifier | |
| store | Sets whether to store the trigger for auto-refresh |
Definition at line 412 of file I3BaseApp.cc.
Referenced by bootstrapI3(), I3Triggers::deliver(), I3SessionClient::deliver(), I3HostMobility::handleTimerEvent(), I3Triggers::initializeI3(), I3SessionClientStarter::initializeI3(), I3SessionClient::initializeI3(), I3SessionServer::initializeI3(), I3Multicast::initializeI3(), I3LatencyStretch::initializeI3(), I3HostMobility::initializeI3(), I3Composite::initializeI3(), I3Anycast::initializeI3(), insertTrigger(), refreshSamples(), refreshTriggers(), and retrieveClosestIdentifier().
{
I3Trigger trigger;
I3IPAddress add(nodeIPAddress, par("clientPort"));;
trigger.getIdentifierStack().push(add);
trigger.setIdentifier(identifier);
insertTrigger(trigger, store);
}
| void I3BaseApp::insertTrigger | ( | const I3Identifier & | identifier, | |
| const I3IdentifierStack & | stack, | |||
| bool | store = true | |||
| ) | [protected] |
Inserts a trigger into I3 with the given identifier and identifier stack.
| identifier | Trigger's identifier | |
| stack | Trigger's identifier stack | |
| store | Sets whether to store the trigger for auto-refresh |
Definition at line 422 of file I3BaseApp.cc.
{
I3Trigger trigger;
trigger.setIdentifier(identifier);
trigger.getIdentifierStack() = stack;
insertTrigger(trigger, store);
}
| void I3BaseApp::insertTrigger | ( | const I3Trigger & | t, | |
| bool | store = true | |||
| ) | [protected] |
Inserts the given trigger into I3.
| t | Trigger to be inserted | |
| store | Sets whether to store the trigger for auto-refresh |
Definition at line 431 of file I3BaseApp.cc.
{
if (store) {
if (insertedTriggers.count(t) != 0) return;
insertedTriggers.insert(t);
}
I3InsertTriggerMessage *msg = new I3InsertTriggerMessage();
I3IPAddress myAddress(nodeIPAddress, par("clientPort"));
msg->setTrigger(t);
msg->setSendReply(true);
msg->setSource(myAddress);
msg->setBitLength(INSERT_TRIGGER_L(msg));
sendThroughUDP(msg, gateway.address);
}
| int I3BaseApp::numInitStages | ( | ) | const [protected] |
Returns number of init stages required.
Definition at line 66 of file I3BaseApp.cc.
{
return MAX_STAGE_APP + 1;
}
| void I3BaseApp::receiveChangeNotification | ( | int | category, | |
| const cPolymorphic * | details | |||
| ) | [protected] |
Definition at line 477 of file I3BaseApp.cc.
{
Enter_Method_Silent();
/* Mobility is happening (the only event we are subscribed to). We have two things to do:
* 1) Insert triggers with new IP
* 2) Delete triggers with old IP
* If it's one staged mobility, we just get told the IP after it's changed, and we need to make sure
* step 1 and 2 are done. If it's two staged mobility, we need to make sure we do step 1 first and then
* step 2. */
// if (!mobilityInStages) { /* if the flag isn't set, mobility isn't done in stages or this is stage 1 */
// if (category == NF_HOSTPOSITION_BEFOREUPDATE) {
// mobilityInStages = true; /* set the flag so we don't land here in stage 2 again */
// }
// /* do part 1! */
// cMessage *msg = check_and_cast<cMessage*>(details);
// IPvXAddress *ipAddr = (IPvXAddress*)msg->getContextPointer();
//
// ostringstream os;
// os << "Mobility first stage - actual IP is " << nodeIPAddress << ", future IP is " << *ipAddr << endl;
// getParentModule()->bubble(os.str().c_str());
//
// std::cout << "In advance from " << nodeIPAddress << " to " << *ipAddr << endl;
// I3IPAddress oldAddress(nodeIPAddress, par("clientPort"));
// I3IPAddress newAddress(*ipAddr, par("clientPort"));
//
// delete ipAddr;
// delete msg;
//
// for (set<I3Trigger>::iterator it = insertedTriggers.begin(); it != insertedTriggers.end(); it++) {
// I3Trigger trigger(*it); /* create copy */
// trigger.getIdentifierStack().replaceAddress(oldAddress, newAddress); /* replace old address with new */
// insertTrigger(trigger, false); /* insert trigger in I3, but don't store it in our list yet - that's done in part 2 */
// }
//
// doMobilityEvent(I3_MOBILITY_BEFORE_UPDATE);
// }
// if (category == NF_HOSTPOSITION_UPDATED) { /* part 2: both for 1-stage and stage 2 of 2-stage mobility */
// I3IPAddress oldAddress(nodeIPAddress, par("clientPort"));
// nodeIPAddress = IPAddressResolver().addressOf(getParentModule()).get4();
// I3IPAddress newAddress(nodeIPAddress, par("clientPort"));
//
// cout << "After from " << oldAddress << " to " << newAddress << endl;
//
// ostringstream os;
// os << "Mobility second stage - setting IP as " << newAddress << endl;
// getParentModule()->bubble(os.str().c_str());
//
// set<I3Trigger> newSet; /* list of new triggers (that we already inserted in I3 in stage 1) */
//
// for (set<I3Trigger>::iterator it = insertedTriggers.begin(); it != insertedTriggers.end(); it++) {
// I3Trigger trigger(*it); /* create copy */
//
// trigger.getIdentifierStack().replaceAddress(oldAddress, newAddress); /* replace old address with new */
// newSet.insert(trigger); /* insert in new list */
//
// removeTrigger(*it); /* remove trigger from I3 and out list */
//
// }
// insertedTriggers = newSet; /* replace old list with updated one */
//
// mobilityInStages = false; /* reset variable */
// refreshTriggers(); /* to get new trigger round-trip times, new cache list */
// refreshSamples();
//
// doMobilityEvent(I3_MOBILITY_UPDATED);
// }
}
| void I3BaseApp::refreshSamples | ( | ) | [protected] |
Refreshes sampling triggers and selects fastest server as gateway.
Definition at line 332 of file I3BaseApp.cc.
Referenced by handleMessage().
{
map<I3Identifier, I3CachedServer>::iterator mit;
EV << "I3BaseApp::refreshSamples()]\n"
<< " Refresh samples!"
<< endl;
/* reinsert sample triggers */
for (mit = samplingCache.begin(); mit != samplingCache.end(); mit++) {
insertTrigger(mit->first, false);
}
}
| void I3BaseApp::refreshTriggers | ( | ) | [protected] |
Refreshes (reinserts) stored triggers.
Definition at line 264 of file I3BaseApp.cc.
Referenced by handleMessage().
{
I3IPAddress myAddress(nodeIPAddress, par("clientPort"));
map<I3Identifier, I3CachedServer>::iterator mit;
// pick fastest I3 server as gateway
int serverTimeout = par("serverTimeout");
gateway.roundTripTime = serverTimeout;
I3Identifier gatewayId;
for (mit = samplingCache.begin(); mit != samplingCache.end(); mit++) {
if (gateway.roundTripTime > mit->second.roundTripTime) {
gatewayId = mit->first;
gateway = mit->second;
}
}
// check if gateway has timeout'ed
if (simTime() - gateway.lastReply >= serverTimeout) {
// We have a small problem here: if the fastest server has timeout,
// that means the previous gateway had stopped responding some time before and no triggers were refreshed.
// Since all servers have timeout'ed by now and we can't trust return times, pick a random server and hope that one is alive.
int random = intrand(samplingCache.size()), i;
EV << "I3BaseApp::refreshTriggers()]\n"
<< " Gateway timeout at " << nodeIPAddress
<< ", time " << simTime()
<< "; expired gateway is " << gateway << "(" << gatewayId << ") "
<< " with last reply at " << gateway.lastReply
<< endl;
for (i = 0, mit = samplingCache.begin(); i < random; i++, mit++);
gateway = mit->second;
EV << "I3BaseApp::refreshTriggers()]\n"
<< " New gateway for " << nodeIPAddress << " is " << gateway
<< endl;
if (gateway.roundTripTime > 2 * serverTimeout) {
EV << "I3BaseApp::refreshTriggers()]\n"
<< " New gateway's (" << gateway << ") rtt for " << nodeIPAddress
<< " too high... marking as isolated!"
<< endl;
numIsolations++;
const NodeHandle handle = GlobalNodeListAccess().get()->getBootstrapNode();
gateway.address = I3IPAddress(handle.getIp(), par("serverPort"));
}
}
/* ping gateway */
insertTrigger(gatewayId, false);
// cout << "Client " << nodeIPAddress << " pings " << gatewayId << endl;
/* reinsert stored triggers */
set<I3Trigger>::iterator it;
for (it = insertedTriggers.begin(); it != insertedTriggers.end(); it++) {
insertTrigger(*it, false);
}
/* now that we are refreshing stuff, might as well erase old identifier cache entries */
int idStoreTime = par("idStoreTime");
for (mit = identifierCache.begin(); mit != identifierCache.end(); mit++) {
if (mit->second.lastReply - simTime() > idStoreTime) {
identifierCache.erase(mit);
}
}
}
| void I3BaseApp::removeTrigger | ( | const I3Trigger & | trigger | ) | [protected] |
Removes a trigger from I3.
| trigger | Trigger to be removed |
Definition at line 462 of file I3BaseApp.cc.
{
I3RemoveTriggerMessage *msg = new I3RemoveTriggerMessage();
msg->setTrigger(t);
msg->setBitLength(REMOVE_TRIGGER_L(msg));
sendThroughUDP(msg, gateway.address);
insertedTriggers.erase(t);
}
| void I3BaseApp::removeTrigger | ( | const I3Identifier & | identifier | ) | [protected] |
Removes all triggers from the list of inserted triggers whose identifiers equal the one given.
| identifier | Identifier to be compared against |
Definition at line 449 of file I3BaseApp.cc.
Referenced by I3SessionClient::deliver(), and I3SessionClient::handleTimerEvent().
{
I3Trigger dummy;
dummy.setIdentifier(identifier);
set<I3Trigger>::iterator it = insertedTriggers.lower_bound(dummy);
if (it == insertedTriggers.end()) return; /* no matches */
for (; it != insertedTriggers.end() && it->getIdentifier() == identifier; it++) {
removeTrigger(*it);
}
}
| I3Identifier I3BaseApp::retrieveClosestIdentifier | ( | ) | [protected] |
Definition at line 344 of file I3BaseApp.cc.
Referenced by I3HostMobility::handleTimerEvent(), I3LatencyStretch::initializeI3(), and I3HostMobility::initializeI3().
{
simtime_t time;
I3Identifier id;
map<I3Identifier, I3CachedServer>::iterator mit;
I3IPAddress myAddress(nodeIPAddress, par("clientPort"));
time = MAXTIME;
for (mit = samplingCache.begin(); mit != samplingCache.end(); mit++) {
if (time > mit->second.roundTripTime) {
time = mit->second.roundTripTime;
id = mit->first;
}
}
samplingCache.erase(id);
I3Identifier rid;
rid.createRandomKey();
ostringstream os;
os << myAddress << " sample";
rid.setName(os.str());
samplingCache[rid] = I3CachedServer(); // placeholder
insertTrigger(rid, false);
return id;
}
| void I3BaseApp::sendPacket | ( | const I3IdentifierStack & | stack, | |
| cPacket * | msg, | |||
| bool | useHint = false | |||
| ) | [protected] |
Routes a packet through I3.
| stack | Destination identifier stack | |
| msg | Message to be sent | |
| useHint | Use address in server cache if existant |
Definition at line 381 of file I3BaseApp.cc.
{
I3SendPacketMessage *smsg;
smsg = new I3SendPacketMessage();
smsg->setBitLength(SEND_PACKET_L(smsg));
smsg->encapsulate(msg);
smsg->setIdentifierStack(stack);
smsg->setSendReply(useHint);
if (useHint) {
I3IPAddress add(nodeIPAddress, par("clientPort"));
smsg->setSource(add);
}
numSent++;
sentBytes += smsg->getByteLength();
I3SubIdentifier subid = stack.peek(); // first check where the packet should go
if (subid.getType() == I3SubIdentifier::IPAddress) { // if it's an IP address
smsg->getIdentifierStack().pop(); // pop it
sendThroughUDP(smsg, subid.getIPAddress()); // and send directly to host
} else { // else if it's an identifier
// check if we have the I3 server cached
I3IPAddress address = (useHint && identifierCache.count(subid.getIdentifier()) != 0) ?
identifierCache[subid.getIdentifier()].address :
gateway.address;
sendThroughUDP(smsg, address); // send it directly
}
}
| void I3BaseApp::sendPacket | ( | const I3Identifier & | id, | |
| cPacket * | msg, | |||
| bool | useHint = false | |||
| ) | [protected] |
Routes a packet through I3, passing an identifier stack composed of a single identifier.
| id | Destination identifier | |
| msg | Message to be sent | |
| useHint | Use address in server cache if existant |
Definition at line 373 of file I3BaseApp.cc.
Referenced by I3Composite::createMessage(), I3Triggers::deliver(), I3SessionClient::deliver(), I3SessionServer::deliver(), I3LatencyStretch::deliver(), I3HostMobility::deliver(), I3Composite::deliver(), I3Anycast::deliver(), I3HostMobility::discoverPartners(), I3Triggers::handleTimerEvent(), I3SessionClient::handleTimerEvent(), I3Multicast::handleTimerEvent(), I3LatencyStretch::handleTimerEvent(), I3HostMobility::handleTimerEvent(), I3Anycast::handleTimerEvent(), and I3SessionClientStarter::initializeI3().
{
I3IdentifierStack stack;
stack.push(id);
sendPacket(stack, msg, useHint);
}
| void I3BaseApp::sendThroughUDP | ( | cMessage * | msg, | |
| const I3IPAddress & | ip | |||
| ) | [protected] |
Sends a message through UDP.
| msg | Message to be sent | |
| ip | IP of destination |
Definition at line 248 of file I3BaseApp.cc.
Referenced by I3TRTClient::handleTimerEvent(), I3LatencyStretch::handleTimerEvent(), insertTrigger(), removeTrigger(), sendPacket(), and sendToI3().
{
msg->removeControlInfo();
msg->setKind(UDP_C_DATA);
UDPControlInfo* udpControlInfo = new UDPControlInfo();
udpControlInfo->setSrcAddr(nodeIPAddress);
udpControlInfo->setSrcPort(par("clientPort"));
udpControlInfo->setDestAddr(add.getIp());
udpControlInfo->setDestPort(add.getPort());
msg->setControlInfo(udpControlInfo);
send(msg, "udpOut");
}
| void I3BaseApp::sendToI3 | ( | I3Message * | msg | ) | [protected] |
Sends a message to I3.
| msg | Message to be sent |
Definition at line 243 of file I3BaseApp.cc.
{
sendThroughUDP(msg, gateway.address);
}
cMessage* I3BaseApp::bootstrapTimer [protected] |
Definition at line 102 of file I3BaseApp.h.
Referenced by handleMessage(), and initialize().
I3CachedServer I3BaseApp::gateway [protected] |
Definition at line 90 of file I3BaseApp.h.
Referenced by bootstrapI3(), I3TRTClient::handleTimerEvent(), initialize(), insertTrigger(), refreshTriggers(), removeTrigger(), sendPacket(), and sendToI3().
std::map<I3Identifier, I3CachedServer> I3BaseApp::identifierCache [protected] |
Definition at line 88 of file I3BaseApp.h.
Referenced by handleUDPMessage(), initialize(), refreshTriggers(), and sendPacket().
cMessage* I3BaseApp::initializeTimer [protected] |
Definition at line 100 of file I3BaseApp.h.
Referenced by handleMessage(), and initialize().
std::set<I3Trigger> I3BaseApp::insertedTriggers [protected] |
Stored I3 triggers sent from this node, to be refreshed automatically.
Definition at line 84 of file I3BaseApp.h.
Referenced by getInsertedTriggers(), initialize(), insertTrigger(), refreshTriggers(), and removeTrigger().
bool I3BaseApp::mobilityInStages [private] |
Definition at line 216 of file I3BaseApp.h.
Referenced by initialize().
IPvXAddress I3BaseApp::nodeIPAddress [protected] |
Cached IP address of this node.
Definition at line 81 of file I3BaseApp.h.
Referenced by bootstrapI3(), I3LatencyStretch::deliver(), I3TRTClient::handleTimerEvent(), I3LatencyStretch::handleTimerEvent(), initialize(), insertTrigger(), refreshTriggers(), retrieveClosestIdentifier(), sendPacket(), and sendThroughUDP().
int I3BaseApp::numIsolations [protected] |
Number of times this node has been isolated - i.e.
without any I3 servers known
Definition at line 78 of file I3BaseApp.h.
Referenced by initialize(), and refreshTriggers().
int I3BaseApp::numReceived [protected] |
Number of received messages.
Definition at line 73 of file I3BaseApp.h.
Referenced by handleUDPMessage(), and initialize().
int I3BaseApp::numSent [protected] |
Number of sent messages.
Definition at line 68 of file I3BaseApp.h.
Referenced by initialize(), and sendPacket().
int I3BaseApp::receivedBytes [protected] |
Definition at line 75 of file I3BaseApp.h.
Referenced by handleUDPMessage(), and initialize().
int I3BaseApp::refreshSamplesTime [protected] |
Definition at line 98 of file I3BaseApp.h.
Referenced by bootstrapI3(), and handleMessage().
cMessage* I3BaseApp::refreshSamplesTimer [protected] |
Definition at line 96 of file I3BaseApp.h.
Referenced by bootstrapI3(), and handleMessage().
int I3BaseApp::refreshTriggersTime [protected] |
Definition at line 94 of file I3BaseApp.h.
Referenced by bootstrapI3(), and handleMessage().
cMessage* I3BaseApp::refreshTriggersTimer [protected] |
Definition at line 92 of file I3BaseApp.h.
Referenced by bootstrapI3(), and handleMessage().
std::map<I3Identifier, I3CachedServer> I3BaseApp::samplingCache [protected] |
Definition at line 86 of file I3BaseApp.h.
Referenced by bootstrapI3(), handleUDPMessage(), initialize(), refreshSamples(), refreshTriggers(), and retrieveClosestIdentifier().
int I3BaseApp::sentBytes [protected] |
Definition at line 70 of file I3BaseApp.h.
Referenced by initialize(), and sendPacket().
1.7.1