eNB_scheduler.c 20.9 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

knopp's avatar
   
knopp committed
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
knopp's avatar
   
knopp committed
97
  DCI_PDU *DCI_pdu[MAX_NUM_CCs];
knopp's avatar
   
knopp committed
98
  int CC_id,i,next_i;
knopp's avatar
   
knopp committed
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++) {
knopp's avatar
   
knopp committed
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;
knopp's avatar
   
knopp committed
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);
knopp's avatar
   
knopp committed
116
  }
117

knopp's avatar
   
knopp committed
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
130
    PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_bsr[i][(frameP*10)+subframeP]=-63;
    if (i==UE_list->head)
      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR,PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_bsr[i][(frameP*10)+subframeP]); 
131
132
    // increment this, it is cleared when we receive an sdu
    eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[i].ul_inactivity_timer++;
133
134

    eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[i].cqi_req_timer++;
135
    
136
    if (mac_xface->get_eNB_UE_stats(module_idP, CC_id, rnti)==NULL) {
137
      //      mac_remove_ue(module_idP, i, frameP, subframeP);
138
    }
139
140
    else {
      // check uplink failure
Florian Kaltenberger's avatar
Florian Kaltenberger committed
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
172
173
174
175
176
      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;
177
	    }
Florian Kaltenberger's avatar
Florian Kaltenberger committed
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
	  }
	  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;
198
		break;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
199
200
201
202
203
204
	    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;
205
206
	    }
	  }
Florian Kaltenberger's avatar
Florian Kaltenberger committed
207
208
209
210
211
212
213
214
215
	  
	  add_ue_spec_dci(DCI_pdu[CC_id],
			  DLSCH_dci,
			  rnti,
			    size_bytes,
			  process_ue_cqi (module_idP,i),//aggregation,
			  size_bits,
			  format1A,
			  0);
216
	}
Florian Kaltenberger's avatar
Florian Kaltenberger committed
217
	else { // ra_pdcch_sent==1
218
	  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);	    	    
Florian Kaltenberger's avatar
Florian Kaltenberger committed
219
220
	  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	      
221
	}
222
223
224
225
226
227
228
229
230
231
      
	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;
	}
Florian Kaltenberger's avatar
Florian Kaltenberger committed
232
233
234
      }
    } // ul_failure_timer>0
    
235
    i = next_i;
knopp's avatar
   
knopp committed
236
  }
237

238
#if defined(ENABLE_ITTI)
239

240
  do {
241
242
    // Checks if a message has been sent to MAC sub-task
    itti_poll_msg (TASK_MAC_ENB, &msg_p);
243

244
245
246
    if (msg_p != NULL) {
      msg_name = ITTI_MSG_NAME (msg_p);
      instance = ITTI_MSG_INSTANCE (msg_p);
247

248
249
250
251
      switch (ITTI_MSG_ID(msg_p)) {
      case MESSAGE_TEST:
        LOG_D(MAC, "Received %s\n", ITTI_MSG_NAME(msg_p));
        break;
252

253
254
255
256
      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);
257

258
259
        // TODO process BCCH data req.
        break;
260

261
262
263
264
      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);
265

266
267
        // TODO process CCCH data req.
        break;
268
269
270

#ifdef Rel10

271
272
273
274
      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);
275

276
277
278
        // TODO process MCCH data req.
        break;
#endif
279

280
281
282
      default:
        LOG_E(MAC, "Received unexpected message %s\n", msg_name);
        break;
gauthier's avatar
gauthier committed
283
      }
284
285
286
287

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

290
291
#endif

gauthier's avatar
gauthier committed
292
  // clear DCI and BCCH contents before scheduling
293
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
knopp's avatar
   
knopp committed
294
295
    DCI_pdu[CC_id]->Num_common_dci  = 0;
    DCI_pdu[CC_id]->Num_ue_spec_dci = 0;
296

297

298
#ifdef Rel10
299
    eNB_mac_inst[module_idP].common_channels[CC_id].mcch_active =0;
300
#endif
301

knopp's avatar
   
knopp committed
302
303
    eNB_mac_inst[module_idP].frame    = frameP;
    eNB_mac_inst[module_idP].subframe = subframeP;
304
305


knopp's avatar
   
knopp committed
306
  }
307

gauthier's avatar
gauthier committed
308
  //if (subframeP%5 == 0)
knopp's avatar
   
knopp committed
309
  //#ifdef EXMIMO
310
  PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frameP, 0,module_idP);
311
  pdcp_run(&ctxt);
knopp's avatar
   
knopp committed
312
  //#endif
313

314
  // check HO
315
316
  rrc_rx_tx(&ctxt,
            0, // eNB index, unused in eNB
317
            CC_id);
318
319

#ifdef Rel10
320
321

  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
322
323
324
325
    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);
knopp's avatar
   
knopp committed
326
    }
327
  }
328

329
#endif
knopp's avatar
   
knopp committed
330
  // refresh UE list based on UEs dropped by PHY in previous subframe
331
  /*
knopp's avatar
   
knopp committed
332
333
334
  i=UE_list->head;
  while (i>=0) {
    next_i = UE_list->next[i];
335
    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)));
knopp's avatar
   
knopp committed
336
    if (mac_xface->get_eNB_UE_stats(module_idP,0,UE_RNTI(module_idP,i))==NULL) {
knopp's avatar
   
knopp committed
337
      mac_remove_ue(module_idP,i,frameP);
knopp's avatar
   
knopp committed
338
339
340
    }
    i=next_i;
  }
341
  */
342

