A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
pss-ff-mac-scheduler.h
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  * Modification: Dizhi Zhou <dizhi.zhou@gmail.com> // modify codes related to downlink scheduler
20  */
21 
22 #ifndef PSS_FF_MAC_SCHEDULER_H
23 #define PSS_FF_MAC_SCHEDULER_H
24 
25 #include <ns3/lte-common.h>
26 #include <ns3/ff-mac-csched-sap.h>
27 #include <ns3/ff-mac-sched-sap.h>
28 #include <ns3/ff-mac-scheduler.h>
29 #include <vector>
30 #include <map>
31 #include <ns3/nstime.h>
32 #include <ns3/lte-amc.h>
33 
34 
35 // value for SINR outside the range defined by FF-API, used to indicate that there
36 // is no CQI for this element
37 #define NO_SINR -5000
38 
39 
40 #define HARQ_PROC_NUM 8
41 #define HARQ_DL_TIMEOUT 11
42 
43 namespace ns3 {
44 
45 
46 typedef std::vector < uint8_t > DlHarqProcessesStatus_t;
47 typedef std::vector < uint8_t > DlHarqProcessesTimer_t;
48 typedef std::vector < DlDciListElement_s > DlHarqProcessesDciBuffer_t;
49 typedef std::vector < std::vector <struct RlcPduListElement_s> > RlcPduList_t; // vector of the LCs and layers per UE
50 typedef std::vector < RlcPduList_t > DlHarqRlcPduListBuffer_t; // vector of the 8 HARQ processes per UE
51 
52 typedef std::vector < UlDciListElement_s > UlHarqProcessesDciBuffer_t;
53 typedef std::vector < uint8_t > UlHarqProcessesStatus_t;
54 
55 
60 {
61  Time flowStart;
62  unsigned long totalBytesTransmitted;
63  unsigned int lastTtiBytesTransmitted;
66  double targetThroughput;
67 };
68 
69 
70 
71 
72 
85 {
86 public:
93 
97  virtual ~PssFfMacScheduler ();
98 
99  // inherited from Object
100  virtual void DoDispose (void);
101  static TypeId GetTypeId (void);
102 
103  // inherited from FfMacScheduler
104  virtual void SetFfMacCschedSapUser (FfMacCschedSapUser* s);
105  virtual void SetFfMacSchedSapUser (FfMacSchedSapUser* s);
108 
111 
112  void TransmissionModeConfigurationUpdate (uint16_t rnti, uint8_t txMode);
113 
114 private:
115  //
116  // Implementation of the CSCHED API primitives
117  // (See 4.1 for description of the primitives)
118  //
119 
120  void DoCschedCellConfigReq (const struct FfMacCschedSapProvider::CschedCellConfigReqParameters& params);
121 
122  void DoCschedUeConfigReq (const struct FfMacCschedSapProvider::CschedUeConfigReqParameters& params);
123 
124  void DoCschedLcConfigReq (const struct FfMacCschedSapProvider::CschedLcConfigReqParameters& params);
125 
126  void DoCschedLcReleaseReq (const struct FfMacCschedSapProvider::CschedLcReleaseReqParameters& params);
127 
128  void DoCschedUeReleaseReq (const struct FfMacCschedSapProvider::CschedUeReleaseReqParameters& params);
129 
130  //
131  // Implementation of the SCHED API primitives
132  // (See 4.2 for description of the primitives)
133  //
134 
135  void DoSchedDlRlcBufferReq (const struct FfMacSchedSapProvider::SchedDlRlcBufferReqParameters& params);
136 
137  void DoSchedDlPagingBufferReq (const struct FfMacSchedSapProvider::SchedDlPagingBufferReqParameters& params);
138 
139  void DoSchedDlMacBufferReq (const struct FfMacSchedSapProvider::SchedDlMacBufferReqParameters& params);
140 
141  void DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::SchedDlTriggerReqParameters& params);
142 
143  void DoSchedDlRachInfoReq (const struct FfMacSchedSapProvider::SchedDlRachInfoReqParameters& params);
144 
145  void DoSchedDlCqiInfoReq (const struct FfMacSchedSapProvider::SchedDlCqiInfoReqParameters& params);
146 
147  void DoSchedUlTriggerReq (const struct FfMacSchedSapProvider::SchedUlTriggerReqParameters& params);
148 
149  void DoSchedUlNoiseInterferenceReq (const struct FfMacSchedSapProvider::SchedUlNoiseInterferenceReqParameters& params);
150 
151  void DoSchedUlSrInfoReq (const struct FfMacSchedSapProvider::SchedUlSrInfoReqParameters& params);
152 
153  void DoSchedUlMacCtrlInfoReq (const struct FfMacSchedSapProvider::SchedUlMacCtrlInfoReqParameters& params);
154 
155  void DoSchedUlCqiInfoReq (const struct FfMacSchedSapProvider::SchedUlCqiInfoReqParameters& params);
156 
157 
158  int GetRbgSize (int dlbandwidth);
159 
160  int LcActivePerFlow (uint16_t rnti);
161 
162  double EstimateUlSinr (uint16_t rnti, uint16_t rb);
163 
164  void RefreshDlCqiMaps (void);
165  void RefreshUlCqiMaps (void);
166 
167  void UpdateDlRlcBufferInfo (uint16_t rnti, uint8_t lcid, uint16_t size);
168  void UpdateUlRlcBufferInfo (uint16_t rnti, uint16_t size);
169 
176  uint8_t UpdateHarqProcessId (uint16_t rnti);
177 
184  uint8_t HarqProcessAvailability (uint16_t rnti);
185 
190  void RefreshHarqProcesses ();
191 
192  Ptr<LteAmc> m_amc;
193 
194  /*
195  * Vectors of UE's LC info
196  */
197  std::map <LteFlowId_t, FfMacSchedSapProvider::SchedDlRlcBufferReqParameters> m_rlcBufferReq;
198 
199 
200  /*
201  * Map of UE statistics (per RNTI basis) in downlink
202  */
203  std::map <uint16_t, pssFlowPerf_t> m_flowStatsDl;
204 
205  /*
206  * Map of UE statistics (per RNTI basis)
207  */
208  std::map <uint16_t, pssFlowPerf_t> m_flowStatsUl;
209 
210 
211  /*
212  * Map of UE's DL CQI P01 received
213  */
214  std::map <uint16_t,uint8_t> m_p10CqiRxed;
215  /*
216  * Map of UE's timers on DL CQI P01 received
217  */
218  std::map <uint16_t,uint32_t> m_p10CqiTimers;
219 
220  /*
221  * Map of UE's DL CQI A30 received
222  */
223  std::map <uint16_t,SbMeasResult_s> m_a30CqiRxed;
224  /*
225  * Map of UE's timers on DL CQI A30 received
226  */
227  std::map <uint16_t,uint32_t> m_a30CqiTimers;
228 
229  /*
230  * Map of previous allocated UE per RBG
231  * (used to retrieve info from UL-CQI)
232  */
233  std::map <uint16_t, std::vector <uint16_t> > m_allocationMaps;
234 
235  /*
236  * Map of UEs' UL-CQI per RBG
237  */
238  std::map <uint16_t, std::vector <double> > m_ueCqi;
239  /*
240  * Map of UEs' timers on UL-CQI per RBG
241  */
242  std::map <uint16_t, uint32_t> m_ueCqiTimers;
243 
244  /*
245  * Map of UE's buffer status reports received
246  */
247  std::map <uint16_t,uint32_t> m_ceBsrRxed;
248 
249  // MAC SAPs
250  FfMacCschedSapUser* m_cschedSapUser;
251  FfMacSchedSapUser* m_schedSapUser;
252  FfMacCschedSapProvider* m_cschedSapProvider;
253  FfMacSchedSapProvider* m_schedSapProvider;
254 
255 
256  // Internal parameters
258 
259 
260  double m_timeWindow;
261 
262  uint16_t m_nextRntiUl; // RNTI of the next user to be served next scheduling in UL
263 
264  uint32_t m_cqiTimersThreshold; // # of TTIs for which a CQI canbe considered valid
265 
266  std::map <uint16_t,uint8_t> m_uesTxMode; // txMode of the UEs
267 
268  std::string m_fdSchedulerType;
269 
270  uint32_t m_nMux; // TD scheduler selects nMux UEs and transfer them to FD scheduler
271 
272  // HARQ attributes
276  bool m_harqOn;
277  std::map <uint16_t, uint8_t> m_dlHarqCurrentProcessId;
278  //HARQ status
279  // 0: process Id available
280  // x>0: process Id equal to `x` trasmission count
281  std::map <uint16_t, DlHarqProcessesStatus_t> m_dlHarqProcessesStatus;
282  std::map <uint16_t, DlHarqProcessesTimer_t> m_dlHarqProcessesTimer;
283  std::map <uint16_t, DlHarqProcessesDciBuffer_t> m_dlHarqProcessesDciBuffer;
284  std::map <uint16_t, DlHarqRlcPduListBuffer_t> m_dlHarqProcessesRlcPduListBuffer;
285  std::vector <DlInfoListElement_s> m_dlInfoListBuffered; // HARQ retx buffered
286 
287  std::map <uint16_t, uint8_t> m_ulHarqCurrentProcessId;
288  //HARQ status
289  // 0: process Id available
290  // x>0: process Id equal to `x` trasmission count
291  std::map <uint16_t, UlHarqProcessesStatus_t> m_ulHarqProcessesStatus;
292  std::map <uint16_t, UlHarqProcessesDciBuffer_t> m_ulHarqProcessesDciBuffer;
293 
294 
295  // RACH attributes
296  std::vector <struct RachListElement_s> m_rachList;
297  std::vector <uint16_t> m_rachAllocationMap;
298  uint8_t m_ulGrantMcs; // MCS for UL grant (default 0)
299 
300 };
301 
302 } // namespace ns3
303 
304 #endif /* PSS_FF_MAC_SCHEDULER_H */
keep track of time unit.
Definition: nstime.h:149
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:59
Provides the CSCHED SAP.
double secondLastAveragedThroughput
Past average throughput.
virtual FfMacSchedSapProvider * GetFfMacSchedSapProvider()
Provides the SCHED SAP.
unsigned int lastTtiBytesTransmitted
Total bytes send by eNb for this UE.
double lastAveragedThroughput
Total bytes send by eNB in last tti for this UE.
virtual void SetFfMacSchedSapUser(FfMacSchedSapUser *s)
uint8_t HarqProcessAvailability(uint16_t rnti)
Return the availability of free process for the RNTI specified.
void RefreshHarqProcesses()
Refresh HARQ processes according to the timers.
uint8_t UpdateHarqProcessId(uint16_t rnti)
Update and return a new process Id for the RNTI specified.
virtual void DoDispose(void)
virtual void SetFfMacCschedSapUser(FfMacCschedSapUser *s)
virtual FfMacCschedSapProvider * GetFfMacCschedSapProvider()
a unique identifier for an interface.
Definition: type-id.h:44
Implements the SCHED SAP and CSCHED SAP for a Priority Set scheduler.