eNB_scheduler.c 20.5 KB
Newer Older
1
/*******************************************************************************
nikaeinn's avatar
nikaeinn committed
2 3
    OpenAirInterface
    Copyright(c) 1999 - 2014 Eurecom
4

nikaeinn's avatar
nikaeinn committed
5 6 7 8
    OpenAirInterface is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
9 10


nikaeinn's avatar
nikaeinn committed
11 12 13 14
    OpenAirInterface is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
15

nikaeinn's avatar
nikaeinn committed
16 17 18 19
    You should have received a copy of the GNU General Public License
    along with OpenAirInterface.The full GNU General Public License is
    included in this distribution in the file called "COPYING". If not,
    see <http://www.gnu.org/licenses/>.
20 21

  Contact Information
nikaeinn's avatar
nikaeinn committed
22 23
  OpenAirInterface Admin: openair_admin@eurecom.fr
  OpenAirInterface Tech : openair_tech@eurecom.fr
24
  OpenAirInterface Dev  : openair4g-devel@lists.eurecom.fr
nikaeinn's avatar
nikaeinn committed
25

ghaddab's avatar
ghaddab committed
26
  Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
27

nikaeinn's avatar
nikaeinn committed
28
*******************************************************************************/
29
/*! \file eNB_scheduler.c
nikaeinn's avatar
nikaeinn committed
30
 * \brief eNB scheduler top level function operates on per subframe basis
31 32
 * \author  Navid Nikaein and Raymond Knopp
 * \date 2010 - 2014
33
 * \email: navid.nikaein@eurecom.fr
34 35
 * \version 0.5
 * @ingroup _mac
36

37
 */
38

39
#include "assertions.h"
40 41 42 43 44 45 46 47
#include "PHY/defs.h"
#include "PHY/extern.h"

#include "SCHED/defs.h"
#include "SCHED/extern.h"

#include "LAYER2/MAC/defs.h"
#include "LAYER2/MAC/extern.h"
gauthier's avatar
gauthier committed
48

49 50 51 52 53 54
#include "LAYER2/MAC/proto.h"
#include "UTIL/LOG/log.h"
#include "UTIL/LOG/vcd_signal_dumper.h"
#include "UTIL/OPT/opt.h"
#include "OCG.h"
#include "OCG_extern.h"
gauthier's avatar
gauthier committed
55

56 57
#include "RRC/LITE/extern.h"
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
gauthier's avatar
gauthier committed
58

59 60
//#include "LAYER2/MAC/pre_processor.c"
#include "pdcp.h"
61

62 63
#if defined(ENABLE_ITTI)
# include "intertask_interface.h"
64 65
#endif

66 67 68 69
#define ENABLE_MAC_PAYLOAD_DEBUG
#define DEBUG_eNB_SCHEDULER 1
//#define DEBUG_HEADER_PARSING 1
//#define DEBUG_PACKET_TRACE 1
gauthier's avatar
gauthier committed
70

71 72 73 74 75
/*
  #ifndef USER_MODE
  #define msg debug_msg
  #endif
 */
gauthier's avatar
gauthier committed
76 77 78



79

80 81 82



83 84
void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, frame_t frameP, sub_frame_t subframeP)  //, int calibration_flag) {
{
85

86
  int mbsfn_status[MAX_NUM_CCs];
87
  protocol_ctxt_t   ctxt;
88
#ifdef EXMIMO
89
  int ret;
90
#endif
91
#if defined(ENABLE_ITTI)
92
  MessageDef   *msg_p;
93
  const char         *msg_name;
94 95
  instance_t    instance;
  int           result;
96
#endif
97
  DCI_PDU *DCI_pdu[MAX_NUM_CCs];
98
  int CC_id,i,next_i;
99
  UE_list_t *UE_list=&eNB_mac_inst[module_idP].UE_list;
100
  rnti_t rnti;
101 102
  void         *DLSCH_dci=NULL;
  int size_bits,size_bytes;
103

104
  LOG_D(MAC,"[eNB %d] Frame %d, Subframe %d, entering MAC scheduler (UE_list->head %d)\n",module_idP, frameP, subframeP,UE_list->head);
105

106
  start_meas(&eNB_mac_inst[module_idP].eNB_scheduler);
gauthier's avatar
gauthier committed
107
  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_IN);
108

109
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
110
    DCI_pdu[CC_id] = &eNB_mac_inst[module_idP].common_channels[CC_id].DCI_pdu;
111 112
    DCI_pdu[CC_id]->nCCE=0;
    DCI_pdu[CC_id]->num_pdcch_symbols=1;
