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()373MemberSchedSapProvider<C>::MemberSchedSapProvider () 374 { 375 } 376 377 378 template <class C> MemberSchedSapProvider(C * scheduler)379MemberSchedSapProvider<C>::MemberSchedSapProvider (C* scheduler) 380 : m_scheduler (scheduler) 381 { 382 } 383 384 template <class C> 385 void SchedDlRlcBufferReq(const struct SchedDlRlcBufferReqParameters & params)386MemberSchedSapProvider<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)393MemberSchedSapProvider<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)400MemberSchedSapProvider<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)407MemberSchedSapProvider<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)414MemberSchedSapProvider<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)421MemberSchedSapProvider<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)428MemberSchedSapProvider<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)435MemberSchedSapProvider<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)442MemberSchedSapProvider<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)449MemberSchedSapProvider<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)456MemberSchedSapProvider<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