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: Manuel Requena <manuel.requena@cttc.es>
19  */
20 
21 #ifndef FF_MAC_SCHED_SAP_H
22 #define FF_MAC_SCHED_SAP_H
23 
24 #include <stdint.h>
25 #include <vector>
26 
27 #include "ff-mac-common.h"
28 
29 
30 namespace ns3 {
31 
32 /**
33  * \ingroup ff-api
34  * \brief Provides the SCHED SAP
35  *
36  * This abstract class defines the MAC Scheduler interface specified in the
37  * Femto Forum Technical Document:
38  *   - LTE MAC Scheduler Interface Specification v1.11
39  *
40  * The Technical Document contains a detailed description of the API.
41  * The documentation of this class refers to sections of this Technical Document.
42  *
43  * You can found an example of the implementation of this interface
44  * in the SampleFfMacSchedSapProvider and SampleFfMacSchedSapUser classes
45  */
46 class FfMacSchedSapProvider
47 {
48 public:
49   virtual ~FfMacSchedSapProvider ();
50 
51   /**
52    * Parameters of the API primitives
53    */
54 
55   /**
56    * Parameters of the SCHED_DL_RLC_BUFFER_REQ primitive.
57    * See section 4.2.1 for a detailed description of the parameters.
58    */
59   struct SchedDlRlcBufferReqParameters
60   {
61     uint16_t  m_rnti; ///< RNTI
62     uint8_t   m_logicalChannelIdentity; ///< logical channel identity
63     uint32_t  m_rlcTransmissionQueueSize; ///< RLC transmission queue size
64     uint16_t  m_rlcTransmissionQueueHolDelay; ///< RLC transmission queue HOL delay
65     uint32_t  m_rlcRetransmissionQueueSize; ///< RLC retransmission queue size
66     uint16_t  m_rlcRetransmissionHolDelay; ///< RLC retransmission HOL delay
67     uint16_t  m_rlcStatusPduSize; ///< RLC status PDU size
68 
69     std::vector <struct VendorSpecificListElement_s> m_vendorSpecificList; ///< vendor specific list
70   };
71 
72   /**
73    * Parameters of the SCHED_DL_PAGING_BUFFER_REQ primitive.
74    * See section 4.2.2 for a detailed description of the parameters.
75    */
76   struct SchedDlPagingBufferReqParameters
77   {
78     uint16_t  m_rnti; ///< RNTI
79     std::vector <struct PagingInfoListElement_s> m_pagingInfoList; ///< paging info list
80 
81     std::vector <struct VendorSpecificListElement_s> m_vendorSpecificList; ///< vendor specific list
82   };
83 
84   /**
85    * Parameters of the SCHED_DL_MAC_BUFFER_REQ primitive.
86    * See section 4.2.3 for a detailed description of the parameters.
87    */
88   struct SchedDlMacBufferReqParameters
89   {
90     uint16_t  m_rnti; ///< RNTI
91     enum CeBitmap_e m_ceBitmap; ///< CE bitmap
92 
93     std::vector <struct VendorSpecificListElement_s> m_vendorSpecificList; ///< vendor specific list
94   };
95 
96   /**
97    * Parameters of the SCHED_DL_TRIGGER_REQ primitive.
98    * See section 4.2.4 for a detailed description of the parameters.
99    */
100   struct SchedDlTriggerReqParameters
101   {
102     uint16_t  m_sfnSf; ///< sfn SF
103     std::vector <struct DlInfoListElement_s> m_dlInfoList; ///< DL info list
104 
105     std::vector <struct VendorSpecificListElement_s> m_vendorSpecificList; ///< vendor specific list
106   };
107 
108   /**
109    * Parameters of the SCHED_DL_RACH_INFO_REQ primitive.
110    * See section 4.2.5 for a detailed description of the parameters.
111    */
112   struct SchedDlRachInfoReqParameters
113   {
114     uint16_t  m_sfnSf; ///< sfn SF
115     std::vector <struct RachListElement_s> m_rachList; ///< RACH list
116 
117     std::vector <struct VendorSpecificListElement_s> m_vendorSpecificList; ///< vendor specific list
118   };
119 
120   /**
121    * Parameters of the SCHED_DL_CQI_INFO_REQ primitive.
122    * See section 4.2.6 for a detailed description of the parameters.
123    */
124   struct SchedDlCqiInfoReqParameters
125   {
126     uint16_t  m_sfnSf; ///< sfn SF
127     std::vector <struct CqiListElement_s> m_cqiList; ///< CQI list
128 
129     std::vector <struct VendorSpecificListElement_s> m_vendorSpecificList; ///< vendor specific list
130   };
131 
132   /**
133    * Parameters of the SCHED_UL_TRIGGER_REQ primitive.
134    * See section 4.2.8 for a detailed description of the parameters.
135    */
136   struct SchedUlTriggerReqParameters
137   {
138     uint16_t  m_sfnSf; ///< sfn SF
139     std::vector <struct UlInfoListElement_s> m_ulInfoList; ///< UL info list
140 
141     std::vector <struct VendorSpecificListElement_s> m_vendorSpecificList; ///< vendor specific list
142   };
143 
144   /**
145    * Parameters of the SCHED_UL_NOISE_INTERFERENCE_REQ primitive.
146    * See section 4.2.9 for a detailed description of the parameters.
147    */
148   struct SchedUlNoiseInterferenceReqParameters
149   {
150     uint16_t  m_sfnSf; ///< sfn SF
151     uint16_t  m_rip; ///< RIP
152     uint16_t  m_tnp; ///< TNP
153 
154     std::vector <struct VendorSpecificListElement_s> m_vendorSpecificList; ///< vendor specific list
155   };
156 
157   /**
158    * Parameters of the SCHED_UL_SR_INFO_REQ primitive.
159    * See section 4.2.10 for a detailed description of the parameters.
160    */
161   struct SchedUlSrInfoReqParameters
162   {
163     uint16_t  m_sfnSf; ///< sfn SF
164     std::vector <struct SrListElement_s> m_srList; ///< SR list
165 
166     std::vector <struct VendorSpecificListElement_s> m_vendorSpecificList; ///< vendor specific list
167   };
168 
169   /**
170    * Parameters of the SCHED_UL_MAC_CTRL_INFO_REQ primitive.
171    * See section 4.2.11 for a detailed description of the parameters.
172    */
173   struct SchedUlMacCtrlInfoReqParameters
174   {
175     uint16_t  m_sfnSf; ///< sfn SF
176     std::vector <struct MacCeListElement_s> m_macCeList; ///< MAC CE list
177 
178     std::vector <struct VendorSpecificListElement_s> m_vendorSpecificList; ///< vendor specific list
179   };
180 
181   /**
182    * Parameters of the SCHED_UL_CQI_INFO_REQ primitive.
183    * See section 4.2.12 for a detailed description of the parameters.
184    */
185   struct SchedUlCqiInfoReqParameters
186   {
187     uint16_t  m_sfnSf; ///< sfn SF
188     struct UlCqi_s m_ulCqi; ///< UL CQI
189 
190     std::vector <struct VendorSpecificListElement_s> m_vendorSpecificList; ///< vendor specific list
191   };
192 
193   //
194   // SCHED - MAC Scheduler SAP primitives
195   // (See 4.2 for description of the primitives)
196   //
197 
198   /**
199    * \brief SCHED_DL_RLC_BUFFER_REQ
200    *
201    * \param params SchedDlRlcBufferReqParameters
202    */
203   virtual void SchedDlRlcBufferReq (const struct SchedDlRlcBufferReqParameters& params) = 0;
204 
205   /**
206    * \brief SCHED_DL_PAGING_BUFFER_REQ
207    *
208    * \param params SchedDlPagingBufferReqParameters
209    */
210   virtual void SchedDlPagingBufferReq (const struct SchedDlPagingBufferReqParameters& params) = 0;
211 
212   /**
213    * \brief SCHED_DL_MAC_BUFFER_REQ
214    *
215    * \param params SchedDlMacBufferReqParameters
216    */
217   virtual void SchedDlMacBufferReq (const struct SchedDlMacBufferReqParameters& params) = 0;
218 
219   /**
220    * \brief SCHED_DL_TRIGGER_REQ
221    *
222    * \param params SchedDlTriggerReqParameters
223    */
224   virtual void SchedDlTriggerReq (const struct SchedDlTriggerReqParameters& params) = 0;
225 
226   /**
227    * \brief SCHED_DL_RACH_INFO_REQ
228    *
229    * \param params SchedDlRachInfoReqParameters
230    */
231   virtual void SchedDlRachInfoReq (const struct SchedDlRachInfoReqParameters& params) = 0;
232 
233   /**
234    * \brief SCHED_DL_CQI_INFO_REQ
235    *
236    * \param params SchedDlCqiInfoReqParameters
237    */
238   virtual void SchedDlCqiInfoReq (const struct SchedDlCqiInfoReqParameters& params) = 0;
239 
240   /**
241    * \brief SCHED_UL_TRIGGER_REQ
242    *
243    * \param params SchedUlTriggerReqParameters
244    */
245   virtual void SchedUlTriggerReq (const struct SchedUlTriggerReqParameters& params) = 0;
246 
247   /**
248    * \brief SCHED_UL_NOISE_INTERFERENCE_REQ
249    *
250    * \param params SchedUlNoiseInterferenceReqParameters
251    */
252   virtual void SchedUlNoiseInterferenceReq (const struct SchedUlNoiseInterferenceReqParameters& params) = 0;
253 
254   /**
255    * \brief SCHED_UL_SR_INFO_REQ
256    *
257    * \param params SchedUlSrInfoReqParameters
258    */
259   virtual void SchedUlSrInfoReq (const struct SchedUlSrInfoReqParameters& params) = 0;
260 
261   /**
262    * \brief SCHED_UL_MAC_CTRL_INFO_REQ
263    *
264    * \param params SchedUlMacCtrlInfoReqParameters
265    */
266   virtual void SchedUlMacCtrlInfoReq (const struct SchedUlMacCtrlInfoReqParameters& params) = 0;
267 
268   /**
269    * \brief SCHED_UL_CQI_INFO_REQ
270    *
271    * \param params SchedUlCqiInfoReqParameters
272    */
273   virtual void SchedUlCqiInfoReq (const struct SchedUlCqiInfoReqParameters& params) = 0;
274 
275 private:
276 };
277 
278 
279 /// FfMacSchedSapUser class
280 class FfMacSchedSapUser
281 {
282 public:
283   virtual ~FfMacSchedSapUser ();
284 
285   /**
286    * Parameters of the API primitives
287    */
288 
289   /**
290    * Parameters of the SCHED_DL_CONFIG_IND primitive.
291    * See section 4.2.7 for a detailed description of the parameters.
292    */
293   struct SchedDlConfigIndParameters
294   {
295     std::vector <struct BuildDataListElement_s>      m_buildDataList; ///< build data list
296     std::vector <struct BuildRarListElement_s>       m_buildRarList; ///< build rar list
297     std::vector <struct BuildBroadcastListElement_s> m_buildBroadcastList; ///< build broadcast list
298 
299     uint8_t m_nrOfPdcchOfdmSymbols; ///< number of PDCCH OFDM symbols
300 
301     std::vector <struct VendorSpecificListElement_s> m_vendorSpecificList; ///< vendor specific list
302   };
303 
304   /**
305    * Parameters of the SCHED_UL_CONFIG_IND primitive.
306    * See section 4.2.13 for a detailed description of the parameters.
307    */
308   struct SchedUlConfigIndParameters
309   {
310     std::vector <struct UlDciListElement_s> m_dciList; ///< DCI list
311     std::vector <struct PhichListElement_s> m_phichList; ///< PHICH list
312 
313     std::vector <struct VendorSpecificListElement_s> m_vendorSpecificList; ///< vendor specific list
314   };
315 
316   //
317   // SCHED - MAC Scheduler SAP primitives
318   // (See 4.2 for description of the primitives)
319   //
320 
321   /**
322    * \brief SCHED_DL_CONFIG_IND
323    *
324    * \param params SchedDlConfigIndParameters
325    */
326   virtual void SchedDlConfigInd (const struct SchedDlConfigIndParameters& params) = 0;
327 
328   /**
329    * \brief SCHED_UL_CONFIG_IND
330    *
331    * \param params SchedUlConfigIndParameters
332    */
333   virtual void SchedUlConfigInd (const struct SchedUlConfigIndParameters& params) = 0;
334 
335 private:
336 };
337 
338 
339 
340 /// MemberSchedSapProvider class
341 template <class C>
342 class MemberSchedSapProvider : public FfMacSchedSapProvider
343 {
344 public:
345   /**
346    * Constructor
347    *
348    * \param scheduler the scheduler class
349    */
350   MemberSchedSapProvider (C* scheduler);
351 
352   // inherited from FfMacSchedSapProvider
353   virtual void SchedDlRlcBufferReq (const struct SchedDlRlcBufferReqParameters& params);
354   virtual void SchedDlPagingBufferReq (const struct SchedDlPagingBufferReqParameters& params);
355   virtual void SchedDlMacBufferReq (const struct SchedDlMacBufferReqParameters& params);
356   virtual void SchedDlTriggerReq (const struct SchedDlTriggerReqParameters& params);
357   virtual void SchedDlRachInfoReq (const struct SchedDlRachInfoReqParameters& params);
358   virtual void SchedDlCqiInfoReq (const struct SchedDlCqiInfoReqParameters& params);
359   virtual void SchedUlTriggerReq (const struct SchedUlTriggerReqParameters& params);
360   virtual void SchedUlNoiseInterferenceReq (const struct SchedUlNoiseInterferenceReqParameters& params);
361   virtual void SchedUlSrInfoReq (const struct SchedUlSrInfoReqParameters& params);
362   virtual void SchedUlMacCtrlInfoReq (const struct SchedUlMacCtrlInfoReqParameters& params);
363   virtual void SchedUlCqiInfoReq (const struct SchedUlCqiInfoReqParameters& params);
364 
365 
366 private:
367   MemberSchedSapProvider ();
368   C* m_scheduler; ///< the scheduler class
369 };
370 
371 
372 template <class C>
MemberSchedSapProvider()373 MemberSchedSapProvider<C>::MemberSchedSapProvider ()
374 {
375 }
376 
377 
378 template <class C>
MemberSchedSapProvider(C * scheduler)379 MemberSchedSapProvider<C>::MemberSchedSapProvider (C* scheduler)
380   : m_scheduler (scheduler)
381 {
382 }
383 
384 template <class C>
385 void
SchedDlRlcBufferReq(const struct SchedDlRlcBufferReqParameters & params)386 MemberSchedSapProvider<C>::SchedDlRlcBufferReq (const struct SchedDlRlcBufferReqParameters& params)
387 {
388   m_scheduler->DoSchedDlRlcBufferReq (params);
389 }
390 
391 template <class C>
392 void
SchedDlPagingBufferReq(const struct SchedDlPagingBufferReqParameters & params)393 MemberSchedSapProvider<C>::SchedDlPagingBufferReq (const struct SchedDlPagingBufferReqParameters& params)
394 {
395   m_scheduler->DoSchedDlPagingBufferReq (params);
396 }
397 
398 template <class C>
399 void
SchedDlMacBufferReq(const struct SchedDlMacBufferReqParameters & params)400 MemberSchedSapProvider<C>::SchedDlMacBufferReq (const struct SchedDlMacBufferReqParameters& params)
401 {
402   m_scheduler->DoSchedDlMacBufferReq (params);
403 }
404 
405 template <class C>
406 void
SchedDlTriggerReq(const struct SchedDlTriggerReqParameters & params)407 MemberSchedSapProvider<C>::SchedDlTriggerReq (const struct SchedDlTriggerReqParameters& params)
408 {
409   m_scheduler->DoSchedDlTriggerReq (params);
410 }
411 
412 template <class C>
413 void
SchedDlRachInfoReq(const struct SchedDlRachInfoReqParameters & params)414 MemberSchedSapProvider<C>::SchedDlRachInfoReq (const struct SchedDlRachInfoReqParameters& params)
415 {
416   m_scheduler->DoSchedDlRachInfoReq (params);
417 }
418 
419 template <class C>
420 void
SchedDlCqiInfoReq(const struct SchedDlCqiInfoReqParameters & params)421 MemberSchedSapProvider<C>::SchedDlCqiInfoReq (const struct SchedDlCqiInfoReqParameters& params)
422 {
423   m_scheduler->DoSchedDlCqiInfoReq (params);
424 }
425 
426 template <class C>
427 void
SchedUlTriggerReq(const struct SchedUlTriggerReqParameters & params)428 MemberSchedSapProvider<C>::SchedUlTriggerReq (const struct SchedUlTriggerReqParameters& params)
429 {
430   m_scheduler->DoSchedUlTriggerReq (params);
431 }
432 
433 template <class C>
434 void
SchedUlNoiseInterferenceReq(const struct SchedUlNoiseInterferenceReqParameters & params)435 MemberSchedSapProvider<C>::SchedUlNoiseInterferenceReq (const struct SchedUlNoiseInterferenceReqParameters& params)
436 {
437   m_scheduler->DoSchedUlNoiseInterferenceReq (params);
438 }
439 
440 template <class C>
441 void
SchedUlSrInfoReq(const struct SchedUlSrInfoReqParameters & params)442 MemberSchedSapProvider<C>::SchedUlSrInfoReq (const struct SchedUlSrInfoReqParameters& params)
443 {
444   m_scheduler->DoSchedUlSrInfoReq (params);
445 }
446 
447 template <class C>
448 void
SchedUlMacCtrlInfoReq(const struct SchedUlMacCtrlInfoReqParameters & params)449 MemberSchedSapProvider<C>::SchedUlMacCtrlInfoReq (const struct SchedUlMacCtrlInfoReqParameters& params)
450 {
451   m_scheduler->DoSchedUlMacCtrlInfoReq (params);
452 }
453 
454 template <class C>
455 void
SchedUlCqiInfoReq(const struct SchedUlCqiInfoReqParameters & params)456 MemberSchedSapProvider<C>::SchedUlCqiInfoReq (const struct SchedUlCqiInfoReqParameters& params)
457 {
458   m_scheduler->DoSchedUlCqiInfoReq (params);
459 }
460 
461 
462 
463 
464 
465 } // namespace ns3
466 
467 #endif /* FF_MAC_SCHED_SAP_H */
468