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

#include <L3NetworkConfiguratorBase.h>

Inheritance diagram for inet::L3NetworkConfiguratorBase:
inet::L3AddressResolver inet::Ipv4NetworkConfigurator inet::NextHopNetworkConfigurator

Classes

class  InterfaceInfo
 Represents an interface in the network. More...
 
class  InterfaceMatcher
 
class  Link
 Represents a connection (wired or wireless) in the network. More...
 
class  LinkInfo
 Represents a "link" in the network. More...
 
class  Matcher
 
class  Node
 Represents a node in the network. More...
 
class  Topology
 Represents the network topology. More...
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void handleMessage (cMessage *msg) override
 
virtual void extractTopology (Topology &topology)
 Extracts network topology by walking through the module hierarchy. More...
 
virtual void extractWiredNeighbors (Topology &topology, Topology::Link *linkOut, LinkInfo *linkInfo, std::map< int, NetworkInterface * > &interfacesSeen, std::vector< Node * > &nodesVisited)
 
virtual void extractWirelessNeighbors (Topology &topology, const char *wirelessId, LinkInfo *linkInfo, std::map< int, NetworkInterface * > &interfacesSeen, std::vector< Node * > &nodesVisited)
 
virtual void extractDeviceNeighbors (Topology &topology, Node *node, LinkInfo *linkInfo, std::map< int, NetworkInterface * > &interfacesSeen, std::vector< Node * > &deviceNodesVisited)
 
