eNB_scheduler.c 21.4 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
Cedric Roux's avatar
Cedric Roux committed
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
  void         *DLSCH_dci=NULL;
102
  int size_bits=0,size_bytes=0;
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
      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)
148
	  LOG_D(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);	    
Florian Kaltenberger's avatar
Florian Kaltenberger committed
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
	  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
	  }
	  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;
187
188
189
190
191
192
	    case 15:/*
	      ((DCI1A_2_5MHz_FDD_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_2_5MHz_FDD_t*)DLSCH_dci)->rballoc = 31;
	      size_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
	      size_bits  = sizeof_DCI1A_1_5MHz_FDD_t;*/
	      break;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
193
194
195
196
197
198
199
200
201
202
203
	    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;
204
		break;
205
206
207
208
209
210
	    case 75:
	      /*	      ((DCI1A_15MHz_FDD_t*)DLSCH_dci)->type = 1;
	      ((DCI1A_15MHz_FDD_t*)DLSCH_dci)->rballoc = 2047;
	      size_bytes = sizeof(DCI1A_10MHz_FDD_t);
	      size_bits  = sizeof_DCI1A_10MHz_FDD_t;*/
		break;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
211
212
213
214
215
216
	    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;
217
218
	    }
	  }
Florian Kaltenberger's avatar
Florian Kaltenberger committed
219
220
221
222
223
224
225
226
227
	  
	  add_ue_spec_dci(DCI_pdu[CC_id],
			  DLSCH_dci,
			  rnti,
			    size_bytes,
			  process_ue_cqi (module_idP,i),//aggregation,
			  size_bits,
			  format1A,
			  0);
228
	}
Florian Kaltenberger's avatar
Florian Kaltenberger committed
229
	else { // ra_pdcch_sent==1
230
	  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
231
232
	  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	      
233
	}
234
235
236
237
238
      
	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
239
	  LOG_I(MAC,"UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer);
240
241
242
243
	  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
244
245
246
      }
    } // ul_failure_timer>0
    
247
    i = next_i;
knopp's avatar
   
knopp committed
248
  }
249

250
#if defined(ENABLE_ITTI)
251

252
  do {
253
254
    // Checks if a message has been sent to MAC sub-task
    itti_poll_msg (TASK_MAC_ENB, &msg_p);
255

256
257
258
    if (msg_p != NULL) {
      msg_name = ITTI_MSG_NAME (msg_p);
      instance = ITTI_MSG_INSTANCE (msg_p);
259

260
261
262
263
      switch (ITTI_MSG_ID(msg_p)) {
      case MESSAGE_TEST:
        LOG_D(MAC, "Received %s\n", ITTI_MSG_NAME(msg_p));
        break;
264

265
266
267
268
      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);
269

270
271
        // TODO process BCCH data req.
        break;
272

273
274
275
276
      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);
277

278
279
        // TODO process CCCH data req.
        break;
280
281
282

#ifdef Rel10

283
284
285
286
      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);
287

288
289
290
        // TODO process MCCH data req.
        break;
#endif
291

292
293
294
      default:
        LOG_E(MAC, "Received unexpected message %s\n", msg_name);
        break;
gauthier's avatar
gauthier committed
295
      }
296
297
298
299

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

302
303
#endif

gauthier's avatar
gauthier committed
304
  // clear DCI and BCCH contents before scheduling
305
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
knopp's avatar
   
knopp committed
306
307
    DCI_pdu[CC_id]->Num_common_dci  = 0;
    DCI_pdu[CC_id]->Num_ue_spec_dci = 0;
308

309

310
#ifdef Rel10
311
    eNB_mac_inst[module_idP].common_channels[CC_id].mcch_active =0;
312
#endif
313

knopp's avatar
   
knopp committed
314
315
    eNB_mac_inst[module_idP].frame    = frameP;
    eNB_mac_inst[module_idP].subframe = subframeP;
316
317


knopp's avatar
   
knopp committed
318
  }
319

gauthier's avatar
gauthier committed
320
  //if (subframeP%5 == 0)
knopp's avatar
   
