OverSim
I3BaseApp Class Reference

Basic template class for I3 applications. More...

#include <I3BaseApp.h>

Inheritance diagram for I3BaseApp:
I3Anycast I3Composite I3HostMobility I3LatencyStretch I3Multicast I3SessionClient I3SessionServer I3Triggers I3TRTClient

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< I3TriggerinsertedTriggers
 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

Detailed Description

Basic template class for I3 applications.

Definition at line 41 of file I3BaseApp.h.

Member Enumeration Documentation

Enumerator:
I3_MOBILITY_BEFORE_UPDATE 
I3_MOBILITY_UPDATED 

Definition at line 62 of file I3BaseApp.h.

Constructor & Destructor Documentation

I3BaseApp::I3BaseApp ( )

Constructor.

Definition at line 58 of file I3BaseApp.cc.

{
}
I3BaseApp::~I3BaseApp ( )

Destructor.

Definition at line 62 of file I3BaseApp.cc.

{
}

Member Function Documentation

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
gateway.address = I3IPAddress(handle.getIp(), par("serverPort"));
int cacheSize = par("cacheSize");
for (int i = 0; i < cacheSize; i++) {
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),
refreshSamplesTimer = new cMessage();
refreshSamplesTime = par("sampleRefreshTime");
scheduleAt(simTime() + truncnormal(refreshSamplesTime, refreshSamplesTime / 10),
}
void I3BaseApp::deliver ( I3Trigger trigger,
I3IdentifierStack stack,
cPacket *  msg 
)
protectedvirtual

Delivers packets coming from I3 - should be overwritten by application.

Parameters
triggerApplication trigger to which the packet was sent
stackIdentifier stack passed from I3
msgArriving message

Reimplemented in I3SessionClient, I3Triggers, I3Composite, I3SessionServer, I3Anycast, and I3Multicast.

Definition at line 189 of file I3BaseApp.cc.

Referenced by handleUDPMessage().

{
delete msg;
}
void I3BaseApp::doMobilityEvent ( I3MobilityStage  stage)
protectedvirtual

Definition at line 547 of file I3BaseApp.cc.

{
}
set< I3Trigger > & I3BaseApp::getInsertedTriggers ( )
protected

Returns the list of inserted triggers.

Definition at line 472 of file I3BaseApp.cc.

{
}
void I3BaseApp::handleMessage ( cMessage *  msg)
protected

Handles incoming messages.

Parameters
msgIncoming message

Definition at line 160 of file I3BaseApp.cc.

