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

Wiseroute is a simple loop-free routing algorithm that builds a routing tree from a central network point. More...

#include <WiseRoute.h>

Inheritance diagram for inet::WiseRoute:
inet::NetworkProtocolBase inet::INetworkProtocol inet::LayeredProtocolBase inet::DefaultProtocolRegistrationListener inet::OperationalBase inet::IProtocolRegistrationListener inet::OperationalMixin< cSimpleModule > inet::ILifecycle

Classes

struct  tRouteTableEntry
 

Public Member Functions

 WiseRoute ()
 
virtual int numInitStages () const override
 Initialization of the module and some variables. More...
 
virtual void initialize (int) override
 
virtual void finish () override
 
virtual ~WiseRoute ()
 
const ProtocolgetProtocol () const override
 
virtual void handleStartOperation (LifecycleOperation *operation) override
 
virtual void handleStopOperation (LifecycleOperation *operation) override
 
virtual void handleCrashOperation (LifecycleOperation *operation) override
 
- Public Member Functions inherited from inet::NetworkProtocolBase
virtual void handleRegisterService (const Protocol &protocol, cGate *gate, ServicePrimitive servicePrimitive) override
 
virtual void handleRegisterProtocol (const Protocol &protocol, cGate *gate, ServicePrimitive servicePrimitive) override
 
- Public Member Functions inherited from inet::OperationalMixin< cSimpleModule >
virtual ~OperationalMixin ()
 }@ More...
 
- Public Member Functions inherited from inet::ILifecycle
virtual ~ILifecycle ()
 
- Public Member Functions inherited from inet::DefaultProtocolRegistrationListener
virtual void handleRegisterServiceGroup (const ProtocolGroup &protocolGroup, cGate *gate, ServicePrimitive servicePrimitive) override
 
virtual void handleRegisterProtocolGroup (const ProtocolGroup &protocolGroup, cGate *gate, ServicePrimitive servicePrimitive) override
 
virtual void handleRegisterAnyService (cGate *gate, ServicePrimitive servicePrimitive) override
 
virtual void handleRegisterAnyProtocol (cGate *gate, ServicePrimitive servicePrimitive) override
 
- Public Member Functions inherited from inet::INetworkProtocol
virtual ~INetworkProtocol ()
 

Protected Types

enum  messageKinds { SEND_ROUTE_FLOOD_TIMER = 101 }
 
enum  floodTypes { NOTAFLOOD, FORWARD, FORME, DUPLICATE }
 
typedef enum inet::WiseRoute::floodTypes floodTypes
 
typedef struct inet::WiseRoute::tRouteTableEntry tRouteTableEntry
 
typedef std::map< L3Address, tRouteTableEntrytRouteTable
 
typedef std::multimap< tRouteTable::key_type, unsigned long > tFloodTable
 
- Protected Types inherited from inet::OperationalMixin< cSimpleModule >
enum  State
 

Protected Member Functions

Handle Messages

Functions to redefine by the programmer

These are the functions provided to add own functionality to your modules. These functions are called whenever a self message or a data message from the upper or lower layer arrives respectively.

virtual void handleUpperPacket (Packet *packet) override
 Handle messages from upper layer. More...
 
virtual void handleLowerPacket (Packet *packet) override
 Handle messages from lower layer. More...
 
virtual void handleSelfMessage (cMessage *msg) override
 Handle self messages. More...
 
virtual void updateRouteTable (const tRouteTable::key_type &origin, const L3Address &lastHop, double rssi, double ber)
 Update routing table. More...
 
void decapsulate (Packet *packet)
 Decapsulate a message and delete original msg. More...
 
floodTypes updateFloodTable (bool isFlood, const tFloodTable::key_type &srcAddr, const tFloodTable::key_type &destAddr, unsigned long seqNum)
 update flood table. More...
 
tFloodTable::key_type getRoute (const tFloodTable::key_type &destAddr, bool iAmOrigin=false) const
 find a route to destination address. More...
 
virtual void setDownControlInfo (Packet *const pMsg, const MacAddress &pDestAddr)
 Attaches a "control info" (NetwToMac) structure (object) to the message pMsg. More...
 
- Protected Member Functions inherited from inet::NetworkProtocolBase
 NetworkProtocolBase ()
 
virtual ~NetworkProtocolBase ()
 
virtual void sendUp (cMessage *message)
 
virtual void sendDown (cMessage *message, int interfaceId=-1)
 
virtual bool isUpperMessage (cMessage *message) const override
 
virtual bool isLowerMessage (cMessage *message) const override
 
virtual bool isInitializeStage (int stage) const override
 
virtual bool isModuleStartStage (int stage) const override
 
virtual bool isModuleStopStage (int stage) const override
 
virtual void handleUpperCommand (cMessage *msg) override
 
- Protected Member Functions inherited from inet::LayeredProtocolBase
virtual void handleMessageWhenUp (cMessage *message) override
 
