|
INET Framework for OMNeT++/OMNEST
|
This class provides Dynamic MANET On-demand (Dymo also known as AODVv2) Routing based on the IETF draft at http://tools.ietf.org/html/draft-ietf-manet-dymo-24.
More...
#include <Dymo.h>
|
| void | processSelfMessage (cMessage *message) |
| |
| void | processMessage (cMessage *message) |
| |
| void | startRouteDiscovery (const L3Address &target) |
| |
| void | retryRouteDiscovery (const L3Address &target, int retryCount) |
| |
| void | completeRouteDiscovery (const L3Address &target) |
| |
| void | cancelRouteDiscovery (const L3Address &target) |
| |
| bool | hasOngoingRouteDiscovery (const L3Address &target) |
| |
| void | delayDatagram (Packet *datagram) |
| |
| void | reinjectDelayedDatagram (Packet *datagram) |
| |
| void | dropDelayedDatagram (Packet *datagram) |
| |
| void | eraseDelayedDatagrams (const L3Address &target) |
| |
| bool | hasDelayedDatagrams (const L3Address &target) |
| |
| void | cancelRreqTimer (const L3Address &target) |
| |
| void | deleteRreqTimer (const L3Address &target) |
| |
| void | eraseRreqTimer (const L3Address &target) |
| |
| RreqWaitRrepTimer * | createRreqWaitRrepTimer (const L3Address &target, int retryCount) |
| |
| void | scheduleRreqWaitRrepTimer (RreqWaitRrepTimer *message) |
| |
| void | processRreqWaitRrepTimer (RreqWaitRrepTimer *message) |
| |
| RreqBackoffTimer * | createRreqBackoffTimer (const L3Address &target, int retryCount) |
| |
| void | scheduleRreqBackoffTimer (RreqBackoffTimer *message) |
| |
| void | processRreqBackoffTimer (RreqBackoffTimer *message) |
| |
| simtime_t | computeRreqBackoffTime (int retryCount) |
| |
| RreqHolddownTimer * | createRreqHolddownTimer (const L3Address &target) |
| |
| void | scheduleRreqHolddownTimer (RreqHolddownTimer *message) |
| |
| void | processRreqHolddownTimer (RreqHolddownTimer *message) |
| |
| void | sendUdpPacket (cPacket *packet) |
| |
| void | cancelJitterTimerPacket (PacketJitterTimer *msg) |
| |
| void | eraseJitterTimerPacket (PacketJitterTimer *msg) |
| |
| void | scheduleJitterTimerPacket (cPacket *packet, double delay) |
| |
| void | processJitterTimerPacket (PacketJitterTimer *msg) |
| |
| void | processUdpPacket (Packet *packet) |
| |
| void | sendDymoPacket (const Ptr< DymoPacket > &packet, const NetworkInterface *networkInterface, const L3Address &nextHop, double delay) |
| |
| void | processDymoPacket (Packet *packet, const Ptr< const DymoPacket > &dymoPacket) |
| |
| bool | permissibleRteMsg (Packet *packet, const Ptr< const RteMsg > &rteMsg) |
| |
| void | processRteMsg (Packet *packet, const Ptr< const RteMsg > &rteMsg) |
| |
| b | computeRteMsgLength (const Ptr< RteMsg > &rteMsg) |
| |
| const Ptr< Rreq > | createRreq (const L3Address &target, int retryCount) |
| |
| void | sendRreq (const Ptr< Rreq > &rreq) |
| |
| void | processRreq (Packet *packet, const Ptr< const Rreq > &rreq) |
| |
| b | computeRreqLength (const Ptr< Rreq > &rreq) |
| |
| const Ptr< Rrep > | createRrep (const Ptr< const RteMsg > &rteMsg) |
| |
| const Ptr< Rrep > | createRrep (const Ptr< const RteMsg > &rteMsg, IRoute *route) |
| |
| void | sendRrep (const Ptr< Rrep > &rrep) |
| |
| void | sendRrep (const Ptr< Rrep > &rrep, IRoute *route) |
| |
| void | processRrep (Packet *packet, const Ptr< const Rrep > &rrep) |
| |
| b | computeRrepLength (const Ptr< Rrep > &rrep) |
| |
| const Ptr< Rerr > | createRerr (std::vector< L3Address > &addresses) |
| |
| void | sendRerr (const Ptr< Rerr > &rerr) |
| |
| void | sendRerrForUndeliverablePacket (const L3Address &destination) |
| |
| void | sendRerrForBrokenLink (const NetworkInterface *networkInterface, const L3Address &nextHop) |
| |
| void | processRerr (Packet *packet, const Ptr< const Rerr > &rerr) |
| |
| b | computeRerrLength (const Ptr< Rerr > &rerr) |
| |
| IRoute * | createRoute (Packet *packet, const Ptr< const RteMsg > &rteMsg, const AddressBlock &addressBlock) |
| |
| void | updateRoutes (Packet *packet, const Ptr< const RteMsg > &rteMsg, const AddressBlock &addressBlock) |
| |
| void | updateRoute (Packet *packet, const Ptr< const RteMsg > &rteMsg, const AddressBlock &addressBlock, IRoute *route) |
| |
| int | getLinkCost (const NetworkInterface *networkInterface, DymoMetricType metricType) |
| |
| bool | isLoopFree (const Ptr< const RteMsg > &rteMsg, IRoute *route) |
| |
| void | processExpungeTimer () |
| |
| void | scheduleExpungeTimer () |
| |
| void | expungeRoutes () |
| |
| simtime_t | getNextExpungeTime () |
| |
| DymoRouteState | getRouteState (DymoRouteData *routeData) |
| |
| void | configureInterfaces () |
| |
| L3Address | getSelfAddress () |
| |
| bool | isClientAddress (const L3Address &address) |
| |
| void | addSelfNode (const Ptr< RteMsg > &rteMsg) |
| |
| void | addNode (const Ptr< RteMsg > &rteMsg, AddressBlock &addressBlock) |
| |
| void | incrementSequenceNumber () |
| |
| Result | ensureRouteForDatagram (Packet *datagram) |
| |
| virtual Result | datagramPreRoutingHook (Packet *datagram) override |
| | This is the first hook called by the network protocol before it routes a datagram that was received from the lower layer. More...
|
| |
| virtual Result | datagramForwardHook (Packet *datagram) override |
| | This is the second hook called by the network protocol before it sends a datagram to the lower layer. More...
|
| |
| virtual Result | datagramPostRoutingHook (Packet *datagram) override |
| | This is the last hook called by the network protocol before it sends a datagram to the lower layer. More...
|
| |
| virtual Result | datagramLocalInHook (Packet *datagram) override |
| | This is the last hook called by the network protocol before it sends a datagram to the upper layer. More...
|
| |
| virtual Result | datagramLocalOutHook (Packet *datagram) override |
| | This is the first hook called by the network protocol before it routes a datagram that was received from the upper layer. More...
|
| |
| virtual void | handleStartOperation (LifecycleOperation *operation) override |
| |
| virtual void | handleStopOperation (LifecycleOperation *operation) override |
| |
| virtual void | handleCrashOperation (LifecycleOperation *operation) override |
| |
| virtual void | receiveSignal (cComponent *source, simsignal_t signalID, cObject *obj, cObject *details) override |
| |
This class provides Dynamic MANET On-demand (Dymo also known as AODVv2) Routing based on the IETF draft at http://tools.ietf.org/html/draft-ietf-manet-dymo-24.
Optional features implemented:
- 7.1. Route Discovery Retries and Buffering To reduce congestion in a network, repeated attempts at route discovery for a particular Target Node SHOULD utilize a binary exponential backoff.
- 13.1. Expanding Rings Multicast Increase hop limit from min to max with each retry.
- 13.2. Intermediate RREP Allow intermediate Dymo routers to reply with RREP.
- 13.6. Message Aggregation RFC5148 add jitter to broadcasts
◆ Dymo()
| inet::dymo::Dymo::Dymo |
( |
| ) |
|
◆ ~Dymo()
| inet::dymo::Dymo::~Dymo |
( |
| ) |
|
|
virtual |
63 cancelAndDelete(elem.second);
65 cancelAndDelete(pkt_timer);
◆ addNode()
| void inet::dymo::Dymo::addNode |
( |
const Ptr< RteMsg > & |
rteMsg, |
|
|
AddressBlock & |
addressBlock |
|
) |
| |
|
private |
1351 int size = rteMsg->getAddedNodeArraySize();
1352 rteMsg->setAddedNodeArraySize(size + 1);
1353 rteMsg->setAddedNode(size, addressBlock);
Referenced by addSelfNode().
◆ addSelfNode()
| void inet::dymo::Dymo::addSelfNode |
( |
const Ptr< RteMsg > & |
rteMsg | ) |
|
|
private |
1335 AddressBlock addressBlock;
1336 addressBlock.setAddress(address);
1338 addressBlock.setHasValidityTime(
false);
1339 addressBlock.setValidityTime(-1);
1340 addressBlock.setHasMetric(
true);
1341 addressBlock.setMetric(0);
1342 addressBlock.setHasMetricType(
true);
1344 addressBlock.setHasSequenceNumber(
true);
1346 addNode(rteMsg, addressBlock);
Referenced by processRrep(), and processRreq().
◆ cancelJitterTimerPacket()
405 cancelAndDelete(msg);
◆ cancelRouteDiscovery()
| void inet::dymo::Dymo::cancelRouteDiscovery |
( |
const L3Address & |
target | ) |
|
|
private |
◆ cancelRreqTimer()
| void inet::dymo::Dymo::cancelRreqTimer |
( |
const L3Address & |
target | ) |
|
|
private |
◆ completeRouteDiscovery()
| void inet::dymo::Dymo::completeRouteDiscovery |
( |
const L3Address & |
target | ) |
|
|
private |
192 EV_INFO <<
"Completing route discovery: originator = " <<
getSelfAddress() <<
", target = " << target << endl;
196 for (
auto it = lt; it != ut; it++)
Referenced by processRrep().
◆ computeRerrLength()
| b inet::dymo::Dymo::computeRerrLength |
( |
const Ptr< Rerr > & |
rerr | ) |
|
|
private |
1026 int addressBlock = 8 + 8;
1030 addressBlock += rerr->getUnreachableNodeArraySize() * 4 * 8;
1033 int addressTLV = 8 + 8;
1039 addressTLV += rerr->getUnreachableNodeArraySize() * 2 * 8;
1041 int addressTLVBlock = 16;
1043 addressTLVBlock += addressTLV;
1045 int messageTLVBlock = 16;
1048 int messageHeader = 8 + 4 + 4 + 16;
1051 messageHeader += 8 + 8;
1055 int message = messageHeader + messageTLVBlock;
1057 message += (addressBlock + addressTLVBlock);
1059 int packetHeader = 4 + 4;
1063 int packet = packetHeader;
Referenced by sendRerr().
◆ computeRrepLength()
| b inet::dymo::Dymo::computeRrepLength |
( |
const Ptr< Rrep > & |
rrep | ) |
|
|
private |
◆ computeRreqBackoffTime()
| simtime_t inet::dymo::Dymo::computeRreqBackoffTime |
( |
int |
retryCount | ) |
|
|
private |
◆ computeRreqLength()
| b inet::dymo::Dymo::computeRreqLength |
( |
const Ptr< Rreq > & |
rreq | ) |
|
|
private |
◆ computeRteMsgLength()
| b inet::dymo::Dymo::computeRteMsgLength |
( |
const Ptr< RteMsg > & |
rteMsg | ) |
|
|
private |
554 int addressBlock = 8 + 8;
558 addressBlock += (2 + rteMsg->getAddedNodeArraySize()) * 4 * 8;
561 int addressTLV = 8 + 8;
567 addressTLV += (2 + rteMsg->getAddedNodeArraySize()) * 2 * 8;
569 int addressTLVBlock = 16;
571 addressTLVBlock += addressTLV;
573 int messageTLVBlock = 16;
576 int messageHeader = 8 + 4 + 4 + 16;
579 messageHeader += 8 + 8;
582 int message = messageHeader + messageTLVBlock;
584 message += (addressBlock + addressTLVBlock);
586 int packetHeader = 4 + 4;
590 int packet = packetHeader;
Referenced by computeRrepLength(), and computeRreqLength().
◆ configureInterfaces()
| void inet::dymo::Dymo::configureInterfaces |
( |
| ) |
|
|
private |
1294 cPatternMatcher interfaceMatcher(
interfaces,
false,
true,
false);
1296 NetworkInterface *networkInterface =
interfaceTable->getInterface(i);
1297 if (networkInterface->isMulticast() && interfaceMatcher.matches(networkInterface->getInterfaceName()))
Referenced by handleStartOperation().
◆ createRerr()
| const Ptr< Rerr > inet::dymo::Dymo::createRerr |
( |
std::vector< L3Address > & |
addresses | ) |
|
|
private |
840 auto rerr = makeShared<Rerr>();
841 for (
auto& unreachableAddresse : unreachableAddresses) {
842 const L3Address& unreachableAddress = unreachableAddresse;
843 AddressBlock *addressBlock =
new AddressBlock();
844 addressBlock->setAddress(unreachableAddress);
846 addressBlock->setHasValidityTime(
false);
847 addressBlock->setHasMetric(
false);
848 addressBlock->setHasMetricType(
false);
851 addressBlock->setHasSequenceNumber(
true);
852 addressBlock->setSequenceNumber(st->second);
855 addressBlock->setHasSequenceNumber(
false);
856 int size = rerr->getUnreachableNodeArraySize();
857 rerr->setUnreachableNodeArraySize(size + 1);
858 rerr->setUnreachableNode(size, *addressBlock);
Referenced by processRerr(), sendRerrForBrokenLink(), and sendRerrForUndeliverablePacket().
◆ createRoute()
1130 route->setSource(
this);
1131 route->setProtocolData(
new DymoRouteData());
Referenced by updateRoutes().
◆ createRrep() [1/2]
| const Ptr< Rrep > inet::dymo::Dymo::createRrep |
( |
const Ptr< const RteMsg > & |
rteMsg | ) |
|
|
private |
◆ createRrep() [2/2]
| const Ptr< Rrep > inet::dymo::Dymo::createRrep |
( |
const Ptr< const RteMsg > & |
rteMsg, |
|
|
IRoute * |
route |
|
) |
| |
|
private |
727 DymoRouteData *routeData = check_and_cast<DymoRouteData *>(route->getProtocolData());
728 auto rrep = makeShared<Rrep>();
729 AddressBlock& originatorNode = rrep->getOriginatorNodeForUpdate();
730 AddressBlock& targetNode = rrep->getTargetNodeForUpdate();
738 originatorNode = AddressBlock(rteMsg->getOriginatorNode());
740 targetNode = AddressBlock(rteMsg->getTargetNode());
742 originatorNode.setHasSequenceNumber(
true);
743 originatorNode.setSequenceNumber(rteMsg->getOriginatorNode().getSequenceNumber());
745 targetNode.setHasSequenceNumber(
true);
754 targetNode.setHasMetricType(
true);
755 targetNode.setMetricType(routeData->getMetricType());
757 targetNode.setHasMetric(
true);
758 targetNode.setMetric(route->getMetric());
760 rrep->setHopLimit(rteMsg->getHopCount());
◆ createRreq()
| const Ptr< Rreq > inet::dymo::Dymo::createRreq |
( |
const L3Address & |
target, |
|
|
int |
retryCount |
|
) |
| |
|
private |
602 auto rreq = makeShared<Rreq>();
603 AddressBlock& originatorNode = rreq->getOriginatorNodeForUpdate();
604 AddressBlock& targetNode = rreq->getTargetNodeForUpdate();
621 rreq->setHopCount(0);
625 targetNode.setAddress(target);
631 targetNode.setHasSequenceNumber(
true);
632 targetNode.setSequenceNumber(st->second);
635 targetNode.setHasSequenceNumber(
false);
638 originatorNode.setAddress(originator);
640 originatorNode.setHasSequenceNumber(
true);
644 originatorNode.setHasMetric(
true);
645 originatorNode.setMetric(0);
646 originatorNode.setHasMetricType(
true);
648 targetNode.setHasMetricType(
true);
652 rreq->setHopLimit(hopLimit);
Referenced by retryRouteDiscovery(), and startRouteDiscovery().
◆ createRreqBackoffTimer()
321 RreqBackoffTimer *message =
new RreqBackoffTimer(
"RreqBackoffTimer");
322 message->setRetryCount(retryCount);
323 message->setTarget(target);
Referenced by processRreqWaitRrepTimer().
◆ createRreqHolddownTimer()
352 RreqHolddownTimer *message =
new RreqHolddownTimer(
"RreqHolddownTimer");
353 message->setTarget(target);
Referenced by processRreqWaitRrepTimer().
◆ createRreqWaitRrepTimer()
286 RreqWaitRrepTimer *message =
new RreqWaitRrepTimer(
"RreqWaitRrepTimer");
287 message->setRetryCount(retryCount);
288 message->setTarget(target);
Referenced by retryRouteDiscovery(), and startRouteDiscovery().
◆ datagramForwardHook()
| virtual Result inet::dymo::Dymo::datagramForwardHook |
( |
Packet * |
datagram | ) |
|
|
inlineoverrideprivatevirtual |
This is the second hook called by the network protocol before it sends a datagram to the lower layer.
This is done after the datagramPreRoutingHook or the datagramLocalInHook is called and the datagram is routed.
Implements inet::INetfilter::IHook.
◆ datagramLocalInHook()
| virtual Result inet::dymo::Dymo::datagramLocalInHook |
( |
Packet * |
datagram | ) |
|
|
inlineoverrideprivatevirtual |
This is the last hook called by the network protocol before it sends a datagram to the upper layer.
This is done after the datagramPreRoutingHook is called and the datagram is routed.
Implements inet::INetfilter::IHook.
◆ datagramLocalOutHook()
| virtual Result inet::dymo::Dymo::datagramLocalOutHook |
( |
Packet * |
datagram | ) |
|
|
inlineoverrideprivatevirtual |
This is the first hook called by the network protocol before it routes a datagram that was received from the upper layer.
The nextHopAddress is ignored when the outputNetworkInterface is a nullptr. After this is done
Implements inet::INetfilter::IHook.
◆ datagramPostRoutingHook()
| virtual Result inet::dymo::Dymo::datagramPostRoutingHook |
( |
Packet * |
datagram | ) |
|
|
inlineoverrideprivatevirtual |
This is the last hook called by the network protocol before it sends a datagram to the lower layer.
Implements inet::INetfilter::IHook.
◆ datagramPreRoutingHook()
| virtual Result inet::dymo::Dymo::datagramPreRoutingHook |
( |
Packet * |
datagram | ) |
|
|
inlineoverrideprivatevirtual |
This is the first hook called by the network protocol before it routes a datagram that was received from the lower layer.
The nextHopAddress is ignored when the outputNetworkInterface is nullptr.
Implements inet::INetfilter::IHook.
◆ delayDatagram()
| void inet::dymo::Dymo::delayDatagram |
( |
Packet * |
datagram | ) |
|
|
private |
224 EV_INFO <<
"Queuing datagram: source = " << networkHeader->getSourceAddress() <<
", destination = " << networkHeader->getDestinationAddress() << endl;
225 const L3Address& target = networkHeader->getDestinationAddress();
Referenced by ensureRouteForDatagram().
◆ deleteRreqTimer()
| void inet::dymo::Dymo::deleteRreqTimer |
( |
const L3Address & |
target | ) |
|
|
private |
◆ dropDelayedDatagram()
| void inet::dymo::Dymo::dropDelayedDatagram |
( |
Packet * |
datagram | ) |
|
|
private |
239 EV_WARN <<
"Dropping queued datagram: source = " << networkHeader->getSourceAddress() <<
", destination = " << networkHeader->getDestinationAddress() << endl;
240 networkProtocol->dropQueuedDatagram(
const_cast<const Packet *
>(datagram));
Referenced by cancelRouteDiscovery().
◆ ensureRouteForDatagram()
1379 const L3Address& source = networkHeader->getSourceAddress();
1380 const L3Address& destination = networkHeader->getDestinationAddress();
1381 if (destination.isMulticast() || destination.isBroadcast() ||
routingTable->isLocalAddress(destination))
1384 EV_DETAIL <<
"Finding route: source = " << source <<
", destination = " << destination << endl;
1385 IRoute *route =
routingTable->findBestMatchingRoute(destination);
1386 DymoRouteData *routeData = route ?
dynamic_cast<DymoRouteData *
>(route->getProtocolData()) :
nullptr;
1387 bool broken = routeData && routeData->getBroken();
1388 if (route && !route->getNextHopAsGeneric().isUnspecified() && !broken) {
1389 EV_DETAIL <<
"Route found: source = " << source <<
", destination = " << destination <<
", route: " << route << endl;
1393 routeData->setLastUsed(simTime());
1397 EV_DETAIL << (broken ?
"Broken" :
"Missing") <<
" route: source = " << source <<
", destination = " << destination << endl;
1402 EV_INFO <<
"Route discovery is in progress: originator = " <<
getSelfAddress() <<
", target = " << destination << endl;
◆ eraseDelayedDatagrams()
| void inet::dymo::Dymo::eraseDelayedDatagrams |
( |
const L3Address & |
target | ) |
|
|
private |
◆ eraseJitterTimerPacket()
◆ eraseRreqTimer()
| void inet::dymo::Dymo::eraseRreqTimer |
( |
const L3Address & |
target | ) |
|
|
private |
◆ expungeRoutes()
| void inet::dymo::Dymo::expungeRoutes |
( |
| ) |
|
|
private |
1227 EV_DETAIL <<
"Expunging routes from routing table: routeCount = " <<
routingTable->getNumRoutes() << endl;
1229 for (
int i = 0; i <
routingTable->getNumRoutes(); i++) {
1231 if (route->getSource() ==
this) {
1232 DymoRouteData *routeData = check_and_cast<DymoRouteData *>(route->getProtocolData());
1240 (simTime() >= routeData->getExpirationTime()))
1242 EV_DETAIL <<
"Expunging route: " << route << endl;
Referenced by processExpungeTimer().
◆ getLinkCost()
1180 switch (metricType) {
1185 throw cRuntimeError(
"Unknown metric type");
◆ getNextExpungeTime()
| simtime_t inet::dymo::Dymo::getNextExpungeTime |
( |
| ) |
|
|
private |
1252 simtime_t nextExpirationTime = SimTime::getMaxTime();
1253 for (
int i = 0; i <
routingTable->getNumRoutes(); i++) {
1255 if (route->getSource() ==
this) {
1256 DymoRouteData *routeData = check_and_cast<DymoRouteData *>(route->getProtocolData());
1257 const simtime_t& expirationTime = routeData->getExpirationTime();
1258 if (expirationTime < nextExpirationTime)
1259 nextExpirationTime = expirationTime;
1261 if (defaultExpirationTime < nextExpirationTime)
1262 nextExpirationTime = defaultExpirationTime;
1265 return nextExpirationTime;
Referenced by scheduleExpungeTimer().
◆ getRouteState()
1270 simtime_t lastUsed = routeData->getLastUsed();
1271 if (routeData->getBroken())
1275 else if (routeData->getExpirationTime() != SimTime::getMaxTime()) {
1276 if (simTime() >= routeData->getExpirationTime())
Referenced by expungeRoutes(), and sendRerrForBrokenLink().
◆ getSelfAddress()
| L3Address inet::dymo::Dymo::getSelfAddress |
( |
| ) |
|
|
private |
Referenced by addSelfNode(), cancelRouteDiscovery(), completeRouteDiscovery(), createRreq(), ensureRouteForDatagram(), eraseDelayedDatagrams(), initialize(), retryRouteDiscovery(), sendDymoPacket(), startRouteDiscovery(), and updateRoutes().
◆ handleCrashOperation()
◆ handleMessageWhenUp()
| void inet::dymo::Dymo::handleMessageWhenUp |
( |
cMessage * |
message | ) |
|
|
overrideprotectedvirtual |
◆ handleStartOperation()
◆ handleStopOperation()
◆ hasDelayedDatagrams()
| bool inet::dymo::Dymo::hasDelayedDatagrams |
( |
const L3Address & |
target | ) |
|
|
private |
◆ hasOngoingRouteDiscovery()
| bool inet::dymo::Dymo::hasOngoingRouteDiscovery |
( |
const L3Address & |
target | ) |
|
|
private |
◆ incrementSequenceNumber()
| void inet::dymo::Dymo::incrementSequenceNumber |
( |
| ) |
|
|
private |
◆ initialize()
| void inet::dymo::Dymo::initialize |
( |
int |
stage | ) |
|
|
overrideprotectedvirtual |
Reimplemented from inet::OperationalMixin< cSimpleModule >.
105 routingTable.reference(
this,
"routingTableModule",
true);
109 L3AddressResolver addressResolver;
111 while (tokenizer.hasMoreTokens()) {
112 const char *clientAddress = tokenizer.nextToken();
113 char *slash =
const_cast<char *
>(strchr(clientAddress,
'/'));
116 const L3Address address = addressResolver.resolve(clientAddress);
117 int prefixLength = address.getAddressType()->getMaxPrefixLength();
119 int pLength = atoi(slash + 1);
120 if (pLength < 0 || pLength > prefixLength)
121 throw cRuntimeError(
"invalid prefix length in 'clientAddresses' parameter: '%s/%s'", clientAddress, slash);
122 prefixLength = pLength;
◆ isClientAddress()
| bool inet::dymo::Dymo::isClientAddress |
( |
const L3Address & |
address | ) |
|
|
private |
◆ isLoopFree()
| bool inet::dymo::Dymo::isLoopFree |
( |
const Ptr< const RteMsg > & |
rteMsg, |
|
|
IRoute * |
route |
|
) |
| |
|
private |
◆ numInitStages()
| virtual int inet::dymo::Dymo::numInitStages |
( |
| ) |
const |
|
inlineoverrideprotectedvirtual |
◆ permissibleRteMsg()
| bool inet::dymo::Dymo::permissibleRteMsg |
( |
Packet * |
packet, |
|
|
const Ptr< const RteMsg > & |
rteMsg |
|
) |
| |
|
private |
464 const AddressBlock& originatorNode = rteMsg->getOriginatorNode();
465 const AddressBlock& targetNode = rteMsg->getTargetNode();
472 if (packet->getTag<HopLimitInd>()->getHopLimit() != 255)
475 if (rteMsg->getHopLimit() == 0)
485 if (dynamicPtrCast<const Rreq>(rteMsg) && (!originatorNode.getHasMetric() || !originatorNode.getHasSequenceNumber()))
487 else if (dynamicPtrCast<const Rrep>(rteMsg) && (!targetNode.getHasMetric() || !targetNode.getHasSequenceNumber()))
491 const L3Address& originatorAddress = originatorNode.getAddress();
492 const L3Address& targetAddress = targetNode.getAddress();
493 if (originatorAddress.isUnspecified() || originatorAddress.isMulticast() || originatorAddress.isBroadcast() ||
494 targetAddress.isUnspecified() || targetAddress.isMulticast() || targetAddress.isBroadcast())
501 if (originatorNode.getMetricType() !=
HOP_COUNT || targetNode.getMetricType() !=
HOP_COUNT)
Referenced by processRrep(), and processRreq().
◆ processDymoPacket()
| void inet::dymo::Dymo::processDymoPacket |
( |
Packet * |
packet, |
|
|
const Ptr< const DymoPacket > & |
dymoPacket |
|
) |
| |
|
private |
446 auto dymoPacketCopy = dymoPacket->dupShared();
447 if (
auto rreq = dynamicPtrCast<const Rreq>(dymoPacketCopy))
449 else if (
auto rrep = dynamicPtrCast<const Rrep>(dymoPacketCopy))
451 else if (
auto rerr = dynamicPtrCast<const Rerr>(dymoPacketCopy))
454 throw cRuntimeError(
"Unknown Dymo packet");
Referenced by processUdpPacket().
◆ processExpungeTimer()
| void inet::dymo::Dymo::processExpungeTimer |
( |
| ) |
|
|
private |
◆ processJitterTimerPacket()
◆ processMessage()
| void inet::dymo::Dymo::processMessage |
( |
cMessage * |
message | ) |
|
|
private |
164 if (Packet *fp =
dynamic_cast<Packet *
>(message))
167 throw cRuntimeError(
"Unknown message");
Referenced by handleMessageWhenUp().
◆ processRerr()
| void inet::dymo::Dymo::processRerr |
( |
Packet * |
packet, |
|
|
const Ptr< const Rerr > & |
rerr |
|
) |
| |
|
private |
947 EV_DETAIL <<
"Processing RERR" << endl;
953 if (rerrIncoming->getHopLimit() == 0 || rerrIncoming->getUnreachableNodeArraySize() == 0)
956 L3Address srcAddr = packet->getTag<
L3AddressInd>()->getSrcAddress();
957 auto incomingIfTag = packet->getTag<InterfaceInd>();
961 std::vector<L3Address> unreachableAddresses;
962 for (
int i = 0; i < (int)rerrIncoming->getUnreachableNodeArraySize(); i++) {
963 const AddressBlock& addressBlock = rerrIncoming->getUnreachableNode(i);
964 for (
int j = 0; j <
routingTable->getNumRoutes(); j++) {
966 if (route->getSource() ==
this) {
967 DymoRouteData *routeData = check_and_cast<DymoRouteData *>(route->getProtocolData());
968 const L3Address& unreachableAddress = addressBlock.getAddress();
976 if (unreachableAddress.isUnicast() &&
977 unreachableAddress == route->getDestinationAsGeneric() &&
978 route->getNextHopAsGeneric() == srcAddr &&
979 route->getInterface()->getInterfaceId() == incomingIfTag->getInterfaceId() &&
980 (!addressBlock.getHasSequenceNumber() || routeData->getSequenceNumber() <= addressBlock.getSequenceNumber()))
984 EV_DETAIL <<
"Marking route as broken: " << route << endl;
987 routeData->setBroken(
true);
988 unreachableAddresses.push_back(unreachableAddress);
993 if (unreachableAddresses.size() == 0)
994 EV_DETAIL <<
"No unreachable address found" << endl;
1004 auto rerrOutgoing =
createRerr(unreachableAddresses);
1005 rerrOutgoing->setHopLimit(rerrIncoming->getHopLimit() - 1);
Referenced by processDymoPacket().
◆ processRrep()
| void inet::dymo::Dymo::processRrep |
( |
Packet * |
packet, |
|
|
const Ptr< const Rrep > & |
rrep |
|
) |
| |
|
private |
787 const L3Address& target = rrepIncoming->getTargetNode().getAddress();
788 const L3Address& originator = rrepIncoming->getOriginatorNode().getAddress();
789 EV_DETAIL <<
"Processing RREP: originator = " << originator <<
", target = " << target << endl;
794 EV_DETAIL <<
"Received RREP for client: originator = " << originator <<
", target = " << target << endl;
810 EV_DETAIL <<
"Forwarding RREP: originator = " << originator <<
", target = " << target << endl;
811 auto rrepOutgoing = staticPtrCast<Rrep>(rrepIncoming->dupShared());
817 IRoute *route =
routingTable->findBestMatchingRoute(originator);
821 EV_WARN <<
"No route found toward originator, dropping RREP: originator = " << originator <<
", target = " << target << endl;
826 EV_WARN <<
"Dropping non-permissible RREQ" << endl;
Referenced by processDymoPacket().
◆ processRreq()
| void inet::dymo::Dymo::processRreq |
( |
Packet * |
packet, |
|
|
const Ptr< const Rreq > & |
rreq |
|
) |
| |
|
private |
667 const L3Address& target = rreqIncoming->getTargetNode().getAddress();
668 const L3Address& originator = rreqIncoming->getOriginatorNode().getAddress();
669 EV_DETAIL <<
"Processing RREQ: originator = " << originator <<
", target = " << target << endl;
686 EV_DETAIL <<
"Received RREQ for client: originator = " << originator <<
", target = " << target << endl;
690 IRoute *route =
routingTable->findBestMatchingRoute(originator);
700 EV_DETAIL <<
"Forwarding RREQ: originator = " << originator <<
", target = " << target << endl;
701 auto rreqOutgoing = dynamicPtrCast<Rreq>(rreqIncoming->dupShared());
708 EV_WARN <<
"Dropping non-permissible RREQ" << endl;
Referenced by processDymoPacket().
◆ processRreqBackoffTimer()
◆ processRreqHolddownTimer()
366 EV_DETAIL <<
"Processing RREQ holddown timer" << endl;
367 const L3Address& target = message->getTarget();
Referenced by processSelfMessage().
◆ processRreqWaitRrepTimer()
301 EV_DETAIL <<
"Processing RREQ wait RREP timer" << endl;
302 const L3Address& target = message->getTarget();
Referenced by processSelfMessage().
◆ processRteMsg()
| void inet::dymo::Dymo::processRteMsg |
( |
Packet * |
packet, |
|
|
const Ptr< const RteMsg > & |
rteMsg |
|
) |
| |
|
private |
515 if (dynamicPtrCast<const Rreq>(rteMsg))
516 updateRoutes(packet, rteMsg, rteMsg->getOriginatorNode());
517 else if (dynamicPtrCast<const Rrep>(rteMsg))
522 int count = rteMsg->getAddedNodeArraySize();
523 for (
int i = 0; i <
count; i++)
545 constPtrCast<RteMsg>(rteMsg)->setHopLimit(rteMsg->getHopLimit() - 1);
547 constPtrCast<RteMsg>(rteMsg)->setHopCount(rteMsg->getHopCount() + 1);
Referenced by processRrep(), and processRreq().
◆ processSelfMessage()
| void inet::dymo::Dymo::processSelfMessage |
( |
cMessage * |
message | ) |
|
|
private |
150 else if (
auto waitRrepTimer =
dynamic_cast<RreqWaitRrepTimer *
>(message))
152 else if (
auto backoffTimer =
dynamic_cast<RreqBackoffTimer *
>(message))
154 else if (
auto holddownTimer =
dynamic_cast<RreqHolddownTimer *
>(message))
156 else if (
auto jitterTimer =
dynamic_cast<PacketJitterTimer *
>(message))
159 throw cRuntimeError(
"Unknown self message");
Referenced by handleMessageWhenUp().
◆ processUdpPacket()
| void inet::dymo::Dymo::processUdpPacket |
( |
Packet * |
packet | ) |
|
|
private |
◆ receiveSignal()
| void inet::dymo::Dymo::receiveSignal |
( |
cComponent * |
source, |
|
|
simsignal_t |
signalID, |
|
|
cObject * |
obj, |
|
|
cObject * |
details |
|
) |
| |
|
overrideprivatevirtual |
1453 Enter_Method(
"%s", cComponent::getSignalName(signalID));
1456 EV_WARN <<
"Received link break" << endl;
1457 Packet *datagram = check_and_cast<Packet *>(obj);
1459 if (networkHeader !=
nullptr) {
1460 const L3Address& destination = networkHeader->getDestinationAddress();
1461 if (destination.getAddressType() ==
addressType) {
1462 IRoute *route =
routingTable->findBestMatchingRoute(destination);
1464 const L3Address& nextHop = route->getNextHopAsGeneric();
◆ reinjectDelayedDatagram()
| void inet::dymo::Dymo::reinjectDelayedDatagram |
( |
Packet * |
datagram | ) |
|
|
private |
232 EV_INFO <<
"Sending queued datagram: source = " << networkHeader->getSourceAddress() <<
", destination = " << networkHeader->getDestinationAddress() << endl;
233 networkProtocol->reinjectQueuedDatagram(
const_cast<const Packet *
>(datagram));
Referenced by completeRouteDiscovery().
◆ retryRouteDiscovery()
| void inet::dymo::Dymo::retryRouteDiscovery |
( |
const L3Address & |
target, |
|
|
int |
retryCount |
|
) |
| |
|
private |
◆ scheduleExpungeTimer()
| void inet::dymo::Dymo::scheduleExpungeTimer |
( |
| ) |
|
|
private |
◆ scheduleJitterTimerPacket()
| void inet::dymo::Dymo::scheduleJitterTimerPacket |
( |
cPacket * |
packet, |
|
|
double |
delay |
|
) |
| |
|
private |
389 PacketJitterTimer *message =
new PacketJitterTimer(
"PacketJitterTimer");
390 message->setJitteredPacket(packet);
391 scheduleAfter(delay, message);
Referenced by sendDymoPacket().
◆ scheduleRreqBackoffTimer()
◆ scheduleRreqHolddownTimer()
◆ scheduleRreqWaitRrepTimer()
◆ sendDymoPacket()
423 auto className = packet->getClassName();
424 Packet *udpPacket =
new Packet(!strncmp(
"inet::", className, 6) ? className + 6 : className);
425 auto udpHeader = makeShared<UdpHeader>();
432 if (networkInterface)
433 udpPacket->addTag<
InterfaceReq>()->setInterfaceId(networkInterface->getInterfaceId());
434 auto addresses = udpPacket->addTag<L3AddressReq>();
436 addresses->setDestAddress(nextHop);
438 udpPacket->addTag<
HopLimitReq>()->setHopLimit(255);
439 udpPacket->insertAtFront(udpHeader);
440 udpPacket->insertAtBack(packet);
Referenced by sendRerr(), sendRrep(), and sendRreq().
◆ sendRerr()
| void inet::dymo::Dymo::sendRerr |
( |
const Ptr< Rerr > & |
rerr | ) |
|
|
private |
◆ sendRerrForBrokenLink()
896 EV_DETAIL <<
"Sending RERR for broken link: nextHop = " << nextHop << endl;
924 std::vector<L3Address> unreachableAddresses;
925 for (
int i = 0; i <
routingTable->getNumRoutes(); i++) {
927 if (route->getSource() ==
this) {
928 DymoRouteData *routeData = check_and_cast<DymoRouteData *>(route->getProtocolData());
930 if (routeState !=
BROKEN && route->getInterface() == networkInterface && route->getNextHopAsGeneric() == nextHop) {
931 EV_DETAIL <<
"Marking route as broken: " << route << endl;
934 routeData->setBroken(
true);
935 unreachableAddresses.push_back(route->getDestinationAsGeneric());
939 if (unreachableAddresses.size() == 0)
940 EV_DETAIL <<
"No unreachable address found" << endl;
Referenced by receiveSignal().
◆ sendRerrForUndeliverablePacket()
| void inet::dymo::Dymo::sendRerrForUndeliverablePacket |
( |
const L3Address & |
destination | ) |
|
|
private |
873 EV_DETAIL <<
"Sending RERR for undeliverable packet: destination = " << destination << endl;
889 std::vector<L3Address> unreachableAddresses;
890 unreachableAddresses.push_back(destination);
◆ sendRrep() [1/2]
| void inet::dymo::Dymo::sendRrep |
( |
const Ptr< Rrep > & |
rrep | ) |
|
|
private |
768 const L3Address& target = rrep->getTargetNode().getAddress();
769 const L3Address& originator = rrep->getOriginatorNode().getAddress();
771 EV_DETAIL <<
"Sending broadcast RREP: originator = " << originator <<
", target = " << target << endl;
Referenced by processRrep(), and processRreq().
◆ sendRrep() [2/2]
| void inet::dymo::Dymo::sendRrep |
( |
const Ptr< Rrep > & |
rrep, |
|
|
IRoute * |
route |
|
) |
| |
|
private |
777 const L3Address& target = rrep->getTargetNode().getAddress();
778 const L3Address& originator = rrep->getOriginatorNode().getAddress();
779 const L3Address& nextHop = route->getNextHopAsGeneric();
781 EV_DETAIL <<
"Sending unicast RREP: originator = " << originator <<
", target = " << target <<
", nextHop = " << nextHop << endl;
◆ sendRreq()
| void inet::dymo::Dymo::sendRreq |
( |
const Ptr< Rreq > & |
rreq | ) |
|
|
private |
658 const L3Address& target = rreq->getTargetNode().getAddress();
659 const L3Address& originator = rreq->getOriginatorNode().getAddress();
661 EV_DETAIL <<
"Sending RREQ: originator = " << originator <<
", target = " << target << endl;
Referenced by processRreq(), retryRouteDiscovery(), and startRouteDiscovery().
◆ sendUdpPacket()
| void inet::dymo::Dymo::sendUdpPacket |
( |
cPacket * |
packet | ) |
|
|
private |
◆ startRouteDiscovery()
| void inet::dymo::Dymo::startRouteDiscovery |
( |
const L3Address & |
target | ) |
|
|
private |
◆ updateRoute()
1139 DymoRouteData *routeData = check_and_cast<DymoRouteData *>(route->getProtocolData());
1141 const L3Address& address = addressBlock.getAddress();
1142 route->setDestination(address);
1144 route->setPrefixLength(addressBlock.getPrefixLength());
1151 L3Address srcAddr = packet->getTag<
L3AddressInd>()->getSrcAddress();
1152 route->setNextHop(srcAddr);
1154 NetworkInterface *networkInterface =
interfaceTable->getInterfaceById((packet->getTag<InterfaceInd>())->getInterfaceId());
1155 if (networkInterface)
1156 route->setInterface(networkInterface);
1158 routeData->setBroken(
false);
1161 if (addressBlock.getHasMetricType())
1162 routeData->setMetricType(addressBlock.getMetricType());
1166 route->setMetric(addressBlock.getMetric());
1168 routeData->setLastUsed(simTime());
1170 if (addressBlock.getHasValidityTime())
1171 routeData->setExpirationTime(simTime() + addressBlock.getValidityTime());
1173 routeData->setExpirationTime(SimTime::getMaxTime());
Referenced by createRoute(), and updateRoutes().
◆ updateRoutes()
| void inet::dymo::Dymo::updateRoutes |
( |
Packet * |
packet, |
|
|
const Ptr< const RteMsg > & |
rteMsg, |
|
|
const AddressBlock & |
addressBlock |
|
) |
| |
|
private |
1075 const L3Address& address = addressBlock.getAddress();
1083 IRoute *route =
nullptr;
1084 for (
int i = 0; i <
routingTable->getNumRoutes(); i++) {
1086 if (routeCandidate->getSource() ==
this) {
1087 DymoRouteData *routeData = check_and_cast<DymoRouteData *>(routeCandidate->getProtocolData());
1088 if (routeCandidate->getDestinationAsGeneric() == address && routeData->getMetricType() == addressBlock.getMetricType()) {
1089 route = routeCandidate;
1099 IRoute *route =
createRoute(packet, rteMsg, addressBlock);
1100 EV_DETAIL <<
"Adding new route: " << route << endl;
1104 DymoRouteData *routeData = check_and_cast<DymoRouteData *>(route->getProtocolData());
1110 if ((addressBlock.getSequenceNumber() > routeData->getSequenceNumber()) ||
1111 (addressBlock.getSequenceNumber() == routeData->getSequenceNumber() && addressBlock.getMetric() < route->getMetric()) ||
1112 (routeData->getBroken() &&
isLoopFree(rteMsg, route)))
1117 EV_DETAIL <<
"Updating existing route: " << route << endl;
1119 EV_DETAIL <<
"Route updated: " << route << endl;
Referenced by processRteMsg().
◆ activeInterval
| double inet::dymo::Dymo::activeInterval |
|
private |
◆ addressType
◆ appendInformation
| bool inet::dymo::Dymo::appendInformation |
|
private |
◆ bufferSizeBytes
| int inet::dymo::Dymo::bufferSizeBytes |
|
private |
◆ bufferSizePackets
| int inet::dymo::Dymo::bufferSizePackets |
|
private |
◆ clientAddressAndPrefixLengthPairs
| std::vector<std::pair<L3Address, int> > inet::dymo::Dymo::clientAddressAndPrefixLengthPairs |
|
private |
◆ clientAddresses
| const char* inet::dymo::Dymo::clientAddresses |
|
private |
◆ discoveryAttemptsMax
| int inet::dymo::Dymo::discoveryAttemptsMax |
|
private |
◆ expungeTimer
| cMessage* inet::dymo::Dymo::expungeTimer |
|
private |
◆ host
| cModule* inet::dymo::Dymo::host |
|
private |
◆ interfaces
| const char* inet::dymo::Dymo::interfaces |
|
private |
◆ interfaceTable
◆ maxHopCount
| int inet::dymo::Dymo::maxHopCount |
|
private |
◆ maxHopLimit
| int inet::dymo::Dymo::maxHopLimit |
|
private |
◆ maxIdleTime
| double inet::dymo::Dymo::maxIdleTime |
|
private |
◆ maxJitter
| simtime_t inet::dymo::Dymo::maxJitter |
|
private |
◆ maxSequenceNumberLifetime
| double inet::dymo::Dymo::maxSequenceNumberLifetime |
|
private |
◆ minHopLimit
| int inet::dymo::Dymo::minHopLimit |
|
private |
◆ networkProtocol
◆ packetJitterTimers
◆ routeRREQWaitTime
| double inet::dymo::Dymo::routeRREQWaitTime |
|
private |
◆ routingTable
Referenced by createRoute(), ensureRouteForDatagram(), expungeRoutes(), getNextExpungeTime(), getSelfAddress(), initialize(), isClientAddress(), processRerr(), processRrep(), processRreq(), receiveSignal(), sendRerrForBrokenLink(), and updateRoutes().
◆ rreqHolddownTime
| double inet::dymo::Dymo::rreqHolddownTime |
|
private |
◆ sendIntermediateRREP
| bool inet::dymo::Dymo::sendIntermediateRREP |
|
private |
◆ sequenceNumber
◆ targetAddressToDelayedPackets
| std::multimap<L3Address, Packet *> inet::dymo::Dymo::targetAddressToDelayedPackets |
|
private |
◆ targetAddressToRREQTimer
◆ targetAddressToSequenceNumber
◆ useMulticastRREP
| bool inet::dymo::Dymo::useMulticastRREP |
|
private |
The documentation for this class was generated from the following files:
double activeInterval
Definition: Dymo.h:51
#define DYMO_UDP_PORT
Definition: DymoDefs.h:16
void processJitterTimerPacket(PacketJitterTimer *msg)
Definition: Dymo.cc:396
std::map< L3Address, DymoSequenceNumber > targetAddressToSequenceNumber
Definition: Dymo.h:78
void scheduleJitterTimerPacket(cPacket *packet, double delay)
Definition: Dymo.cc:383
@ EXPIRED
Definition: DymoDefs.h:23
void sendDymoPacket(const Ptr< DymoPacket > &packet, const NetworkInterface *networkInterface, const L3Address &nextHop, double delay)
Definition: Dymo.cc:419
void processMessage(cMessage *message)
Definition: Dymo.cc:162
RreqHolddownTimer * createRreqHolddownTimer(const L3Address &target)
Definition: Dymo.cc:350
virtual int getMaxPrefixLength() const =0
void processExpungeTimer()
Definition: Dymo.cc:1199
L3Address getSelfAddress()
Definition: Dymo.cc:1309
@ ACTIVE
Definition: DymoDefs.h:21
simsignal_t linkBrokenSignal
Definition: Simsignals.cc:22
int bufferSizePackets
Definition: Dymo.h:59
cMessage * expungeTimer
Definition: Dymo.h:76
void cancelRouteDiscovery(const L3Address &target)
Definition: Dymo.cc:201
int count(const std::vector< T > &v, const Tk &a)
Definition: stlutils.h:54
void cancelRreqTimer(const L3Address &target)
Definition: Dymo.cc:260
@ IDLE
Definition: DymoDefs.h:22
void completeRouteDiscovery(const L3Address &target)
Definition: Dymo.cc:190
cModule * getContainingNode(const cModule *from)
Find the node containing the given module.
Definition: ModuleAccess.cc:40
virtual void initialize(int stage) override
Definition: OperationalMixinImpl.h:26
void sendUdpPacket(cPacket *packet)
Definition: Dymo.cc:378
removed InterfaceReq
Definition: IUdp-gates.txt:11
bool hasDelayedDatagrams(const L3Address &target)
Definition: Dymo.cc:251
void updateRoutes(Packet *packet, const Ptr< const RteMsg > &rteMsg, const AddressBlock &addressBlock)
Definition: Dymo.cc:1073
bool hasOngoingRouteDiscovery(const L3Address &target)
Definition: Dymo.cc:212
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down DispatchProtocolReq
Definition: IUdp-gates.txt:25
int maxHopCount
Definition: Dymo.h:56
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd L3AddressInd
Definition: IUdp-gates.txt:20
void processRreqWaitRrepTimer(RreqWaitRrepTimer *message)
Definition: Dymo.cc:299
@ CRC_DISABLED
Definition: CrcMode_m.h:56
virtual L3Address getLinkLocalManetRoutersMulticastAddress() const =0
std::vector< std::pair< L3Address, int > > clientAddressAndPrefixLengthPairs
Definition: Dymo.h:82
double maxSequenceNumberLifetime
Definition: Dymo.h:53
void startRouteDiscovery(const L3Address &target)
Definition: Dymo.cc:174
bool isClientAddress(const L3Address &address)
Definition: Dymo.cc:1314
void sendRreq(const Ptr< Rreq > &rreq)
Definition: Dymo.cc:656
double maxIdleTime
Definition: Dymo.h:52
@ HOP_COUNT
Definition: Dymo_m.h:75
@ DYMO
managed by DYMO routing
Definition: IRoute.h:40
void reinjectDelayedDatagram(Packet *datagram)
Definition: Dymo.cc:229
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down PacketProtocolTag
Definition: IUdp-gates.txt:25
void sendRerr(const Ptr< Rerr > &rerr)
Definition: Dymo.cc:864
const Ptr< const NetworkHeaderBase > findNetworkProtocolHeader(Packet *packet)
Definition: L3Tools.cc:37
void processRreq(Packet *packet, const Ptr< const Rreq > &rreq)
Definition: Dymo.cc:665
b computeRrepLength(const Ptr< Rrep > &rrep)
Definition: Dymo.cc:829
void retryRouteDiscovery(const L3Address &target, int retryCount)
Definition: Dymo.cc:182
void eraseDelayedDatagrams(const L3Address &target)
Definition: Dymo.cc:243
void processRrep(Packet *packet, const Ptr< const Rrep > &rrep)
Definition: Dymo.cc:785
void scheduleRreqBackoffTimer(RreqBackoffTimer *message)
Definition: Dymo.cc:327
RreqWaitRrepTimer * createRreqWaitRrepTimer(const L3Address &target, int retryCount)
Definition: Dymo.cc:284
static const Protocol manet
Definition: Protocol.h:99
const Ptr< Rerr > createRerr(std::vector< L3Address > &addresses)
Definition: Dymo.cc:838
const Ptr< Rreq > createRreq(const L3Address &target, int retryCount)
Definition: Dymo.cc:600
simtime_t computeRreqBackoffTime(int retryCount)
Definition: Dymo.cc:341
DymoRouteState getRouteState(DymoRouteData *routeData)
Definition: Dymo.cc:1268
const Ptr< const NetworkHeaderBase > getNetworkProtocolHeader(Packet *packet)
Definition: L3Tools.cc:43
std::set< PacketJitterTimer * > packetJitterTimers
Definition: Dymo.h:81
ModuleRefByPar< IRoutingTable > routingTable
Definition: Dymo.h:72
void eraseRreqTimer(const L3Address &target)
Definition: Dymo.cc:274
@ BROKEN
Definition: DymoDefs.h:24
ModuleRefByPar< IInterfaceTable > interfaceTable
Definition: Dymo.h:71
@ QUEUE
queues the datagram for later re-injection (e.g. when route discovery completes)
Definition: INetfilter.h:42
bool useMulticastRREP
Definition: Dymo.h:49
uint32_t DymoSequenceNumber
Definition: DymoDefs.h:18
int maxHopLimit
Definition: Dymo.h:66
double routeRREQWaitTime
Definition: Dymo.h:54
bool isLoopFree(const Ptr< const RteMsg > &rteMsg, IRoute *route)
Definition: Dymo.cc:1189
const char * interfaces
Definition: Dymo.h:50
removed HopLimitReq
Definition: IUdp-gates.txt:11
void sendRerrForBrokenLink(const NetworkInterface *networkInterface, const L3Address &nextHop)
Definition: Dymo.cc:894
const Ptr< Rrep > createRrep(const Ptr< const RteMsg > &rteMsg)
Definition: Dymo.cc:720
void processRerr(Packet *packet, const Ptr< const Rerr > &rerr)
Definition: Dymo.cc:945
Result ensureRouteForDatagram(Packet *datagram)
Definition: Dymo.cc:1376
void configureInterfaces()
Definition: Dymo.cc:1291
#define NaN
Definition: INETMath.h:91
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
void addNode(const Ptr< RteMsg > &rteMsg, AddressBlock &addressBlock)
Definition: Dymo.cc:1349
DymoRouteState
Definition: DymoDefs.h:20
std::multimap< L3Address, Packet * > targetAddressToDelayedPackets
Definition: Dymo.h:80
void processDymoPacket(Packet *packet, const Ptr< const DymoPacket > &dymoPacket)
Definition: Dymo.cc:444
bool sendIntermediateRREP
Definition: Dymo.h:64
value< int64_t, units::b > b
Definition: Units.h:1241
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
double rreqHolddownTime
Definition: Dymo.h:55
void processRteMsg(Packet *packet, const Ptr< const RteMsg > &rteMsg)
Definition: Dymo.cc:510
@ TIMED
Definition: DymoDefs.h:25
std::map< L3Address, RreqTimer * > targetAddressToRREQTimer
Definition: Dymo.h:79
ModuleRefByPar< INetfilter > networkProtocol
Definition: Dymo.h:73
void processRreqBackoffTimer(RreqBackoffTimer *message)
Definition: Dymo.cc:334
void scheduleExpungeTimer()
Definition: Dymo.cc:1206
#define Enter_Method(...)
Definition: SelfDoc.h:71
IL3AddressType * addressType
Definition: Dymo.h:70
void incrementSequenceNumber()
Definition: Dymo.cc:1360
simtime_t maxJitter
Definition: Dymo.h:63
b computeRerrLength(const Ptr< Rerr > &rerr)
Definition: Dymo.cc:1022
RreqBackoffTimer * createRreqBackoffTimer(const L3Address &target, int retryCount)
Definition: Dymo.cc:319
void addSelfNode(const Ptr< RteMsg > &rteMsg)
Definition: Dymo.cc:1332
void updateRoute(Packet *packet, const Ptr< const RteMsg > &rteMsg, const AddressBlock &addressBlock, IRoute *route)
Definition: Dymo.cc:1136
@ ACCEPT
allows the datagram to pass to the next hook
Definition: INetfilter.h:40
bool appendInformation
Definition: Dymo.h:58
IL3AddressType * getAddressType() const
Definition: L3Address.cc:59
void delayDatagram(Packet *datagram)
Definition: Dymo.cc:221
void processSelfMessage(cMessage *message)
Definition: Dymo.cc:146
int minHopLimit
Definition: Dymo.h:65
IRoute * createRoute(Packet *packet, const Ptr< const RteMsg > &rteMsg, const AddressBlock &addressBlock)
Definition: Dymo.cc:1126
int discoveryAttemptsMax
Definition: Dymo.h:57
virtual const Protocol * getNetworkProtocol() const =0
void processUdpPacket(Packet *packet)
Definition: Dymo.cc:408
int bufferSizeBytes
Definition: Dymo.h:60
void registerProtocol(const Protocol &protocol, cGate *gate, ServicePrimitive servicePrimitive)
Registers a protocol primitive (PDU processing) at the given gate.
Definition: IProtocolRegistrationListener.cc:83
void scheduleRreqHolddownTimer(RreqHolddownTimer *message)
Definition: Dymo.cc:357
void expungeRoutes()
Definition: Dymo.cc:1225
void dropDelayedDatagram(Packet *datagram)
Definition: Dymo.cc:236
cModule * host
Definition: Dymo.h:69
void sendRrep(const Ptr< Rrep > &rrep)
Definition: Dymo.cc:766
void scheduleRreqWaitRrepTimer(RreqWaitRrepTimer *message)
Definition: Dymo.cc:292
void deleteRreqTimer(const L3Address &target)
Definition: Dymo.cc:267
b computeRreqLength(const Ptr< Rreq > &rreq)
Definition: Dymo.cc:711
bool permissibleRteMsg(Packet *packet, const Ptr< const RteMsg > &rteMsg)
Definition: Dymo.cc:461
bool containsKey(const std::map< K, V, _C > &m, const Tk &a)
Definition: stlutils.h:80
INET_API InitStage INITSTAGE_ROUTING_PROTOCOLS
Initialization of routing protocols.
const char * clientAddresses
Definition: Dymo.h:48
b computeRteMsgLength(const Ptr< RteMsg > &rteMsg)
Definition: Dymo.cc:550
void processRreqHolddownTimer(RreqHolddownTimer *message)
Definition: Dymo.cc:364
simtime_t getNextExpungeTime()
Definition: Dymo.cc:1250
DymoSequenceNumber sequenceNumber
Definition: Dymo.h:77