knopp committed
321
  //#ifdef EXMIMO
322
  PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frameP, 0,module_idP);
323
  pdcp_run(&ctxt);
knopp's avatar
   
knopp committed
324
  //#endif
325

326
  // check HO
327
328
  rrc_rx_tx(&ctxt,
            0, // eNB index, unused in eNB
329
            CC_id);
330
331

#ifdef Rel10
332
333

  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
334
335
336
337
    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
338
    }
339
  }
340

341
#endif
knopp's avatar
   
knopp committed
342
  // refresh UE list based on UEs dropped by PHY in previous subframe
343
  /*
knopp's avatar
   
knopp committed
344
345
346
  i=UE_list->head;
  while (i>=0) {
    next_i = UE_list->next[i];
347
    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
348
    if (mac_xface->get_eNB_UE_stats(module_idP,0,UE_RNTI(module_idP,i))==NULL) {
knopp's avatar
   
knopp committed
349
      mac_remove_ue(module_idP,i,frameP);
knopp's avatar
   
knopp committed
350
351
352
    }
    i=next_i;
  }
353
  */
354

gauthier's avatar
gauthier committed
355
  switch (subframeP) {
356
  case 0:
357

358
    // FDD/TDD Schedule Downlink RA transmissions (RA response, Msg4 Contention resolution)
gauthier's avatar
gauthier committed
359
    // Schedule ULSCH for FDD or subframeP 4 (TDD config 0,3,6)
360
    // Schedule Normal DLSCH
gauthier's avatar
gauthier committed
361

knopp's avatar
knopp committed
362

363
364
    schedule_RA(module_idP,frameP,subframeP,2);

365
366

    if (mac_xface->lte_frame_parms->frame_type == FDD) {  //FDD
367
      schedule_ulsch(module_idP,frameP,cooperation_flag,0,4);//,calibration_flag);
368
369
370
    } 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)) {
371
      //schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4);//,calibration_flag);
Florian Kaltenberger's avatar
Florian Kaltenberger committed
372
    }
373

374
375
    schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
    fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
376

377
378
379
    break;

  case 1:
380

gauthier's avatar
gauthier committed
381
    // TDD, schedule UL for subframeP 7 (TDD config 0,1) / subframeP 8 (TDD Config 6)
382
383
    // FDD, schedule normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD
384
385
386
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 0:
      case 1:
387
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7);
388
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
389
390
391
        break;

      case 6:
392
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8);
393
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
394
395
396
397
398
399
        break;

      default:
        break;
      }
    } else { //FDD
400
      schedule_ulsch(module_idP,frameP,cooperation_flag,1,5);
401
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
402
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
403
    }
404

405
    break;
406
407

  case 2:
408

gauthier's avatar
gauthier committed
409
    // TDD, nothing
410
411
    // FDD, normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == FDD) {  //FDD
412
      schedule_ulsch(module_idP,frameP,cooperation_flag,2,6);
413
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
414
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
415
    }
416

417
418
419
    break;

  case 3:
420

gauthier's avatar
gauthier committed
421
    // TDD Config 2, ULSCH for subframeP 7
422
423
424
    // TDD Config 2/5 normal DLSCH
    // FDD, normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) {
425
426
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 2:
427
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7);
428
429
430

        // no break here!
      case 5:
431
432
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
433
434
435
436
437
438
        break;

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

440
      schedule_ulsch(module_idP,frameP,cooperation_flag,3,7);
441
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
442
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
443
    }
444

445
    break;
446
447

  case 4:
448

gauthier's avatar
gauthier committed
449
    // TDD Config 1, ULSCH for subframeP 8
450
451
452
    // TDD Config 1/2/4/5 DLSCH
    // FDD UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == 1) { // TDD
453
454
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 1:
455
        //        schedule_RA(module_idP,frameP,subframeP);
456
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8);
457
458
459
460
461
462
463
464
465

        // no break here!
      case 2:

        // no break here!
      case 4:

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

467
468
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
469
470
471
472
473
474
475
476
        break;

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

477
	schedule_ulsch(module_idP, frameP, cooperation_flag, 4, 8);