gauthier's avatar
gauthier committed
343
  switch (subframeP) {
344
  case 0:
345

346
    // FDD/TDD Schedule Downlink RA transmissions (RA response, Msg4 Contention resolution)
gauthier's avatar
gauthier committed
347
    // Schedule ULSCH for FDD or subframeP 4 (TDD config 0,3,6)
348
    // Schedule Normal DLSCH
gauthier's avatar
gauthier committed
349

knopp's avatar
knopp committed
350

351
352
    schedule_RA(module_idP,frameP,subframeP,2);

353
354

    if (mac_xface->lte_frame_parms->frame_type == FDD) {  //FDD
355
      schedule_ulsch(module_idP,frameP,cooperation_flag,0,4);//,calibration_flag);
356
357
358
    } 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)) {
359
      //schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4);//,calibration_flag);
Florian Kaltenberger's avatar
Florian Kaltenberger committed
360
    }
361

362
363
    schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
    fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
364

365
366
367
    break;

  case 1:
368

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

      case 6:
380
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8);
381
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
382
383
384
385
386
387
        break;

      default:
        break;
      }
    } else { //FDD
388
      schedule_ulsch(module_idP,frameP,cooperation_flag,1,5);
389
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
390
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
391
    }
392

393
    break;
394
395

  case 2:
396

gauthier's avatar
gauthier committed
397
    // TDD, nothing
398
399
    // FDD, normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == FDD) {  //FDD
400
      schedule_ulsch(module_idP,frameP,cooperation_flag,2,6);
401
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
402
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
403
    }
404

405
406
407
    break;

  case 3:
408

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

        // no break here!
      case 5:
419
420
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
421
422
423
424
425
426
        break;

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

428
      schedule_ulsch(module_idP,frameP,cooperation_flag,3,7);
429
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
430
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
431
    }
432

433
    break;
434
435

  case 4:
436

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

        // no break here!
      case 2:

        // no break here!
      case 4:

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

455
456
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
457
458
459
460
461
462
463
464
        break;

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

465
	schedule_ulsch(module_idP, frameP, cooperation_flag, 4, 8);
466
	schedule_ue_spec(module_idP, frameP, subframeP,  mbsfn_status);
467
        fill_DLSCH_dci(module_idP, frameP, subframeP,   mbsfn_status);
468
      }
469
    }
470

471
472
473
474
475
476
477
    break;

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

480
    //schedule_RA(module_idP,frameP,subframeP,5);
481
    if (mac_xface->lte_frame_parms->frame_type == FDD) {
482
483
484
485
      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);
486
487
    } else if ((mac_xface->lte_frame_parms->tdd_config == 0) || // TDD Config 0
               (mac_xface->lte_frame_parms->tdd_config == 6)) { // TDD Config 6
488
      //schedule_ulsch(module_idP,cooperation_flag,subframeP);
489
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
490
    } else {
491
492
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
493
    }
494

495
496
497
    break;

  case 6:
498

499
500
501
502
    // 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
503
504
505
506
507
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 0:
        break;

      case 1:
508
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2);
509
510
        //  schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
511
512
513
        break;

      case 6:
514
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
515
516
        //  schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
517
518
519
        break;

      case 5:
520
521
522
        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);
523
524
525
526
        break;

      case 3:
      case 4:
527
528
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
529
530
531
532
533
534
        break;

      default:
        break;
      }
    } else { //FDD
535
      schedule_ulsch(module_idP,frameP,cooperation_flag,6,0);
536
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
537
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
538
    }
539

540
    break;
gauthier's avatar
gauthier committed
541

542
  case 7:
543

544
545
546
    // TDD Config 3,4,5 Normal DLSCH
    // FDD Normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD
547
548
549
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 3:
      case 4:
550
551
552
        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);
553
554
555
        break;

      case 5:
556
557
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
558
559
560
561
562
563
        break;

      default:
        break;
      }
    } else { //FDD
564
      schedule_ulsch(module_idP,frameP,cooperation_flag,7,1);
565
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
566
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
567
    }
568

569
570
571
    break;

  case 8:
572

gauthier's avatar
gauthier committed
573
    // TDD Config 2,3,4,5 ULSCH for subframeP 2
574
575
576
    //
    // FDD Normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD
577
578
579
580
581
582
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 2:
      case 3:
      case 4:
      case 5:

583
        //  schedule_RA(module_idP,subframeP);
584
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2);
585
586
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
587
588
589
590
591
592
        break;

      default:
        break;
      }
    } else { //FDD
593
      schedule_ulsch(module_idP,frameP,cooperation_flag,8,2);
594
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
595
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
596
    }
597

598
599
600
    break;

  case 9:
601

602
603
    // TDD Config 1,3,4,6 ULSCH for subframes 3,3,3,4
    if (mac_xface->lte_frame_parms->frame_type == TDD) {
604
605
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 1:
606
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
607
608
609
        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);
610
611
612
613
        break;

      case 3:
      case 4:
614
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
615
616
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
617
618
619
        break;

      case 6:
620
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4);
621
622
623
        //schedule_RA(module_idP,frameP,subframeP);
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
624
625
626
627
        break;

      case 2:
      case 5:
628
629
630
        //schedule_RA(module_idP,frameP,subframeP);
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
631
632
633
634
635
636
        break;

      default:
        break;
      }
    } else { //FDD
637
      schedule_ulsch(module_idP,frameP,cooperation_flag,9,3);
638
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
639
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
640
    }
641

642
    break;
gauthier's avatar
gauthier committed
643

644
  }
645

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

648
  // Allocate CCEs for good after scheduling is done
649
650
  for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++)
    allocate_CCEs(module_idP,CC_id,subframeP,0);
651

652
  LOG_D(MAC,"frameP %d, subframeP %d\n",frameP,subframeP);
653

654
  stop_meas(&eNB_mac_inst[module_idP].eNB_scheduler);
gauthier's avatar
gauthier committed
655
  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_OUT);
656

657
}
658
659
660