virtual void handleUpperMessage (cMessage *message)
 
virtual void handleLowerMessage (cMessage *message)
 
virtual void handleLowerCommand (cMessage *message)
 
- Protected Member Functions inherited from inet::OperationalMixin< cSimpleModule >
virtual int numInitStages () const override
 
virtual void refreshDisplay () const override
 
virtual void handleMessage (cMessage *msg) override
 
virtual void handleMessageWhenDown (cMessage *msg)
 
virtual bool handleOperationStage (LifecycleOperation *operation, IDoneCallback *doneCallback) override
 Perform one stage of a lifecycle operation. More...
 
virtual State getInitialOperationalState () const
 Returns initial operational state: OPERATING or NOT_OPERATING. More...
 
virtual void handleActiveOperationTimeout (cMessage *message)
 
virtual bool isUp () const
 utility functions More...
 
virtual bool isDown () const
 
virtual void setOperationalState (State newState)
 
virtual void scheduleOperationTimeout (simtime_t timeout)
 
virtual void setupActiveOperation (LifecycleOperation *operation, IDoneCallback *doneCallback, State)
 
virtual void delayActiveOperationFinish (simtime_t timeout)
 
virtual void startActiveOperationExtraTime (simtime_t delay=SIMTIME_ZERO)
 
virtual void startActiveOperationExtraTimeOrFinish (simtime_t extraTime)
 
virtual void finishActiveOperation ()
 

Protected Attributes

tRouteTable routeTable
 
tFloodTable floodTable
 
ModuleRefByPar< IArparp
 
int headerLength = 0
 Length of the NetwPkt header Read from omnetpp.ini. More...
 
L3Address myNetwAddr
 
L3Address sinkAddress
 
double rssiThreshold = 0.0
 Minimal received RSSI necessary for adding source to routing table. More...
 
double routeFloodsInterval = 0.0
 Interval [seconds] between two route floods. More...
 
unsigned long floodSeqNumber = 0
 Flood sequence number. More...
 
cMessage * routeFloodTimer = nullptr
 
long nbDataPacketsForwarded = 0
 
long nbDataPacketsReceived = 0
 
long nbDataPacketsSent = 0
 
long nbDuplicatedFloodsReceived = 0
 
long nbFloodsSent = 0
 
long nbPureUnicastSent = 0
 
long nbRouteFloodsSent = 0
 
long nbRouteFloodsReceived = 0
 
long nbUnicastFloodForwarded = 0
 
long nbPureUnicastForwarded = 0
 
long nbGetRouteFailures = 0
 
long nbRoutesRecorded = 0
 
long nbHops = 0
 
cOutVector receivedRSSI
 
cOutVector routeRSSI
 
cOutVector allReceivedRSSI
 
cOutVector allReceivedBER
 
cOutVector routeBER
 
cOutVector receivedBER
 
cOutVector nextHopSelectionForSink
 
bool trace = false
 
- Protected Attributes inherited from inet::NetworkProtocolBase
ModuleRefByPar< IInterfaceTableinterfaceTable
 
std::set< const Protocol * > upperProtocols
 
std::map< int, SocketDescriptor * > socketIdToSocketDescriptor
 
- Protected Attributes inherited from inet::OperationalMixin< cSimpleModule >
State operationalState
 
simtime_t lastChange
 
Operation activeOperation
 
cMessage * activeOperationTimeout
 
cMessage * activeOperationExtraTimer
 

Private Member Functions

 WiseRoute (const WiseRoute &)
 Copy constructor is not allowed. More...
 
WiseRouteoperator= (const WiseRoute &)
 Assignment operator is not allowed. More...
 

Detailed Description

Wiseroute is a simple loop-free routing algorithm that builds a routing tree from a central network point.

It is especially useful for wireless sensor networks and convergecast traffic, hence its name (Wireless Sensors Routing). The sink (the device at the center of the network) broadcasts a route building message. Each network node that receives it selects the sink as parent in the routing tree, and rebroadcasts the route building message. This procedure maximizes the probability that all network nodes can join the network, and avoids loops.

Author
Jerome Rousselot

Member Typedef Documentation

◆ floodTypes

◆ tFloodTable

typedef std::multimap<tRouteTable::key_type, unsigned long> inet::WiseRoute::tFloodTable
protected

◆ tRouteTable

◆ tRouteTableEntry

Member Enumeration Documentation

◆ floodTypes

Enumerator
NOTAFLOOD 
FORWARD 
FORME 
DUPLICATE 

◆ messageKinds

Enumerator
SEND_ROUTE_FLOOD_TIMER 

Constructor & Destructor Documentation

◆ WiseRoute() [1/2]

inet::WiseRoute::WiseRoute ( const WiseRoute )
private

Copy constructor is not allowed.

◆ WiseRoute() [2/2]

inet::WiseRoute::WiseRoute ( )
inline