virtual InterfaceInfodetermineGatewayForLink (LinkInfo *linkInfo)
 If this link has exactly one node that connects to other links as well, we can assume it is a "gateway" and return that (we'll use it in routing); otherwise return nullptr. More...
 
virtual double computeNodeWeight (Node *node, const char *metric, cXMLElement *parameters)
 
virtual double computeLinkWeight (Link *link, const char *metric, cXMLElement *parameters)
 
virtual double computeWiredLinkWeight (Link *link, const char *metric, cXMLElement *parameters)
 
virtual double computeWirelessLinkWeight (Link *link, const char *metric, cXMLElement *parameters)
 
virtual bool isBridgeNode (Node *node)
 
virtual bool isWirelessInterface (NetworkInterface *networkInterface)
 
virtual std::string getWirelessId (NetworkInterface *networkInterface)
 If this function returns the same string for two wireless interfaces, they will be regarded as being in the same wireless network. More...
 
virtual InterfaceInfocreateInterfaceInfo (Topology &topology, Node *node, LinkInfo *linkInfo, NetworkInterface *networkInterface)
 
virtual Topology::LinkfindLinkOut (Node *node, int gateId)
 
virtual InterfaceInfofindInterfaceInfo (Node *node, NetworkInterface *networkInterface)
 
virtual IInterfaceTablefindInterfaceTable (Node *node)
 
virtual IRoutingTablefindRoutingTable (Node *node)
 
virtual void dumpTopology (Topology &topology)
 
- Protected Member Functions inherited from inet::L3AddressResolver
virtual bool getIpv4AddressFrom (L3Address &retAddr, IInterfaceTable *ift, bool netmask)
 
virtual bool getIpv6AddressFrom (L3Address &retAddr, IInterfaceTable *ift, bool netmask)
 
virtual bool getMacAddressFrom (L3Address &retAddr, IInterfaceTable *ift, bool netmask)
 
virtual bool getModulePathAddressFrom (L3Address &retAddr, IInterfaceTable *ift, bool netmask)
 
virtual bool getModuleIdAddressFrom (L3Address &retAddr, IInterfaceTable *ift, bool netmask)
 
virtual bool getInterfaceIpv4Address (L3Address &ret, NetworkInterface *ie, bool mask)
 
virtual bool getInterfaceIpv6Address (L3Address &ret, NetworkInterface *ie, bool mask)
 
virtual bool getInterfaceMacAddress (L3Address &ret, NetworkInterface *ie, bool mask)
 
virtual bool getInterfaceModulePathAddress (L3Address &ret, NetworkInterface *ie, bool mask)
 
virtual bool getInterfaceModuleIdAddress (L3Address &ret, NetworkInterface *ie, bool mask)
 
virtual void doCollectNetworkNodes (cModule *parent, std::vector< cModule * > &result)
 

Protected Attributes

double minLinkWeight = NaN
 
bool configureIsolatedNetworksSeparatly = false
 
cXMLElement * configuration = nullptr
 

Additional Inherited Members

- Public Types inherited from inet::L3AddressResolver
enum  {
  ADDR_IPv4 = 1, ADDR_IPv6 = 2, ADDR_MAC = 4, ADDR_MODULEPATH = 8,
  ADDR_MODULEID = 16, ADDR_MASK = 32
}
 
- Public Member Functions inherited from inet::L3AddressResolver
 L3AddressResolver ()
 
virtual ~L3AddressResolver ()
 
virtual L3Address resolve (const char *str, int addrType=DEFAULT_ADDR_TYPE)
 Accepts dotted decimal notation ("127.0.0.1"), module name of the host or router ("host[2]"), and empty string (""). More...
 
virtual std::vector< L3Addressresolve (std::vector< std::string > strs, int addrType=DEFAULT_ADDR_TYPE)
 Utility function: Calls resolve() for each item in the string vector, and returns the result in an address vector. More...
 
virtual bool tryResolve (const char *str, L3Address &result, int addrType=DEFAULT_ADDR_TYPE)
 Similar to resolve(), but returns false (instead of throwing an error) if the address cannot be resolved because the given host (or interface) doesn't have an address assigned yet. More...
 
bool tryParse (L3Address &result, const char *addr, int addrType=DEFAULT_ADDR_TYPE)
 
virtual L3Address addressOf (cModule *host, int addrType=DEFAULT_ADDR_TYPE)
 Returns Ipv4 or Ipv6 address of the given host or router. More...
 
virtual L3Address addressOf (cModule *host, const char *ifname, int addrType=DEFAULT_ADDR_TYPE)
 Similar to addressOf(), but only looks at the given interface. More...
 
virtual L3Address addressOf (cModule *host, cModule *destmod, int addrType=DEFAULT_ADDR_TYPE)
 Returns Ipv4 or Ipv6 address of the given host or router. More...
 
virtual L3Address routerIdOf (cModule *host)
 Returns the router Id of the given router. More...
 
virtual L3Address getAddressFrom (IInterfaceTable *ift, int addrType=DEFAULT_ADDR_TYPE)
 Returns the Ipv4 or Ipv6 address of the given host or router, given its IInterfaceTable module. More...
 
virtual L3Address getAddressFrom (NetworkInterface *ie, int addrType=DEFAULT_ADDR_TYPE)
 Returns the Ipv4 or Ipv6 address of the given interface (of a host or router). More...
 
virtual IInterfaceTableinterfaceTableOf (cModule *host)
 The function tries to look up the IInterfaceTable module as submodule "interfaceTable" or "networkLayer.interfaceTable" within the host/router module. More...
 
virtual IIpv4RoutingTablegetIpv4RoutingTableOf (cModule *host)
 The function tries to look up the IIpv4RoutingTable module as submodule "routingTable" or "networkLayer.routingTable" within the host/router module. More...
 
virtual Ipv6RoutingTablegetIpv6RoutingTableOf (cModule *host)
 The function tries to look up the Ipv6RoutingTable module as submodule "routingTable6" or "networkLayer.routingTable6" within the host/router module. More...
 
virtual IInterfaceTablefindInterfaceTableOf (cModule *host)
 Like interfaceTableOf(), but doesn't throw error if not found. More...
 
virtual IIpv4RoutingTablefindIpv4RoutingTableOf (cModule *host)
 Like routingTableOf(), but doesn't throw error if not found. More...
 
virtual Ipv6RoutingTablefindIpv6RoutingTableOf (cModule *host)
 Like interfaceTableOf(), but doesn't throw error if not found. More...
 
virtual NextHopRoutingTablefindNextHopRoutingTableOf (cModule *host)
 Like interfaceTableOf(), but doesn't throw error if not found. More...
 
virtual std::vector< cModule * > collectNetworkNodes ()
 Collect modules that represent network nodes, as denoted by the @networkNode(true) annotation. More...
 
virtual cModule * findHostWithAddress (const L3Address &addr)
 Find the Host with the specified address. More...
 
virtual NetworkInterfacefindInterfaceWithMacAddress (const MacAddress &addr)
 Find the interface with the specified MAC address. More...
 
virtual cModule * findHostWithMacAddress (const MacAddress &addr)
 Find the host with the specified MAC address. More...
 

Member Function Documentation

◆ computeLinkWeight()

double inet::L3NetworkConfiguratorBase::computeLinkWeight ( Link link,
const char *  metric,
cXMLElement *  parameters 
)
protectedvirtual
320 {
321  if ((link->sourceInterfaceInfo && isWirelessInterface(link->sourceInterfaceInfo->networkInterface)) ||
322  (link->destinationInterfaceInfo && isWirelessInterface(link->destinationInterfaceInfo->networkInterface)))
323  return computeWirelessLinkWeight(link, metric, parameters);
324  else
325  return computeWiredLinkWeight(link, metric, parameters);
326 }

Referenced by inet::Ipv4NetworkConfigurator::addStaticRoutes().

◆ computeNodeWeight()

double inet::L3NetworkConfiguratorBase::computeNodeWeight ( Node node,
const char *  metric,
cXMLElement *  parameters 
)
protectedvirtual
307 {
308  const char *costAttribute = parameters->getAttribute("cost");
309  if (costAttribute != nullptr)
310  return parseCostAttribute(costAttribute);
311  else {
312  if (node->routingTable && !node->routingTable->isForwardingEnabled())
313  return INFINITY;
314  else
315  return 0;
316  }
317 }

Referenced by inet::Ipv4NetworkConfigurator::addStaticRoutes().

◆ computeWiredLinkWeight()

double inet::L3NetworkConfiguratorBase::computeWiredLinkWeight ( Link link,
const char *  metric,
cXMLElement *  parameters 
)
protectedvirtual
329 {
330  const char *costAttribute = parameters->getAttribute("cost");
331  if (costAttribute != nullptr)
332  return parseCostAttribute(costAttribute);
333  else {
334  Topology::Link *linkOut = static_cast<Topology::Link *>(static_cast<Topology::Link *>(link));
335  if (!strcmp(metric, "hopCount"))
336  return 1;
337  else if (!strcmp(metric, "delay")) {
338  cDatarateChannel *transmissionChannel = dynamic_cast<cDatarateChannel *>(linkOut->getLinkOutLocalGate()->findTransmissionChannel());
339  if (transmissionChannel != nullptr)
340  return transmissionChannel->getDelay().dbl();
341  else
342  return minLinkWeight;
343  }
344  else if (!strcmp(metric, "dataRate")) {
345  cChannel *transmissionChannel = linkOut->getLinkOutLocalGate()->findTransmissionChannel();
346  if (transmissionChannel != nullptr) {
347  double dataRate = transmissionChannel->getNominalDatarate();
348  return dataRate != 0 ? 1 / dataRate : minLinkWeight;
349  }
350  else
351  return minLinkWeight;
352  }
353  else if (!strcmp(metric, "errorRate")) {
354  cDatarateChannel *transmissionChannel = dynamic_cast<cDatarateChannel *>(linkOut->getLinkOutLocalGate()->findTransmissionChannel());
355  if (transmissionChannel != nullptr) {
356  InterfaceInfo *sourceInterfaceInfo = link->sourceInterfaceInfo;
357  double bitErrorRate = transmissionChannel->getBitErrorRate();
358  double packetErrorRate = 1.0 - pow(1.0 - bitErrorRate, sourceInterfaceInfo->networkInterface->getMtu());
359  return minLinkWeight - log(1 - packetErrorRate);
360  }
361  else
362  return minLinkWeight;
363  }
364  else
365  throw cRuntimeError("Unknown metric");
366  }
367 }

◆ computeWirelessLinkWeight()

double inet::L3NetworkConfiguratorBase::computeWirelessLinkWeight ( Link link,
const char *  metric,
cXMLElement *  parameters 
)
protectedvirtual
370 {
371  const char *costAttribute = parameters->getAttribute("cost");
372  if (costAttribute != nullptr)
373  return parseCostAttribute(costAttribute);
374  else {
375  if (!strcmp(metric, "hopCount"))
376  return 1;
377 #ifdef INET_WITH_PHYSICALLAYERWIRELESSCOMMON
378  else if (!strcmp(metric, "delay")) {
379  // compute the delay between the two interfaces using a dummy transmission
380  const InterfaceInfo *transmitterInterfaceInfo = link->sourceInterfaceInfo;
381  const InterfaceInfo *receiverInterfaceInfo = link->destinationInterfaceInfo;
382  cModule *transmitterInterfaceModule = transmitterInterfaceInfo->networkInterface;
383  cModule *receiverInterfaceModule = receiverInterfaceInfo->networkInterface;
384  const IRadio *transmitterRadio = check_and_cast<IRadio *>(transmitterInterfaceModule->getSubmodule("radio"));
385  const IRadio *receiverRadio = check_and_cast<IRadio *>(receiverInterfaceModule->getSubmodule("radio"));
386  const Packet *macFrame = new Packet();
387  const IRadioMedium *radioMedium = receiverRadio->getMedium();
388  const ITransmission *transmission = transmitterRadio->getTransmitter()->createTransmission(transmitterRadio, macFrame, simTime());
389  const IArrival *arrival = radioMedium->getPropagation()->computeArrival(transmission, receiverRadio->getAntenna()->getMobility());
390  return arrival->getStartPropagationTime().dbl();
391  }
392  else if (!strcmp(metric, "dataRate")) {
393  cModule *transmitterInterfaceModule = link->sourceInterfaceInfo->networkInterface;
394  IRadio *transmitterRadio = check_and_cast<IRadio *>(transmitterInterfaceModule->getSubmodule("radio"));
395  const FlatTransmitterBase *transmitter = dynamic_cast<const FlatTransmitterBase *>(transmitterRadio->getTransmitter());
396  double dataRate = transmitter ? transmitter->getBitrate().get() : 0;
397  return dataRate != 0 ? 1 / dataRate : minLinkWeight;
398  }
399  else if (!strcmp(metric, "errorRate")) {
400  // compute the packet error rate between the two interfaces using a dummy transmission
401  const InterfaceInfo *transmitterInterfaceInfo = link->sourceInterfaceInfo;
402  const InterfaceInfo *receiverInterfaceInfo = link->destinationInterfaceInfo;
403  cModule *transmitterInterfaceModule = transmitterInterfaceInfo->networkInterface;
404  cModule *receiverInterfaceModule = receiverInterfaceInfo->networkInterface;
405  const IRadio *transmitterRadio = check_and_cast<IRadio *>(transmitterInterfaceModule->getSubmodule("radio"));
406  const IRadio *receiverRadio = check_and_cast<IRadio *>(receiverInterfaceModule->getSubmodule("radio"));
407  const IRadioMedium *medium = receiverRadio->getMedium();
408  Packet *transmittedFrame = new Packet();
409  auto byteCountChunk = makeShared<ByteCountChunk>(B(transmitterInterfaceInfo->networkInterface->getMtu()));
410  transmittedFrame->insertAtBack(byteCountChunk);
411 
412  // KLUDGE
413  transmittedFrame->addTag<PacketProtocolTag>()->setProtocol(&Protocol::ackingMac);
414  check_and_cast<const Radio *>(transmitterRadio)->encapsulate(transmittedFrame);
415 
416  const ITransmission *transmission = transmitterRadio->getTransmitter()->createTransmission(transmitterRadio, transmittedFrame, simTime());
417  const IArrival *arrival = medium->getPropagation()->computeArrival(transmission, receiverRadio->getAntenna()->getMobility());
418  const IListening *listening = receiverRadio->getReceiver()->createListening(receiverRadio, arrival->getStartTime(), arrival->getEndTime(), arrival->getStartPosition(), arrival->getEndPosition());
419  const INoise *noise = medium->getBackgroundNoise() != nullptr ? medium->getBackgroundNoise()->computeNoise(listening) : nullptr;
420  const IReception *reception = medium->getAnalogModel()->computeReception(receiverRadio, transmission, arrival);
421  const IInterference *interference = new Interference(noise, new std::vector<const IReception *>());
422  const ISnir *snir = medium->getAnalogModel()->computeSNIR(reception, noise);
423  const IReceiver *receiver = receiverRadio->getReceiver();
424  bool isReceptionPossible = receiver->computeIsReceptionPossible(listening, reception, IRadioSignal::SIGNAL_PART_WHOLE);
425  double packetErrorRate;
426  if (!isReceptionPossible)
427  packetErrorRate = 1;
428  else {
429  const IReceptionDecision *receptionDecision = new ReceptionDecision(reception, IRadioSignal::SIGNAL_PART_WHOLE, isReceptionPossible, true, true);
430  const std::vector<const IReceptionDecision *> *receptionDecisions = new std::vector<const IReceptionDecision *> { receptionDecision };
431  const IReceptionResult *receptionResult = receiver->computeReceptionResult(listening, reception, interference, snir, receptionDecisions);
432  Packet *receivedFrame = const_cast<Packet *>(receptionResult->getPacket());
433  packetErrorRate = receivedFrame->getTag<ErrorRateInd>()->getPacketErrorRate();
434  delete receptionResult;
435  delete receptionDecision;
436  }
437  delete snir;
438  delete interference;
439  delete reception;
440  delete listening;
441  delete arrival;
442  delete transmission;
443  delete transmittedFrame;
444  // we want to have a maximum PER product along the path,
445  // but still minimize the hop count if the PER is negligible
446  return minLinkWeight - log(1 - packetErrorRate);
447  }
448 #endif
449  else
450  throw cRuntimeError("Unknown metric");
451  }
452 }

◆ createInterfaceInfo()

L3NetworkConfiguratorBase::InterfaceInfo * inet::L3NetworkConfiguratorBase::createInterfaceInfo ( Topology topology,
Node node,
LinkInfo linkInfo,
NetworkInterface networkInterface 
)
protectedvirtual

Reimplemented in inet::Ipv4NetworkConfigurator.

561 {
562  InterfaceInfo *interfaceInfo = new InterfaceInfo(node, linkInfo, ie);
563  node->interfaceInfos.push_back(interfaceInfo);
564  topology.interfaceInfos[ie->getId()] = interfaceInfo;
565  return interfaceInfo;
566 }

◆ determineGatewayForLink()

L3NetworkConfiguratorBase::InterfaceInfo * inet::L3NetworkConfiguratorBase::determineGatewayForLink ( LinkInfo linkInfo)
protectedvirtual

If this link has exactly one node that connects to other links as well, we can assume it is a "gateway" and return that (we'll use it in routing); otherwise return nullptr.

527 {
528  InterfaceInfo *gatewayInterfaceInfo = nullptr;
529  for (auto& interfaceInfo : linkInfo->interfaceInfos) {
530  IInterfaceTable *interfaceTable = interfaceInfo->node->interfaceTable;
531  IRoutingTable *routingTable = interfaceInfo->node->routingTable;
532 
533  // count how many (non-loopback) interfaces this node has
534  int numInterfaces = 0;
535  for (int i = 0; i < interfaceTable->getNumInterfaces(); i++)
536  if (!interfaceTable->getInterface(i)->isLoopback())
537  numInterfaces++;
538 
539  if (numInterfaces > 1 && routingTable && routingTable->isForwardingEnabled()) {
540  // node has at least one more interface, supposedly connecting to another link
541  if (gatewayInterfaceInfo)
542  return nullptr; // we already found one gateway, this makes it ambiguous! report "no gateway"
543  else
544  gatewayInterfaceInfo = interfaceInfo; // remember gateway
545  }
546  }
547  return gatewayInterfaceInfo;
548 }

◆ dumpTopology()

void inet::L3NetworkConfiguratorBase::dumpTopology ( Topology topology)
protectedvirtual
646 {
647  for (int i = 0; i < topology.getNumNodes(); i++) {
648  Node *node = (Node *)topology.getNode(i);
649  EV_INFO << "Node " << node->module->getFullPath() << endl;
650  for (int j = 0; j < node->getNumOutLinks(); j++) {
651  Topology::Link *linkOut = node->getLinkOut(j);
652  ASSERT(linkOut->getLinkOutLocalNode() == node);
653  Node *remoteNode = (Node *)linkOut->getLinkOutRemoteNode();
654  EV_INFO << " -> " << remoteNode->module->getFullPath() << endl;
655  }
656  for (int j = 0; j < node->getNumInLinks(); j++) {
657  Topology::Link *linkIn = node->getLinkIn(j);
658  ASSERT(linkIn->getLinkInLocalNode() == node);
659  Node *remoteNode = (Node *)linkIn->getLinkInRemoteNode();
660  EV_INFO << " <- " << remoteNode->module->getFullPath() << endl;
661  }
662  }
663 }

Referenced by inet::Ipv4NetworkConfigurator::dumpConfiguration(), and inet::NextHopNetworkConfigurator::initialize().

◆ extractDeviceNeighbors()

void inet::L3NetworkConfiguratorBase::extractDeviceNeighbors ( Topology topology,
Node node,
LinkInfo linkInfo,
std::map< int, NetworkInterface * > &  interfacesSeen,
std::vector< Node * > &  deviceNodesVisited 
)
protectedvirtual
235 {
236  deviceNodesVisited.push_back(node);
237  IInterfaceTable *interfaceTable = node->interfaceTable;
238  if (interfaceTable) {
239  // switch and access point
240  for (int i = 0; i < interfaceTable->getNumInterfaces(); i++) {
241  NetworkInterface *networkInterface = interfaceTable->getInterface(i);
242  if (!networkInterface->isLoopback() && !containsKey(interfacesSeen, networkInterface->getId())) {
243  if (isWirelessInterface(networkInterface))
244  extractWirelessNeighbors(topology, getWirelessId(networkInterface).c_str(), linkInfo, interfacesSeen, deviceNodesVisited);
245  else {
246  Topology::Link *linkOut = findLinkOut(node, networkInterface->getNodeOutputGateId());
247  if (linkOut)
248  extractWiredNeighbors(topology, linkOut, linkInfo, interfacesSeen, deviceNodesVisited);
249  }
250  }
251  }
252  }
253  else {
254  // hub and bus
255  for (int i = 0; i < node->getNumOutLinks(); i++) {
256  Topology::Link *linkOut = node->getLinkOut(i);
257  extractWiredNeighbors(topology, linkOut, linkInfo, interfacesSeen, deviceNodesVisited);
258  }
259  }
260 }

◆ extractTopology()

void inet::L3NetworkConfiguratorBase::extractTopology ( Topology topology)
protectedvirtual

Extracts network topology by walking through the module hierarchy.

Creates vertices from modules having @networkNode property. Creates edges from connections (wired and wireless) between network interfaces.

64 {
65  // extract topology
66  topology.extractByProperty("networkNode");
67  EV_DEBUG << "Topology found " << topology.getNumNodes() << " nodes\n";
68 
69  // print isolated networks information
70  std::map<int, std::vector<Node *>> isolatedNetworks;
71  for (int i = 0; i < topology.getNumNodes(); i++) {
72  Node *node = (Node *)topology.getNode(i);
73  int networkId = node->getNetworkId();
74  auto networkNodes = isolatedNetworks.find(networkId);
75  if (networkNodes == isolatedNetworks.end()) {
76  std::vector<Node *> collection = { node };
77  isolatedNetworks[networkId] = collection;
78  }
79  else
80  networkNodes->second.push_back(node);
81  }
82  if (isolatedNetworks.size() == 1)
83  EV_DEBUG << "All network nodes belong to a connected network.\n";
84  else
85  EV_DEBUG << "There exists " << isolatedNetworks.size() << " isolated networks.\n";
86 
87  // extract nodes, fill in interfaceTable and routingTable members in node
88  for (int i = 0; i < topology.getNumNodes(); i++) {
89  Node *node = (Node *)topology.getNode(i);
90  cModule *module = node->getModule();
91  node->module = module;
92  node->interfaceTable = findInterfaceTable(node);
93  node->routingTable = findRoutingTable(node);
94  }
95 
96  // extract links and interfaces
97  std::map<int, NetworkInterface *> interfacesSeen;
98  for (int i = 0; i < topology.getNumNodes(); i++) {
99  Node *node = (Node *)topology.getNode(i);
100  IInterfaceTable *interfaceTable = node->interfaceTable;
101  if (interfaceTable) {
102  for (int j = 0; j < interfaceTable->getNumInterfaces(); j++) {
103  NetworkInterface *networkInterface = interfaceTable->getInterface(j);
104  if (!networkInterface->isLoopback() && !containsKey(interfacesSeen, networkInterface->getId())) {
105  if (isBridgeNode(node))
106  createInterfaceInfo(topology, node, nullptr, networkInterface);
107  else {
108  interfacesSeen[networkInterface->getId()] = networkInterface;
109  // create a new network link
110  LinkInfo *linkInfo = new LinkInfo();
111  linkInfo->networkId = node->getNetworkId();
112  topology.linkInfos.push_back(linkInfo);
113  // store interface as belonging to the new network link
114  InterfaceInfo *interfaceInfo = createInterfaceInfo(topology, node, isBridgeNode(node) ? nullptr : linkInfo, networkInterface);
115  linkInfo->interfaceInfos.push_back(interfaceInfo);
116  // visit neighbors (and potentially the whole LAN, recursively)
117  if (isWirelessInterface(networkInterface)) {
118  std::vector<Node *> empty;
119  auto wirelessId = getWirelessId(networkInterface);
120  extractWirelessNeighbors(topology, wirelessId.c_str(), linkInfo, interfacesSeen, empty);
121  }
122  else {
123  Topology::Link *linkOut = findLinkOut(node, networkInterface->getNodeOutputGateId());
124  if (linkOut) {
125  std::vector<Node *> empty;
126  extractWiredNeighbors(topology, linkOut, linkInfo, interfacesSeen, empty);
127  }
128  }
129  }
130  }
131  }
132  }
133  }
134 
135  // annotate links with interfaces
136  for (int i = 0; i < topology.getNumNodes(); i++) {
137  Node *node = (Node *)topology.getNode(i);
138  for (int j = 0; j < node->getNumOutLinks(); j++) {
139  Topology::Link *linkOut = node->getLinkOut(j);
140  Link *link = (Link *)linkOut;
141  Node *localNode = (Node *)linkOut->getLinkOutLocalNode();
142  if (localNode->interfaceTable)
143  link->sourceInterfaceInfo = findInterfaceInfo(localNode, localNode->interfaceTable->findInterfaceByNodeOutputGateId(linkOut->getLinkOutLocalGateId()));
144  Node *remoteNode = (Node *)linkOut->getLinkOutRemoteNode();
145  if (remoteNode->interfaceTable)
146  link->destinationInterfaceInfo = findInterfaceInfo(remoteNode, remoteNode->interfaceTable->findInterfaceByNodeInputGateId(linkOut->getLinkOutRemoteGateId()));
147  }
148  }
149 
150  // collect wireless LAN interface infos into a map
151  std::map<std::string, std::vector<InterfaceInfo *>> wirelessIdToInterfaceInfosMap;
152  for (auto& entry : topology.interfaceInfos) {
153  InterfaceInfo *interfaceInfo = entry.second;
154  NetworkInterface *networkInterface = interfaceInfo->networkInterface;
155  if (!networkInterface->isLoopback() && isWirelessInterface(networkInterface)) {
156  auto wirelessId = getWirelessId(networkInterface);
157  wirelessIdToInterfaceInfosMap[wirelessId].push_back(interfaceInfo);
158  }
159  }
160 
161  // add extra links between all pairs of wireless interfaces within a LAN (full graph)
162  for (auto& entry : wirelessIdToInterfaceInfosMap) {
163  std::vector<InterfaceInfo *>& interfaceInfos = entry.second;
164  for (size_t i = 0; i < interfaceInfos.size(); i++) {
165  InterfaceInfo *interfaceInfoI = interfaceInfos.at(i);
166  for (size_t j = i + 1; j < interfaceInfos.size(); j++) {
167  // assume bidirectional links
168  InterfaceInfo *interfaceInfoJ = interfaceInfos.at(j);
169  Link *linkIJ = new Link();
170  linkIJ->sourceInterfaceInfo = interfaceInfoI;
171  linkIJ->destinationInterfaceInfo = interfaceInfoJ;
172  topology.addLink(linkIJ, interfaceInfoI->node, interfaceInfoJ->node);
173  Link *linkJI = new Link();
174  linkJI->sourceInterfaceInfo = interfaceInfoJ;
175  linkJI->destinationInterfaceInfo = interfaceInfoI;
176  topology.addLink(linkJI, interfaceInfoJ->node, interfaceInfoI->node);
177  }
178  }
179  }
180 
181  // determine gatewayInterfaceInfo for all linkInfos
182  for (auto& linkInfo : topology.linkInfos)
183  linkInfo->gatewayInterfaceInfo = determineGatewayForLink(linkInfo);
184 }

Referenced by inet::Ipv4NetworkConfigurator::computeConfiguration(), and inet::NextHopNetworkConfigurator::initialize().

◆ extractWiredNeighbors()

void inet::L3NetworkConfiguratorBase::extractWiredNeighbors ( Topology topology,
Topology::Link linkOut,
LinkInfo linkInfo,
std::map< int, NetworkInterface * > &  interfacesSeen,
std::vector< Node * > &  nodesVisited 
)
protectedvirtual
187 {
188  Node *node = (Node *)linkOut->getLinkOutRemoteNode();
189  int inputGateId = linkOut->getLinkOutRemoteGateId();
190  IInterfaceTable *interfaceTable = node->interfaceTable;
191  if (!isBridgeNode(node)) {
192  NetworkInterface *networkInterface = interfaceTable->findInterfaceByNodeInputGateId(inputGateId);
193  if (!networkInterface) {
194  // no such interface (node is probably down); we should probably get the information from our (future) internal database
195  }
196  else if (!containsKey(interfacesSeen, networkInterface->getId())) {
197  InterfaceInfo *neighborInterfaceInfo = createInterfaceInfo(topology, node, linkInfo, networkInterface);
198  linkInfo->interfaceInfos.push_back(neighborInterfaceInfo);
199  interfacesSeen[networkInterface->getId()] = networkInterface;
200  }
201  }
202  else {
203  if (!contains(deviceNodesVisited, node))
204  extractDeviceNeighbors(topology, node, linkInfo, interfacesSeen, deviceNodesVisited);
205  }
206 }

◆ extractWirelessNeighbors()

void inet::L3NetworkConfiguratorBase::extractWirelessNeighbors ( Topology topology,
const char *  wirelessId,
LinkInfo linkInfo,
std::map< int, NetworkInterface * > &  interfacesSeen,
std::vector< Node * > &  nodesVisited 
)
protectedvirtual
209 {
210  for (int nodeIndex = 0; nodeIndex < topology.getNumNodes(); nodeIndex++) {
211  Node *node = (Node *)topology.getNode(nodeIndex);
212  IInterfaceTable *interfaceTable = node->interfaceTable;
213  if (interfaceTable) {
214  for (int j = 0; j < interfaceTable->getNumInterfaces(); j++) {
215  NetworkInterface *networkInterface = interfaceTable->getInterface(j);
216  if (!networkInterface->isLoopback() && !containsKey(interfacesSeen, networkInterface->getId()) && isWirelessInterface(networkInterface)) {
217  if (getWirelessId(networkInterface) == wirelessId) {
218  if (!isBridgeNode(node)) {
219  InterfaceInfo *interfaceInfo = createInterfaceInfo(topology, node, linkInfo, networkInterface);
220  linkInfo->interfaceInfos.push_back(interfaceInfo);
221  interfacesSeen[networkInterface->getId()] = networkInterface;
222  }
223  else {
224  if (!contains(deviceNodesVisited, node))
225  extractDeviceNeighbors(topology, node, linkInfo, interfacesSeen, deviceNodesVisited);
226  }
227  }
228  }
229  }
230  }
231  }
232 }

◆ findInterfaceInfo()

L3NetworkConfiguratorBase::InterfaceInfo * inet::L3NetworkConfiguratorBase::findInterfaceInfo ( Node node,
NetworkInterface networkInterface 
)
protectedvirtual
284 {
285  if (networkInterface == nullptr)
286  return nullptr;
287  for (auto& interfaceInfo : node->interfaceInfos)
288  if (interfaceInfo->networkInterface == networkInterface)
289  return interfaceInfo;
290 
291  return nullptr;
292 }

◆ findInterfaceTable()

IInterfaceTable * inet::L3NetworkConfiguratorBase::findInterfaceTable ( Node node)
protectedvirtual
551 {
552  return L3AddressResolver::findInterfaceTableOf(node->module);
553 }

◆ findLinkOut()

Topology::Link * inet::L3NetworkConfiguratorBase::findLinkOut ( Node node,
int  gateId 
)
protectedvirtual
275 {
276  for (int i = 0; i < node->getNumOutLinks(); i++)
277  if (node->getLinkOut(i)->getLinkOutLocalGateId() == gateId)
278  return node->getLinkOut(i);
279 
280  return nullptr;
281 }

◆ findRoutingTable()

IRoutingTable * inet::L3NetworkConfiguratorBase::findRoutingTable ( Node node)
protectedvirtual

Reimplemented in inet::NextHopNetworkConfigurator, and inet::Ipv4NetworkConfigurator.

556 {
557  return nullptr;
558 }

◆ getWirelessId()

std::string inet::L3NetworkConfiguratorBase::getWirelessId ( NetworkInterface networkInterface)
protectedvirtual

If this function returns the same string for two wireless interfaces, they will be regarded as being in the same wireless network.

(The actual value of the string doesn't count.)

460 {
461  // use the configuration
462  cModule *hostModule = networkInterface->getInterfaceTable()->getHostModule();
463  std::string hostFullPath = hostModule->getFullPath();
464  std::string hostShortenedFullPath = hostFullPath.substr(hostFullPath.find('.') + 1);
465  cXMLElementList wirelessElements = configuration->getChildrenByTagName("wireless");
466  for (auto& wirelessElement : wirelessElements) {
467  const char *hostAttr = wirelessElement->getAttribute("hosts"); // "host* router[0..3]"
468  const char *interfaceAttr = wirelessElement->getAttribute("interfaces"); // i.e. interface names, like "eth* ppp0"
469  try {
470  // parse host/interface expressions
471  Matcher hostMatcher(hostAttr);
472  Matcher interfaceMatcher(interfaceAttr);
473 
474  // Note: "hosts", "interfaces" must ALL match on the interface for the rule to apply
475  if ((hostMatcher.matchesAny() || hostMatcher.matches(hostShortenedFullPath.c_str()) || hostMatcher.matches(hostFullPath.c_str())) &&
476  (interfaceMatcher.matchesAny() || interfaceMatcher.matches(networkInterface->getInterfaceName())))
477  {
478  const char *idAttr = wirelessElement->getAttribute("id"); // identifier of wireless connection
479  return idAttr ? idAttr : wirelessElement->getSourceLocation();
480  }
481  }
482  catch (std::exception& e) {
483  throw cRuntimeError("Error in XML <wireless> element at %s: %s", wirelessElement->getSourceLocation(), e.what());
484  }
485  }
486 #if defined(INET_WITH_IEEE80211) || defined(INET_WITH_PHYSICALLAYERWIRELESSCOMMON)
487  cModule *interfaceModule = networkInterface;
488 #ifdef INET_WITH_IEEE80211
489  if (auto mibModule = dynamic_cast<ieee80211::Ieee80211Mib *>(interfaceModule->getSubmodule("mib"))) {
490  auto ssid = mibModule->bssData.ssid;
491  if (ssid.length() != 0)
492  return ssid;
493  }
494  cModule *mgmtModule = interfaceModule->getSubmodule("mgmt");
495  if (mgmtModule != nullptr && mgmtModule->hasPar("ssid")) {
496  const char *value = mgmtModule->par("ssid");
497  if (*value)
498  return value;
499  }
500  cModule *agentModule = interfaceModule->getSubmodule("agent");
501  if (agentModule != nullptr && agentModule->hasPar("defaultSsid")) {
502  const char *value = agentModule->par("defaultSsid");
503  if (*value)
504  return value;
505  }
506 #endif // INET_WITH_IEEE80211
507 #ifdef INET_WITH_PHYSICALLAYERWIRELESSCOMMON
508  cModule *radioModule = interfaceModule->getSubmodule("radio");
509  const IRadio *radio = dynamic_cast<const IRadio *>(radioModule);
510  if (radio != nullptr) {
511  const cModule *mediumModule = dynamic_cast<const cModule *>(radio->getMedium());
512  if (mediumModule != nullptr)
513  return mediumModule->getFullName();
514  }
515 #endif // INET_WITH_PHYSICALLAYERWIRELESSCOMMON
516 #endif // defined(INET_WITH_IEEE80211) || defined(INET_WITH_PHYSICALLAYERWIRELESSCOMMON)
517 
518  // default: put all such wireless interfaces on the same LAN
519  return "SSID";
520 }

◆ handleMessage()

virtual void inet::L3NetworkConfiguratorBase::handleMessage ( cMessage *  msg)
inlineoverrideprotectedvirtual

Reimplemented in inet::Ipv4NetworkConfigurator.

142 { throw cRuntimeError("this module doesn't handle messages, it runs only in initialize()"); }

◆ initialize()

void inet::L3NetworkConfiguratorBase::initialize ( int  stage)
overrideprotectedvirtual

Reimplemented in inet::Ipv4NetworkConfigurator, and inet::NextHopNetworkConfigurator.

55 {
56  if (stage == INITSTAGE_LOCAL) {
57  minLinkWeight = par("minLinkWeight");
58  configureIsolatedNetworksSeparatly = par("configureIsolatedNetworksSeparatly").boolValue();
59  configuration = par("config");
60  }
61 }

Referenced by inet::NextHopNetworkConfigurator::initialize(), and inet::Ipv4NetworkConfigurator::initialize().

◆ isBridgeNode()

bool inet::L3NetworkConfiguratorBase::isBridgeNode ( Node node)
protectedvirtual
265 {
266  return !node->routingTable || !node->interfaceTable;
267 }

Referenced by inet::NextHopNetworkConfigurator::addStaticRoutes(), and inet::Ipv4NetworkConfigurator::addStaticRoutes().

◆ isWirelessInterface()

bool inet::L3NetworkConfiguratorBase::isWirelessInterface ( NetworkInterface networkInterface)
protectedvirtual
270 {
271  return !strncmp(networkInterface->getInterfaceName(), "wlan", 4);
272 }

Referenced by inet::Ipv4NetworkConfigurator::dumpConfig().

◆ numInitStages()

virtual int inet::L3NetworkConfiguratorBase::numInitStages ( ) const
inlineoverrideprotectedvirtual

Reimplemented in inet::Ipv4NetworkConfigurator.

140 { return NUM_INIT_STAGES; }

Member Data Documentation

◆ configuration

◆ configureIsolatedNetworksSeparatly

bool inet::L3NetworkConfiguratorBase::configureIsolatedNetworksSeparatly = false
protected

◆ minLinkWeight

double inet::L3NetworkConfiguratorBase::minLinkWeight = NaN
protected

The documentation for this class was generated from the following files:
inet::physicallayer::IRadioSignal::SIGNAL_PART_WHOLE
@ SIGNAL_PART_WHOLE
Definition: IRadioSignal.h:26
inet::L3NetworkConfiguratorBase::isWirelessInterface
virtual bool isWirelessInterface(NetworkInterface *networkInterface)
Definition: L3NetworkConfiguratorBase.cc:269
inet::physicallayer::IReception
This interface represents the reception of a transmission at a receiver.
Definition: IReception.h:25
inet::physicallayer::FlatTransmitterBase::getBitrate
virtual bps getBitrate() const
Definition: FlatTransmitterBase.h:41
inet::physicallayer::IReceptionResult
This interface represents the result of a receiver's reception process.
Definition: IReceptionResult.h:24
inet::mpls_constants::empty
const char empty[]
Definition: ConstType.h:29
inet::physicallayer::IArrival::getStartTime
virtual const simtime_t getStartTime() const =0
inet::L3NetworkConfiguratorBase::extractWiredNeighbors
virtual void extractWiredNeighbors(Topology &topology, Topology::Link *linkOut, LinkInfo *linkInfo, std::map< int, NetworkInterface * > &interfacesSeen, std::vector< Node * > &nodesVisited)
Definition: L3NetworkConfiguratorBase.cc:186
inet::physicallayer::IArrival
This interface represents the space and time coordinates of a transmission arriving at a receiver.
Definition: IArrival.h:26
inet::physicallayer::IArrival::getStartPropagationTime
virtual const simtime_t getStartPropagationTime() const =0
inet::physicallayer::IReceiver::computeIsReceptionPossible
virtual bool computeIsReceptionPossible(const IListening *listening, const ITransmission *transmission) const =0
Returns whether the reception of the provided transmission is possible or not independently of the re...
inet::L3NetworkConfiguratorBase::computeWirelessLinkWeight
virtual double computeWirelessLinkWeight(Link *link, const char *metric, cXMLElement *parameters)
Definition: L3NetworkConfiguratorBase.cc:369
inet::L3NetworkConfiguratorBase::isBridgeNode
virtual bool isBridgeNode(Node *node)
Definition: L3NetworkConfiguratorBase.cc:264
inet::physicallayer::Interference
Definition: Interference.h:16
inet::physicallayer::IArrival::getEndTime
virtual const simtime_t getEndTime() const =0
inet::physicallayer::IRadioMedium::getBackgroundNoise
virtual const IBackgroundNoise * getBackgroundNoise() const =0
Returns the background noise model of this medium.
inet::physicallayer::IRadio::getTransmitter
virtual const ITransmitter * getTransmitter() const =0
Returns the transmitter part of this radio.
inet::L3NetworkConfiguratorBase::findInterfaceTable
virtual IInterfaceTable * findInterfaceTable(Node *node)
Definition: L3NetworkConfiguratorBase.cc:550
inet::units::constants::e
const value< double, units::C > e(1.602176487e-19)
inet::physicallayer::IRadio::getMedium
virtual const IRadioMedium * getMedium() const =0
Returns the radio medium where this radio is transmitting and receiving radio signals.
inet::L3NetworkConfiguratorBase::extractWirelessNeighbors
virtual void extractWirelessNeighbors(Topology &topology, const char *wirelessId, LinkInfo *linkInfo, std::map< int, NetworkInterface * > &interfacesSeen, std::vector< Node * > &nodesVisited)
Definition: L3NetworkConfiguratorBase.cc:208
inet::physicallayer::IRadioMedium::getPropagation
virtual const IPropagation * getPropagation() const =0
Returns the signal propagation model of this medium.
PacketProtocolTag
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down PacketProtocolTag
Definition: IUdp-gates.txt:25
inet::physicallayer::IArrival::getEndPosition
virtual const Coord & getEndPosition() const =0
inet::physicallayer::IAnalogModel::computeReception
virtual const IReception * computeReception(const IRadio *receiver, const ITransmission *transmission, const IArrival *arrival) const =0
Returns the reception for the provided transmission at the receiver.
inet::L3NetworkConfiguratorBase::computeWiredLinkWeight
virtual double computeWiredLinkWeight(Link *link, const char *metric, cXMLElement *parameters)
Definition: L3NetworkConfiguratorBase.cc:328
inet::physicallayer::IRadioMedium
This interface represents the whole medium.
Definition: IRadioMedium.h:38
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::physicallayer::IReceiver
This interface represents a physical device (a part of the radio) which converts electric signals int...
Definition: IReceiver.h:42
inet::L3NetworkConfiguratorBase::minLinkWeight
double minLinkWeight
Definition: L3NetworkConfiguratorBase.h:135
inet::contains
bool contains(const std::vector< T > &v, const Tk &a)
Definition: stlutils.h:65
INFINITY
#define INFINITY
Definition: Topology.h:20
inet::physicallayer::IReceptionResult::getPacket
virtual const Packet * getPacket() const =0
Returns the packet corresponding to this reception.
inet::L3NetworkConfiguratorBase::extractDeviceNeighbors
virtual void extractDeviceNeighbors(Topology &topology, Node *node, LinkInfo *linkInfo, std::map< int, NetworkInterface * > &interfacesSeen, std::vector< Node * > &deviceNodesVisited)
Definition: L3NetworkConfiguratorBase.cc:234
inet::L3NetworkConfiguratorBase::configuration
cXMLElement * configuration
Definition: L3NetworkConfiguratorBase.h:137
inet::physicallayer::IAntenna::getMobility
virtual IMobility * getMobility() const =0
Returns the mobility of this antenna that describes its position and orientation over time.
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::physicallayer::ITransmission
This interface represents the transmission of a radio signal.
Definition: ITransmission.h:33
inet::L3AddressResolver::findInterfaceTableOf
virtual IInterfaceTable * findInterfaceTableOf(cModule *host)
Like interfaceTableOf(), but doesn't throw error if not found.
Definition: L3AddressResolver.cc:486
inet::physicallayer::IBackgroundNoise::computeNoise
virtual const INoise * computeNoise(const IListening *listening) const =0
inet::L3NetworkConfiguratorBase::determineGatewayForLink
virtual InterfaceInfo * determineGatewayForLink(LinkInfo *linkInfo)
If this link has exactly one node that connects to other links as well, we can assume it is a "gatewa...
Definition: L3NetworkConfiguratorBase.cc:526
inet::physicallayer::IPropagation::computeArrival
virtual const IArrival * computeArrival(const ITransmission *transmission, IMobility *mobility) const =0
Returns the time and space coordinates when the transmission arrives at the object that moves with th...
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::physicallayer::FlatTransmitterBase
Definition: FlatTransmitterBase.h:17
inet::physicallayer::IInterference
This interface represents the interference related to a reception.
Definition: IInterference.h:23
inet::physicallayer::IReceiver::createListening
virtual const IListening * createListening(const IRadio *radio, const simtime_t startTime, const simtime_t endTime, const Coord &startPosition, const Coord &endPosition) const =0
Returns a description of how the receiver is listening on the medium.
inet::L3NetworkConfiguratorBase::createInterfaceInfo
virtual InterfaceInfo * createInterfaceInfo(Topology &topology, Node *node, LinkInfo *linkInfo, NetworkInterface *networkInterface)
Definition: L3NetworkConfiguratorBase.cc:560
inet::Protocol::ackingMac
static const Protocol ackingMac
Definition: Protocol.h:122
inet::physicallayer::IListening
This interface represents how a receiver is listening on the radio channel.
Definition: IListening.h:23
inet::units::value::get
const value_type & get() const
Definition: Units.h:108
inet::L3NetworkConfiguratorBase::getWirelessId
virtual std::string getWirelessId(NetworkInterface *networkInterface)
If this function returns the same string for two wireless interfaces, they will be regarded as being ...
Definition: L3NetworkConfiguratorBase.cc:459
inet::physicallayer::IRadio
This interface represents a physical device that is capable of transmitting and receiving radio signa...
Definition: IRadio.h:32
inet::physicallayer::IReceptionDecision
This interface represents the decisions of a receiver's reception process.
Definition: IReceptionDecision.h:22
inet::L3NetworkConfiguratorBase::findRoutingTable
virtual IRoutingTable * findRoutingTable(Node *node)
Definition: L3NetworkConfiguratorBase.cc:555
inet::physicallayer::ITransmitter::createTransmission
virtual const ITransmission * createTransmission(const IRadio *transmitter, const Packet *packet, const simtime_t startTime) const =0
Returns a transmission which describes the radio signal corresponding to the provided packet.
inet::physicallayer::IRadioMedium::getAnalogModel
virtual const IAnalogModel * getAnalogModel() const =0
Returns the signal analog model of this medium.
inet::physicallayer::IArrival::getStartPosition
virtual const Coord & getStartPosition() const =0
inet::L3NetworkConfiguratorBase::findInterfaceInfo
virtual InterfaceInfo * findInterfaceInfo(Node *node, NetworkInterface *networkInterface)
Definition: L3NetworkConfiguratorBase.cc:283
inet::physicallayer::ISnir
Definition: ISnir.h:18
inet::physicallayer::IRadio::getReceiver
virtual const IReceiver * getReceiver() const =0
Returns the receiver part of this radio.
inet::L3NetworkConfiguratorBase::findLinkOut
virtual Topology::Link * findLinkOut(Node *node, int gateId)
Definition: L3NetworkConfiguratorBase.cc:274
inet::physicallayer::IAnalogModel::computeSNIR
virtual const ISnir * computeSNIR(const IReception *reception, const INoise *noise) const =0
Returns the signal to noise and interference ratio.
inet::physicallayer::ReceptionDecision
Definition: ReceptionDecision.h:16
inet::physicallayer::IRadio::getAntenna
virtual const IAntenna * getAntenna() const =0
Returns the antenna used by the transceiver of this radio.
inet::physicallayer::INoise
This interface represents a meaningless radio signal.
Definition: INoise.h:20
inet::physicallayer::IReceiver::computeReceptionResult
virtual const IReceptionResult * computeReceptionResult(const IListening *listening, const IReception *reception, const IInterference *interference, const ISnir *snir, const std::vector< const IReceptionDecision * > *decisions) const =0
Returns the complete result of the reception process for the provided reception.
inet::containsKey
bool containsKey(const std::map< K, V, _C > &m, const Tk &a)
Definition: stlutils.h:80
inet::L3NetworkConfiguratorBase::configureIsolatedNetworksSeparatly
bool configureIsolatedNetworksSeparatly
Definition: L3NetworkConfiguratorBase.h:136