eNB_scheduler.c 20.6 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
    // 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

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

235
#if defined(ENABLE_ITTI)
236

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

241
242
243
    if (msg_p != NULL) {
      msg_name = ITTI_MSG_NAME (msg_p);
      instance = ITTI_MSG_INSTANCE (msg_p);
244

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

250
251
252
253
      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);
254

255
256
        // TODO process BCCH data req.
        break;
257

258
259
260
261
      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);
262

263
264
        // TODO process CCCH data req.
        break;
265
266
267

#ifdef Rel10

268
269
270
271
      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);
272

273
274
275
        // TODO process MCCH data req.
        break;
#endif
276

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

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

287
288
#endif

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

294

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

knopp's avatar
   
knopp committed
299
300
    eNB_mac_inst[module_idP].frame    = frameP;
    eNB_mac_inst[module_idP].subframe = subframeP;
301
302


knopp's avatar
   
knopp committed
303
  }
304

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

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

#ifdef Rel10
317
318

  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
319
320
321
322
    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
323
    }
324
  }
325

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

gauthier's avatar
gauthier committed
340
  switch (subframeP) {
341
  case 0:
342

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

knopp's avatar
knopp committed
347

348
349
    schedule_RA(module_idP,frameP,subframeP,2);

350
351

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

359
360
    schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
    fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
361

362
363
364
    break;

  case 1:
365

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

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

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

390
    break;
391
392

  case 2:
393

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

402
403
404
    break;

  case 3:
405

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

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

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

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

430
    break;
431
432

  case 4:
433

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

        // no break here!
      case 2:

        // no break here!
      case 4:

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

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

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

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

468
469
470
471
472
473
474
    break;

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

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

492
493
494
    break;

  case 6:
495

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

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

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

      case 5:
517
518
519
        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);
520
521
522
523
        break;

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

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

537
    break;
gauthier's avatar
gauthier committed
538

539
  case 7:
540

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

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

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

566
567
568
    break;

  case 8:
569

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

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

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

595
596
597
    break;

  case 9:
598

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

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

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

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

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

639
    break;
gauthier's avatar
gauthier committed
640

641
  }
642

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

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

649
  LOG_D(MAC,"frameP %d, subframeP %d\n",frameP,subframeP);
650

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

654
}
655
656
657