113
    mbsfn_status[CC_id]=0;
114 115
    // clear vrb_map
    memset(eNB_mac_inst[module_idP].common_channels[CC_id].vrb_map,0,100);
116
  }
117

118
  // refresh UE list based on UEs dropped by PHY in previous subframe
119 120 121
  i = UE_list->head;

  while (i>=0) {
122 123 124 125
    rnti = UE_RNTI(module_idP, i);
    CC_id = UE_PCCID(module_idP, i);
    LOG_D(MAC,"UE %d: rnti %x (%p)\n", i, rnti,
          mac_xface->get_eNB_UE_stats(module_idP, CC_id, rnti));
126
    next_i= UE_list->next[i];
127

128 129
    // increment this, it is cleared when we receive an sdu
    eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[i].ul_inactivity_timer++;
130
    
131
    if (mac_xface->get_eNB_UE_stats(module_idP, CC_id, rnti)==NULL) {
132
      //      mac_remove_ue(module_idP, i, frameP, subframeP);
133
    }
134 135
    else {
      // check uplink failure
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
      if ((UE_list->UE_sched_ctrl[i].ul_failure_timer>0)&&
	  (UE_list->UE_sched_ctrl[i].ul_out_of_sync==0)) {
	LOG_D(MAC,"UE %d rnti %x: UL Failure timer %d \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);
	if (UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent==0) {
	  UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent=1;
	  
	  // add a format 1A dci for this UE to request an RA procedure (only one UE per subframe)
	  LOG_I(MAC,"UE %d rnti %x: sending PDCCH order for RAPROC (failure timer %d) \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);	    
	  DLSCH_dci = (void *)UE_list->UE_template[CC_id][i].DLSCH_DCI[0];
	  *(uint32_t*)DLSCH_dci = 0;
	  if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) {
	    switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
	    case 6:
	      ((DCI1A_1_5MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_1_5MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 31;
	      size_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
	      size_bits  = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
	      break;
	    case 25:
	      ((DCI1A_5MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_5MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 511;
	      size_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t);
	      size_bits  = sizeof_DCI1A_5MHz_TDD_1_6_t;
	      break;
	    case 50:
	      ((DCI1A_10MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_10MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 2047;
	      size_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t);
	      size_bits  = sizeof_DCI1A_10MHz_TDD_1_6_t;
	      break;
	    case 100:
	      ((DCI1A_20MHz_TDD_1_6_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_20MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 8191;
	      size_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t);
	      size_bits  = sizeof_DCI1A_20MHz_TDD_1_6_t;
	      break;
172
	    }
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
	  }
	  else { // FDD
	    switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) {
	    case 6:
	      ((DCI1A_1_5MHz_FDD_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_1_5MHz_FDD_t*)DLSCH_dci)->rballoc = 31;
	      size_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
	      size_bits  = sizeof_DCI1A_1_5MHz_FDD_t;
	      break;
	    case 25:
	      ((DCI1A_5MHz_FDD_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_5MHz_FDD_t*)DLSCH_dci)->rballoc = 511;
	      size_bytes = sizeof(DCI1A_5MHz_FDD_t);
	      size_bits  = sizeof_DCI1A_5MHz_FDD_t;
	      break;
	    case 50:
	      ((DCI1A_10MHz_FDD_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_10MHz_FDD_t*)DLSCH_dci)->rballoc = 2047;
	      size_bytes = sizeof(DCI1A_10MHz_FDD_t);
	      size_bits  = sizeof_DCI1A_10MHz_FDD_t;
193
		break;
194 195 196 197 198 199
	    case 100:
	      ((DCI1A_20MHz_FDD_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_20MHz_FDD_t*)DLSCH_dci)->rballoc = 8191;
	      size_bytes = sizeof(DCI1A_20MHz_FDD_t);
	      size_bits  = sizeof_DCI1A_20MHz_FDD_t;
	      break;
200 201
	    }
	  }
202 203 204 205 206 207 208 209 210
	  
	  add_ue_spec_dci(DCI_pdu[CC_id],
			  DLSCH_dci,
			  rnti,
			    size_bytes,
			  process_ue_cqi (module_idP,i),//aggregation,
			  size_bits,
			  format1A,
			  0);
211
	}
212
	else { // ra_pdcch_sent==1
213
	  LOG_D(MAC,"UE %d rnti %x: sent PDCCH order for RAPROC waiting (failure timer %d) \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);	    	    
214 215
	  if ((UE_list->UE_sched_ctrl[i].ul_failure_timer % 40) == 0)
	    UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent=0; // resend every 4 frames	      
216
	}
217 218 219 220 221 222 223 224 225 226
      
	UE_list->UE_sched_ctrl[i].ul_failure_timer++;
	// check threshold
	if (UE_list->UE_sched_ctrl[i].ul_failure_timer > 200) {
	  // inform RRC of failure and clear timer
	  LOG_I(MAC,"UE %d rnti %x: UL Failure Triggering RRC \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);
	  mac_eNB_rrc_ul_failure(module_idP,CC_id,frameP,subframeP,rnti);
	  UE_list->UE_sched_ctrl[i].ul_failure_timer=0;
	  UE_list->UE_sched_ctrl[i].ul_out_of_sync=1;
	}
227 228 229
      }
    } // ul_failure_timer>0
    
230
    i = next_i;
231
  }
232

233
#if defined(ENABLE_ITTI)
234

235
  do {
236 237
    // Checks if a message has been sent to MAC sub-task
    itti_poll_msg (TASK_MAC_ENB, &msg_p);
238

239 240 241
    if (msg_p != NULL) {
      msg_name = ITTI_MSG_NAME (msg_p);
      instance = ITTI_MSG_INSTANCE (msg_p);
242

243 244 245 246
      switch (ITTI_MSG_ID(msg_p)) {
      case MESSAGE_TEST:
        LOG_D(MAC, "Received %s\n", ITTI_MSG_NAME(msg_p));
        break;
247

248 249 250 251
      case RRC_MAC_BCCH_DATA_REQ:
        LOG_D(MAC, "Received %s from %s: instance %d, frameP %d, eNB_index %d\n",
              msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), instance,
              RRC_MAC_BCCH_DATA_REQ (msg_p).frame, RRC_MAC_BCCH_DATA_REQ (msg_p).enb_index);
252

253 254
        // TODO process BCCH data req.
        break;
255

256 257 258 259
      case RRC_MAC_CCCH_DATA_REQ:
        LOG_D(MAC, "Received %s from %s: instance %d, frameP %d, eNB_index %d\n",
              msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), instance,
              RRC_MAC_CCCH_DATA_REQ (msg_p).frame, RRC_MAC_CCCH_DATA_REQ (msg_p).enb_index);
260

261 262
        // TODO process CCCH data req.
        break;
263 264 265

#ifdef Rel10

266 267 268 269
      case RRC_MAC_MCCH_DATA_REQ:
        LOG_D(MAC, "Received %s from %s: instance %d, frameP %d, eNB_index %d, mbsfn_sync_area %d\n",
              msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), instance,
              RRC_MAC_MCCH_DATA_REQ (msg_p).frame, RRC_MAC_MCCH_DATA_REQ (msg_p).enb_index, RRC_MAC_MCCH_DATA_REQ (msg_p).mbsfn_sync_area);
270

271 272 273
        // TODO process MCCH data req.
        break;
#endif
274

275 276 277
      default:
        LOG_E(MAC, "Received unexpected message %s\n", msg_name);
        break;
gauthier's avatar
gauthier committed
278
      }
279 280 281 282

      result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
      AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
    }
283
  } while(msg_p != NULL);
284

285 286
#endif

gauthier's avatar
gauthier committed
287
  // clear DCI and BCCH contents before scheduling
288
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
289 290
    DCI_pdu[CC_id]->Num_common_dci  = 0;
    DCI_pdu[CC_id]->Num_ue_spec_dci = 0;
291

292

293
#ifdef Rel10
294
    eNB_mac_inst[module_idP].common_channels[CC_id].mcch_active =0;
295
#endif
296

297 298
    eNB_mac_inst[module_idP].frame    = frameP;
    eNB_mac_inst[module_idP].subframe = subframeP;
299 300


301
  }
302

gauthier's avatar
gauthier committed
303
  //if (subframeP%5 == 0)
304
  //#ifdef EXMIMO
305
  PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frameP, 0,module_idP);
306
  pdcp_run(&ctxt);
307
  //#endif
308

309
  // check HO
310 311
  rrc_rx_tx(&ctxt,
            0, // eNB index, unused in eNB
312
            CC_id);
313 314

#ifdef Rel10
315 316

  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
317 318 319 320
    if (eNB_mac_inst[module_idP].common_channels[CC_id].MBMS_flag >0) {
      start_meas(&eNB_mac_inst[module_idP].schedule_mch);
      mbsfn_status[CC_id] = schedule_MBMS(module_idP,CC_id,frameP,subframeP);
      stop_meas(&eNB_mac_inst[module_idP].schedule_mch);
321
    }
322
  }
