INET Framework for OMNeT++/OMNEST
inet::physicallayer::RadioMedium Class Reference

The default implementation of the radio medium interface. More...

#include <RadioMedium.h>

Inheritance diagram for inet::physicallayer::RadioMedium:
inet::physicallayer::IRadioMedium inet::IPrintableObject

Protected Types

enum  RangeFilterKind { RANGE_FILTER_ANYWHERE, RANGE_FILTER_INTERFERENCE_RANGE, RANGE_FILTER_COMMUNICATION_RANGE }
 

Protected Member Functions

Module
virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void finish () override
 
virtual void handleMessage (cMessage *message) override
 
Transmission
virtual void addTransmission (const IRadio *transmitter, const ITransmission *transmission)
 Adds a new transmission to the radio medium. More...
 
virtual void removeTransmission (const ITransmission *transmission)
 Removes a transmission from the radio medium. More...
 
virtual IWirelessSignalcreateTransmitterSignal (const IRadio *radio, Packet *packet)
 Creates a new signal for the transmitter. More...
 
virtual IWirelessSignalcreateReceiverSignal (const ITransmission *transmission)
 Creates a new signal for a receiver. More...
 
virtual void sendToAffectedRadios (IRadio *transmitter, const IWirelessSignal *signal)
 Sends a copy of the provided signal to all affected receivers on the radio medium. More...
 
virtual void sendToAllRadios (IRadio *transmitter, const IWirelessSignal *signal)
 Sends a copy of the provided signal to all receivers on the radio medium. More...
 
virtual void pickUpSignals (IRadio *receiver)
 Sends a copy of all ongoing signals to the receiver on the radio medium. More...
 

Protected Attributes

Parameters and other models that control the behavior of the radio medium.
const IPropagationpropagation
 The propagation model is never nullptr. More...
 
const IPathLosspathLoss
 The path loss model is never nullptr. More...
 
const IObstacleLossobstacleLoss
 The obstacle loss model or nullptr if unused. More...
 
const IAnalogModelanalogModel
 The analog model is never nullptr. More...
 
const IBackgroundNoisebackgroundNoise
 The background noise model or nullptr if unused. More...
 
const physicalenvironment::IPhysicalEnvironmentphysicalEnvironment
 The physical environment model or nullptr if unused. More...
 
const physicalenvironment::IMaterialmaterial
 The physical material of the medium is never nullptr. More...
 
RangeFilterKind rangeFilter
 The radio medium doesn't send signals to a radio if it's outside the range provided by the selected range filter. More...
 
bool radioModeFilter
 True means the radio medium doesn't send signals to a radio if it's neither in receiver nor in transceiver mode. More...
 
bool listeningFilter
 True means the radio medium doesn't send signals to a radio if it listens on the medium in incompatible mode (e.g. More...
 
bool macAddressFilter
 True means the radio medium doesn't send signals to a radio if the mac address of the destination is different. More...
 
bool recordTransmissionLog
 Records all transmissions (if recordTransmissionLog is enabled) and receptions (if recordReceptionLog is enabled) into a separate trace file. More...
 
bool recordReceptionLog
 
Timer
cMessage * removeNonInterferingTransmissionsTimer
 The message that is used to purge the internal state of the medium. More...
 
Cache
IMediumLimitCachemediumLimitCache
 Caches various medium limits among all radios. More...
 
INeighborCacheneighborCache
 Caches neighbors for all radios or nullptr if turned off. More...
 
ICommunicationCachecommunicationCache
 Caches list of radios and transmissions along with intermediate results. More...
 
Logging
CommunicationLog communicationLog
 The communication log output recorder. More...
 
Statistics
long transmissionCount
 Total number of transmissions. More...
 
long signalSendCount
 Total number of signal sends. More...
 
long receptionComputationCount
 Total number of reception computations. More...
 
long interferenceComputationCount
 Total number of interference computations. More...
 
long receptionDecisionComputationCount
 Total number of data reception decision computations. More...
 
long receptionResultComputationCount
 Total number of data reception result computations. More...
 
long listeningDecisionComputationCount
 Total number of listening decision computations. More...
 
long cacheReceptionGetCount
 Total number of reception cache queries. More...
 
long cacheReceptionHitCount
 Total number of reception cache hits. More...
 
long cacheInterferenceGetCount
 Total number of interference cache queries. More...
 
long cacheInterferenceHitCount
 Total number of interference cache hits. More...
 
long cacheNoiseGetCount
 Total number of noise cache queries. More...
 
long cacheNoiseHitCount
 Total number of noise cache hits. More...
 
long cacheSNIRGetCount
 Total number of SNIR cache queries. More...
 
long cacheSNIRHitCount
 Total number of SNIR cache hits. More...
 
long cacheDecisionGetCount
 Total number of reception decision cache queries. More...
 
long cacheDecisionHitCount
 Total number of reception decision cache hits. More...
 
long cacheResultGetCount
 Total number of reception result cache queries. More...
 
long cacheResultHitCount
 Total number of reception result cache hits. More...
 

Private Attributes

friend Radio
 

Reception

virtual bool matchesMacAddressFilter (const IRadio *radio, const Packet *packet) const
 
virtual bool isPotentialReceiver (const IRadio *receiver, const ITransmission *transmission) const
 Returns true if the radio can potentially receive the transmission successfully. More...
 
virtual bool isInCommunicationRange (const ITransmission *transmission, const Coord &startPosition, const Coord &endPosition) const
 
virtual bool isInInterferenceRange (const ITransmission *transmission, const Coord &startPosition, const Coord &endPosition) const
 
virtual bool isInterferingTransmission (const ITransmission *transmission, const IListening *listening) const
 
virtual bool isInterferingTransmission (const ITransmission *transmission, const IReception *reception) const
 
virtual void removeNonInterferingTransmissions ()
 Removes all cached data related to past transmissions that don't have any effect on any ongoing transmission. More...
 
virtual const std::vector< const IReception * > * computeInterferingReceptions (const IListening *listening) const
 
virtual const std::vector< const IReception * > * computeInterferingReceptions (const IReception *reception) const
 
virtual const IReceptioncomputeReception (const IRadio *receiver, const ITransmission *transmission) const
 
virtual const IInterferencecomputeInterference (const IRadio *receiver, const IListening *listening) const
 
virtual const IInterferencecomputeInterference (const IRadio *receiver, const IListening *listening, const ITransmission *transmission) const
 
virtual const IReceptionDecisioncomputeReceptionDecision (const IRadio *receiver, const IListening *listening, const ITransmission *transmission, IRadioSignal::SignalPart part) const
 
virtual const IReceptionResultcomputeReceptionResult (const IRadio *receiver, const IListening *listening, const ITransmission *transmission) const
 
virtual const IListeningDecisioncomputeListeningDecision (const IRadio *receiver, const IListening *listening) const
 
 RadioMedium ()
 
virtual ~RadioMedium ()
 
virtual std::ostream & printToStream (std::ostream &stream, int level, int evFlags=0) const override
 Prints this object to the provided output stream. More...
 
virtual const physicalenvironment::IMaterialgetMaterial () const override
 Returns the material of this medium. More...
 
virtual const IPropagationgetPropagation () const override
 Returns the signal propagation model of this medium. More...
 
virtual const IPathLossgetPathLoss () const override
 Returns the signal path loss model of this medium. More...
 
virtual const IObstacleLossgetObstacleLoss () const override
 Returns the signal obstacle loss model of this medium. More...
 
virtual const IAnalogModelgetAnalogModel () const override
 Returns the signal analog model of this medium. More...
 
virtual const IBackgroundNoisegetBackgroundNoise () const override
 Returns the background noise model of this medium. More...
 
virtual const physicalenvironment::IPhysicalEnvironmentgetPhysicalEnvironment () const override
 Returns the physical environment model of this medium. More...
 
virtual const IMediumLimitCachegetMediumLimitCache () const override
 
virtual const INeighborCachegetNeighborCache () const override
 
virtual const ICommunicationCachegetCommunicationCache () const override
 
virtual void addRadio (const IRadio *radio) override
 Adds a new radio to the medium. More...
 
virtual void removeRadio (const IRadio *radio) override
 Removes a radio from the medium. More...
 
virtual const IRadiogetRadio (int id) const override
 Returns radio instance from medium by id. More...
 
virtual void sendToRadio (IRadio *trasmitter, const IRadio *receiver, const IWirelessSignal *signal)
 
virtual IWirelessSignaltransmitPacket (const IRadio *transmitter, Packet *packet) override
 Returns a new signal containing the signal transmission that represents the provided packet. More...
 
virtual PacketreceivePacket (const IRadio *receiver, IWirelessSignal *signal) override
 Returns the packet that was transmitted in the provided signal. More...
 
virtual const ITransmissiongetTransmission (int id) const override
 Returns transmission instance from medium by id. More...
 
virtual const IListeningDecisionlistenOnMedium (const IRadio *receiver, const IListening *listening) const override
 Returns the listening decision that describes what the receiver detects on the medium. More...
 
virtual const IArrivalgetArrival (const IRadio *receiver, const ITransmission *transmission) const override
 Returns the space and time coordinates of the transmission arriving at the provided receiver. More...
 
virtual const IListeninggetListening (const IRadio *receiver, const ITransmission *transmission) const override
 Returns how the radio is listening on the medium when the transmission arrives at the provided receiver. More...
 
virtual const IReceptiongetReception (const IRadio *receiver, const ITransmission *transmission) const override
 Returns the reception of the transmission arriving at the provided receiver. More...
 
virtual const IInterferencegetInterference (const IRadio *receiver, const ITransmission *transmission) const override
 Returns the interference of the transmission arriving at the provided receiver. More...
 
virtual const IInterferencegetInterference (const IRadio *receiver, const IListening *listening, const ITransmission *transmission) const
 
virtual const INoisegetNoise (const IRadio *receiver, const ITransmission *transmission) const override
 Returns the total noise computed from the interference of the transmission arriving at the provided receiver. More...
 
virtual const ISnirgetSNIR (const IRadio *receiver, const ITransmission *transmission) const override
 Returns the signal to noise and interference ratio of the transmission arriving at the provided receiver. More...
 
virtual bool isReceptionPossible (const IRadio *receiver, const ITransmission *transmission, IRadioSignal::SignalPart part) const override
 Returns true when the reception is possible of the transmission part. More...
 
virtual bool isReceptionAttempted (const IRadio *receiver, const ITransmission *transmission, IRadioSignal::SignalPart part) const override
 Returns true when the reception is attempted of the transmission part. More...
 
virtual bool isReceptionSuccessful (const IRadio *receiver, const ITransmission *transmission, IRadioSignal::SignalPart part) const override
 Returns true when the reception is successful of the transmission part. More...
 
virtual const IReceptionDecisiongetReceptionDecision (const IRadio *receiver, const IListening *listening, const ITransmission *transmission, IRadioSignal::SignalPart part) const override
 Returns the reception decision for the transmission part that specifies whether the reception is possible, attempted, and successful. More...
 
virtual const IReceptionResultgetReceptionResult (const IRadio *receiver, const IListening *listening, const ITransmission *transmission) const override
 Returns the reception result for the transmission that describes the end result of the reception process. More...
 
virtual void receiveSignal (cComponent *source, simsignal_t signal, intval_t value, cObject *details) override
 
virtual void receiveSignal (cComponent *source, simsignal_t signal, cObject *value, cObject *details) override
 

Additional Inherited Members