{
if (msg->isSelfMessage()) {
if (msg == bootstrapTimer) {
delete msg;
} else if (msg == initializeTimer) {
delete msg;
} else if (msg == refreshTriggersTimer) {
scheduleAt(simTime() + truncnormal(refreshTriggersTime, refreshTriggersTime / 10),
} else if (msg == refreshSamplesTimer) {
scheduleAt(simTime() + truncnormal(refreshSamplesTime, refreshSamplesTime / 10),
} else {
}
} else if (msg->arrivedOn("udpIn")) {
} else {
delete msg;
}
}
void I3BaseApp::handleTimerEvent ( cMessage *  msg)
protectedvirtual

Handles timers - should be overwritten by application.

Parameters
msgTimer to be handled

Reimplemented in I3SessionClient, I3Triggers, I3Composite, I3Anycast, and I3Multicast.

Definition at line 194 of file I3BaseApp.cc.

Referenced by handleMessage().

{
delete msg;
}
void I3BaseApp::handleUDPMessage ( cMessage *  msg)
protectedvirtual

Handles messages incoming from UDP gate.

Parameters
msgMessage sent

Definition at line 199 of file I3BaseApp.cc.

Referenced by handleMessage(), I3HostMobility::handleUDPMessage(), and I3LatencyStretch::handleUDPMessage().

{
I3Message *i3msg;
i3msg = dynamic_cast<I3Message*>(msg);
if (i3msg) {
switch (i3msg->getType()) {
{
smsg = check_and_cast<I3SendPacketMessage*>(msg);
receivedBytes += smsg->getByteLength();
/* deliver to app */
cPacket *newMessage = smsg->decapsulate();
deliver(smsg->getMatchedTrigger(), smsg->getIdentifierStack(), newMessage);
break;
}
{
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) {
}
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;
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)
protectedvirtual

App initialization - should be overwritten by application.

I3 related commands should go in initializeI3.

Parameters
stageInitialization stage passed from initialize()

Reimplemented in I3SessionClient, I3Triggers, I3Composite, I3Anycast, and I3Multicast.

Definition at line 117 of file I3BaseApp.cc.

Referenced by initialize(), I3HostMobility::initializeApp(), and I3LatencyStretch::initializeApp().

{
}
void I3BaseApp::initializeI3 ( )
protectedvirtual

Application I3 initialize - should be overwritten by application.

Reimplemented in I3SessionClientStarter, I3SessionClient, I3Triggers, I3Composite, I3SessionServer, I3Anycast, and I3Multicast.

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.

Parameters
identifierTrigger's identifier
storeSets whether to store the trigger for auto-refresh

Definition at line 412 of file I3BaseApp.cc.

Referenced by bootstrapI3(), 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.

Parameters
identifierTrigger's identifier
stackTrigger's identifier stack
storeSets 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.

Parameters
tTrigger to be inserted
storeSets 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);
}
I3IPAddress myAddress(nodeIPAddress, par("clientPort"));
msg->setTrigger(t);
msg->setSendReply(true);
msg->setSource(myAddress);
msg->setBitLength(INSERT_TRIGGER_L(msg));
}
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;
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 I3Identifier identifier)
protected

Removes all triggers from the list of inserted triggers whose identifiers equal the one given.

Parameters
identifierIdentifier to be compared against

Definition at line 449 of file I3BaseApp.cc.

{
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++) {
}
}
void I3BaseApp::removeTrigger ( const I3Trigger trigger)
protected

Removes a trigger from I3.

Parameters
triggerTrigger to be removed

Definition at line 462 of file I3BaseApp.cc.

{
msg->setTrigger(t);
msg->setBitLength(REMOVE_TRIGGER_L(msg));
insertedTriggers.erase(t);
}
I3Identifier I3BaseApp::retrieveClosestIdentifier ( )
protected

Definition at line 344 of file I3BaseApp.cc.

{
simtime_t time;
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);
ostringstream os;
os << myAddress << " sample";
rid.setName(os.str());
samplingCache[rid] = I3CachedServer(); // placeholder
insertTrigger(rid, false);
return id;
}
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.

Parameters
idDestination identifier
msgMessage to be sent
useHintUse address in server cache if existant

Definition at line 373 of file I3BaseApp.cc.

{
stack.push(id);
sendPacket(stack, msg, useHint);
}
void I3BaseApp::sendPacket ( const I3IdentifierStack stack,
cPacket *  msg,
bool  useHint = false 
)
protected

Routes a packet through I3.

Parameters
stackDestination identifier stack
msgMessage to be sent
useHintUse address in server cache if existant

Definition at line 381 of file I3BaseApp.cc.

{
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);
}
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 :
sendThroughUDP(smsg, address); // send it directly
}
}
void I3BaseApp::sendThroughUDP ( cMessage *  msg,
const I3IPAddress ip 
)
protected

Sends a message through UDP.

Parameters
msgMessage to be sent
ipIP of destination

Definition at line 248 of file I3BaseApp.cc.

Referenced by 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.

Parameters
msgMessage to be sent

Definition at line 243 of file I3BaseApp.cc.

Member Data Documentation

cMessage* I3BaseApp::bootstrapTimer
protected

Definition at line 102 of file I3BaseApp.h.

Referenced by handleMessage(), and initialize().

I3CachedServer I3BaseApp::gateway
protected
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(), 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
int I3BaseApp::sentBytes
protected

Definition at line 70 of file I3BaseApp.h.

Referenced by initialize(), and sendPacket().


The documentation for this class was generated from the following files: