Control Messages

This chapter is incomplete.

A radio model exchanges control messages with the physical layer to configure certain capabilities and to communication reception information, and with an emulation boundary if the radio model is implemented with flow control support. These messages are referred to as downstream and upstream control messages based on their direction of travel. Downstream control messages travel in the direction of the emulation boundary down towards the physical layer. Upstream control messages travel in the direction of the physical layer up towards the emulation boundary. Control messages are only exchanged between contiguous NEM layers.

The physical layer operates in one of two API modes: compatibly mode 1 (compat1) and compatibility mode 2 (compat2). Compatibility mode 1 is a legacy non-MIMO API mode that supports radio model control messaging for single antenna functionality. Compatibility mode 2 is the newer MIMO API mode and supports radio model control messaging for both single antenna and MIMO. Many control messages originating at or destined for the physical layer are compatibility mode specific.

AntennaProfileControlMessage

The AntennaProfileControlMessage is sent to the physical layer by a radio model to set the antenna profile and pointing information for the default antenna. The physical layer processes the control message and either sends an AntennaProfileEvent via the event channel or as an attached event via the over-the-air channel, if the control message was sent as part of processDownstreamPacket.

AntennaProfileControlMessage is a physical layer compatibility mode 1 control message.

namespace EMANE
{
  namespace Controls
  {
    class AntennaProfileControlMessage : public ControlMessage
    {
    public:
      static
      AntennaProfileControlMessage * create(AntennaProfileId id,
                                            double dAntennaAzimuthDegrees,
                                            double dAntennaElevationDegrees);

      AntennaProfileControlMessage * clone() const override;

      ~AntennaProfileControlMessage();

      AntennaProfileId getAntennaProfileId() const;

      double getAntennaAzimuthDegrees() const;

      double getAntennaElevationDegrees() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSGE_ANTENNA_PROFILE};

    };
  }
}

emane/include/emane/controls/antennaprofilecontrolmessage.h


FlowControlControlMessage

The FlowControlControlMessage is exchanged between a radio model and emulation boundary to manage flow control tokens in order to establish backpressure between a radio model’s over-the-air transmission rate and the user offered load entering the emulation through the boundary.

Flow control does not work with either the Virtual Transport or the Raw Transport. A custom boundary is required to take advantage of radio models that support this capability.

namespace EMANE
{
  namespace Controls
  {
    class FlowControlControlMessage : public ControlMessage
    {
    public:
      static
      FlowControlControlMessage * create(const Serialization & serialization);

      static
      FlowControlControlMessage * create(std::uint16_t u16Tokens);

      FlowControlControlMessage * clone() const override;

      ~FlowControlControlMessage();

      std::uint16_t getTokens() const;

      Serialization serialize() const override;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSGE_FLOW_CONTROL};

    };
  }
}

emane/include/emane/controls/flowcontrolcontrolmessage.h


FrequencyControlMessage

The FrequencyControlMessage is sent by a radio model to the physical layer to set transmit frequency characteristics of an outbound over-the-air message using sendDownstreamPacket. A radio model can set the transmit bandwidth in Hz (0 indicates use of the physical layer configuration parameter bandwidth) and one or more frequency segments describing center frequency in Hz (0 indicates use of physical layer configuration parameter frequency), duration in microseconds, and offset from the start-of-transmission in microseconds.

FrequencyControlMessage is a physical layer compatibility mode 1 control message.

namespace EMANE
{
  namespace Controls
  {
    class FrequencyControlMessage : public ControlMessage
    {
    public:
      static
      FrequencyControlMessage * create(std::uint64_t u64BandwidthHz,
                                       const FrequencySegments & frequencySegments);

      FrequencyControlMessage * clone() const override;

      ~FrequencyControlMessage();

      const FrequencySegments & getFrequencySegments() const;

      std::uint64_t getBandwidthHz() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSGE_FREQUENCY};

    };
  }
}

emane/include/emane/controls/frequencycontrolmessage.h


FrequencyOfInterestControlMessage

The FrequencyOfInterestControlMessage is sent by a radio model to the physical layer to set the receive frequencies of interest using sendDownstreamControl. A radio model can specify the receive bandwidth in Hz (0 indicates use of the physical layer configuration parameter bandwidth) and one or more receive frequencies in Hz, where each frequency will be monitored for spectrum energy by the physical layer spectrum monitor.

FrequencyOfInterestControlMessage is a physical layer compatibility mode 1 control message.

namespace EMANE
{
  namespace Controls
  {
    class FrequencyOfInterestControlMessage : public ControlMessage
    {
    public:
      static
      FrequencyOfInterestControlMessage * create(std::uint64_t u64BandwidthHz,
                                                 const FrequencySet & frequencySet);

      FrequencyOfInterestControlMessage * clone() const override;

      ~FrequencyOfInterestControlMessage();

      const FrequencySet & getFrequencySet() const;

      std::uint64_t getBandwidthHz() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSGE_FREQUENCY_OF_INTEREST};

    };
  }
}

emane/include/emane/controls/frequencyofinterestcontrolmessage.h


MIMOReceivePropertiesControlMessage

The MIMOReceivePropertiesControlMessage is sent by the physical layer to a radio model to communicate receive properties associated with a received over-the-air message using processUpstreamPacket. MIMOReceivePropertiesControlMessage contains the start-of-transmission in microseconds since the epoch, propagation delay in microseconds, mapping of frequency in Hz to Doppler shift in Hz, and antenna receive information for all received transmission paths. There is one antenna receive information entry for each transmit antenna to receive antenna path containing the received frequency segments, overall message span in microseconds, and receiver sensitivity in dBm.

MIMOReceivePropertiesControlMessage is a physical layer compatibility mode 2 control message.

namespace EMANE
{
  namespace Controls
  {
    class MIMOReceivePropertiesControlMessage : public ControlMessage
    {
    public:
      static
      MIMOReceivePropertiesControlMessage * create(const TimePoint & txTime,
                                                   const Microseconds & propagation,
                                                   const AntennaReceiveInfos & antennaReceiveInfos,
                                                   const DopplerShifts & dopplerShifts);

      static
      MIMOReceivePropertiesControlMessage * create(const TimePoint & txTime,
                                                   const Microseconds & propagation,
                                                   AntennaReceiveInfos && antennaReceiveInfos,
                                                   DopplerShifts && dopplerShifts);
      MIMOReceivePropertiesControlMessage * clone() const override;

      ~MIMOReceivePropertiesControlMessage();

      const TimePoint & getTxTime() const;

      const Microseconds & getPropagationDelay() const;

      const AntennaReceiveInfos & getAntennaReceiveInfos() const;

      const DopplerShifts & getDopplerShifts() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSGE_MIMO_RECEIVE_PROPERTIES};

    };
  }
}

emane/include/emane/controls/mimoreceivepropertiescontrolmessage.h


MIMOTransmitPropertiesControlMessage

The MIMOTransmitPropertiesControlMessage is sent by a radio model to the physical layer to communicate transmit properties associated with an outbound over-the-air message using sendDownstreamPacket. MIMOTransmitPropertiesControlMessage contains one or more transmit antennas and a group of frequency segment lists. Each transmit antenna may be mapped to its own unique frequency segment list or share a list with other transmit antennas. Each transmit antenna is specified using a unique antenna index value which is unrelated to indexes used when adding receive antennas via RxAntennaAddControlMessage. Each frequency segment contains a center frequency in Hz (0 indicates use of physical layer configuration parameter frequency), duration in microseconds, and offset from the start-of-transmission in microseconds.

MIMOTransmitPropertiesControlMessage is a physical layer compatibility mode 2 control message.