478
	schedule_ue_spec(module_idP, frameP, subframeP,  mbsfn_status);
479
        fill_DLSCH_dci(module_idP, frameP, subframeP,   mbsfn_status);
480
      }
481
    }
482

483
484
485
486
487
488
489
    break;

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

492
    //schedule_RA(module_idP,frameP,subframeP,5);
493
    if (mac_xface->lte_frame_parms->frame_type == FDD) {
494
495
496
497
      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);
498
499
    } else if ((mac_xface->lte_frame_parms->tdd_config == 0) || // TDD Config 0
               (mac_xface->lte_frame_parms->tdd_config == 6)) { // TDD Config 6
500
      //schedule_ulsch(module_idP,cooperation_flag,subframeP);
501
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
502
    } else {
503
504
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
505
    }
506

507
508
509
    break;

  case 6:
510

511
512
513
514
    // 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
515
516
517
518
519
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 0:
        break;

      case 1:
520
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2);
521
522
        //  schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
523
524
525
        break;

      case 6:
526
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
527
528
        //  schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
529
530
531
        break;

      case 5:
532
533
534
        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);
535
536
537
538
        break;

      case 3:
      case 4:
539
540
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
541
542
543
544
545
546
        break;

      default:
        break;
      }
    } else { //FDD
547
      schedule_ulsch(module_idP,frameP,cooperation_flag,6,0);
548
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
549
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
550
    }
551

552
    break;
gauthier's avatar
gauthier committed
553

554
  case 7:
555

556
557
558
    // TDD Config 3,4,5 Normal DLSCH
    // FDD Normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD
559
560
561
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 3:
      case 4:
562
563
564
        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);
565
566
567
        break;

      case 5:
568
569
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
570
571
572
573
574
575
        break;

      default:
        break;
      }
    } else { //FDD
576
      schedule_ulsch(module_idP,frameP,cooperation_flag,7,1);
577
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
578
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
579
    }
580

581
582
583
    break;

  case 8:
584

gauthier's avatar
gauthier committed
585
    // TDD Config 2,3,4,5 ULSCH for subframeP 2
586
587
588
    //
    // FDD Normal UL/DLSCH
    if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD
589
590
591
592
593
594
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 2:
      case 3:
      case 4:
      case 5:

595
        //  schedule_RA(module_idP,subframeP);
596
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2);
597
598
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
599
600
601
602
603
604
        break;

      default:
        break;
      }
    } else { //FDD
605
      schedule_ulsch(module_idP,frameP,cooperation_flag,8,2);
606
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
607
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
608
    }
609

610
611
612
    break;

  case 9:
613

614
615
    // TDD Config 1,3,4,6 ULSCH for subframes 3,3,3,4
    if (mac_xface->lte_frame_parms->frame_type == TDD) {
616
617
      switch (mac_xface->lte_frame_parms->tdd_config) {
      case 1:
618
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
619
620
621
        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);
622
623
624
625
        break;

      case 3:
      case 4:
626
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3);
627
628
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
629
630
631
        break;

      case 6:
632
        schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4);
633
634
635
        //schedule_RA(module_idP,frameP,subframeP);
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
636
637
638
639
        break;

      case 2:
      case 5:
640
641
642
        //schedule_RA(module_idP,frameP,subframeP);
        schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
        fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
643
644
645
646
647
648
        break;

      default:
        break;
      }
    } else { //FDD
649
      schedule_ulsch(module_idP,frameP,cooperation_flag,9,3);
650
      schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status);
651
      fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status);
652
    }
653

654
    break;
gauthier's avatar
gauthier committed
655

656
  }
657

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

660
  // Allocate CCEs for good after scheduling is done
661
662
  for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++)
    allocate_CCEs(module_idP,CC_id,subframeP,0);
663

664
  LOG_D(MAC,"frameP %d, subframeP %d\n",frameP,subframeP);
665

666
  stop_meas(&eNB_mac_inst[module_idP].eNB_scheduler);
gauthier's avatar
gauthier committed
667
  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_OUT);
668

669
}
670
671
672