#include <NAMTraceWriter.h>
Protected Member Functions | |
| virtual void | recordNodeEvent (const char *state, const char *shape) |
| virtual void | recordLinkEvent (int peernamid, double datarate, simtime_t delay, const char *state) |
| virtual void | recordPacketEvent (char event, int peernamid, cPacket *msg) |
| virtual int | numInitStages () const |
| virtual void | initialize (int stage) |
| virtual | ~NAMTraceWriter () |
| virtual void | receiveChangeNotification (int category, const cPolymorphic *details) |
Protected Attributes | |
| int | namid |
| NAMTrace * | nt |
Writes a "nam" trace.
Definition at line 35 of file NAMTraceWriter.h.
| NAMTraceWriter::~NAMTraceWriter | ( | ) | [protected, virtual] |
Definition at line 98 of file NAMTraceWriter.cc.
{
/*FIXME this will crash if the "nt" module gets cleaned up sooner than this one
if (nt && nt->isEnabled())
{
recordNodeEvent("DOWN", "circle");
}
*/
}
| void NAMTraceWriter::initialize | ( | int | stage | ) | [protected, virtual] |
Definition at line 31 of file NAMTraceWriter.cc.
{
if (stage==1) // let NAMTrace module initialize in stage 0
{
// get pointer to the NAMTrace module
cModule *namMod = simulation.getModuleByPath("nam");
if (!namMod)
{
nt = NULL;
EV << "NAMTraceWriter: nam module not found, no trace will be written\n";
return;
}
// store ptr to namtrace module
nt = check_and_cast<NAMTrace*>(namMod);
// register given namid; -1 means autoconfigure
int namid0 = par("namid");
cModule *node = getParentModule(); // the host or router
namid = nt->assignNamId(node, namid0);
if (namid0==-1)
par("namid") = namid; // let parameter reflect autoconfigured namid
// write "node" entry to the trace
if (nt->isEnabled())
recordNodeEvent("UP", "circle");
// subscribe to the interesting notifications
NotificationBoard *nb = NotificationBoardAccess().get();
nb->subscribe(this, NF_NODE_FAILURE);
nb->subscribe(this, NF_NODE_RECOVERY);
nb->subscribe(this, NF_PP_TX_BEGIN);
nb->subscribe(this, NF_PP_RX_END);
nb->subscribe(this, NF_L2_Q_DROP);
}
else if (stage==2 && nt!=NULL && nt->isEnabled())
{
// write "link" entries
IInterfaceTable *ift = InterfaceTableAccess().get();
cModule *node = getParentModule(); // the host or router
for (int i=0; i<ift->getNumInterfaces(); i++)
{
// skip loopback interfaces
InterfaceEntry *ie = ift->getInterface(i);
if (ie->isLoopback()) continue;
if (!ie->isPointToPoint()) continue; // consider pont-to-point links only
// fill in peerNamIds in InterfaceEntries
cGate *outgate = node->gate(ie->getNodeOutputGateId());
if (!outgate || !outgate->getNextGate()) continue;
cModule *peernode = outgate->getNextGate()->getOwnerModule(); // FIXME not entirely correct: what if a subnet is "boxed"?
cModule *peerwriter = peernode->getSubmodule("namTrace");
if (!peerwriter) error("module %s doesn't have a submodule named namTrace", peernode->getFullPath().c_str());
int peernamid = peerwriter->par("namid");
ie->setPeerNamId(peernamid);
// find delay
simtime_t delay = 0;
cDatarateChannel *chan = dynamic_cast<cDatarateChannel*>(outgate->getChannel());
if (chan) delay = chan->getDelay();
// write link entry into trace
recordLinkEvent(peernamid, ie->getDatarate(), delay, "UP");
}
}
}
| virtual int NAMTraceWriter::numInitStages | ( | ) | const [inline, protected, virtual] |
Definition at line 47 of file NAMTraceWriter.h.
{return 3;}
| void NAMTraceWriter::receiveChangeNotification | ( | int | category, | |
| const cPolymorphic * | details | |||
| ) | [protected, virtual] |
Redefined INotifiable method. Called by NotificationBoard on changes.
Implements INotifiable.
Definition at line 109 of file NAMTraceWriter.cc.
{
// don't do anything if global NAMTrace module doesn't exist or does not have a file open
if (!nt || !nt->isEnabled())
return;
printNotificationBanner(category, details);
// process notification
if (category==NF_PP_TX_BEGIN || category==NF_PP_RX_END || category==NF_L2_Q_DROP)
{
TxNotifDetails *d = check_and_cast<TxNotifDetails *>(details);
int peernamid = d->getInterfaceEntry()->getPeerNamId();
cPacket *msg = d->getPacket();
switch(category)
{
case NF_PP_TX_BEGIN: recordPacketEvent('h', peernamid, msg); break;
case NF_PP_RX_END: recordPacketEvent('r', peernamid, msg); break;
case NF_L2_Q_DROP: recordPacketEvent('d', peernamid, msg); break;
}
}
else
{
switch(category)
{
case NF_NODE_FAILURE: break; // TODO
case NF_NODE_RECOVERY: break; // TODO
}
}
}
| void NAMTraceWriter::recordLinkEvent | ( | int | peernamid, | |
| double | datarate, | |||
| simtime_t | delay, | |||
| const char * | state | |||
| ) | [protected, virtual] |
Definition at line 153 of file NAMTraceWriter.cc.
Referenced by initialize().
{
ASSERT(nt && nt->isEnabled());
std::ostream& out = nt->out();
// link entry (to be registered ON ONE END ONLY! This also means that
// ns2 thinks that datarate and delay must be the same in both directions)
if (namid < peernamid)
out << "l -t * -s " << namid << " -d " << peernamid
<< " -S " << state << " -r " << (int)datarate << " -D " << delay << endl;
// queue entry
out << "q -t * -s " << namid << " -d " << peernamid << " -a 0 " << endl;
}
| void NAMTraceWriter::recordNodeEvent | ( | const char * | state, | |
| const char * | shape | |||
| ) | [protected, virtual] |
Definition at line 141 of file NAMTraceWriter.cc.
Referenced by initialize().
| void NAMTraceWriter::recordPacketEvent | ( | char | event, | |
| int | peernamid, | |||
| cPacket * | msg | |||
| ) | [protected, virtual] |
Definition at line 168 of file NAMTraceWriter.cc.
Referenced by receiveChangeNotification().
{
ASSERT(nt && nt->isEnabled());
std::ostream& out = nt->out();
int size = msg->getByteLength();
int color = 0;
for (cPacket *em = msg; em; em = em->getEncapsulatedMsg())
if (em->hasPar("color"))
{color = em->par("color").longValue(); break;}
out << event << " -t " << simTime();
if (event=='h')
out << " -s " << namid << " -d " << peernamid;
else
out << " -s " << peernamid << " -d " << namid;
out << " -e " << size << " -a " << color << endl;
}
int NAMTraceWriter::namid [protected] |
Definition at line 38 of file NAMTraceWriter.h.
Referenced by initialize(), recordLinkEvent(), recordNodeEvent(), and recordPacketEvent().
NAMTrace* NAMTraceWriter::nt [protected] |
Definition at line 39 of file NAMTraceWriter.h.
Referenced by initialize(), receiveChangeNotification(), recordLinkEvent(), recordNodeEvent(), and recordPacketEvent().
1.7.1