- Public Types inherited from inet::IPrintableObject
enum  PrintLevel {
  PRINT_LEVEL_TRACE, PRINT_LEVEL_DEBUG, PRINT_LEVEL_DETAIL, PRINT_LEVEL_INFO,
  PRINT_LEVEL_COMPLETE = INT_MIN
}
 
enum  PrintFlag { PRINT_FLAG_FORMATTED = (1 << 0), PRINT_FLAG_MULTILINE = (1 << 1) }
 
- Public Member Functions inherited from inet::IPrintableObject
virtual ~IPrintableObject ()
 
virtual std::string printToString () const
 
virtual std::string printToString (int level, int evFlags=0) const
 
virtual std::string getInfoStringRepresentation (int evFlags=0) const
 
virtual std::string getDetailStringRepresentation (int evFlags=0) const
 
virtual std::string getDebugStringRepresentation (int evFlags=0) const
 
virtual std::string getTraceStringRepresentation (int evFlags=0) const
 
virtual std::string getCompleteStringRepresentation (int evFlags=0) const
 
- Static Public Attributes inherited from inet::physicallayer::IRadioMedium
static simsignal_t radioAddedSignal = cComponent::registerSignal("radioAdded")
 This simsignal is emitted when a radio is added to the medium. More...
 
static simsignal_t radioRemovedSignal = cComponent::registerSignal("radioRemoved")
 This simsignal is emitted when a radio is removed from the medium. More...
 
static simsignal_t signalAddedSignal = cComponent::registerSignal("signalAdded")
 This simsignal is emitted when a signal is added to the medium. More...
 
static simsignal_t signalRemovedSignal = cComponent::registerSignal("signalRemoved")
 This simsignal is emitted when a signal is removed from the medium. More...
 
static simsignal_t signalDepartureStartedSignal = cComponent::registerSignal("signalDepartureStarted")
 This simsignal is emitted when a signal departure is started on the medium. More...
 
static simsignal_t signalDepartureEndedSignal = cComponent::registerSignal("signalDepartureEnded")
 This simsignal is emitted when a signal departure is ended on the medium. More...
 
static simsignal_t signalArrivalStartedSignal = cComponent::registerSignal("signalArrivalStarted")
 This simsignal is emitted when a signal arrival is started on the medium. More...
 
static simsignal_t signalArrivalEndedSignal = cComponent::registerSignal("signalArrivalEnded")
 This simsignal is emitted when a signal arrival is ended on the medium. More...
 

Detailed Description

The default implementation of the radio medium interface.

Member Enumeration Documentation

◆ RangeFilterKind

Enumerator
RANGE_FILTER_ANYWHERE 
RANGE_FILTER_INTERFERENCE_RANGE 
RANGE_FILTER_COMMUNICATION_RANGE 

Constructor & Destructor Documentation

◆ RadioMedium()

inet::physicallayer::RadioMedium::RadioMedium ( )

◆ ~RadioMedium()

inet::physicallayer::RadioMedium::~RadioMedium ( )
virtual

Member Function Documentation

◆ addRadio()

void inet::physicallayer::RadioMedium::addRadio ( const IRadio radio)
overridevirtual

Adds a new radio to the medium.

An exception is thrown if the radio is already added. The radio may immediately start new transmissions and will potentially receive all ongoing and further transmissions.

Implements inet::physicallayer::IRadioMedium.

416 {
417  Enter_Method("addRadio");
419  if (neighborCache)
420  neighborCache->addRadio(radio);
421  mediumLimitCache->addRadio(radio);
422  communicationCache->mapTransmissions([&] (const ITransmission *transmission) {
423  const IArrival *arrival = propagation->computeArrival(transmission, radio->getAntenna()->getMobility());
424  const IListening *listening = radio->getReceiver()->createListening(radio, arrival->getStartTime(), arrival->getEndTime(), arrival->getStartPosition(), arrival->getEndPosition());
425  communicationCache->setCachedArrival(radio, transmission, arrival);
426  communicationCache->setCachedListening(radio, transmission, listening);
427  });
428  cModule *radioModule = const_cast<cModule *>(check_and_cast<const cModule *>(radio));
429  if (radioModeFilter)
430  radioModule->subscribe(IRadio::radioModeChangedSignal, this);
431  if (listeningFilter)
432  radioModule->subscribe(IRadio::listeningChangedSignal, this);
433  if (macAddressFilter)
434  getContainingNode(radioModule)->subscribe(interfaceConfigChangedSignal, this);
435  emit(radioAddedSignal, radioModule);
436 }

◆ addTransmission()

void inet::physicallayer::RadioMedium::addTransmission ( const IRadio transmitter,
const ITransmission transmission 
)
protectedvirtual

Adds a new transmission to the radio medium.

461 {
462  Enter_Method("addTransmission");
464  communicationCache->addTransmission(transmission);
465  simtime_t maxArrivalEndTime = transmission->getEndTime();
466  communicationCache->mapRadios([&] (const IRadio *receiverRadio) {
467  if (receiverRadio != nullptr && receiverRadio != transmitterRadio && receiverRadio->getReceiver() != nullptr) {
468  const IArrival *arrival = propagation->computeArrival(transmission, receiverRadio->getAntenna()->getMobility());
469  const IntervalTree::Interval *interval = new IntervalTree::Interval(arrival->getStartTime(), arrival->getEndTime(), (void *)transmission);
470  const IListening *listening = receiverRadio->getReceiver()->createListening(receiverRadio, arrival->getStartTime(), arrival->getEndTime(), arrival->getStartPosition(), arrival->getEndPosition());
471  const simtime_t arrivalEndTime = arrival->getEndTime();
472  if (arrivalEndTime > maxArrivalEndTime)
473  maxArrivalEndTime = arrivalEndTime;
474  communicationCache->setCachedArrival(receiverRadio, transmission, arrival);
475  communicationCache->setCachedInterval(receiverRadio, transmission, interval);
476  communicationCache->setCachedListening(receiverRadio, transmission, listening);
477  }
478  });
480  if (!removeNonInterferingTransmissionsTimer->isScheduled())
482  emit(signalAddedSignal, check_and_cast<const cObject *>(transmission));
483 }

Referenced by transmitPacket().

◆ computeInterference() [1/2]

const IInterference * inet::physicallayer::RadioMedium::computeInterference ( const IRadio receiver,
const IListening listening 
) const
protectedvirtual
270 {
272  const INoise *noise = backgroundNoise ? backgroundNoise->computeNoise(listening) : nullptr;
273  const std::vector<const IReception *> *interferingReceptions = computeInterferingReceptions(listening);
274  return new Interference(noise, interferingReceptions);
275 }

Referenced by computeListeningDecision(), getInterference(), isReceptionAttempted(), isReceptionPossible(), and isReceptionSuccessful().

◆ computeInterference() [2/2]

const IInterference * inet::physicallayer::RadioMedium::computeInterference ( const IRadio receiver,
const IListening listening,
const ITransmission transmission 
) const
protectedvirtual
278 {
280  const IReception *reception = getReception(receiver, transmission);
281  const INoise *noise = backgroundNoise ? backgroundNoise->computeNoise(listening) : nullptr;
282  const std::vector<const IReception *> *interferingReceptions = computeInterferingReceptions(reception);
283  return new Interference(noise, interferingReceptions);
284 }

◆ computeInterferingReceptions() [1/2]

const std::vector< const IReception * > * inet::physicallayer::RadioMedium::computeInterferingReceptions ( const IListening listening) const
protectedvirtual
239 {
240  const IRadio *radio = listening->getReceiver();
241  std::vector<const ITransmission *> *interferingTransmissions = communicationCache->computeInterferingTransmissions(radio, listening->getStartTime(), listening->getEndTime());
242  std::vector<const IReception *> *interferingReceptions = new std::vector<const IReception *>();
243  for (const auto interferingTransmission : *interferingTransmissions)
244  if (isInterferingTransmission(interferingTransmission, listening))
245  interferingReceptions->push_back(getReception(radio, interferingTransmission));
246  delete interferingTransmissions;
247  return interferingReceptions;
248 }

Referenced by computeInterference().

◆ computeInterferingReceptions() [2/2]

const std::vector< const IReception * > * inet::physicallayer::RadioMedium::computeInterferingReceptions ( const IReception reception) const
protectedvirtual
251 {
252  const IRadio *radio = reception->getReceiver();
253  const ITransmission *transmission = reception->getTransmission();
254  std::vector<const ITransmission *> *interferingTransmissions = communicationCache->computeInterferingTransmissions(radio, reception->getStartTime(), reception->getEndTime());
255  std::vector<const IReception *> *interferingReceptions = new std::vector<const IReception *>();
256  for (const auto interferingTransmission : *interferingTransmissions)
257  if (transmission != interferingTransmission && isInterferingTransmission(interferingTransmission, reception))
258  interferingReceptions->push_back(getReception(radio, interferingTransmission));
259  delete interferingTransmissions;
260  return interferingReceptions;
261 }

◆ computeListeningDecision()

const IListeningDecision * inet::physicallayer::RadioMedium::computeListeningDecision ( const IRadio receiver,
const IListening listening 
) const
protectedvirtual
307 {
309  const IInterference *interference = computeInterference(radio, listening);
310  const IListeningDecision *decision = radio->getReceiver()->computeListeningDecision(listening, interference);
311  delete interference;
312  return decision;
313 }

Referenced by listenOnMedium().

◆ computeReception()

const IReception * inet::physicallayer::RadioMedium::computeReception ( const IRadio receiver,
const ITransmission transmission 
) const
protectedvirtual
264 {
266  return analogModel->computeReception(radio, transmission, getArrival(radio, transmission));
267 }

Referenced by getReception().

◆ computeReceptionDecision()

const IReceptionDecision * inet::physicallayer::RadioMedium::computeReceptionDecision ( const IRadio receiver,
const IListening listening,
const ITransmission transmission,
IRadioSignal::SignalPart  part 
) const
protectedvirtual
287 {
289  const IReception *reception = getReception(radio, transmission);
290  const IInterference *interference = getInterference(radio, listening, transmission);
291  const ISnir *snir = getSNIR(radio, transmission);
292  return radio->getReceiver()->computeReceptionDecision(listening, reception, part, interference, snir);
293 }

Referenced by getReceptionDecision().

◆ computeReceptionResult()

const IReceptionResult * inet::physicallayer::RadioMedium::computeReceptionResult ( const IRadio receiver,
const IListening listening,
const ITransmission transmission 
) const
protectedvirtual
296 {
298  const IReception *reception = getReception(radio, transmission);
299  const IInterference *interference = getInterference(radio, listening, transmission);
300  const ISnir *snir = getSNIR(radio, transmission);
301  const IReceptionDecision *receptionDecision = getReceptionDecision(radio, listening, transmission, IRadioSignal::SIGNAL_PART_WHOLE);
302  const std::vector<const IReceptionDecision *> *receptionDecisions = new std::vector<const IReceptionDecision *> { receptionDecision };
303  return radio->getReceiver()->computeReceptionResult(listening, reception, interference, snir, receptionDecisions);
304 }

Referenced by getReceptionResult().

◆ createReceiverSignal()

IWirelessSignal * inet::physicallayer::RadioMedium::createReceiverSignal ( const ITransmission transmission)
protectedvirtual

Creates a new signal for a receiver.

510 {
511  auto signal = new WirelessSignal(transmission);
512  signal->setDuration(transmission->getDuration());
513  auto transmitterPacket = transmission->getPacket();
514  if (transmitterPacket != nullptr) {
515  auto receiverPacket = transmitterPacket->dup();
516  receiverPacket->clearTags();
517  receiverPacket->addTag<PacketProtocolTag>()->setProtocol(transmitterPacket->getTag<PacketProtocolTag>()->getProtocol());
518  signal->setName(receiverPacket->getName());
519  signal->encapsulate(receiverPacket);
520  }
521  return signal;
522 }

