A Discrete-Event Network Simulator
API
lte-enb-mac.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Marco Miozzo <marco.miozzo@cttc.es>
19  * Nicola Baldo <nbaldo@cttc.es>
20  * Modified by:
21  * Danilo Abrignani <danilo.abrignani@unibo.it> (Carrier Aggregation - GSoC 2015)
22  * Biljana Bojovic <biljana.bojovic@cttc.es> (Carrier Aggregation)
23  */
24 
25 
26 #include <ns3/log.h>
27 #include <ns3/pointer.h>
28 #include <ns3/packet.h>
29 #include <ns3/simulator.h>
30 
31 #include "lte-amc.h"
32 #include "lte-control-messages.h"
33 #include "lte-enb-net-device.h"
34 #include "lte-ue-net-device.h"
35 
36 #include <ns3/lte-enb-mac.h>
37 #include <ns3/lte-radio-bearer-tag.h>
38 #include <ns3/lte-ue-phy.h>
39 
40 #include "ns3/lte-mac-sap.h"
41 #include "ns3/lte-enb-cmac-sap.h"
42 #include <ns3/lte-common.h>
43 
44 
45 namespace ns3 {
46 
47 NS_LOG_COMPONENT_DEFINE ("LteEnbMac");
48 
49 NS_OBJECT_ENSURE_REGISTERED (LteEnbMac);
50 
51 
52 
53 // //////////////////////////////////////
54 // member SAP forwarders
55 // //////////////////////////////////////
56 
57 
60 {
61 public:
68 
69  // inherited from LteEnbCmacSapProvider
70  virtual void ConfigureMac (uint16_t ulBandwidth, uint16_t dlBandwidth);
71  virtual void AddUe (uint16_t rnti);
72  virtual void RemoveUe (uint16_t rnti);
73  virtual void AddLc (LcInfo lcinfo, LteMacSapUser* msu);
74  virtual void ReconfigureLc (LcInfo lcinfo);
75  virtual void ReleaseLc (uint16_t rnti, uint8_t lcid);
76  virtual void UeUpdateConfigurationReq (UeConfig params);
77  virtual RachConfig GetRachConfig ();
79 
80 
81 private:
83 };
84 
85 
87  : m_mac (mac)
88 {
89 }
90 
91 void
92 EnbMacMemberLteEnbCmacSapProvider::ConfigureMac (uint16_t ulBandwidth, uint16_t dlBandwidth)
93 {
94  m_mac->DoConfigureMac (ulBandwidth, dlBandwidth);
95 }
96 
97 void
99 {
100  m_mac->DoAddUe (rnti);
101 }
102 
103 void
105 {
106  m_mac->DoRemoveUe (rnti);
107 }
108 
109 void
111 {
112  m_mac->DoAddLc (lcinfo, msu);
113 }
114 
115 void
117 {
118  m_mac->DoReconfigureLc (lcinfo);
119 }
120 
121 void
122 EnbMacMemberLteEnbCmacSapProvider::ReleaseLc (uint16_t rnti, uint8_t lcid)
123 {
124  m_mac->DoReleaseLc (rnti, lcid);
125 }
126 
127 void
129 {
131 }
132 
135 {
136  return m_mac->DoGetRachConfig ();
137 }
138 
141 {
142  return m_mac->DoAllocateNcRaPreamble (rnti);
143 }
144 
145 
148 {
149 public:
156 
157 
158  virtual void SchedDlConfigInd (const struct SchedDlConfigIndParameters& params);
159  virtual void SchedUlConfigInd (const struct SchedUlConfigIndParameters& params);
160 private:
162 };
163 
164 
166  : m_mac (mac)
167 {
168 }
169 
170 
171 void
173 {
174  m_mac->DoSchedDlConfigInd (params);
175 }
176 
177 
178 
179 void
181 {
182  m_mac->DoSchedUlConfigInd (params);
183 }
184 
185 
188 {
189 public:
196 
197  virtual void CschedCellConfigCnf (const struct CschedCellConfigCnfParameters& params);
198  virtual void CschedUeConfigCnf (const struct CschedUeConfigCnfParameters& params);
199  virtual void CschedLcConfigCnf (const struct CschedLcConfigCnfParameters& params);
200  virtual void CschedLcReleaseCnf (const struct CschedLcReleaseCnfParameters& params);
201  virtual void CschedUeReleaseCnf (const struct CschedUeReleaseCnfParameters& params);
202  virtual void CschedUeConfigUpdateInd (const struct CschedUeConfigUpdateIndParameters& params);
203  virtual void CschedCellConfigUpdateInd (const struct CschedCellConfigUpdateIndParameters& params);
204 
205 private:
207 };
208 
209 
211  : m_mac (mac)
212 {
213 }
214 
215 void
217 {
218  m_mac->DoCschedCellConfigCnf (params);
219 }
220 
221 void
223 {
224  m_mac->DoCschedUeConfigCnf (params);
225 }
226 
227 void
229 {
230  m_mac->DoCschedLcConfigCnf (params);
231 }
232 
233 void
235 {
236  m_mac->DoCschedLcReleaseCnf (params);
237 }
238 
239 void
241 {
242  m_mac->DoCschedUeReleaseCnf (params);
243 }
244 
245 void
247 {
249 }
250 
251 void
253 {
255 }
256 
257 
258 
261 {
262 public:
269 
270  // inherited from LteEnbPhySapUser
271  virtual void ReceivePhyPdu (Ptr<Packet> p);
272  virtual void SubframeIndication (uint32_t frameNo, uint32_t subframeNo);
274  virtual void ReceiveRachPreamble (uint32_t prachId);
278 
279 private:
281 };
282 
284 {
285 }
286 
287 
288 void
290 {
291  m_mac->DoReceivePhyPdu (p);
292 }
293 
294 void
295 EnbMacMemberLteEnbPhySapUser::SubframeIndication (uint32_t frameNo, uint32_t subframeNo)
296 {
297  m_mac->DoSubframeIndication (frameNo, subframeNo);
298 }
299 
300 void
302 {
304 }
305 
306 void
308 {
309  m_mac->DoReceiveRachPreamble (prachId);
310 }
311 
312 void
314 {
315  m_mac->DoUlCqiReport (ulcqi);
316 }
317 
318 void
320 {
322 }
323 
324 void
326 {
328 }
329 
330 
331 // //////////////////////////////////////
332 // generic LteEnbMac methods
333 // //////////////////////////////////////
334 
335 
336 TypeId
338 {
339  static TypeId tid = TypeId ("ns3::LteEnbMac")
340  .SetParent<Object> ()
341  .SetGroupName("Lte")
342  .AddConstructor<LteEnbMac> ()
343  .AddAttribute ("NumberOfRaPreambles",
344  "how many random access preambles are available for the contention based RACH process",
345  UintegerValue (52),
347  MakeUintegerChecker<uint8_t> (4, 64))
348  .AddAttribute ("PreambleTransMax",
349  "Maximum number of random access preamble transmissions",
350  UintegerValue (50),
352  MakeUintegerChecker<uint8_t> (3, 200))
353  .AddAttribute ("RaResponseWindowSize",
354  "length of the window (in TTIs) for the reception of the random access response (RAR); the resulting RAR timeout is this value + 3 ms",
355  UintegerValue (3),
357  MakeUintegerChecker<uint8_t> (2, 10))
358  .AddAttribute ("ConnEstFailCount",
359  "how many time T300 timer can expire on the same cell",
360  UintegerValue (1),
362  MakeUintegerChecker<uint8_t> (1, 4))
363  .AddTraceSource ("DlScheduling",
364  "Information regarding DL scheduling.",
366  "ns3::LteEnbMac::DlSchedulingTracedCallback")
367  .AddTraceSource ("UlScheduling",
368  "Information regarding UL scheduling.",
370  "ns3::LteEnbMac::UlSchedulingTracedCallback")
371  .AddAttribute ("ComponentCarrierId",
372  "ComponentCarrier Id, needed to reply on the appropriate sap.",
373  UintegerValue (0),
375  MakeUintegerChecker<uint8_t> (0,4))
376  ;
377 
378  return tid;
379 }
380 
381 
383 m_ccmMacSapUser (0)
384 {
385  NS_LOG_FUNCTION (this);
392 }
393 
394 
396 {
397  NS_LOG_FUNCTION (this);
398 }
399 
400 void
402 {
403  NS_LOG_FUNCTION (this);
404  m_dlCqiReceived.clear ();
405  m_ulCqiReceived.clear ();
406  m_ulCeReceived.clear ();
407  m_dlInfoListReceived.clear ();
408  m_ulInfoListReceived.clear ();
410  delete m_macSapProvider;
411  delete m_cmacSapProvider;
412  delete m_schedSapUser;
413  delete m_cschedSapUser;
414  delete m_enbPhySapUser;
415  delete m_ccmMacSapProvider;
416 }
417 
418 void
420 {
421  m_componentCarrierId = index;
422 }
423 
424 void
426 {
427  m_schedSapProvider = s;
428 }
429 
432 {
433  return m_schedSapUser;
434 }
435 
436 void
438 {
440 }
441 
444 {
445  return m_cschedSapUser;
446 }
447 
448 
449 
450 void
452 {
453  m_macSapUser = s;
454 }
455 
458 {
459  return m_macSapProvider;
460 }
461 
462 void
464 {
465  m_cmacSapUser = s;
466 }
467 
470 {
471  return m_cmacSapProvider;
472 }
473 
474 void
476 {
478 }
479 
480 
483 {
484  return m_enbPhySapUser;
485 }
486 
487 void
489 {
490  m_ccmMacSapUser = s;
491 }
492 
493 
496 {
497  return m_ccmMacSapProvider;
498 }
499 
500 void
501 LteEnbMac::DoSubframeIndication (uint32_t frameNo, uint32_t subframeNo)
502 {
503  NS_LOG_FUNCTION (this << " EnbMac - frame " << frameNo << " subframe " << subframeNo);
504 
505  // Store current frame / subframe number
506  m_frameNo = frameNo;
507  m_subframeNo = subframeNo;
508 
509 
510  // --- DOWNLINK ---
511  // Send Dl-CQI info to the scheduler
512  if (m_dlCqiReceived.size () > 0)
513  {
515  dlcqiInfoReq.m_sfnSf = ((0x3FF & frameNo) << 4) | (0xF & subframeNo);
516  dlcqiInfoReq.m_cqiList.insert (dlcqiInfoReq.m_cqiList.begin (), m_dlCqiReceived.begin (), m_dlCqiReceived.end ());
517  m_dlCqiReceived.erase (m_dlCqiReceived.begin (), m_dlCqiReceived.end ());
518  m_schedSapProvider->SchedDlCqiInfoReq (dlcqiInfoReq);
519  }
520 
521  if (!m_receivedRachPreambleCount.empty ())
522  {
523  // process received RACH preambles and notify the scheduler
525  NS_ASSERT (subframeNo > 0 && subframeNo <= 10); // subframe in 1..10
526  for (std::map<uint8_t, uint32_t>::const_iterator it = m_receivedRachPreambleCount.begin ();
527  it != m_receivedRachPreambleCount.end ();
528  ++it)
529  {
530  NS_LOG_INFO (this << " preambleId " << (uint32_t) it->first << ": " << it->second << " received");
531  NS_ASSERT (it->second != 0);
532  if (it->second > 1)
533  {
534  NS_LOG_INFO ("preambleId " << (uint32_t) it->first << ": collision");
535  // in case of collision we assume that no preamble is
536  // successfully received, hence no RAR is sent
537  }
538  else
539  {
540  uint16_t rnti;
541  std::map<uint8_t, NcRaPreambleInfo>::iterator jt = m_allocatedNcRaPreambleMap.find (it->first);
542  if (jt != m_allocatedNcRaPreambleMap.end ())
543  {
544  rnti = jt->second.rnti;
545  NS_LOG_INFO ("preambleId previously allocated for NC based RA, RNTI =" << (uint32_t) rnti << ", sending RAR");
546 
547  }
548  else
549  {
551  NS_LOG_INFO ("preambleId " << (uint32_t) it->first << ": allocated T-C-RNTI " << (uint32_t) rnti << ", sending RAR");
552  }
553 
554  RachListElement_s rachLe;
555  rachLe.m_rnti = rnti;
556  rachLe.m_estimatedSize = 144; // to be confirmed
557  rachInfoReqParams.m_rachList.push_back (rachLe);
558  m_rapIdRntiMap.insert (std::pair <uint16_t, uint32_t> (rnti, it->first));
559  }
560  }
561  m_schedSapProvider->SchedDlRachInfoReq (rachInfoReqParams);
563  }
564  // Get downlink transmission opportunities
565  uint32_t dlSchedFrameNo = m_frameNo;
566  uint32_t dlSchedSubframeNo = m_subframeNo;
567  // NS_LOG_DEBUG (this << " sfn " << frameNo << " sbfn " << subframeNo);
568  if (dlSchedSubframeNo + m_macChTtiDelay > 10)
569  {
570  dlSchedFrameNo++;
571  dlSchedSubframeNo = (dlSchedSubframeNo + m_macChTtiDelay) % 10;
572  }
573  else
574  {
575  dlSchedSubframeNo = dlSchedSubframeNo + m_macChTtiDelay;
576  }
578  dlparams.m_sfnSf = ((0x3FF & dlSchedFrameNo) << 4) | (0xF & dlSchedSubframeNo);
579 
580  // Forward DL HARQ feebacks collected during last TTI
581  if (m_dlInfoListReceived.size () > 0)
582  {
584  // empty local buffer
585  m_dlInfoListReceived.clear ();
586  }
587 
589 
590 
591  // --- UPLINK ---
592  // Send UL-CQI info to the scheduler
593  for (uint16_t i = 0; i < m_ulCqiReceived.size (); i++)
594  {
595  if (subframeNo > 1)
596  {
597  m_ulCqiReceived.at (i).m_sfnSf = ((0x3FF & frameNo) << 4) | (0xF & (subframeNo - 1));
598  }
599  else
600  {
601  m_ulCqiReceived.at (i).m_sfnSf = ((0x3FF & (frameNo - 1)) << 4) | (0xF & 10);
602  }
604  }
605  m_ulCqiReceived.clear ();
606 
607  // Send BSR reports to the scheduler
608  if (m_ulCeReceived.size () > 0)
609  {
611  ulMacReq.m_sfnSf = ((0x3FF & frameNo) << 4) | (0xF & subframeNo);
612  ulMacReq.m_macCeList.insert (ulMacReq.m_macCeList.begin (), m_ulCeReceived.begin (), m_ulCeReceived.end ());
613  m_ulCeReceived.erase (m_ulCeReceived.begin (), m_ulCeReceived.end ());
615  }
616 
617 
618  // Get uplink transmission opportunities
619  uint32_t ulSchedFrameNo = m_frameNo;
620  uint32_t ulSchedSubframeNo = m_subframeNo;
621  // NS_LOG_DEBUG (this << " sfn " << frameNo << " sbfn " << subframeNo);
622  if (ulSchedSubframeNo + (m_macChTtiDelay + UL_PUSCH_TTIS_DELAY) > 10)
623  {
624  ulSchedFrameNo++;
625  ulSchedSubframeNo = (ulSchedSubframeNo + (m_macChTtiDelay + UL_PUSCH_TTIS_DELAY)) % 10;
626  }
627  else
628  {
629  ulSchedSubframeNo = ulSchedSubframeNo + (m_macChTtiDelay + UL_PUSCH_TTIS_DELAY);
630  }
632  ulparams.m_sfnSf = ((0x3FF & ulSchedFrameNo) << 4) | (0xF & ulSchedSubframeNo);
633 
634  // Forward DL HARQ feebacks collected during last TTI
635  if (m_ulInfoListReceived.size () > 0)
636  {
638  // empty local buffer
639  m_ulInfoListReceived.clear ();
640  }
641 
643 
644 }
645 
646 
647 void
649 {
650  NS_LOG_FUNCTION (this << msg);
651  if (msg->GetMessageType () == LteControlMessage::DL_CQI)
652  {
653  Ptr<DlCqiLteControlMessage> dlcqi = DynamicCast<DlCqiLteControlMessage> (msg);
655  }
656  else if (msg->GetMessageType () == LteControlMessage::BSR)
657  {
658  Ptr<BsrLteControlMessage> bsr = DynamicCast<BsrLteControlMessage> (msg);
659  ReceiveBsrMessage (bsr->GetBsr ());
660  }
661  else if (msg->GetMessageType () == LteControlMessage::DL_HARQ)
662  {
663  Ptr<DlHarqFeedbackLteControlMessage> dlharq = DynamicCast<DlHarqFeedbackLteControlMessage> (msg);
664  DoDlInfoListElementHarqFeeback (dlharq->GetDlHarqFeedback ());
665  }
666  else
667  {
668  NS_LOG_LOGIC (this << " LteControlMessage type " << msg->GetMessageType () << " not recognized");
669  }
670 }
671 
672 void
674 {
675  NS_LOG_FUNCTION (this << (uint32_t) rapId);
676  // just record that the preamble has been received; it will be processed later
677  ++m_receivedRachPreambleCount[rapId]; // will create entry if not exists
678 }
679 
680 void
682 {
683  if (ulcqi.m_ulCqi.m_type == UlCqi_s::PUSCH)
684  {
685  NS_LOG_DEBUG (this << " eNB rxed an PUSCH UL-CQI");
686  }
687  else if (ulcqi.m_ulCqi.m_type == UlCqi_s::SRS)
688  {
689  NS_LOG_DEBUG (this << " eNB rxed an SRS UL-CQI");
690  }
691  m_ulCqiReceived.push_back (ulcqi);
692 }
693 
694 
695 void
697 {
698  NS_LOG_FUNCTION (this << msg);
699 
700  CqiListElement_s dlcqi = msg->GetDlCqi ();
701  NS_LOG_LOGIC (this << "Enb Received DL-CQI rnti" << dlcqi.m_rnti);
702  NS_ASSERT (dlcqi.m_rnti != 0);
703  m_dlCqiReceived.push_back (dlcqi);
704 
705 }
706 
707 
708 void
710 {
711  NS_LOG_FUNCTION (this);
713 }
714 
715 void
717 {
718  NS_LOG_FUNCTION (this);
719  NS_LOG_DEBUG (this << " bsr Size " << (uint16_t) m_ulCeReceived.size ());
720  //send to LteCcmMacSapUser
721  m_ulCeReceived.push_back (bsr); // this to called when LteUlCcmSapProvider::ReportMacCeToScheduler is called
722  NS_LOG_DEBUG (this << " bsr Size after push_back " << (uint16_t) m_ulCeReceived.size ());
723 }
724 
725 
726 void
728 {
729  NS_LOG_FUNCTION (this);
730  LteRadioBearerTag tag;
731  p->RemovePacketTag (tag);
732 
733  // store info of the packet received
734 
735 // std::map <uint16_t,UlInfoListElement_s>::iterator it;
736 // u_int rnti = tag.GetRnti ();
737 // u_int lcid = tag.GetLcid ();
738 // it = m_ulInfoListElements.find (tag.GetRnti ());
739 // if (it == m_ulInfoListElements.end ())
740 // {
741 // // new RNTI
742 // UlInfoListElement_s ulinfonew;
743 // ulinfonew.m_rnti = tag.GetRnti ();
744 // // always allocate full size of ulReception vector, initializing all elements to 0
745 // ulinfonew.m_ulReception.assign (MAX_LC_LIST+1, 0);
746 // // set the element for the current LCID
747 // ulinfonew.m_ulReception.at (tag.GetLcid ()) = p->GetSize ();
748 // ulinfonew.m_receptionStatus = UlInfoListElement_s::Ok;
749 // ulinfonew.m_tpc = 0; // Tx power control not implemented at this stage
750 // m_ulInfoListElements.insert (std::pair<uint16_t, UlInfoListElement_s > (tag.GetRnti (), ulinfonew));
751 //
752 // }
753 // else
754 // {
755 // // existing RNTI: we just set the value for the current
756 // // LCID. Note that the corresponding element had already been
757 // // allocated previously.
758 // NS_ASSERT_MSG ((*it).second.m_ulReception.at (tag.GetLcid ()) == 0, "would overwrite previously written ulReception element");
759 // (*it).second.m_ulReception.at (tag.GetLcid ()) = p->GetSize ();
760 // (*it).second.m_receptionStatus = UlInfoListElement_s::Ok;
761 // }
762 
763 
764 
765  // forward the packet to the correspondent RLC
766  uint16_t rnti = tag.GetRnti ();
767  uint8_t lcid = tag.GetLcid ();
768  std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator rntiIt = m_rlcAttached.find (rnti);
769  NS_ASSERT_MSG (rntiIt != m_rlcAttached.end (), "could not find RNTI" << rnti);
770  std::map<uint8_t, LteMacSapUser*>::iterator lcidIt = rntiIt->second.find (lcid);
771  //NS_ASSERT_MSG (lcidIt != rntiIt->second.end (), "could not find LCID" << lcid);
772 
774  rxPduParams.p = p;
775  rxPduParams.rnti = rnti;
776  rxPduParams.lcid = lcid;
777 
778  //Receive PDU only if LCID is found
779  if (lcidIt != rntiIt->second.end ())
780  {
781  (*lcidIt).second->ReceivePdu (rxPduParams);
782  }
783 }
784 
785 
786 
787 // ////////////////////////////////////////////
788 // CMAC SAP
789 // ////////////////////////////////////////////
790 
791 void
792 LteEnbMac::DoConfigureMac (uint16_t ulBandwidth, uint16_t dlBandwidth)
793 {
794  NS_LOG_FUNCTION (this << " ulBandwidth=" << ulBandwidth << " dlBandwidth=" << dlBandwidth);
796  // Configure the subset of parameters used by FfMacScheduler
797  params.m_ulBandwidth = ulBandwidth;
798  params.m_dlBandwidth = dlBandwidth;
800  // ...more parameters can be configured
802 }
803 
804 
805 void
806 LteEnbMac::DoAddUe (uint16_t rnti)
807 {
808  NS_LOG_FUNCTION (this << " rnti=" << rnti);
809  std::map<uint8_t, LteMacSapUser*> empty;
810  std::pair <std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator, bool>
811  ret = m_rlcAttached.insert (std::pair <uint16_t, std::map<uint8_t, LteMacSapUser*> >
812  (rnti, empty));
813  NS_ASSERT_MSG (ret.second, "element already present, RNTI already existed");
814 
816  params.m_rnti = rnti;
817  params.m_transmissionMode = 0; // set to default value (SISO) for avoiding random initialization (valgrind error)
818 
820 
821  // Create DL transmission HARQ buffers
822  std::vector < Ptr<PacketBurst> > dlHarqLayer0pkt;
823  dlHarqLayer0pkt.resize (8);
824  for (uint8_t i = 0; i < 8; i++)
825  {
826  Ptr<PacketBurst> pb = CreateObject <PacketBurst> ();
827  dlHarqLayer0pkt.at (i) = pb;
828  }
829  std::vector < Ptr<PacketBurst> > dlHarqLayer1pkt;
830  dlHarqLayer1pkt.resize (8);
831  for (uint8_t i = 0; i < 8; i++)
832  {
833  Ptr<PacketBurst> pb = CreateObject <PacketBurst> ();
834  dlHarqLayer1pkt.at (i) = pb;
835  }
837  buf.push_back (dlHarqLayer0pkt);
838  buf.push_back (dlHarqLayer1pkt);
839  m_miDlHarqProcessesPackets.insert (std::pair <uint16_t, DlHarqProcessesBuffer_t> (rnti, buf));
840 }
841 
842 void
843 LteEnbMac::DoRemoveUe (uint16_t rnti)
844 {
845  NS_LOG_FUNCTION (this << " rnti=" << rnti);
847  params.m_rnti = rnti;
849  m_rlcAttached.erase (rnti);
850  m_miDlHarqProcessesPackets.erase (rnti);
851 
852  NS_LOG_DEBUG ("start checking for unprocessed preamble for rnti: " << rnti);
853  //remove unprocessed preamble received for RACH during handover
854  std::map<uint8_t, NcRaPreambleInfo>::iterator jt = m_allocatedNcRaPreambleMap.begin ();
855  while (jt != m_allocatedNcRaPreambleMap.end ())
856  {
857  if (jt->second.rnti == rnti)
858  {
859  std::map<uint8_t, uint32_t>::const_iterator it = m_receivedRachPreambleCount.find (jt->first);
860  if (it != m_receivedRachPreambleCount.end ())
861  {
862  m_receivedRachPreambleCount.erase (it->first);
863  }
864  jt = m_allocatedNcRaPreambleMap.erase (jt);
865  }
866  else
867  {
868  ++jt;
869  }
870  }
871 
872  std::vector<MacCeListElement_s>::iterator itCeRxd = m_ulCeReceived.begin ();
873  while (itCeRxd != m_ulCeReceived.end ())
874  {
875  if (itCeRxd->m_rnti == rnti)
876  {
877  itCeRxd = m_ulCeReceived.erase (itCeRxd);
878  }
879  else
880  {
881  itCeRxd++;
882  }
883  }
884 }
885 
886 void
888 {
889  NS_LOG_FUNCTION (this << lcinfo.rnti << (uint16_t) lcinfo.lcId);
890 
891  std::map <LteFlowId_t, LteMacSapUser* >::iterator it;
892 
893  LteFlowId_t flow (lcinfo.rnti, lcinfo.lcId);
894 
895  std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator rntiIt = m_rlcAttached.find (lcinfo.rnti);
896  NS_ASSERT_MSG (rntiIt != m_rlcAttached.end (), "RNTI not found");
897  std::map<uint8_t, LteMacSapUser*>::iterator lcidIt = rntiIt->second.find (lcinfo.lcId);
898  if (lcidIt == rntiIt->second.end ())
899  {
900  rntiIt->second.insert (std::pair<uint8_t, LteMacSapUser*> (lcinfo.lcId, msu));
901  }
902  else
903  {
904  NS_LOG_ERROR ("LC already exists");
905  }
906 
907  // CCCH (LCID 0) is pre-configured
908  // see FF LTE MAC Scheduler
909  // Interface Specification v1.11,
910  // 4.3.4 logicalChannelConfigListElement
911  if (lcinfo.lcId != 0)
912  {
914  params.m_rnti = lcinfo.rnti;
915  params.m_reconfigureFlag = false;
916 
918  lccle.m_logicalChannelIdentity = lcinfo.lcId;
919  lccle.m_logicalChannelGroup = lcinfo.lcGroup;
922  lccle.m_qci = lcinfo.qci;
923  lccle.m_eRabMaximulBitrateUl = lcinfo.mbrUl;
924  lccle.m_eRabMaximulBitrateDl = lcinfo.mbrDl;
925  lccle.m_eRabGuaranteedBitrateUl = lcinfo.gbrUl;
926  lccle.m_eRabGuaranteedBitrateDl = lcinfo.gbrDl;
927  params.m_logicalChannelConfigList.push_back (lccle);
928 
930  }
931 }
932 
933 void
935 {
936  NS_FATAL_ERROR ("not implemented");
937 }
938 
939 void
940 LteEnbMac::DoReleaseLc (uint16_t rnti, uint8_t lcid)
941 {
942  NS_LOG_FUNCTION (this);
943 
944  //Find user based on rnti and then erase lcid stored against the same
945  std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator rntiIt = m_rlcAttached.find (rnti);
946  rntiIt->second.erase (lcid);
947 
949  params.m_rnti = rnti;
950  params.m_logicalChannelIdentity.push_back (lcid);
952 }
953 
954 void
956 {
957  NS_LOG_FUNCTION (this);
958 
959  // propagates to scheduler
961  req.m_rnti = params.m_rnti;
963  req.m_reconfigureFlag = true;
965 }
966 
969 {
975  return rc;
976 }
977 
980 {
981  bool found = false;
982  uint8_t preambleId;
983  for (preambleId = m_numberOfRaPreambles; preambleId < 64; ++preambleId)
984  {
985  std::map<uint8_t, NcRaPreambleInfo>::iterator it = m_allocatedNcRaPreambleMap.find (preambleId);
997  if ((it != m_allocatedNcRaPreambleMap.end ()) && (it->second.expiryTime < Simulator::Now ()))
998  {
999  if (!m_cmacSapUser->IsRandomAccessCompleted (it->second.rnti))
1000  {
1001  //random access of the UE is not completed,
1002  //check other preambles
1003  continue;
1004  }
1005  }
1006  if ((it == m_allocatedNcRaPreambleMap.end ())
1007  || (it->second.expiryTime < Simulator::Now ()))
1008  {
1009  found = true;
1010  NcRaPreambleInfo preambleInfo;
1011  uint32_t expiryIntervalMs = (uint32_t) m_preambleTransMax * ((uint32_t) m_raResponseWindowSize + 5);
1012 
1013  preambleInfo.expiryTime = Simulator::Now () + MilliSeconds (expiryIntervalMs);
1014  preambleInfo.rnti = rnti;
1015  NS_LOG_INFO ("allocated preamble for NC based RA: preamble " << preambleId << ", RNTI " << preambleInfo.rnti << ", exiryTime " << preambleInfo.expiryTime);
1016  m_allocatedNcRaPreambleMap[preambleId] = preambleInfo; // create if not exist, update otherwise
1017  break;
1018  }
1019  }
1021  if (found)
1022  {
1023  ret.valid = true;
1024  ret.raPreambleId = preambleId;
1025  ret.raPrachMaskIndex = 0;
1026  }
1027  else
1028  {
1029  ret.valid = false;
1030  ret.raPreambleId = 0;
1031  ret.raPrachMaskIndex = 0;
1032  }
1033  return ret;
1034 }
1035 
1036 
1037 
1038 // ////////////////////////////////////////////
1039 // MAC SAP
1040 // ////////////////////////////////////////////
1041 
1042 
1043 void
1045 {
1046  NS_LOG_FUNCTION (this);
1047  LteRadioBearerTag tag (params.rnti, params.lcid, params.layer);
1048  params.pdu->AddPacketTag (tag);
1050  // Store pkt in HARQ buffer
1051  std::map <uint16_t, DlHarqProcessesBuffer_t>::iterator it = m_miDlHarqProcessesPackets.find (params.rnti);
1052  NS_ASSERT (it != m_miDlHarqProcessesPackets.end ());
1053  NS_LOG_DEBUG (this << " LAYER " << (uint16_t)tag.GetLayer () << " HARQ ID " << (uint16_t)params.harqProcessId);
1054 
1055  //(*it).second.at (params.layer).at (params.harqProcessId) = params.pdu;//->Copy ();
1056  (*it).second.at (params.layer).at (params.harqProcessId)->AddPacket (params.pdu);
1058 }
1059 
1060 void
1062 {
1063  NS_LOG_FUNCTION (this);
1065  req.m_rnti = params.rnti;
1066  req.m_logicalChannelIdentity = params.lcid;
1071  req.m_rlcStatusPduSize = params.statusPduSize;
1073 }
1074 
1075 
1076 
1077 // ////////////////////////////////////////////
1078 // SCHED SAP
1079 // ////////////////////////////////////////////
1080 
1081 
1082 
1083 void
1085 {
1086  NS_LOG_FUNCTION (this);
1087  // Create DL PHY PDU
1088  Ptr<PacketBurst> pb = CreateObject<PacketBurst> ();
1089  std::map <LteFlowId_t, LteMacSapUser* >::iterator it;
1091 
1092  for (unsigned int i = 0; i < ind.m_buildDataList.size (); i++)
1093  {
1094  for (uint16_t layer = 0; layer < ind.m_buildDataList.at (i).m_dci.m_ndi.size (); layer++)
1095  {
1096  if (ind.m_buildDataList.at (i).m_dci.m_ndi.at (layer) == 1)
1097  {
1098  // new data -> force emptying correspondent harq pkt buffer
1099  std::map <uint16_t, DlHarqProcessesBuffer_t>::iterator it = m_miDlHarqProcessesPackets.find (ind.m_buildDataList.at (i).m_rnti);
1100  NS_ASSERT (it != m_miDlHarqProcessesPackets.end ());
1101  for (uint16_t lcId = 0; lcId < (*it).second.size (); lcId++)
1102  {
1103  Ptr<PacketBurst> pb = CreateObject <PacketBurst> ();
1104  (*it).second.at (lcId).at (ind.m_buildDataList.at (i).m_dci.m_harqProcess) = pb;
1105  }
1106  }
1107  }
1108  for (unsigned int j = 0; j < ind.m_buildDataList.at (i).m_rlcPduList.size (); j++)
1109  {
1110  for (uint16_t k = 0; k < ind.m_buildDataList.at (i).m_rlcPduList.at (j).size (); k++)
1111  {
1112  if (ind.m_buildDataList.at (i).m_dci.m_ndi.at (k) == 1)
1113  {
1114  // New Data -> retrieve it from RLC
1115  uint16_t rnti = ind.m_buildDataList.at (i).m_rnti;
1116  uint8_t lcid = ind.m_buildDataList.at (i).m_rlcPduList.at (j).at (k).m_logicalChannelIdentity;
1117  std::map <uint16_t, std::map<uint8_t, LteMacSapUser*> >::iterator rntiIt = m_rlcAttached.find (rnti);
1118  NS_ASSERT_MSG (rntiIt != m_rlcAttached.end (), "could not find RNTI" << rnti);
1119  std::map<uint8_t, LteMacSapUser*>::iterator lcidIt = rntiIt->second.find (lcid);
1120  NS_ASSERT_MSG (lcidIt != rntiIt->second.end (), "could not find LCID" << (uint32_t)lcid<<" carrier id:"<<(uint16_t)m_componentCarrierId);
1121  NS_LOG_DEBUG (this << " rnti= " << rnti << " lcid= " << (uint32_t) lcid << " layer= " << k);
1122  txOpParams.bytes = ind.m_buildDataList.at (i).m_rlcPduList.at (j).at (k).m_size;
1123  txOpParams.layer = k;
1124  txOpParams.harqId = ind.m_buildDataList.at (i).m_dci.m_harqProcess;
1126  txOpParams.rnti = rnti;
1127  txOpParams.lcid = lcid;
1128  (*lcidIt).second->NotifyTxOpportunity (txOpParams);
1129  }
1130  else
1131  {
1132  if (ind.m_buildDataList.at (i).m_dci.m_tbsSize.at (k) > 0)
1133  {
1134  // HARQ retransmission -> retrieve TB from HARQ buffer
1135  std::map <uint16_t, DlHarqProcessesBuffer_t>::iterator it = m_miDlHarqProcessesPackets.find (ind.m_buildDataList.at (i).m_rnti);
1136  NS_ASSERT (it != m_miDlHarqProcessesPackets.end ());
1137  Ptr<PacketBurst> pb = (*it).second.at (k).at ( ind.m_buildDataList.at (i).m_dci.m_harqProcess);
1138  for (std::list<Ptr<Packet> >::const_iterator j = pb->Begin (); j != pb->End (); ++j)
1139  {
1140  Ptr<Packet> pkt = (*j)->Copy ();
1142  }
1143  }
1144  }
1145  }
1146  }
1147  // send the relative DCI
1148  Ptr<DlDciLteControlMessage> msg = Create<DlDciLteControlMessage> ();
1149  msg->SetDci (ind.m_buildDataList.at (i).m_dci);
1151  }
1152 
1153  // Fire the trace with the DL information
1154  for ( uint32_t i = 0; i < ind.m_buildDataList.size (); i++ )
1155  {
1156  // Only one TB used
1157  if (ind.m_buildDataList.at (i).m_dci.m_tbsSize.size () == 1)
1158  {
1159  DlSchedulingCallbackInfo dlSchedulingCallbackInfo;
1160  dlSchedulingCallbackInfo.frameNo = m_frameNo;
1161  dlSchedulingCallbackInfo.subframeNo = m_subframeNo;
1162  dlSchedulingCallbackInfo.rnti = ind.m_buildDataList.at (i).m_dci.m_rnti;
1163  dlSchedulingCallbackInfo.mcsTb1=ind.m_buildDataList.at (i).m_dci.m_mcs.at (0);
1164  dlSchedulingCallbackInfo.sizeTb1 = ind.m_buildDataList.at (i).m_dci.m_tbsSize.at (0);
1165  dlSchedulingCallbackInfo.mcsTb2 = 0;
1166  dlSchedulingCallbackInfo.sizeTb2 = 0;
1167  dlSchedulingCallbackInfo.componentCarrierId = m_componentCarrierId;
1168  m_dlScheduling(dlSchedulingCallbackInfo);
1169  }
1170  // Two TBs used
1171  else if (ind.m_buildDataList.at (i).m_dci.m_tbsSize.size () == 2)
1172  {
1173  DlSchedulingCallbackInfo dlSchedulingCallbackInfo;
1174  dlSchedulingCallbackInfo.frameNo = m_frameNo;
1175  dlSchedulingCallbackInfo.subframeNo = m_subframeNo;
1176  dlSchedulingCallbackInfo.rnti = ind.m_buildDataList.at (i).m_dci.m_rnti;
1177  dlSchedulingCallbackInfo.mcsTb1=ind.m_buildDataList.at (i).m_dci.m_mcs.at (0);
1178  dlSchedulingCallbackInfo.sizeTb1 = ind.m_buildDataList.at (i).m_dci.m_tbsSize.at (0);
1179  dlSchedulingCallbackInfo.mcsTb2 = ind.m_buildDataList.at (i).m_dci.m_mcs.at (1);
1180  dlSchedulingCallbackInfo.sizeTb2 = ind.m_buildDataList.at (i).m_dci.m_tbsSize.at (1);
1181  dlSchedulingCallbackInfo.componentCarrierId = m_componentCarrierId;
1182  m_dlScheduling(dlSchedulingCallbackInfo);
1183  }
1184  else
1185  {
1186  NS_FATAL_ERROR ("Found element with more than two transport blocks");
1187  }
1188  }
1189 
1190  // Random Access procedure: send RARs
1191  Ptr<RarLteControlMessage> rarMsg = Create<RarLteControlMessage> ();
1192  // see TS 36.321 5.1.4; preambles were sent two frames ago
1193  // (plus 3GPP counts subframes from 0, not 1)
1194  uint16_t raRnti;
1195  if (m_subframeNo < 3)
1196  {
1197  raRnti = m_subframeNo + 7; // equivalent to +10-3
1198  }
1199  else
1200  {
1201  raRnti = m_subframeNo - 3;
1202  }
1203  rarMsg->SetRaRnti (raRnti);
1204  for (unsigned int i = 0; i < ind.m_buildRarList.size (); i++)
1205  {
1206  std::map <uint16_t, uint32_t>::iterator itRapId = m_rapIdRntiMap.find (ind.m_buildRarList.at (i).m_rnti);
1207  if (itRapId == m_rapIdRntiMap.end ())
1208  {
1209  NS_FATAL_ERROR ("Unable to find rapId of RNTI " << ind.m_buildRarList.at (i).m_rnti);
1210  }
1212  rar.rapId = itRapId->second;
1213  rar.rarPayload = ind.m_buildRarList.at (i);
1214  rarMsg->AddRar (rar);
1215  NS_LOG_INFO (this << " Send RAR message to RNTI " << ind.m_buildRarList.at (i).m_rnti << " rapId " << itRapId->second);
1216  }
1217  if (ind.m_buildRarList.size () > 0)
1218  {
1220  }
1221  m_rapIdRntiMap.clear ();
1222 }
1223 
1224 
1225 void
1227 {
1228  NS_LOG_FUNCTION (this);
1229 
1230  for (unsigned int i = 0; i < ind.m_dciList.size (); i++)
1231  {
1232  // send the correspondent ul dci
1233  Ptr<UlDciLteControlMessage> msg = Create<UlDciLteControlMessage> ();
1234  msg->SetDci (ind.m_dciList.at (i));
1236  }
1237 
1238  // Fire the trace with the UL information
1239  for ( uint32_t i = 0; i < ind.m_dciList.size (); i++ )
1240  {
1241  m_ulScheduling (m_frameNo, m_subframeNo, ind.m_dciList.at (i).m_rnti,
1242  ind.m_dciList.at (i).m_mcs, ind.m_dciList.at (i).m_tbSize, m_componentCarrierId);
1243  }
1244 
1245 
1246 
1247 }
1248 
1249 
1250 
1251 
1252 // ////////////////////////////////////////////
1253 // CSCHED SAP
1254 // ////////////////////////////////////////////
1255 
1256 
1257 void
1259 {
1260  NS_LOG_FUNCTION (this);
1261 }
1262 
1263 void
1265 {
1266  NS_LOG_FUNCTION (this);
1267 }
1268 
1269 void
1271 {
1272  NS_LOG_FUNCTION (this);
1273  // Call the CSCHED primitive
1274  // m_cschedSap->LcConfigCompleted();
1275 }
1276 
1277 void
1279 {
1280  NS_LOG_FUNCTION (this);
1281 }
1282 
1283 void
1285 {
1286  NS_LOG_FUNCTION (this);
1287 }
1288 
1289 void
1291 {
1292  NS_LOG_FUNCTION (this);
1293  // propagates to RRC
1294  LteEnbCmacSapUser::UeConfig ueConfigUpdate;
1295  ueConfigUpdate.m_rnti = params.m_rnti;
1296  ueConfigUpdate.m_transmissionMode = params.m_transmissionMode;
1297  m_cmacSapUser->RrcConfigurationUpdateInd (ueConfigUpdate);
1298 }
1299 
1300 void
1302 {
1303  NS_LOG_FUNCTION (this);
1304 }
1305 
1306 void
1308 {
1309  NS_LOG_FUNCTION (this);
1310  m_ulInfoListReceived.push_back (params);
1311 }
1312 
1313 void
1315 {
1316  NS_LOG_FUNCTION (this);
1317  // Update HARQ buffer
1318  std::map <uint16_t, DlHarqProcessesBuffer_t>::iterator it = m_miDlHarqProcessesPackets.find (params.m_rnti);
1319  NS_ASSERT (it != m_miDlHarqProcessesPackets.end ());
1320  for (uint8_t layer = 0; layer < params.m_harqStatus.size (); layer++)
1321  {
1322  if (params.m_harqStatus.at (layer) == DlInfoListElement_s::ACK)
1323  {
1324  // discard buffer
1325  Ptr<PacketBurst> emptyBuf = CreateObject <PacketBurst> ();
1326  (*it).second.at (layer).at (params.m_harqProcessId) = emptyBuf;
1327  NS_LOG_DEBUG (this << " HARQ-ACK UE " << params.m_rnti << " harqId " << (uint16_t)params.m_harqProcessId << " layer " << (uint16_t)layer);
1328  }
1329  else if (params.m_harqStatus.at (layer) == DlInfoListElement_s::NACK)
1330  {
1331  NS_LOG_DEBUG (this << " HARQ-NACK UE " << params.m_rnti << " harqId " << (uint16_t)params.m_harqProcessId << " layer " << (uint16_t)layer);
1332  }
1333  else
1334  {
1335  NS_FATAL_ERROR (" HARQ functionality not implemented");
1336  }
1337  }
1338  m_dlInfoListReceived.push_back (params);
1339 }
1340 
1341 
1342 } // namespace ns3
Service Access Point (SAP) offered by the component carrier manager (CCM) by MAC to CCM...
std::vector< struct UlInfoListElement_s > m_ulInfoList
UL info list.
void DoReconfigureLc(LteEnbCmacSapProvider::LcInfo lcinfo)
Reconfigure LC function.
Definition: lte-enb-mac.cc:934
FfMacSchedSapUser * m_schedSapUser
the Sched SAP user
Definition: lte-enb-mac.h:404
Parameters of the CSCHED_LC_CONFIG_CNF primitive.
AllocateNcRaPreambleReturnValue structure.
virtual void UlCqiReport(FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi)
Returns to MAC level the UL-CQI evaluated.
Definition: lte-enb-mac.cc:313
EnbMacMemberFfMacCschedSapUser(LteEnbMac *mac)
Constructor.
Definition: lte-enb-mac.cc:210
void DoDlInfoListElementHarqFeeback(DlInfoListElement_s params)
DL Info List ELements HARQ Feedback function.
EnbMacMemberLteMacSapProvider class.
Definition: lte-mac-sap.h:190
a MAC RAR and the corresponding RAPID subheader
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
Parameters for LteMacSapUser::NotifyTxOpportunity.
Definition: lte-mac-sap.h:103
uint16_t m_rnti
RNTI.
uint16_t m_rnti
RNTI.
std::vector< FfMacSchedSapProvider::SchedUlCqiInfoReqParameters > m_ulCqiReceived
UL-CQI received.
Definition: lte-enb-mac.h:381
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
uint8_t m_logicalChannelIdentity
logical channel identity
uint16_t m_rnti
UE id within this cell.
virtual void CschedUeConfigReq(const struct CschedUeConfigReqParameters &params)=0
CSCHED_UE_CONFIG_REQ.
uint16_t sizeTb2
size TB2
Definition: lte-common.h:247
Parameters of the CSCHED_UE_CONFIG_CNF primitive.
Parameters of the CSCHED_UE_RELEASE_REQ primitive.
uint8_t m_transmissionMode
Transmission mode 1..7
void DoReceivePhyPdu(Ptr< Packet > p)
legacy public for use the Phy callback
Definition: lte-enb-mac.cc:727
virtual void ReconfigureLc(LcInfo lcinfo)
Reconfigure an existing logical channel.
Definition: lte-enb-mac.cc:116
uint32_t frameNo
frame number
Definition: lte-common.h:241
uint8_t preambleTransMax
preamble transmit maximum
Parameters of the CSCHED_CELL_CONFIG_UPDATE_IND primitive.
void DoUlInfoListElementHarqFeeback(UlInfoListElement_s params)
UL Info List ELements HARQ Feedback function.
TracedCallback< uint32_t, uint32_t, uint16_t, uint8_t, uint16_t, uint8_t > m_ulScheduling
Trace information regarding UL scheduling Frame number, Subframe number, RNTI, MCS of TB...
Definition: lte-enb-mac.h:434
LteEnbCmacSapProvider * m_cmacSapProvider
the CMAC SAP provider
Definition: lte-enb-mac.h:397
std::map< uint16_t, std::map< uint8_t, LteMacSapUser * > > m_rlcAttached
RNTI, LC ID, SAP of the RLC instance.
Definition: lte-enb-mac.h:378
void DoAddLc(LteEnbCmacSapProvider::LcInfo lcinfo, LteMacSapUser *msu)
Add LC function.
Definition: lte-enb-mac.cc:887
LteEnbCmacSapProvider::RachConfig DoGetRachConfig()
Get RACH configuration function.
Definition: lte-enb-mac.cc:968
virtual void SchedDlConfigInd(const struct SchedDlConfigIndParameters &params)
SCHED_DL_CONFIG_IND.
Definition: lte-enb-mac.cc:172
void DoCschedCellConfigUpdateInd(FfMacCschedSapUser::CschedCellConfigUpdateIndParameters params)
CSched Cell Config Update Indication function.
void DoReleaseLc(uint16_t rnti, uint8_t lcid)
Release LC function.
Definition: lte-enb-mac.cc:940
void SetLteEnbCmacSapUser(LteEnbCmacSapUser *s)
Set the control MAC SAP user.
Definition: lte-enb-mac.cc:463
void SetComponentCarrierId(uint8_t index)
Set the component carrier ID.
Definition: lte-enb-mac.cc:419
void DoSchedUlConfigInd(FfMacSchedSapUser::SchedUlConfigIndParameters params)
Sched UL Config Indication function.
uint8_t raResponseWindowSize
RA response window size.
void DoReportMacCeToScheduler(MacCeListElement_s bsr)
Report MAC CE to scheduler.
Definition: lte-enb-mac.cc:716
std::vector< struct LogicalChannelConfigListElement_s > m_logicalChannelConfigList
logicalChannelConfigList
uint8_t qci
QoS Class Identifier.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
Definition: assert.h:67
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1297
virtual void SchedUlTriggerReq(const struct SchedUlTriggerReqParameters &params)=0
SCHED_UL_TRIGGER_REQ.
virtual void ReceiveRachPreamble(uint32_t prachId)
notify the reception of a RACH preamble on the PRACH
Definition: lte-enb-mac.cc:307
uint8_t m_preambleTransMax
preamble transmit maximum
Definition: lte-enb-mac.h:442
Provides the CSCHED SAP.
uint8_t m_transmissionMode
Transmission mode 1..7
void DoTransmitPdu(LteMacSapProvider::TransmitPduParameters params)
Transmit PDU function.
virtual uint8_t GetMacChTtiDelay()=0
Get the delay from MAC to Channel expressed in TTIs.
std::vector< struct UlDciListElement_s > m_dciList
DCI list.
See section 4.3.24 cqiListElement.
uint32_t retxQueueSize
the current size of the RLC retransmission queue in bytes
Definition: lte-mac-sap.h:73
uint16_t rnti
the C-RNTI identifying the UE
Definition: lte-mac-sap.h:133
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
LteCcmMacSapProvider * GetLteCcmMacSapProvider()
Get the eNB-ComponentCarrierManager SAP User.
Definition: lte-enb-mac.cc:495
Parameters of the CSCHED_UE_CONFIG_UPDATE_IND primitive.
virtual void AddLc(LcInfo lcinfo, LteMacSapUser *msu)
Add a new logical channel.
Definition: lte-enb-mac.cc:110
uint64_t mbrDl
maximum bitrate in downlink
Parameters of the CSCHED_LC_RELEASE_REQ primitive.
friend class EnbMacMemberFfMacCschedSapUser
allow EnbMacMemberFfMacCschedSapUser class friend access
Definition: lte-enb-mac.h:64
Service Access Point (SAP) offered by the eNB-PHY to the eNB-MAC.
uint32_t m_rlcRetransmissionQueueSize
RLC retransmission queue size.
virtual void SchedDlTriggerReq(const struct SchedDlTriggerReqParameters &params)=0
SCHED_DL_TRIGGER_REQ.
See section 4.3.12 ulInfoListElement.
uint8_t connEstFailCount
the counter value for T300 timer expiration
void DoAddUe(uint16_t rnti)
Add UE function.
Definition: lte-enb-mac.cc:806
virtual void SchedDlRlcBufferReq(const struct SchedDlRlcBufferReqParameters &params)=0
SCHED_DL_RLC_BUFFER_REQ.
Parameters of the SCHED_DL_TRIGGER_REQ primitive.
uint8_t lcid
the logical channel id corresponding to the sending RLC instance
Definition: lte-mac-sap.h:49
uint8_t componentCarrierId
the component carrier id corresponding to the sending Mac istance
Definition: lte-mac-sap.h:52
uint8_t m_componentCarrierId
component carrier Id used to address sap
Definition: lte-enb-mac.h:468
uint16_t sizeTb1
size TB1
Definition: lte-common.h:245
void SetLteCcmMacSapUser(LteCcmMacSapUser *s)
Set the ComponentCarrierManager SAP user.
Definition: lte-enb-mac.cc:488
uint8_t componentCarrierId
component carrier ID
Definition: lte-common.h:248
Service Access Point (SAP) offered by the eNB-PHY to the eNB-MAC.
uint16_t rnti
the C-RNTI identifying the UE
Definition: lte-mac-sap.h:69
FfMacCschedSapUser * GetFfMacCschedSapUser(void)
Get the control scheduler SAP user.
Definition: lte-enb-mac.cc:443
uint64_t m_eRabGuaranteedBitrateDl
ERAB guaranteed bit rate DL.
virtual AllocateNcRaPreambleReturnValue AllocateNcRaPreamble(uint16_t rnti)
Allocate a random access preamble for non-contention based random access (e.g., for handover)...
Definition: lte-enb-mac.cc:140
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
LteMacSapProvider * GetLteMacSapProvider(void)
Get the MAC SAP provider.
Definition: lte-enb-mac.cc:457
Parameters for LteMacSapProvider::ReportBufferStatus.
Definition: lte-mac-sap.h:67
uint8_t lcid
the logical channel id
Definition: lte-mac-sap.h:177
uint8_t lcid
the logical channel id
Definition: lte-mac-sap.h:134
std::map< uint8_t, uint32_t > m_receivedRachPreambleCount
received RACH preamble count
Definition: lte-enb-mac.h:463
FfMacCschedSapUser * m_cschedSapUser
the CSched SAP user
Definition: lte-enb-mac.h:405
See section 4.3.4 logicalChannelConfigListElement.
Service Access Point (SAP) offered by the MAC to the RRC See Femto Forum MAC Scheduler Interface Spec...
virtual void UlReceiveMacCe(MacCeListElement_s bsr, uint8_t componentCarrierId)=0
When the Primary Component carrier receive a buffer status report it is sent to the CCM...
uint16_t txQueueHolDelay
the Head Of Line delay of the transmission queue
Definition: lte-mac-sap.h:72
void SetFfMacCschedSapProvider(FfMacCschedSapProvider *s)
Set the control scheduler SAP provider.
Definition: lte-enb-mac.cc:437
uint8_t lcId
logical channel identifier
Parameters of the CSCHED_LC_RELEASE_CNF primitive.
uint16_t m_rnti
UE id within this cell.
LteEnbPhySapProvider * m_enbPhySapProvider
the ENB Phy SAP provider
Definition: lte-enb-mac.h:408
virtual void CschedLcConfigCnf(const struct CschedLcConfigCnfParameters &params)
CSCHED_LC_CONFIG_CNF.
Definition: lte-enb-mac.cc:228
uint16_t GetRnti(void) const
Get RNTI function.
LteEnbPhySapUser * m_enbPhySapUser
the ENB Phy SAP user
Definition: lte-enb-mac.h:409
FfMacSchedSapUser * GetFfMacSchedSapUser(void)
Get the scheduler SAP user.
Definition: lte-enb-mac.cc:431
make Callback use a separate empty type
Definition: empty.h:33
void DoCschedUeConfigCnf(FfMacCschedSapUser::CschedUeConfigCnfParameters params)
CSched UE Config configure function.
virtual void RrcConfigurationUpdateInd(UeConfig params)=0
Notify the RRC of a UE config updated requested by the MAC (normally, by the scheduler) ...
virtual void SendMacPdu(Ptr< Packet > p)=0
Send the MAC PDU to the channel.
virtual void CschedLcReleaseCnf(const struct CschedLcReleaseCnfParameters &params)
CSCHED_LC_RELEASE_CNF.
Definition: lte-enb-mac.cc:234
EnbMacMemberFfMacSchedSapUser class.
Definition: lte-enb-mac.cc:147
void DoUeUpdateConfigurationReq(LteEnbCmacSapProvider::UeConfig params)
UE Update configuration request function.
Definition: lte-enb-mac.cc:955
Parameters of the SCHED_UL_TRIGGER_REQ primitive.
Hold an unsigned integer type.
Definition: uinteger.h:44
EnbMacMemberLteEnbCmacSapProvider(LteEnbMac *mac)
Constructor.
Definition: lte-enb-mac.cc:86
Logical Channel information to be passed to CmacSapProvider::ConfigureLc.
EnbMacMemberFfMacCschedSapUser class.
Definition: lte-enb-mac.cc:187
uint16_t rnti
rnti previously allocated for this non-contention based RA procedure
Definition: lte-enb-mac.h:452
uint8_t m_macChTtiDelay
delay of MAC, PHY and channel in terms of TTIs
Definition: lte-enb-mac.h:436
uint16_t rnti
the C-RNTI identifying the UE
Definition: lte-mac-sap.h:48
void DoCschedLcReleaseCnf(FfMacCschedSapUser::CschedLcReleaseCnfParameters params)
CSched LC Release configure function.
mac
Definition: third.py:99
static TypeId GetTypeId(void)
Get the type ID.
Definition: lte-enb-mac.cc:337
uint8_t componentCarrierId
the component carrier id
Definition: lte-mac-sap.h:132
void DoUlCqiReport(FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi)
UL CQI report.
Definition: lte-enb-mac.cc:681
virtual void UlInfoListElementHarqFeeback(UlInfoListElement_s params)
Notify the HARQ on the UL tranmission status.
Definition: lte-enb-mac.cc:319
virtual void SchedDlRachInfoReq(const struct SchedDlRachInfoReqParameters &params)=0
SCHED_DL_RACH_INFO_REQ.
virtual void AddUe(uint16_t rnti)
Add UE function.
Definition: lte-enb-mac.cc:98
uint64_t m_eRabGuaranteedBitrateUl
ERAB guaranteed bit rate UL.
Provides the SCHED SAP.
friend class EnbMacMemberLteEnbCmacSapProvider
allow EnbMacMemberLteEnbCmacSapProvider class friend access
Definition: lte-enb-mac.h:58
virtual void DoDispose(void)
Destructor implementation.
Definition: lte-enb-mac.cc:401
virtual bool IsRandomAccessCompleted(uint16_t rnti)=0
Is random access completed function.
void ReceiveBsrMessage(MacCeListElement_s bsr)
Receive a CE element containing the buffer status report.
Definition: lte-enb-mac.cc:709
uint32_t subframeNo
subframe number
Definition: lte-common.h:242
std::vector< uint8_t > m_logicalChannelIdentity
logical channel identity
virtual void SchedUlConfigInd(const struct SchedUlConfigIndParameters &params)
SCHED_UL_CONFIG_IND.
Definition: lte-enb-mac.cc:180
MemberLteCcmMacSapProvider class.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:289
uint16_t m_rlcRetransmissionHolDelay
RLC retransmission HOL delay.
std::vector< struct CqiListElement_s > m_cqiList
CQI list.
uint8_t m_raResponseWindowSize
RA response window size.
Definition: lte-enb-mac.h:443
#define list
std::vector< struct DlInfoListElement_s > m_dlInfoList
DL info list.
See section 4.3.23 dlInfoListElement.
virtual void CschedCellConfigReq(const struct CschedCellConfigReqParameters &params)=0
CSCHED_CELL_CONFIG_REQ.
BuildRarListElement_s rarPayload
RAR payload.
void DoReceiveRachPreamble(uint8_t prachId)
Receive RACH Preamble function.
Definition: lte-enb-mac.cc:673
void DoRemoveUe(uint16_t rnti)
Remove UE function.
Definition: lte-enb-mac.cc:843
See section 4.3.14 macCEListElement.
uint8_t m_connEstFailCount
the counter value for T300 timer expiration
Definition: lte-enb-mac.h:444
Parameters for [re]configuring the UE.
virtual void ReleaseLc(uint16_t rnti, uint8_t lcid)
release an existing logical channel
Definition: lte-enb-mac.cc:122
uint32_t m_subframeNo
subframe number of current subframe indication
Definition: lte-enb-mac.h:421
uint64_t m_eRabMaximulBitrateUl
ERAB maximum bit rate UL.
LteEnbCmacSapProvider::AllocateNcRaPreambleReturnValue DoAllocateNcRaPreamble(uint16_t rnti)
Allocate NC RA preamble function.
Definition: lte-enb-mac.cc:979
uint8_t m_numberOfRaPreambles
number of RA preambles
Definition: lte-enb-mac.h:441
uint8_t numberOfRaPreambles
number of RA preambles
uint8_t GetLayer(void) const
Get layer function.
uint8_t layer
the layer value that was passed by the MAC in the call to NotifyTxOpportunity that generated this PDU...
Definition: lte-mac-sap.h:50
virtual void CschedUeConfigCnf(const struct CschedUeConfigCnfParameters &params)
CSCHED_UE_CONFIG_CNF.
Definition: lte-enb-mac.cc:222
virtual void CschedUeReleaseReq(const struct CschedUeReleaseReqParameters &params)=0
CSCHED_UE_RELEASE_REQ.
void DoConfigureMac(uint16_t ulBandwidth, uint16_t dlBandwidth)
Configure MAC function.
Definition: lte-enb-mac.cc:792
Every class exported by the ns3 library is enclosed in the ns3 namespace.
uint8_t lcGroup
logical channel group
uint64_t m_eRabMaximulBitrateDl
ERAB maximum bit rate DL.
-------— PHY-SAP
Definition: lte-enb-mac.cc:260
virtual void CschedUeReleaseCnf(const struct CschedUeReleaseCnfParameters &params)
CSCHED_UE_RELEASE_CNF.
Definition: lte-enb-mac.cc:240
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Definition: packet.cc:121
Parameters of the CSCHED_LC_CONFIG_REQ primitive.
std::vector< enum HarqStatus_e > m_harqStatus
HARQ status.
virtual void CschedCellConfigUpdateInd(const struct CschedCellConfigUpdateIndParameters &params)
CSCHED_UE_CONFIG_IND.
Definition: lte-enb-mac.cc:252
LteEnbCmacSapProvider * GetLteEnbCmacSapProvider(void)
Get the control MAC SAP provider.
Definition: lte-enb-mac.cc:469
Service Access Point (SAP) offered by MAC to the component carrier manager (CCM). ...
uint32_t m_rlcTransmissionQueueSize
RLC transmission queue size.
Parameters for [re]configuring the UE.
uint8_t lcid
the logical channel id corresponding to the sending RLC instance
Definition: lte-mac-sap.h:70
std::vector< UlInfoListElement_s > m_ulInfoListReceived
UL HARQ feedback received.
Definition: lte-enb-mac.h:386
uint32_t txQueueSize
the current size of the RLC transmission queue
Definition: lte-mac-sap.h:71
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:195
EnbMacMemberLteEnbPhySapUser(LteEnbMac *mac)
Constructor.
Definition: lte-enb-mac.cc:283
See section 4.3.6 rachListElement.
LteMacSapProvider * m_macSapProvider
the MAC SAP provider
Definition: lte-enb-mac.h:396
std::vector< CqiListElement_s > m_dlCqiReceived
DL-CQI received.
Definition: lte-enb-mac.h:380
virtual void CschedCellConfigCnf(const struct CschedCellConfigCnfParameters &params)
CSCHED_CELL_CONFIG_CNF.
Definition: lte-enb-mac.cc:216
virtual void UeUpdateConfigurationReq(UeConfig params)
update the configuration of the UE
Definition: lte-enb-mac.cc:128
uint8_t m_harqProcessId
HARQ process ID.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:88
FfMacCschedSapUser class.
virtual void SchedUlCqiInfoReq(const struct SchedUlCqiInfoReqParameters &params)=0
SCHED_UL_CQI_INFO_REQ.
uint16_t rnti
C-RNTI identifying the UE.
LteCcmMacSapUser * m_ccmMacSapUser
CCM MAC SAP user.
Definition: lte-enb-mac.h:413
std::vector< MacCeListElement_s > m_ulCeReceived
CE received (BSR up to now)
Definition: lte-enb-mac.h:382
Parameters of the SCHED_DL_CQI_INFO_REQ primitive.
std::vector< struct MacCeListElement_s > m_macCeList
MAC CE list.
virtual void SchedUlMacCtrlInfoReq(const struct SchedUlMacCtrlInfoReqParameters &params)=0
SCHED_UL_MAC_CTRL_INFO_REQ.
std::vector< std::vector< Ptr< PacketBurst > > > DlHarqProcessesBuffer_t
DlHarqProcessesBuffer_t typedef.
Definition: lte-enb-mac.h:47
uint64_t mbrUl
maximum bitrate in uplink
void DoCschedUeReleaseCnf(FfMacCschedSapUser::CschedUeReleaseCnfParameters params)
CSched UE Release configure function.
std::vector< struct RachListElement_s > m_rachList
RACH list.
EnbMacMemberLteEnbCmacSapProvider class.
Definition: lte-enb-mac.cc:59
std::vector< DlInfoListElement_s > m_dlInfoListReceived
DL HARQ feedback received.
Definition: lte-enb-mac.h:384
void SetLteEnbPhySapProvider(LteEnbPhySapProvider *s)
Set the PHY SAP Provider.
Definition: lte-enb-mac.cc:475
LteEnbCmacSapUser * m_cmacSapUser
the CMAC SAP user
Definition: lte-enb-mac.h:399
uint64_t gbrUl
guaranteed bitrate in uplink
virtual void SubframeIndication(uint32_t frameNo, uint32_t subframeNo)
Trigger the start from a new frame (input from Phy layer)
Definition: lte-enb-mac.cc:295
uint32_t bytes
the number of bytes to transmit
Definition: lte-mac-sap.h:129
uint16_t statusPduSize
the current size of the pending STATUS RLC PDU message in bytes
Definition: lte-mac-sap.h:75
uint8_t GetLcid(void) const
Get LCID function.
Parameters of the SCHED_UL_CQI_INFO_REQ primitive.
uint8_t layer
the layer of transmission (MIMO)
Definition: lte-mac-sap.h:130
LteEnbPhySapUser * GetLteEnbPhySapUser()
Get the eNB-PHY SAP User.
Definition: lte-enb-mac.cc:482
void AddPacketTag(const Tag &tag) const
Add a packet tag.
Definition: packet.cc:956
Service Access Point (SAP) offered by the MAC to the RLC See Femto Forum MAC Scheduler Interface Spec...
Definition: lte-mac-sap.h:95
struct defining the RACH configuration of the MAC
FfMacSchedSapProvider * m_schedSapProvider
the Sched SAP provider
Definition: lte-enb-mac.h:402
LteFlowId structure.
Definition: lte-common.h:36
void DoReportBufferStatus(LteMacSapProvider::ReportBufferStatusParameters params)
Report Buffer Status function.
bool RemovePacketTag(Tag &tag)
Remove a packet tag.
Definition: packet.cc:963
Parameters of the SCHED_UL_MAC_CTRL_INFO_REQ primitive.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
virtual void ReceivePhyPdu(Ptr< Packet > p)
Called by the Phy to notify the MAC of the reception of a new PHY-PDU.
Definition: lte-enb-mac.cc:289
LteCcmMacSapProvider * m_ccmMacSapProvider
CCM MAC SAP provider.
Definition: lte-enb-mac.h:412
void DoCschedUeConfigUpdateInd(FfMacCschedSapUser::CschedUeConfigUpdateIndParameters params)
CSched UE Config Update Indication function.
LteMacSapUser * m_macSapUser
the MAC SAP user
Definition: lte-enb-mac.h:398
void DoSchedDlConfigInd(FfMacSchedSapUser::SchedDlConfigIndParameters ind)
Sched DL Config Indication function.
uint16_t retxQueueHolDelay
the Head Of Line delay of the retransmission queue
Definition: lte-mac-sap.h:74
virtual void CschedLcConfigReq(const struct CschedLcConfigReqParameters &params)=0
CSCHED_LC_CONFIG_REQ.
Service Access Point (SAP) offered by the MAC to the RLC See Femto Forum MAC Scheduler Interface Spec...
Definition: lte-mac-sap.h:36
Tag used to define the RNTI and LC id for each MAC packet trasmitted.
uint16_t m_estimatedSize
estimated size
TracedCallback< DlSchedulingCallbackInfo > m_dlScheduling
Trace information regarding DL scheduling Frame number, Subframe number, RNTI, MCS of TB1...
Definition: lte-enb-mac.h:427
bool valid
true if a valid RA config was allocated, false otherwise
Parameters for LteMacSapUser::ReceivePdu.
Definition: lte-mac-sap.h:156
void SetLteMacSapUser(LteMacSapUser *s)
Set the MAC SAP user.
Definition: lte-enb-mac.cc:451
uint16_t rnti
the C-RNTI identifying the UE
Definition: lte-mac-sap.h:176
virtual void SendLteControlMessage(Ptr< LteControlMessage > msg)=0
Send SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control channel.
virtual void ReceiveLteControlMessage(Ptr< LteControlMessage > msg)
Receive SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control channel.
Definition: lte-enb-mac.cc:301
uint32_t m_frameNo
frame number of current subframe indication
Definition: lte-enb-mac.h:417
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
Definition: log.h:257
Parameters of the SCHED_DL_RACH_INFO_REQ primitive.
void DoCschedLcConfigCnf(FfMacCschedSapUser::CschedLcConfigCnfParameters params)
CSched LC Config configure function.
Parameters of the SCHED_UL_CONFIG_IND primitive.
virtual void SchedDlCqiInfoReq(const struct SchedDlCqiInfoReqParameters &params)=0
SCHED_DL_CQI_INFO_REQ.
void DoReceiveLteControlMessage(Ptr< LteControlMessage > msg)
Receive a DL CQI ideal control message.
Definition: lte-enb-mac.cc:648
A base class which provides memory management and object aggregation.
Definition: object.h:87
uint16_t m_rlcTransmissionQueueHolDelay
RLC transmission queue HOL delay.
virtual void CschedUeConfigUpdateInd(const struct CschedUeConfigUpdateIndParameters &params)
CSCHED_UE_UPDATE_IND.
Definition: lte-enb-mac.cc:246
friend class EnbMacMemberLteEnbPhySapUser
allow EnbMacMemberLteEnbPhySapUser class friend access
Definition: lte-enb-mac.h:66
DlSchedulingCallbackInfo structure.
Definition: lte-common.h:239
Parameters of the CSCHED_UE_CONFIG_REQ primitive.
std::map< uint8_t, NcRaPreambleInfo > m_allocatedNcRaPreambleMap
map storing as key the random access preamble IDs allocated for non-contention based access...
Definition: lte-enb-mac.h:461
Service Access Point (SAP) offered by the eNB MAC to the eNB RRC See Femto Forum MAC Scheduler Interf...
uint64_t gbrDl
guaranteed bitrate in downlink
virtual ~LteEnbMac(void)
Definition: lte-enb-mac.cc:395
std::map< uint16_t, uint32_t > m_rapIdRntiMap
RAPID RNTI map.
Definition: lte-enb-mac.h:465
uint8_t harqProcessId
the HARQ process id that was passed by the MAC in the call to NotifyTxOpportunity that generated this...
Definition: lte-mac-sap.h:51
friend class EnbMacMemberFfMacSchedSapUser
allow EnbMacMemberFfMacSchedSapUser class friend access
Definition: lte-enb-mac.h:62
virtual void DlInfoListElementHarqFeeback(DlInfoListElement_s params)
Notify the HARQ on the DL tranmission status.
Definition: lte-enb-mac.cc:325
std::vector< struct BuildRarListElement_s > m_buildRarList
build rar list
std::map< uint16_t, DlHarqProcessesBuffer_t > m_miDlHarqProcessesPackets
Packet under transmission of the DL HARQ process.
Definition: lte-enb-mac.h:439
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: uinteger.h:45
info associated with a preamble allocated for non-contention based RA
Definition: lte-enb-mac.h:450
a unique identifier for an interface.
Definition: type-id.h:58
void DoSubframeIndication(uint32_t frameNo, uint32_t subframeNo)
Subrame Indication function.
Definition: lte-enb-mac.cc:501
EnbMacMemberFfMacSchedSapUser(LteEnbMac *mac)
Constructor.
Definition: lte-enb-mac.cc:165
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:923
virtual uint16_t AllocateTemporaryCellRnti()=0
request the allocation of a Temporary C-RNTI
This class implements the MAC layer of the eNodeB device.
Definition: lte-enb-mac.h:55
FfMacSchedSapUser class.
Parameters of the CSCHED_UE_RELEASE_CNF primitive.
void SetFfMacSchedSapProvider(FfMacSchedSapProvider *s)
Set the scheduler SAP provider.
Definition: lte-enb-mac.cc:425
virtual void RemoveUe(uint16_t rnti)
remove the UE, e.g., after handover or termination of the RRC connection
Definition: lte-enb-mac.cc:104
FfMacCschedSapProvider * m_cschedSapProvider
the Csched SAP provider
Definition: lte-enb-mac.h:403
bool isGbr
true if the bearer is GBR, false if the bearer is NON-GBR
std::vector< struct BuildDataListElement_s > m_buildDataList
build data list
virtual void CschedLcReleaseReq(const struct CschedLcReleaseReqParameters &params)=0
CSCHED_LC_RELEASE_REQ.
#define UL_PUSCH_TTIS_DELAY
Definition: lte-common.h:28
Ptr< Packet > p
the RLC PDU to be received
Definition: lte-mac-sap.h:175
Time expiryTime
value the expiration time of this allocation (so that stale preambles can be reused) ...
Definition: lte-enb-mac.h:453
virtual void ConfigureMac(uint16_t ulBandwidth, uint16_t dlBandwidth)
Definition: lte-enb-mac.cc:92
void ReceiveDlCqiLteControlMessage(Ptr< DlCqiLteControlMessage > msg)
Receive a DL CQI ideal control message.
Definition: lte-enb-mac.cc:696
void DoCschedCellConfigCnf(FfMacCschedSapUser::CschedCellConfigCnfParameters params)
CSched Cell Config configure function.
uint8_t m_logicalChannelGroup
logical channel group
Parameters for LteMacSapProvider::TransmitPdu.
Definition: lte-mac-sap.h:45