eNB_scheduler.c 20.2 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
103
  int ra_pdcch_sent=0;
  void         *DLSCH_dci=NULL;
  int size_bits,size_bytes;
104

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

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

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

knopp's avatar
   
knopp committed
119
  // refresh UE list based on UEs dropped by PHY in previous subframe
120
121
122
  i = UE_list->head;

  while (i>=0) {
123
124
125
126
    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));
127
    next_i= UE_list->next[i];
128

129
130
131
    // increment this, it is cleared when we receive an sdu
    eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[i].ul_inactivity_timer++;

132
133
    if (mac_xface->get_eNB_UE_stats(module_idP, CC_id, rnti)==NULL) {
      mac_remove_ue(module_idP, i, frameP, subframeP);
134
    }
135
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
    else {
      // check uplink failure
      if (UE_list->UE_sched_ctrl[i].ul_failure_timer>0) {
	LOG_I(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) {
	  if (ra_pdcch_sent==0) {
	    UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent=1;
	    ra_pdcch_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  \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;
	      }
	    }
	    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;
		break;
	      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;
	      }
	    }

	    add_ue_spec_dci(DCI_pdu[CC_id],
			    DLSCH_dci,
			    rnti,
			    size_bytes,
			    process_ue_cqi (module_idP,i),//aggregation,
			    size_bits,
			    format1A,
			    0);
	  }
	  else { // ra_pdcch_sent==1
	    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	      
	  }
	}
	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;
	}
      } // ul_failure_timer>0

    }
230
    i = next_i;
knopp's avatar
   
knopp committed
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++) {
knopp's avatar
   
knopp committed
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

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


knopp's avatar
   
knopp committed
301
  }
302

gauthier's avatar
gauthier committed
303
  //if (subframeP%5 == 0)
knopp's avatar
   
knopp committed
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);
knopp's avatar
   
knopp committed
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);
knopp's avatar
   
knopp committed
321
    }
322
  }
323

324
#endif
knopp's avatar
   
knopp committed
325
  // refresh UE list based on UEs dropped by PHY in previous subframe
326
  /*
knopp's avatar
   
knopp committed
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)));
knopp's avatar
   
knopp committed
331
    if (mac_xface->get_eNB_UE_stats(module_idP,0,UE_RNTI(module_idP,i))==NULL) {
knopp's avatar
   
knopp committed
332
      mac_remove_ue(module_idP,i,frameP);
knopp's avatar
   
knopp committed
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