Referenced by pickUpSignals(), and sendToRadio().

◆ createTransmitterSignal()

IWirelessSignal * inet::physicallayer::RadioMedium::createTransmitterSignal ( const IRadio radio,
Packet packet 
)
protectedvirtual

Creates a new signal for the transmitter.

493 {
494  if (packet != nullptr)
495  take(packet);
496  auto transmission = radio->getTransmitter()->createTransmission(radio, packet, simTime());
497  auto signal = new WirelessSignal(transmission);
498  auto duration = transmission->getDuration();
500  throw cRuntimeError("Maximum transmission duration is exceeded");
501  signal->setDuration(duration);
502  if (packet != nullptr) {
503  signal->setName(packet->getName());
504  signal->encapsulate(packet);
505  }
506  return signal;
507 }

Referenced by transmitPacket().

◆ finish()

void inet::physicallayer::RadioMedium::finish ( )
overrideprotectedvirtual
113 {
114  double receptionCacheHitPercentage = 100 * (double)cacheReceptionHitCount / (double)cacheReceptionGetCount;
115  double interferenceCacheHitPercentage = 100 * (double)cacheInterferenceHitCount / (double)cacheInterferenceGetCount;
116  double noiseCacheHitPercentage = 100 * (double)cacheNoiseHitCount / (double)cacheNoiseGetCount;
117  double snirCacheHitPercentage = 100 * (double)cacheSNIRHitCount / (double)cacheSNIRGetCount;
118  double decisionCacheHitPercentage = 100 * (double)cacheDecisionHitCount / (double)cacheDecisionGetCount;
119  double resultCacheHitPercentage = 100 * (double)cacheResultHitCount / (double)cacheResultGetCount;
120  EV_INFO << "Transmission count = " << transmissionCount << endl;
121  EV_INFO << "Signal send count = " << signalSendCount << endl;
122  EV_INFO << "Reception computation count = " << receptionComputationCount << endl;
123  EV_INFO << "Interference computation count = " << interferenceComputationCount << endl;
124  EV_INFO << "Reception decision computation count = " << receptionDecisionComputationCount << endl;
125  EV_INFO << "Listening decision computation count = " << listeningDecisionComputationCount << endl;
126  EV_INFO << "Reception cache hit = " << receptionCacheHitPercentage << " %" << endl;
127  EV_INFO << "Interference cache hit = " << interferenceCacheHitPercentage << " %" << endl;
128  EV_INFO << "Noise cache hit = " << noiseCacheHitPercentage << " %" << endl;
129  EV_INFO << "SNIR cache hit = " << snirCacheHitPercentage << " %" << endl;
130  EV_INFO << "Reception decision cache hit = " << decisionCacheHitPercentage << " %" << endl;
131  EV_INFO << "Reception result cache hit = " << resultCacheHitPercentage << " %" << endl;
132  recordScalar("transmission count", transmissionCount);
133  recordScalar("signal send count", signalSendCount);
134  recordScalar("reception computation count", receptionComputationCount);
135  recordScalar("interference computation count", interferenceComputationCount);
136  recordScalar("reception decision computation count", receptionDecisionComputationCount);
137  recordScalar("listening decision computation count", listeningDecisionComputationCount);
138  recordScalar("reception cache hit", receptionCacheHitPercentage, "%");
139  recordScalar("interference cache hit", interferenceCacheHitPercentage, "%");
140  recordScalar("noise cache hit", noiseCacheHitPercentage, "%");
141  recordScalar("snir cache hit", snirCacheHitPercentage, "%");
142  recordScalar("reception decision cache hit", decisionCacheHitPercentage, "%");
143  recordScalar("reception result cache hit", resultCacheHitPercentage, "%");
144 }

◆ getAnalogModel()

virtual const IAnalogModel* inet::physicallayer::RadioMedium::getAnalogModel ( ) const
inlineoverridevirtual

Returns the signal analog model of this medium.

This function never returns nullptr.

Implements inet::physicallayer::IRadioMedium.

309 { return analogModel; }

◆ getArrival()

const IArrival * inet::physicallayer::RadioMedium::getArrival ( const IRadio receiver,
const ITransmission transmission 
) const
overridevirtual

Returns the space and time coordinates of the transmission arriving at the provided receiver.

This function never returns nullptr as long as the transmission is live on the medium.

Implements inet::physicallayer::IRadioMedium.

316 {
317  return communicationCache->getCachedArrival(receiver, transmission);
318 }

Referenced by computeReception(), isInterferingTransmission(), isPotentialReceiver(), pickUpSignals(), receiveSignal(), and sendToRadio().

◆ getBackgroundNoise()

virtual const IBackgroundNoise* inet::physicallayer::RadioMedium::getBackgroundNoise ( ) const
inlineoverridevirtual

Returns the background noise model of this medium.

This function may return nullptr if there's no background noise model.

Implements inet::physicallayer::IRadioMedium.

310 { return backgroundNoise; }

◆ getCommunicationCache()

virtual const ICommunicationCache* inet::physicallayer::RadioMedium::getCommunicationCache ( ) const
inlineoverridevirtual

◆ getInterference() [1/2]

const IInterference * inet::physicallayer::RadioMedium::getInterference ( const IRadio receiver,
const IListening listening,
const ITransmission transmission 
) const
virtual
345 {
347  const IInterference *interference = communicationCache->getCachedInterference(receiver, transmission);
348  if (interference)
350  else {
351  interference = computeInterference(receiver, listening, transmission);
352  communicationCache->setCachedInterference(receiver, transmission, interference);
353  }
354  return interference;
355 }

◆ getInterference() [2/2]

const IInterference * inet::physicallayer::RadioMedium::getInterference ( const IRadio receiver,
const ITransmission transmission 
) const
overridevirtual

Returns the interference of the transmission arriving at the provided receiver.

This function never returns nullptr as long as the transmission is live on the medium.

Implements inet::physicallayer::IRadioMedium.

340 {
341  return getInterference(receiver, communicationCache->getCachedListening(receiver, transmission), transmission);
342 }

Referenced by computeReceptionDecision(), computeReceptionResult(), and getNoise().

◆ getListening()

const IListening * inet::physicallayer::RadioMedium::getListening ( const IRadio receiver,
const ITransmission transmission 
) const
overridevirtual

Returns how the radio is listening on the medium when the transmission arrives at the provided receiver.

This function never returns nullptr as long as the transmission is live on the medium.

Implements inet::physicallayer::IRadioMedium.

321 {
322  return communicationCache->getCachedListening(receiver, transmission);
323 }

Referenced by isPotentialReceiver(), isReceptionAttempted(), isReceptionPossible(), and isReceptionSuccessful().

◆ getMaterial()

virtual const physicalenvironment::IMaterial* inet::physicallayer::RadioMedium::getMaterial ( ) const
inlineoverridevirtual

Returns the material of this medium.

This function never returns nullptr.

Implements inet::physicallayer::IRadioMedium.

305 { return material; }

◆ getMediumLimitCache()

virtual const IMediumLimitCache* inet::physicallayer::RadioMedium::getMediumLimitCache ( ) const
inlineoverridevirtual

◆ getNeighborCache()

virtual const INeighborCache* inet::physicallayer::RadioMedium::getNeighborCache ( ) const
inlineoverridevirtual

Implements inet::physicallayer::IRadioMedium.

313 { return neighborCache; }

◆ getNoise()

const INoise * inet::physicallayer::RadioMedium::getNoise ( const IRadio receiver,
const ITransmission transmission 
) const
overridevirtual

Returns the total noise computed from the interference of the transmission arriving at the provided receiver.

This function never returns nullptr as long as the transmission is live on the medium.

Implements inet::physicallayer::IRadioMedium.

358 {
360  const INoise *noise = communicationCache->getCachedNoise(receiver, transmission);
361  if (noise)
363  else {
364  const IListening *listening = communicationCache->getCachedListening(receiver, transmission);
365  const IInterference *interference = getInterference(receiver, transmission);
366  noise = analogModel->computeNoise(listening, interference);
367  communicationCache->setCachedNoise(receiver, transmission, noise);
368  }
369  return noise;
370 }

Referenced by getSNIR().

◆ getObstacleLoss()

virtual const IObstacleLoss* inet::physicallayer::RadioMedium::getObstacleLoss ( ) const
inlineoverridevirtual

Returns the signal obstacle loss model of this medium.

This function may return nullptr if there's no obstacle loss model.

Implements inet::physicallayer::IRadioMedium.

308 { return obstacleLoss; }

◆ getPathLoss()

virtual const IPathLoss* inet::physicallayer::RadioMedium::getPathLoss ( ) const
inlineoverridevirtual

Returns the signal path loss model of this medium.

This function never returns nullptr.

Implements inet::physicallayer::IRadioMedium.

307 { return pathLoss; }

◆ getPhysicalEnvironment()

virtual const physicalenvironment::IPhysicalEnvironment* inet::physicallayer::RadioMedium::getPhysicalEnvironment ( ) const
inlineoverridevirtual

Returns the physical environment model of this medium.

This function may return nullptr if there's no physical environment model.

Implements inet::physicallayer::IRadioMedium.

311 { return physicalEnvironment; }

◆ getPropagation()

virtual const IPropagation* inet::physicallayer::RadioMedium::getPropagation ( ) const
inlineoverridevirtual

Returns the signal propagation model of this medium.

This function never returns nullptr.

Implements inet::physicallayer::IRadioMedium.

306 { return propagation; }

◆ getRadio()

const IRadio * inet::physicallayer::RadioMedium::getRadio ( int  id) const
overridevirtual

Returns radio instance from medium by id.

May return a nullptr if no matching radio is registered.

Implements inet::physicallayer::IRadioMedium.

456 {
457  return communicationCache->getRadio(radioId);
458 }

Referenced by pickUpSignals().

◆ getReception()

const IReception * inet::physicallayer::RadioMedium::getReception ( const IRadio receiver,
const ITransmission transmission 
) const
overridevirtual

Returns the reception of the transmission arriving at the provided receiver.

This function never returns nullptr as long as the transmission is live on the medium.

Implements inet::physicallayer::IRadioMedium.

326 {
328  const IReception *reception = communicationCache->getCachedReception(receiver, transmission);
329  if (reception)
331  else {
332  reception = computeReception(receiver, transmission);
333  communicationCache->setCachedReception(receiver, transmission, reception);
334  EV_DEBUG << "Receiving " << transmission << " from medium by " << receiver << " arrives as " << reception << endl;
335  }
336  return reception;
337 }

Referenced by computeInterference(), computeInterferingReceptions(), computeReceptionDecision(), computeReceptionResult(), getSNIR(), isReceptionAttempted(), isReceptionPossible(), and isReceptionSuccessful().

◆ getReceptionDecision()

const IReceptionDecision * inet::physicallayer::RadioMedium::getReceptionDecision ( const IRadio receiver,
const IListening listening,
const ITransmission transmission,
IRadioSignal::SignalPart  part 
) const
overridevirtual

Returns the reception decision for the transmission part that specifies whether the reception is possible, attempted, and successful.

Implements inet::physicallayer::IRadioMedium.

388 {
390  const IReceptionDecision *decision = communicationCache->getCachedReceptionDecision(radio, transmission, part);
391  if (decision)
393  else {
394  decision = computeReceptionDecision(radio, listening, transmission, part);
395  communicationCache->setCachedReceptionDecision(radio, transmission, part, decision);
396  EV_DEBUG << "Receiving " << transmission << " from medium by " << radio << " arrives as " << decision->getReception() << " and results in " << decision << endl;
397  }
398  return decision;
399 }

Referenced by computeReceptionResult().

◆ getReceptionResult()

const IReceptionResult * inet::physicallayer::RadioMedium::getReceptionResult ( const IRadio receiver,
const IListening listening,
const ITransmission transmission 
) const
overridevirtual

Returns the reception result for the transmission that describes the end result of the reception process.

Implements inet::physicallayer::IRadioMedium.

402 {
404  const IReceptionResult *result = communicationCache->getCachedReceptionResult(radio, transmission);
405  if (result)
407  else {
408  result = computeReceptionResult(radio, listening, transmission);
409  communicationCache->setCachedReceptionResult(radio, transmission, result);
410  EV_DEBUG << "Receiving " << transmission << " from medium by " << radio << " arrives as " << result->getReception() << " and results in " << result << endl;
411  }
412  return result;
413 }

Referenced by receivePacket().

◆ getSNIR()

const ISnir * inet::physicallayer::RadioMedium::getSNIR ( const IRadio receiver,
const ITransmission transmission 
) const
overridevirtual

Returns the signal to noise and interference ratio of the transmission arriving at the provided receiver.

This function never returns nullptr as long as the transmission is live on the medium.

Implements inet::physicallayer::IRadioMedium.

373 {
375  const ISnir *snir = communicationCache->getCachedSNIR(receiver, transmission);
376  if (snir)
378  else {
379  const IReception *reception = getReception(receiver, transmission);
380  const INoise *noise = getNoise(receiver, transmission);
381  snir = analogModel->computeSNIR(reception, noise);
382  communicationCache->setCachedSNIR(receiver, transmission, snir);
383  }
384  return snir;
385 }

Referenced by computeReceptionDecision(), computeReceptionResult(), and isReceptionSuccessful().

◆ getTransmission()

const ITransmission * inet::physicallayer::RadioMedium::getTransmission ( int  id) const
overridevirtual

Returns transmission instance from medium by id.

May return a nullptr if no matching transmission is registered.

Implements inet::physicallayer::IRadioMedium.

598 {
600 }

◆ handleMessage()

void inet::physicallayer::RadioMedium::handleMessage ( cMessage *  message)
overrideprotectedvirtual
163 {
166  else
167  throw cRuntimeError("Unknown message");
168 }

◆ initialize()

void inet::physicallayer::RadioMedium::initialize ( int  stage)
overrideprotectedvirtual
75 {
76  if (stage == INITSTAGE_LOCAL) {
77  // initialize parameters
78  propagation = check_and_cast<IPropagation *>(getSubmodule("propagation"));
79  pathLoss = check_and_cast<IPathLoss *>(getSubmodule("pathLoss"));
80  obstacleLoss = dynamic_cast<IObstacleLoss *>(getSubmodule("obstacleLoss"));
81  analogModel = check_and_cast<IAnalogModel *>(getSubmodule("analogModel"));
82  backgroundNoise = dynamic_cast<IBackgroundNoise *>(getSubmodule("backgroundNoise"));
83  mediumLimitCache = check_and_cast<IMediumLimitCache *>(getSubmodule("mediumLimitCache"));
84  neighborCache = dynamic_cast<INeighborCache *>(getSubmodule("neighborCache"));
85  communicationCache = check_and_cast<ICommunicationCache *>(getSubmodule("communicationCache"));
86  physicalEnvironment = dynamic_cast<physicalenvironment::IPhysicalEnvironment *>(findModuleByPath(par("physicalEnvironmentModule")));
88  const char *rangeFilterString = par("rangeFilter");
89  if (!strcmp(rangeFilterString, ""))
91  else if (!strcmp(rangeFilterString, "interferenceRange"))
93  else if (!strcmp(rangeFilterString, "communicationRange"))
95  else
96  throw cRuntimeError("Unknown range filter: '%d'", rangeFilter);
97  radioModeFilter = par("radioModeFilter");
98  listeningFilter = par("listeningFilter");
99  macAddressFilter = par("macAddressFilter");
100  // initialize timers
101  removeNonInterferingTransmissionsTimer = new cMessage("removeNonInterferingTransmissions");
102  // initialize logging
103  recordTransmissionLog = par("recordTransmissionLog");
104  recordReceptionLog = par("recordReceptionLog");
107  }
108  else if (stage == INITSTAGE_LAST)
109  EV_INFO << "Initialized " << getCompleteStringRepresentation() << endl;
110 }

◆ isInCommunicationRange()

bool inet::physicallayer::RadioMedium::isInCommunicationRange ( const ITransmission transmission,
const Coord startPosition,
const Coord endPosition 
) const
protectedvirtual
189 {
190  m maxCommunicationRange = mediumLimitCache->getMaxCommunicationRange();
191  return std::isnan(maxCommunicationRange.get()) ||
192  (transmission->getStartPosition().distance(startPosition) < maxCommunicationRange.get() &&
193  transmission->getEndPosition().distance(endPosition) < maxCommunicationRange.get());
194 }

Referenced by isPotentialReceiver().

◆ isInInterferenceRange()

bool inet::physicallayer::RadioMedium::isInInterferenceRange ( const ITransmission transmission,
const Coord startPosition,
const Coord endPosition 
) const
protectedvirtual
197 {
198  m maxInterferenceRange = mediumLimitCache->getMaxInterferenceRange();
199  return std::isnan(maxInterferenceRange.get()) ||
200  (transmission->getStartPosition().distance(startPosition) < maxInterferenceRange.get() &&
201  transmission->getEndPosition().distance(endPosition) < maxInterferenceRange.get());
202 }

Referenced by isInterferingTransmission(), and isPotentialReceiver().

◆ isInterferingTransmission() [1/2]

bool inet::physicallayer::RadioMedium::isInterferingTransmission ( const ITransmission transmission,
const IListening listening 
) const
protectedvirtual
205 {
206  const IRadio *receiver = listening->getReceiver();
207  const IArrival *arrival = getArrival(receiver, transmission);
208  const simtime_t& minInterferenceTime = mediumLimitCache->getMinInterferenceTime();
209  return transmission->getTransmitterId() != receiver->getId() &&
210  arrival->getEndTime() >= listening->getStartTime() + minInterferenceTime &&
211  arrival->getStartTime() <= listening->getEndTime() - minInterferenceTime &&
212  isInInterferenceRange(transmission, listening->getStartPosition(), listening->getEndPosition());
213 }

Referenced by computeInterferingReceptions().

◆ isInterferingTransmission() [2/2]

bool inet::physicallayer::RadioMedium::isInterferingTransmission ( const ITransmission transmission,
const IReception reception 
) const
protectedvirtual
216 {
217  const IRadio *receiver = reception->getReceiver();
218  const IArrival *arrival = getArrival(receiver, transmission);
219  const simtime_t& minInterferenceTime = mediumLimitCache->getMinInterferenceTime();
220  return transmission->getTransmitterId() != receiver->getId() &&
221  arrival->getEndTime() > reception->getStartTime() + minInterferenceTime &&
222  arrival->getStartTime() < reception->getEndTime() - minInterferenceTime &&
223  isInInterferenceRange(transmission, reception->getStartPosition(), reception->getEndPosition());
224 }

◆ isPotentialReceiver()

bool inet::physicallayer::RadioMedium::isPotentialReceiver ( const IRadio receiver,
const ITransmission transmission 
) const
protectedvirtual

Returns true if the radio can potentially receive the transmission successfully.

If this function returns false then the radio medium doesn't send a signal to this receiver.

611 {
612  const Radio *receiverRadio = dynamic_cast<const Radio *>(radio);
613  if (radioModeFilter && receiverRadio != nullptr && receiverRadio->getRadioMode() != IRadio::RADIO_MODE_RECEIVER && receiverRadio->getRadioMode() != IRadio::RADIO_MODE_TRANSCEIVER)
614  return false;
615  else if (listeningFilter && radio->getReceiver() != nullptr && !radio->getReceiver()->computeIsReceptionPossible(getListening(radio, transmission), transmission))
616  return false;
617  // TODO where is the tag?
618  else if (macAddressFilter && !matchesMacAddressFilter(radio, transmission->getPacket()))
619  return false;
621  const IArrival *arrival = getArrival(radio, transmission);
622  return isInInterferenceRange(transmission, arrival->getStartPosition(), arrival->getEndPosition());
623  }
625  const IArrival *arrival = getArrival(radio, transmission);
626  return isInCommunicationRange(transmission, arrival->getStartPosition(), arrival->getEndPosition());
627  }
628  else
629  return true;
630 }

Referenced by pickUpSignals(), and sendToRadio().

◆ isReceptionAttempted()

bool inet::physicallayer::RadioMedium::isReceptionAttempted ( const IRadio receiver,
const ITransmission transmission,
IRadioSignal::SignalPart  part 
) const
overridevirtual

Returns true when the reception is attempted of the transmission part.

Implements inet::physicallayer::IRadioMedium.

644 {
645  const IReception *reception = getReception(receiver, transmission);
646  const IListening *listening = getListening(receiver, transmission);
647  // TODO why compute?
648  const IInterference *interference = computeInterference(receiver, listening, transmission);
649  bool isReceptionAttempted = receiver->getReceiver()->computeIsReceptionAttempted(listening, reception, part, interference);
650  delete interference;
651  return isReceptionAttempted;
652 }

◆ isReceptionPossible()

bool inet::physicallayer::RadioMedium::isReceptionPossible ( const IRadio receiver,
const ITransmission transmission,
IRadioSignal::SignalPart  part 
) const
overridevirtual

Returns true when the reception is possible of the transmission part.

Implements inet::physicallayer::IRadioMedium.

633 {
634  const IReception *reception = getReception(receiver, transmission);
635  const IListening *listening = getListening(receiver, transmission);
636  // TODO why compute?
637  const IInterference *interference = computeInterference(receiver, listening, transmission);
638  bool isReceptionPossible = receiver->getReceiver()->computeIsReceptionAttempted(listening, reception, part, interference);
639  delete interference;
640  return isReceptionPossible;
641 }

◆ isReceptionSuccessful()

bool inet::physicallayer::RadioMedium::isReceptionSuccessful ( const IRadio receiver,
const ITransmission transmission,
IRadioSignal::SignalPart  part 
) const
overridevirtual

Returns true when the reception is successful of the transmission part.

Implements inet::physicallayer::IRadioMedium.

655 {
656  const IReception *reception = getReception(receiver, transmission);
657  const IListening *listening = getListening(receiver, transmission);
658  // TODO why compute?
659  const IInterference *interference = computeInterference(receiver, listening, transmission);
660  const ISnir *snir = getSNIR(receiver, transmission);
661  bool isReceptionSuccessful = receiver->getReceiver()->computeIsReceptionSuccessful(listening, reception, part, interference, snir);
662  delete interference;
663  return isReceptionSuccessful;
664 }

◆ listenOnMedium()

const IListeningDecision * inet::physicallayer::RadioMedium::listenOnMedium ( const IRadio receiver,
const IListening listening 
) const
overridevirtual

Returns the listening decision that describes what the receiver detects on the medium.

Implements inet::physicallayer::IRadioMedium.

603 {
604  Enter_Method("listenOnMedium");
605  const IListeningDecision *decision = computeListeningDecision(radio, listening);
606  EV_DEBUG << "Listening results in: " << decision << " with " << listening << " on medium by " << radio << endl;
607  return decision;
608 }

