INET Framework for OMNeT++/OMNEST
inet::RoutingTableRecorder Class Reference

Records routing table changes into a file. More...

#include <RoutingTableRecorder.h>

Inheritance diagram for inet::RoutingTableRecorder:

Public Member Functions

 RoutingTableRecorder ()
 
virtual ~RoutingTableRecorder ()
 
virtual void receiveSignal (cComponent *source, simsignal_t signalID, cObject *obj, cObject *details) override
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void handleMessage (cMessage *) override
 
virtual void finish () override
 
virtual void hookListeners ()
 
virtual void ensureRoutingLogFileOpen ()
 
virtual void receiveChangeNotification (cComponent *source, simsignal_t signalID, cObject *details)
 
virtual void recordInterfaceChange (cModule *host, const NetworkInterface *ie, simsignal_t signalID)
 
virtual void recordRouteChange (cModule *host, const IRoute *route, simsignal_t signalID)
 

Private Attributes

FILE * routingLogFile
 

Detailed Description

Records routing table changes into a file.

See also
Ipv4RoutingTable, Ipv4Route

Constructor & Destructor Documentation

◆ RoutingTableRecorder()

inet::RoutingTableRecorder::RoutingTableRecorder ( )
27 {
28  routingLogFile = nullptr;
29 }

◆ ~RoutingTableRecorder()

inet::RoutingTableRecorder::~RoutingTableRecorder ( )
virtual
32 {
33  if (routingLogFile != nullptr) {
34  fclose(routingLogFile);
35  routingLogFile = nullptr;
36  }
37 }

Member Function Documentation

◆ ensureRoutingLogFileOpen()

void inet::RoutingTableRecorder::ensureRoutingLogFileOpen ( )
protectedvirtual
74 {
75  if (routingLogFile == nullptr) {
76  std::string fname = getEnvir()->getConfig()->getAsFilename(CFGID_ROUTINGLOG_FILE);
77  inet::utils::makePathForFile(fname.c_str());
78  routingLogFile = fopen(fname.c_str(), "w");
79  if (!routingLogFile)
80  throw cRuntimeError("Cannot open file %s", fname.c_str());
81  }
82 }

Referenced by recordInterfaceChange(), and recordRouteChange().

◆ finish()

void inet::RoutingTableRecorder::finish ( )
overrideprotectedvirtual
55 {
56 }

◆ handleMessage()

void inet::RoutingTableRecorder::handleMessage ( cMessage *  )
overrideprotectedvirtual
50 {
51  throw cRuntimeError(this, "This module doesn't process messages");
52 }

◆ hookListeners()

void inet::RoutingTableRecorder::hookListeners ( )
protectedvirtual
59 {
60  cModule *systemModule = getSimulation()->getSystemModule();
61  systemModule->subscribe(interfaceCreatedSignal, this);
62  systemModule->subscribe(interfaceDeletedSignal, this);
63  systemModule->subscribe(interfaceConfigChangedSignal, this);
64  systemModule->subscribe(interfaceIpv4ConfigChangedSignal, this);
65 // systemModule->subscribe(interfaceIpv6ConfigChangedSignal, this);
66 // systemModule->subscribe(interfaceStateChangedSignal, this);
67 
68  systemModule->subscribe(routeAddedSignal, this);
69  systemModule->subscribe(routeDeletedSignal, this);
70  systemModule->subscribe(routeChangedSignal, this);
71 }

Referenced by initialize().

◆ initialize()

void inet::RoutingTableRecorder::initialize ( int  stage)
overrideprotectedvirtual
40 {
41  cSimpleModule::initialize(stage);
42 
43  if (stage == INITSTAGE_NETWORK_LAYER) {
44  if (par("enabled"))
45  hookListeners();
46  }
47 }

◆ numInitStages()

virtual int inet::RoutingTableRecorder::numInitStages ( ) const
inlineoverrideprotectedvirtual
32 { return NUM_INIT_STAGES; }

◆ receiveChangeNotification()

void inet::RoutingTableRecorder::receiveChangeNotification ( cComponent *  source,
simsignal_t  signalID,
cObject *  details 
)
protectedvirtual
85 {
86  cModule *m = dynamic_cast<cModule *>(nsource);
87  if (!m)
88  m = nsource->getParentModule();
89  cModule *host = getContainingNode(m);
90  if (signalID == routeAddedSignal || signalID == routeDeletedSignal || signalID == routeChangedSignal)
91  recordRouteChange(host, check_and_cast<const IRoute *>(obj), signalID);
92  else if (signalID == interfaceCreatedSignal || signalID == interfaceDeletedSignal)
93  recordInterfaceChange(host, check_and_cast<const NetworkInterface *>(obj), signalID);
94  else if (signalID == interfaceConfigChangedSignal || signalID == interfaceIpv4ConfigChangedSignal)
95  recordInterfaceChange(host, check_and_cast<const NetworkInterfaceChangeDetails *>(obj)->getNetworkInterface(), signalID);
96 }

◆ receiveSignal()

virtual void inet::RoutingTableRecorder::receiveSignal ( cComponent *  source,
simsignal_t  signalID,
cObject *  obj,
cObject *  details 
)
inlineoverridevirtual
29 { receiveChangeNotification(source, signalID, obj); }

◆ recordInterfaceChange()