namespace EMANE
{
  namespace Controls
  {
    class MIMOTransmitPropertiesControlMessage : public ControlMessage
    {
    public:
      static
      MIMOTransmitPropertiesControlMessage * create(const FrequencyGroups & frequencyGroups,
                                                    const Antennas & transmitAntennas);

      static
      MIMOTransmitPropertiesControlMessage * create(FrequencyGroups && frequencyGroups,
                                                    const Antennas & transmitAntennas);

      static
      MIMOTransmitPropertiesControlMessage * create(FrequencyGroups && frequencyGroups,
                                                    Antennas && transmitAntennas);

      MIMOTransmitPropertiesControlMessage * clone() const override;

      ~MIMOTransmitPropertiesControlMessage();

      const FrequencyGroups & getFrequencyGroups() const;

      const Antennas & getTransmitAntennas() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSGE_MIMO_TRANSMIT_PROPERTIES};

    };
  }
}

emane/include/emane/controls/mimotransmitpropertiescontrolmessage.h


MIMOTxWhileRxInterferenceControlMessage

The MIMOTxWhileRxInterferenceControlMessage is sent by a radio model to the physical layer to communicate any self transmit interference associated with an outbound over-the-air message using processDownstreamPacket. MIMOTxWhileRxInterferenceControlMessage contains a frequency group index and power level in mW to apply as received interference to each specified receive antenna.

MIMOTxWhileRxInterferenceControlMessage is a physical layer compatibility mode 2 control message.

namespace EMANE
{
  namespace Controls
  {
    class MIMOTxWhileRxInterferenceControlMessage : public ControlMessage
    {
    public:

      using RxAntennaInterferenceMap = std::map<AntennaIndex,AntennaSelfInterferences>;

      static
      MIMOTxWhileRxInterferenceControlMessage *
      create(const FrequencyGroups & frequencyGroups,
             const RxAntennaInterferenceMap & rxAntennaSelections);

      static
      MIMOTxWhileRxInterferenceControlMessage *
      create(FrequencyGroups && frequencyGroups,
             const RxAntennaInterferenceMap & rxAntennaSelections);

      static
      MIMOTxWhileRxInterferenceControlMessage *
      create(FrequencyGroups && frequencyGroups,
             RxAntennaInterferenceMap && rxAntennaSelections);

      MIMOTxWhileRxInterferenceControlMessage * clone() const override;

      ~MIMOTxWhileRxInterferenceControlMessage();

      const FrequencyGroups & getFrequencyGroups() const;

      const RxAntennaInterferenceMap & getRxAntennaInterferenceMap() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSGE_MIMO_TX_WHILE_RX_INTERFERENCE};

    };
  }
}

emane/include/emane/controls/mimotxwhilerxinterferencecontrolmessage.h


ReceivePropertiesControlMessage

The ReceivePropertiesControlMessage is sent by the physical layer to a radio model to communicate receive properties associated with a received over-the-air message using processUpstreamPacket. ReceivePropertiesControlMessage contains the start-of-transmission in microseconds since the epoch, propagation delay in microseconds, overall message span in microseconds, and receiver sensitivity in dBm.

ReceivePropertiesControlMessage is a physical layer compatibility mode 1 control message.

namespace EMANE
{
  namespace Controls
  {
    class ReceivePropertiesControlMessage : public ControlMessage
    {
    public:
      static
      ReceivePropertiesControlMessage * create(const TimePoint & txTime,
                                               const Microseconds & propagation,
                                               const Microseconds & span,
                                               double dReceiverSensitivitydBm);

      ReceivePropertiesControlMessage * clone() const override;

      ~ReceivePropertiesControlMessage();

      TimePoint getTxTime() const;

      Microseconds getPropagationDelay() const;

      Microseconds getSpan() const;

      double getReceiverSensitivitydBm() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSGE_RECEIVE_PROPERTIES};

    };
  }
}

emane/include/emane/controls/receivepropertiescontrolmessage.h


RxAntennaAddControlMessage