◆ matchesMacAddressFilter()

bool inet::physicallayer::RadioMedium::matchesMacAddressFilter ( const IRadio radio,
const Packet packet 
) const
protectedvirtual
171 {
172  const auto& macAddressReq = const_cast<Packet *>(packet)->findTag<MacAddressInd>();
173  if (macAddressReq == nullptr)
174  return true;
175  const MacAddress address = macAddressReq->getDestAddress();
176  if (address.isBroadcast() || address.isMulticast())
177  return true;
178  cModule *host = getContainingNode(check_and_cast<const cModule *>(radio));
179  IInterfaceTable *interfaceTable = check_and_cast<IInterfaceTable *>(host->getSubmodule("interfaceTable"));
180  for (int i = 0; i < interfaceTable->getNumInterfaces(); i++) {
181  const NetworkInterface *interface = interfaceTable->getInterface(i);
182  if (interface && interface->getMacAddress() == address)
183  return true;
184  }
185  return false;
186 }

Referenced by isPotentialReceiver().

◆ numInitStages()

virtual int inet::physicallayer::RadioMedium::numInitStages ( ) const
inlineoverrideprotectedvirtual
218 { return NUM_INIT_STAGES; }

◆ pickUpSignals()

void inet::physicallayer::RadioMedium::pickUpSignals ( IRadio receiver)
protectedvirtual

Sends a copy of all ongoing signals to the receiver on the radio medium.

674 {
675  communicationCache->mapTransmissions([&] (const ITransmission *transmission) {
676  auto transmitterRadio = dynamic_cast<const Radio *>(getRadio(transmission->getTransmitterId()));
677  if (!transmitterRadio)
678  return;
679  if (communicationCache->getCachedSignal(receiverRadio, transmission) == nullptr &&
680  receiverRadio != transmitterRadio && isPotentialReceiver(receiverRadio, transmission))
681  {
682  const IArrival *arrival = getArrival(receiverRadio, transmission);
683  if (arrival->getEndTime() >= simTime()) {
684  cMethodCallContextSwitcher contextSwitcher(transmitterRadio);
685  contextSwitcher.methodCall("sendToRadio");
686  const Packet *packet = transmission->getPacket();
687  EV_DEBUG << "Picking up " << packet << " originally sent "
688  << " from " << (IRadio *)transmitterRadio << " at " << transmission->getStartPosition()
689  << " to " << (IRadio *)receiverRadio << " at " << arrival->getStartPosition()
690  << " in " << arrival->getStartPropagationTime() * 1E+6 << " us propagation time." << endl;
691  auto signal = static_cast<WirelessSignal *>(createReceiverSignal(transmission));
692  simtime_t delay = arrival->getStartTime() - simTime();
693  simtime_t duration = delay > 0 ? signal->getDuration() : signal->getDuration() + delay;
694  cGate *gate = receiverRadio->getRadioGate()->getPathStartGate();
695  const_cast<Radio *>(transmitterRadio)->sendDirect(signal, delay > 0 ? delay : 0, duration, gate);
696  communicationCache->setCachedSignal(receiverRadio, transmission, signal);
697  signalSendCount++;
698  }
699  }
700  });
701 }

Referenced by receiveSignal().

◆ printToStream()

std::ostream & inet::physicallayer::RadioMedium::printToStream ( std::ostream &  stream,
int  level,
int  evFlags = 0 
) const
overridevirtual

Prints this object to the provided output stream.

Reimplemented from inet::IPrintableObject.

147 {
148  stream << static_cast<const cSimpleModule *>(this);
149  if (level <= PRINT_LEVEL_TRACE) {
158  }
159  return stream;
160 }

◆ receivePacket()

Packet * inet::physicallayer::RadioMedium::receivePacket ( const IRadio receiver,
IWirelessSignal signal 
)
overridevirtual

Returns the packet that was transmitted in the provided signal.

Implements inet::physicallayer::IRadioMedium.

584 {
585  Enter_Method("receivePacket");
586  const ITransmission *transmission = signal->getTransmission();
587  const IListening *listening = communicationCache->getCachedListening(radio, transmission);
588  if (recordReceptionLog)
589  communicationLog.writeReception(radio, signal);
590  const IReceptionResult *result = getReceptionResult(radio, listening, transmission);
591  communicationCache->removeCachedReceptionResult(radio, transmission);
592  Packet *packet = result->getPacket()->dup();
593  delete result;
594  return packet;
595 }

◆ receiveSignal() [1/2]

void inet::physicallayer::RadioMedium::receiveSignal ( cComponent *  source,
simsignal_t  signal,
cObject *  value,
cObject *  details 
)
overridevirtual
728 {
729  Enter_Method("%s", cComponent::getSignalName(signal));
730 
731  if (signal == interfaceConfigChangedSignal) {
732  Enter_Method("interfaceConfigChanged");
733  auto interfaceChange = check_and_cast<NetworkInterfaceChangeDetails *>(value);
734  if (interfaceChange->getFieldId() == NetworkInterface::F_MACADDRESS) {
735  auto radio = check_and_cast<Radio *>(interfaceChange->getNetworkInterface()->getSubmodule("radio"));
736  pickUpSignals(radio);
737  }
738  }
739  else
740  throw cRuntimeError("Unknown signal");
741 }

◆ receiveSignal() [2/2]

void inet::physicallayer::RadioMedium::receiveSignal ( cComponent *  source,
simsignal_t  signal,
intval_t  value,
cObject *  details 
)
overridevirtual
704 {
705  Enter_Method("%s", cComponent::getSignalName(signal));
706 
707  if (signal == IRadio::radioModeChangedSignal) {
708  Enter_Method("radioModeChanged");
709  auto radio = check_and_cast<Radio *>(source);
710  pickUpSignals(radio);
711  }
712  else if (signal == IRadio::listeningChangedSignal) {
713  Enter_Method("listeningChanged");
714  auto radio = check_and_cast<Radio *>(source);
715  communicationCache->mapTransmissions([&] (const ITransmission *transmission) {
716  const IArrival *arrival = getArrival(radio, transmission);
717  const IListening *listening = radio->getReceiver()->createListening(radio, arrival->getStartTime(), arrival->getEndTime(), arrival->getStartPosition(), arrival->getEndPosition());
718  delete communicationCache->getCachedListening(radio, transmission);
719  communicationCache->setCachedListening(radio, transmission, listening);
720  });
721  pickUpSignals(radio);
722  }
723  else
724  throw cRuntimeError("Unknown signal");
725 }

◆ removeNonInterferingTransmissions()

void inet::physicallayer::RadioMedium::removeNonInterferingTransmissions ( )
protectedvirtual

Removes all cached data related to past transmissions that don't have any effect on any ongoing transmission.

Note that it's possible that a transmission is in the past but it's still needed to compute the total interference for another.

227 {
228  communicationCache->removeNonInterferingTransmissions([&] (const ITransmission *transmission) {
229  emit(signalRemovedSignal, check_and_cast<const cObject *>(transmission));
230  });
231  communicationCache->mapTransmissions([&] (const ITransmission *transmission) {
232  auto interferenceEndTime = communicationCache->getCachedInterferenceEndTime(transmission);
233  if (!removeNonInterferingTransmissionsTimer->isScheduled() && interferenceEndTime > simTime())
234  scheduleAt(interferenceEndTime, removeNonInterferingTransmissionsTimer);
235  });
236 }

Referenced by handleMessage().

◆ removeRadio()

void inet::physicallayer::RadioMedium::removeRadio ( const IRadio radio)
overridevirtual

Removes a radio from the medium.

An exception is thrown if the radio is not yet added. The radio cannot start new transmissions and will not receive any further transmission including the ongoing ones.

Implements inet::physicallayer::IRadioMedium.

439 {
440  Enter_Method("removeRadio");
442  if (neighborCache)
443  neighborCache->removeRadio(radio);
445  cModule *radioModule = const_cast<cModule *>(check_and_cast<const cModule *>(radio));
446  if (radioModeFilter)
447  radioModule->unsubscribe(IRadio::radioModeChangedSignal, this);
448  if (listeningFilter)
449  radioModule->unsubscribe(IRadio::listeningChangedSignal, this);
450  if (macAddressFilter)
451  getContainingNode(radioModule)->unsubscribe(interfaceConfigChangedSignal, this);
452  emit(radioRemovedSignal, radioModule);
453 }

◆ removeTransmission()

void inet::physicallayer::RadioMedium::removeTransmission ( const ITransmission transmission)
protectedvirtual

Removes a transmission from the radio medium.

486 {
487  Enter_Method("removeTranmsission");
488  emit(signalRemovedSignal, check_and_cast<const cObject *>(transmission));
489  communicationCache->removeTransmission(transmission);
490 }

◆ sendToAffectedRadios()

void inet::physicallayer::RadioMedium::sendToAffectedRadios ( IRadio transmitter,
const IWirelessSignal signal 
)
protectedvirtual

Sends a copy of the provided signal to all affected receivers on the radio medium.

525 {
526  const WirelessSignal *signal = check_and_cast<const WirelessSignal *>(transmittedSignal);
527  EV_DEBUG << "Sending " << transmittedSignal << " with " << signal->getBitLength() << " bits in " << signal->getDuration() * 1E+6 << " us transmission duration"
528  << " from " << radio << " on " << (IRadioMedium *)this << "." << endl;
530  double range;
534  range = mediumLimitCache->getMaxInterferenceRange(radio).get();
535  else
536  throw cRuntimeError("Unknown range filter %d", rangeFilter);
537  if (std::isnan(range)) {
538  EV_WARN << "We can't use the NeighborCache for radio " << radio->getId() << ": range is NaN" << endl;
539  sendToAllRadios(radio, transmittedSignal);
540  }
541  else
542  neighborCache->sendToNeighbors(radio, transmittedSignal, range);
543  }
544  else
545  sendToAllRadios(radio, transmittedSignal);
546 
547 }

Referenced by transmitPacket().

◆ sendToAllRadios()

void inet::physicallayer::RadioMedium::sendToAllRadios ( IRadio transmitter,
const IWirelessSignal signal 
)
protectedvirtual

Sends a copy of the provided signal to all receivers on the radio medium.

667 {
668  communicationCache->mapRadios([&] (const IRadio *radio) {
669  sendToRadio(transmitter, radio, signal);
670  });
671 }

Referenced by sendToAffectedRadios().

◆ sendToRadio()

void inet::physicallayer::RadioMedium::sendToRadio ( IRadio trasmitter,
const IRadio receiver,
const IWirelessSignal signal 
)
virtual
550 {
551  const ITransmission *transmission = transmittedSignal->getTransmission();
552  if (receiver != transmitter && receiver->getReceiver() != nullptr && isPotentialReceiver(receiver, transmission)) {
553  auto transmitterRadio = const_cast<cSimpleModule *>(check_and_cast<const cSimpleModule *>(transmitter));
554  cMethodCallContextSwitcher contextSwitcher(transmitterRadio);
555  contextSwitcher.methodCall("sendToRadio");
556  const IArrival *arrival = getArrival(receiver, transmission);
557  simtime_t propagationTime = arrival->getStartPropagationTime();
558  EV_DEBUG << "Sending " << transmittedSignal
559  << " from " << transmitter << " at " << transmission->getStartPosition()
560  << " to " << receiver << " at " << arrival->getStartPosition()
561  << " in " << propagationTime * 1E+6 << " us propagation time." << endl;
562  auto receivedSignal = static_cast<WirelessSignal *>(createReceiverSignal(transmission));
563  cGate *gate = receiver->getRadioGate()->getPathStartGate();
564  transmitterRadio->sendDirect(receivedSignal, propagationTime, transmission->getDuration(), gate);
565  communicationCache->setCachedSignal(receiver, transmission, receivedSignal);
566  signalSendCount++;
567  }
568 }