323

324
#endif
325
  // refresh UE list based on UEs dropped by PHY in previous subframe
326
  /*
327 328 329
  i=UE_list->head;
  while (i>=0) {
    next_i = UE_list->next[i];
330
    LOG_T(MAC,"UE %d : rnti %x, stats %p\n",i,UE_RNTI(module_idP,i),mac_xface->get_eNB_UE_stats(module_idP,0,UE_RNTI(module_idP,i)));
331
    if (mac_xface->get_eNB_UE_stats(module_idP,0,UE_RNTI(module_idP,i))==NULL) {
332
      mac_remove_ue(module_idP,i,frameP);
333 334 335
    }
    i=next_i;
  }
336
  */
337

gauthier's avatar
gauthier committed
338
  switch (subframeP) {
339
  case 0:
340

341
    // FDD/TDD Schedule Downlink RA transmissions (RA response, Msg4 Contention resolution)
gauthier's avatar
gauthier committed
342
    // Schedule ULSCH for FDD or subframeP 4 (TDD config 0,3,6)
343
    // Schedule Normal DLSCH
gauthier's avatar
gauthier committed
344

knopp's avatar
knopp committed
345

346 347
    schedule_RA(module_idP,frameP,subframeP,2);

348 349

    if (mac_xface->lte_frame_parms->frame_type == FDD) {  //FDD
350
      schedule_ulsch(module_idP,frameP,cooperation_flag,0,4);//,calibration_flag);
351 352 353
    } else if  ((mac_xface->lte_frame_parms->tdd_config == TDD) || //TDD
                (mac_xface->lte_frame_parms->tdd_config == 3) ||
                (mac_xface->lte_frame_parms->tdd_config == 6)) {
354
      //schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4);//,calibration_flag);
Florian Kaltenberger's avatar
Florian Kaltenberger committed
355
    }
356

357 358
    schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
    fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
359

360 361 362
    break;

  case 1:
363

gauthier's avatar
gauthier committed
364
    // TDD, schedule UL for subframeP 7 (TDD config 0,1) / subframeP 8 (TDD Config 6)
365 366
    // FDD, schedule normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD
367 368 369
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 0:
      case 1:
370
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7);
371
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
372 373 374
        break;

      case 6:
375
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8);
376
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
377 378 379 380 381 382
        break;

      default:
        break;
      }
    } else { //FDD
383
      schedule_ulsch(module_idP,frameP,cooperation_flag,1,5);
384
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
385
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
386
    }
387

388
    break;
389 390

  case 2:
391

gauthier's avatar
gauthier committed
392
    // TDD, nothing
393 394
    // FDD, normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == FDD) {  //FDD
395
      schedule_ulsch(module_idP,frameP,cooperation_flag,2,6);
396
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
397
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
398
    }
399

400 401 402
    break;

  case 3:
403

gauthier's avatar
gauthier committed
404
    // TDD Config 2, ULSCH for subframeP 7
405 406 407
    // TDD Config 2/5 normal DLSCH
    // FDD, normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) {
408 409
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 2:
410
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7);
411 412 413

        // no break here!
      case 5:
414 415
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
416 417 418 419 420 421
        break;

      default:
        break;
      }
    } else { //FDD
422

423
      schedule_ulsch(module_idP,frameP,cooperation_flag,3,7);
424
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
425
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
426
    }
427

428
    break;
429 430

  case 4:
431

gauthier's avatar
gauthier committed
432
    // TDD Config 1, ULSCH for subframeP 8
433 434 435
    // TDD Config 1/2/4/5 DLSCH
    // FDD UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == 1) { // TDD
436 437
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 1:
438
        //        schedule_RA(module_idP,frameP,subframeP);
439
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8);
440 441 442 443 444 445 446 447 448

        // no break here!
      case 2:

        // no break here!
      case 4:

        // no break here!
      case 5:
knopp's avatar
knopp committed
449

450 451
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
452 453 454 455 456 457 458 459
        break;

      default:
        break;
      }
    } else {
      if (mac_xface->lte_frame_parms->frame_type == FDD) {  //FDD

460
	schedule_ulsch(module_idP, frameP, cooperation_flag, 4, 8);
461
	schedule_ue_spec(module_idP, frameP, subframeP,  mbsfn_status);
462
        fill_DLSCH_dci(module_idP, frameP, subframeP,   mbsfn_status);
463
      }
464
    }
465

466 467 468 469 470 471 472
    break;

  case 5:
    // TDD/FDD Schedule SI
    // TDD Config 0,6 ULSCH for subframes 9,3 resp.
    // TDD normal DLSCH
    // FDD normal UL/DLSCH