The RxAntennaAddControlMessage is sent by a radio model to the physical layer to add a receive antenna. RxAntennaAddControlMessage contains the antenna receive frequencies of interest and an antenna object with a unique antenna index, antenna type: ideal omni (fixed gain) or antenna pattern defined (profile id and pointing), receive bandwidth, and spectrum mask.

The unique antenna index is used to reference an antenna during an RxAntennaUpdateControlMessage or RxAntennaRemoveControlMessage. It is also how per antenna receive power information is identified when communicating received over-the-air transmissions to the radio model via MIMOReceivePropertiesControlMessage.

RxAntennaAddControlMessage is a physical layer compatibility mode 2 control message.

namespace EMANE
{
  namespace Controls
  {
    class RxAntennaAddControlMessage : public ControlMessage
    {
    public:
      static
      RxAntennaAddControlMessage * create(const Antenna & antenna,
                                          const FrequencySet & frequencyOfInterestSet);

      static
      RxAntennaAddControlMessage * create(const Antenna & antenna,
                                          FrequencySet && frequencyOfInterestSet);

      RxAntennaAddControlMessage * clone() const override;

      ~RxAntennaAddControlMessage();

      const Antenna & getAntenna() const;

      const FrequencySet & getFrequencyOfInterestSet() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSAGE_RX_ANTENNA_ADD};

    };
  }
}

emane/include/emane/controls/rxantennaaddcontrolmessage.h


RxAntennaRemoveControlMessage

The RxAntennaRemoveControlMessage is sent by a radio model to the physical layer to remove a receive antenna. RxAntennaRemoveControlMessage contains the unique antenna index identifying the receive antenna to remove.

The unique antenna index is assigned to a receive antenna during an RxAntennaAddControlMessage.

RxAntennaRemoveControlMessage is a physical layer compatibility mode 2 control message.

namespace EMANE
{
  namespace Controls
  {
    class RxAntennaRemoveControlMessage : public ControlMessage
    {
    public:
      static
      RxAntennaRemoveControlMessage * create(AntennaIndex antennaIndex);

      RxAntennaRemoveControlMessage * clone() const override;

      ~RxAntennaRemoveControlMessage();

      AntennaIndex getAntennaIndex() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSAGE_RX_ANTENNA_REMOVE};

    };
  }
}

emane/include/emane/controls/rxantennaremovecontrolmessage.h


RxAntennaUpdateControlMessage

The RxAntennUpdateControlMessage is sent by a radio model to the physical layer to update receive antenna properties. RxAntennaUpdateControlMessage contains an antenna object with an antenna index matching the target receive antenna to update, antenna type: ideal omni (fixed gain) or antenna pattern defined (profile id and pointing), receive bandwidth, and spectrum mask.

The unique antenna index is assigned to a receive antenna during an RxAntennaAddControlMessage.

RxAntennaUpdateControlMessage is a physical layer compatibility mode 2 control message.

namespace EMANE
{
  namespace Controls
  {
    class RxAntennaUpdateControlMessage : public ControlMessage
    {
    public:
      static
      RxAntennaUpdateControlMessage * create(const Antenna & antenna);

      RxAntennaUpdateControlMessage * clone() const override;

      ~RxAntennaUpdateControlMessage();

      const Antenna & getAntenna() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSAGE_RX_ANTENNA_UPDATE};

    };
  }
}

emane/include/emane/controls/rxantennaupdatecontrolmessage.h


SpectrumFilterAddControlMessage

namespace EMANE
{
  namespace Controls
  {
    class SpectrumFilterAddControlMessage : public ControlMessage
    {
    public:
      static
      SpectrumFilterAddControlMessage * create(FilterIndex u16FilterIndex,
                                               AntennaIndex antennaIndex,
                                               std::uint64_t u64FrequencyHz,
                                               std::uint64_t u64BandwidthHz,
                                               std::uint64_t u64SubBandBinSizeHz = 0,
                                               FilterMatchCriterion * pFilterMatchCriterion = nullptr);