Referenced by sendToAllRadios(), inet::physicallayer::GridNeighborCache::GridNeighborCacheVisitor::visit(), and inet::physicallayer::QuadTreeNeighborCache::QuadTreeNeighborCacheVisitor::visit().

◆ transmitPacket()

IWirelessSignal * inet::physicallayer::RadioMedium::transmitPacket ( const IRadio transmitter,
Packet packet 
)
overridevirtual

Returns a new signal containing the signal transmission that represents the provided packet.

A copy of this signal is sent to all affected radios.

Implements inet::physicallayer::IRadioMedium.

571 {
572  Enter_Method("transmitPacket");
573  auto signal = createTransmitterSignal(radio, packet);
574  auto transmission = signal->getTransmission();
575  addTransmission(radio, transmission);
577  communicationLog.writeTransmission(radio, signal);
578  sendToAffectedRadios(const_cast<IRadio *>(radio), signal);
579  communicationCache->setCachedSignal(transmission, signal);
580  return signal;
581 }

Member Data Documentation

◆ analogModel

const IAnalogModel* inet::physicallayer::RadioMedium::analogModel
protected

The analog model is never nullptr.

Referenced by computeReception(), getNoise(), getSNIR(), initialize(), and printToStream().

◆ backgroundNoise

const IBackgroundNoise* inet::physicallayer::RadioMedium::backgroundNoise
protected

The background noise model or nullptr if unused.

Referenced by computeInterference(), initialize(), and printToStream().

◆ cacheDecisionGetCount

long inet::physicallayer::RadioMedium::cacheDecisionGetCount
mutableprotected

Total number of reception decision cache queries.

Referenced by finish(), and getReceptionDecision().

◆ cacheDecisionHitCount

long inet::physicallayer::RadioMedium::cacheDecisionHitCount
mutableprotected

Total number of reception decision cache hits.

Referenced by finish(), and getReceptionDecision().

◆ cacheInterferenceGetCount

long inet::physicallayer::RadioMedium::cacheInterferenceGetCount
mutableprotected

Total number of interference cache queries.

Referenced by finish(), and getInterference().

◆ cacheInterferenceHitCount

long inet::physicallayer::RadioMedium::cacheInterferenceHitCount
mutableprotected

Total number of interference cache hits.

Referenced by finish(), and getInterference().

◆ cacheNoiseGetCount

long inet::physicallayer::RadioMedium::cacheNoiseGetCount
mutableprotected

Total number of noise cache queries.

Referenced by finish(), and getNoise().

◆ cacheNoiseHitCount

long inet::physicallayer::RadioMedium::cacheNoiseHitCount
mutableprotected

Total number of noise cache hits.

Referenced by finish(), and getNoise().

◆ cacheReceptionGetCount

long inet::physicallayer::RadioMedium::cacheReceptionGetCount
mutableprotected

Total number of reception cache queries.

Referenced by finish(), and getReception().

◆ cacheReceptionHitCount

long inet::physicallayer::RadioMedium::cacheReceptionHitCount
mutableprotected

Total number of reception cache hits.

Referenced by finish(), and getReception().

◆ cacheResultGetCount

long inet::physicallayer::RadioMedium::cacheResultGetCount
mutableprotected

Total number of reception result cache queries.

Referenced by finish(), and getReceptionResult().

◆ cacheResultHitCount

long inet::physicallayer::RadioMedium::cacheResultHitCount
mutableprotected

Total number of reception result cache hits.

Referenced by finish(), and getReceptionResult().

◆ cacheSNIRGetCount

long inet::physicallayer::RadioMedium::cacheSNIRGetCount
mutableprotected

Total number of SNIR cache queries.

Referenced by finish(), and getSNIR().

◆ cacheSNIRHitCount

long inet::physicallayer::RadioMedium::cacheSNIRHitCount
mutableprotected

Total number of SNIR cache hits.

Referenced by finish(), and getSNIR().

◆ communicationCache

◆ communicationLog

CommunicationLog inet::physicallayer::RadioMedium::communicationLog
protected

The communication log output recorder.

Referenced by initialize(), receivePacket(), transmitPacket(), and ~RadioMedium().

◆ interferenceComputationCount

long inet::physicallayer::RadioMedium::interferenceComputationCount
mutableprotected

Total number of interference computations.

Referenced by computeInterference(), and finish().

◆ listeningDecisionComputationCount

long inet::physicallayer::RadioMedium::listeningDecisionComputationCount
mutableprotected

Total number of listening decision computations.

Referenced by computeListeningDecision(), and finish().

◆ listeningFilter

bool inet::physicallayer::RadioMedium::listeningFilter
protected

True means the radio medium doesn't send signals to a radio if it listens on the medium in incompatible mode (e.g.

different carrier frequency and/or bandwidth, different modulation, etc.)

Referenced by addRadio(), initialize(), isPotentialReceiver(), and removeRadio().

◆ macAddressFilter

bool inet::physicallayer::RadioMedium::macAddressFilter
protected

True means the radio medium doesn't send signals to a radio if the mac address of the destination is different.

Referenced by addRadio(), initialize(), isPotentialReceiver(), and removeRadio().

◆ material

const physicalenvironment::IMaterial* inet::physicallayer::RadioMedium::material
protected

The physical material of the medium is never nullptr.

Referenced by initialize().

◆ mediumLimitCache

IMediumLimitCache* inet::physicallayer::RadioMedium::mediumLimitCache
mutableprotected

◆ neighborCache

INeighborCache* inet::physicallayer::RadioMedium::neighborCache
mutableprotected

Caches neighbors for all radios or nullptr if turned off.

Referenced by addRadio(), initialize(), printToStream(), removeRadio(), and sendToAffectedRadios().

◆ obstacleLoss

const IObstacleLoss* inet::physicallayer::RadioMedium::obstacleLoss
protected

The obstacle loss model or nullptr if unused.

Referenced by initialize(), and printToStream().

◆ pathLoss

const IPathLoss* inet::physicallayer::RadioMedium::pathLoss
protected

The path loss model is never nullptr.

Referenced by initialize(), and printToStream().

◆ physicalEnvironment

const physicalenvironment::IPhysicalEnvironment* inet::physicallayer::RadioMedium::physicalEnvironment
protected

The physical environment model or nullptr if unused.

Referenced by initialize().

◆ propagation

const IPropagation* inet::physicallayer::RadioMedium::propagation
protected

The propagation model is never nullptr.

Referenced by addRadio(), initialize(), and printToStream().

◆ Radio

friend inet::physicallayer::RadioMedium::Radio
private

◆ radioModeFilter

bool inet::physicallayer::RadioMedium::radioModeFilter
protected

True means the radio medium doesn't send signals to a radio if it's neither in receiver nor in transceiver mode.

Referenced by addRadio(), initialize(), isPotentialReceiver(), and removeRadio().

◆ rangeFilter

RangeFilterKind inet::physicallayer::RadioMedium::rangeFilter
protected

The radio medium doesn't send signals to a radio if it's outside the range provided by the selected range filter.

Referenced by initialize(), isPotentialReceiver(), and sendToAffectedRadios().

◆ receptionComputationCount

long inet::physicallayer::RadioMedium::receptionComputationCount
mutableprotected

Total number of reception computations.

Referenced by computeReception(), and finish().

◆ receptionDecisionComputationCount

long inet::physicallayer::RadioMedium::receptionDecisionComputationCount
mutableprotected

Total number of data reception decision computations.

Referenced by computeReceptionDecision(), and finish().

◆ receptionResultComputationCount

long inet::physicallayer::RadioMedium::receptionResultComputationCount
mutableprotected

Total number of data reception result computations.

Referenced by computeReceptionResult().

◆ recordReceptionLog

bool inet::physicallayer::RadioMedium::recordReceptionLog
protected

◆ recordTransmissionLog

bool inet::physicallayer::RadioMedium::recordTransmissionLog
protected

Records all transmissions (if recordTransmissionLog is enabled) and receptions (if recordReceptionLog is enabled) into a separate trace file.

The communication log file can be found at: ${resultdir}/${configname}-${runnumber}.tlog

Referenced by initialize(), transmitPacket(), and ~RadioMedium().

◆ removeNonInterferingTransmissionsTimer

cMessage* inet::physicallayer::RadioMedium::removeNonInterferingTransmissionsTimer
protected

The message that is used to purge the internal state of the medium.

Referenced by addTransmission(), handleMessage(), initialize(), removeNonInterferingTransmissions(), and ~RadioMedium().

◆ signalSendCount

long inet::physicallayer::RadioMedium::signalSendCount
mutableprotected

Total number of signal sends.

Referenced by finish(), pickUpSignals(), and sendToRadio().

◆ transmissionCount

long inet::physicallayer::RadioMedium::transmissionCount
mutableprotected

Total number of transmissions.

Referenced by addTransmission(), and finish().


