diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index d3f732b8fc..475dcd1a6e 100755 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -536,6 +536,18 @@ schedule_ue_spec_br( if (mbsfn_flag[CC_id] > 0) continue; + + unsigned int rmax; + unsigned int narrowBandindex_index; + unsigned int first_rb, rep, reps; + + // rmax from RRC connection setup + getRepetition(&UE_list->UE_template[CC_id][UE_id], &rmax, &narrowBandindex_index); + + first_rb = narrowband_to_first_rb(cc,narrowBandindex_index); + + if (vrb_map[first_rb] == 1) // skip scheduling emtc UEs if first RB is taken + continue ; for (UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { @@ -549,14 +561,7 @@ schedule_ue_spec_br( // at the end of the scheduler make sure the right subbands coresponding to these RBs are allocated the UE in UE_template directely // also check on the fill_DCI function - unsigned int rmax; - unsigned int narrowBandindex_index; - unsigned int first_rb, rep, reps; - - // rmax from RRC connection setup - getRepetition(&UE_list->UE_template[CC_id][UE_id], &rmax, &narrowBandindex_index); - - first_rb = narrowband_to_first_rb(cc,narrowBandindex_index); + vrb_map[first_rb] = 1; vrb_map[first_rb + 1] = 1; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 1aadc0b1bf..6dcc459d1b 100755 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -999,6 +999,9 @@ abort(); rb_table_index--; } + //********************************* [khalid] here will make the modification for emtc + + TBS = get_TBS_UL(mcs,rb_table[rb_table_index]); UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used_rx+=rb_table[rb_table_index]; UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_TBS=TBS; @@ -1016,10 +1019,10 @@ abort(); // bad indices : 20 (40 PRB), 21 (45 PRB), 22 (48 PRB) // increment for next UE allocation - first_rb[CC_id]+=rb_table[rb_table_index]; + first_rb[CC_id]+=rb_table[rb_table_index]; // khalid just shifting the first rb for next ue to schedule //store for possible retransmission UE_template->nb_rb_ul[harq_pid] = rb_table[rb_table_index]; - UE_template->first_rb_ul[harq_pid] = first_rb[CC_id]; + UE_template->first_rb_ul[harq_pid] = first_rb[CC_id]; // khalid? should store the firsy UE_sched_ctrl->ul_scheduled |= (1<head) @@ -1039,7 +1042,7 @@ abort(); hi_dci0_pdu = &hi_dci0_req->hi_dci0_pdu_list[eNB->HI_DCI0_req[CC_id].hi_dci0_request_body.number_of_dci+eNB->HI_DCI0_req[CC_id].hi_dci0_request_body.number_of_hi]; memset((void*)hi_dci0_pdu,0,sizeof(nfapi_hi_dci0_request_pdu_t)); hi_dci0_pdu->pdu_type = NFAPI_HI_DCI0_DCI_PDU_TYPE; - hi_dci0_pdu->pdu_size = 2+sizeof(nfapi_hi_dci0_dci_pdu); + hi_dci0_pdu->pdu_size = 2+sizeof(nfapi_hi_dci0_dci_pdu); // khalid these items in nFapi in hi_dci0_pdu->dci_pdu.dci_pdu_rel8.dci_format = NFAPI_UL_DCI_FORMAT_0; hi_dci0_pdu->dci_pdu.dci_pdu_rel8.aggregation_level = aggregation; hi_dci0_pdu->dci_pdu.dci_pdu_rel8.rnti = rnti; @@ -1052,7 +1055,7 @@ abort(); hi_dci0_pdu->dci_pdu.dci_pdu_rel8.new_data_indication_1 = ndi; hi_dci0_pdu->dci_pdu.dci_pdu_rel8.tpc = tpc; hi_dci0_pdu->dci_pdu.dci_pdu_rel8.cqi_csi_request = cqi_req; - hi_dci0_pdu->dci_pdu.dci_pdu_rel8.dl_assignment_index = UE_template->DAI_ul[sched_subframe]; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8.dl_assignment_index = UE_template->DAI_ul[sched_subframe]; // khalid valid for TDD only if (!CCE_allocation_infeasible(module_idP,CC_id,2,subframeP, aggregation, diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 386026690c..0d015ab335 100755 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -162,9 +162,14 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam wakeup_prach_eNB_br(eNB,NULL,proc->frame_rx,proc->subframe_rx); #endif } + + // khalid begin chain of every thread + // UE-specific RX processing for subframe n phy_procedures_eNB_uespec_RX(eNB, proc, no_relay ); + /* khalid : detection of MSG3 is simple but seems there is another entity that fill the buffers to this phy_rx chain */ + pthread_mutex_lock(&eNB->UL_INFO_mutex); eNB->UL_INFO.frame = proc->frame_rx; eNB->UL_INFO.subframe = proc->subframe_rx;