void inet::RoutingTableRecorder::recordInterfaceChange ( cModule *  host,
const NetworkInterface ie,
simsignal_t  signalID 
)
protectedvirtual
99 {
100  if (getSimulation()->getSimulationStage() == CTX_CLEANUP)
101  return; // ignore notifications during cleanup
102 
103  // Note: ie->getInterfaceTable() may be nullptr (entry already removed from its table)
104 
105  const char *tag;
106 
107  if (signalID == interfaceCreatedSignal)
108  tag = "+I";
109  else if (signalID == interfaceDeletedSignal)
110  tag = "-I";
111  else if (signalID == interfaceConfigChangedSignal)
112  tag = "*I";
113  else if (signalID == interfaceIpv4ConfigChangedSignal)
114  tag = "*I";
115  else
116  throw cRuntimeError("Unexpected signal: %s", getSignalName(signalID));
117 
118  // action, eventNo, simtime, moduleId, ifname, address
120  auto ipv4Data = ie->findProtocolData<Ipv4InterfaceData>();
121  fprintf(routingLogFile, "%s #%" PRId64 " %ss %s %s %s\n",
122  tag,
123  getSimulation()->getEventNumber(),
124  SIMTIME_STR(simTime()),
125  host->getFullPath().c_str(),
126  ie->getInterfaceName(),
127  (ipv4Data != nullptr ? ipv4Data->getIPAddress().str().c_str() : Ipv4Address().str().c_str()));
128  fflush(routingLogFile);
129 }

Referenced by receiveChangeNotification().

◆ recordRouteChange()

void inet::RoutingTableRecorder::recordRouteChange ( cModule *  host,
const IRoute route,
simsignal_t  signalID 
)
protectedvirtual
132 {
133  IRoutingTable *rt = route->getRoutingTableAsGeneric(); // may be nullptr! (route already removed from its routing table)
134 
135  const char *tag;
136  if (signalID == routeAddedSignal)
137  tag = "+R";
138  else if (signalID == routeChangedSignal)
139  tag = "*R";
140  else if (signalID == routeDeletedSignal)
141  tag = "-R";
142  else
143  throw cRuntimeError("Unexpected signal: %s", getSignalName(signalID));
144 
145  // action, eventNo, simtime, moduleId, routerID, dest, dest netmask, nexthop
147  auto ie = route->getInterface();
148  fprintf(routingLogFile, "%s #%" PRId64 " %ss %s %s %s/%d %s %s\n",
149  tag,
150  getSimulation()->getEventNumber(),
151  SIMTIME_STR(simTime()),
152  host->getFullPath().c_str(),
153  (rt ? rt->getRouterIdAsGeneric().str().c_str() : "*"),
154  route->getDestinationAsGeneric().str().c_str(),
155  route->getPrefixLength(),
156  route->getNextHopAsGeneric().str().c_str(),
157  (ie ? ie->getInterfaceName() : "*"));
158  fflush(routingLogFile);
159 }

Referenced by receiveChangeNotification().

Member Data Documentation

◆ routingLogFile

FILE* inet::RoutingTableRecorder::routingLogFile
private

The documentation for this class was generated from the following files:
inet::getContainingNode
cModule * getContainingNode(const cModule *from)
Find the node containing the given module.
Definition: ModuleAccess.cc:40
inet::routeChangedSignal
simsignal_t routeChangedSignal
Definition: Simsignals.cc:43
inet::INITSTAGE_NETWORK_LAYER
INET_API InitStage INITSTAGE_NETWORK_LAYER
Initialization of network layer protocols.
inet::RoutingTableRecorder::hookListeners
virtual void hookListeners()
Definition: RoutingTableRecorder.cc:58
inet::RoutingTableRecorder::ensureRoutingLogFileOpen
virtual void ensureRoutingLogFileOpen()
Definition: RoutingTableRecorder.cc:73
inet::interfaceDeletedSignal
simsignal_t interfaceDeletedSignal
Definition: Simsignals.cc:31
inet::RoutingTableRecorder::recordRouteChange
virtual void recordRouteChange(cModule *host, const IRoute *route, simsignal_t signalID)
Definition: RoutingTableRecorder.cc:131
inet::routeAddedSignal
simsignal_t routeAddedSignal
Definition: Simsignals.cc:41
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::RoutingTableRecorder::receiveChangeNotification
virtual void receiveChangeNotification(cComponent *source, simsignal_t signalID, cObject *details)
Definition: RoutingTableRecorder.cc:84
inet::RoutingTableRecorder::routingLogFile
FILE * routingLogFile
Definition: RoutingTableRecorder.h:23
inet::routeDeletedSignal
simsignal_t routeDeletedSignal
Definition: Simsignals.cc:42
inet::interfaceIpv4ConfigChangedSignal
simsignal_t interfaceIpv4ConfigChangedSignal
Definition: Simsignals.cc:35
inet::units::values::m
value< double, units::m > m
Definition: Units.h:1233
inet::interfaceCreatedSignal
simsignal_t interfaceCreatedSignal
Definition: Simsignals.cc:30
inet::RoutingTableRecorder::recordInterfaceChange
virtual void recordInterfaceChange(cModule *host, const NetworkInterface *ie, simsignal_t signalID)
Definition: RoutingTableRecorder.cc:98
inet::interfaceConfigChangedSignal
simsignal_t interfaceConfigChangedSignal
Definition: Simsignals.cc:33
inet::utils::makePathForFile
void makePathForFile(const char *filename)
Definition: INETUtils.cc:210