The documentation for this class was generated from the following files:
inet::physicallayer::RadioMedium::receptionComputationCount
long receptionComputationCount
Total number of reception computations.
Definition: RadioMedium.h:148
inet::physicallayer::RadioMedium::listeningDecisionComputationCount
long listeningDecisionComputationCount
Total number of listening decision computations.
Definition: RadioMedium.h:164
inet::physicallayer::RadioMedium::cacheResultGetCount
long cacheResultGetCount
Total number of reception result cache queries.
Definition: RadioMedium.h:208
inet::physicallayer::IRadioSignal::SIGNAL_PART_WHOLE
@ SIGNAL_PART_WHOLE
Definition: IRadioSignal.h:26
inet::INITSTAGE_LAST
INET_API InitStage INITSTAGE_LAST
Operations that no other initializations can depend on, e.g.
inet::physicallayer::RadioMedium::communicationCache
ICommunicationCache * communicationCache
Caches list of radios and transmissions along with intermediate results.
Definition: RadioMedium.h:124
inet::physicallayer::IMediumLimitCache::getMaxCommunicationRange
virtual m getMaxCommunicationRange() const =0
Returns the maximum possible communication range among the radios, the value is in the range [0,...
inet::physicallayer::ICommunicationCache::setCachedArrival
virtual void setCachedArrival(const IRadio *receiver, const ITransmission *transmission, const IArrival *arrival)=0
inet::physicallayer::ICommunicationCache::setCachedReceptionDecision
virtual void setCachedReceptionDecision(const IRadio *receiver, const ITransmission *transmission, IRadioSignal::SignalPart part, const IReceptionDecision *receptionDecision)=0
inet::physicallayer::IRadio::RADIO_MODE_TRANSCEIVER
@ RADIO_MODE_TRANSCEIVER
The radio is prepared for simultaneous frame reception and transmission, power consumption is low whe...
Definition: IRadio.h:111
inet::physicallayer::RadioMedium::obstacleLoss
const IObstacleLoss * obstacleLoss
The obstacle loss model or nullptr if unused.
Definition: RadioMedium.h:56
inet::physicallayer::ICommunicationCache::getCachedReception
virtual const IReception * getCachedReception(const IRadio *receiver, const ITransmission *transmission)=0
inet::physicallayer::ICommunicationCache::getCachedNoise
virtual const INoise * getCachedNoise(const IRadio *receiver, const ITransmission *transmission)=0
inet::physicallayer::RadioMedium::getSNIR
virtual const ISnir * getSNIR(const IRadio *receiver, const ITransmission *transmission) const override
Returns the signal to noise and interference ratio of the transmission arriving at the provided recei...
Definition: RadioMedium.cc:372
inet::physicalenvironment::IPhysicalEnvironment::getMaterialRegistry
virtual const IMaterialRegistry * getMaterialRegistry() const =0
inet::physicallayer::IRadioMedium::radioAddedSignal
static simsignal_t radioAddedSignal
This simsignal is emitted when a radio is added to the medium.
Definition: IRadioMedium.h:45
inet::physicallayer::RadioMedium::computeListeningDecision
virtual const IListeningDecision * computeListeningDecision(const IRadio *receiver, const IListening *listening) const
Definition: RadioMedium.cc:306
inet::physicallayer::RadioMedium::backgroundNoise
const IBackgroundNoise * backgroundNoise
The background noise model or nullptr if unused.
Definition: RadioMedium.h:64
inet::physicallayer::CommunicationLog::close
virtual void close()
Definition: CommunicationLog.cc:20
inet::physicallayer::RadioMedium::sendToAffectedRadios
virtual void sendToAffectedRadios(IRadio *transmitter, const IWirelessSignal *signal)
Sends a copy of the provided signal to all affected receivers on the radio medium.
Definition: RadioMedium.cc:524
inet::physicallayer::RadioMedium::rangeFilter
RangeFilterKind rangeFilter
The radio medium doesn't send signals to a radio if it's outside the range provided by the selected r...
Definition: RadioMedium.h:77
inet::physicallayer::RadioMedium::createTransmitterSignal
virtual IWirelessSignal * createTransmitterSignal(const IRadio *radio, Packet *packet)
Creates a new signal for the transmitter.
Definition: RadioMedium.cc:492
inet::physicallayer::RadioMedium::isInInterferenceRange
virtual bool isInInterferenceRange(const ITransmission *transmission, const Coord &startPosition, const Coord &endPosition) const
Definition: RadioMedium.cc:196
inet::physicallayer::ICommunicationCache::computeInterferingTransmissions
virtual std::vector< const ITransmission * > * computeInterferingTransmissions(const IRadio *radio, const simtime_t startTime, const simtime_t endTime)=0
inet::physicallayer::RadioMedium::RANGE_FILTER_COMMUNICATION_RANGE
@ RANGE_FILTER_COMMUNICATION_RANGE
Definition: RadioMedium.h:39
inet::physicallayer::IMediumLimitCache::addRadio
virtual void addRadio(const IRadio *radio)=0
Notifies the cache when a radio is added to the medium.
inet::physicallayer::RadioMedium::cacheReceptionGetCount
long cacheReceptionGetCount
Total number of reception cache queries.
Definition: RadioMedium.h:168
inet::physicallayer::RadioMedium::isReceptionSuccessful
virtual bool isReceptionSuccessful(const IRadio *receiver, const ITransmission *transmission, IRadioSignal::SignalPart part) const override
Returns true when the reception is successful of the transmission part.
Definition: RadioMedium.cc:654
inet::physicallayer::RadioMedium::addTransmission
virtual void addTransmission(const IRadio *transmitter, const ITransmission *transmission)
Adds a new transmission to the radio medium.
Definition: RadioMedium.cc:460
inet::getContainingNode
cModule * getContainingNode(const cModule *from)
Find the node containing the given module.
Definition: ModuleAccess.cc:40
inet::physicallayer::ICommunicationCache::getCachedArrival
virtual const IArrival * getCachedArrival(const IRadio *receiver, const ITransmission *transmission)=0
inet::NetworkInterface::F_MACADDRESS
@ F_MACADDRESS
Definition: NetworkInterface.h:149
inet::physicallayer::IAnalogModel::computeNoise
virtual const INoise * computeNoise(const IListening *listening, const IInterference *interference) const =0
Returns the total noise summing up all the interfering receptions and noises.
inet::physicallayer::RadioMedium::macAddressFilter
bool macAddressFilter
True means the radio medium doesn't send signals to a radio if the mac address of the destination is ...
Definition: RadioMedium.h:93
inet::physicallayer::RadioMedium::getInterference
virtual const IInterference * getInterference(const IRadio *receiver, const ITransmission *transmission) const override
Returns the interference of the transmission arriving at the provided receiver.
Definition: RadioMedium.cc:339
inet::physicallayer::RadioMedium::transmissionCount
long transmissionCount
Total number of transmissions.
Definition: RadioMedium.h:140
inet::physicallayer::ICommunicationCache::mapRadios
virtual void mapRadios(std::function< void(const IRadio *)> f) const =0
inet::physicallayer::ICommunicationCache::getCachedInterferenceEndTime
virtual const simtime_t getCachedInterferenceEndTime(const ITransmission *transmission)=0
inet::physicallayer::RadioMedium::removeNonInterferingTransmissions
virtual void removeNonInterferingTransmissions()
Removes all cached data related to past transmissions that don't have any effect on any ongoing trans...
Definition: RadioMedium.cc:226
inet::physicallayer::CommunicationLog::writeReception
virtual void writeReception(const IRadio *receiver, const IWirelessSignal *signal)
Definition: CommunicationLog.cc:35
inet::physicallayer::RadioMedium::listeningFilter
bool listeningFilter
True means the radio medium doesn't send signals to a radio if it listens on the medium in incompatib...
Definition: RadioMedium.h:88
inet::physicallayer::ICommunicationCache::setCachedSignal
virtual void setCachedSignal(const ITransmission *transmission, const IWirelessSignal *signal)=0
inet::physicallayer::RadioMedium::RANGE_FILTER_ANYWHERE
@ RANGE_FILTER_ANYWHERE
Definition: RadioMedium.h:37
inet::physicallayer::ICommunicationCache::removeRadio
virtual void removeRadio(const IRadio *radio)=0
inet::physicallayer::RadioMedium::material
const physicalenvironment::IMaterial * material
The physical material of the medium is never nullptr.
Definition: RadioMedium.h:72
inet::physicallayer::RadioMedium::getArrival
virtual const IArrival * getArrival(const IRadio *receiver, const ITransmission *transmission) const override
Returns the space and time coordinates of the transmission arriving at the provided receiver.
Definition: RadioMedium.cc:315
inet::physicallayer::RadioMedium::signalSendCount
long signalSendCount
Total number of signal sends.
Definition: RadioMedium.h:144
inet::physicallayer::ICommunicationCache::addTransmission
virtual void addTransmission(const ITransmission *transmission)=0
inet::physicallayer::ICommunicationCache::setCachedInterference
virtual void setCachedInterference(const IRadio *receiver, const ITransmission *transmission, const IInterference *interference)=0
inet::physicallayer::RadioMedium::cacheInterferenceGetCount
long cacheInterferenceGetCount
Total number of interference cache queries.
Definition: RadioMedium.h:176
inet::physicallayer::RadioMedium::getListening
virtual const IListening * getListening(const IRadio *receiver, const ITransmission *transmission) const override
Returns how the radio is listening on the medium when the transmission arrives at the provided receiv...
Definition: RadioMedium.cc:320
inet::physicallayer::RadioMedium::analogModel
const IAnalogModel * analogModel
The analog model is never nullptr.
Definition: RadioMedium.h:60
inet::physicallayer::RadioMedium::isInCommunicationRange
virtual bool isInCommunicationRange(const ITransmission *transmission, const Coord &startPosition, const Coord &endPosition) const
Definition: RadioMedium.cc:188
inet::physicallayer::RadioMedium::interferenceComputationCount
long interferenceComputationCount
Total number of interference computations.
Definition: RadioMedium.h:152
inet::physicallayer::RadioMedium::Radio
friend Radio
Definition: RadioMedium.h:33
inet::physicallayer::INeighborCache::addRadio
virtual void addRadio(const IRadio *radio)=0
PacketProtocolTag
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down PacketProtocolTag
Definition: IUdp-gates.txt:25
inet::physicallayer::RadioMedium::cacheNoiseGetCount
long cacheNoiseGetCount
Total number of noise cache queries.
Definition: RadioMedium.h:184
inet::physicallayer::IMediumLimitCache::getMaxInterferenceRange
virtual m getMaxInterferenceRange() const =0
Returns the maximum possible interference range among the radios, the value is in the range [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::physicallayer::RadioMedium::recordReceptionLog
bool recordReceptionLog
Definition: RadioMedium.h:100
inet::physicallayer::RadioMedium::RANGE_FILTER_INTERFERENCE_RANGE
@ RANGE_FILTER_INTERFERENCE_RANGE
Definition: RadioMedium.h:38
inet::printFieldToString
std::string printFieldToString(const IPrintableObject *object, int level, int evFlags=0)
Definition: IPrintableObject.h:98
inet::physicalenvironment::IMaterialRegistry::getMaterial
virtual const Material * getMaterial(const char *name) const =0
inet::IPrintableObject::getCompleteStringRepresentation
virtual std::string getCompleteStringRepresentation(int evFlags=0) const
Definition: IPrintableObject.h:78
inet::physicallayer::INeighborCache::sendToNeighbors
virtual void sendToNeighbors(IRadio *transmitter, const IWirelessSignal *signal, double range) const =0
Sends the provided frame (using the radio medium) to all neighbors within the given range.
inet::physicallayer::RadioMedium::physicalEnvironment
const physicalenvironment::IPhysicalEnvironment * physicalEnvironment
The physical environment model or nullptr if unused.
Definition: RadioMedium.h:68
inet::physicallayer::ICommunicationCache::getCachedListening
virtual const IListening * getCachedListening(const IRadio *receiver, const ITransmission *transmission)=0
inet::physicallayer::ICommunicationCache::removeCachedReceptionResult
virtual void removeCachedReceptionResult(const IRadio *receiver, const ITransmission *transmission)=0
inet::physicallayer::IRadio::RADIO_MODE_RECEIVER
@ RADIO_MODE_RECEIVER
The radio is prepared for frame reception, frame transmission is not possible, power consumption is l...
Definition: IRadio.h:97
inet::physicallayer::ICommunicationCache::getRadio
virtual const IRadio * getRadio(int id) const =0
EV_FIELD
#define EV_FIELD(...)
Definition: INETDefs.h:112
inet::physicallayer::RadioMedium::isPotentialReceiver
virtual bool isPotentialReceiver(const IRadio *receiver, const ITransmission *transmission) const
Returns true if the radio can potentially receive the transmission successfully.
Definition: RadioMedium.cc:610
inet::physicallayer::RadioMedium::matchesMacAddressFilter
virtual bool matchesMacAddressFilter(const IRadio *radio, const Packet *packet) const
Definition: RadioMedium.cc:170
inet::physicallayer::ICommunicationCache::getCachedSignal
virtual const IWirelessSignal * getCachedSignal(const ITransmission *transmission)=0
inet::physicallayer::RadioMedium::getRadio
virtual const IRadio * getRadio(int id) const override
Returns radio instance from medium by id.
Definition: RadioMedium.cc:455
inet::physicallayer::INeighborCache::removeRadio
virtual void removeRadio(const IRadio *radio)=0
inet::physicallayer::RadioMedium::radioModeFilter
bool radioModeFilter
True means the radio medium doesn't send signals to a radio if it's neither in receiver nor in transc...
Definition: RadioMedium.h:82
inet::physicallayer::IRadioMedium::signalAddedSignal
static simsignal_t signalAddedSignal
This simsignal is emitted when a signal is added to the medium.
Definition: IRadioMedium.h:57
inet::physicallayer::IRadio::listeningChangedSignal
static simsignal_t listeningChangedSignal
This signal is emitted when the radio listening of the radio is changed.
Definition: IRadio.h:48
inet::physicallayer::CommunicationLog::open
virtual void open()
Definition: CommunicationLog.cc:15
inet::physicallayer::RadioMedium::isReceptionAttempted
virtual bool isReceptionAttempted(const IRadio *receiver, const ITransmission *transmission, IRadioSignal::SignalPart part) const override
Returns true when the reception is attempted of the transmission part.
Definition: RadioMedium.cc:643
inet::physicallayer::RadioMedium::cacheNoiseHitCount
long cacheNoiseHitCount
Total number of noise cache hits.
Definition: RadioMedium.h:188
inet::physicallayer::RadioMedium::getNoise
virtual const INoise * getNoise(const IRadio *receiver, const ITransmission *transmission) const override
Returns the total noise computed from the interference of the transmission arriving at the provided r...
Definition: RadioMedium.cc:357
inet::physicallayer::RadioMedium::propagation
const IPropagation * propagation
The propagation model is never nullptr.
Definition: RadioMedium.h:48
inet::physicallayer::RadioMedium::cacheSNIRGetCount
long cacheSNIRGetCount
Total number of SNIR cache queries.
Definition: RadioMedium.h:192
inet::physicallayer::ICommunicationCache::setCachedSNIR
virtual void setCachedSNIR(const IRadio *receiver, const ITransmission *transmission, const ISnir *snir)=0
inet::physicallayer::RadioMedium::receptionDecisionComputationCount
long receptionDecisionComputationCount
Total number of data reception decision computations.
Definition: RadioMedium.h:156
inet::physicallayer::RadioMedium::computeReceptionDecision
virtual const IReceptionDecision * computeReceptionDecision(const IRadio *receiver, const IListening *listening, const ITransmission *transmission, IRadioSignal::SignalPart part) const
Definition: RadioMedium.cc:286
inet::physicallayer::RadioMedium::cacheInterferenceHitCount
long cacheInterferenceHitCount
Total number of interference cache hits.
Definition: RadioMedium.h:180
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::physicallayer::IMediumLimitCache::removeRadio
virtual void removeRadio(const IRadio *radio)=0
Notifies the cache when a radio is removed from the medium.
inet::physicallayer::RadioMedium::getReceptionResult
virtual const IReceptionResult * getReceptionResult(const IRadio *receiver, const IListening *listening, const ITransmission *transmission) const override
Returns the reception result for the transmission that describes the end result of the reception proc...
Definition: RadioMedium.cc:401
inet::physicallayer::RadioMedium::isInterferingTransmission
virtual bool isInterferingTransmission(const ITransmission *transmission, const IListening *listening) const
Definition: RadioMedium.cc:204
inet::IPrintableObject::PRINT_LEVEL_TRACE
@ PRINT_LEVEL_TRACE
Definition: IPrintableObject.h:22
inet::physicallayer::ICommunicationCache::removeTransmission
virtual void removeTransmission(const ITransmission *transmission)=0
inet::physicallayer::ICommunicationCache::getCachedReceptionDecision
virtual const IReceptionDecision * getCachedReceptionDecision(const IRadio *receiver, const ITransmission *transmission, IRadioSignal::SignalPart part)=0
inet::physicallayer::IBackgroundNoise::computeNoise
virtual const INoise * computeNoise(const IListening *listening) const =0
inet::physicallayer::RadioMedium::removeNonInterferingTransmissionsTimer
cMessage * removeNonInterferingTransmissionsTimer
The message that is used to purge the internal state of the medium.
Definition: RadioMedium.h:108
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::ICommunicationCache::getCachedReceptionResult
virtual const IReceptionResult * getCachedReceptionResult(const IRadio *receiver, const ITransmission *transmission)=0
inet::physicallayer::ICommunicationCache::getCachedInterference
virtual const IInterference * getCachedInterference(const IRadio *receiver, const ITransmission *transmission)=0
inet::physicallayer::RadioMedium::computeInterferingReceptions
virtual const std::vector< const IReception * > * computeInterferingReceptions(const IListening *listening) const
Definition: RadioMedium.cc:238
inet::physicallayer::RadioMedium::cacheDecisionGetCount
long cacheDecisionGetCount
Total number of reception decision cache queries.
Definition: RadioMedium.h:200
inet::physicallayer::ICommunicationCache::setCachedReceptionResult
virtual void setCachedReceptionResult(const IRadio *receiver, const ITransmission *transmission, const IReceptionResult *receptionResult)=0
inet::physicallayer::RadioMedium::getReceptionDecision
virtual const IReceptionDecision * getReceptionDecision(const IRadio *receiver, const IListening *listening, const ITransmission *transmission, IRadioSignal::SignalPart part) const override
Returns the reception decision for the transmission part that specifies whether the reception is poss...
Definition: RadioMedium.cc:387
inet::physicallayer::RadioMedium::recordTransmissionLog
bool recordTransmissionLog
Records all transmissions (if recordTransmissionLog is enabled) and receptions (if recordReceptionLog...
Definition: RadioMedium.h:99
inet::physicallayer::IRadioMedium::signalRemovedSignal
static simsignal_t signalRemovedSignal
This simsignal is emitted when a signal is removed from the medium.
Definition: IRadioMedium.h:63
inet::evFlags
int evFlags
Definition: INETDefs.cc:12
inet::physicallayer::ICommunicationCache::mapTransmissions
virtual void mapTransmissions(std::function< void(const ITransmission *)> f) const =0
inet::physicallayer::RadioMedium::sendToAllRadios
virtual void sendToAllRadios(IRadio *transmitter, const IWirelessSignal *signal)
Sends a copy of the provided signal to all receivers on the radio medium.
Definition: RadioMedium.cc:666
inet::physicallayer::IRadioMedium::radioRemovedSignal
static simsignal_t radioRemovedSignal
This simsignal is emitted when a radio is removed from the medium.
Definition: IRadioMedium.h:51
inet::physicallayer::RadioMedium::sendToRadio
virtual void sendToRadio(IRadio *trasmitter, const IRadio *receiver, const IWirelessSignal *signal)
Definition: RadioMedium.cc:549
inet::physicallayer::RadioMedium::communicationLog
CommunicationLog communicationLog
The communication log output recorder.
Definition: RadioMedium.h:132
Enter_Method
#define Enter_Method(...)
Definition: SelfDoc.h:71
inet::physicallayer::RadioMedium::getReception
virtual const IReception * getReception(const IRadio *receiver, const ITransmission *transmission) const override
Returns the reception of the transmission arriving at the provided receiver.
Definition: RadioMedium.cc:325
inet::units::value::get
const value_type & get() const
Definition: Units.h:108
inet::physicallayer::RadioMedium::computeInterference
virtual const IInterference * computeInterference(const IRadio *receiver, const IListening *listening) const
Definition: RadioMedium.cc:269
inet::physicallayer::RadioMedium::cacheDecisionHitCount
long cacheDecisionHitCount
Total number of reception decision cache hits.
Definition: RadioMedium.h:204
inet::physicallayer::ICommunicationCache::addRadio
virtual void addRadio(const IRadio *radio)=0
inet::physicallayer::ICommunicationCache::setCachedInterferenceEndTime
virtual void setCachedInterferenceEndTime(const ITransmission *transmission, const simtime_t interferenceEndTime)=0
inet::physicallayer::RadioMedium::mediumLimitCache
IMediumLimitCache * mediumLimitCache
Caches various medium limits among all radios.
Definition: RadioMedium.h:116
inet::physicallayer::ICommunicationCache::getTransmission
virtual const ITransmission * getTransmission(int id) const =0
inet::physicallayer::ICommunicationCache::getCachedSNIR
virtual const ISnir * getCachedSNIR(const IRadio *receiver, const ITransmission *transmission)=0
inet::physicallayer::RadioMedium::receptionResultComputationCount
long receptionResultComputationCount
Total number of data reception result computations.
Definition: RadioMedium.h:160
inet::physicallayer::IMediumLimitCache::getMaxTransmissionDuration
virtual const simtime_t & getMaxTransmissionDuration() const =0
Returns the maximum possible transmission durations among the radios, the value is in the range [0,...
inet::units::values::m
value< double, units::m > m
Definition: Units.h:1233
inet::physicallayer::ICommunicationCache::removeNonInterferingTransmissions
virtual void removeNonInterferingTransmissions(std::function< void(const ITransmission *transmission)> f)=0
inet::physicallayer::CommunicationLog::writeTransmission
virtual void writeTransmission(const IRadio *transmitter, const IWirelessSignal *signal)
Definition: CommunicationLog.cc:25
inet::physicallayer::RadioMedium::isReceptionPossible
virtual bool isReceptionPossible(const IRadio *receiver, const ITransmission *transmission, IRadioSignal::SignalPart part) const override
Returns true when the reception is possible of the transmission part.
Definition: RadioMedium.cc:632
inet::physicallayer::ICommunicationCache::setCachedNoise
virtual void setCachedNoise(const IRadio *receiver, const ITransmission *transmission, const INoise *noise)=0
inet::physicallayer::RadioMedium::neighborCache
INeighborCache * neighborCache
Caches neighbors for all radios or nullptr if turned off.
Definition: RadioMedium.h:120
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::RadioMedium::cacheResultHitCount
long cacheResultHitCount
Total number of reception result cache hits.
Definition: RadioMedium.h:212
inet::interfaceConfigChangedSignal
simsignal_t interfaceConfigChangedSignal
Definition: Simsignals.cc:33
inet::physicallayer::IMediumLimitCache::getMinInterferenceTime
virtual const simtime_t & getMinInterferenceTime() const =0
Returns the minimum required signal interference time among the radios, the value is in the range [0,...
inet::physicallayer::RadioMedium::cacheSNIRHitCount
long cacheSNIRHitCount
Total number of SNIR cache hits.
Definition: RadioMedium.h:196
inet::physicallayer::ICommunicationCache::setCachedListening
virtual void setCachedListening(const IRadio *receiver, const ITransmission *transmission, const IListening *listening)=0
inet::physicallayer::RadioMedium::cacheReceptionHitCount
long cacheReceptionHitCount
Total number of reception cache hits.
Definition: RadioMedium.h:172
inet::physicallayer::ICommunicationCache::setCachedReception
virtual void setCachedReception(const IRadio *receiver, const ITransmission *transmission, const IReception *reception)=0
inet::physicallayer::RadioMedium::createReceiverSignal
virtual IWirelessSignal * createReceiverSignal(const ITransmission *transmission)
Creates a new signal for a receiver.
Definition: RadioMedium.cc:509
inet::physicallayer::RadioMedium::pathLoss
const IPathLoss * pathLoss
The path loss model is never nullptr.
Definition: RadioMedium.h:52
inet::physicallayer::RadioMedium::computeReceptionResult
virtual const IReceptionResult * computeReceptionResult(const IRadio *receiver, const IListening *listening, const ITransmission *transmission) const
Definition: RadioMedium.cc:295
inet::physicallayer::IRadio::radioModeChangedSignal
static simsignal_t radioModeChangedSignal
This signal is emitted when the radio mode of the radio is changed.
Definition: IRadio.h:42
inet::physicallayer::RadioMedium::computeReception
virtual const IReception * computeReception(const IRadio *receiver, const ITransmission *transmission) const
Definition: RadioMedium.cc:263
inet::physicallayer::RadioMedium::pickUpSignals
virtual void pickUpSignals(IRadio *receiver)
Sends a copy of all ongoing signals to the receiver on the radio medium.
Definition: RadioMedium.cc:673