      static
      SpectrumFilterAddControlMessage * create(FilterIndex u16FilterIndex,
                                               std::uint64_t u64FrequencyHz,
                                               std::uint64_t u64BandwidthHz,
                                               std::uint64_t u64SubBandBinSizeHz = 0,
                                               FilterMatchCriterion * pFilterMatchCriterion = nullptr);

      SpectrumFilterAddControlMessage * clone() const override;

      ~SpectrumFilterAddControlMessage();

      FilterIndex getFilterIndex() const;

      AntennaIndex getAntennaIndex() const;

      std::uint64_t getBandwidthHz() const;

      std::uint64_t getFrequencyHz() const;

      const FilterMatchCriterion * getFilterMatchCriterion() const;

      std::uint64_t getSubBandBinSizeHz() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSGE_SPECTRUM_FILTER_ADD};

    };
  }
}

emane/include/emane/controls/spectrumfilteraddcontrolmessage.h


SpectrumFilterDataControlMessage

namespace EMANE
{
  namespace Controls
  {
    class SpectrumFilterDataControlMessage : public ControlMessage
    {
    public:
      static
      SpectrumFilterDataControlMessage * create(const FilterData & filterData);

      SpectrumFilterDataControlMessage * clone() const override;

      ~SpectrumFilterDataControlMessage();

      const FilterData & getFilterData() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSGE_SPECTRUM_FILTER_DATA};

    };
  }
}

emane/include/emane/controls/spectrumfilterdatacontrolmessage.h


SpectrumFilterRemoveControlMessage

namespace EMANE
{
  namespace Controls
  {
    class SpectrumFilterRemoveControlMessage : public ControlMessage
    {
    public:
      static
      SpectrumFilterRemoveControlMessage * create(FilterIndex filterIndex,
                                                  AntennaIndex antennaIndex);

      static
      SpectrumFilterRemoveControlMessage * create(FilterIndex filterIndex);

      SpectrumFilterRemoveControlMessage * clone() const override;

      ~SpectrumFilterRemoveControlMessage();

      FilterIndex getFilterIndex() const;

      AntennaIndex getAntennaIndex() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSGE_SPECTRUM_FILTER_REMOVE};

    };
  }
}

emane/include/emane/controls/spectrumfilterremovecontrolmessage.h


TimestampControlMessage

namespace EMANE
{
  namespace Controls
  {
    class TimeStampControlMessage : public ControlMessage
    {
    public:
      static
      TimeStampControlMessage * create(const TimePoint & timestamp);

      TimeStampControlMessage * clone() const override;

      ~TimeStampControlMessage();

      TimePoint getTimeStamp() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSGE_TIME_STAMP};

    };
  }
}

emane/include/emane/controls/timestampcontrolmessage.h


TransmitterControlMessage

namespace EMANE
{
  namespace Controls
  {
    class TransmitterControlMessage : public ControlMessage
    {
    public:
      ~TransmitterControlMessage();

      static
      TransmitterControlMessage * create(const Transmitters & transmitters);

      TransmitterControlMessage * clone() const override;

      const Transmitters & getTransmitters() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSGE_TRANSMITTER};

    };
  }
}

emane/include/emane/controls/transmittercontrolmessage.h


TxWhileRxInterferenceControlMessage

namespace EMANE
{
  namespace Controls
  {
    class TxWhileRxInterferenceControlMessage : public ControlMessage
    {
    public:
      static
      TxWhileRxInterferenceControlMessage * create(double dRxPowerdBm);

      TxWhileRxInterferenceControlMessage * clone() const override;

      ~TxWhileRxInterferenceControlMessage();

      double getRxPowerdBm() const;

      enum {IDENTIFIER = EMANE_CONTROL_MEASSGE_TX_WHILE_RX_INTERFERENCE};

    };
  }
}

emane/include/emane/controls/txwhilerxinterferencecontrolmessage.h