473
    schedule_SI(module_idP,frameP,subframeP);
474

475
    //schedule_RA(module_idP,frameP,subframeP,5);
476
    if (mac_xface->lte_frame_parms->frame_type == FDD) {
477 478 479 480
      schedule_RA(module_idP,frameP,subframeP,1);
      schedule_ulsch(module_idP,frameP,cooperation_flag,5,9);
      schedule_ue_spec(module_idP, frameP, subframeP,  mbsfn_status);
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
481 482
    } else if ((mac_xface->lte_frame_parms->tdd_config == 0) || // TDD Config 0
               (mac_xface->lte_frame_parms->tdd_config == 6)) { // TDD Config 6
483
      //schedule_ulsch(module_idP,cooperation_flag,subframeP);
484
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
485
    } else {
486 487
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
488
    }
489

490 491 492
    break;

  case 6:
493

494 495 496 497
    // TDD Config 0,1,6 ULSCH for subframes 2,3
    // TDD Config 3,4,5 Normal DLSCH
    // FDD normal ULSCH/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD
498 499 500 501 502
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 0:
        break;

      case 1:
503
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2);
504 505
        //  schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
506 507 508
        break;

      case 6:
509
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
510 511
        //  schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
512 513 514
        break;

      case 5:
515 516 517
        schedule_RA(module_idP,frameP,subframeP,2);
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
518 519 520 521
        break;

      case 3:
      case 4:
522 523
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
524 525 526 527 528 529
        break;

      default:
        break;
      }
    } else { //FDD
530
      schedule_ulsch(module_idP,frameP,cooperation_flag,6,0);
531
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
532
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
533
    }
534

535
    break;
gauthier's avatar
gauthier committed
536

537
  case 7:
538

539 540 541
    // TDD Config 3,4,5 Normal DLSCH
    // FDD Normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD
542 543 544
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 3:
      case 4:
545 546 547
        schedule_RA(module_idP,frameP,subframeP,3);  // 3 = Msg3 subframeP, not
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
548 549 550
        break;

      case 5:
551 552
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
553 554 555 556 557 558
        break;

      default:
        break;
      }
    } else { //FDD
559
      schedule_ulsch(module_idP,frameP,cooperation_flag,7,1);
560
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
561
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
562
    }
563

564 565 566
    break;

  case 8:
567

gauthier's avatar
gauthier committed
568
    // TDD Config 2,3,4,5 ULSCH for subframeP 2
569 570 571
    //
    // FDD Normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD
572 573 574 575 576 577
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 2:
      case 3:
      case 4:
      case 5:

578
        //  schedule_RA(module_idP,subframeP);
579
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2);
580 581
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
582 583 584 585 586 587
        break;

      default:
        break;
      }
    } else { //FDD
588
      schedule_ulsch(module_idP,frameP,cooperation_flag,8,2);
589
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
590
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
591
    }
592

593 594 595
    break;

  case 9:
596

597 598
    // TDD Config 1,3,4,6 ULSCH for subframes 3,3,3,4
    if (mac_xface->lte_frame_parms->frame_type == TDD) {
599 600
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 1:
601
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
602 603 604
        schedule_RA(module_idP,frameP,subframeP,7);  // 7 = Msg3 subframeP, not
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
605 606 607 608
        break;

      case 3:
      case 4:
609
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
610 611
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
612 613 614
        break;

      case 6:
615
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4);
616 617 618
        //schedule_RA(module_idP,frameP,subframeP);
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
619 620 621 622
        break;

      case 2:
      case 5:
623 624 625
        //schedule_RA(module_idP,frameP,subframeP);
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
626 627 628 629 630 631
        break;

      default:
        break;
      }
    } else { //FDD
632
      schedule_ulsch(module_idP,frameP,cooperation_flag,9,3);
633
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
634
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
635
    }
636

637
    break;
gauthier's avatar
gauthier committed
638

639
  }
640

641
  LOG_D(MAC,"FrameP %d, subframeP %d : Scheduling CCEs\n",frameP,subframeP);
642

643
  // Allocate CCEs for good after scheduling is done
644 645
  for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++)
    allocate_CCEs(module_idP,CC_id,subframeP,0);
646

647
  LOG_D(MAC,"frameP %d, subframeP %d\n",frameP,subframeP);
648

649
  stop_meas(&eNB_mac_inst[module_idP].eNB_scheduler);
gauthier's avatar
gauthier committed
650
  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_OUT);
651

652
}
653 654 655