◆ ~WiseRoute()

inet::WiseRoute::~WiseRoute ( )
virtual

Member Function Documentation

◆ decapsulate()

void inet::WiseRoute::decapsulate ( Packet packet)
protected

Decapsulate a message and delete original msg.

374 {
375  if (isFlood) {
376  auto pos = floodTable.lower_bound(srcAddr);
377  auto posEnd = floodTable.upper_bound(srcAddr);
378 
379  while (pos != posEnd) {
380  if (seqNum == pos->second)
381  return DUPLICATE; // this flood is known, don't forward it.
382  ++pos;
383  }
384  floodTable.insert(make_pair(srcAddr, seqNum));
385  if (destAddr == myNetwAddr)
386  return FORME;
387  else
388  return FORWARD;

◆ finish()

void inet::WiseRoute::finish ( )
overridevirtual
319 {
320  auto pos = routeTable.find(origin);
321  receivedRSSI.record(rssi);
322  receivedBER.record(ber);
323  if (pos == routeTable.end()) {
324  // A route towards origin does not exist yet. Insert the currently discovered one
325  // only if the received RSSI is above the threshold.
326  if (rssi > rssiThreshold) {
327  tRouteTableEntry newEntry;
328 
329  // last hop from origin means next hop towards origin.
330  newEntry.nextHop = lastHop;
331  newEntry.rssi = rssi;
332  routeRSSI.record(rssi);
333  routeBER.record(ber);

◆ getProtocol()

const Protocol& inet::WiseRoute::getProtocol ( ) const
inlineoverridevirtual

◆ getRoute()

WiseRoute::tFloodTable::key_type inet::WiseRoute::getRoute ( const tFloodTable::key_type &  destAddr,
bool  iAmOrigin = false 
) const
protected

find a route to destination address.

◆ handleCrashOperation()

virtual void inet::WiseRoute::handleCrashOperation ( LifecycleOperation operation)
inlineoverridevirtual

◆ handleLowerPacket()

void inet::WiseRoute::handleLowerPacket ( Packet packet)
overrideprotectedvirtual

Handle messages from lower layer.

Reimplemented from inet::LayeredProtocolBase.

155  {
156  const cObject *pCtrlInfo = nullptr;
157  // If the message is a route flood, update the routing table.
158  if (wiseRouteHeader->getHeaderKind() == ROUTE_FLOOD)
159  updateRouteTable(initialSrcAddr, srcAddr, rssi, ber);
160 
161  if (finalDestAddr == myNetwAddr || finalDestAddr.isBroadcast()) {
162  Packet *packetCopy;
163  if (floodType == FORWARD) {
164  // it's a flood. copy for delivery, forward original.
165  // if we are here (see updateFloodTable()), finalDestAddr == IP Broadcast. Hence finalDestAddr,
166  // initialSrcAddr, and destAddr have already been correctly set
167  // at origin, as well as the MAC control info. Hence only update
168  // local hop source address.
169  packetCopy = packet->dup();
170  wiseRouteHeader->setSourceAddress(myNetwAddr);
171  pCtrlInfo = packet->removeControlInfo();
172  wiseRouteHeader->setNbHops(wiseRouteHeader->getNbHops() + 1);
173  auto p = new Packet(packet->getName());
174  packet->popAtFront<WiseRouteHeader>();
175  p->insertAtBack(packet->peekDataAt(b(0), packet->getDataLength()));
176  wiseRouteHeader->setPayloadLengthField(p->getDataLength());
177  p->insertAtFront(wiseRouteHeader);
179  sendDown(p);
181  delete packet;
182  }
183  else {
184  packetCopy = packet;
185  }
186  if (wiseRouteHeader->getHeaderKind() == DATA) {
187  decapsulate(packetCopy);
188  sendUp(packetCopy);
190  }
191  else {
193  delete packetCopy;
194  }
195  }
196  else {
197  // not for me. if flood, forward as flood. else select a route
198  if (floodType == FORWARD) {
199  wiseRouteHeader->setSourceAddress(myNetwAddr);
200  pCtrlInfo = packet->removeControlInfo();
201  wiseRouteHeader->setNbHops(wiseRouteHeader->getNbHops() + 1);
202  auto p = new Packet(packet->getName());
203  packet->popAtFront<WiseRouteHeader>();
204  p->insertAtBack(packet->peekDataAt(b(0), packet->getDataLength()));
205  wiseRouteHeader->setPayloadLengthField(p->getDataLength());
206  p->insertAtFront(wiseRouteHeader);
208  sendDown(p);
211  }
212  else {
213  L3Address nextHop = getRoute(finalDestAddr);
214  if (nextHop.isBroadcast()) {
215  // no route exist to destination, attempt to send to final destination
216  nextHop = finalDestAddr;
218  }
219  wiseRouteHeader->setSourceAddress(myNetwAddr);
220  wiseRouteHeader->setDestinationAddress(nextHop);
221  pCtrlInfo = packet->removeControlInfo();
222  MacAddress nextHopMacAddr = arp->resolveL3Address(nextHop, nullptr); // FIXME interface entry pointer needed
223  if (nextHopMacAddr.isUnspecified())
224  throw cRuntimeError("Cannot immediately resolve MAC address. Please configure a GlobalArp module.");
225  wiseRouteHeader->setNbHops(wiseRouteHeader->getNbHops() + 1);
226  auto p = new Packet(packet->getName());
227  packet->popAtFront<WiseRouteHeader>();
228  p->insertAtBack(packet->peekDataAt(b(0), packet->getDataLength()));
229  wiseRouteHeader->setPayloadLengthField(p->getDataLength());
230  p->insertAtFront(wiseRouteHeader);
231  setDownControlInfo(p, nextHopMacAddr);
232  sendDown(p);
235  }
236  delete packet;
237  }
238  if (pCtrlInfo != nullptr)
239  delete pCtrlInfo;
240  }
241 }
242 
243 void WiseRoute::handleUpperPacket(Packet *packet)
244 {
245  L3Address finalDestAddr;
246  L3Address nextHopAddr;
247  MacAddress nextHopMacAddr;
248  auto pkt = makeShared<WiseRouteHeader>();
249 
250  pkt->setChunkLength(B(headerLength));
251 
252  const auto& addrTag = packet->findTag<L3AddressReq>();
253  if (addrTag == nullptr) {
254  EV << "WiseRoute warning: Application layer did not specifiy a destination L3 address\n"
255  << "\tusing broadcast address instead\n";
256  finalDestAddr = myNetwAddr.getAddressType()->getBroadcastAddress();
257  }
258  else {

◆ handleSelfMessage()

void inet::WiseRoute::handleSelfMessage ( cMessage *  msg)
overrideprotectedvirtual

Handle self messages.

Reimplemented from inet::LayeredProtocolBase.

130  {
131  EV << "WiseRoute - handleSelfMessage: got unexpected message of kind " << msg->getKind() << endl;
132  delete msg;
133  }
134 }
135 
136 void WiseRoute::handleLowerPacket(Packet *packet)
137 {
138  auto wiseRouteHeader = staticPtrCast<WiseRouteHeader>(packet->peekAtFront<WiseRouteHeader>()->dupShared());
139  const L3Address& finalDestAddr = wiseRouteHeader->getFinalDestAddr();
140  const L3Address& initialSrcAddr = wiseRouteHeader->getInitialSrcAddr();
141  const L3Address& srcAddr = wiseRouteHeader->getSourceAddress();
142  // KLUDGE get rssi and ber
143  EV_ERROR << "Getting RSSI and BER from the received frame is not yet implemented. Using default values.\n";
144  double rssi = 1; // TODO ctrlInfo->getRSSI();
145  double ber = 0; // TODO ctrlInfo->getBitErrorRate();
146  // Check whether the message is a flood and if it has to be forwarded.
147  floodTypes floodType = updateFloodTable(wiseRouteHeader->getIsFlood(), initialSrcAddr, finalDestAddr,
148  wiseRouteHeader->getSeqNum());
149  allReceivedRSSI.record(rssi);
150  allReceivedBER.record(ber);
151  if (floodType == DUPLICATE) {

◆ handleStartOperation()

virtual void inet::WiseRoute::handleStartOperation ( LifecycleOperation operation)
inlineoverridevirtual

◆ handleStopOperation()

virtual void inet::WiseRoute::handleStopOperation ( LifecycleOperation operation)
inlineoverridevirtual

◆ handleUpperPacket()

void inet::WiseRoute::handleUpperPacket ( Packet packet)
overrideprotectedvirtual

Handle messages from upper layer.

Reimplemented from inet::LayeredProtocolBase.

260  : CInfo removed, netw addr=" << destAddr << endl;
261  finalDestAddr = destAddr;
262  }
263 
264  pkt->setFinalDestAddr(finalDestAddr);
265  pkt->setInitialSrcAddr(myNetwAddr);
266  pkt->setSourceAddress(myNetwAddr);
267  pkt->setNbHops(0);
268  pkt->setProtocolId(static_cast<IpProtocolId>(ProtocolGroup::ipprotocol.getProtocolNumber(packet->getTag<PacketProtocolTag>()->getProtocol())));
269 
270  if (finalDestAddr.isBroadcast())
271  nextHopAddr = myNetwAddr.getAddressType()->getBroadcastAddress();
272  else
273  nextHopAddr = getRoute(finalDestAddr, true);
274  pkt->setDestinationAddress(nextHopAddr);
275  if (nextHopAddr.isBroadcast()) {
276  // it's a flood.
277  nextHopMacAddr = MacAddress::BROADCAST_ADDRESS;
278  pkt->setIsFlood(1);
279  nbFloodsSent++;
280  // record flood in flood table
281  floodTable.insert(make_pair(myNetwAddr, floodSeqNumber));
282  pkt->setSeqNum(floodSeqNumber);
283  floodSeqNumber++;
284  nbGetRouteFailures++;
285  }
286  else {
287  pkt->setIsFlood(0);
288  nbPureUnicastSent++;
289  nextHopMacAddr = arp->resolveL3Address(nextHopAddr, nullptr); // FIXME interface entry pointer needed
290  if (nextHopMacAddr.isUnspecified())
291  throw cRuntimeError("Cannot immediately resolve MAC address. Please configure a GlobalArp module.");
292  }
293  pkt->setPayloadLengthField(packet->getDataLength());
294  pkt->setHeaderKind(DATA);
295  packet->insertAtFront(pkt);
296  setDownControlInfo(packet, nextHopMacAddr);
297  sendDown(packet);
298  nbDataPacketsSent++;
299 }
300 
301 void WiseRoute::finish()
302 {
303  recordScalar("nbDataPacketsForwarded", nbDataPacketsForwarded);
304  recordScalar("nbDataPacketsReceived", nbDataPacketsReceived);
305  recordScalar("nbDataPacketsSent", nbDataPacketsSent);
306  recordScalar("nbDuplicatedFloodsReceived", nbDuplicatedFloodsReceived);
307  recordScalar("nbFloodsSent", nbFloodsSent);
308  recordScalar("nbPureUnicastSent", nbPureUnicastSent);
309  recordScalar("nbRouteFloodsSent", nbRouteFloodsSent);
310  recordScalar("nbRouteFloodsReceived", nbRouteFloodsReceived);
311  recordScalar("nbUnicastFloodForwarded", nbUnicastFloodForwarded);
312  recordScalar("nbPureUnicastForwarded", nbPureUnicastForwarded);
313  recordScalar("nbGetRouteFailures", nbGetRouteFailures);
314  recordScalar("nbRoutesRecorded", nbRoutesRecorded);
315  recordScalar("meanNbHops", (double)nbHops / (double)nbDataPacketsReceived);
316 }

◆ initialize()

void inet::WiseRoute::initialize ( int  stage)
overridevirtual

Reimplemented from inet::NetworkProtocolBase.

80  {
81  for (int i = 0; i < interfaceTable->getNumInterfaces(); i++)
82  interfaceTable->getInterface(i)->setHasModulePathAddress(true);
83  }
84  else if (stage == INITSTAGE_NETWORK_LAYER) {
85  L3AddressResolver addressResolver;
86  sinkAddress = addressResolver.resolve(par("sinkAddress"));
87 
88  IInterfaceTable *interfaceTable = getModuleFromPar<IInterfaceTable>(par("interfaceTableModule"), this);
89  if (auto ie = interfaceTable->findFirstNonLoopbackInterface())
90  myNetwAddr = ie->getNetworkAddress();
91  else
92  throw cRuntimeError("No non-loopback interface found!");
93 
94  // only schedule a flood of the node is a sink!!
96  scheduleAfter(uniform(0.5, 1.5), routeFloodTimer);
97  }
98 }
99 
101 {
102  cancelAndDelete(routeFloodTimer);
103 }
104 
105 void WiseRoute::handleSelfMessage(cMessage *msg)
106 {
107  if (msg->getKind() == SEND_ROUTE_FLOOD_TIMER) {
108  // Send route flood packet and restart the timer
109  auto pkt = makeShared<WiseRouteHeader>();
110  L3Address broadcastAddress = myNetwAddr.getAddressType()->getBroadcastAddress();
111  pkt->setChunkLength(B(headerLength));
112  pkt->setInitialSrcAddr(myNetwAddr);
113  pkt->setFinalDestAddr(broadcastAddress);
114  pkt->setSourceAddress(myNetwAddr);
115  pkt->setDestinationAddress(broadcastAddress);

◆ numInitStages()

virtual int inet::WiseRoute::numInitStages ( ) const
inlineoverridevirtual

Initialization of the module and some variables.

◆ operator=()

WiseRoute& inet::WiseRoute::operator= ( const WiseRoute )
private

Assignment operator is not allowed.

◆ setDownControlInfo()

void inet::WiseRoute::setDownControlInfo ( Packet *const  pMsg,
const MacAddress pDestAddr 
)
protectedvirtual

Attaches a "control info" (NetwToMac) structure (object) to the message pMsg.

Attaches a "control info" structure (object) to the down message pMsg.

This is most useful when passing packets between protocol layers of a protocol stack, the control info will contain the destination MAC address.

The "control info" object will be deleted when the message is deleted. Only one "control info" structure can be attached (the second setL3ToL2ControlInfo() call throws an error).

Parameters
pMsgThe message where the "control info" shall be attached.
pDestAddrThe MAC address of the message receiver.

◆ updateFloodTable()

WiseRoute::floodTypes inet::WiseRoute::updateFloodTable ( bool  isFlood,
const tFloodTable::key_type &  srcAddr,
const tFloodTable::key_type &  destAddr,
unsigned long  seqNum 
)
protected

update flood table.

returns detected flood type (general or unicast flood to forward, duplicate flood to delete, unicast flood to me

395 {
396  // Find a route to dest address. As in the embedded code, if no route exists, indicate
397  // final destination as next hop. If we'are lucky, final destination is one hop away...
398  // If I am the origin of the packet and no route exists, use flood, hence return broadcast
399  // address for next hop.
400  tRouteTable::const_iterator pos = routeTable.find(destAddr);
401  return (pos != routeTable.end()) ? pos->second.nextHop : myNetwAddr.getAddressType()->getBroadcastAddress();
402 }
403 
407 void WiseRoute::setDownControlInfo(Packet *const pMsg, const MacAddress& pDestAddr)
408 {
409  pMsg->addTagIfAbsent<MacAddressReq>()->setDestAddress(pDestAddr);

◆ updateRouteTable()

void inet::WiseRoute::updateRouteTable ( const tRouteTable::key_type &  origin,
const L3Address lastHop,
double  rssi,
double  ber 
)
protectedvirtual

Update routing table.

The tuple provided in argument gives the next hop address to the origin. The table is updated only if the RSSI value is above the threshold.

336  {
337  // TODO nextHopSelectionForSink.record(static_cast<double>(lastHop));
338  }
339  }
340  }
341  else {
342  // A route towards the node which originated the received packet already exists.
343  // Replace its entry only if the route proposal that we just received has a stronger
344  // RSSI.
345 // tRouteTableEntry entry = pos->second;
346 // if (entry.rssi > rssiThreshold) {
347 // entry.nextHop = lastHop;
348 // entry.rssi = rssi;
349 // if (origin == 0)
350 // nextHopSelectionForSink.record(lastHop);
351 // }
352  }
353 }
354 
355 void WiseRoute::decapsulate(Packet *packet)
356 {
357  auto wiseRouteHeader = packet->popAtFront<WiseRouteHeader>();
358  auto payloadLength = wiseRouteHeader->getPayloadLengthField();
359  if (packet->getDataLength() < payloadLength) {
360  throw cRuntimeError("Data error: illegal payload length"); // FIXME packet drop
361  }
362  if (packet->getDataLength() > payloadLength)
363  packet->setBackOffset(packet->getFrontOffset() + payloadLength);
364  auto payloadProtocol = wiseRouteHeader->getProtocol();
365  packet->addTagIfAbsent<NetworkProtocolInd>()->setProtocol(&getProtocol());
366  packet->addTagIfAbsent<NetworkProtocolInd>()->setNetworkProtocolHeader(wiseRouteHeader);
367  packet->addTagIfAbsent<DispatchProtocolReq>()->setProtocol(payloadProtocol);
368  packet->addTagIfAbsent<PacketProtocolTag>()->setProtocol(payloadProtocol);
369  packet->addTagIfAbsent<L3AddressInd>()->setSrcAddress(wiseRouteHeader->getInitialSrcAddr());
370  nbHops = nbHops + wiseRouteHeader->getNbHops();

Member Data Documentation

◆ allReceivedBER

cOutVector inet::WiseRoute::allReceivedBER
protected

◆ allReceivedRSSI

cOutVector inet::WiseRoute::allReceivedRSSI
protected

◆ arp

ModuleRefByPar<IArp> inet::WiseRoute::arp
protected

◆ floodSeqNumber

unsigned long inet::WiseRoute::floodSeqNumber = 0
protected

Flood sequence number.

◆ floodTable

tFloodTable inet::WiseRoute::floodTable
protected

Referenced by decapsulate().

◆ headerLength

int inet::WiseRoute::headerLength = 0
protected

Length of the NetwPkt header Read from omnetpp.ini.

◆ myNetwAddr

L3Address inet::WiseRoute::myNetwAddr
protected

Referenced by decapsulate().

◆ nbDataPacketsForwarded

long inet::WiseRoute::nbDataPacketsForwarded = 0
protected

◆ nbDataPacketsReceived

long inet::WiseRoute::nbDataPacketsReceived = 0
protected

◆ nbDataPacketsSent

long inet::WiseRoute::nbDataPacketsSent = 0
protected

◆ nbDuplicatedFloodsReceived

long inet::WiseRoute::nbDuplicatedFloodsReceived = 0
protected

◆ nbFloodsSent

long inet::WiseRoute::nbFloodsSent = 0
protected

◆ nbGetRouteFailures

long inet::WiseRoute::nbGetRouteFailures = 0
protected

◆ nbHops

long inet::WiseRoute::nbHops = 0
protected

◆ nbPureUnicastForwarded

long inet::WiseRoute::nbPureUnicastForwarded = 0
protected

◆ nbPureUnicastSent

long inet::WiseRoute::nbPureUnicastSent = 0
protected

◆ nbRouteFloodsReceived

long inet::WiseRoute::nbRouteFloodsReceived = 0
protected

◆ nbRouteFloodsSent

long inet::WiseRoute::nbRouteFloodsSent = 0
protected

◆ nbRoutesRecorded

long inet::WiseRoute::nbRoutesRecorded = 0
protected

◆ nbUnicastFloodForwarded

long inet::WiseRoute::nbUnicastFloodForwarded = 0
protected

◆ nextHopSelectionForSink

cOutVector inet::WiseRoute::nextHopSelectionForSink
protected

◆ receivedBER

cOutVector inet::WiseRoute::receivedBER
protected

Referenced by finish().

◆ receivedRSSI

cOutVector inet::WiseRoute::receivedRSSI
protected

Referenced by finish().

◆ routeBER

cOutVector inet::WiseRoute::routeBER
protected

Referenced by finish().

◆ routeFloodsInterval

double inet::WiseRoute::routeFloodsInterval = 0.0
protected

Interval [seconds] between two route floods.

A route flood is a simple flood from which other nodes can extract routing (next hop) information.

◆ routeFloodTimer

cMessage* inet::WiseRoute::routeFloodTimer = nullptr
protected

◆ routeRSSI

cOutVector inet::WiseRoute::routeRSSI
protected

Referenced by finish().

◆ routeTable

tRouteTable inet::WiseRoute::routeTable
protected

Referenced by finish().

◆ rssiThreshold

double inet::WiseRoute::rssiThreshold = 0.0
protected

Minimal received RSSI necessary for adding source to routing table.

Referenced by finish().

◆ sinkAddress

L3Address inet::WiseRoute::sinkAddress
protected

◆ trace

bool inet::WiseRoute::trace = false
protected

The documentation for this class was generated from the following files:
inet::ROUTE_FLOOD
@ ROUTE_FLOOD
Definition: WiseRouteHeader_m.h:62
inet::WiseRoute::tRouteTableEntry::nextHop
L3Address nextHop
Definition: WiseRoute.h:122
inet::WiseRoute::FORWARD
@ FORWARD
Definition: WiseRoute.h:116
inet::WiseRoute::nbHops
long nbHops
Definition: WiseRoute.h:168
inet::WiseRoute::decapsulate
void decapsulate(Packet *packet)
Decapsulate a message and delete original msg.
Definition: WiseRoute.cc:372
inet::WiseRoute::nbPureUnicastForwarded
long nbPureUnicastForwarded
Definition: WiseRoute.h:165
inet::WiseRoute::allReceivedRSSI
cOutVector allReceivedRSSI
Definition: WiseRoute.h:172
inet::WiseRoute::nbDuplicatedFloodsReceived
long nbDuplicatedFloodsReceived
Definition: WiseRoute.h:159
inet::WiseRoute::updateRouteTable
virtual void updateRouteTable(const tRouteTable::key_type &origin, const L3Address &lastHop, double rssi, double ber)
Update routing table.
Definition: WiseRoute.cc:335
inet::WiseRoute::nbDataPacketsReceived
long nbDataPacketsReceived
Definition: WiseRoute.h:157
inet::WiseRoute::routeFloodsInterval
double routeFloodsInterval
Interval [seconds] between two route floods.
Definition: WiseRoute.h:149
inet::WiseRoute::routeRSSI
cOutVector routeRSSI
Definition: WiseRoute.h:171
inet::WiseRoute::arp
ModuleRefByPar< IArp > arp
Definition: WiseRoute.h:132
inet::WiseRoute::nbRouteFloodsSent
long nbRouteFloodsSent
Definition: WiseRoute.h:162
inet::WiseRoute::nbPureUnicastSent
long nbPureUnicastSent
Definition: WiseRoute.h:161
inet::WiseRoute::FORME
@ FORME
Definition: WiseRoute.h:117
inet::WiseRoute::nbUnicastFloodForwarded
long nbUnicastFloodForwarded
Definition: WiseRoute.h:164
inet::WiseRoute::floodTable
tFloodTable floodTable
Definition: WiseRoute.h:130
DispatchProtocolReq
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down DispatchProtocolReq
Definition: IUdp-gates.txt:25
inet::INITSTAGE_NETWORK_LAYER
INET_API InitStage INITSTAGE_NETWORK_LAYER
Initialization of network layer protocols.
L3AddressInd
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd L3AddressInd
Definition: IUdp-gates.txt:20
inet::WiseRoute::receivedRSSI
cOutVector receivedRSSI
Definition: WiseRoute.h:170
inet::WiseRoute::getRoute
tFloodTable::key_type getRoute(const tFloodTable::key_type &destAddr, bool iAmOrigin=false) const
find a route to destination address.
Definition: WiseRoute.cc:411
inet::IL3AddressType::getBroadcastAddress
virtual L3Address getBroadcastAddress() const =0
inet::WiseRoute::rssiThreshold
double rssiThreshold
Minimal received RSSI necessary for adding source to routing table.
Definition: WiseRoute.h:144
inet::WiseRoute::routeTable
tRouteTable routeTable
Definition: WiseRoute.h:129
PacketProtocolTag
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down PacketProtocolTag
Definition: IUdp-gates.txt:25
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::WiseRoute::nbGetRouteFailures
long nbGetRouteFailures
Definition: WiseRoute.h:166
inet::WiseRoute::nbRouteFloodsReceived
long nbRouteFloodsReceived
Definition: WiseRoute.h:163
inet::WiseRoute::getProtocol
const Protocol & getProtocol() const override
Definition: WiseRoute.h:102
inet::NetworkProtocolBase::sendUp
virtual void sendUp(cMessage *message)
Definition: NetworkProtocolBase.cc:51
inet::WiseRoute::headerLength
int headerLength
Length of the NetwPkt header Read from omnetpp.ini.
Definition: WiseRoute.h:138
inet::DATA
@ DATA
Definition: WiseRouteHeader_m.h:61
inet::WiseRoute::routeFloodTimer
cMessage * routeFloodTimer
Definition: WiseRoute.h:154
inet::WiseRoute::DUPLICATE
@ DUPLICATE
Definition: WiseRoute.h:118
inet::WiseRoute::handleSelfMessage
virtual void handleSelfMessage(cMessage *msg) override
Handle self messages.
Definition: WiseRoute.cc:122
inet::WiseRoute::nbDataPacketsForwarded
long nbDataPacketsForwarded
Definition: WiseRoute.h:156
inet::WiseRoute::floodTypes
floodTypes
Definition: WiseRoute.h:114
inet::WiseRoute::handleUpperPacket
virtual void handleUpperPacket(Packet *packet) override
Handle messages from upper layer.
Definition: WiseRoute.cc:260
inet::NetworkProtocolBase::interfaceTable
ModuleRefByPar< IInterfaceTable > interfaceTable
Definition: NetworkProtocolBase.h:35
inet::L3Address::isBroadcast
bool isBroadcast() const
Definition: L3Address.cc:216
inet::units::values::b
value< int64_t, units::b > b
Definition: Units.h:1241
inet::WiseRoute::nbRoutesRecorded
long nbRoutesRecorded
Definition: WiseRoute.h:167
inet::WiseRoute::nbFloodsSent
long nbFloodsSent
Definition: WiseRoute.h:160
inet::WiseRoute::SEND_ROUTE_FLOOD_TIMER
@ SEND_ROUTE_FLOOD_TIMER
Definition: WiseRoute.h:111
inet::WiseRoute::sinkAddress
L3Address sinkAddress
Definition: WiseRoute.h:141
inet::WiseRoute::nbDataPacketsSent
long nbDataPacketsSent
Definition: WiseRoute.h:158
inet::WiseRoute::receivedBER
cOutVector receivedBER
Definition: WiseRoute.h:175
inet::WiseRoute::updateFloodTable
floodTypes updateFloodTable(bool isFlood, const tFloodTable::key_type &srcAddr, const tFloodTable::key_type &destAddr, unsigned long seqNum)
update flood table.
Definition: WiseRoute.cc:390
inet::MacAddress::BROADCAST_ADDRESS
static const MacAddress BROADCAST_ADDRESS
The broadcast MAC address, ff:ff:ff:ff:ff:ff.
Definition: MacAddress.h:34
inet::L3Address::getAddressType
IL3AddressType * getAddressType() const
Definition: L3Address.cc:59
inet::WiseRoute::routeBER
cOutVector routeBER
Definition: WiseRoute.h:174
inet::WiseRoute::allReceivedBER
cOutVector allReceivedBER
Definition: WiseRoute.h:173
inet::NetworkProtocolBase::sendDown
virtual void sendDown(cMessage *message, int interfaceId=-1)
Definition: NetworkProtocolBase.cc:91
inet::WiseRoute::tRouteTableEntry
struct inet::WiseRoute::tRouteTableEntry tRouteTableEntry
inet::WiseRoute::myNetwAddr
L3Address myNetwAddr
Definition: WiseRoute.h:140
inet::WiseRoute::setDownControlInfo
virtual void setDownControlInfo(Packet *const pMsg, const MacAddress &pDestAddr)
Attaches a "control info" (NetwToMac) structure (object) to the message pMsg.
Definition: WiseRoute.cc:424
inet::WiseRoute::~WiseRoute
virtual ~WiseRoute()
Definition: WiseRoute.cc:117
inet::WiseRoute::handleLowerPacket
virtual void handleLowerPacket(Packet *packet) override
Handle messages from lower layer.
Definition: WiseRoute.cc:153