55 const std::string QUEUEMANAGER_PREFIX{
"queue."};
56 const std::string SCHEDULER_PREFIX{
"scheduler."};
67 pScheduler_{pScheduler},
68 pQueueManager_{pQueueManager},
69 pRadioModel_{pRadioModel},
70 bFlowControlEnable_{},
71 u16FlowControlTokens_{},
73 transmitTimedEventId_{},
74 nextMultiFrameTime_{},
81 packetStatusPublisher_{},
82 neighborMetricManager_{
id},
85 &pPlatformServiceProvider->logService(),
86 pRadioServiceProvider,
88 &packetStatusPublisher_,
89 &neighborMetricManager_},
90 flowControlManager_{*pRadioModel},
103 "MACI %03hu TDMA::BaseModel::%s",
113 "Defines whether promiscuous mode is enabled or not." 114 " If promiscuous mode is enabled, all received packets" 115 " (intended for the given node or not) that pass the" 116 " probability of reception check are sent upstream to" 120 configRegistrar.registerNumeric<
bool>(
"flowcontrolenable",
123 "Defines whether flow control is enabled. Flow control only works" 124 " with the virtual transport and the setting must match the setting" 125 " within the virtual transport configuration.");
127 configRegistrar.registerNumeric<std::uint16_t>(
"flowcontroltokens",
130 "Defines the maximum number of flow control tokens" 131 " (packet transmission units) that can be processed from the" 132 " virtual transport without being refreshed. The number of" 133 " available tokens at any given time is coordinated with the" 134 " virtual transport and when the token count reaches zero, no" 135 " further packets are transmitted causing application socket" 136 " queues to backup.");
138 configRegistrar.registerNonNumeric<std::string>(
"pcrcurveuri",
141 "Defines the absolute URI of the Packet Completion Rate (PCR) curve" 142 " file. The PCR curve file contains probability of reception curves" 143 " as a function of Signal to Interference plus Noise Ratio (SINR).");
146 configRegistrar.registerNumeric<std::uint16_t>(
"fragmentcheckthreshold",
149 "Defines the rate in seconds a check is performed to see if any packet" 150 " fragment reassembly efforts should be abandoned.");
152 configRegistrar.registerNumeric<std::uint16_t>(
"fragmenttimeoutthreshold",
155 "Defines the threshold in seconds to wait for another packet fragment" 156 " for an existing reassembly effort before abandoning the effort.");
158 configRegistrar.registerNumeric<
float>(
"neighbormetricdeletetime",
159 ConfigurationProperties::DEFAULT |
162 "Defines the time in seconds of no RF receptions from a given neighbor" 163 " before it is removed from the neighbor table.",
168 configRegistrar.registerNumeric<
float>(
"neighbormetricupdateinterval",
171 "Defines the neighbor table update interval in seconds.",
185 pQueueManager_->setPacketStatusPublisher(&packetStatusPublisher_);
187 pQueueManager_->initialize(registrar);
189 pScheduler_->initialize(registrar);
199 "MACI %03hu TDMA::BaseModel::%s",
206 for(
const auto & item : update)
208 if(item.first ==
"enablepromiscuousmode")
210 bool bPromiscuousMode{item.second[0].asBool()};
214 "MACI %03hu TDMA::BaseModel::%s: %s = %s",
218 bPromiscuousMode ?
"on" :
"off");
222 else if(item.first ==
"flowcontrolenable")
224 bFlowControlEnable_ = item.second[0].asBool();
228 "MACI %03hu TDMA::BaseModel::%s: %s = %s",
232 bFlowControlEnable_ ?
"on" :
"off");
234 else if(item.first ==
"flowcontroltokens")
236 u16FlowControlTokens_ = item.second[0].asUINT16();
240 "MACI %03hu TDMA::BaseModel::%s: %s = %hu",
244 u16FlowControlTokens_);
246 else if(item.first ==
"pcrcurveuri")
248 sPCRCurveURI_ = item.second[0].asString();
252 "MACI %03hu TDMA::BaseModel::%s: %s = %s",
256 sPCRCurveURI_.c_str());
260 else if(item.first ==
"fragmentcheckthreshold")
262 std::chrono::seconds fragmentCheckThreshold{item.second[0].asUINT16()};
266 "MACI %03hu TDMA::BaseModel::%s: %s = %lu",
270 fragmentCheckThreshold.count());
274 else if(item.first ==
"fragmenttimeoutthreshold")
276 std::chrono::seconds fragmentTimeoutThreshold{item.second[0].asUINT16()};
280 "MACI %03hu TDMA::BaseModel::%s: %s = %lu",
284 fragmentTimeoutThreshold.count());
288 else if(item.first ==
"neighbormetricdeletetime")
298 "MACI %03hu TDMA::BaseModel::%s %s = %lf",
302 std::chrono::duration_cast<
DoubleSeconds>(neighborMetricDeleteTimeMicroseconds).count());
304 else if(item.first ==
"neighbormetricupdateinterval")
306 neighborMetricUpdateInterval_ =
311 "MACI %03hu TDMA::BaseModel::%s %s = %lf",
315 std::chrono::duration_cast<
DoubleSeconds>(neighborMetricUpdateInterval_).count());
319 if(!item.first.compare(0,SCHEDULER_PREFIX.size(),SCHEDULER_PREFIX))
321 schedulerConfiguration.push_back(item);
323 else if(!item.first.compare(0,QUEUEMANAGER_PREFIX.size(),QUEUEMANAGER_PREFIX))
325 queueManagerConfiguration.push_back(item);
329 throw makeException<ConfigureException>(
"TDMA::BaseModel: " 330 "Ambiguous configuration item %s.",
336 pQueueManager_->configure(queueManagerConfiguration);
338 pScheduler_->configure(schedulerConfiguration);
346 "MACI %03hu TDMA::BaseModel::%s",
350 pQueueManager_->start();
352 pScheduler_->start();
361 "MACI %03hu TDMA::BaseModel::%s",
365 pQueueManager_->postStart();
367 pScheduler_->postStart();
370 if(bFlowControlEnable_)
373 flowControlManager_.
start(u16FlowControlTokens_);
377 "MACI %03hu TDMA::BaseModel::%s sent a flow control token update," 378 " a handshake response is required to process packets",
385 &neighborMetricManager_),
386 Clock::now() + neighborMetricUpdateInterval_,
387 neighborMetricUpdateInterval_);
396 "MACI %03hu TDMA::BaseModel::%s",
401 if(bFlowControlEnable_)
404 flowControlManager_.
stop();
407 pQueueManager_->stop();
420 "MACI %03hu TDMA::BaseModel::%s",
424 pQueueManager_->destroy();
426 pScheduler_->destroy();
433 "MACI %03hu TDMA::BaseModel::%s",
444 auto now = Clock::now();
448 "MACI %03hu TDMA::BaseModel::%s",
459 "MACI %03hu TDMA::BaseModel::%s: MAC Registration Id %hu does not match our Id %hu, drop.",
466 packetStatusPublisher_.
inbound(pktInfo.getSource(),
468 pktInfo.getPriority(),
478 if(len && pkt.
length() >= len)
487 for(
auto & pControlMessage : msgs)
489 switch(pControlMessage->getId())
493 pReceivePropertiesControlMessage =
499 "MACI %03hu TDMA::BaseModel::%s Receiver Properties Control Message",
507 pFrequencyControlMessage =
513 "MACI %03hu TDMA::BaseModel::%s Frequency Control Message",
523 if(!pReceivePropertiesControlMessage || !pFrequencyControlMessage ||
524 pFrequencyControlMessage->getFrequencySegments().empty())
528 "MACI %03hu TDMA::BaseModel::%s: phy control " 529 "message not provided from src %hu, drop",
532 pktInfo.getSource());
534 packetStatusPublisher_.
inbound(pktInfo.getSource(),
535 baseModelMessage.getMessages(),
542 const auto & frequencySegments = pFrequencyControlMessage->getFrequencySegments();
546 TimePoint startOfReception{pReceivePropertiesControlMessage->getTxTime() +
547 pReceivePropertiesControlMessage->getPropagationDelay() +
552 auto eorSlotInfo = pScheduler_->getSlotInfo(startOfReception +
553 frequencySegment.getDuration());
556 if(eorSlotInfo.u64AbsoluteSlotIndex_ != baseModelMessage.getAbsoluteSlotIndex())
559 auto slotInfo = pScheduler_->getSlotInfo(now);
564 if(slotInfo.u64AbsoluteSlotIndex_ == baseModelMessage.getAbsoluteSlotIndex())
566 timeRemainingInSlot = slotDuration_ -
568 slotInfo.timePoint_);
572 timeRemainingInSlot = slotDuration_ +
574 slotInfo.timePoint_);
577 double dSlotRemainingRatio =
578 timeRemainingInSlot.count() /
static_cast<double>(slotDuration_.count());
580 slotStatusTablePublisher_.
update(slotInfo.u32RelativeIndex_,
581 slotInfo.u32RelativeFrameIndex_,
582 slotInfo.u32RelativeSlotIndex_,
584 dSlotRemainingRatio);
586 packetStatusPublisher_.
inbound(pktInfo.getSource(),
587 baseModelMessage.getMessages(),
593 "MACI %03hu TDMA::BaseModel::%s eor rx slot:" 594 " %zu does not match sot slot: %zu, drop long",
597 eorSlotInfo.u64AbsoluteSlotIndex_,
598 baseModelMessage.getAbsoluteSlotIndex());
605 auto entry = pScheduler_->getRxSlotInfo(now);
607 if(entry.first.u64AbsoluteSlotIndex_ == baseModelMessage.getAbsoluteSlotIndex())
611 entry.first.timePoint_)};
613 double dSlotRemainingRatio =
614 timeRemainingInSlot.count() /
static_cast<double>(slotDuration_.count());
618 if(entry.first.u64FrequencyHz_ == frequencySegment.getFrequencyHz())
621 slotStatusTablePublisher_.
update(entry.first.u32RelativeIndex_,
622 entry.first.u32RelativeFrameIndex_,
623 entry.first.u32RelativeSlotIndex_,
625 dSlotRemainingRatio);
627 Microseconds span{pReceivePropertiesControlMessage->getSpan()};
629 if(receiveManager_.
enqueue(std::move(baseModelMessage),
641 entry.first.u64AbsoluteSlotIndex_+1),
642 entry.first.timePoint_+ slotDuration_);
647 slotStatusTablePublisher_.
update(entry.first.u32RelativeIndex_,
648 entry.first.u32RelativeFrameIndex_,
649 entry.first.u32RelativeSlotIndex_,
651 dSlotRemainingRatio);
653 packetStatusPublisher_.
inbound(pktInfo.getSource(),
654 baseModelMessage.getMessages(),
659 "MACI %03hu TDMA::BaseModel::%s drop reason rx slot correct" 660 " rframe: %u rslot: %u but frequency mismatch expected: %zu got: %zu",
663 entry.first.u32RelativeFrameIndex_,
664 entry.first.u32RelativeSlotIndex_,
665 entry.first.u64FrequencyHz_,
666 frequencySegment.getFrequencyHz());
675 auto slotInfo = pScheduler_->getSlotInfo(entry.first.u64AbsoluteSlotIndex_);
677 slotStatusTablePublisher_.
update(entry.first.u32RelativeIndex_,
678 entry.first.u32RelativeFrameIndex_,
679 entry.first.u32RelativeSlotIndex_,
683 dSlotRemainingRatio);
685 packetStatusPublisher_.
inbound(pktInfo.getSource(),
686 baseModelMessage.getMessages(),
692 "MACI %03hu TDMA::BaseModel::%s drop reason rx slot correct but %s rframe: %u rslot: %u",
697 entry.first.u32RelativeFrameIndex_,
698 entry.first.u32RelativeSlotIndex_);
707 auto slotInfo = pScheduler_->getSlotInfo(entry.first.u64AbsoluteSlotIndex_);
711 slotInfo.timePoint_)};
712 double dSlotRemainingRatio =
713 timeRemainingInSlot.count() /
static_cast<double>(slotDuration_.count());
719 slotStatusTablePublisher_.
update(entry.first.u32RelativeIndex_,
720 entry.first.u32RelativeFrameIndex_,
721 entry.first.u32RelativeSlotIndex_,
723 dSlotRemainingRatio);
725 packetStatusPublisher_.
inbound(pktInfo.getSource(),
726 baseModelMessage.getMessages(),
731 "MACI %03hu TDMA::BaseModel::%s drop reason slot mismatch pkt: %zu now: %zu ",
734 baseModelMessage.getAbsoluteSlotIndex(),
735 entry.first.u64AbsoluteSlotIndex_);
742 slotStatusTablePublisher_.
update(entry.first.u32RelativeIndex_,
743 entry.first.u32RelativeFrameIndex_,
744 entry.first.u32RelativeSlotIndex_,
748 dSlotRemainingRatio);
750 packetStatusPublisher_.
inbound(pktInfo.getSource(),
751 baseModelMessage.getMessages(),
757 "MACI %03hu TDMA::BaseModel::%s drop reason slot mismatch but %s pkt: %zu now: %zu ",
762 baseModelMessage.getAbsoluteSlotIndex(),
763 entry.first.u64AbsoluteSlotIndex_);
774 "MACI %03hu TDMA::BaseModel::%s Packet payload length %zu does not match length prefix %zu",
786 "MACI %03hu TDMA::BaseModel::%s",
790 for(
const auto & pMessage : msgs)
794 "MACI %03hu TDMA::BaseModel::%s downstream control message id %hu",
799 switch(pMessage->getId())
803 const auto pFlowControlControlMessage =
806 if(bFlowControlEnable_)
810 "MACI %03hu TDMA::BaseModel::%s received a flow control token request/response",
820 "MACI %03hu TDMA::BaseModel::%s received a flow control token request but" 821 " flow control is not enabled",
830 const auto pSerializedControlMessage =
833 switch(pSerializedControlMessage->getSerializedId())
837 std::unique_ptr<Controls::FlowControlControlMessage>
838 pFlowControlControlMessage{
841 if(bFlowControlEnable_)
849 "MACI %03hu TDMA::BaseModel::%s received a flow control token request but" 850 " flow control is not enabled",
868 "MACI %03hu TDMA::BaseModel::%s",
874 if(bFlowControlEnable_)
878 if(status.second ==
false)
882 "MACI %03hu TDMA::BaseModel::%s: failed to remove token, drop packet (tokens:%hu)",
889 packetStatusPublisher_.
outbound(pktInfo.getSource(),
891 pktInfo.getPriority(),
902 size_t packetsDropped{pQueueManager_->enqueue(u8Queue,std::move(pkt))};
905 if(bFlowControlEnable_)
907 for(
size_t i = 0; i < packetsDropped; ++i)
909 auto status = flowControlManager_.
addToken();
915 "MACI %03hu TDMA::BaseModel:::%s: failed to add token (tokens:%hu)",
930 "MACI %03hu TDMA::BaseModel::%s",
934 pScheduler_->processEvent(eventId,serialization);
943 "MACI %03hu TDMA::BaseModel::%s",
950 for(
const auto & item : update)
952 if(item.first ==
"enablepromiscuousmode")
954 bool bPromiscuousMode{item.second[0].asBool()};
958 "MACI %03hu TDMA::BaseModel::%s: %s = %s",
962 bPromiscuousMode ?
"on" :
"off");
968 schedulerConfiguration.push_back(item);
972 pScheduler_->configure(schedulerConfiguration);
976 std::uint64_t u64BandwidthHz,
982 "MACI %03hu TDMA::BaseModel::%s",
989 if(transmitTimedEventId_)
992 transmitTimedEventId_ = 0;
995 if(u64BandwidthHz_ != u64BandwidthHz || frequencies != frequencies_)
1000 frequencies_ = frequencies;
1002 u64BandwidthHz_ = u64BandwidthHz;
1005 slotDuration_ = slotDuration;
1007 slotOverhead_ = slotOverhead;
1009 slotStatusTablePublisher_.
clear();
1011 std::tie(txSlotInfos_,
1012 nextMultiFrameTime_) =
1013 pScheduler_->getTxSlotInfo(Clock::now(),1);
1018 "MACI %03hu TDMA::BaseModel::%s TX Slot Info",
1024 if(!txSlotInfos_.empty())
1026 pendingTxSlotInfo_ = *txSlotInfos_.begin();
1028 txSlotInfos_.pop_front();
1030 transmitTimedEventId_ =
1032 schedule(std::bind(&Implementation::processTxOpportunity,
1043 "MACI %03hu TDMA::BaseModel::%s",
1048 pQueueManager_->enqueue(4,std::move(pkt));
1056 "MACI %03hu TDMA::BaseModel::%s",
1068 "MACI %03hu TDMA::BaseModel::%s",
1072 return pQueueManager_->getPacketQueueInfo();
1075 void EMANE::Models::TDMA::BaseModel::Implementation::sendDownstreamPacket(
double dSlotRemainingRatio)
1078 size_t bytesAvailable =
1079 (slotDuration_.count() - slotOverhead_.count()) / 1000000.0 * pendingTxSlotInfo_.
u64DataRatebps_ / 8.0;
1081 auto entry = pQueueManager_->dequeue(pendingTxSlotInfo_.
u8QueueId_,
1086 size_t totalSize{std::get<1>(entry)};
1090 if(totalSize <= bytesAvailable)
1092 float fSeconds{totalSize * 8.0f / pendingTxSlotInfo_.
u64DataRatebps_};
1097 if(duration >= slotDuration_)
1103 size_t completedPackets{};
1107 for(
const auto & component : components)
1109 completedPackets += !component.isMoreFragments();
1114 dst = component.getDestination();
1121 if(
dst != component.getDestination())
1131 "MACI %03hu TDMA::BaseModel::%s sending downstream to %03hu components: %zu",
1138 if(bFlowControlEnable_ && completedPackets)
1140 auto status = flowControlManager_.
addToken(completedPackets);
1146 "MACI %03hu TDMA::BaseModel::%s: failed to add token (tokens:%hu)",
1154 aggregationStatusPublisher_.
update(components);
1158 std::move(components)};
1162 auto now = Clock::now();
1180 dSlotRemainingRatio);
1190 "MACI %03hu TDMA::BaseModel::%s queue dequeue returning %zu bytes than slot has available %zu",
1205 dSlotRemainingRatio);
1209 void EMANE::Models::TDMA::BaseModel::Implementation::processTxOpportunity(std::uint64_t u64ScheduleIndex)
1212 if(u64ScheduleIndex != u64ScheduleIndex_)
1216 "MACI %03hu TDMA::BaseModel::%s old schedule tx opportunity found" 1217 " scheduled index: %zu current index: %zu",
1225 auto now = Clock::now();
1227 auto nowSlotInfo = pScheduler_->getSlotInfo(now);
1232 double dSlotRemainingRatio =
1233 timeRemainingInSlot.count() /
static_cast<double>(slotDuration_.count());
1238 sendDownstreamPacket(dSlotRemainingRatio);
1246 dSlotRemainingRatio);
1251 if(txSlotInfos_.empty())
1254 std::tie(txSlotInfos_,
1255 nextMultiFrameTime_) =
1256 pScheduler_->getTxSlotInfo(nextMultiFrameTime_,1);
1259 bool bFoundTXSlot = {};
1262 while(!txSlotInfos_.empty() && !bFoundTXSlot)
1266 while(!txSlotInfos_.empty())
1268 pendingTxSlotInfo_ = *txSlotInfos_.begin();
1270 txSlotInfos_.pop_front();
1276 transmitTimedEventId_ =
1278 schedule(std::bind(&Implementation::processTxOpportunity,
1283 bFoundTXSlot =
true;
1289 double dSlotRemainingRatio = \
1291 static_cast<double>(slotDuration_.count());
1298 dSlotRemainingRatio);
1303 timeRemainingInSlot = slotDuration_ -
1308 double dSlotRemainingRatio =
1309 timeRemainingInSlot.count() /
static_cast<double>(slotDuration_.count());
1312 sendDownstreamPacket(dSlotRemainingRatio);
1317 if(txSlotInfos_.empty())
1320 std::tie(txSlotInfos_,
1321 nextMultiFrameTime_) =
1322 pScheduler_->getTxSlotInfo(nextMultiFrameTime_,1);
void processSchedulerPacket(DownstreamPacket &pkt) override
std::string Serialization
A Packet class that allows upstream processing to strip layer headers as the packet travels up the st...
const PacketInfo & getPacketInfo() const
void updateNeighborStatus()
The Registrar interface provides access to all of the emulator registrars.
std::uint64_t u64AbsoluteSlotIndex_
A Serialized Control Message is used to encapsulate Serializable control messages as they traverse pr...
void outbound(NEMId src, NEMId dst, Priority priority, size_t size, OutboundAction action) override
Implementation(NEMId id, PlatformServiceProvider *pPlatformServiceProvider, RadioServiceProvider *pRadioServiceProvider, Scheduler *pScheduler, QueueManager *pQueueManager, MACLayerImplementor *pRadioModel)
virtual ConfigurationRegistrar & configurationRegistrar()=0
void registerStatistics(StatisticRegistrar ®istrar)
void inbound(NEMId src, const MessageComponent &component, InboundAction action) override
void process(std::uint64_t u64AbsoluteSlotIndex)
std::uint32_t u32RelativeFrameIndex_
Message class used to serialize and deserialize TDMA radio model messages.
virtual StatisticRegistrar & statisticRegistrar()=0
Recieve Properties Control Message is sent from the emulator physical layer with every upstream packe...
Holds the frequency, offset and duration of a frequency segment.
void update(const MessageComponents &components)
static TransmitterControlMessage * create(const Transmitters &transmitters)
std::list< const ControlMessage * > ControlMessages
std::pair< std::uint16_t, bool > addToken(std::uint16_t u16Tokens=1)
std::uint32_t u32RelativeSlotIndex_
static TimeStampControlMessage * create(const TimePoint ×tamp)
std::uint16_t stripLengthPrefixFraming()
constexpr NEMId NEM_BROADCAST_MAC_ADDRESS
void sendDownstreamControl(const ControlMessages &msgs)
void setPromiscuousMode(bool bEnable)
void start(std::uint16_t u16TotalTokensAvailable)
void initialize(Registrar ®istrar) override
static FlowControlControlMessage * create(const Serialization &serialization)
std::uint32_t u32RelativeIndex_
void updateNeighborTxMetric(NEMId dst, std::uint64_t u64DataRatebps, const TimePoint &txTime)
Store source, destination, creation time and priority information for a packet.
static FrequencyControlMessage * create(std::uint64_t u64BandwidthHz, const FrequencySegments &frequencySegments)
void processConfiguration(const ConfigurationUpdate &update) override
The Frequency Control Message is sent to the emulator physical layer to specify the frequency segment...
std::vector< QueueInfo > QueueInfos
void processDownstreamPacket(DownstreamPacket &pkt, const ControlMessages &msgs) override
void processFlowControlMessage(const Controls::FlowControlControlMessage *pMsg)
#define LOGGER_VERBOSE_LOGGING_FN_VARGS(logger, level, fn, fmt, args...)
const PacketInfo & getPacketInfo() const
void setFragmentTimeoutThreshold(const std::chrono::seconds &threshold)
Specialized packet the allows downstream processing to add layer specific headers as the packet trave...
void update(std::uint32_t u32RelativeIndex, std::uint32_t u32RelativeFrameIndex, std::uint32_t u32RelativeSlotIndex, Status status, double dSlotRemainingRatio)
std::list< MessageComponent > MessageComponents
std::set< std::uint64_t > Frequencies
void registerStatistics(StatisticRegistrar ®istrar)
std::chrono::microseconds Microseconds
void loadCurves(const std::string &sPCRFileName)
std::chrono::duration< double > DoubleSeconds
const Microseconds & getOffset() const
void postStart() override
Flow Control Control Messages are sent between a MAC layer and a transport in order to communicate da...
The RadioServiceProvider interface provides access to radio (RF) model specific services.
void processDownstreamControl(const ControlMessages &msgs) override
void sendDownstreamPacket(const CommonMACHeader &hdr, DownstreamPacket &pkt, const ControlMessages &msgs=DownstreamTransport::empty)
std::uint64_t u64DataRatebps_
Scheduler interface used by BaseModel to communicate with a scheduler module.
static FrequencyOfInterestControlMessage * create(std::uint64_t u64BandwidthHz, const FrequencySet &frequencySet)
void setFragmentCheckThreshold(const std::chrono::seconds &threshold)
void registerStatistics(StatisticRegistrar &statisticRegistrar)
void setNeighborDeleteTimeMicroseconds(const Microseconds &ageMicroseconds)
Priority getPriority() const
void configure(const ConfigurationUpdate &update) override
Queue management interface used by BaseModel
std::vector< ConfigurationNameAnyValues > ConfigurationUpdate
void notifyScheduleChange(const Frequencies &frequencies, std::uint64_t u64BandwidthHz, const Microseconds &slotDuration, const Microseconds &slotOverhead) override
std::pair< std::uint16_t, bool > removeToken()
void registerStatistics(StatisticRegistrar ®istrar)
std::uint8_t priorityToQueue(Priority priority)
void registerNumeric(const std::string &sName, const ConfigurationProperties &properties=ConfigurationProperties::NONE, const std::initializer_list< T > &values={}, const std::string &sUsage="", T minValue=std::numeric_limits< T >::lowest(), T maxValue=std::numeric_limits< T >::max(), std::size_t minOccurs=1, std::size_t maxOccurs=1, const std::string &sRegexPattern={})
void processSchedulerControl(const ControlMessages &msgs) override
QueueInfos getPacketQueueInfo() const override
Clock::time_point TimePoint
virtual bool cancelTimedEvent(TimerEventId eventId)=0
void prependLengthPrefixFraming(std::uint16_t u16Length)
#define LOGGER_STANDARD_LOGGING(logger, level, fmt, args...)
void processUpstreamPacket(const CommonMACHeader &hdr, UpstreamPacket &pkt, const ControlMessages &msgs) override
bool enqueue(BaseModelMessage &&baseModelMessage, const PacketInfo &pktInfo, size_t length, const TimePoint &startOfReception, const FrequencySegments &frequencySegments, const Microseconds &span, const TimePoint &beginTime, std::uint64_t u64PacketSequence)
std::uint64_t u64FrequencyHz_
const RegistrationId REGISTERED_EMANE_MAC_TDMA
void processUpstreamControl(const ControlMessages &msgs) override
void processEvent(const EventId &, const Serialization &) override
Interface used to create a MAC layer plugin implementation.