13#ifndef _LTE_LTEMACBASE_H_
14#define _LTE_LTEMACBASE_H_
16#include <inet/common/ModuleRefByPar.h>
18#include "simu5g/common/binder/Binder.h"
19#include "simu5g/common/LteCommon.h"
20#include "simu5g/common/LteControlInfo.h"
24using namespace omnetpp;
48typedef std::pair<MacCid, LteMacBuffer *> CidBufferPair;
49typedef std::pair<Lcg, CidBufferPair> LcgPair;
50typedef std::multimap<Lcg, CidBufferPair> LcgMap;
57struct LogicalChannelConfig {
59 bool soFraming =
false;
60 unsigned int snFieldLength = 12;
64inline std::ostream& operator<<(std::ostream& os,
const LogicalChannelConfig& e) {
65 os <<
"rlcMode=" << e.rlcMode <<
" soFraming=" << e.soFraming
66 <<
" snFieldLength=" << e.snFieldLength <<
" lcg=" << e.lcg;
81 friend class LteHarqBufferTx;
82 friend class LteHarqBufferRx;
90 friend class LteHarqBufferRxD2D;
94 unsigned int totalOverflowedBytes_ = 0;
95 static simsignal_t macBufferOverflowDlSignal_;
96 static simsignal_t macBufferOverflowUlSignal_;
97 static simsignal_t receivedPacketFromUpperLayerSignal_;
98 static simsignal_t receivedPacketFromLowerLayerSignal_;
99 static simsignal_t sentPacketToUpperLayerSignal_;
100 static simsignal_t sentPacketToLowerLayerSignal_;
105 inet::ModuleRefByPar<Binder> binder_;
110 cGate *upInGate_ =
nullptr;
129 opp_component_ptr<cModule> networkNode_;
142 struct OutgoingConnectionInfo {
143 FlowDescriptor flowInfo;
147 OutgoingConnectionInfo() {}
148 OutgoingConnectionInfo(
const FlowDescriptor& info,
LteMacQueue *q,
LteMacBuffer *buf) : flowInfo(info), queue(q), buffer(buf) {}
167 std::map<MacCid, FlowDescriptor> connDescIn_;
179 RanNodeType nodeType_;
185 std::map<MacNodeId, simtime_t> resetHarq_;
188 opp_component_ptr<PhyBase> phy_;
191 static simsignal_t macPduAckedSignal_;
192 static simsignal_t macPduDiscardedSignal_;
193 static simsignal_t rlcPduDiscardedSignal_;
194 static simsignal_t grantSentSignal_;
195 static simsignal_t ulMacPduArrivedSignal_;
198 struct NumerologyPeriodCounter {
200 unsigned int current;
202 friend std::ostream& operator<<(std::ostream& os,
const NumerologyPeriodCounter& e) {
203 os <<
"max=" << e.max <<
" current=" << e.current;
207 std::map<NumerologyIndex, NumerologyPeriodCounter> numerologyPeriodCounter_;
211 uint64_t nrFromUpper_ = 0;
212 uint64_t nrFromLower_ = 0;
213 uint64_t nrToUpper_ = 0;
214 uint64_t nrToLower_ = 0;
217 unsigned int totalHarqErrorRateDlSum_ = 0;
218 unsigned int totalHarqErrorRateUlSum_ = 0;
219 unsigned int totalHarqErrorRateDlCount_ = 0;
220 unsigned int totalHarqErrorRateUlCount_ = 0;
224 unsigned int getNumerologyPeriodCounter(
NumerologyIndex index) {
return numerologyPeriodCounter_[index].current; }
225 virtual void decreaseNumerologyPeriodCounter();
252 void dropObj(cOwnedObject *obj)
258 void takeObj(cOwnedObject *obj)
274 LogicalCid
drbIdToLcid(DrbId drbId) {
return LogicalCid(num(drbId)); }
294 double getTtiPeriod()
304 MacNodeId getMacNodeId()
316 LteMacBuffer* getMacBuffer(MacCid cid)
320 throw cRuntimeError(
"LteMacBase::getMacBuffer - Buffer for CID %s not found", cid.str().c_str());
321 return it->second.buffer;
325 std::vector<MacCid> getActiveMacBufferCids()
327 return getActiveConnectionCids();
331 const LcgMap& getLcgMap()
337 const FlowDescriptor& getConnDesc(MacCid cid)
341 throw cRuntimeError(
"LteMacBase: Connection %s not found", cid.str().c_str());
342 return it->second.flowInfo;
346 std::vector<MacCid> getActiveConnectionCids()
348 std::vector<MacCid> activeCids;
351 activeCids.push_back(cid);
356 std::map<GHz, HarqTxBuffers> *getHarqTxBuffers()
362 std::map<GHz, HarqRxBuffers> *getHarqRxBuffers()
384 const std::map<MacCid, OutgoingConnectionInfo>& getOutgoingConnectionInfoMap()
const
390 const std::map<MacCid, FlowDescriptor>& getIncomingConnectionInfoMap()
const
396 unsigned int harqProcesses()
const
401 RanNodeType getNodeType()
407 bool isHarqReset(MacNodeId srcId)
409 if (resetHarq_.find(srcId) != resetHarq_.end()) {
410 if (resetHarq_[srcId] == NOW)
417 void recordHarqReset(MacNodeId srcId)
419 resetHarq_[srcId] = NOW;
422 virtual void unregisterHarqBufferRx(MacNodeId nodeId);
433 void refreshDisplay()
const override;
435 virtual void recordHarqErrorRate(
unsigned int sample, Direction dir);
436 virtual double getHarqErrorRate(Direction dir);
444 virtual void harqAckToFlowObserver(
const inet::Packet *macPdu);
445 virtual void discardMacPdu(
const inet::Packet *macPdu);
449 int numInitStages()
const override {
return inet::NUM_INIT_STAGES; }
495 virtual void macPduUnmake(cPacket *pkt) = 0;
541 return it !=
lcConfig_.end() ? &it->second :
nullptr;
577 virtual void macHandleGrant(cPacket *pkt)
584 virtual void macHandleRac(cPacket *pkt)
591 virtual void updateUserTxParam(cPacket *pkt) = 0;
Definition LteHarqBufferRx.h:37
MAC Layer.
Definition LteMacBase.h:80
std::map< MacCid, LogicalChannelConfig > lcConfig_
Definition LteMacBase.h:171
virtual LteHarqBufferRx * createRxHarqBuffer(MacNodeId src, const UserControlInfo *userInfo)
virtual void createOutgoingConnection(MacCid cid, const FlowDescriptor &connInfo)
std::map< GHz, HarqTxBuffers > harqTxBuffers_
Harq Tx Buffers (one entry per carrier)
Definition LteMacBase.h:159
std::map< GHz, HarqRxBuffers > harqRxBuffers_
Harq Rx Buffers (one entry per carrier)
Definition LteMacBase.h:162
virtual void createIncomingConnection(MacCid cid, const FlowDescriptor &connInfo)
void handleMessage(cMessage *msg) override
virtual void deleteQueuesRadioLinkFailure(MacNodeId nodeId)
virtual void sendUpperPackets(cPacket *pkt)
void deleteModule() override
unsigned int queueSize_
Mac Buffers maximum queue size.
Definition LteMacBase.h:135
virtual void fromRlc(cPacket *pkt)
Upper Layer Handler.
virtual void clearOutgoingConnectionBuffers(MacCid cid)
MacNodeId nodeId_
MacNodeId.
Definition LteMacBase.h:127
cGate * downInGate_
MAC --> RLC.
Definition LteMacBase.h:112
std::map< GHz, MacPduList > macPduList_
List of pdus finalized for each user on each codeword (one entry per carrier)
Definition LteMacBase.h:156
int harqProcesses_
MAC --> PHY.
Definition LteMacBase.h:118
virtual bool bufferizePacket(cPacket *pkt)
void initialize(int stage) override
virtual void deleteQueues(MacNodeId nodeId)
const LogicalChannelConfig * findLogicalChannelConfig(MacCid cid) const
Definition LteMacBase.h:538
DrbId lcidToDrbId(LogicalCid lcid)
Definition LteMacBase.h:280
virtual void macHandleFeedbackPkt(cPacket *pkt)
Definition LteMacBase.h:570
virtual MacCid ctrlInfoToMacCid(const FlowControlInfo *info)
Definition LteMacBase.h:286
virtual void handleSelfMessage()=0
std::map< MacCid, OutgoingConnectionInfo > connDescOut_
Consolidated outgoing connection information (replaces mbuf_, macBuffers_, and connDesc_)
Definition LteMacBase.h:153
const LogicalChannelConfig & getLogicalChannelConfig(MacCid cid) const
double ttiPeriod_
TTI for this node.
Definition LteMacBase.h:124
cGate * upOutGate_
MAC <– RLC.
Definition LteMacBase.h:111
virtual void sendLowerPackets(cPacket *pkt)
MacCellId cellId_
MacCellId.
Definition LteMacBase.h:132
cGate * downOutGate_
MAC <– PHY.
Definition LteMacBase.h:113
cMessage * ttiTick_
TTI self message.
Definition LteMacBase.h:121
LogicalCid drbIdToLcid(DrbId drbId)
Definition LteMacBase.h:274
virtual void deleteOutgoingConnection(MacCid cid)
virtual void recordBufferOverflow(Direction dir, double sample)
Records the buffer-overflow statistic for a dropped packet of the given direction.
virtual void handleUpperMessage(cPacket *pkt)
Definition LteMacBase.h:562
virtual void fromPhy(cPacket *pkt)
Lower Layer Handler.
virtual void configureLogicalChannel(MacCid cid, const LogicalChannelConfig &cfg)
Buffers for MAC packets.
Definition LteMacBuffer.h:28
Queue for MAC SDU packets.
Definition LteMacQueue.h:41
Definition LteTypes.h:153
Definition AlertReceiver.h:24
MacNodeId MacCellId
Cell node ID. It is numerically equal to eNodeB MAC node ID.
Definition LteTypes.h:66
unsigned short NumerologyIndex
Numerology Index.
Definition LteCommon.h:205
std::map< MacNodeId, LteHarqBufferRx * > HarqRxBuffers
Definition LteMacBase.h:42
std::map< MacNodeId, LteHarqBufferTx * > HarqTxBuffers
Definition LteMacBase.h:36
constexpr MacNodeId NODEID_NONE
MAC node ID.
Definition LteTypes.h:54