diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 737f4dfe749b7a5ce506b26c8a21e777db8a4c12..26eef0be27e54da4eab7ccbbaf1f1858f6db3518 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -70,37 +70,39 @@ extern uint8_t nfapi_mode; void add_ue_dlsch_info(module_id_t module_idP, int CC_id, - int UE_id, sub_frame_t subframeP, UE_DLSCH_STATUS status) + int UE_id, + sub_frame_t subframeP, + UE_DLSCH_STATUS status, + rnti_t rnti) //------------------------------------------------------------------------------ { - //LOG_D(MAC, "%s(module_idP:%d, CC_id:%d, UE_id:%d, subframeP:%d, status:%d) serving_num:%d rnti:%x\n", __FUNCTION__, module_idP, CC_id, UE_id, subframeP, status, eNB_dlsch_info[module_idP][CC_id][UE_id].serving_num, UE_RNTI(module_idP,UE_id)); - eNB_dlsch_info[module_idP][CC_id][UE_id].rnti = - UE_RNTI(module_idP, UE_id); - // eNB_dlsch_info[module_idP][CC_id][ue_mod_idP].weight = weight; - eNB_dlsch_info[module_idP][CC_id][UE_id].subframe = subframeP; - eNB_dlsch_info[module_idP][CC_id][UE_id].status = status; - eNB_dlsch_info[module_idP][CC_id][UE_id].serving_num++; + eNB_DLSCH_INFO *info = &eNB_dlsch_info[module_idP][CC_id][UE_id]; + // LOG_D(MAC, "%s(module_idP:%d, CC_id:%d, UE_id:%d, subframeP:%d, status:%d) serving_num:%d rnti:%x\n", __FUNCTION__, module_idP, CC_id, UE_id, subframeP, status, eNB_dlsch_info[module_idP][CC_id][UE_id].serving_num, UE_RNTI(module_idP,UE_id)); + info->rnti = rnti; + // info->weight = weight; + info->subframe = subframeP; + info->status = status; + info->serving_num++; + return; } //------------------------------------------------------------------------------ int -schedule_next_dlue(module_id_t module_idP, int CC_id, +schedule_next_dlue(module_id_t module_idP, + int CC_id, sub_frame_t subframeP) //------------------------------------------------------------------------------ { int next_ue; UE_list_t *UE_list = &RC.mac[module_idP]->UE_list; - for (next_ue = UE_list->head; next_ue >= 0; - next_ue = UE_list->next[next_ue]) { - if (eNB_dlsch_info[module_idP][CC_id][next_ue].status == - S_DL_WAITING) { + for (next_ue = UE_list->head; next_ue >= 0; next_ue = UE_list->next[next_ue]) { + if (eNB_dlsch_info[module_idP][CC_id][next_ue].status == S_DL_WAITING) { return next_ue; } } - for (next_ue = UE_list->head; next_ue >= 0; - next_ue = UE_list->next[next_ue]) { + for (next_ue = UE_list->head; next_ue >= 0; next_ue = UE_list->next[next_ue]) { if (eNB_dlsch_info[module_idP][CC_id][next_ue].status == S_DL_BUFFERED) { eNB_dlsch_info[module_idP][CC_id][next_ue].status = S_DL_WAITING; } @@ -129,7 +131,7 @@ generate_dlsch_header(unsigned char *mac_header, // compute header components - if ((short_padding == 1) || (short_padding == 2)) { + if (short_padding == 1 || short_padding == 2) { mac_header_ptr->R = 0; mac_header_ptr->E = 0; mac_header_ptr->LCID = SHORT_PADDING; @@ -153,7 +155,6 @@ generate_dlsch_header(unsigned char *mac_header, } else { first_element = 1; } - mac_header_ptr->R = 0; mac_header_ptr->E = 0; mac_header_ptr->LCID = DRX_CMD; @@ -167,17 +168,17 @@ generate_dlsch_header(unsigned char *mac_header, } else { first_element = 1; } - mac_header_ptr->R = 0; mac_header_ptr->E = 0; mac_header_ptr->LCID = TIMING_ADV_CMD; last_size = 1; // msg("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); ((TIMING_ADVANCE_CMD *) ce_ptr)->R = 0; - AssertFatal(timing_advance_cmd < 64, - "timing_advance_cmd %d > 63\n", timing_advance_cmd); + AssertFatal(timing_advance_cmd < 64, "timing_advance_cmd %d > 63\n", + timing_advance_cmd); ((TIMING_ADVANCE_CMD *) ce_ptr)->TA = timing_advance_cmd; //(timing_advance_cmd+31)&0x3f; - LOG_D(MAC, "timing advance =%d (%d)\n", timing_advance_cmd, + LOG_D(MAC, "timing advance =%d (%d)\n", + timing_advance_cmd, ((TIMING_ADVANCE_CMD *) ce_ptr)->TA); ce_ptr += sizeof(TIMING_ADVANCE_CMD); //msg("offset %d\n",ce_ptr-mac_header_control_elements); @@ -201,11 +202,16 @@ generate_dlsch_header(unsigned char *mac_header, mac_header_ptr->E = 0; mac_header_ptr->LCID = UE_CONT_RES; last_size = 1; - LOG_T(MAC, - "[eNB ][RAPROC] Generate contention resolution msg: %x.%x.%x.%x.%x.%x\n", - ue_cont_res_id[0], ue_cont_res_id[1], ue_cont_res_id[2], - ue_cont_res_id[3], ue_cont_res_id[4], ue_cont_res_id[5]); - memcpy(ce_ptr, ue_cont_res_id, 6); + LOG_T(MAC, "[eNB ][RAPROC] Generate contention resolution msg: %x.%x.%x.%x.%x.%x\n", + ue_cont_res_id[0], + ue_cont_res_id[1], + ue_cont_res_id[2], + ue_cont_res_id[3], + ue_cont_res_id[4], + ue_cont_res_id[5]); + memcpy(ce_ptr, + ue_cont_res_id, + 6); ce_ptr += 6; // msg("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); } @@ -214,7 +220,8 @@ generate_dlsch_header(unsigned char *mac_header, for (i = 0; i < num_sdus; i++) { LOG_T(MAC, "[eNB] Generate DLSCH header num sdu %d len sdu %d\n", - num_sdus, sdu_lengths[i]); + num_sdus, + sdu_lengths[i]); if (first_element > 0) { mac_header_ptr->E = 1; @@ -246,8 +253,7 @@ generate_dlsch_header(unsigned char *mac_header, ((SCH_SUBHEADER_LONG *) mac_header_ptr)->padding = 0x00; last_size = 3; #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC, - "[eNB] generate long sdu, size %x (MSB %x, LSB %x)\n", + LOG_D(MAC, "[eNB] generate long sdu, size %x (MSB %x, LSB %x)\n", sdu_lengths[i], ((SCH_SUBHEADER_LONG *) mac_header_ptr)->L_MSB, ((SCH_SUBHEADER_LONG *) mac_header_ptr)->L_LSB); @@ -289,10 +295,10 @@ generate_dlsch_header(unsigned char *mac_header, if ((ce_ptr - mac_header_control_elements) > 0) { // printf("Copying %d bytes for control elements\n",ce_ptr-mac_header_control_elements); - memcpy((void *) mac_header_ptr, mac_header_control_elements, + memcpy((void *) mac_header_ptr, + mac_header_control_elements, ce_ptr - mac_header_control_elements); - mac_header_ptr += - (unsigned char) (ce_ptr - mac_header_control_elements); + mac_header_ptr += (unsigned char) (ce_ptr - mac_header_control_elements); } //msg("After CEs %d\n",(uint8_t*)mac_header_ptr - mac_header); @@ -301,7 +307,10 @@ generate_dlsch_header(unsigned char *mac_header, //------------------------------------------------------------------------------ void -set_ul_DAI(int module_idP, int UE_idP, int CC_idP, int frameP, +set_ul_DAI(int module_idP, + int UE_idP, + int CC_idP, + int frameP, int subframeP) //------------------------------------------------------------------------------ { @@ -312,9 +321,13 @@ set_ul_DAI(int module_idP, int UE_idP, int CC_idP, int frameP, if (cc->tdd_Config != NULL) { //TDD DAI = (UE_list->UE_template[CC_idP][UE_idP].DAI - 1) & 3; - LOG_D(MAC, - "[eNB %d] CC_id %d Frame %d, subframe %d: DAI %d for UE %d\n", - module_idP, CC_idP, frameP, subframeP, DAI, UE_idP); + LOG_D(MAC, "[eNB %d] CC_id %d Frame %d, subframe %d: DAI %d for UE %d\n", + module_idP, + CC_idP, + frameP, + subframeP, + DAI, + UE_idP); // Save DAI for Format 0 DCI switch (cc->tdd_Config->subframeAssignment) { @@ -398,6 +411,8 @@ set_ul_DAI(int module_idP, int UE_idP, int CC_idP, int frameP, break; } } + + return; } //------------------------------------------------------------------------------ @@ -409,7 +424,11 @@ schedule_dlsch(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP, in for (i = 0; i < sli->n_dl; i++) { // Run each enabled slice-specific schedulers one by one - sli->dl[i].sched_cb(module_idP, i, frameP, subframeP, mbsfn_flag/*, dl_info*/); + sli->dl[i].sched_cb(module_idP, + i, + frameP, + subframeP, + mbsfn_flag/*, dl_info*/); } } @@ -1511,8 +1530,11 @@ schedule_ue_spec_br( //------------------------------------------------------------------------------ void -schedule_ue_spec(module_id_t module_idP, int slice_idxP, - frame_t frameP, sub_frame_t subframeP, int *mbsfn_flag) +schedule_ue_spec(module_id_t module_idP, + int slice_idxP, + frame_t frameP, + sub_frame_t subframeP, + int *mbsfn_flag) //------------------------------------------------------------------------------ { int CC_id; @@ -1524,11 +1546,19 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, int lcid, offset, num_sdus = 0; int nb_rb, nb_rb_temp, nb_available_rb; uint16_t sdu_lengths[NB_RB_MAX]; - int TBS, j, rnti, padding = 0, post_padding = 0; + int TBS, j, padding = 0, post_padding = 0; + rnti_t rnti; unsigned char dlsch_buffer[MAX_DLSCH_PAYLOAD_BYTES]; int round = 0; int harq_pid = 0; + uint16_t release_num; + uint8_t ra_ii; eNB_UE_STATS *eNB_UE_stats = NULL; + UE_TEMPLATE *ue_template = NULL; + eNB_STATS *eNB_stats = NULL; + RRC_release_ctrl *release_ctrl = NULL; + DLSCH_PDU *dlsch_pdu = NULL; + RA_t *ra = NULL; int sdu_length_total = 0; eNB_MAC_INST *eNB = RC.mac[module_idP]; COMMON_channels_t *cc = eNB->common_channels; @@ -1536,7 +1566,7 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, int continue_flag = 0; int32_t normalized_rx_power, target_rx_power; int tpc = 1; - UE_sched_ctrl *ue_sched_ctl; + UE_sched_ctrl *ue_sched_ctrl; int mcs; int i; int min_rb_unit[NFAPI_CC_MAX]; @@ -1550,8 +1580,12 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, int header_length_last; int header_length_total; rrc_eNB_ue_context_t *ue_contextP = NULL; + int nb_mac_CC = RC.nb_mac_CC[module_idP]; + long dl_Bandwidth; + start_meas(&eNB->schedule_dlsch); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH, VCD_FUNCTION_IN); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH, + VCD_FUNCTION_IN); // for TDD: check that we have to act here, otherwise return if (cc[0].tdd_Config) { @@ -1563,22 +1597,17 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, break; case 1: - return; - break; - case 2: return; - break; case 3: - if ((tdd_sfa != 2) && (tdd_sfa != 5)) + if (tdd_sfa != 2 && tdd_sfa != 5) return; break; case 4: - if ((tdd_sfa != 1) && (tdd_sfa != 2) && (tdd_sfa != 4) - && (tdd_sfa != 5)) + if (tdd_sfa != 1 && tdd_sfa != 2 && tdd_sfa != 4 && tdd_sfa != 5) return; break; @@ -1588,14 +1617,13 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, case 6: case 7: - if ((tdd_sfa != 3) && (tdd_sfa != 4) && (tdd_sfa != 5)) + if (tdd_sfa != 3 && tdd_sfa != 4 && tdd_sfa != 5) return; break; case 8: - if ((tdd_sfa != 2) && (tdd_sfa != 3) && (tdd_sfa != 4) - && (tdd_sfa != 5)) + if (tdd_sfa != 2 && tdd_sfa != 3 && tdd_sfa != 4 && tdd_sfa != 5) return; break; @@ -1611,9 +1639,11 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, //weight = get_ue_weight(module_idP,UE_id); aggregation = 2; - for (CC_id = 0; CC_id < RC.nb_mac_CC[module_idP]; CC_id++) { - N_RB_DL[CC_id] = to_prb(cc[CC_id].mib->message.dl_Bandwidth); - min_rb_unit[CC_id] = get_min_rb_unit(module_idP, CC_id); + for (CC_id = 0, eNB_stats = &eNB->eNB_stats[0]; CC_id < nb_mac_CC; CC_id++, eNB_stats++) { + dl_Bandwidth = cc[CC_id].mib->message.dl_Bandwidth; + N_RB_DL[CC_id] = to_prb(dl_Bandwidth); + min_rb_unit[CC_id] = get_min_rb_unit(module_idP, + CC_id); // get number of PRBs less those used by common channels total_nb_available_rb[CC_id] = N_RB_DL[CC_id]; @@ -1621,18 +1651,19 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, if (cc[CC_id].vrb_map[i] != 0) total_nb_available_rb[CC_id]--; - N_RBG[CC_id] = to_rbg(cc[CC_id].mib->message.dl_Bandwidth); + N_RBG[CC_id] = to_rbg(dl_Bandwidth); // store the global enb stats: - eNB->eNB_stats[CC_id].num_dlactive_UEs = UE_list->num_UEs; - eNB->eNB_stats[CC_id].available_prbs = total_nb_available_rb[CC_id]; - eNB->eNB_stats[CC_id].total_available_prbs += total_nb_available_rb[CC_id]; - eNB->eNB_stats[CC_id].dlsch_bytes_tx = 0; - eNB->eNB_stats[CC_id].dlsch_pdus_tx = 0; + eNB_stats->num_dlactive_UEs = UE_list->num_UEs; + eNB_stats->available_prbs = total_nb_available_rb[CC_id]; + eNB_stats->total_available_prbs += total_nb_available_rb[CC_id]; + eNB_stats->dlsch_bytes_tx = 0; + eNB_stats->dlsch_pdus_tx = 0; } // CALLING Pre_Processor for downlink scheduling // (Returns estimation of RBs required by each UE and the allocation on sub-band) - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR, VCD_FUNCTION_IN); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR, + VCD_FUNCTION_IN); start_meas(&eNB->schedule_dlsch_preprocessor); dlsch_scheduler_pre_processor(module_idP, slice_idxP, @@ -1641,7 +1672,8 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, mbsfn_flag, eNB->slice_info.rballoc_sub); stop_meas(&eNB->schedule_dlsch_preprocessor); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR, VCD_FUNCTION_OUT); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR, + VCD_FUNCTION_OUT); //RC.mac[module_idP]->slice_info.slice_counter--; // Do the multiplexing and actual allocation only when all slices have been pre-processed. @@ -1652,75 +1684,84 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, //} if (RC.mac[module_idP]->slice_info.interslice_share_active) { - dlsch_scheduler_interslice_multiplexing(module_idP, frameP, subframeP, eNB->slice_info.rballoc_sub); + dlsch_scheduler_interslice_multiplexing(module_idP, + frameP, + subframeP, + eNB->slice_info.rballoc_sub); /* the interslice multiplexing re-sorts the UE_list for the slices it tries * to multiplex, so we need to sort it for the current slice again */ - sort_UEs(module_idP, slice_idxP, frameP, subframeP); + sort_UEs(module_idP, + slice_idxP, + frameP, + subframeP); } - for (CC_id = 0; CC_id < RC.nb_mac_CC[module_idP]; CC_id++) { - LOG_D(MAC, "doing schedule_ue_spec for CC_id %d\n", CC_id); + for (CC_id = 0; CC_id < nb_mac_CC; CC_id++) { + LOG_D(MAC, "doing schedule_ue_spec for CC_id %d\n", + CC_id); dl_req = &eNB->DL_req[CC_id].dl_config_request_body; if (mbsfn_flag[CC_id] > 0) continue; for (UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { - LOG_D(MAC, "doing schedule_ue_spec for CC_id %d UE %d\n", CC_id, UE_id); + LOG_D(MAC, "doing schedule_ue_spec for CC_id %d UE %d\n", + CC_id, + UE_id); continue_flag = 0; // reset the flag to allow allocation for the remaining UEs rnti = UE_RNTI(module_idP, UE_id); - eNB_UE_stats = &UE_list->eNB_UE_stats[CC_id][UE_id]; - ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; - - if (rnti == NOT_A_RNTI) { - LOG_D(MAC, "Cannot find rnti for UE_id %d (num_UEs %d)\n", UE_id, UE_list->num_UEs); - continue_flag = 1; - } + ue_sched_ctrl = &UE_list->UE_sched_ctrl[UE_id]; + ue_template = &UE_list->UE_template[CC_id][UE_id]; - if (UE_list->UE_template[CC_id][UE_id].rach_resource_type > 0) continue_flag=1; + if (ue_template->rach_resource_type > 0) continue_flag = 1; - if (eNB_UE_stats == NULL) { + if (&(UE_list->eNB_UE_stats[CC_id][UE_id]) == NULL) { LOG_D(MAC, "[eNB] Cannot find eNB_UE_stats\n"); continue_flag = 1; - } - - if (!ue_dl_slice_membership(module_idP, UE_id, slice_idxP)) { - LOG_D(MAC, "UE%d is not part of slice %d ID %d\n", - UE_id, slice_idxP, RC.mac[module_idP]->slice_info.dl[slice_idxP].id); - /* prevent execution of add_ue_dlsch_info(), it is done by the other - * slice */ - continue; + } else { + eNB_UE_stats = &(UE_list->eNB_UE_stats[CC_id][UE_id]); } if (continue_flag != 1) { - switch (get_tmode(module_idP, CC_id, UE_id)) { + switch (get_tmode(module_idP, + CC_id, + UE_id)) { case 1: case 2: case 7: - aggregation = get_aggregation(get_bw_index(module_idP, CC_id), - ue_sched_ctl->dl_cqi[CC_id], + aggregation = get_aggregation(get_bw_index(module_idP, + CC_id), + ue_sched_ctrl->dl_cqi[CC_id], format1); break; case 3: - aggregation = get_aggregation(get_bw_index(module_idP, CC_id), - ue_sched_ctl->dl_cqi[CC_id], + aggregation = get_aggregation(get_bw_index(module_idP, + CC_id), + ue_sched_ctrl->dl_cqi[CC_id], format2A); break; default: AssertFatal(1==0,"Unsupported transmission mode %d\n", get_tmode(module_idP, CC_id, UE_id)); aggregation = 2; + break; } } /* if (continue_flag != 1 */ - if ((ue_sched_ctl->pre_nb_available_rbs[CC_id] == 0) || // no RBs allocated - CCE_allocation_infeasible(module_idP, CC_id, 1, subframeP, - aggregation, rnti)) { - LOG_D(MAC, - "[eNB %d] Frame %d : no RB allocated for UE %d on CC_id %d: continue \n", - module_idP, frameP, UE_id, CC_id); + if (ue_sched_ctrl->pre_nb_available_rbs[CC_id] == 0 || // no RBs allocated + CCE_allocation_infeasible(module_idP, + CC_id, + 1, + subframeP, + aggregation, + rnti)) { + LOG_D(MAC, "[eNB %d] Frame %d : no RB allocated for UE %d on CC_id %d: continue \n", + module_idP, + frameP, + UE_id, + CC_id); continue_flag = 1; //to next user (there might be rbs availiable for other UEs in TM5 } @@ -1732,24 +1773,36 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, cc[CC_id].tdd_Config->subframeAssignment, UE_list); // update UL DAI after DLSCH scheduling - set_ul_DAI(module_idP, UE_id, CC_id, frameP, subframeP); + set_ul_DAI(module_idP, + UE_id, + CC_id, + frameP, + subframeP); } if (continue_flag == 1) { - add_ue_dlsch_info(module_idP, CC_id, UE_id, subframeP, S_DL_NONE); + add_ue_dlsch_info(module_idP, + CC_id, + UE_id, + subframeP, + S_DL_NONE, + rnti); continue; } - nb_available_rb = ue_sched_ctl->pre_nb_available_rbs[CC_id]; - harq_pid = frame_subframe2_dl_harq_pid(cc->tdd_Config,frameP,subframeP); - round = ue_sched_ctl->round[CC_id][harq_pid]; - UE_list->eNB_UE_stats[CC_id][UE_id].crnti = rnti; - UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status = mac_eNB_get_rrc_status(module_idP, rnti); - UE_list->eNB_UE_stats[CC_id][UE_id].harq_pid = harq_pid; - UE_list->eNB_UE_stats[CC_id][UE_id].harq_round = round; - - if (UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status < RRC_CONNECTED) { - LOG_D(MAC, "UE %d is not in RRC_CONNECTED\n", UE_id); + nb_available_rb = ue_sched_ctrl->pre_nb_available_rbs[CC_id]; + harq_pid = frame_subframe2_dl_harq_pid(cc->tdd_Config, + frameP, + subframeP); + round = ue_sched_ctrl->round[CC_id][harq_pid]; + eNB_UE_stats->crnti = rnti; + eNB_UE_stats->rrc_status = mac_eNB_get_rrc_status(module_idP, rnti); + eNB_UE_stats->harq_pid = harq_pid; + eNB_UE_stats->harq_round = round; + + if (eNB_UE_stats->rrc_status < RRC_CONNECTED) { + LOG_D(MAC, "UE %d is not in RRC_CONNECTED\n", + UE_id); continue; } @@ -1763,77 +1816,84 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, eNB_UE_stats->dl_cqi, MIN_CQI_VALUE, MAX_CQI_VALUE); */ if (nfapi_mode) { - eNB_UE_stats->dlsch_mcs1 = 10; // cqi_to_mcs[ue_sched_ctl->dl_cqi[CC_id]]; + eNB_UE_stats->dlsch_mcs1 = 10; // cqi_to_mcs[ue_sched_ctrl->dl_cqi[CC_id]]; } else { // this operation is also done in the preprocessor eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1, eNB->slice_info.dl[slice_idxP].maxmcs); // cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs); } // Store stats - // UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi= eNB_UE_stats->dl_cqi; + // eNB_UE_stats->dl_cqi= eNB_UE_stats->dl_cqi; // Initializing the rb allocation indicator for each UE for (j = 0; j < N_RBG[CC_id]; j++) { - UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = 0; + ue_template->rballoc_subband[harq_pid][j] = 0; } - LOG_D(MAC, - "[eNB %d] Frame %d: Scheduling UE %d on CC_id %d (rnti %x, harq_pid %d, round %d, rb %d, cqi %d, mcs %d, rrc %d)\n", - module_idP, frameP, UE_id, CC_id, rnti, harq_pid, round, - nb_available_rb, ue_sched_ctl->dl_cqi[CC_id], + LOG_D(MAC, "[eNB %d] Frame %d: Scheduling UE %d on CC_id %d (rnti %x, harq_pid %d, round %d, rb %d, cqi %d, mcs %d, rrc %d)\n", + module_idP, + frameP, UE_id, + CC_id, + rnti, + harq_pid, + round, + nb_available_rb, + ue_sched_ctrl->dl_cqi[CC_id], eNB_UE_stats->dlsch_mcs1, - UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status); + eNB_UE_stats->rrc_status); /* process retransmission */ if (round != 8) { // get freq_allocation - nb_rb = UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid]; - TBS = get_TBS_DL(UE_list->UE_template[CC_id][UE_id].oldmcs1[harq_pid], nb_rb); + nb_rb = ue_template->nb_rb[harq_pid]; + TBS = get_TBS_DL(ue_template->oldmcs1[harq_pid], + nb_rb); if (nb_rb <= nb_available_rb) { if (cc[CC_id].tdd_Config != NULL) { - UE_list->UE_template[CC_id][UE_id].DAI++; - update_ul_dci(module_idP, CC_id, rnti, - UE_list->UE_template[CC_id][UE_id].DAI, subframeP); - LOG_D(MAC, - "DAI update: CC_id %d subframeP %d: UE %d, DAI %d\n", - CC_id, subframeP, UE_id, - UE_list->UE_template[CC_id][UE_id].DAI); + ue_template->DAI++; + update_ul_dci(module_idP, + CC_id, + rnti, + ue_template->DAI, + subframeP); + LOG_D(MAC, "DAI update: CC_id %d subframeP %d: UE %d, DAI %d\n", + CC_id, + subframeP, + UE_id, + ue_template->DAI); } - if (nb_rb == ue_sched_ctl->pre_nb_available_rbs[CC_id]) { - for (j = 0; j < N_RBG[CC_id]; ++j) { // for indicating the rballoc for each sub-band - UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + if (nb_rb == ue_sched_ctrl->pre_nb_available_rbs[CC_id]) { + for (j = 0; j < N_RBG[CC_id]; j++) { // for indicating the rballoc for each sub-band + ue_template->rballoc_subband[harq_pid][j] = ue_sched_ctrl->rballoc_sub_UE[CC_id][j]; } } else { nb_rb_temp = nb_rb; j = 0; while ((nb_rb_temp > 0) && (j < N_RBG[CC_id])) { - if (ue_sched_ctl->rballoc_sub_UE[CC_id][j] == 1) { - if (UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j]) - printf("WARN: rballoc_subband not free for retrans?\n"); + if (ue_sched_ctrl->rballoc_sub_UE[CC_id][j] == 1) { + if (ue_template->rballoc_subband[harq_pid][j]) + LOG_W(MAC, "WARN: rballoc_subband not free for retrans?\n"); - UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + ue_template->rballoc_subband[harq_pid][j] = ue_sched_ctrl->rballoc_sub_UE[CC_id][j]; - if ((j == N_RBG[CC_id] - 1) && ((N_RB_DL[CC_id] == 25) || (N_RB_DL[CC_id] == 50))) { - nb_rb_temp = nb_rb_temp - min_rb_unit[CC_id] + 1; - } else { - nb_rb_temp = nb_rb_temp - min_rb_unit[CC_id]; - } + nb_rb_temp -= min_rb_unit[CC_id]; + if ((j == N_RBG[CC_id] - 1) && (N_RB_DL[CC_id] == 25 || N_RB_DL[CC_id] == 50)) + nb_rb_temp++; } - - j = j + 1; + j++; } } nb_available_rb -= nb_rb; /* eNB->mu_mimo_mode[UE_id].pre_nb_available_rbs = nb_rb; - eNB->mu_mimo_mode[UE_id].dl_pow_off = ue_sched_ctl->dl_pow_off[CC_id]; + eNB->mu_mimo_mode[UE_id].dl_pow_off = ue_sched_ctrl->dl_pow_off[CC_id]; for(j = 0; j < N_RBG[CC_id]; ++j) { - eNB->mu_mimo_mode[UE_id].rballoc_sub[j] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j]; + eNB->mu_mimo_mode[UE_id].rballoc_sub[j] = ue_template->rballoc_subband[harq_pid][j]; } */ @@ -1842,55 +1902,69 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, case 2: case 7: default: - LOG_D(MAC, "retransmission DL_REQ: rnti:%x\n", rnti); + LOG_D(MAC, "retransmission DL_REQ: rnti:%x\n", + rnti); dl_config_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu]; - memset((void *) dl_config_pdu, 0, sizeof(nfapi_dl_config_request_pdu_t)); + memset((void *) dl_config_pdu, + 0, + sizeof(nfapi_dl_config_request_pdu_t)); dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu)); dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = NFAPI_DL_DCI_FORMAT_1; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = - get_aggregation(get_bw_index(module_idP, CC_id), - ue_sched_ctl->dl_cqi[CC_id], + get_aggregation(get_bw_index(module_idP, + CC_id), + ue_sched_ctrl->dl_cqi[CC_id], format1); dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = rnti; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = 1; // CRNTI: see Table 4-10 from SCF082 - nFAPI specifications dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.harq_process = harq_pid; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = 1; // Don't adjust power when retransmitting - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = UE_list->UE_template[CC_id][UE_id].oldmcs1[harq_pid]; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = ue_template->oldNDI[harq_pid]; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = ue_template->oldmcs1[harq_pid]; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = round & 3; // TDD if (cc[CC_id].tdd_Config != NULL) { - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.downlink_assignment_index = - (UE_list->UE_template[CC_id][UE_id].DAI - 1) & 3; - LOG_D(MAC, - "[eNB %d] Retransmission CC_id %d : harq_pid %d, round %d, dai %d, mcs %d\n", - module_idP, CC_id, harq_pid, round, - (UE_list->UE_template[CC_id][UE_id].DAI - 1), - UE_list->UE_template[CC_id][UE_id].oldmcs1[harq_pid]); + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.downlink_assignment_index = (ue_template->DAI - 1) & 3; + LOG_D(MAC, "[eNB %d] Retransmission CC_id %d : harq_pid %d, round %d, dai %d, mcs %d\n", + module_idP, + CC_id, + harq_pid, + round, + ue_template->DAI - 1, + ue_template->oldmcs1[harq_pid]); } else { - LOG_D(MAC, - "[eNB %d] Retransmission CC_id %d : harq_pid %d, round %d, mcs %d\n", - module_idP, CC_id, harq_pid, round, - UE_list->UE_template[CC_id][UE_id].oldmcs1[harq_pid]); + LOG_D(MAC, "[eNB %d] Retransmission CC_id %d : harq_pid %d, round %d, mcs %d\n", + module_idP, + CC_id, + harq_pid, + round, + ue_template->oldmcs1[harq_pid]); } - if (!CCE_allocation_infeasible(module_idP, CC_id, 1, subframeP, - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level, rnti)) { + if (!CCE_allocation_infeasible(module_idP, + CC_id, + 1, + subframeP, + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level, + rnti)) { dl_req->number_dci++; dl_req->number_pdu++; dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; eNB->DL_req[CC_id].sfn_sf = frameP<<4 | subframeP; eNB->DL_req[CC_id].header.message_id = NFAPI_DL_CONFIG_REQUEST; - fill_nfapi_dlsch_config(eNB, dl_req, TBS, -1, - /* retransmission, no pdu_index */ - rnti, 0, // type 0 allocation from 7.1.6 in 36.213 + fill_nfapi_dlsch_config(eNB, + dl_req, + TBS, + -1, // retransmission, no pdu_index + rnti, + 0, // type 0 allocation from 7.1.6 in 36.213 0, // virtual_resource_block_assignment_flag, unused here 0, // resource_block_coding, to be filled in later - getQm(UE_list->UE_template[CC_id][UE_id].oldmcs1[harq_pid]), + getQm(ue_template->oldmcs1[harq_pid]), round & 3, // redundancy version 1, // transport blocks 0, // transport block to codeword swap flag @@ -1899,56 +1973,69 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, 1, // number of subbands // uint8_t codebook_index, 4, // UE category capacity - UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->pdsch_ConfigDedicated->p_a, + ue_template->physicalConfigDedicated->pdsch_ConfigDedicated->p_a, 0, // delta_power_offset for TM5 0, // ngap 0, // nprb cc[CC_id].p_eNB == 1 ? 1 : 2, // transmission mode 0, //number of PRBs treated as one subband, not used here - 0 // number of beamforming vectors, not used here - ); - LOG_D(MAC, - "Filled NFAPI configuration for DCI/DLSCH %d, retransmission round %d\n", - eNB->pdu_index[CC_id], round); - program_dlsch_acknak(module_idP, CC_id, UE_id, frameP, subframeP, + 0); // number of beamforming vectors, not used here + + LOG_D(MAC, "Filled NFAPI configuration for DCI/DLSCH %d, retransmission round %d\n", + eNB->pdu_index[CC_id], + round); + program_dlsch_acknak(module_idP, + CC_id, + UE_id, + frameP, + subframeP, dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.cce_idx); // No TX request for retransmission (check if null request for FAPI) } else { - LOG_W(MAC, - "Frame %d, Subframe %d: Dropping DLSCH allocation for UE %d\%x, infeasible CCE allocation\n", - frameP, subframeP, UE_id, rnti); + LOG_W(MAC, "Frame %d, Subframe %d: Dropping DLSCH allocation for UE %d\%x, infeasible CCE allocation\n", + frameP, + subframeP, + UE_id, + rnti); } } - add_ue_dlsch_info(module_idP, CC_id, UE_id, subframeP, S_DL_SCHEDULED); + add_ue_dlsch_info(module_idP, + CC_id, UE_id, + subframeP, + S_DL_SCHEDULED, + rnti); //eNB_UE_stats->dlsch_trials[round]++; - UE_list->eNB_UE_stats[CC_id][UE_id].num_retransmission += 1; - UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used_retx = nb_rb; - UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used_retx += nb_rb; - UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs1 = eNB_UE_stats->dlsch_mcs1; - UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs2 = eNB_UE_stats->dlsch_mcs1; + eNB_UE_stats->num_retransmission += 1; + eNB_UE_stats->rbs_used_retx = nb_rb; + eNB_UE_stats->total_rbs_used_retx += nb_rb; + eNB_UE_stats->dlsch_mcs2 = eNB_UE_stats->dlsch_mcs1; } else { LOG_D(MAC, "[eNB %d] Frame %d CC_id %d : don't schedule UE %d, its retransmission takes more resources than we have\n", - module_idP, frameP, CC_id, UE_id); + module_idP, + frameP, + CC_id, + UE_id); } } else { /* This is a potentially new SDU opportunity */ rlc_status.bytes_in_buffer = 0; // Now check RLC information to compute number of required RBs // get maximum TBS size for RLC request - TBS = get_TBS_DL(eNB_UE_stats->dlsch_mcs1, nb_available_rb); + TBS = get_TBS_DL(eNB_UE_stats->dlsch_mcs1, + nb_available_rb); // add the length for all the control elements (timing adv, drx, etc) : header + payload - if (ue_sched_ctl->ta_timer == 0) { - ta_update = ue_sched_ctl->ta_update; + if (ue_sched_ctrl->ta_timer == 0) { + ta_update = ue_sched_ctrl->ta_update; /* if we send TA then set timer to not send it for a while */ - if (ta_update != 31) - ue_sched_ctl->ta_timer = 20; - + if (ta_update != 31) { + ue_sched_ctrl->ta_timer = 20; + } /* reset ta_update */ - ue_sched_ctl->ta_update = 31; + ue_sched_ctrl->ta_update = 31; } else { ta_update = 31; } @@ -1957,55 +2044,83 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, // RLC data on DCCH if (TBS - ta_len - header_length_total - sdu_length_total - 3 > 0) { - rlc_status = mac_rlc_status_ind(module_idP, rnti, module_idP, frameP, subframeP, ENB_FLAG_YES, MBMS_FLAG_NO, DCCH, + rlc_status = mac_rlc_status_ind(module_idP, + rnti, + module_idP, + frameP, + subframeP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + DCCH, TBS - ta_len - header_length_total - sdu_length_total - 3 #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - ,0, 0 + , 0 + , 0 #endif ); sdu_lengths[0] = 0; if (rlc_status.bytes_in_buffer > 0) { LOG_D(MAC, "[eNB %d] SFN/SF %d.%d, DL-DCCH->DLSCH CC_id %d, Requesting %d bytes from RLC (RRC message)\n", - module_idP, frameP, subframeP, CC_id, + module_idP, + frameP, + subframeP, + CC_id, TBS - ta_len - header_length_total - sdu_length_total - 3); - sdu_lengths[0] = mac_rlc_data_req(module_idP, rnti, module_idP, frameP, ENB_FLAG_YES, MBMS_FLAG_NO, DCCH, + sdu_lengths[0] = mac_rlc_data_req(module_idP, + rnti, + module_idP, + frameP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + DCCH, TBS, //not used (char *)&dlsch_buffer[0] #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - ,0, 0 + , 0 + , 0 #endif - ); + ); pthread_mutex_lock(&rrc_release_freelist); if((rrc_release_info.num_UEs > 0) && (rlc_am_mui.rrc_mui_num > 0)) { uint16_t release_total = 0; - for(uint16_t release_num = 0; release_num < NUMBER_OF_UE_MAX; release_num++) { - if(rrc_release_info.RRC_release_ctrl[release_num].flag > 0) { + for (release_num = 0, release_ctrl = &rrc_release_info.RRC_release_ctrl[0]; + release_num < NUMBER_OF_UE_MAX; + release_num++, release_ctrl++) { + if(release_ctrl->flag > 0) { release_total++; } else { continue; } - if(rrc_release_info.RRC_release_ctrl[release_num].flag == 1) { - if(rrc_release_info.RRC_release_ctrl[release_num].rnti == rnti) { + if(release_ctrl->flag == 1) { + if(release_ctrl->rnti == rnti) { for(uint16_t mui_num = 0; mui_num < rlc_am_mui.rrc_mui_num; mui_num++) { - if(rrc_release_info.RRC_release_ctrl[release_num].rrc_eNB_mui == rlc_am_mui.rrc_mui[mui_num]) { - rrc_release_info.RRC_release_ctrl[release_num].flag = 3; - LOG_D(MAC,"DLSCH Release send:index %d rnti %x mui %d mui_num %d flag 1->3\n",release_num,rnti,rlc_am_mui.rrc_mui[mui_num],mui_num); + if(release_ctrl->rrc_eNB_mui == rlc_am_mui.rrc_mui[mui_num]) { + release_ctrl->flag = 3; + LOG_D(MAC,"DLSCH Release send:index %d rnti %x mui %d mui_num %d flag 1->3\n", + release_num, + rnti, + rlc_am_mui.rrc_mui[mui_num], + mui_num); break; } } } } - if(rrc_release_info.RRC_release_ctrl[release_num].flag == 2) { - if(rrc_release_info.RRC_release_ctrl[release_num].rnti == rnti) { - for(uint16_t mui_num = 0; mui_num < rlc_am_mui.rrc_mui_num; mui_num++) { - if(rrc_release_info.RRC_release_ctrl[release_num].rrc_eNB_mui == rlc_am_mui.rrc_mui[mui_num]) { - rrc_release_info.RRC_release_ctrl[release_num].flag = 4; - LOG_D(MAC,"DLSCH Release send:index %d rnti %x mui %d mui_num %d flag 2->4\n",release_num,rnti,rlc_am_mui.rrc_mui[mui_num],mui_num); + if(release_ctrl->flag == 2) { + if(release_ctrl->rnti == rnti) { + for (uint16_t mui_num = 0; mui_num < rlc_am_mui.rrc_mui_num; mui_num++) { + if(release_ctrl->rrc_eNB_mui == rlc_am_mui.rrc_mui[mui_num]) { + release_ctrl->flag = 4; + LOG_D(MAC, "DLSCH Release send:index %d rnti %x mui %d mui_num %d flag 2->4\n", + release_num, + rnti, + rlc_am_mui.rrc_mui[mui_num], + mui_num); break; } } @@ -2018,44 +2133,50 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, } pthread_mutex_unlock(&rrc_release_freelist); - RA_t *ra = &eNB->common_channels[CC_id].ra[0]; - - for (uint8_t ra_ii = 0; ra_ii < NB_RA_PROC_MAX; ra_ii++) { - if((ra[ra_ii].rnti == rnti) && (ra[ra_ii].state == MSGCRNTI)) { - for(uint16_t mui_num = 0; mui_num < rlc_am_mui.rrc_mui_num; mui_num++) { - if(ra[ra_ii].crnti_rrc_mui == rlc_am_mui.rrc_mui[mui_num]) { - ra[ra_ii].crnti_harq_pid = harq_pid; - ra[ra_ii].state = MSGCRNTI_ACK; + + for (ra_ii = 0, ra = &eNB->common_channels[CC_id].ra[0]; ra_ii < NB_RA_PROC_MAX; ra_ii++, ra++) { + if ((ra->rnti == rnti) && (ra->state == MSGCRNTI)) { + for (uint16_t mui_num = 0; mui_num < rlc_am_mui.rrc_mui_num; mui_num++) { + if (ra->crnti_rrc_mui == rlc_am_mui.rrc_mui[mui_num]) { + ra->crnti_harq_pid = harq_pid; + ra->state = MSGCRNTI_ACK; break; } } } } - T(T_ENB_MAC_UE_DL_SDU, T_INT(module_idP), - T_INT(CC_id), T_INT(rnti), T_INT(frameP), - T_INT(subframeP), T_INT(harq_pid), T_INT(DCCH), + T(T_ENB_MAC_UE_DL_SDU, + T_INT(module_idP), + T_INT(CC_id), + T_INT(rnti), + T_INT(frameP), + T_INT(subframeP), + T_INT(harq_pid), + T_INT(DCCH), T_INT(sdu_lengths[0])); LOG_D(MAC, "[eNB %d][DCCH] CC_id %d Got %d bytes from RLC\n", - module_idP, CC_id, sdu_lengths[0]); + module_idP, + CC_id, + sdu_lengths[0]); sdu_length_total = sdu_lengths[0]; sdu_lcids[0] = DCCH; - UE_list->eNB_UE_stats[CC_id][UE_id].lcid_sdu[0] = DCCH; - UE_list->eNB_UE_stats[CC_id][UE_id].sdu_length_tx[DCCH] = sdu_lengths[0]; - UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DCCH] += 1; - UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DCCH] += sdu_lengths[0]; + eNB_UE_stats->lcid_sdu[0] = DCCH; + eNB_UE_stats->sdu_length_tx[DCCH] = sdu_lengths[0]; + eNB_UE_stats->num_pdu_tx[DCCH] += 1; + eNB_UE_stats->num_bytes_tx[DCCH] += sdu_lengths[0]; header_length_last = 1 + 1 + (sdu_lengths[0] >= 128); header_length_total += header_length_last; num_sdus = 1; #ifdef DEBUG_eNB_SCHEDULER - LOG_T(MAC, - "[eNB %d][DCCH] CC_id %d Got %d bytes :", - module_idP, CC_id, sdu_lengths[0]); - + LOG_T(MAC, "[eNB %d][DCCH] CC_id %d Got %d bytes :", + module_idP, + CC_id, + sdu_lengths[0]); for (j = 0; j < sdu_lengths[0]; ++j) { - LOG_T(MAC, "%x ", dlsch_buffer[j]); + LOG_T(MAC, "%x ", + dlsch_buffer[j]); } - LOG_T(MAC, "\n"); #endif } @@ -2063,12 +2184,20 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, // RLC data on DCCH1 if (TBS - ta_len - header_length_total - sdu_length_total - 3 > 0) { - rlc_status = mac_rlc_status_ind(module_idP, rnti, module_idP, frameP, subframeP, ENB_FLAG_YES, MBMS_FLAG_NO, DCCH + 1, + rlc_status = mac_rlc_status_ind(module_idP, + rnti, + module_idP, + frameP, + subframeP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + DCCH + 1, TBS - ta_len - header_length_total - sdu_length_total - 3 #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - ,0, 0 + , 0 + , 0 #endif - ); + ); // DCCH SDU sdu_lengths[num_sdus] = 0; @@ -2076,35 +2205,46 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, LOG_D(MAC, "[eNB %d], Frame %d, DCCH1->DLSCH, CC_id %d, Requesting %d bytes from RLC (RRC message)\n", module_idP, frameP, CC_id, TBS - ta_len - header_length_total - sdu_length_total - 3); - sdu_lengths[num_sdus] += mac_rlc_data_req(module_idP, rnti, module_idP, frameP, ENB_FLAG_YES, MBMS_FLAG_NO, DCCH + 1, - TBS, //not used - (char *)&dlsch_buffer[sdu_length_total] + sdu_lengths[num_sdus] += mac_rlc_data_req(module_idP, + rnti, + module_idP, + frameP, + ENB_FLAG_YES, + MBMS_FLAG_NO, DCCH + 1, + TBS, //not used + (char *) &dlsch_buffer[sdu_length_total] #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - ,0, 0 + , 0 + , 0 #endif - ); - T(T_ENB_MAC_UE_DL_SDU, T_INT(module_idP), - T_INT(CC_id), T_INT(rnti), T_INT(frameP), - T_INT(subframeP), T_INT(harq_pid), - T_INT(DCCH + 1), T_INT(sdu_lengths[num_sdus])); + ); + T(T_ENB_MAC_UE_DL_SDU, + T_INT(module_idP), + T_INT(CC_id), + T_INT(rnti), + T_INT(frameP), + T_INT(subframeP), + T_INT(harq_pid), + T_INT(DCCH + 1), + T_INT(sdu_lengths[num_sdus])); sdu_lcids[num_sdus] = DCCH1; sdu_length_total += sdu_lengths[num_sdus]; - UE_list->eNB_UE_stats[CC_id][UE_id].lcid_sdu[num_sdus] = DCCH1; - UE_list->eNB_UE_stats[CC_id][UE_id].sdu_length_tx[DCCH1] = sdu_lengths[num_sdus]; - UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DCCH1] += 1; - UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DCCH1] += sdu_lengths[num_sdus]; + eNB_UE_stats->lcid_sdu[num_sdus] = DCCH1; + eNB_UE_stats->sdu_length_tx[DCCH1] = sdu_lengths[num_sdus]; + eNB_UE_stats->num_pdu_tx[DCCH1] += 1; + eNB_UE_stats->num_bytes_tx[DCCH1] += sdu_lengths[num_sdus]; header_length_last = 1 + 1 + (sdu_lengths[num_sdus] >= 128); header_length_total += header_length_last; num_sdus++; #ifdef DEBUG_eNB_SCHEDULER - LOG_T(MAC, - "[eNB %d][DCCH1] CC_id %d Got %d bytes :", - module_idP, CC_id, sdu_lengths[num_sdus]); - + LOG_T(MAC, "[eNB %d][DCCH1] CC_id %d Got %d bytes :", + module_idP, + CC_id, + sdu_lengths[num_sdus]); for (j = 0; j < sdu_lengths[num_sdus]; ++j) { - LOG_T(MAC, "%x ", dlsch_buffer[j]); + LOG_T(MAC, "%x ", + dlsch_buffer[j]); } - LOG_T(MAC, "\n"); #endif } @@ -2131,9 +2271,10 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, lcid, TBS - ta_len - header_length_total - sdu_length_total - 3 #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - , 0, 0 + , 0 + , 0 #endif - ); + ); if (rlc_status.bytes_in_buffer > 0) { LOG_D(MAC, "[eNB %d][USER-PLANE DEFAULT DRB] Frame %d : DTCH->DLSCH, Requesting %d bytes from RLC (lcid %d total hdr len %d)\n", @@ -2143,18 +2284,19 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, lcid, header_length_total); sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP, - rnti, - module_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - lcid, - TBS, //not used - (char *)&dlsch_buffer[sdu_length_total] + rnti, + module_idP, + frameP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + lcid, + TBS, //not used + (char *) &dlsch_buffer[sdu_length_total] #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - , 0, 0 + , 0 + , 0 #endif - ); + ); T(T_ENB_MAC_UE_DL_SDU, T_INT(module_idP), T_INT(CC_id), @@ -2170,16 +2312,17 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, lcid); sdu_lcids[num_sdus] = lcid; sdu_length_total += sdu_lengths[num_sdus]; - UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[lcid]++; - UE_list->eNB_UE_stats[CC_id][UE_id].lcid_sdu[num_sdus] = lcid; - UE_list->eNB_UE_stats[CC_id][UE_id].sdu_length_tx[lcid] = sdu_lengths[num_sdus]; - UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[lcid] += sdu_lengths[num_sdus]; + eNB_UE_stats->num_pdu_tx[lcid]++; + eNB_UE_stats->lcid_sdu[num_sdus] = lcid; + eNB_UE_stats->sdu_length_tx[lcid] = sdu_lengths[num_sdus]; + eNB_UE_stats->num_bytes_tx[lcid] += sdu_lengths[num_sdus]; header_length_last = 1 + 1 + (sdu_lengths[num_sdus] >= 128); header_length_total += header_length_last; num_sdus++; - UE_list->UE_sched_ctrl[UE_id].uplane_inactivity_timer = 0; + ue_sched_ctrl->uplane_inactivity_timer = 0; // reset RRC inactivity timer after uplane activity ue_contextP = rrc_eNB_get_ue_context(RC.rrc[module_idP], rnti); + if (ue_contextP != NULL) { ue_contextP->ue_context.ue_rrc_inactivity_timer = 1; } else { @@ -2220,25 +2363,27 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, if (nb_rb > nb_available_rb) { // if we've gone beyond the maximum number of RBs // (can happen if N_RB_DL is odd) - TBS = get_TBS_DL(eNB_UE_stats->dlsch_mcs1, nb_available_rb); + TBS = get_TBS_DL(eNB_UE_stats->dlsch_mcs1, + nb_available_rb); nb_rb = nb_available_rb; break; } - TBS = get_TBS_DL(eNB_UE_stats->dlsch_mcs1, nb_rb); + TBS = get_TBS_DL(eNB_UE_stats->dlsch_mcs1, + nb_rb); } - if (nb_rb == ue_sched_ctl->pre_nb_available_rbs[CC_id]) { + if (nb_rb == ue_sched_ctrl->pre_nb_available_rbs[CC_id]) { for (j = 0; j < N_RBG[CC_id]; ++j) { // for indicating the rballoc for each sub-band - UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + ue_template->rballoc_subband[harq_pid][j] = ue_sched_ctrl->rballoc_sub_UE[CC_id][j]; } } else { nb_rb_temp = nb_rb; j = 0; while ((nb_rb_temp > 0) && (j < N_RBG[CC_id])) { - if (ue_sched_ctl->rballoc_sub_UE[CC_id][j] == 1) { - UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + if (ue_sched_ctrl->rballoc_sub_UE[CC_id][j] == 1) { + ue_template->rballoc_subband[harq_pid][j] = ue_sched_ctrl->rballoc_sub_UE[CC_id][j]; if ((j == N_RBG[CC_id] - 1) && ((N_RB_DL[CC_id] == 25) || (N_RB_DL[CC_id] == 50))) { nb_rb_temp = nb_rb_temp - min_rb_unit[CC_id] + 1; @@ -2247,33 +2392,34 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, } } - j = j + 1; + j++; } } // decrease mcs until TBS falls below required length while ((TBS > sdu_length_total + header_length_total + ta_len) && (mcs > 0)) { mcs--; - TBS = get_TBS_DL(mcs, nb_rb); + TBS = get_TBS_DL(mcs, + nb_rb); } // if we have decreased too much or we don't have enough RBs, increase MCS - while ((TBS < sdu_length_total + header_length_total + ta_len) - && (((ue_sched_ctl->dl_pow_off[CC_id] > 0) - && (mcs < 28)) - || ((ue_sched_ctl->dl_pow_off[CC_id] == 0) - && (mcs <= 15)))) { + while (TBS < sdu_length_total + header_length_total + ta_len && + ((ue_sched_ctrl->dl_pow_off[CC_id] > 0 && mcs < 28) || (ue_sched_ctrl->dl_pow_off[CC_id] == 0 && mcs <= 15))) { mcs++; - TBS = get_TBS_DL(mcs, nb_rb); + TBS = get_TBS_DL(mcs, + nb_rb); } - LOG_D(MAC, - "dlsch_mcs before and after the rate matching = (%d, %d)\n", - eNB_UE_stats->dlsch_mcs1, mcs); + LOG_D(MAC, "dlsch_mcs before and after the rate matching = (%d, %d)\n", + eNB_UE_stats->dlsch_mcs1, + mcs); #ifdef DEBUG_eNB_SCHEDULER - LOG_D(MAC, - "[eNB %d] CC_id %d Generated DLSCH header (mcs %d, TBS %d, nb_rb %d)\n", - module_idP, CC_id, mcs, TBS, nb_rb); + LOG_D(MAC, "[eNB %d] CC_id %d Generated DLSCH header (mcs %d, TBS %d, nb_rb %d)\n", + module_idP, + CC_id, + mcs, TBS, + nb_rb); // msg("[MAC][eNB ] Reminder of DLSCH with random data %d %d %d %d \n", // TBS, sdu_length_total, offset, TBS-sdu_length_total-offset); #endif @@ -2289,97 +2435,131 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, offset = generate_dlsch_header((unsigned char *) UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], num_sdus, //num_sdus sdu_lengths, // - sdu_lcids, 255, // no drx + sdu_lcids, + 255, // no drx ta_update, // timing advance NULL, // contention res id - padding, post_padding); + padding, + post_padding); //#ifdef DEBUG_eNB_SCHEDULER if (ta_update != 31) { - LOG_D(MAC, + LOG_D(MAC, "[eNB %d][DLSCH] Frame %d Generate header for UE_id %d on CC_id %d: sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,timing advance value : %d, padding %d,post_padding %d,(mcs %d, TBS %d, nb_rb %d),header_length %d\n", - module_idP, frameP, UE_id, CC_id, - sdu_length_total, num_sdus, sdu_lengths[0], - sdu_lcids[0], offset, ta_update, padding, - post_padding, mcs, TBS, nb_rb, + module_idP, + frameP, + UE_id, + CC_id, + sdu_length_total, + num_sdus, + sdu_lengths[0], + sdu_lcids[0], + offset, + ta_update, + padding, + post_padding, + mcs, + TBS, + nb_rb, header_length_total); } //#endif #ifdef DEBUG_eNB_SCHEDULER LOG_T(MAC, "[eNB %d] First 16 bytes of DLSCH : \n"); - - for (i = 0; i < 16; ++i) { - LOG_T(MAC, "%x.", dlsch_buffer[i]); + for (i = 0; i < 16; i++) { + LOG_T(MAC, "%x.", + dlsch_buffer[i]); } - LOG_T(MAC, "\n"); #endif // cycle through SDUs and place in dlsch_buffer - memcpy(&UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0][offset], dlsch_buffer, sdu_length_total); + dlsch_pdu = &UE_list->DLSCH_pdu[CC_id][0][UE_id]; + memcpy(&dlsch_pdu->payload[0][offset], + dlsch_buffer, + sdu_length_total); // memcpy(RC.mac[0].DLSCH_pdu[0][0].payload[0][offset],dcch_buffer,sdu_lengths[0]); // fill remainder of DLSCH with 0 for (j = 0; j < (TBS - sdu_length_total - offset); j++) { - UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0][offset + sdu_length_total + j] = 0; + dlsch_pdu->payload[0][offset + sdu_length_total + j] = 0; } if (opt_enabled == 1) { trace_pdu(DIRECTION_DOWNLINK, - (uint8_t *) UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], - TBS, module_idP, WS_C_RNTI, - UE_RNTI(module_idP, UE_id), eNB->frame, - eNB->subframe, 0, 0); - LOG_D(OPT, - "[eNB %d][DLSCH] CC_id %d Frame %d rnti %x with size %d\n", - module_idP, CC_id, frameP, - UE_RNTI(module_idP, UE_id), TBS); + (uint8_t *) dlsch_pdu->payload[0], + TBS, + module_idP, + WS_C_RNTI, + UE_RNTI(module_idP, + UE_id), + eNB->frame, + eNB->subframe, + 0, + 0); + LOG_D(OPT, "[eNB %d][DLSCH] CC_id %d Frame %d rnti %x with size %d\n", + module_idP, + CC_id, + frameP, + UE_RNTI(module_idP, + UE_id), + TBS); } - T(T_ENB_MAC_UE_DL_PDU_WITH_DATA, T_INT(module_idP), - T_INT(CC_id), T_INT(rnti), T_INT(frameP), - T_INT(subframeP), T_INT(harq_pid), - T_BUFFER(UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], TBS)); - UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid] = nb_rb; - add_ue_dlsch_info(module_idP, CC_id, UE_id, subframeP, S_DL_SCHEDULED); + T(T_ENB_MAC_UE_DL_PDU_WITH_DATA, + T_INT(module_idP), + T_INT(CC_id), + T_INT(rnti), + T_INT(frameP), + T_INT(subframeP), + T_INT(harq_pid), + T_BUFFER(dlsch_pdu->payload[0], + TBS)); + ue_template->nb_rb[harq_pid] = nb_rb; + add_ue_dlsch_info(module_idP, + CC_id, + UE_id, + subframeP, + S_DL_SCHEDULED, + rnti); // store stats eNB->eNB_stats[CC_id].dlsch_bytes_tx += sdu_length_total; eNB->eNB_stats[CC_id].dlsch_pdus_tx += 1; - UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used = nb_rb; - UE_list->eNB_UE_stats[CC_id][UE_id].num_mac_sdu_tx = num_sdus; - UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used += nb_rb; - UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs1 = eNB_UE_stats->dlsch_mcs1; - UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs2 = mcs; - UE_list->eNB_UE_stats[CC_id][UE_id].TBS = TBS; - UE_list->eNB_UE_stats[CC_id][UE_id].overhead_bytes = TBS - sdu_length_total; - UE_list->eNB_UE_stats[CC_id][UE_id].total_sdu_bytes += sdu_length_total; - UE_list->eNB_UE_stats[CC_id][UE_id].total_pdu_bytes += TBS; - UE_list->eNB_UE_stats[CC_id][UE_id].total_num_pdus += 1; + eNB_UE_stats->rbs_used = nb_rb; + eNB_UE_stats->num_mac_sdu_tx = num_sdus; + eNB_UE_stats->total_rbs_used += nb_rb; + eNB_UE_stats->dlsch_mcs2 = mcs; + eNB_UE_stats->TBS = TBS; + eNB_UE_stats->overhead_bytes = TBS - sdu_length_total; + eNB_UE_stats->total_sdu_bytes += sdu_length_total; + eNB_UE_stats->total_pdu_bytes += TBS; + eNB_UE_stats->total_num_pdus += 1; if (cc[CC_id].tdd_Config != NULL) { // TDD - UE_list->UE_template[CC_id][UE_id].DAI++; - update_ul_dci(module_idP, CC_id, rnti, - UE_list->UE_template[CC_id][UE_id].DAI, + ue_template->DAI++; + update_ul_dci(module_idP, + CC_id, + rnti, + ue_template->DAI, subframeP); } // do PUCCH power control // this is the normalized RX power - eNB_UE_stats = &UE_list->eNB_UE_stats[CC_id][UE_id]; - /* unit is not dBm, it's special from nfapi */ + // unit is not dBm, it's special from nfapi // converting to dBm: ToDo: Noise power hard coded to 30 - normalized_rx_power = (5*ue_sched_ctl->pucch1_snr[CC_id]-640)/10+30; - target_rx_power= eNB->puCch10xSnr/10 + 30; + normalized_rx_power = (((5 * ue_sched_ctrl->pucch1_snr[CC_id]) - 640) / 10) + 30; + target_rx_power= (eNB->puCch10xSnr / 10) + 30; // this assumes accumulated tpc // make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out - int32_t framex10psubframe = UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame * 10 + UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe; + int32_t framex10psubframe = ue_template->pucch_tpc_tx_frame * 10 + ue_template->pucch_tpc_tx_subframe; - if (((framex10psubframe + 10) <= (frameP * 10 + subframeP)) || //normal case - ((framex10psubframe > (frameP * 10 + subframeP)) && (((10240 - framex10psubframe + frameP * 10 + subframeP) >= 10)))) //frame wrap-around - if (ue_sched_ctl->pucch1_cqi_update[CC_id] == 1) { - ue_sched_ctl->pucch1_cqi_update[CC_id] = 0; - UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame = frameP; - UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe = subframeP; + if (framex10psubframe + 10 <= (frameP * 10) + subframeP || //normal case + (framex10psubframe > (frameP * 10) + subframeP && 10240 - framex10psubframe + (frameP * 10) + subframeP >= 10)) //frame wrap-around + if (ue_sched_ctrl->pucch1_cqi_update[CC_id] == 1) { + ue_sched_ctrl->pucch1_cqi_update[CC_id] = 0; + ue_template->pucch_tpc_tx_frame = frameP; + ue_template->pucch_tpc_tx_subframe = subframeP; if (normalized_rx_power > (target_rx_power + 4)) { tpc = 0; //-1 @@ -2389,10 +2569,14 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, tpc = 1; //0 } - LOG_D(MAC, - "[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, normalized/target rx power %d/%d\n", - module_idP, frameP, subframeP, harq_pid, tpc, - normalized_rx_power, target_rx_power); + LOG_D(MAC, "[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, normalized/target rx power %d/%d\n", + module_idP, + frameP, + subframeP, + harq_pid, + tpc, + normalized_rx_power, + target_rx_power); } // Po_PUCCH has been updated else { tpc = 1; //0 @@ -2402,20 +2586,24 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, } dl_config_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu]; - memset((void *) dl_config_pdu, 0, sizeof(nfapi_dl_config_request_pdu_t)); + memset((void *) dl_config_pdu, + 0, + sizeof(nfapi_dl_config_request_pdu_t)); dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu)); dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = NFAPI_DL_DCI_FORMAT_1; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = - get_aggregation(get_bw_index(module_idP, CC_id), ue_sched_ctl->dl_cqi[CC_id], format1); + get_aggregation(get_bw_index(module_idP, + CC_id), + ue_sched_ctrl->dl_cqi[CC_id], + format1); dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = rnti; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = 1; // CRNTI : see Table 4-10 from SCF082 - nFAPI specifications dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.harq_process = harq_pid; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = tpc; // dont adjust power when retransmitting - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = - 1 - UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = 1 - ue_template->oldNDI[harq_pid]; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = mcs; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = 0; //deactivate second codeword @@ -2423,47 +2611,61 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_2 = 1; if (cc[CC_id].tdd_Config != NULL) { //TDD - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.downlink_assignment_index = - (UE_list->UE_template[CC_id][UE_id].DAI - 1) & 3; - LOG_D(MAC, - "[eNB %d] Initial transmission CC_id %d : harq_pid %d, dai %d, mcs %d\n", - module_idP, CC_id, harq_pid, - (UE_list->UE_template[CC_id][UE_id].DAI - 1), + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.downlink_assignment_index = (ue_template->DAI - 1) & 3; + LOG_D(MAC, "[eNB %d] Initial transmission CC_id %d : harq_pid %d, dai %d, mcs %d\n", + module_idP, + CC_id, + harq_pid, + (ue_template->DAI - 1), mcs); } else { - LOG_D(MAC, - "[eNB %d] Initial transmission CC_id %d : harq_pid %d, mcs %d\n", - module_idP, CC_id, harq_pid, mcs); + LOG_D(MAC, "[eNB %d] Initial transmission CC_id %d : harq_pid %d, mcs %d\n", + module_idP, + CC_id, + harq_pid, + mcs); } LOG_D(MAC, "Checking feasibility pdu %d (new sdu)\n", dl_req->number_pdu); - if (!CCE_allocation_infeasible(module_idP, CC_id, 1, subframeP, - dl_config_pdu->dci_dl_pdu. - dci_dl_pdu_rel8.aggregation_level, rnti)) { - ue_sched_ctl->round[CC_id][harq_pid] = 0; + if (!CCE_allocation_infeasible(module_idP, + CC_id, + 1, + subframeP, + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level, + rnti)) { + ue_sched_ctrl->round[CC_id][harq_pid] = 0; dl_req->number_dci++; dl_req->number_pdu++; dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; eNB->DL_req[CC_id].sfn_sf = frameP << 4 | subframeP; eNB->DL_req[CC_id].header.message_id = NFAPI_DL_CONFIG_REQUEST; // Toggle NDI for next time - LOG_D(MAC, - "CC_id %d Frame %d, subframeP %d: Toggling Format1 NDI for UE %d (rnti %x/%d) oldNDI %d\n", - CC_id, frameP, subframeP, UE_id, rnti, harq_pid, - UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]); - UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid] = 1 - UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - UE_list->UE_template[CC_id][UE_id].oldmcs1[harq_pid] = mcs; - UE_list->UE_template[CC_id][UE_id].oldmcs2[harq_pid] = 0; - AssertFatal(UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated != NULL, - "physicalConfigDedicated is NULL\n"); - AssertFatal(UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->pdsch_ConfigDedicated != NULL, + LOG_D(MAC, "CC_id %d Frame %d, subframeP %d: Toggling Format1 NDI for UE %d (rnti %x/%d) oldNDI %d\n", + CC_id, + frameP, + subframeP, + UE_id, + rnti, + harq_pid, + ue_template->oldNDI[harq_pid]); + ue_template->oldNDI[harq_pid] = 1 - ue_template->oldNDI[harq_pid]; + ue_template->oldmcs1[harq_pid] = mcs; + ue_template->oldmcs2[harq_pid] = 0; + AssertFatal(ue_template->physicalConfigDedicated != NULL, "physicalConfigDedicated is NULL\n"); + AssertFatal(ue_template->physicalConfigDedicated->pdsch_ConfigDedicated != NULL, "physicalConfigDedicated->pdsch_ConfigDedicated is NULL\n"); - fill_nfapi_dlsch_config(eNB, dl_req, TBS, eNB->pdu_index[CC_id], rnti, 0, // type 0 allocation from 7.1.6 in 36.213 + fill_nfapi_dlsch_config(eNB, + dl_req, + TBS, + eNB->pdu_index[CC_id], + rnti, + 0, // type 0 allocation from 7.1.6 in 36.213 0, // virtual_resource_block_assignment_flag, unused here 0, // resource_block_coding, to be filled in later - getQm(mcs), 0, // redundancy version + getQm(mcs), + 0, // redundancy version 1, // transport blocks 0, // transport block to codeword swap flag cc[CC_id].p_eNB == 1 ? 0 : 1, // transmission_scheme @@ -2471,57 +2673,74 @@ schedule_ue_spec(module_id_t module_idP, int slice_idxP, 1, // number of subbands // uint8_t codebook_index, 4, // UE category capacity - UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->pdsch_ConfigDedicated->p_a, 0, // delta_power_offset for TM5 + ue_template->physicalConfigDedicated->pdsch_ConfigDedicated->p_a, + 0, // delta_power_offset for TM5 0, // ngap 0, // nprb cc[CC_id].p_eNB == 1 ? 1 : 2, // transmission mode 0, //number of PRBs treated as one subband, not used here - 0 // number of beamforming vectors, not used here - ); + 0); // number of beamforming vectors, not used here + eNB->TX_req[CC_id].sfn_sf = fill_nfapi_tx_req(&eNB->TX_req[CC_id].tx_request_body, - (frameP * 10) + subframeP, - TBS, eNB->pdu_index[CC_id], - eNB->UE_list.DLSCH_pdu[CC_id][0][UE_id].payload[0]); - LOG_D(MAC, - "Filled NFAPI configuration for DCI/DLSCH/TXREQ %d, new SDU\n", + (frameP * 10) + subframeP, + TBS, + eNB->pdu_index[CC_id], + dlsch_pdu->payload[0]); + LOG_D(MAC, "Filled NFAPI configuration for DCI/DLSCH/TXREQ %d, new SDU\n", eNB->pdu_index[CC_id]); eNB->pdu_index[CC_id]++; - program_dlsch_acknak(module_idP, CC_id, UE_id, - frameP, subframeP, + program_dlsch_acknak(module_idP, + CC_id, + UE_id, + frameP, + subframeP, dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.cce_idx); } else { - LOG_W(MAC, - "Frame %d, Subframe %d: Dropping DLSCH allocation for UE %d/%x, infeasible CCE allocations\n", - frameP, subframeP, UE_id, rnti); + LOG_W(MAC, "Frame %d, Subframe %d: Dropping DLSCH allocation for UE %d/%x, infeasible CCE allocations\n", + frameP, + subframeP, + UE_id, + rnti); } } else { // There is no data from RLC or MAC header, so don't schedule } } if (cc[CC_id].tdd_Config != NULL) { // TDD - set_ul_DAI(module_idP, UE_id, CC_id, frameP, subframeP); + set_ul_DAI(module_idP, + UE_id, + CC_id, + frameP, + subframeP); } } // UE_id loop } // CC_id loop - fill_DLSCH_dci(module_idP, frameP, subframeP, mbsfn_flag); + fill_DLSCH_dci(module_idP, + frameP, + subframeP, + mbsfn_flag); stop_meas(&eNB->schedule_dlsch); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH, VCD_FUNCTION_OUT); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH, + VCD_FUNCTION_OUT); } //------------------------------------------------------------------------------ -void dlsch_scheduler_interslice_multiplexing(module_id_t Mod_id, - int frameP, - sub_frame_t subframeP, - uint8_t rballoc_sub[NFAPI_CC_MAX][N_RBG_MAX]) +void +dlsch_scheduler_interslice_multiplexing(module_id_t Mod_id, + int frameP, + sub_frame_t subframeP, + uint8_t rballoc_sub[NFAPI_CC_MAX][N_RBG_MAX]) //------------------------------------------------------------------------------ { // FIXME: I'm prototyping the algorithm, so there may be arrays and variables that carry redundant information here and in pre_processor_results struct. int UE_id, CC_id, rbg, i; int N_RB_DL, min_rb_unit, tm; int owned, used; - UE_list_t *UE_list = &RC.mac[Mod_id]->UE_list; - slice_info_t *sli = &RC.mac[Mod_id]->slice_info; + eNB_MAC_INST *eNB = RC.mac[Mod_id]; + int nb_mac_CC = RC.nb_mac_CC[Mod_id]; + UE_list_t *UE_list = &eNB->UE_list; + slice_info_t *sli = &eNB->slice_info; UE_sched_ctrl *ue_sched_ctl; COMMON_channels_t *cc; int N_RBG[NFAPI_CC_MAX]; @@ -2533,17 +2752,17 @@ void dlsch_scheduler_interslice_multiplexing(module_id_t Mod_id, uint16_t (*nb_rbs_remaining)[MAX_MOBILES_PER_ENB]; uint16_t (*nb_rbs_required)[MAX_MOBILES_PER_ENB]; uint8_t (*MIMO_mode_indicator)[N_RBG_MAX]; - + // Initialize the free RBGs map // free_rbgs_map[CC_id][rbg] = -1 if RBG is allocated, // otherwise it contains the id of the slice it belongs to. // (Information about slicing must be retained to deal with isolation). // FIXME: This method does not consider RBGs that are free and belong to no slices - for (CC_id = 0; CC_id < RC.nb_mac_CC[Mod_id]; ++CC_id) { - cc = &RC.mac[Mod_id]->common_channels[CC_id]; + for (CC_id = 0; CC_id < nb_mac_CC; CC_id++) { + cc = &eNB->common_channels[CC_id]; N_RBG[CC_id] = to_rbg(cc->mib->message.dl_Bandwidth); - for (rbg = 0; rbg < N_RBG[CC_id]; ++rbg) { + for (rbg = 0; rbg < N_RBG[CC_id]; rbg++) { for (i = 0; i < sli->n_dl; ++i) { owned = sli->pre_processor_results[i].slice_allocation_mask[CC_id][rbg]; @@ -2558,11 +2777,11 @@ void dlsch_scheduler_interslice_multiplexing(module_id_t Mod_id, // Find out which slices need other resources. // FIXME: I don't think is really needed since we check nb_rbs_remaining later - for (CC_id = 0; CC_id < RC.nb_mac_CC[Mod_id]; ++CC_id) { - for (i = 0; i < sli->n_dl; ++i) { + for (CC_id = 0; CC_id < nb_mac_CC; CC_id++) { + for (i = 0; i < sli->n_dl; i++) { has_traffic[CC_id][i] = 0; - for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; ++UE_id) { + for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) { if (sli->pre_processor_results[i].nb_rbs_remaining[CC_id][UE_id] > 0) { has_traffic[CC_id][i] = 1; break; @@ -2571,13 +2790,15 @@ void dlsch_scheduler_interslice_multiplexing(module_id_t Mod_id, } } - slice_priority_sort(Mod_id, slice_sorted_list); + slice_priority_sort(Mod_id, + slice_sorted_list); // MULTIPLEXING // This part is an adaptation of dlsch_scheduler_pre_processor_allocate() code - for (CC_id = 0; CC_id < RC.nb_mac_CC[Mod_id]; ++CC_id) { - N_RB_DL = to_prb(RC.mac[Mod_id]->common_channels[CC_id].mib->message.dl_Bandwidth); - min_rb_unit = get_min_rb_unit(Mod_id, CC_id); + for (CC_id = 0; CC_id < nb_mac_CC; ++CC_id) { + N_RB_DL = to_prb(eNB->common_channels[CC_id].mib->message.dl_Bandwidth); + min_rb_unit = get_min_rb_unit(Mod_id, + CC_id); for (i = 0; i < sli->n_dl; ++i) { slice_idx = slice_sorted_list[i]; @@ -2605,7 +2826,10 @@ void dlsch_scheduler_interslice_multiplexing(module_id_t Mod_id, // Sort UE again // (UE list gets sorted every time pre_processor is called so it is probably dirty at this point) // FIXME: There is only one UE_list for all slices, so it must be sorted again each time we use it - sort_UEs(Mod_id, slice_idx, frameP, subframeP); + sort_UEs(Mod_id, + slice_idx, + frameP, + subframeP); nb_rbs_remaining = sli->pre_processor_results[slice_idx].nb_rbs_remaining; nb_rbs_required = sli->pre_processor_results[slice_idx].nb_rbs_required; MIMO_mode_indicator = sli->pre_processor_results[slice_idx].MIMO_mode_indicator; @@ -2613,7 +2837,9 @@ void dlsch_scheduler_interslice_multiplexing(module_id_t Mod_id, // Allocation for (UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; - tm = get_tmode(Mod_id, CC_id, UE_id); + tm = get_tmode(Mod_id, + CC_id, + UE_id); for (rbg = 0; rbg < N_RBG[CC_id]; ++rbg) { // FIXME: I think that some of these checks are redundant @@ -2641,8 +2867,8 @@ void dlsch_scheduler_interslice_multiplexing(module_id_t Mod_id, ue_sched_ctl->dl_pow_off[CC_id] = 1; } - nb_rbs_remaining[CC_id][UE_id] = nb_rbs_remaining[CC_id][UE_id] - min_rb_unit + 1; - ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit - 1; + nb_rbs_remaining[CC_id][UE_id] -= (min_rb_unit - 1); + ue_sched_ctl->pre_nb_available_rbs[CC_id] += (min_rb_unit - 1); } } else { // Allocating a standard-sized RBG @@ -2656,36 +2882,42 @@ void dlsch_scheduler_interslice_multiplexing(module_id_t Mod_id, ue_sched_ctl->dl_pow_off[CC_id] = 1; } - nb_rbs_remaining[CC_id][UE_id] = nb_rbs_remaining[CC_id][UE_id] - min_rb_unit; - ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit; + nb_rbs_remaining[CC_id][UE_id] -= min_rb_unit; + ue_sched_ctl->pre_nb_available_rbs[CC_id] += min_rb_unit; } } } } } } + return; } //------------------------------------------------------------------------------ void dlsch_scheduler_qos_multiplexing(module_id_t Mod_id, int frameP, sub_frame_t subframeP) //------------------------------------------------------------------------------ { - int UE_id, CC_id, i; - UE_list_t *UE_list = &RC.mac[Mod_id]->UE_list; + // int UE_id; + int CC_id, i; + // UE_list_t *UE_list = &RC.mac[Mod_id]->UE_list; slice_info_t *sli = &RC.mac[Mod_id]->slice_info; //UE_sched_ctrl *ue_sched_ctl; - for (CC_id = 0; CC_id < RC.nb_mac_CC[Mod_id]; ++CC_id) { - for (i = 0; i < sli->n_dl; ++i) { + for (CC_id = 0; CC_id < RC.nb_mac_CC[Mod_id]; CC_id++) { + for (i = 0; i < sli->n_dl; i++) { // Sort UE again // FIXME: There is only one UE_list for all slices, so it must be sorted again each time we use it - sort_UEs(Mod_id, (uint8_t)i, frameP, subframeP); - + sort_UEs(Mod_id, + (uint8_t)i, + frameP, + subframeP); + /* for (UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { //ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; // TODO: Do something here // ue_sched_ctl->pre_nb_available_rbs[CC_id]; } + */ } } } @@ -3294,7 +3526,9 @@ schedule_ue_spec_br( //------------------------------------------------------------------------------ void fill_DLSCH_dci(module_id_t module_idP, - frame_t frameP, sub_frame_t subframeP, int *mbsfn_flagP) + frame_t frameP, + sub_frame_t subframeP, + int *mbsfn_flagP) //------------------------------------------------------------------------------ { // loop over all allocated UEs and compute frequency allocations for PDSCH @@ -3313,12 +3547,16 @@ fill_DLSCH_dci(module_id_t module_idP, int N_RBG; int N_RB_DL; COMMON_channels_t *cc; + eNB_DLSCH_INFO *dlsch_info; + UE_TEMPLATE *ue_template; + start_meas(&eNB->fill_DLSCH_dci); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME - (VCD_SIGNAL_DUMPER_FUNCTIONS_FILL_DLSCH_DCI, VCD_FUNCTION_IN); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_FILL_DLSCH_DCI, + VCD_FUNCTION_IN); for (CC_id = 0; CC_id < RC.nb_mac_CC[module_idP]; CC_id++) { - LOG_D(MAC, "Doing fill DCI for CC_id %d\n", CC_id); + LOG_D(MAC, "Doing fill DCI for CC_id %d\n", + CC_id); if (mbsfn_flagP[CC_id] > 0) continue; @@ -3328,42 +3566,48 @@ fill_DLSCH_dci(module_id_t module_idP, N_RB_DL = to_prb(cc->mib->message.dl_Bandwidth); // UE specific DCIs - for (UE_id = UE_list->head; UE_id >= 0; - UE_id = UE_list->next[UE_id]) { - LOG_T(MAC, "CC_id %d, UE_id: %d => status %d\n", CC_id, UE_id, - eNB_dlsch_info[module_idP][CC_id][UE_id].status); + for (UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { + dlsch_info = &eNB_dlsch_info[module_idP][CC_id][UE_id]; + LOG_T(MAC, "CC_id %d, UE_id: %d => status %d\n", + CC_id, + UE_id, + dlsch_info->status); - if (eNB_dlsch_info[module_idP][CC_id][UE_id].status == S_DL_SCHEDULED) { + if (dlsch_info->status == S_DL_SCHEDULED) { // clear scheduling flag - eNB_dlsch_info[module_idP][CC_id][UE_id].status = S_DL_WAITING; + dlsch_info->status = S_DL_WAITING; rnti = UE_RNTI(module_idP, UE_id); - harq_pid = frame_subframe2_dl_harq_pid(cc->tdd_Config,frameP,subframeP); - nb_rb = UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid]; + harq_pid = frame_subframe2_dl_harq_pid(cc->tdd_Config,frameP, + subframeP); + ue_template = &UE_list->UE_template[CC_id][UE_id]; + nb_rb = ue_template->nb_rb[harq_pid]; /// Synchronizing rballoc with rballoc_sub for (i = 0; i < N_RBG; i++) { - rballoc_sub[i] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][i]; + rballoc_sub[i] = ue_template->rballoc_subband[harq_pid][i]; } - nfapi_dl_config_request_t *DL_req = &RC.mac[module_idP]->DL_req[0]; + nfapi_dl_config_request_body_t *dl_config_request_body = &RC.mac[module_idP]->DL_req[CC_id].dl_config_request_body; nfapi_dl_config_request_pdu_t *dl_config_pdu; - for (i = 0; - i < DL_req[CC_id].dl_config_request_body.number_pdu; - i++) { - dl_config_pdu = &DL_req[CC_id].dl_config_request_body.dl_config_pdu_list[i]; + for (i = 0; i < dl_config_request_body->number_pdu; i++) { + dl_config_pdu = &dl_config_request_body->dl_config_pdu_list[i]; - if ((dl_config_pdu->pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE) - && (dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti == rnti) - && (dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format != 1)) { - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = allocate_prbs_sub(nb_rb, N_RB_DL, N_RBG, - rballoc_sub); + if (dl_config_pdu->pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE && + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti == rnti && + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format != 1) { + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = allocate_prbs_sub(nb_rb, + N_RB_DL, + N_RBG, + rballoc_sub); dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_allocation_type = 0; - } else if ((dl_config_pdu->pdu_type == NFAPI_DL_CONFIG_DLSCH_PDU_TYPE) - && (dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti == rnti) - && (dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type == 0)) { - dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_block_coding = allocate_prbs_sub(nb_rb, N_RB_DL, N_RBG, - rballoc_sub); + } else if (dl_config_pdu->pdu_type == NFAPI_DL_CONFIG_DLSCH_PDU_TYPE && + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti == rnti && + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type == 0) { + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_block_coding = allocate_prbs_sub(nb_rb, + N_RB_DL, + N_RBG, + rballoc_sub); } } } @@ -3371,12 +3615,15 @@ fill_DLSCH_dci(module_id_t module_idP, } stop_meas(&eNB->fill_DLSCH_dci); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_FILL_DLSCH_DCI, VCD_FUNCTION_OUT); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_FILL_DLSCH_DCI, + VCD_FUNCTION_OUT); } //------------------------------------------------------------------------------ unsigned char *get_dlsch_sdu(module_id_t module_idP, - int CC_id, frame_t frameP, rnti_t rntiP, + int CC_id, + frame_t frameP, + rnti_t rntiP, uint8_t TBindex) //------------------------------------------------------------------------------ { @@ -3385,96 +3632,106 @@ unsigned char *get_dlsch_sdu(module_id_t module_idP, if (rntiP == SI_RNTI) { LOG_D(MAC, "[eNB %d] CC_id %d Frame %d Get DLSCH sdu for BCCH \n", - module_idP, CC_id, frameP); + module_idP, + CC_id, + frameP); return ((unsigned char *) &eNB->common_channels[CC_id].BCCH_pdu.payload[0]); } if (rntiP == P_RNTI) { - LOG_D(MAC, "[eNB %d] CC_id %d Frame %d Get PCH sdu for PCCH \n", module_idP, CC_id, frameP); + LOG_D(MAC, "[eNB %d] CC_id %d Frame %d Get PCH sdu for PCCH \n", + module_idP, + CC_id, + frameP); return ((unsigned char *) &eNB->common_channels[CC_id].PCCH_pdu.payload[0]); } UE_id = find_UE_id(module_idP, rntiP); if (UE_id != -1) { - LOG_D(MAC, - "[eNB %d] Frame %d: CC_id %d Get DLSCH sdu for rnti %x => UE_id %d\n", - module_idP, frameP, CC_id, rntiP, UE_id); + LOG_D(MAC, "[eNB %d] Frame %d: CC_id %d Get DLSCH sdu for rnti %x => UE_id %d\n", + module_idP, + frameP, + CC_id, + rntiP, + UE_id); return ((unsigned char *) &eNB->UE_list.DLSCH_pdu[CC_id][TBindex][UE_id].payload[0]); - } else { - LOG_E(MAC, - "[eNB %d] Frame %d: CC_id %d UE with RNTI %x does not exist\n", - module_idP, frameP, CC_id, rntiP); - return NULL; - } + } + + LOG_E(MAC, "[eNB %d] Frame %d: CC_id %d UE with RNTI %x does not exist\n", + module_idP, + frameP, + CC_id, + rntiP); + return NULL; } //------------------------------------------------------------------------------ void update_ul_dci(module_id_t module_idP, - uint8_t CC_idP, rnti_t rntiP, uint8_t daiP, sub_frame_t subframe) + uint8_t CC_idP, + rnti_t rntiP, + uint8_t daiP, + sub_frame_t subframe) //------------------------------------------------------------------------------ { - nfapi_hi_dci0_request_t *HI_DCI0_req = - &RC.mac[module_idP]->HI_DCI0_req[CC_idP][subframe]; - nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu = - &HI_DCI0_req->hi_dci0_request_body.hi_dci0_pdu_list[0]; - COMMON_channels_t *cc = &RC.mac[module_idP]->common_channels[CC_idP]; - int i; - + eNB_MAC_INST *eNB = RC.mac[module_idP]; + COMMON_channels_t *cc = &eNB->common_channels[CC_idP]; + if (cc->tdd_Config != NULL) { // TDD - for (i = 0; - i <HI_DCI0_req->hi_dci0_request_body.number_of_dci + HI_DCI0_req->hi_dci0_request_body.number_of_hi; - i++) { - if ((hi_dci0_pdu[i].pdu_type == NFAPI_HI_DCI0_DCI_PDU_TYPE) && - (hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.rnti == rntiP)) - hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.dl_assignment_index = (daiP - 1) & 3; + nfapi_hi_dci0_request_t *HI_DCI0_req = &eNB->HI_DCI0_req[CC_idP][subframe]; + nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu = &HI_DCI0_req->hi_dci0_request_body.hi_dci0_pdu_list[0]; + int limit = HI_DCI0_req->hi_dci0_request_body.number_of_dci + HI_DCI0_req->hi_dci0_request_body.number_of_hi; + for (int i = 0; i < limit; i++, hi_dci0_pdu++) { + if (hi_dci0_pdu->pdu_type == NFAPI_HI_DCI0_DCI_PDU_TYPE && hi_dci0_pdu->dci_pdu.dci_pdu_rel8.rnti == rntiP) + hi_dci0_pdu->dci_pdu.dci_pdu_rel8.dl_assignment_index = (daiP - 1) & 3; } } + return; } //------------------------------------------------------------------------------ void set_ue_dai(sub_frame_t subframeP, - int UE_id, uint8_t CC_id, uint8_t tdd_config, + int UE_id, + uint8_t CC_id, + uint8_t tdd_config, UE_list_t *UE_list) //------------------------------------------------------------------------------ { switch (tdd_config) { case 0: - if ((subframeP == 0) || (subframeP == 1) || (subframeP == 3) - || (subframeP == 5) || (subframeP == 6) || (subframeP == 8)) { + if (subframeP == 0 || subframeP == 1 || subframeP == 3 || subframeP == 5 || subframeP == 6 || subframeP == 8) { UE_list->UE_template[CC_id][UE_id].DAI = 0; } break; case 1: - if ((subframeP == 0) || (subframeP == 4) || (subframeP == 5) - || (subframeP == 9)) { + if (subframeP == 0 || subframeP == 4 || subframeP == 5 || subframeP == 9) { UE_list->UE_template[CC_id][UE_id].DAI = 0; } break; case 2: - if ((subframeP == 4) || (subframeP == 5)) { + if (subframeP == 4 || subframeP == 5) { UE_list->UE_template[CC_id][UE_id].DAI = 0; } break; case 3: - if ((subframeP == 5) || (subframeP == 7) || (subframeP == 9)) { + if (subframeP == 5 || subframeP == 7 || subframeP == 9) { UE_list->UE_template[CC_id][UE_id].DAI = 0; } break; case 4: - if ((subframeP == 0) || (subframeP == 6)) { + if (subframeP == 0 || subframeP == 6) { UE_list->UE_template[CC_id][UE_id].DAI = 0; } @@ -3488,8 +3745,7 @@ set_ue_dai(sub_frame_t subframeP, break; case 6: - if ((subframeP == 0) || (subframeP == 1) || (subframeP == 5) - || (subframeP == 6) || (subframeP == 9)) { + if (subframeP == 0 || subframeP == 1 || subframeP == 5 || subframeP == 6 || subframeP == 9) { UE_list->UE_template[CC_id][UE_id].DAI = 0; } @@ -3497,12 +3753,19 @@ set_ue_dai(sub_frame_t subframeP, default: UE_list->UE_template[CC_id][UE_id].DAI = 0; - LOG_I(MAC, "unknown TDD config %d\n", tdd_config); + LOG_I(MAC, "unknown TDD config %d\n", + tdd_config); break; } + + return; } -void schedule_PCH(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) { +void +schedule_PCH(module_id_t module_idP, + frame_t frameP, + sub_frame_t subframeP) +{ /* DCI:format 1A/1C P-RNTI:0xFFFE */ /* PDU:eNB_rrc_inst[Mod_idP].common_channels[CC_id].PCCH_pdu.payload */ uint16_t pcch_sdu_length; @@ -3516,9 +3779,10 @@ void schedule_PCH(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) nfapi_dl_config_request_pdu_t *dl_config_pdu; nfapi_tx_request_pdu_t *TX_req; nfapi_dl_config_request_body_t *dl_req; + UE_PF_PO_t *ue_pf_po; #ifdef FORMAT1C - int gap_index = 0; /* indicate which gap(1st or 2nd) is used (0:1st) */ - const int GAP_MAP [9][2] = { + int gap_index = 0; /* indicate which gap(1st or 2nd) is used (0:1st) */ + const int GAP_MAP [9][2] = { {-1, 0}, /* N_RB_DL [6-10] -1: |N_RB/2| 0: N/A*/ {4, 0}, /* N_RB_DL [11] */ {8, 0}, /* N_RB_DL [12-19] */ @@ -3529,12 +3793,13 @@ void schedule_PCH(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) {32, 16}, /* N_RB_DL [64-79] */ {48, 16} /* N_RB_DL [80-110] */ }; - uint8_t n_rb_step = 0; - uint8_t n_gap = 0; - uint8_t n_vrb_dl = 0; - uint8_t Lcrbs = 0; - uint16_t rb_bit = 168; /* RB bit number value is unsure */ + uint8_t n_rb_step = 0; + uint8_t n_gap = 0; + uint8_t n_vrb_dl = 0; + uint8_t Lcrbs = 0; + uint16_t rb_bit = 168; /* RB bit number value is unsure */ #endif + start_meas(&eNB->schedule_pch); for (CC_id = 0; CC_id < RC.nb_mac_CC[module_idP]; CC_id++) { @@ -3544,27 +3809,37 @@ void schedule_PCH(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) dl_req = &eNB->DL_req[CC_id].dl_config_request_body; for (uint16_t i = 0; i < MAX_MOBILES_PER_ENB; i++) { - if (UE_PF_PO[CC_id][i].enable_flag != TRUE) { + ue_pf_po = &UE_PF_PO[CC_id][i]; + if (ue_pf_po->enable_flag != TRUE) { continue; } - if (frameP % UE_PF_PO[CC_id][i].T == UE_PF_PO[CC_id][i].PF_min && subframeP == UE_PF_PO[CC_id][i].PO) { + if (frameP % ue_pf_po->T == ue_pf_po->PF_min && subframeP == ue_pf_po->PO) { pcch_sdu_length = mac_rrc_data_req(module_idP, CC_id, frameP, - PCCH, 1, + PCCH, + 1, &cc->PCCH_pdu.payload[0], i); // used for ue index if (pcch_sdu_length == 0) { - LOG_D(MAC, "[eNB %d] Frame %d subframe %d: PCCH not active(size = 0 byte)\n", module_idP, frameP, subframeP); + LOG_D(MAC, "[eNB %d] Frame %d subframe %d: PCCH not active(size = 0 byte)\n", + module_idP, + frameP, + subframeP); continue; } - LOG_D(MAC, "[eNB %d] Frame %d subframe %d: PCCH->PCH CC_id %d UE_id %d, Received %d bytes \n", module_idP, - frameP, subframeP, CC_id, i, pcch_sdu_length); -#ifdef FORMAT1C + LOG_D(MAC, "[eNB %d] Frame %d subframe %d: PCCH->PCH CC_id %d UE_id %d, Received %d bytes \n", + module_idP, + frameP, + subframeP, + CC_id, + i, + pcch_sdu_length); +#ifdef FORMAT1C //NO SIB if ((subframeP == 0 || subframeP == 1 || subframeP == 2 || subframeP == 4 || subframeP == 6 || subframeP == 9) || (subframeP == 5 && ((frameP % 2) != 0 && (frameP % 8) != 1))) { @@ -3657,7 +3932,10 @@ void schedule_PCH(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) } else { /* unexpected: pcch sdb size is over max value*/ LOG_E(MAC,"[eNB %d] Frame %d : PCCH->PCH CC_id %d, Received %d bytes is over max length(256) \n", - module_idP, frameP,CC_id, pcch_sdu_length); + module_idP, + frameP, + CC_id, + pcch_sdu_length); return; } @@ -3740,7 +4018,9 @@ void schedule_PCH(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) #endif dl_config_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu]; - memset((void *) dl_config_pdu, 0, sizeof(nfapi_dl_config_request_pdu_t)); + memset((void *) dl_config_pdu, + 0, + sizeof(nfapi_dl_config_request_pdu_t)); dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu)); #ifdef FORMAT1C @@ -3748,12 +4028,14 @@ void schedule_PCH(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = getRIV(n_vrb_dl/n_rb_step, first_rb/n_rb_step, Lcrbs/n_rb_step); dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.ngap = n_gap; #else - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = NFAPI_DL_DCI_FORMAT_1A; - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.harq_process = 0; - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = 1; // no TPC - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = 1; - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = 1; - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = getRIV(n_rb_dl, first_rb, 4); + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = NFAPI_DL_DCI_FORMAT_1A; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.harq_process = 0; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = 1; // no TPC + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = 1; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = 1; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = getRIV(n_rb_dl, + first_rb, + 4); dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.virtual_resource_block_assignment_flag = 0; #endif dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = 4; @@ -3762,25 +4044,39 @@ void schedule_PCH(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = mcs; - if (!CCE_allocation_infeasible(module_idP, CC_id, 0, subframeP, dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level, P_RNTI)) { - LOG_D(MAC,"Frame %d: Subframe %d : Adding common DCI for P_RNTI\n", frameP,subframeP); + if (!CCE_allocation_infeasible(module_idP, + CC_id, + 0, + subframeP, + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level, + P_RNTI)) { + LOG_D(MAC,"Frame %d: Subframe %d : Adding common DCI for P_RNTI\n", + frameP, + subframeP); dl_req->number_dci++; dl_req->number_pdu++; dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; eNB->DL_req[CC_id].sfn_sf = frameP<<4 | subframeP; eNB->DL_req[CC_id].header.message_id = NFAPI_DL_CONFIG_REQUEST; + dl_config_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu]; - memset((void *)dl_config_pdu,0,sizeof(nfapi_dl_config_request_pdu_t)); + memset((void *)dl_config_pdu, + 0, + sizeof(nfapi_dl_config_request_pdu_t)); dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DLSCH_PDU_TYPE; - dl_config_pdu->pdu_size = (uint8_t)(2+sizeof(nfapi_dl_config_dlsch_pdu)); + dl_config_pdu->pdu_size = (uint8_t)(2 + sizeof(nfapi_dl_config_dlsch_pdu)); dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index = eNB->pdu_index[CC_id]; dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti = 0xFFFE; #ifdef FORMAT1C dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type = 3; // format 1C - dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_block_coding = getRIV(n_vrb_dl/n_rb_step, first_rb/n_rb_step, Lcrbs/n_rb_step); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_block_coding = getRIV(n_vrb_dl / n_rb_step, + first_rb / n_rb_step, + Lcrbs / n_rb_step); #else - dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type = 2; // format 1A/1B/1D - dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_block_coding = getRIV(n_rb_dl, first_rb, 4); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type = 2; // format 1A/1B/1D + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_block_coding = getRIV(n_rb_dl, + first_rb, + 4); dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.virtual_resource_block_assignment_flag = 0; // localized #endif dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.modulation = 2; //QPSK @@ -3811,17 +4107,21 @@ void schedule_PCH(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.initial_transmission_sf_io = 0xFFFF; #endif dl_req->number_pdu++; - eNB->TX_req[CC_id].sfn_sf = (frameP<<4)+subframeP; - TX_req = &eNB->TX_req[CC_id].tx_request_body.tx_pdu_list[eNB->TX_req[CC_id].tx_request_body.number_of_pdus]; + eNB->TX_req[CC_id].sfn_sf = (frameP<<4)+subframeP; + TX_req = &eNB->TX_req[CC_id].tx_request_body.tx_pdu_list[eNB->TX_req[CC_id].tx_request_body.number_of_pdus]; TX_req->pdu_length = pcch_sdu_length; TX_req->pdu_index = eNB->pdu_index[CC_id]++; TX_req->num_segments = 1; TX_req->segments[0].segment_length = pcch_sdu_length; TX_req->segments[0].segment_data = cc[CC_id].PCCH_pdu.payload; - eNB->TX_req[CC_id].tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; + eNB->TX_req[CC_id].tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; eNB->TX_req[CC_id].tx_request_body.number_of_pdus++; } else { - LOG_E(MAC,"[eNB %d] CCid %d Frame %d, subframe %d : Cannot add DCI 1A/1C for Paging\n",module_idP, CC_id, frameP, subframeP); + LOG_E(MAC,"[eNB %d] CCid %d Frame %d, subframe %d : Cannot add DCI 1A/1C for Paging\n", + module_idP, + CC_id, + frameP, + subframeP); continue; } @@ -3837,18 +4137,30 @@ void schedule_PCH(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) 0, 0); LOG_D(OPT,"[eNB %d][PCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n", - module_idP, frameP, CC_id, 0xffff, pcch_sdu_length); + module_idP, + frameP, + CC_id, + 0xffff, + pcch_sdu_length); } - eNB->eNB_stats[CC_id].total_num_pcch_pdu+=1; - eNB->eNB_stats[CC_id].pcch_buffer=pcch_sdu_length; - eNB->eNB_stats[CC_id].total_pcch_buffer+=pcch_sdu_length; - eNB->eNB_stats[CC_id].pcch_mcs=mcs; + eNB->eNB_stats[CC_id].total_num_pcch_pdu++; + eNB->eNB_stats[CC_id].pcch_buffer = pcch_sdu_length; + eNB->eNB_stats[CC_id].total_pcch_buffer += pcch_sdu_length; + eNB->eNB_stats[CC_id].pcch_mcs = mcs; //paging first_rb log LOG_D(MAC,"[eNB %d] Frame %d subframe %d PCH: paging_ue_index %d pcch_sdu_length %d mcs %d first_rb %d\n", - module_idP, frameP, subframeP, UE_PF_PO[CC_id][i].ue_index_value, pcch_sdu_length, mcs, first_rb); + module_idP, + frameP, + subframeP, + ue_pf_po->ue_index_value, + pcch_sdu_length, + mcs, + first_rb); pthread_mutex_lock(&ue_pf_po_mutex); - memset(&UE_PF_PO[CC_id][i], 0, sizeof(UE_PF_PO_t)); + memset(ue_pf_po, + 0, + sizeof(UE_PF_PO_t)); pthread_mutex_unlock(&ue_pf_po_mutex); } } @@ -3859,7 +4171,11 @@ void schedule_PCH(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) return; } -static int slice_priority_compare(const void *_a, const void *_b, void *_c) { +static int +slice_priority_compare(const void *_a, + const void *_b, + void *_c) +{ const int slice_id1 = *(const int *) _a; const int slice_id2 = *(const int *) _b; const module_id_t Mod_id = *(int *) _c; @@ -3872,13 +4188,20 @@ static int slice_priority_compare(const void *_a, const void *_b, void *_c) { return 1; } -void slice_priority_sort(module_id_t Mod_id, int slice_list[MAX_NUM_SLICES]) { +void +slice_priority_sort(module_id_t Mod_id, + int slice_list[MAX_NUM_SLICES]) +{ int i; - - for (i = 0; i < RC.mac[Mod_id]->slice_info.n_dl; ++i) { + int n_dl = RC.mac[Mod_id]->slice_info.n_dl; + for (i = 0; i < n_dl; i++) { slice_list[i] = i; } - qsort_r(slice_list, RC.mac[Mod_id]->slice_info.n_dl, sizeof(int), - slice_priority_compare, &Mod_id); + qsort_r(slice_list, + n_dl, + sizeof(int), + slice_priority_compare, + &Mod_id); + return; } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c index 8698c14b95020b5a9bf98dc12dd20188debd4723..3cc76dd67a72996f09eb8978d98161312ca12f69 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c @@ -295,7 +295,8 @@ void dlsch_scheduler_pre_ue_select_fairRR( CC_id, UE_id, subframeP, - S_DL_NONE); + S_DL_NONE, + rnti); end_flag[CC_id] = 1; break; } @@ -418,7 +419,8 @@ void dlsch_scheduler_pre_ue_select_fairRR( CC_id, UE_id, subframeP, - S_DL_NONE); + S_DL_NONE, + rnti); end_flag[CC_id] = 1; break; } @@ -541,7 +543,8 @@ void dlsch_scheduler_pre_ue_select_fairRR( CC_id, UE_id, subframeP, - S_DL_NONE); + S_DL_NONE, + rnti); end_flag[CC_id] = 1; break; } @@ -810,7 +813,8 @@ schedule_ue_spec_fairRR(module_id_t module_idP, unsigned char ta_len = 0; unsigned char sdu_lcids[NB_RB_MAX], lcid, offset, num_sdus = 0; uint16_t nb_rb, nb_rb_temp, nb_available_rb; - uint16_t TBS, j, sdu_lengths[NB_RB_MAX], rnti, padding = 0, post_padding = 0; + uint16_t TBS, j, sdu_lengths[NB_RB_MAX], padding = 0, post_padding = 0; + rnti_t rnti = 0; unsigned char dlsch_buffer[MAX_DLSCH_PAYLOAD_BYTES]; unsigned char round = 0; unsigned char harq_pid = 0; @@ -1215,8 +1219,11 @@ schedule_ue_spec_fairRR(module_id_t module_idP, } add_ue_dlsch_info(module_idP, - CC_id, UE_id, subframeP, - S_DL_SCHEDULED); + CC_id, + UE_id, + subframeP, + S_DL_SCHEDULED, + rnti); //eNB_UE_stats->dlsch_trials[round]++; UE_list->eNB_UE_stats[CC_id][UE_id]. num_retransmission += 1; @@ -1678,10 +1685,10 @@ schedule_ue_spec_fairRR(module_id_t module_idP, if (opt_enabled == 1) { trace_pdu(DIRECTION_DOWNLINK, (uint8_t *)UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], - TBS, module_idP, WS_RA_RNTI, UE_RNTI(module_idP,UE_id), + TBS, module_idP, WS_RA_RNTI, UE_RNTI(module_idP, UE_id), eNB->frame, eNB->subframe,0,0); LOG_D(OPT,"[eNB %d][DLSCH] CC_id %d Frame %d rnti %x with size %d\n", - module_idP, CC_id, frameP, UE_RNTI(module_idP,UE_id), TBS); + module_idP, CC_id, frameP, UE_RNTI(module_idP, UE_id), TBS); } T(T_ENB_MAC_UE_DL_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), T_INT(rnti), T_INT(frameP), T_INT(subframeP), @@ -1691,7 +1698,8 @@ schedule_ue_spec_fairRR(module_id_t module_idP, CC_id, UE_id, subframeP, - S_DL_SCHEDULED); + S_DL_SCHEDULED, + rnti); // store stats eNB->eNB_stats[CC_id].dlsch_bytes_tx+=sdu_length_total; eNB->eNB_stats[CC_id].dlsch_pdus_tx+=1; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index deb766e7fea813827b7dc04b5daefd3747f6465e..219b288fd38634f1a03b00ce579a21e923c736e6 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -63,7 +63,12 @@ extern uint16_t frame_cnt; extern RAN_CONTEXT_t RC; extern uint8_t nfapi_mode; -int choose(int n, int k) { +//------------------------------------------------------------------------------ +int +choose(int n, + int k) +//------------------------------------------------------------------------------ +{ int res = 1; int res2 = 1; int i; @@ -83,8 +88,14 @@ int choose(int n, int k) { return (res / res2); } +//------------------------------------------------------------------------------ // Patented algorithm from Yang et al, US Patent 2009, "Channel Quality Indexing and Reverse Indexing" -void reverse_index(int N, int M, int r, int *v) { +void reverse_index(int N, + int M, + int r, + int *v) +//------------------------------------------------------------------------------ +{ int BaseValue = 0; int IncreaseValue, ThresholdValue; int sumV; @@ -95,66 +106,90 @@ void reverse_index(int N, int M, int r, int *v) { i = M; while (i > 0 && r > 0) { - IncreaseValue = choose(N - M + 1 - sumV - v[i - 1] + i - 2, i - 1); + IncreaseValue = choose(N - M + 1 - sumV - v[i - 1] + i - 2, + i - 1); ThresholdValue = BaseValue + IncreaseValue; if (r >= ThresholdValue) { v[i - 1]++; BaseValue = ThresholdValue; } else { - r = r - BaseValue; - sumV += v[i - 1]; - i--; + r -= BaseValue; + sumV += v[--i]; BaseValue = 0; } } } -int to_prb(int dl_Bandwidth) { +//------------------------------------------------------------------------------ +int +to_prb(int dl_Bandwidth) +//------------------------------------------------------------------------------ +{ int prbmap[6] = { 6, 15, 25, 50, 75, 100 }; AssertFatal(dl_Bandwidth < 6, "dl_Bandwidth is 0..5\n"); return (prbmap[dl_Bandwidth]); } -int to_rbg(int dl_Bandwidth) { +//------------------------------------------------------------------------------ +int +to_rbg(int dl_Bandwidth) +//------------------------------------------------------------------------------ +{ int rbgmap[6] = { 6, 8, 13, 17, 19, 25 }; AssertFatal(dl_Bandwidth < 6, "dl_Bandwidth is 0..5\n"); return (rbgmap[dl_Bandwidth]); } -int get_phich_resource_times6(COMMON_channels_t *cc) { +//------------------------------------------------------------------------------ +int +get_phich_resource_times6(COMMON_channels_t *cc) +//------------------------------------------------------------------------------ +{ int phichmap[4] = { 1, 3, 6, 12 }; AssertFatal(cc != NULL, "cc is null\n"); AssertFatal(cc->mib != NULL, "cc->mib is null\n"); - AssertFatal((cc->mib->message.phich_Config.phich_Resource >= 0) && - (cc->mib->message.phich_Config.phich_Resource < 4), - "phich_Resource %d not in 0..3\n", - (int) cc->mib->message.phich_Config.phich_Resource); - return (phichmap[cc->mib->message.phich_Config.phich_Resource]); + int phich_Resource = (int) cc->mib->message.phich_Config.phich_Resource; + AssertFatal(phich_Resource >= 0 && phich_Resource < 4, "phich_Resource %d not in 0..3\n", + phich_Resource); + return (phichmap[phich_Resource]); } -uint16_t mac_computeRIV(uint16_t N_RB_DL, uint16_t RBstart, uint16_t Lcrbs) { - uint16_t RIV; - - if (Lcrbs <= (1 + (N_RB_DL >> 1))) RIV = (N_RB_DL * (Lcrbs - 1)) + RBstart; - else RIV = (N_RB_DL * (N_RB_DL + 1 - Lcrbs)) + (N_RB_DL - 1 - RBstart); - - return (RIV); +//------------------------------------------------------------------------------ +uint16_t +mac_computeRIV(uint16_t N_RB_DL, + uint16_t RBstart, + uint16_t Lcrbs) +//------------------------------------------------------------------------------ +{ + if (Lcrbs <= (1 + (N_RB_DL >> 1))) { + return (N_RB_DL * (Lcrbs - 1)) + RBstart; + } + return (N_RB_DL * (N_RB_DL + 1 - Lcrbs)) + (N_RB_DL - 1 - RBstart); } -uint8_t getQm(uint8_t mcs) { +//------------------------------------------------------------------------------ +uint8_t +getQm(uint8_t mcs) +//------------------------------------------------------------------------------ +{ if (mcs < 10) return (2); else if (mcs < 17) return (4); - else return (6); + return (6); } +//------------------------------------------------------------------------------ void get_Msg3alloc(COMMON_channels_t *cc, sub_frame_t current_subframe, frame_t current_frame, frame_t *frame, - sub_frame_t *subframe) { + sub_frame_t *subframe) +//------------------------------------------------------------------------------ +{ // Fill in other TDD Configuration!!!! + int subframeAssignment; + if (cc->tdd_Config == NULL) { // FDD *subframe = current_subframe + 6; @@ -165,7 +200,8 @@ get_Msg3alloc(COMMON_channels_t *cc, *frame = current_frame; } } else { // TDD - if (cc->tdd_Config->subframeAssignment == 1) { + subframeAssignment = (int) cc->tdd_Config->subframeAssignment; + if (subframeAssignment == 1) { switch (current_subframe) { case 0: *subframe = 7; @@ -187,7 +223,7 @@ get_Msg3alloc(COMMON_channels_t *cc, *frame = (current_frame + 1) & 1023; break; } - } else if (cc->tdd_Config->subframeAssignment == 3) { + } else if (subframeAssignment == 3) { switch (current_subframe) { case 0: case 5: @@ -211,7 +247,7 @@ get_Msg3alloc(COMMON_channels_t *cc, *frame = (current_frame + 2) & 1023; break; } - } else if (cc->tdd_Config->subframeAssignment == 4) { + } else if (subframeAssignment == 4) { switch (current_subframe) { case 0: case 4: @@ -232,7 +268,7 @@ get_Msg3alloc(COMMON_channels_t *cc, *frame = (current_frame + 2) & 1023; break; } - } else if (cc->tdd_Config->subframeAssignment == 5) { + } else if (subframeAssignment == 5) { switch (current_subframe) { case 0: case 4: @@ -251,15 +287,20 @@ get_Msg3alloc(COMMON_channels_t *cc, } } } + return; } - - +//------------------------------------------------------------------------------ void get_Msg3allocret(COMMON_channels_t *cc, sub_frame_t current_subframe, frame_t current_frame, - frame_t *frame, sub_frame_t *subframe) { + frame_t *frame, + sub_frame_t *subframe) +//------------------------------------------------------------------------------ +{ + int subframeAssignment; + if (cc->tdd_Config == NULL) { //FDD /* always retransmit in n+8 */ *subframe = current_subframe + 8; @@ -271,32 +312,36 @@ get_Msg3allocret(COMMON_channels_t *cc, *frame = current_frame; } } else { - if (cc->tdd_Config->subframeAssignment == 1) { + subframeAssignment = (int) cc->tdd_Config->subframeAssignment; + if (subframeAssignment == 1) { // original PUSCH in 2, PHICH in 6 (S), ret in 2 // original PUSCH in 3, PHICH in 9, ret in 3 // original PUSCH in 7, PHICH in 1 (S), ret in 7 // original PUSCH in 8, PHICH in 4, ret in 8 *frame = (current_frame + 1) & 1023; - } else if (cc->tdd_Config->subframeAssignment == 3) { + } else if (subframeAssignment == 3) { // original PUSCH in 2, PHICH in 8, ret in 2 next frame // original PUSCH in 3, PHICH in 9, ret in 3 next frame // original PUSCH in 4, PHICH in 0, ret in 4 next frame *frame = (current_frame + 1) & 1023; - } else if (cc->tdd_Config->subframeAssignment == 4) { + } else if (subframeAssignment == 4) { // original PUSCH in 2, PHICH in 8, ret in 2 next frame // original PUSCH in 3, PHICH in 9, ret in 3 next frame *frame = (current_frame + 1) & 1023; - } else if (cc->tdd_Config->subframeAssignment == 5) { + } else if (subframeAssignment == 5) { // original PUSCH in 2, PHICH in 8, ret in 2 next frame *frame = (current_frame + 1) & 1023; } } + return; } +//------------------------------------------------------------------------------ uint8_t subframe2harqpid(COMMON_channels_t *cc, frame_t frame, sub_frame_t subframe) +//------------------------------------------------------------------------------ { uint8_t ret = 255; AssertFatal(cc != NULL, "cc is null\n"); @@ -306,72 +351,77 @@ subframe2harqpid(COMMON_channels_t *cc, } else { switch (cc->tdd_Config->subframeAssignment) { case 1: - switch (subframe) { - case 2: - case 3: - ret = (subframe - 2); - break; + if (subframe == 2 || subframe == 3 || subframe == 7 || subframe == 8) { + switch (subframe) { + case 2: + case 3: + ret = (subframe - 2); + break; - case 7: - case 8: - ret = (subframe - 5); - break; + case 7: + case 8: + ret = (subframe - 5); + break; - default: - AssertFatal(1 == 0, "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", - subframe, (int) cc->tdd_Config->subframeAssignment); - break; + default: + AssertFatal(1 == 0, "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframe, + (int) cc->tdd_Config->subframeAssignment); + break; + } } break; case 2: - AssertFatal((subframe == 2) || (subframe == 7), - "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", - subframe, (int) cc->tdd_Config->subframeAssignment); + AssertFatal(subframe == 2 || subframe == 7, "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframe, + (int) cc->tdd_Config->subframeAssignment); ret = (subframe / 7); break; case 3: - AssertFatal((subframe > 1) && (subframe < 5), - "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", - subframe, (int) cc->tdd_Config->subframeAssignment); + AssertFatal(subframe > 1 && subframe < 5, "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframe, + (int) cc->tdd_Config->subframeAssignment); ret = (subframe - 2); break; case 4: - AssertFatal((subframe > 1) && (subframe < 4), - "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", - subframe, (int) cc->tdd_Config->subframeAssignment); + AssertFatal(subframe > 1 && subframe < 4, "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframe, + (int) cc->tdd_Config->subframeAssignment); ret = (subframe - 2); break; case 5: - AssertFatal(subframe == 2, - "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", - subframe, (int) cc->tdd_Config->subframeAssignment); + AssertFatal(subframe == 2, "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframe, + (int) cc->tdd_Config->subframeAssignment); ret = (subframe - 2); break; default: - AssertFatal(1 == 0, - "subframe2_harq_pid, Unsupported TDD mode %d\n", + AssertFatal(1 == 0, "subframe2_harq_pid, Unsupported TDD mode %d\n", (int) cc->tdd_Config->subframeAssignment); break; } } + return ret; } +//------------------------------------------------------------------------------ uint8_t get_Msg3harqpid(COMMON_channels_t *cc, - frame_t frame, sub_frame_t current_subframe) { + frame_t frame, + sub_frame_t current_subframe) +//------------------------------------------------------------------------------ +{ uint8_t ul_subframe = 0; uint32_t ul_frame = 0; if (cc->tdd_Config == NULL) { // FDD - ul_subframe = - (current_subframe > - 3) ? (current_subframe - 4) : (current_subframe + 6); + ul_subframe = (current_subframe > 3) ? (current_subframe - 4) : (current_subframe + 6); ul_frame = (current_subframe > 3) ? ((frame + 1) & 1023) : frame; } else { switch (cc->tdd_Config->subframeAssignment) { @@ -435,60 +485,80 @@ get_Msg3harqpid(COMMON_channels_t *cc, break; default: - LOG_E(PHY, - "get_Msg3_harq_pid: Unsupported TDD configuration %d\n", + LOG_E(PHY, "get_Msg3_harq_pid: Unsupported TDD configuration %d\n", (int) cc->tdd_Config->subframeAssignment); - AssertFatal(1 == 0, - "get_Msg3_harq_pid: Unsupported TDD configuration"); + AssertFatal(1 == 0, "get_Msg3_harq_pid: Unsupported TDD configuration"); break; } } - return (subframe2harqpid(cc, ul_frame, ul_subframe)); + return (subframe2harqpid(cc, + ul_frame, + ul_subframe)); } +//------------------------------------------------------------------------------ uint32_t -pdcchalloc2ulframe(COMMON_channels_t *ccP, uint32_t frame, uint8_t n) { - uint32_t ul_frame; - - if ((ccP->tdd_Config) && (ccP->tdd_Config->subframeAssignment == 1) && ((n == 1) || (n == 6))) // tdd_config 0,1 SF 1,5 - ul_frame = (frame + (n == 1 ? 0 : 1)); - else if ((ccP->tdd_Config) && - (ccP->tdd_Config->subframeAssignment == 6) && - ((n == 0) || (n == 1) || (n == 5) || (n == 6))) - ul_frame = (frame + (n >= 5 ? 1 : 0)); - else if ((ccP->tdd_Config) && (ccP->tdd_Config->subframeAssignment == 6) && (n == 9)) // tdd_config 6 SF 9 - ul_frame = (frame + 1); - else - ul_frame = (frame + (n >= 6 ? 1 : 0)); +pdcchalloc2ulframe(COMMON_channels_t *ccP, + uint32_t frame, + uint8_t n) +//------------------------------------------------------------------------------ +{ + uint32_t ul_frame = (frame + (n >= 6 ? 1 : 0)); - LOG_D(PHY, "frame %d subframe %d: PUSCH frame = %d\n", frame, n, + if (ccP->tdd_Config) { + if (ccP->tdd_Config->subframeAssignment == 1) { + if (n == 1 || n == 6) { + ul_frame = (frame + (n == 1 ? 0 : 1)); + } + } else if (ccP->tdd_Config->subframeAssignment == 6) { + if (n == 0 || n == 1 || n == 5 || n == 6) { + ul_frame = (frame + (n >= 5 ? 1 : 0)); + } else if (n == 9) { + ul_frame = (frame + 1); + } + } + } + LOG_D(PHY, "frame %d subframe %d: PUSCH frame = %d\n", + frame, + n, ul_frame); + return ul_frame; } -uint8_t pdcchalloc2ulsubframe(COMMON_channels_t *ccP, uint8_t n) { +//------------------------------------------------------------------------------ +uint8_t +pdcchalloc2ulsubframe(COMMON_channels_t *ccP, + uint8_t n) +//------------------------------------------------------------------------------ +{ uint8_t ul_subframe; - if ((ccP->tdd_Config) && (ccP->tdd_Config->subframeAssignment == 1) && ((n == 1) || (n == 6))) // tdd_config 0,1 SF 1,5 + if (ccP->tdd_Config && ccP->tdd_Config->subframeAssignment == 1 && (n == 1 || n == 6)) // tdd_config 0,1 SF 1,5 ul_subframe = ((n + 6) % 10); - else if ((ccP->tdd_Config) && - (ccP->tdd_Config->subframeAssignment == 6) && - ((n == 0) || (n == 1) || (n == 5) || (n == 6))) + else if (ccP->tdd_Config && ccP->tdd_Config->subframeAssignment == 6 && (n == 0 || n == 1 || n == 5 || n == 6)) ul_subframe = ((n + 7) % 10); - else if ((ccP->tdd_Config) && (ccP->tdd_Config->subframeAssignment == 6) && (n == 9)) // tdd_config 6 SF 9 + else if (ccP->tdd_Config && ccP->tdd_Config->subframeAssignment == 6 && n == 9) // tdd_config 6 SF 9 ul_subframe = ((n + 5) % 10); else ul_subframe = ((n + 4) % 10); - LOG_D(PHY, "subframe %d: PUSCH subframe = %d\n", n, ul_subframe); + LOG_D(PHY, "subframe %d: PUSCH subframe = %d\n", + n, + ul_subframe); return ul_subframe; } -int is_UL_sf(COMMON_channels_t *ccP, sub_frame_t subframeP) { +//------------------------------------------------------------------------------ +int +is_UL_sf(COMMON_channels_t *ccP, + sub_frame_t subframeP) +//------------------------------------------------------------------------------ +{ // if FDD return dummy value if (ccP->tdd_Config == NULL) - return (0); + return 0; switch (ccP->tdd_Config->subframeAssignment) { case 1: @@ -497,19 +567,16 @@ int is_UL_sf(COMMON_channels_t *ccP, sub_frame_t subframeP) { case 4: case 5: case 9: - return (0); - break; + return 0; case 2: case 3: case 7: case 8: - return (1); - break; + return 1; default: - return (0); - break; + return 0; } break; @@ -550,34 +617,43 @@ int is_UL_sf(COMMON_channels_t *ccP, sub_frame_t subframeP) { subframeP, (int) ccP->tdd_Config->subframeAssignment); break; } + return 0; } -int is_S_sf(COMMON_channels_t *ccP, sub_frame_t subframeP) { +//------------------------------------------------------------------------------ +int +is_S_sf(COMMON_channels_t *ccP, + sub_frame_t subframeP) +//------------------------------------------------------------------------------ +{ // if FDD return dummy value if (ccP->tdd_Config == NULL) - return (0); + return 0; switch (subframeP) { case 1: - return (1); - break; + return 1; case 6: - if(ccP->tdd_Config->subframeAssignment == 0 || ccP->tdd_Config->subframeAssignment == 1 - || ccP->tdd_Config->subframeAssignment == 2 || ccP->tdd_Config->subframeAssignment == 6) - return (1); + if (ccP->tdd_Config->subframeAssignment == 0 || ccP->tdd_Config->subframeAssignment == 1 || + ccP->tdd_Config->subframeAssignment == 2 || ccP->tdd_Config->subframeAssignment == 6) + return 1; break; default: - return (0); break; } return 0; } -uint8_t ul_subframe2_k_phich(COMMON_channels_t *cc, sub_frame_t ul_subframe) { +//------------------------------------------------------------------------------ +uint8_t +ul_subframe2_k_phich(COMMON_channels_t *cc, + sub_frame_t ul_subframe) +//------------------------------------------------------------------------------ +{ if(cc->tdd_Config) { //TODO fill other tdd config switch(cc->tdd_Config->subframeAssignment) { case 0: @@ -588,19 +664,11 @@ uint8_t ul_subframe2_k_phich(COMMON_channels_t *cc, sub_frame_t ul_subframe) { return 4; else if(ul_subframe == 3 || ul_subframe == 8) return 6; - else return 255; - - break; + return 255; case 2: - break; - case 3: - break; - case 4: - break; - case 5: break; } @@ -609,162 +677,131 @@ uint8_t ul_subframe2_k_phich(COMMON_channels_t *cc, sub_frame_t ul_subframe) { return 4; //idk sf_ahead? } -uint16_t get_pucch1_absSF(COMMON_channels_t *cc, uint16_t dlsch_absSF) { +//------------------------------------------------------------------------------ +uint16_t +get_pucch1_absSF(COMMON_channels_t *cc, + uint16_t dlsch_absSF) +//------------------------------------------------------------------------------ +{ uint16_t sf, f, nextf; + LTE_TDD_Config_t *tdd_Config = cc->tdd_Config; - if (cc->tdd_Config == NULL) { //FDD n+4 - return ((dlsch_absSF + 4) % 10240); - } else { - sf = dlsch_absSF % 10; - f = dlsch_absSF / 10; - nextf = (f + 1) & 1023; + if (tdd_Config == NULL) { //FDD n+4 + return (dlsch_absSF + 4) % 10240; + } - switch (cc->tdd_Config->subframeAssignment) { - case 0: - if ((sf == 0) || (sf == 5)) - return ((10 * f) + sf + 4)% 10240; // ACK/NAK in SF 4,9 same frame - else if (sf == 6) - return ((10 * nextf) + 2)% 10240; // ACK/NAK in SF 2 next frame - else if (sf == 1) - return ((10 * f) + 7)% 10240; // ACK/NAK in SF 7 same frame - else - AssertFatal(1 == 0, - "Impossible dlsch subframe %d for TDD configuration 0\n", - sf); + sf = dlsch_absSF % 10; + f = dlsch_absSF / 10; + nextf = (f + 1) & 1023; - break; + switch (tdd_Config->subframeAssignment) { + case 0: + if (sf == 0 || sf == 5) + return ((10 * f) + sf + 4) % 10240; // ACK/NAK in SF 4,9 same frame + if (sf == 6) + return ((10 * nextf) + 2) % 10240; // ACK/NAK in SF 2 next frame + if (sf == 1) + return ((10 * f) + 7) % 10240; // ACK/NAK in SF 7 same frame - case 1: - if ((sf == 5) || (sf == 6)) - return ((10 * nextf) + 2)% 10240; // ACK/NAK in SF 2 next frame - else if (sf == 9) - return ((10 * nextf) + 3)% 10240; // ACK/NAK in SF 3 next frame - else if ((sf == 0) || (sf == 1)) - return ((10 * f) + 7)% 10240; // ACK/NAK in SF 7 same frame - else if (sf == 4) - return ((10 * f) + 8)% 10240; // ACK/NAK in SF 8 same frame - else - AssertFatal(1 == 0, - "Impossible dlsch subframe %d for TDD configuration 1\n", - sf); + break; - break; + case 1: + if (sf == 5 || sf == 6) + return ((10 * nextf) + 2) % 10240; // ACK/NAK in SF 2 next frame + if (sf == 9) + return ((10 * nextf) + 3) % 10240; // ACK/NAK in SF 3 next frame + if ((sf == 0) || (sf == 1)) + return ((10 * f) + 7) % 10240; // ACK/NAK in SF 7 same frame + if (sf == 4) + return ((10 * f) + 8) % 10240; // ACK/NAK in SF 8 same frame - case 2: - if ((sf == 4) || (sf == 5) || (sf == 6) || (sf == 8)) - return ((10 * nextf) + 2)% 10240; // ACK/NAK in SF 2 next frame - else if (sf == 9) - return ((10 * nextf) + 7)% 10240; // ACK/NAK in SF 7 next frame - else if ((sf == 0) || (sf == 1) || (sf == 3)) - return ((10 * f) + 7)% 10240; // ACK/NAK in SF 7 same frame - else - AssertFatal(1 == 0, - "Impossible dlsch subframe %d for TDD configuration 2\n", - sf); + break; - break; + case 2: + if (sf == 4 || sf == 5 || sf == 6 || sf == 8) + return ((10 * nextf) + 2) % 10240; // ACK/NAK in SF 2 next frame + if (sf == 9) + return ((10 * nextf) + 7) % 10240; // ACK/NAK in SF 7 next frame + if (sf == 0 || sf == 1 || sf == 3) + return ((10 * f) + 7)% 10240; // ACK/NAK in SF 7 same frame - case 3: - if ((sf == 5) || (sf == 6) || (sf == 7) || (sf == 8) - || (sf == 9)) - return ((10 * nextf) + ((sf-1) >> 1))% 10240; // ACK/NAK in 2,3,4 resp. next frame - else if (sf == 1) - return ((10 * nextf) + 2)% 10240; // ACK/NAK in 2 next frame - else if (sf == 0) - return ((10 * f) + 4)% 10240; // ACK/NAK in 4 same frame - else - AssertFatal(1 == 0, - "Impossible dlsch subframe %d for TDD configuration 3\n", - sf); + break; - break; + case 3: + if (sf == 5 || sf == 6 || sf == 7 || sf == 8 || sf == 9) + return ((10 * nextf) + ((sf - 1) >> 1)) % 10240; // ACK/NAK in 2,3,4 resp. next frame + if (sf == 1) + return ((10 * nextf) + 2) % 10240; // ACK/NAK in 2 next frame + if (sf == 0) + return ((10 * f) + 4) % 10240; // ACK/NAK in 4 same frame - case 4: - if ((sf == 6) || (sf == 7) || (sf == 8) || (sf == 9)) - return (((10 * nextf) + 3) % 10240); // ACK/NAK in SF 3 next frame - else if ((sf == 0) || (sf == 1) || (sf == 4) || (sf == 5)) - return (((10 * nextf) + 2) % 10240); // ACK/NAK in SF 2 next frame - else - AssertFatal(1 == 0, - "Impossible dlsch subframe %d for TDD configuration 4\n", - sf); + break; - break; + case 4: + if (sf == 6 || sf == 7 || sf == 8 || sf == 9) + return ((10 * nextf) + 3) % 10240; // ACK/NAK in SF 3 next frame + else if (sf == 0 || sf == 1 || sf == 4 || sf == 5) + return ((10 * nextf) + 2) % 10240; // ACK/NAK in SF 2 next frame - case 5: - if ((sf == 0) || (sf == 1) || (sf == 3) || (sf == 4) - || (sf == 5) || (sf == 6) || (sf == 7) || (sf == 8)) - return (((10 * nextf) + 2) % 10240); // ACK/NAK in SF 3 next frame - else if (sf == 9) - return (((10 * (1 + nextf)) + 2) % 10240); // ACK/NAK in SF 2 next frame - else - AssertFatal(1 == 0, - "Impossible dlsch subframe %d for TDD configuration 5\n", - sf); + break; - break; + case 5: + if (sf == 0 || sf == 1 || sf == 3 || sf == 4 || sf == 5 || sf == 6 || sf == 7 || sf == 8) + return ((10 * nextf) + 2) % 10240; // ACK/NAK in SF 3 next frame + if (sf == 9) + return ((10 * (1 + nextf)) + 2) % 10240; // ACK/NAK in SF 2 next frame - case 6: - if ((sf == 5) || (sf == 6)) - return ((10 * f) + sf + 7)% 10240; // ACK/NAK in SF 2,3 next frame - else if (sf == 9) - return ((10 * nextf) + 4)% 10240; // ACK/NAK in SF 4 next frame - else if ((sf == 1) || (sf == 0)) - return ((10 * f) + sf + 7)% 10240; // ACK/NAK in SF 7 same frame - else - AssertFatal(1 == 0, - "Impossible dlsch subframe %d for TDD configuration 6\n", - sf); + break; - break; + case 6: + if (sf == 5 || sf == 6) + return ((10 * f) + sf + 7) % 10240; // ACK/NAK in SF 2,3 next frame + if (sf == 9) + return ((10 * nextf) + 4) % 10240; // ACK/NAK in SF 4 next frame + if (sf == 1 || sf == 0) + return ((10 * f) + sf + 7) % 10240; // ACK/NAK in SF 7 same frame - default: - AssertFatal(1 == 0, "Illegal TDD subframe Assigment %d\n", - (int) cc->tdd_Config->subframeAssignment); - break; - } - } + break; + default: + AssertFatal(1 == 0, "Illegal TDD subframe Assigment %ld\n", + tdd_Config->subframeAssignment); + return 0; + } + AssertFatal(1 == 0, "Shouldn't get here\n"); } +//------------------------------------------------------------------------------ void -get_srs_pos(COMMON_channels_t *cc, uint16_t isrs, - uint16_t *psrsPeriodicity, uint16_t *psrsOffset) { +get_srs_pos(COMMON_channels_t *cc, + uint16_t isrs, + uint16_t *psrsPeriodicity, + uint16_t *psrsOffset) +//------------------------------------------------------------------------------ +{ if (cc->tdd_Config) { // TDD AssertFatal(isrs >= 10, "2 ms SRS periodicity not supported"); - if ((isrs > 9) && (isrs < 15)) { + if (isrs > 9 && isrs < 15) { *psrsPeriodicity = 5; *psrsOffset = isrs - 10; - } - - if ((isrs > 14) && (isrs < 25)) { + } else if (isrs > 14 && isrs < 25) { *psrsPeriodicity = 10; *psrsOffset = isrs - 15; - } - - if ((isrs > 24) && (isrs < 45)) { + } else if (isrs > 24 && isrs < 45) { *psrsPeriodicity = 20; *psrsOffset = isrs - 25; - } - - if ((isrs > 44) && (isrs < 85)) { + } else if (isrs > 44 && isrs < 85) { *psrsPeriodicity = 40; *psrsOffset = isrs - 45; - } - - if ((isrs > 84) && (isrs < 165)) { + } else if (isrs > 84 && isrs < 165) { *psrsPeriodicity = 80; *psrsOffset = isrs - 85; - } - - if ((isrs > 164) && (isrs < 325)) { + } else if (isrs > 164 && isrs < 325) { *psrsPeriodicity = 160; *psrsOffset = isrs - 165; - } - - if ((isrs > 324) && (isrs < 645)) { + } else if (isrs > 324 && isrs < 645) { *psrsPeriodicity = 320; *psrsOffset = isrs - 325; } @@ -775,56 +812,46 @@ get_srs_pos(COMMON_channels_t *cc, uint16_t isrs, if (isrs < 2) { *psrsPeriodicity = 2; *psrsOffset = isrs; - } - - if ((isrs > 1) && (isrs < 7)) { + } else if (isrs > 1 && isrs < 7) { *psrsPeriodicity = 5; *psrsOffset = isrs - 2; - } - - if ((isrs > 6) && (isrs < 17)) { + } else if (isrs > 6 && isrs < 17) { *psrsPeriodicity = 10; *psrsOffset = isrs - 7; - } - - if ((isrs > 16) && (isrs < 37)) { + } else if (isrs > 16 && isrs < 37) { *psrsPeriodicity = 20; *psrsOffset = isrs - 17; - } - - if ((isrs > 36) && (isrs < 77)) { + } else if (isrs > 36 && isrs < 77) { *psrsPeriodicity = 40; *psrsOffset = isrs - 37; - } - - if ((isrs > 76) && (isrs < 157)) { + } else if (isrs > 76 && isrs < 157) { *psrsPeriodicity = 80; *psrsOffset = isrs - 77; - } - - if ((isrs > 156) && (isrs < 317)) { + } else if (isrs > 156 && isrs < 317) { *psrsPeriodicity = 160; *psrsOffset = isrs - 157; - } - - if ((isrs > 316) && (isrs < 637)) { + } else if (isrs > 316 && isrs < 637) { *psrsPeriodicity = 320; *psrsOffset = isrs - 317; } AssertFatal(isrs <= 636, "Isrs out of range %d>636\n", isrs); } + return; } +//------------------------------------------------------------------------------ void get_csi_params(COMMON_channels_t *cc, struct LTE_CQI_ReportPeriodic *cqi_ReportPeriodic, - uint16_t *Npd, uint16_t *N_OFFSET_CQI, int *H) { - AssertFatal(cqi_ReportPeriodic != NULL, - "cqi_ReportPeriodic is null!\n"); + uint16_t *Npd, + uint16_t *N_OFFSET_CQI, + int *H) +//------------------------------------------------------------------------------ +{ + AssertFatal(cqi_ReportPeriodic != NULL, "cqi_ReportPeriodic is null!\n"); - uint16_t cqi_PMI_ConfigIndex = - cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex; + uint16_t cqi_PMI_ConfigIndex = cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex; uint8_t Jtab[6] = { 0, 2, 2, 3, 4, 4 }; if (cc->tdd_Config == NULL) { //FDD @@ -887,71 +914,58 @@ get_csi_params(COMMON_channels_t *cc, } // get H - if (cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic. - present == - LTE_CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_subbandCQI) - *H = 1 + - (Jtab[cc->mib->message.dl_Bandwidth] * - cqi_ReportPeriodic->choice.setup. - cqi_FormatIndicatorPeriodic.choice.subbandCQI.k); - else + if (cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.present == LTE_CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_subbandCQI) { + *H = 1 + (Jtab[cc->mib->message.dl_Bandwidth] * cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.choice.subbandCQI.k); + } else { *H = 1; + } + return; } +//------------------------------------------------------------------------------ uint8_t -get_dl_cqi_pmi_size_pusch(COMMON_channels_t *cc, uint8_t tmode, +get_dl_cqi_pmi_size_pusch(COMMON_channels_t *cc, + uint8_t tmode, uint8_t ri, - LTE_CQI_ReportModeAperiodic_t * - cqi_ReportModeAperiodic) { + LTE_CQI_ReportModeAperiodic_t *cqi_ReportModeAperiodic) +//------------------------------------------------------------------------------ +{ int Ntab[6] = { 0, 4, 7, 9, 10, 13 }; int N = Ntab[cc->mib->message.dl_Bandwidth]; int Ltab_uesel[6] = { 0, 6, 9, 13, 15, 18 }; int L = Ltab_uesel[cc->mib->message.dl_Bandwidth]; - AssertFatal(cqi_ReportModeAperiodic != NULL, - "cqi_ReportPeriodic is null!\n"); + + AssertFatal(cqi_ReportModeAperiodic != NULL, "cqi_ReportPeriodic is null!\n"); switch (*cqi_ReportModeAperiodic) { case LTE_CQI_ReportModeAperiodic_rm12: - AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 - || tmode == 10, - "Illegal TM (%d) for CQI_ReportModeAperiodic_rm12\n", + AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 || tmode == 10, "Illegal TM (%d) for CQI_ReportModeAperiodic_rm12\n", tmode); - AssertFatal(cc->p_eNB <= 4, - "only up to 4 antenna ports supported here\n"); + AssertFatal(cc->p_eNB <= 4, "only up to 4 antenna ports supported here\n"); if (ri == 1 && cc->p_eNB == 2) return (4 + (N << 1)); - else if (ri == 2 && cc->p_eNB == 2) + if (ri == 2 && cc->p_eNB == 2) return (8 + N); - else if (ri == 1 && cc->p_eNB == 4) + if (ri == 1 && cc->p_eNB == 4) return (4 + (N << 2)); - else if (ri > 1 && cc->p_eNB == 4) + if (ri > 1 && cc->p_eNB == 4) return (8 + (N << 2)); break; case LTE_CQI_ReportModeAperiodic_rm20: // Table 5.2.2.6.3-1 (36.212) - AssertFatal(tmode == 1 || tmode == 2 || tmode == 3 || tmode == 7 - || tmode == 9 - || tmode == 10, - "Illegal TM (%d) for CQI_ReportModeAperiodic_rm20\n", + AssertFatal(tmode == 1 || tmode == 2 || tmode == 3 || tmode == 7 || tmode == 9 || tmode == 10, "Illegal TM (%d) for CQI_ReportModeAperiodic_rm20\n", tmode); - AssertFatal(tmode != 9 - && tmode != 10, - "TM9/10 will be handled later for CQI_ReportModeAperiodic_rm20\n"); + AssertFatal(tmode != 9 && tmode != 10, "TM9/10 will be handled later for CQI_ReportModeAperiodic_rm20\n"); return (4 + 2 + L); - break; case LTE_CQI_ReportModeAperiodic_rm22: // Table 5.2.2.6.3-2 (36.212) - AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 - || tmode == 10, - "Illegal TM (%d) for CQI_ReportModeAperiodic_rm22\n", + AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 || tmode == 10, "Illegal TM (%d) for CQI_ReportModeAperiodic_rm22\n", tmode); - AssertFatal(tmode != 9 - && tmode != 10, - "TM9/10 will be handled later for CQI_ReportModeAperiodic_rm22\n"); + AssertFatal(tmode != 9 && tmode != 10, "TM9/10 will be handled later for CQI_ReportModeAperiodic_rm22\n"); if (ri == 1 && cc->p_eNB == 2) return (4 + 2 + 0 + 0 + L + 4); @@ -969,98 +983,84 @@ get_dl_cqi_pmi_size_pusch(COMMON_channels_t *cc, uint8_t tmode, case LTE_CQI_ReportModeAperiodic_rm30: // Table 5.2.2.6.2-1 (36.212) - AssertFatal(tmode == 1 || tmode == 2 || tmode == 3 || tmode == 7 - || tmode == 8 || tmode == 9 - || tmode == 10, + AssertFatal(tmode == 1 || tmode == 2 || tmode == 3 || tmode == 7 || tmode == 8 || tmode == 9 || tmode == 10, "Illegal TM (%d) for CQI_ReportModeAperiodic_rm30\n", tmode); - AssertFatal(tmode != 8 && tmode != 9 - && tmode != 10, - "TM8/9/10 will be handled later for CQI_ReportModeAperiodic_rm30\n"); + AssertFatal(tmode != 8 && tmode != 9 && tmode != 10, "TM8/9/10 will be handled later for CQI_ReportModeAperiodic_rm30\n"); return (4 + (N << 1)); - break; case LTE_CQI_ReportModeAperiodic_rm31: // Table 5.2.2.6.2-2 (36.212) - AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 - || tmode == 10, - "Illegal TM (%d) for CQI_ReportModeAperiodic_rm31\n", + AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 || tmode == 10, "Illegal TM (%d) for CQI_ReportModeAperiodic_rm31\n", tmode); - AssertFatal(tmode != 8 && tmode != 9 - && tmode != 10, - "TM8/9/10 will be handled later for CQI_ReportModeAperiodic_rm31\n"); + AssertFatal(tmode != 8 && tmode != 9 && tmode != 10, "TM8/9/10 will be handled later for CQI_ReportModeAperiodic_rm31\n"); if (ri == 1 && cc->p_eNB == 2) return (4 + (N << 1) + 0 + 0 + 2); - else if (ri == 2 && cc->p_eNB == 2) + if (ri == 2 && cc->p_eNB == 2) return (4 + (N << 1) + 4 + (N << 1) + 1); - else if (ri == 1 && cc->p_eNB == 4) + if (ri == 1 && cc->p_eNB == 4) return (4 + (N << 1) + 0 + 0 + 4); - else if (ri >= 2 && cc->p_eNB == 4) + if (ri >= 2 && cc->p_eNB == 4) return (4 + (N << 1) + 4 + (N << 1) + 4); break; -#if (LTE_RRC_VERSION >= MAKE_VERSION(12, 5, 0)) +#if (LTE_RRC_VERSION >= MAKE_VERSION(12, 5, 0)) case LTE_CQI_ReportModeAperiodic_rm32_v1250: - AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 - || tmode == 10, - "Illegal TM (%d) for CQI_ReportModeAperiodic_rm32\n", + AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 || tmode == 10, "Illegal TM (%d) for CQI_ReportModeAperiodic_rm32\n", tmode); - AssertFatal(1 == 0, - "CQI_ReportModeAperiodic_rm32_v1250 not supported yet\n"); + AssertFatal(1 == 0, "CQI_ReportModeAperiodic_rm32_v1250 not supported yet\n"); break; case LTE_CQI_ReportModeAperiodic_rm10_v1310: // Table 5.2.2.6.1-1F/G (36.212) if (ri == 1) - return (4); // F - else - return (7); // G - - break; + return 4; // F + return 7; // G case LTE_CQI_ReportModeAperiodic_rm11_v1310: // Table 5.2.2.6.1-1H (36.212) - AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 - || tmode == 10, - "Illegal TM (%d) for CQI_ReportModeAperiodic_rm11\n", + AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 || tmode == 10, "Illegal TM (%d) for CQI_ReportModeAperiodic_rm11\n", tmode); - AssertFatal(cc->p_eNB <= 4, - "only up to 4 antenna ports supported here\n"); + AssertFatal(cc->p_eNB <= 4, "only up to 4 antenna ports supported here\n"); if (ri == 1 && cc->p_eNB == 2) return (4 + 0 + 2); - else if (ri == 2 && cc->p_eNB == 2) + if (ri == 2 && cc->p_eNB == 2) return (4 + 4 + 1); - else if (ri == 1 && cc->p_eNB == 4) + if (ri == 1 && cc->p_eNB == 4) return (4 + 0 + 4); - else if (ri > 1 && cc->p_eNB == 4) + if (ri > 1 && cc->p_eNB == 4) return (4 + 4 + 4); break; #endif /* #if (LTE_RRC_VERSION >= MAKE_VERSION(12, 5, 0)) */ + } AssertFatal(1 == 0, "Shouldn't get here\n"); - return (0); + return 0; } +//------------------------------------------------------------------------------ uint8_t -get_rel8_dl_cqi_pmi_size(UE_sched_ctrl *sched_ctl, int CC_idP, - COMMON_channels_t *cc, uint8_t tmode, - struct LTE_CQI_ReportPeriodic *cqi_ReportPeriodic) { +get_rel8_dl_cqi_pmi_size(UE_sched_ctrl *sched_ctl, + int CC_idP, + COMMON_channels_t *cc, + uint8_t tmode, + struct LTE_CQI_ReportPeriodic *cqi_ReportPeriodic) +//------------------------------------------------------------------------------ +{ int no_pmi = 0; // Ltab[6] = {0,log2(15/4/2),log2(25/4/2),log2(50/6/3),log2(75/8/4),log2(100/8/4)}; uint8_t Ltab[6] = { 0, 1, 2, 2, 2, 2 }; uint8_t ri = sched_ctl->periodic_ri_received[CC_idP]; - AssertFatal(cqi_ReportPeriodic != NULL, - "cqi_ReportPeriodic is null!\n"); - AssertFatal(cqi_ReportPeriodic->present != LTE_CQI_ReportPeriodic_PR_NOTHING, - "cqi_ReportPeriodic->present == CQI_ReportPeriodic_PR_NOTHING!\n"); - AssertFatal(cqi_ReportPeriodic->choice. - setup.cqi_FormatIndicatorPeriodic.present != LTE_CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_NOTHING, + + AssertFatal(cqi_ReportPeriodic != NULL, "cqi_ReportPeriodic is null!\n"); + AssertFatal(cqi_ReportPeriodic->present != LTE_CQI_ReportPeriodic_PR_NOTHING, "cqi_ReportPeriodic->present == CQI_ReportPeriodic_PR_NOTHING!\n"); + AssertFatal(cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.present != LTE_CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_NOTHING, "cqi_ReportPeriodic->cqi_FormatIndicatorPeriodic.choice.setup.present == CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_NOTHING!\n"); switch (tmode) { @@ -1074,32 +1074,32 @@ get_rel8_dl_cqi_pmi_size(UE_sched_ctrl *sched_ctl, int CC_idP, default: no_pmi = 0; + break; } - if ((cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.present == LTE_CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_widebandCQI) - || (sched_ctl->feedback_cnt[CC_idP] == 0)) { + if (cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.present == LTE_CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_widebandCQI || + sched_ctl->feedback_cnt[CC_idP] == 0) { // send wideband report every opportunity if wideband reporting mode is selected, else every H opportunities - if (no_pmi == 1) return (4); - else if ((cc->p_eNB == 2) && (ri == 1)) return (6); - else if ((cc->p_eNB == 2) && (ri == 2)) return (8); - else if ((cc->p_eNB == 4) && (ri == 1)) return (8); - else if ((cc->p_eNB == 4) && (ri == 2)) return (11); - else - AssertFatal(1 == 0, - "illegal combination p %d, ri %d, no_pmi %d\n", - cc->p_eNB, ri, no_pmi); + if (no_pmi == 1) return 4; + if (cc->p_eNB == 2 && ri == 1) return 6; + if (cc->p_eNB == 2 && ri == 2) return 8; + if (cc->p_eNB == 4 && ri == 1) return 8; + if (cc->p_eNB == 4 && ri == 2) return 11; + AssertFatal(1 == 0, "illegal combination p %d, ri %d, no_pmi %d\n", + cc->p_eNB, + ri, + no_pmi); } else if (cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.present == LTE_CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_subbandCQI) { - if ((no_pmi == 1) || ri == 1) return (4 + Ltab[cc->mib->message.dl_Bandwidth]); - else return (7 + Ltab[cc->mib->message.dl_Bandwidth]); + if (no_pmi == 1 || ri == 1) return (4 + Ltab[cc->mib->message.dl_Bandwidth]); + return (7 + Ltab[cc->mib->message.dl_Bandwidth]); } - AssertFatal(1 == 0, - "Shouldn't get here : cqi_ReportPeriodic->present %d\n", + AssertFatal(1 == 0, "Shouldn't get here : cqi_ReportPeriodic->present %d\n", cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.present); + return 0; } - - +//------------------------------------------------------------------------------ void fill_nfapi_dl_dci_1A(nfapi_dl_config_request_pdu_t *dl_config_pdu, uint8_t aggregation_level, @@ -1111,9 +1111,11 @@ fill_nfapi_dl_dci_1A(nfapi_dl_config_request_pdu_t *dl_config_pdu, uint8_t mcs, uint8_t ndi, uint8_t rv, - uint8_t vrb_flag) { - memset((void *) dl_config_pdu, 0, - sizeof(nfapi_dl_config_request_pdu_t)); + uint8_t vrb_flag) +//------------------------------------------------------------------------------ +{ + memset((void *) dl_config_pdu, 0,sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu)); dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; @@ -1129,12 +1131,19 @@ fill_nfapi_dl_dci_1A(nfapi_dl_config_request_pdu_t *dl_config_pdu, dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = ndi; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = rv; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.virtual_resource_block_assignment_flag = vrb_flag; + return; } +//------------------------------------------------------------------------------ void -program_dlsch_acknak(module_id_t module_idP, int CC_idP, int UE_idP, - frame_t frameP, sub_frame_t subframeP, - uint8_t cce_idx) { +program_dlsch_acknak(module_id_t module_idP, + int CC_idP, + int UE_idP, + frame_t frameP, + sub_frame_t subframeP, + uint8_t cce_idx) +//------------------------------------------------------------------------------ +{ eNB_MAC_INST *eNB = RC.mac[module_idP]; COMMON_channels_t *cc = eNB->common_channels; UE_list_t *UE_list = &eNB->UE_list; @@ -1145,27 +1154,33 @@ program_dlsch_acknak(module_id_t module_idP, int CC_idP, int UE_idP, nfapi_ul_config_ulsch_harq_information *ulsch_harq_information = NULL; nfapi_ul_config_harq_information *harq_information = NULL; #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 2, 0)) - - if ((UE_list->UE_template[CC_idP][UE_idP].physicalConfigDedicated->ext2) - && (UE_list->UE_template[CC_idP][UE_idP].physicalConfigDedicated->ext2->pucch_ConfigDedicated_v1020) - && (UE_list->UE_template[CC_idP][UE_idP].physicalConfigDedicated->ext2->pucch_ConfigDedicated_v1020->simultaneousPUCCH_PUSCH_r10) - && (*UE_list->UE_template[CC_idP][UE_idP].physicalConfigDedicated->ext2->pucch_ConfigDedicated_v1020->simultaneousPUCCH_PUSCH_r10 == LTE_PUCCH_ConfigDedicated_v1020__simultaneousPUCCH_PUSCH_r10_true)) + struct LTE_PhysicalConfigDedicated__ext2 *ext2 = UE_list->UE_template[CC_idP][UE_idP].physicalConfigDedicated->ext2; + if (ext2 && + ext2->pucch_ConfigDedicated_v1020 && + ext2->pucch_ConfigDedicated_v1020->simultaneousPUCCH_PUSCH_r10 && + *ext2->pucch_ConfigDedicated_v1020->simultaneousPUCCH_PUSCH_r10 == LTE_PUCCH_ConfigDedicated_v1020__simultaneousPUCCH_PUSCH_r10_true) use_simultaneous_pucch_pusch = 1; #endif // pucch1 and pusch feedback is similar, namely in n+k subframes from now // This is used in the following "if/else" condition to check if there isn't or is already an UL grant in n+k - int16_t ul_absSF = get_pucch1_absSF(&cc[CC_idP], subframeP + (10 * frameP)); + int16_t ul_absSF = get_pucch1_absSF(&cc[CC_idP], + subframeP + (10 * frameP)); - if ((ul_config_pdu = has_ul_grant(module_idP, CC_idP,ul_absSF, rnti)) == NULL) { + if ((ul_config_pdu = has_ul_grant(module_idP, + CC_idP, + ul_absSF, + rnti)) == NULL) { // no UL grant so // Program ACK/NAK alone Format 1a/b or 3 - ul_req = &RC.mac[module_idP]->UL_req_tmp[CC_idP][ul_absSF %10].ul_config_request_body; + ul_req = &eNB->UL_req_tmp[CC_idP][ul_absSF % 10].ul_config_request_body; ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus]; // Do PUCCH - fill_nfapi_uci_acknak(module_idP, - CC_idP, - rnti, (frameP * 10) + subframeP, cce_idx); + fill_nfapi_uci_acknak(module_idP, + CC_idP, + rnti, + subframeP + (10 * frameP), + cce_idx); } else { /* there is already an existing UL grant so update it if needed * on top of some other UL resource (PUSCH,combined SR/CQI/HARQ on PUCCH, etc) @@ -1175,41 +1190,40 @@ program_dlsch_acknak(module_id_t module_idP, int CC_idP, int UE_idP, case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: if (use_simultaneous_pucch_pusch == 1) { // Convert it to an NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE - harq_information = &ul_config_pdu->ulsch_uci_harq_pdu.harq_information; + harq_information = &ul_config_pdu->ulsch_uci_harq_pdu.harq_information; ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE; - LOG_D(MAC, - "Frame %d, Subframe %d: Switched UCI HARQ to ULSCH UCI HARQ\n", - frameP, subframeP); + LOG_D(MAC, "Frame %d, Subframe %d: Switched UCI HARQ to ULSCH UCI HARQ\n", + frameP, + subframeP); } else { // Convert it to an NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE - ulsch_harq_information = &ul_config_pdu->ulsch_harq_pdu.harq_information; + ulsch_harq_information = &ul_config_pdu->ulsch_harq_pdu.harq_information; ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE; - ul_config_pdu->ulsch_harq_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG; - ul_config_pdu->ulsch_harq_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.n_srs_initial = 0; // last symbol not punctured - ul_config_pdu->ulsch_harq_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.initial_number_of_resource_blocks = - ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.number_of_resource_blocks; // we don't change the number of resource blocks across retransmissions yet - LOG_D(MAC, - "Frame %d, Subframe %d: Switched UCI HARQ to ULSCH HARQ\n", - frameP, subframeP); + ul_config_pdu->ulsch_harq_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.tl.tag + = NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG; + ul_config_pdu->ulsch_harq_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.n_srs_initial = 0; // last symbol not punctured + ul_config_pdu->ulsch_harq_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.initial_number_of_resource_blocks + = ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.number_of_resource_blocks; // we don't change the number of resource blocks across retransmissions yet + LOG_D(MAC,"Frame %d, Subframe %d: Switched UCI HARQ to ULSCH HARQ\n", + frameP, + subframeP); } break; case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: - AssertFatal(use_simultaneous_pucch_pusch == 0, - "Cannot be NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE, simultaneous_pucch_pusch is active"); + AssertFatal(use_simultaneous_pucch_pusch == 0, "Cannot be NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE, simultaneous_pucch_pusch is active"); break; case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: - AssertFatal(use_simultaneous_pucch_pusch == 1, - "Cannot be NFAPI_UL_CONFIG_ULSCH_UCI_PDU_TYPE, simultaneous_pucch_pusch is inactive\n"); + AssertFatal(use_simultaneous_pucch_pusch == 1, "Cannot be NFAPI_UL_CONFIG_ULSCH_UCI_PDU_TYPE, simultaneous_pucch_pusch is inactive\n"); break; /* [ulsch + cqi] to [ulsch + cqi + harq] */ case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: // Convert it to an NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE - ulsch_harq_information = &ul_config_pdu->ulsch_cqi_harq_ri_pdu.harq_information; + ulsch_harq_information = &ul_config_pdu->ulsch_cqi_harq_ri_pdu.harq_information; ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE; /* TODO: check this - when converting from nfapi_ul_config_ulsch_cqi_ri_pdu to * nfapi_ul_config_ulsch_cqi_harq_ri_pdu, shouldn't we copy initial_transmission_parameters @@ -1217,29 +1231,27 @@ program_dlsch_acknak(module_id_t module_idP, int CC_idP, int UE_idP, * Those two types are not compatible. 'initial_transmission_parameters' is not at the * place in both. */ - ul_config_pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.tl.tag = - NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG; - ul_config_pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.n_srs_initial = 0; // last symbol not punctured - ul_config_pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.initial_number_of_resource_blocks = - ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.number_of_resource_blocks; // we don't change the number of resource blocks across retransmissions yet + ul_config_pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.tl.tag + = NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG; + ul_config_pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.n_srs_initial = 0; // last symbol not punctured + ul_config_pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.initial_number_of_resource_blocks + = ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.number_of_resource_blocks; // we don't change the number of resource blocks across retransmissions yet break; case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: - AssertFatal(use_simultaneous_pucch_pusch == 0, - "Cannot be NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE, simultaneous_pucch_pusch is active\n"); + AssertFatal(use_simultaneous_pucch_pusch == 0, "Cannot be NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE, simultaneous_pucch_pusch is active\n"); break; /* [ulsch + cqi on pucch] to [ulsch + cqi on pucch + harq on pucch] */ case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: // convert it to an NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE - harq_information = &ul_config_pdu->ulsch_csi_uci_harq_pdu.harq_information; + harq_information = &ul_config_pdu->ulsch_csi_uci_harq_pdu.harq_information; ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE; break; case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: - AssertFatal(use_simultaneous_pucch_pusch == 1, - "Cannot be NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE, simultaneous_pucch_pusch is inactive\n"); + AssertFatal(use_simultaneous_pucch_pusch == 1, "Cannot be NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE, simultaneous_pucch_pusch is inactive\n"); break; /* [sr] to [sr + harq] */ @@ -1247,7 +1259,7 @@ program_dlsch_acknak(module_id_t module_idP, int CC_idP, int UE_idP, case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: // convert to NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE; - harq_information = &ul_config_pdu->uci_sr_harq_pdu.harq_information; + harq_information = &ul_config_pdu->uci_sr_harq_pdu.harq_information; break; case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: @@ -1278,50 +1290,70 @@ program_dlsch_acknak(module_id_t module_idP, int CC_idP, int UE_idP, } } - if (ulsch_harq_information) fill_nfapi_ulsch_harq_information(module_idP, CC_idP, rnti, ulsch_harq_information, subframeP); - - if (harq_information) fill_nfapi_harq_information(module_idP, CC_idP, - rnti, - (frameP * 10) + subframeP, - harq_information, cce_idx); + if (ulsch_harq_information) { + fill_nfapi_ulsch_harq_information(module_idP, + CC_idP, + rnti, + ulsch_harq_information, + subframeP); + } + if (harq_information) { + fill_nfapi_harq_information(module_idP, + CC_idP, + rnti, + harq_information, + cce_idx); + } + return; } -uint8_t get_V_UL_DAI(module_id_t module_idP, int CC_idP, uint16_t rntiP,sub_frame_t subframeP) { +//------------------------------------------------------------------------------ +uint8_t +get_V_UL_DAI(module_id_t module_idP, + int CC_idP, + uint16_t rntiP, + sub_frame_t subframeP) +//------------------------------------------------------------------------------ +{ nfapi_hi_dci0_request_body_t *HI_DCI0_req = &RC.mac[module_idP]->HI_DCI0_req[CC_idP][subframeP].hi_dci0_request_body; nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu = &HI_DCI0_req->hi_dci0_pdu_list[0]; for (int i = 0; i < HI_DCI0_req->number_of_dci; i++) { - if ((hi_dci0_pdu[i].pdu_type == NFAPI_HI_DCI0_DCI_PDU_TYPE) && - (hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.rnti == rntiP)) - return (hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.dl_assignment_index); + if (hi_dci0_pdu[i].pdu_type == NFAPI_HI_DCI0_DCI_PDU_TYPE && + hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.rnti == rntiP) { + return hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.dl_assignment_index; + } } - return (4); // this is rule from Section 7.3 in 36.213 + return 4; // this is rule from Section 7.3 in 36.213 } +//------------------------------------------------------------------------------ void fill_nfapi_ulsch_harq_information(module_id_t module_idP, int CC_idP, uint16_t rntiP, nfapi_ul_config_ulsch_harq_information *harq_information, sub_frame_t subframeP) +//------------------------------------------------------------------------------ { eNB_MAC_INST *eNB = RC.mac[module_idP]; COMMON_channels_t *cc = &eNB->common_channels[CC_idP]; UE_list_t *UE_list = &eNB->UE_list; int UE_id = find_UE_id(module_idP, rntiP); - LTE_PUSCH_ConfigDedicated_t *puschConfigDedicated; - // PUSCH_ConfigDedicated_v1020_t *puschConfigDedicated_v1020; - // PUSCH_ConfigDedicated_v1130_t *puschConfigDedicated_v1130; - // PUSCH_ConfigDedicated_v1250_t *puschConfigDedicated_v1250; + nfapi_ul_config_ulsch_harq_information_rel10_t* harq_information_rel10 = &harq_information->harq_information_rel10; + AssertFatal(UE_id >= 0, "UE_id cannot be found, impossible\n"); AssertFatal(UE_list != NULL, "UE_list is null\n"); - AssertFatal(UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated != NULL, - "physicalConfigDedicated for rnti %x is null\n", rntiP); - AssertFatal((puschConfigDedicated = (LTE_PUSCH_ConfigDedicated_t *) - UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->pusch_ConfigDedicated) != NULL, - "physicalConfigDedicated->puschConfigDedicated for rnti %x is null\n", + + LTE_PhysicalConfigDedicated_t *physicalConfigDedicated = UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated; + AssertFatal(physicalConfigDedicated != NULL, "physicalConfigDedicated for rnti %x is null\n", + rntiP); + + struct LTE_PUSCH_ConfigDedicated *puschConfigDedicated = physicalConfigDedicated->pusch_ConfigDedicated; + AssertFatal(puschConfigDedicated != NULL, "physicalConfigDedicated->puschConfigDedicated for rnti %x is null\n", rntiP); + #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 2, 0)) /* if (UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->ext2) puschConfigDedicated_v1020 = UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->ext2->pusch_ConfigDedicated_v1020; #endif @@ -1333,16 +1365,18 @@ fill_nfapi_ulsch_harq_information(module_id_t module_ #endif */ #endif - harq_information->harq_information_rel10.delta_offset_harq = puschConfigDedicated->betaOffset_ACK_Index; - harq_information->harq_information_rel10.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG; - AssertFatal(UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->pucch_ConfigDedicated != NULL, - "pucch_ConfigDedicated is null!\n"); - - if ((UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode != NULL) - && (*UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode == LTE_PUCCH_ConfigDedicated__tdd_AckNackFeedbackMode_multiplexing)) - harq_information->harq_information_rel10.ack_nack_mode = 1; // multiplexing + + harq_information_rel10->delta_offset_harq = puschConfigDedicated->betaOffset_ACK_Index; + harq_information_rel10->tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG; + + struct LTE_PUCCH_ConfigDedicated *pucch_ConfigDedicated = physicalConfigDedicated->pucch_ConfigDedicated; + AssertFatal(pucch_ConfigDedicated != NULL, "pucch_ConfigDedicated is null!\n"); + + if (pucch_ConfigDedicated->tdd_AckNackFeedbackMode != NULL && + *pucch_ConfigDedicated->tdd_AckNackFeedbackMode == LTE_PUCCH_ConfigDedicated__tdd_AckNackFeedbackMode_multiplexing) + harq_information_rel10->ack_nack_mode = 1; // multiplexing else - harq_information->harq_information_rel10.ack_nack_mode = 0; // bundling + harq_information_rel10->ack_nack_mode = 0; // bundling switch (get_tmode(module_idP, CC_idP, UE_id)) { case 1: @@ -1351,66 +1385,96 @@ fill_nfapi_ulsch_harq_information(module_id_t module_ case 6: case 7: if (cc->tdd_Config == NULL) // FDD - harq_information->harq_information_rel10.harq_size = 1; + harq_information_rel10->harq_size = 1; else { - if (harq_information->harq_information_rel10.ack_nack_mode == 1) - harq_information->harq_information_rel10.harq_size = get_V_UL_DAI(module_idP, CC_idP, rntiP, subframeP); + if (harq_information_rel10->ack_nack_mode == 1) + harq_information_rel10->harq_size = get_V_UL_DAI(module_idP, + CC_idP, + rntiP, + subframeP); else - harq_information->harq_information_rel10.harq_size = 1; + harq_information_rel10->harq_size = 1; } + break; default: // for any other TM we need 2 bits harq if (cc->tdd_Config == NULL) { - harq_information->harq_information_rel10.harq_size = 2; + harq_information_rel10->harq_size = 2; } else { - if (harq_information->harq_information_rel10.ack_nack_mode == 1) - harq_information->harq_information_rel10.harq_size = get_V_UL_DAI(module_idP, CC_idP, rntiP, subframeP); + if (harq_information_rel10->ack_nack_mode == 1) + harq_information_rel10->harq_size = get_V_UL_DAI(module_idP, + CC_idP, + rntiP, + subframeP); else - harq_information->harq_information_rel10.harq_size = 2; + harq_information_rel10->harq_size = 2; } + break; } // get Tmode return; } -uint8_t Np[6][4]= {{0,1,3,5}, - {0,3,8,13}, - {0,5,13,22}, - {0,11,27,44}, - {0,16,41,66}, - {0,22,55,88} +//------------------------------------------------------------------------------ +uint8_t +Np[6][4] = { + {0, 1, 3, 5}, + {0, 3, 8, 13}, + {0, 5, 13, 22}, + {0, 11, 27, 44}, + {0, 16, 41, 66}, + {0, 22, 55, 88} }; +//------------------------------------------------------------------------------ // This is part of the PUCCH allocation procedure (see Section 10.1 36.213) -uint16_t getNp(int dl_Bandwidth,uint8_t nCCE,uint8_t plus1) { - AssertFatal(dl_Bandwidth<6,"dl_Bandwidth %d>5\n",dl_Bandwidth); +//------------------------------------------------------------------------------ +uint16_t +getNp(int dl_Bandwidth, + uint8_t nCCE, + uint8_t plus1) +//------------------------------------------------------------------------------ +{ + AssertFatal(dl_Bandwidth < 6, "dl_Bandwidth %d>5\n", dl_Bandwidth); - if (nCCE>=Np[dl_Bandwidth][2]) - return(Np[dl_Bandwidth][2+plus1]); - else if (nCCE>=Np[dl_Bandwidth][1]) + if (nCCE >= Np[dl_Bandwidth][2]) { + return(Np[dl_Bandwidth][2+plus1]); + } + if (nCCE >= Np[dl_Bandwidth][1]) { return(Np[dl_Bandwidth][1+plus1]); - else - return(Np[dl_Bandwidth][0+plus1]); + } + return(Np[dl_Bandwidth][0+plus1]); } +//------------------------------------------------------------------------------ void fill_nfapi_harq_information(module_id_t module_idP, int CC_idP, uint16_t rntiP, - uint16_t absSFP, nfapi_ul_config_harq_information *harq_information, - uint8_t cce_idxP) { + uint8_t cce_idxP) +//------------------------------------------------------------------------------ +{ eNB_MAC_INST *eNB = RC.mac[module_idP]; COMMON_channels_t *cc = &eNB->common_channels[CC_idP]; UE_list_t *UE_list = &eNB->UE_list; - int UE_id = find_UE_id(module_idP, rntiP); + + int UE_id = find_UE_id(module_idP, + rntiP); + AssertFatal(UE_id >= 0, "UE_id cannot be found, impossible\n"); AssertFatal(UE_list != NULL, "UE_list is null\n"); harq_information->harq_information_rel11.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG; harq_information->harq_information_rel11.num_ant_ports = 1; - - switch (get_tmode(module_idP, CC_idP, UE_id)) { + + LTE_PhysicalConfigDedicated_t *physicalConfigDedicated = UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated; + struct LTE_PUCCH_ConfigDedicated *pucch_ConfigDedicated = NULL; + if (physicalConfigDedicated != NULL) pucch_ConfigDedicated = physicalConfigDedicated->pucch_ConfigDedicated; + + switch (get_tmode(module_idP, + CC_idP, + UE_id)) { case 1: case 2: case 5: @@ -1419,10 +1483,9 @@ fill_nfapi_harq_information(module_id_t module_idP, if (cc->tdd_Config != NULL) { // AssertFatal(UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->pucch_ConfigDedicated != NULL, // "pucch_ConfigDedicated is null for TDD!\n"); - if (UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated != NULL - && UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->pucch_ConfigDedicated != NULL - && (UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode != NULL) - && (*UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode == LTE_PUCCH_ConfigDedicated__tdd_AckNackFeedbackMode_multiplexing)) { + if (physicalConfigDedicated != NULL && pucch_ConfigDedicated != NULL && + pucch_ConfigDedicated->tdd_AckNackFeedbackMode != NULL && + *pucch_ConfigDedicated->tdd_AckNackFeedbackMode == LTE_PUCCH_ConfigDedicated__tdd_AckNackFeedbackMode_multiplexing) { harq_information->harq_information_rel10_tdd.harq_size = 2; // 2-bit ACK/NAK harq_information->harq_information_rel10_tdd.ack_nack_mode = 1; // multiplexing } else { @@ -1431,8 +1494,8 @@ fill_nfapi_harq_information(module_id_t module_idP, } harq_information->harq_information_rel10_tdd.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG; - harq_information->harq_information_rel10_tdd.n_pucch_1_0 = getNp(cc->mib->message.dl_Bandwidth,cce_idxP,0) + - cc->radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN + cce_idxP; + harq_information->harq_information_rel10_tdd.n_pucch_1_0 + = getNp(cc->mib->message.dl_Bandwidth, cce_idxP, 0) + cc->radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN + cce_idxP; harq_information->harq_information_rel10_tdd.number_of_pucch_resources = 1; } else { harq_information->harq_information_rel9_fdd.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG; @@ -1445,11 +1508,10 @@ fill_nfapi_harq_information(module_id_t module_idP, default: // for any other TM we need 2 bits harq if (cc->tdd_Config != NULL) { - AssertFatal(UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->pucch_ConfigDedicated != NULL, - "pucch_ConfigDedicated is null for TDD!\n"); + AssertFatal(pucch_ConfigDedicated != NULL, "pucch_ConfigDedicated is null for TDD!\n"); - if ((UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode != NULL) - && (*UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode == LTE_PUCCH_ConfigDedicated__tdd_AckNackFeedbackMode_multiplexing)) { + if (pucch_ConfigDedicated->tdd_AckNackFeedbackMode != NULL && + *pucch_ConfigDedicated->tdd_AckNackFeedbackMode == LTE_PUCCH_ConfigDedicated__tdd_AckNackFeedbackMode_multiplexing) { harq_information->harq_information_rel10_tdd.ack_nack_mode = 1; // multiplexing } else { harq_information->harq_information_rel10_tdd.ack_nack_mode = 0; // bundling @@ -1469,14 +1531,18 @@ fill_nfapi_harq_information(module_id_t module_idP, break; } // get Tmode + return; } +//------------------------------------------------------------------------------ uint16_t fill_nfapi_uci_acknak(module_id_t module_idP, int CC_idP, uint16_t rntiP, uint16_t absSFP, - uint8_t cce_idxP) { + uint8_t cce_idxP) +//------------------------------------------------------------------------------ +{ eNB_MAC_INST *eNB = RC.mac[module_idP]; COMMON_channels_t *cc = &eNB->common_channels[CC_idP]; int ackNAK_absSF = get_pucch1_absSF(cc, absSFP); @@ -1484,21 +1550,27 @@ fill_nfapi_uci_acknak(module_id_t module_idP, nfapi_ul_config_request_body_t *ul_req_body = &ul_req->ul_config_request_body; nfapi_ul_config_request_pdu_t *ul_config_pdu = &ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus]; memset((void *) ul_config_pdu, 0, sizeof(nfapi_ul_config_request_pdu_t)); + ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE; ul_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_ul_config_uci_harq_pdu)); ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.handle = 0; // don't know how to use this ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti = rntiP; - fill_nfapi_harq_information(module_idP, CC_idP, + + fill_nfapi_harq_information(module_idP, + CC_idP, rntiP, - absSFP, - &ul_config_pdu->uci_harq_pdu.harq_information, cce_idxP); - LOG_D(MAC, - "Filled in UCI HARQ request for rnti %x SF %d.%d acknakSF %d.%d, cce_idxP %d-> n1_pucch %d\n", - rntiP, absSFP / 10, absSFP % 10, ackNAK_absSF / 10, - ackNAK_absSF % 10, cce_idxP, - ul_config_pdu->uci_harq_pdu. - harq_information.harq_information_rel9_fdd.n_pucch_1_0); + &ul_config_pdu->uci_harq_pdu.harq_information, + cce_idxP); + LOG_D(MAC, "Filled in UCI HARQ request for rnti %x SF %d.%d acknakSF %d.%d, cce_idxP %d-> n1_pucch %d\n", + rntiP, + absSFP / 10, + absSFP % 10, + ackNAK_absSF / 10, + ackNAK_absSF % 10, + cce_idxP, + ul_config_pdu->uci_harq_pdu.harq_information.harq_information_rel9_fdd.n_pucch_1_0); + ul_req_body->number_of_pdus++; ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; ul_req->header.message_id = NFAPI_UL_CONFIG_REQUEST; @@ -1506,6 +1578,7 @@ fill_nfapi_uci_acknak(module_id_t module_idP, return (((ackNAK_absSF / 10) << 4) + (ackNAK_absSF % 10)); } +//------------------------------------------------------------------------------ void fill_nfapi_dlsch_config(eNB_MAC_INST *eNB, nfapi_dl_config_request_body_t *dl_req, @@ -1522,8 +1595,8 @@ fill_nfapi_dlsch_config(eNB_MAC_INST *eNB, uint8_t transport_block_to_codeword_swap_flag, uint8_t transmission_scheme, uint8_t number_of_layers, - uint8_t number_of_subbands, - // uint8_t codebook_index, + uint8_t number_of_subbands, + // uint8_t codebook_index, uint8_t ue_category_capacity, uint8_t pa, uint8_t delta_power_offset_index, @@ -1531,11 +1604,12 @@ fill_nfapi_dlsch_config(eNB_MAC_INST *eNB, uint8_t nprb, uint8_t transmission_mode, uint8_t num_bf_prb_per_subband, - uint8_t num_bf_vector) { - nfapi_dl_config_request_pdu_t *dl_config_pdu = - &dl_req->dl_config_pdu_list[dl_req->number_pdu]; - memset((void *) dl_config_pdu, 0, - sizeof(nfapi_dl_config_request_pdu_t)); + uint8_t num_bf_vector) +//------------------------------------------------------------------------------ +{ + nfapi_dl_config_request_pdu_t *dl_config_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu]; + memset((void *) dl_config_pdu, 0, sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DLSCH_PDU_TYPE; dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dlsch_pdu)); dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG; @@ -1552,7 +1626,7 @@ fill_nfapi_dlsch_config(eNB_MAC_INST *eNB, dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transmission_scheme = transmission_scheme; dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.number_of_layers = number_of_layers; dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.number_of_subbands = number_of_subbands; - // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.codebook_index = codebook_index; + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.codebook_index = codebook_index; dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.ue_category_capacity = ue_category_capacity; dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pa = pa; dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.delta_power_offset_index = delta_power_offset_index; @@ -1561,18 +1635,26 @@ fill_nfapi_dlsch_config(eNB_MAC_INST *eNB, dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transmission_mode = transmission_mode; dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_prb_per_subband = num_bf_prb_per_subband; dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_vector = num_bf_vector; + dl_req->number_pdu++; + return; } +//------------------------------------------------------------------------------ uint16_t fill_nfapi_tx_req(nfapi_tx_request_body_t *tx_req_body, uint16_t absSF, uint16_t pdu_length, int16_t pdu_index, - uint8_t *pdu) { + uint8_t *pdu) +//------------------------------------------------------------------------------ +{ nfapi_tx_request_pdu_t *TX_req = &tx_req_body->tx_pdu_list[tx_req_body->number_of_pdus]; + LOG_D(MAC, "Filling TX_req %d for pdu length %d\n", - tx_req_body->number_of_pdus, pdu_length); + tx_req_body->number_of_pdus, + pdu_length); + TX_req->pdu_length = pdu_length; TX_req->pdu_index = pdu_index; TX_req->num_segments = 1; @@ -1583,6 +1665,7 @@ fill_nfapi_tx_req(nfapi_tx_request_body_t *tx_req_body, return (((absSF / 10) << 4) + (absSF % 10)); } +//------------------------------------------------------------------------------ void fill_nfapi_ulsch_config_request_rel8(nfapi_ul_config_request_pdu_t *ul_config_pdu, uint8_t cqi_req, @@ -1639,7 +1722,8 @@ fill_nfapi_ulsch_config_request_rel8(nfapi_ul_config_request_pdu_t *ul_config_pd ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG; ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9.report_type = 1; ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.number_of_cc = 1; - LOG_D(MAC, "report_type %d\n",ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9.report_type); + LOG_D(MAC, "report_type %d\n", + ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9.report_type); if (cc->p_eNB <= 2 && (tmode == 3 || tmode == 4 || tmode == 8 || tmode == 9 || tmode == 10)) ri_size = 1; else if (cc->p_eNB <= 2) ri_size = 0; @@ -1650,26 +1734,30 @@ fill_nfapi_ulsch_config_request_rel8(nfapi_ul_config_request_pdu_t *ul_config_pd AssertFatal(physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic != NULL,"physicalConfigDedicated->cqi_ReportModeAperiodic is null!\n"); AssertFatal(physicalConfigDedicated->pusch_ConfigDedicated != NULL,"physicalConfigDedicated->puschConfigDedicated is null!\n"); - for (int ri = 0; ri < (1 << ri_size); ri++) { - ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[ri] = - get_dl_cqi_pmi_size_pusch(cc,tmode,1 + ri, physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic); + nfapi_ul_config_cqi_ri_information_rel9_t *ri_information = &ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9; + int max_ri = (1 << ri_information->aperiodic_cqi_pmi_ri_report.cc[0].ri_size); + for (int ri = 0; ri < max_ri; ri++) { + ri_information->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[ri] + = get_dl_cqi_pmi_size_pusch(cc, + tmode, + 1 + ri, + physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic); } - - ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9.delta_offset_cqi = - physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_CQI_Index; - ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9.delta_offset_ri = - physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_RI_Index; + ri_information->delta_offset_cqi = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_CQI_Index; + ri_information->delta_offset_ri = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_RI_Index; } + return; } #if (LTE_RRC_VERSION >= MAKE_VERSION(13, 0, 0)) +//------------------------------------------------------------------------------ void -fill_nfapi_ulsch_config_request_emtc(nfapi_ul_config_request_pdu_t * - ul_config_pdu, uint8_t ue_type, - uint16_t - total_number_of_repetitions, +fill_nfapi_ulsch_config_request_emtc(nfapi_ul_config_request_pdu_t *ul_config_pdu, + uint8_t ue_type, + uint16_t total_number_of_repetitions, uint16_t repetition_number, uint16_t initial_transmission_sf_io) +//------------------------------------------------------------------------------ { // Re13 fields ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG; @@ -1677,31 +1765,52 @@ fill_nfapi_ulsch_config_request_emtc(nfapi_ul_config_request_pdu_t * ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.total_number_of_repetitions = total_number_of_repetitions; ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.repetition_number = repetition_number; ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.initial_transmission_sf_io = initial_transmission_sf_io; + return; } -int get_numnarrowbands(long dl_Bandwidth) { +//------------------------------------------------------------------------------ +int +get_numnarrowbands(long dl_Bandwidth) +//------------------------------------------------------------------------------ +{ int nb_tab[6] = { 1, 2, 4, 8, 12, 16 }; AssertFatal(dl_Bandwidth < 7 || dl_Bandwidth >= 0, "dl_Bandwidth not in [0..6]\n"); return (nb_tab[dl_Bandwidth]); } -int get_numnarrowbandbits(long dl_Bandwidth) { +//------------------------------------------------------------------------------ +int +get_numnarrowbandbits(long dl_Bandwidth) +//------------------------------------------------------------------------------ +{ int nbbits_tab[6] = { 0, 1, 2, 3, 4, 4 }; AssertFatal(dl_Bandwidth < 7 || dl_Bandwidth >= 0, "dl_Bandwidth not in [0..6]\n"); return (nbbits_tab[dl_Bandwidth]); } //This implements the frame/subframe condition for first subframe of MPDCCH transmission (Section 9.1.5 36.213, Rel 13/14) -int startSF_fdd_RA_times2[8] = { 2, 3, 4, 5, 8, 10, 16, 20 }; -int startSF_tdd_RA[7] = { 1, 2, 4, 5, 8, 10, 20 }; +//------------------------------------------------------------------------------ +int +startSF_fdd_RA_times2[8] = { 2, 3, 4, 5, 8, 10, 16, 20 }; +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +int +startSF_tdd_RA[7] = { 1, 2, 4, 5, 8, 10, 20 }; +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ int -mpdcch_sf_condition(eNB_MAC_INST *eNB, int CC_id, frame_t frameP, - sub_frame_t subframeP, int rmax, - MPDCCH_TYPES_t mpdcch_type, int UE_id) { - struct LTE_PRACH_ConfigSIB_v1310 *ext4_prach = - eNB->common_channels[CC_id].radioResourceConfigCommon_BR-> - ext4->prach_ConfigCommon_v1310; +mpdcch_sf_condition(eNB_MAC_INST *eNB, + int CC_id, + frame_t frameP, + sub_frame_t subframeP, + int rmax, + MPDCCH_TYPES_t mpdcch_type, + int UE_id) +//------------------------------------------------------------------------------ +{ + struct LTE_PRACH_ConfigSIB_v1310 *ext4_prach = eNB->common_channels[CC_id].radioResourceConfigCommon_BR-> ext4->prach_ConfigCommon_v1310; int T; LTE_EPDCCH_SetConfig_r11_t *epdcch_setconfig_r11; @@ -1719,17 +1828,13 @@ mpdcch_sf_condition(eNB_MAC_INST *eNB, int CC_id, frame_t frameP, break; case TYPE2: // RAR - AssertFatal(ext4_prach->mpdcch_startSF_CSS_RA_r13 != NULL, - "mpdcch_startSF_CSS_RA_r13 is null\n"); + AssertFatal(ext4_prach->mpdcch_startSF_CSS_RA_r13 != NULL, "mpdcch_startSF_CSS_RA_r13 is null\n"); AssertFatal(rmax > 0, "rmax is 0!\b"); if (eNB->common_channels[CC_id].tdd_Config == NULL) //FDD - T = rmax *startSF_fdd_RA_times2[ext4_prach-> - mpdcch_startSF_CSS_RA_r13-> - choice.fdd_r13] >> 1; + T = (rmax * startSF_fdd_RA_times2[ext4_prach->mpdcch_startSF_CSS_RA_r13->choice.fdd_r13]) >> 1; else //TDD - T = rmax *startSF_tdd_RA[ext4_prach-> - mpdcch_startSF_CSS_RA_r13->choice.tdd_r13]; + T = rmax * startSF_tdd_RA[ext4_prach->mpdcch_startSF_CSS_RA_r13->choice.tdd_r13]; break; @@ -1740,76 +1845,69 @@ mpdcch_sf_condition(eNB_MAC_INST *eNB, int CC_id, frame_t frameP, case TYPEUESPEC: epdcch_setconfig_r11 = eNB->UE_list.UE_template[CC_id][UE_id].physicalConfigDedicated->ext4->epdcch_Config_r11->config_r11.choice.setup.setConfigToAddModList_r11->list.array[0]; - AssertFatal(epdcch_setconfig_r11 != NULL, - " epdcch_setconfig_r11 is null for UE specific \n"); - AssertFatal(epdcch_setconfig_r11->ext2 != NULL, - " ext2 doesn't exist in epdcch config ' \n"); + AssertFatal(epdcch_setconfig_r11 != NULL, " epdcch_setconfig_r11 is null for UE specific \n"); + AssertFatal(epdcch_setconfig_r11->ext2 != NULL, " ext2 doesn't exist in epdcch config ' \n"); if (eNB->common_channels[CC_id].tdd_Config == NULL) //FDD - T = rmax *startSF_fdd_RA_times2[epdcch_setconfig_r11->ext2->mpdcch_config_r13->choice.setup.mpdcch_StartSF_UESS_r13.choice.fdd_r13] >> 1; + T = (rmax * startSF_fdd_RA_times2[epdcch_setconfig_r11->ext2->mpdcch_config_r13->choice.setup.mpdcch_StartSF_UESS_r13.choice.fdd_r13]) >> 1; else //TDD - T = rmax *startSF_tdd_RA[epdcch_setconfig_r11->ext2->mpdcch_config_r13->choice.setup.mpdcch_StartSF_UESS_r13.choice.tdd_r13]; + T = rmax * startSF_tdd_RA[epdcch_setconfig_r11->ext2->mpdcch_config_r13->choice.setup.mpdcch_StartSF_UESS_r13.choice.tdd_r13]; break; default: - return (0); + return 0; } AssertFatal(T > 0, "T is 0!\n"); - if (((10 * frameP) + subframeP) % T == 0) return (1); - else return (0); + if (((10 * frameP) + subframeP) % T == 0) return 1; + return 0; } -int narrowband_to_first_rb(COMMON_channels_t *cc, int nb_index) { +//------------------------------------------------------------------------------ +int +narrowband_to_first_rb(COMMON_channels_t *cc, + int nb_index) +//------------------------------------------------------------------------------ +{ switch (cc->mib->message.dl_Bandwidth) { case 0: // 6 PRBs, N_NB=1, i_0=0 - return (0); - break; + return 0; case 3: // 50 PRBs, N_NB=8, i_0=1 - return ((int) (1 + (6 * nb_index))); - break; + return (1 + (6 * nb_index)); case 5: // 100 PRBs, N_NB=16, i_0=2 - return ((int) (2 + (6 * nb_index))); - break; + return (2 + (6 * nb_index)); case 1: // 15 PRBs N_NB=2, i_0=1 if (nb_index > 0) - return (1); - else - return (0); - - break; + return 1; + return 0; case 2: // 25 PRBs, N_NB=4, i_0=0 if (nb_index > 1) return (1 + (6 * nb_index)); - else - return ((6 * nb_index)); - - break; + return ((6 * nb_index)); case 4: // 75 PRBs, N_NB=12, i_0=1 if (nb_index > 5) return (2 + (6 * nb_index)); - else - return (1 + (6 * nb_index)); - - break; + return (1 + (6 * nb_index)); default: AssertFatal(1 == 0, "Impossible dl_Bandwidth %d\n", (int) cc->mib->message.dl_Bandwidth); break; } + return 0; } #endif //------------------------------------------------------------------------------ -void init_ue_sched_info(void) +void +init_ue_sched_info(void) //------------------------------------------------------------------------------ { module_id_t i, j, k; @@ -1829,67 +1927,77 @@ void init_ue_sched_info(void) } } } + return; } - - //------------------------------------------------------------------------------ -unsigned char get_ue_weight(module_id_t module_idP, int CC_idP, int ue_idP) +unsigned char +get_ue_weight(module_id_t module_idP, + int CC_idP, + int ue_idP) //------------------------------------------------------------------------------ { return (eNB_dlsch_info[module_idP][CC_idP][ue_idP].weight); } //------------------------------------------------------------------------------ -int find_UE_id(module_id_t mod_idP, rnti_t rntiP) +int +find_UE_id(module_id_t mod_idP, + rnti_t rntiP) //------------------------------------------------------------------------------ { int UE_id; UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) { - if (UE_list->active[UE_id] != TRUE) - continue; - - if (UE_list->UE_template[UE_PCCID(mod_idP, UE_id)][UE_id].rnti == - rntiP) { - return (UE_id); + if (UE_list->active[UE_id] == TRUE) { + if (UE_list->UE_template[UE_PCCID(mod_idP, + UE_id)][UE_id].rnti == rntiP) { + return UE_id; + } } } - return (-1); + return -1; } //------------------------------------------------------------------------------ -int find_RA_id(module_id_t mod_idP, int CC_idP, rnti_t rntiP) +int +find_RA_id(module_id_t mod_idP, + int CC_idP, + rnti_t rntiP) //------------------------------------------------------------------------------ { int RA_id; AssertFatal(RC.mac[mod_idP], "RC.mac[%d] is null\n", mod_idP); - RA_t *ra = (RA_t *) & RC.mac[mod_idP]->common_channels[CC_idP].ra[0]; + RA_t *ra = (RA_t *) &RC.mac[mod_idP]->common_channels[CC_idP].ra[0]; for (RA_id = 0; RA_id < NB_RA_PROC_MAX; RA_id++) { - LOG_D(MAC, - "Checking RA_id %d for %x : state %d\n", - RA_id, rntiP, ra[RA_id].state); + LOG_D(MAC, "Checking RA_id %d for %x : state %d\n", + RA_id, + rntiP, + ra[RA_id].state); - if (ra[RA_id].state != IDLE && - ra[RA_id].rnti == rntiP) - return (RA_id); + if (ra[RA_id].state != IDLE && ra[RA_id].rnti == rntiP) + return RA_id; } - return (-1); + return -1; } //------------------------------------------------------------------------------ -int UE_num_active_CC(UE_list_t *listP, int ue_idP) +int +UE_num_active_CC(UE_list_t *listP, + int ue_idP) //------------------------------------------------------------------------------ { return (listP->numactiveCCs[ue_idP]); } //------------------------------------------------------------------------------ -int UE_PCCID(module_id_t mod_idP, int ue_idP) +int +UE_PCCID(module_id_t mod_idP, + int ue_idP) //------------------------------------------------------------------------------ { if (!RC.mac || !RC.mac[mod_idP]) return 0; @@ -1898,14 +2006,15 @@ int UE_PCCID(module_id_t mod_idP, int ue_idP) } //------------------------------------------------------------------------------ -rnti_t UE_RNTI(module_id_t mod_idP, int ue_idP) +rnti_t +UE_RNTI(module_id_t mod_idP, + int ue_idP) //------------------------------------------------------------------------------ { if (!RC.mac || !RC.mac[mod_idP]) return 0; - rnti_t rnti = - RC.mac[mod_idP]-> - UE_list.UE_template[UE_PCCID(mod_idP, ue_idP)][ue_idP].rnti; + rnti_t rnti = RC.mac[mod_idP]->UE_list.UE_template[UE_PCCID(mod_idP, + ue_idP)][ue_idP].rnti; if (rnti > 0) { return (rnti); @@ -1917,7 +2026,9 @@ rnti_t UE_RNTI(module_id_t mod_idP, int ue_idP) } //------------------------------------------------------------------------------ -boolean_t is_UE_active(module_id_t mod_idP, int ue_idP) +boolean_t +is_UE_active(module_id_t mod_idP, + int ue_idP) //------------------------------------------------------------------------------ { if (!RC.mac || !RC.mac[mod_idP]) return 0; @@ -1925,8 +2036,13 @@ boolean_t is_UE_active(module_id_t mod_idP, int ue_idP) return (RC.mac[mod_idP]->UE_list.active[ue_idP]); } +//------------------------------------------------------------------------------ unsigned char -get_aggregation(uint8_t bw_index, uint8_t cqi, uint8_t dci_fmt) { +get_aggregation(uint8_t bw_index, + uint8_t cqi, + uint8_t dci_fmt) +//------------------------------------------------------------------------------ +{ unsigned char aggregation = 3; switch (dci_fmt) { @@ -1955,38 +2071,67 @@ get_aggregation(uint8_t bw_index, uint8_t cqi, uint8_t dci_fmt) { case format3A: case format4: default: - LOG_W(MAC, "unsupported DCI format %d\n", dci_fmt); + LOG_W(MAC, "unsupported DCI format %d\n", + dci_fmt); + break; } - LOG_D(MAC, "Aggregation level %d (cqi %d, bw_index %d, format %d)\n", 1 << aggregation, cqi, bw_index, dci_fmt); + LOG_D(MAC, "Aggregation level %d (cqi %d, bw_index %d, format %d)\n", + 1 << aggregation, + cqi, + bw_index, + dci_fmt); + return 1 << aggregation; } -void dump_ue_list(UE_list_t *listP, int ul_flag) { +//------------------------------------------------------------------------------ +void +dump_ue_list(UE_list_t *listP, + int ul_flag) +//------------------------------------------------------------------------------ +{ int j; if (ul_flag == 0) { for (j = listP->head; j >= 0; j = listP->next[j]) { - LOG_T(MAC, "node %d => %d\n", j, listP->next[j]); + LOG_T(MAC, "node %d => %d\n", + j, + listP->next[j]); } } else { for (j = listP->head_ul; j >= 0; j = listP->next_ul[j]) { - LOG_T(MAC, "node %d => %d\n", j, listP->next_ul[j]); + LOG_T(MAC, "node %d => %d\n", + j, + listP->next_ul[j]); } } + return; } -int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP, int harq_pidP +//------------------------------------------------------------------------------ +int +add_new_ue(module_id_t mod_idP, + int cc_idP, + rnti_t rntiP, + int harq_pidP #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - , uint8_t rach_resource_type + , uint8_t rach_resource_type #endif - ) { + ) +//------------------------------------------------------------------------------ +{ int UE_id; int i, j; UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; - LOG_D(MAC, - "[eNB %d, CC_id %d] Adding UE with rnti %x (next avail %d, num_UEs %d)\n", - mod_idP, cc_idP, rntiP, UE_list->avail, UE_list->num_UEs); + + LOG_D(MAC, "[eNB %d, CC_id %d] Adding UE with rnti %x (next avail %d, num_UEs %d)\n", + mod_idP, + cc_idP, + rntiP, + UE_list->avail, + UE_list->num_UEs); + dump_ue_list(UE_list, 0); for (i = 0; i < MAX_MOBILES_PER_ENB; i++) { @@ -1994,8 +2139,8 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP, int harq_pidP continue; UE_id = i; - memset(&UE_list->UE_template[cc_idP][UE_id], 0, - sizeof(UE_TEMPLATE)); + memset(&UE_list->UE_template[cc_idP][UE_id], 0, sizeof(UE_TEMPLATE)); + UE_list->UE_template[cc_idP][UE_id].rnti = rntiP; UE_list->UE_template[cc_idP][UE_id].configured = FALSE; UE_list->numactiveCCs[UE_id] = 1; @@ -2005,16 +2150,19 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP, int harq_pidP UE_list->ordered_ULCCids[0][UE_id] = cc_idP; UE_list->num_UEs++; UE_list->active[UE_id] = TRUE; + #if defined(USRP_REC_PLAY) // not specific to record/playback ? UE_list->UE_template[cc_idP][UE_id].pre_assigned_mcs_ul = 0; #endif #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) - UE_list->UE_template[cc_idP][UE_id].rach_resource_type = - rach_resource_type; + UE_list->UE_template[cc_idP][UE_id].rach_resource_type = rach_resource_type; #endif - memset((void *) &UE_list->UE_sched_ctrl[UE_id], 0, + + memset((void *) &UE_list->UE_sched_ctrl[UE_id], + 0, sizeof(UE_sched_ctrl)); - memset((void *) &UE_list->eNB_UE_stats[cc_idP][UE_id], 0, + memset((void *) &UE_list->eNB_UE_stats[cc_idP][UE_id], + 0, sizeof(eNB_UE_STATS)); UE_list->UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer = 0; /* default slice in case there was something different */ @@ -2032,43 +2180,61 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP, int harq_pidP eNB_ulsch_info[mod_idP][cc_idP][UE_id].status = S_UL_WAITING; eNB_dlsch_info[mod_idP][cc_idP][UE_id].status = S_DL_WAITING; LOG_D(MAC, "[eNB %d] Add UE_id %d on Primary CC_id %d: rnti %x\n", - mod_idP, UE_id, cc_idP, rntiP); - dump_ue_list(UE_list, 0); + mod_idP, + UE_id, + cc_idP, + rntiP); + dump_ue_list(UE_list, + 0); return (UE_id); } - printf("MAC: cannot add new UE for rnti %x\n", rntiP); - LOG_E(MAC, - "error in add_new_ue(), could not find space in UE_list, Dumping UE list\n"); - dump_ue_list(UE_list, 0); - return (-1); + // printf("MAC: cannot add new UE for rnti %x\n", rntiP); + LOG_E(MAC, "error in add_new_ue(), could not find space in UE_list, Dumping UE list\n"); + dump_ue_list(UE_list, + 0); + return -1; } //------------------------------------------------------------------------------ -int rrc_mac_remove_ue(module_id_t mod_idP, rnti_t rntiP) +int +rrc_mac_remove_ue(module_id_t mod_idP, + rnti_t rntiP) //------------------------------------------------------------------------------ { int j; UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; - int UE_id = find_UE_id(mod_idP,rntiP); + int UE_id = find_UE_id(mod_idP, + rntiP); int pCC_id; + eNB_UE_STATS *ue_stats; if (UE_id == -1) { - LOG_W(MAC,"rrc_mac_remove_ue: UE %x not found\n", rntiP); + LOG_W(MAC,"rrc_mac_remove_ue: UE %x not found\n", + rntiP); return 0; } - pCC_id = UE_PCCID(mod_idP,UE_id); - LOG_I(MAC,"Removing UE %d from Primary CC_id %d (rnti %x)\n",UE_id,pCC_id, rntiP); - dump_ue_list(UE_list,0); + pCC_id = UE_PCCID(mod_idP, + UE_id); + LOG_I(MAC,"Removing UE %d from Primary CC_id %d (rnti %x)\n", + UE_id, + pCC_id, + rntiP); + dump_ue_list(UE_list, + 0); UE_list->active[UE_id] = FALSE; UE_list->num_UEs--; - if (UE_list->head == UE_id) UE_list->head=UE_list->next[UE_id]; - else UE_list->next[prev(UE_list,UE_id,0)]=UE_list->next[UE_id]; + if (UE_list->head == UE_id) UE_list->head = UE_list->next[UE_id]; + else UE_list->next[prev(UE_list, + UE_id, + 0)] = UE_list->next[UE_id]; - if (UE_list->head_ul == UE_id) UE_list->head_ul=UE_list->next_ul[UE_id]; - else UE_list->next_ul[prev(UE_list,UE_id,0)]=UE_list->next_ul[UE_id]; + if (UE_list->head_ul == UE_id) UE_list->head_ul = UE_list->next_ul[UE_id]; + else UE_list->next_ul[prev(UE_list, + UE_id, + 0)] = UE_list->next_ul[UE_id]; // clear all remaining pending transmissions /* UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID0] = 0; @@ -2080,30 +2246,34 @@ int rrc_mac_remove_ue(module_id_t mod_idP, rnti_t rntiP) UE_list->UE_template[pCC_id][UE_id].rnti = NOT_A_RNTI; UE_list->UE_template[pCC_id][UE_id].ul_active = FALSE; */ - memset (&UE_list->UE_template[pCC_id][UE_id],0,sizeof(UE_TEMPLATE)); - UE_list->eNB_UE_stats[pCC_id][UE_id].total_rbs_used = 0; - UE_list->eNB_UE_stats[pCC_id][UE_id].total_rbs_used_retx = 0; + memset (&UE_list->UE_template[pCC_id][UE_id], + 0, + sizeof(UE_TEMPLATE)); + + ue_stats = &UE_list->eNB_UE_stats[pCC_id][UE_id]; + ue_stats->total_rbs_used = 0; + ue_stats->total_rbs_used_retx = 0; for ( j = 0; j < NB_RB_MAX; j++ ) { - UE_list->eNB_UE_stats[pCC_id][UE_id].num_pdu_tx[j] = 0; - UE_list->eNB_UE_stats[pCC_id][UE_id].num_bytes_tx[j] = 0; + ue_stats->num_pdu_tx[j] = 0; + ue_stats->num_bytes_tx[j] = 0; } - UE_list->eNB_UE_stats[pCC_id][UE_id].num_retransmission = 0; - UE_list->eNB_UE_stats[pCC_id][UE_id].total_sdu_bytes = 0; - UE_list->eNB_UE_stats[pCC_id][UE_id].total_pdu_bytes = 0; - UE_list->eNB_UE_stats[pCC_id][UE_id].total_num_pdus = 0; - UE_list->eNB_UE_stats[pCC_id][UE_id].total_rbs_used_rx = 0; + ue_stats->num_retransmission = 0; + ue_stats->total_sdu_bytes = 0; + ue_stats->total_pdu_bytes = 0; + ue_stats->total_num_pdus = 0; + ue_stats->total_rbs_used_rx = 0; for ( j = 0; j < NB_RB_MAX; j++ ) { - UE_list->eNB_UE_stats[pCC_id][UE_id].num_pdu_rx[j] = 0; - UE_list->eNB_UE_stats[pCC_id][UE_id].num_bytes_rx[j] = 0; + ue_stats->num_pdu_rx[j] = 0; + ue_stats->num_bytes_rx[j] = 0; } - UE_list->eNB_UE_stats[pCC_id][UE_id].num_errors_rx = 0; - UE_list->eNB_UE_stats[pCC_id][UE_id].total_pdu_bytes_rx = 0; - UE_list->eNB_UE_stats[pCC_id][UE_id].total_num_pdus_rx = 0; - UE_list->eNB_UE_stats[pCC_id][UE_id].total_num_errors_rx = 0; + ue_stats->num_errors_rx = 0; + ue_stats->total_pdu_bytes_rx = 0; + ue_stats->total_num_pdus_rx = 0; + ue_stats->total_num_errors_rx = 0; eNB_ulsch_info[mod_idP][pCC_id][UE_id].rnti = NOT_A_RNTI; eNB_ulsch_info[mod_idP][pCC_id][UE_id].status = S_UL_NONE; eNB_dlsch_info[mod_idP][pCC_id][UE_id].rnti = NOT_A_RNTI; @@ -2112,29 +2282,34 @@ int rrc_mac_remove_ue(module_id_t mod_idP, rnti_t rntiP) eNB_dlsch_info[mod_idP][pCC_id][UE_id].serving_num = 0; // check if this has an RA process active - if(find_RA_id(mod_idP, pCC_id, rntiP) != -1) { - cancel_ra_proc(mod_idP, pCC_id, 0, rntiP); + if (find_RA_id(mod_idP, + pCC_id, + rntiP) != -1) { + cancel_ra_proc(mod_idP, + pCC_id, + 0, + rntiP); } pthread_mutex_lock(&rrc_release_freelist); - if(rrc_release_info.num_UEs > 0) { + if (rrc_release_info.num_UEs > 0) { uint16_t release_total = 0; - for(uint16_t release_num = 0; release_num < NUMBER_OF_UE_MAX; release_num++) { - if(rrc_release_info.RRC_release_ctrl[release_num].flag > 0) { + for (uint16_t release_num = 0; release_num < NUMBER_OF_UE_MAX; release_num++) { + if (rrc_release_info.RRC_release_ctrl[release_num].flag > 0) { release_total++; } else { continue; } - if(rrc_release_info.RRC_release_ctrl[release_num].rnti == rntiP) { + if (rrc_release_info.RRC_release_ctrl[release_num].rnti == rntiP) { rrc_release_info.RRC_release_ctrl[release_num].flag = 0; rrc_release_info.num_UEs--; release_total--; } - if(release_total >= rrc_release_info.num_UEs) { + if (release_total >= rrc_release_info.num_UEs) { break; } } @@ -2144,44 +2319,65 @@ int rrc_mac_remove_ue(module_id_t mod_idP, rnti_t rntiP) return 0; } -int prev(UE_list_t *listP, int nodeP, int ul_flag) { +//------------------------------------------------------------------------------ +int +prev(UE_list_t *listP, + int nodeP, + int ul_flag) +//------------------------------------------------------------------------------ +{ int j; if (ul_flag == 0) { if (nodeP == listP->head) { - return (nodeP); + return nodeP; } for (j = listP->head; j >= 0; j = listP->next[j]) { if (listP->next[j] == nodeP) { - return (j); + return j; } } } else { if (nodeP == listP->head_ul) { - return (nodeP); + return nodeP; } for (j = listP->head_ul; j >= 0; j = listP->next_ul[j]) { if (listP->next_ul[j] == nodeP) { - return (j); + return j; } } } - LOG_E(MAC, - "error in prev(), could not find previous to %d in UE_list %s, should never happen, Dumping UE list\n", - nodeP, (ul_flag == 0) ? "DL" : "UL"); - dump_ue_list(listP, ul_flag); - return (-1); + LOG_E(MAC, "error in prev(), could not find previous to %d in UE_list %s, should never happen, Dumping UE list\n", + nodeP, + (ul_flag == 0) ? "DL" : "UL"); + dump_ue_list(listP, + ul_flag); + return -1; } -void swap_UEs(UE_list_t *listP, int nodeiP, int nodejP, int ul_flag) { +//------------------------------------------------------------------------------ +void +swap_UEs(UE_list_t *listP, + int nodeiP, + int nodejP, + int ul_flag) +//------------------------------------------------------------------------------ +{ int prev_i, prev_j, next_i, next_j; - LOG_T(MAC, "Swapping UE %d,%d\n", nodeiP, nodejP); - dump_ue_list(listP, ul_flag); - prev_i = prev(listP, nodeiP, ul_flag); - prev_j = prev(listP, nodejP, ul_flag); + LOG_T(MAC, "Swapping UE %d,%d\n", + nodeiP, + nodejP); + dump_ue_list(listP, + ul_flag); + prev_i = prev(listP, + nodeiP, + ul_flag); + prev_j = prev(listP, + nodejP, + ul_flag); AssertFatal((prev_i >= 0) && (prev_j >= 0), "swap_UEs: problem"); if (ul_flag == 0) { @@ -2193,12 +2389,14 @@ void swap_UEs(UE_list_t *listP, int nodeiP, int nodejP, int ul_flag) { } LOG_T(MAC, "[%s] next_i %d, next_i, next_j %d, head %d \n", - (ul_flag == 0) ? "DL" : "UL", next_i, next_j, listP->head); + (ul_flag == 0) ? "DL" : "UL", + next_i, + next_j, + listP->head); if (ul_flag == 0) { if (next_i == nodejP) { // case ... p(i) i j n(j) ... => ... p(j) j i n(i) ... - LOG_T(MAC, - "Case ... p(i) i j n(j) ... => ... p(j) j i n(i) ...\n"); + LOG_T(MAC, "Case ... p(i) i j n(j) ... => ... p(j) j i n(i) ...\n"); listP->next[nodeiP] = next_j; listP->next[nodejP] = nodeiP; @@ -2208,8 +2406,7 @@ void swap_UEs(UE_list_t *listP, int nodeiP, int nodejP, int ul_flag) { listP->next[prev_i] = nodejP; } } else if (next_j == nodeiP) { // case ... p(j) j i n(i) ... => ... p(i) i j n(j) ... - LOG_T(MAC, - "Case ... p(j) j i n(i) ... => ... p(i) i j n(j) ...\n"); + LOG_T(MAC, "Case ... p(j) j i n(i) ... => ... p(i) i j n(j) ...\n"); listP->next[nodejP] = next_i; listP->next[nodeiP] = nodejP; @@ -2223,11 +2420,13 @@ void swap_UEs(UE_list_t *listP, int nodeiP, int nodejP, int ul_flag) { listP->next[nodeiP] = next_j; if (nodeiP == listP->head) { - LOG_T(MAC, "changing head to %d\n", nodejP); + LOG_T(MAC, "changing head to %d\n", + nodejP); listP->head = nodejP; listP->next[prev_j] = nodeiP; } else if (nodejP == listP->head) { - LOG_D(MAC, "changing head to %d\n", nodeiP); + LOG_D(MAC, "changing head to %d\n", + nodeiP); listP->head = nodeiP; listP->next[prev_i] = nodejP; } else { @@ -2237,8 +2436,7 @@ void swap_UEs(UE_list_t *listP, int nodeiP, int nodejP, int ul_flag) { } } else { // ul_flag if (next_i == nodejP) { // case ... p(i) i j n(j) ... => ... p(j) j i n(i) ... - LOG_T(MAC, - "[UL] Case ... p(i) i j n(j) ... => ... p(j) j i n(i) ...\n"); + LOG_T(MAC, "[UL] Case ... p(i) i j n(j) ... => ... p(j) j i n(i) ...\n"); listP->next_ul[nodeiP] = next_j; listP->next_ul[nodejP] = nodeiP; @@ -2248,8 +2446,7 @@ void swap_UEs(UE_list_t *listP, int nodeiP, int nodejP, int ul_flag) { listP->next_ul[prev_i] = nodejP; } } else if (next_j == nodeiP) { // case ... p(j) j i n(i) ... => ... p(i) i j n(j) ... - LOG_T(MAC, - "[UL]Case ... p(j) j i n(i) ... => ... p(i) i j n(j) ...\n"); + LOG_T(MAC, "[UL]Case ... p(j) j i n(i) ... => ... p(i) i j n(j) ...\n"); listP->next_ul[nodejP] = next_i; listP->next_ul[nodeiP] = nodejP; @@ -2263,11 +2460,13 @@ void swap_UEs(UE_list_t *listP, int nodeiP, int nodejP, int ul_flag) { listP->next_ul[nodeiP] = next_j; if (nodeiP == listP->head_ul) { - LOG_T(MAC, "[UL]changing head to %d\n", nodejP); + LOG_T(MAC, "[UL]changing head to %d\n", + nodejP); listP->head_ul = nodejP; listP->next_ul[prev_j] = nodeiP; } else if (nodejP == listP->head_ul) { - LOG_T(MAC, "[UL]changing head to %d\n", nodeiP); + LOG_T(MAC, "[UL]changing head to %d\n", + nodeiP); listP->head_ul = nodeiP; listP->next_ul[prev_i] = nodejP; } else { @@ -2278,14 +2477,18 @@ void swap_UEs(UE_list_t *listP, int nodeiP, int nodejP, int ul_flag) { } LOG_T(MAC, "After swap\n"); - dump_ue_list(listP, ul_flag); + dump_ue_list(listP, + ul_flag); + return; } // This has to be updated to include BSR information +//------------------------------------------------------------------------------ uint8_t UE_is_to_be_scheduled(module_id_t module_idP, int CC_id, uint8_t UE_id) +//------------------------------------------------------------------------------ { UE_TEMPLATE *UE_template = &RC.mac[module_idP]->UE_list.UE_template[CC_id][UE_id]; UE_sched_ctrl *UE_sched_ctl = &RC.mac[module_idP]->UE_list.UE_sched_ctrl[UE_id]; @@ -2294,62 +2497,82 @@ UE_is_to_be_scheduled(module_id_t module_idP, if (UE_sched_ctl->ul_failure_timer > 0 || UE_sched_ctl->ul_out_of_sync > 0) return 0; + rnti_t ue_rnti = UE_RNTI(module_idP, + UE_id); LOG_D(MAC, "[eNB %d][PUSCH] Checking UL requirements UE %d/%x\n", - module_idP, UE_id, UE_RNTI(module_idP, UE_id)); - - if ((UE_template->scheduled_ul_bytes < UE_template->estimated_ul_buffer) || - (UE_template->ul_SR > 0) || // uplink scheduling request - ((UE_sched_ctl->ul_inactivity_timer > 20) && (UE_sched_ctl->ul_scheduled == 0)) || // every 2 frames when RRC_CONNECTED - ((UE_sched_ctl->ul_inactivity_timer > 10) && (UE_sched_ctl->ul_scheduled == 0) && - (mac_eNB_get_rrc_status(module_idP, UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED))) { // every Frame when not RRC_CONNECTED - LOG_D(MAC, - "[eNB %d][PUSCH] UE %d/%x should be scheduled (BSR0 estimated size %d, SR %d)\n", - module_idP, UE_id, UE_RNTI(module_idP, UE_id), + module_idP, + UE_id, + ue_rnti); + + if (UE_template->scheduled_ul_bytes < UE_template->estimated_ul_buffer || + UE_template->ul_SR > 0 || // uplink scheduling request + (UE_sched_ctl->ul_inactivity_timer > 20 && UE_sched_ctl->ul_scheduled == 0) || // every 2 frames when RRC_CONNECTED + (UE_sched_ctl->ul_inactivity_timer > 10 && + UE_sched_ctl->ul_scheduled == 0 && + mac_eNB_get_rrc_status(module_idP, + ue_rnti) < RRC_CONNECTED)) { // every Frame when not RRC_CONNECTED + LOG_D(MAC, "[eNB %d][PUSCH] UE %d/%x should be scheduled (BSR0 estimated size %d, SR %d)\n", + module_idP, + UE_id, + ue_rnti, UE_template->ul_buffer_info[LCGID0], UE_template->ul_SR); return 1; - } + } return 0; } -uint8_t -get_tmode(module_id_t module_idP, - int CC_idP, +//------------------------------------------------------------------------------ +uint8_t +get_tmode(module_id_t module_idP, + int CC_idP, int UE_idP) +//------------------------------------------------------------------------------ { eNB_MAC_INST *eNB = RC.mac[module_idP]; COMMON_channels_t *cc = &eNB->common_channels[CC_idP]; - struct LTE_PhysicalConfigDedicated *physicalConfigDedicated = eNB->UE_list.UE_template[CC_idP][UE_idP].physicalConfigDedicated; if (physicalConfigDedicated == NULL) { // RRCConnectionSetup not received by UE yet - AssertFatal(cc->p_eNB <= 2, "p_eNB is %d, should be <2\n", cc->p_eNB); + AssertFatal(cc->p_eNB <= 2, "p_eNB is %d, should be <2\n", + cc->p_eNB); return (cc->p_eNB); - } + } - AssertFatal(physicalConfigDedicated->antennaInfo != NULL, + AssertFatal(physicalConfigDedicated->antennaInfo != NULL, "antennaInfo (mod_id %d) is null for CCId %d, UEid %d, physicalConfigDedicated %p\n", - module_idP, CC_idP, UE_idP,physicalConfigDedicated); - + module_idP, + CC_idP, + UE_idP, + physicalConfigDedicated); + AssertFatal(physicalConfigDedicated->antennaInfo->present != LTE_PhysicalConfigDedicated__antennaInfo_PR_NOTHING, - "antennaInfo (mod_id %d, CC_id %d) is set to NOTHING\n", module_idP, CC_idP); + "antennaInfo (mod_id %d, CC_id %d) is set to NOTHING\n", + module_idP, + CC_idP); if (physicalConfigDedicated->antennaInfo->present == LTE_PhysicalConfigDedicated__antennaInfo_PR_explicitValue) { return (1 + physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode); - } + } if (physicalConfigDedicated->antennaInfo->present == LTE_PhysicalConfigDedicated__antennaInfo_PR_defaultValue) { - AssertFatal(cc->p_eNB <= 2, "p_eNB is %d, should be <2\n", cc->p_eNB); + AssertFatal(cc->p_eNB <= 2, "p_eNB is %d, should be <2\n", + cc->p_eNB); return (cc->p_eNB); - } + } AssertFatal(1 == 0, "Shouldn't be here\n"); return 0; } +//------------------------------------------------------------------------------ int8_t -get_ULharq(module_id_t module_idP, int CC_idP, uint16_t frameP, - uint8_t subframeP) { - uint8_t ret = -1; +get_ULharq(module_id_t module_idP, + int CC_idP, + uint16_t frameP, + uint8_t subframeP) +//------------------------------------------------------------------------------ +{ + int8_t ret = -1; eNB_MAC_INST *eNB = RC.mac[module_idP]; COMMON_channels_t *cc = &eNB->common_channels[CC_idP]; @@ -2358,77 +2581,74 @@ get_ULharq(module_id_t module_idP, int CC_idP, uint16_t frameP, } else { switch (cc->tdd_Config->subframeAssignment) { case 1: - if ((subframeP == 2) || - (subframeP == 3) || (subframeP == 7) || (subframeP == 8)) - switch (subframeP) { - case 2: - case 3: - ret = (subframeP - 2); - break; + switch (subframeP) { + case 2: + case 3: + ret = (subframeP - 2); + break; - case 7: - case 8: - ret = (subframeP - 5); - break; + case 7: + case 8: + ret = (subframeP - 5); + break; - default: - AssertFatal(1 == 0, - "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", - subframeP, - (int) cc->tdd_Config->subframeAssignment); - break; - } + default: + AssertFatal(1 == 0, "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframeP, + (int) cc->tdd_Config->subframeAssignment); + break; + } break; case 2: - AssertFatal((subframeP == 2) || (subframeP == 7), - "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + AssertFatal((subframeP == 2) || (subframeP == 7), "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", subframeP, (int) cc->tdd_Config->subframeAssignment); ret = (subframeP / 7); break; case 3: - AssertFatal((subframeP > 1) && (subframeP < 5), - "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + AssertFatal((subframeP > 1) && (subframeP < 5), "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", subframeP, (int) cc->tdd_Config->subframeAssignment); ret = (subframeP - 2); break; case 4: - AssertFatal((subframeP > 1) && (subframeP < 4), - "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + AssertFatal((subframeP > 1) && (subframeP < 4), "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", subframeP, (int) cc->tdd_Config->subframeAssignment); ret = (subframeP - 2); break; case 5: - AssertFatal(subframeP == 2, - "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + AssertFatal(subframeP == 2, "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", subframeP, (int) cc->tdd_Config->subframeAssignment); ret = (subframeP - 2); break; default: - AssertFatal(1 == 0, - "subframe2_harq_pid, Unsupported TDD mode %d\n", + AssertFatal(1 == 0, "subframe2_harq_pid, Unsupported TDD mode %d\n", (int) cc->tdd_Config->subframeAssignment); break; } } - AssertFatal(ret != -1, - "invalid harq_pid(%d) at SFN/SF = %d/%d\n", (int8_t) ret, - frameP, subframeP); + AssertFatal(ret != -1, "invalid harq_pid(%d) at SFN/SF = %d/%d\n", (int8_t) ret, + frameP, + subframeP); return ret; } - -uint16_t getRIV(uint16_t N_RB_DL, uint16_t RBstart, uint16_t Lcrbs) { +//------------------------------------------------------------------------------ +uint16_t +getRIV(uint16_t N_RB_DL, + uint16_t RBstart, + uint16_t Lcrbs) +//------------------------------------------------------------------------------ +{ uint16_t RIV; if (Lcrbs <= (1 + (N_RB_DL >> 1))) @@ -2436,12 +2656,17 @@ uint16_t getRIV(uint16_t N_RB_DL, uint16_t RBstart, uint16_t Lcrbs) { else RIV = (N_RB_DL * (N_RB_DL + 1 - Lcrbs)) + (N_RB_DL - 1 - RBstart); - return (RIV); + return RIV; } +//------------------------------------------------------------------------------ uint32_t -allocate_prbs(int UE_id, unsigned char nb_rb, int N_RB_DL, - uint32_t *rballoc) { +allocate_prbs(int UE_id, + unsigned char nb_rb, + int N_RB_DL, + uint32_t *rballoc) +//------------------------------------------------------------------------------ +{ int i; uint32_t rballoc_dci = 0; unsigned char nb_rb_alloc = 0; @@ -2468,7 +2693,12 @@ allocate_prbs(int UE_id, unsigned char nb_rb, int N_RB_DL, return (rballoc_dci); } -int get_bw_index(module_id_t module_id, uint8_t CC_id) { +//------------------------------------------------------------------------------ +int +get_bw_index(module_id_t module_id, + uint8_t CC_id) +//------------------------------------------------------------------------------ +{ int bw_index = 0; int N_RB_DL = to_prb(RC.mac[module_id]->common_channels[CC_id].mib->message.dl_Bandwidth); @@ -2491,16 +2721,22 @@ int get_bw_index(module_id_t module_id, uint8_t CC_id) { default: bw_index = 1; - LOG_W(MAC, - "[eNB %d] N_RB_DL %d unknown for CC_id %d, setting bw_index to 1\n", - module_id, N_RB_DL, CC_id); + LOG_W(MAC, "[eNB %d] N_RB_DL %d unknown for CC_id %d, setting bw_index to 1\n", + module_id, + N_RB_DL, + CC_id); break; } return bw_index; } -int get_min_rb_unit(module_id_t module_id, uint8_t CC_id) { +//------------------------------------------------------------------------------ +int +get_min_rb_unit(module_id_t module_id, + uint8_t CC_id) +//------------------------------------------------------------------------------ +{ int min_rb_unit = 0; int N_RB_DL = to_prb(RC.mac[module_id]->common_channels[CC_id].mib->message.dl_Bandwidth); @@ -2523,24 +2759,36 @@ int get_min_rb_unit(module_id_t module_id, uint8_t CC_id) { default: min_rb_unit = 2; - LOG_W(MAC, - "[eNB %d] N_DL_RB %d unknown for CC_id %d, setting min_rb_unit to 2\n", - module_id, N_RB_DL, CC_id); + LOG_W(MAC, "[eNB %d] N_DL_RB %d unknown for CC_id %d, setting min_rb_unit to 2\n", + module_id, + N_RB_DL, + CC_id); break; } return min_rb_unit; } +//------------------------------------------------------------------------------ uint32_t -allocate_prbs_sub(int nb_rb, int N_RB_DL, int N_RBG, uint8_t *rballoc) { +allocate_prbs_sub(int nb_rb, + int N_RB_DL, + int N_RBG, + uint8_t *rballoc) +//------------------------------------------------------------------------------ +{ int check = 0; //check1=0,check2=0; uint32_t rballoc_dci = 0; //uint8_t number_of_subbands=13; LOG_T(MAC, "*****Check1RBALLOC****: %d%d%d%d (nb_rb %d,N_RBG %d)\n", - rballoc[3], rballoc[2], rballoc[1], rballoc[0], nb_rb, N_RBG); - - while ((nb_rb > 0) && (check < N_RBG)) { + rballoc[3], + rballoc[2], + rballoc[1], + rballoc[0], + nb_rb, + N_RBG); + + while (nb_rb > 0 && check < N_RBG) { //printf("rballoc[%d] %d\n",check,rballoc[check]); if (rballoc[check] == 1) { rballoc_dci |= (1 << ((N_RBG - 1) - check)); @@ -2556,7 +2804,6 @@ allocate_prbs_sub(int nb_rb, int N_RB_DL, int N_RBG, uint8_t *rballoc) { } else { nb_rb -= 2; } - break; case 50: @@ -2565,7 +2812,6 @@ allocate_prbs_sub(int nb_rb, int N_RB_DL, int N_RBG, uint8_t *rballoc) { } else { nb_rb -= 3; } - break; case 100: @@ -2575,24 +2821,33 @@ allocate_prbs_sub(int nb_rb, int N_RB_DL, int N_RBG, uint8_t *rballoc) { } // printf("rb_alloc %x\n",rballoc_dci); - check = check + 1; + check++; // check1 = check1+2; } // rballoc_dci = (rballoc_dci)&(0x1fff); - LOG_T(MAC, "*********RBALLOC : %x\n", rballoc_dci); + LOG_T(MAC, "*********RBALLOC : %x\n", + rballoc_dci); // exit(-1); - return (rballoc_dci); + return rballoc_dci; } -int get_subbandsize(uint8_t dl_Bandwidth) { +//------------------------------------------------------------------------------ +int +get_subbandsize(uint8_t dl_Bandwidth) +//------------------------------------------------------------------------------ +{ uint8_t ss[6] = { 6, 4, 4, 6, 8, 8 }; AssertFatal(dl_Bandwidth < 6, "dl_Bandwidth %d is out of bounds\n", dl_Bandwidth); return (ss[dl_Bandwidth]); } -int get_nb_subband(int N_RB_DL) { +//------------------------------------------------------------------------------ +int +get_nb_subband(int N_RB_DL) +//------------------------------------------------------------------------------ +{ int nb_sb = 0; switch (N_RB_DL) { @@ -2632,7 +2887,9 @@ void init_CCE_table(int module_idP, int CC_idP) { - memset(RC.mac[module_idP]->CCE_table[CC_idP], 0, 800 * sizeof(int)); + memset(RC.mac[module_idP]->CCE_table[CC_idP], + 0, + 800 * sizeof(int)); } */ void @@ -2641,12 +2898,16 @@ init_CCE_table(int *CCE_table) memset(CCE_table, 0, 800 * sizeof(int)); } +//------------------------------------------------------------------------------ int get_nCCE_offset(int *CCE_table, const unsigned char L, const int nCCE, const int common_dci, - const unsigned short rnti, const unsigned char subframe) { + const unsigned short rnti, + const unsigned char subframe) +//------------------------------------------------------------------------------ +{ int search_space_free, m, nb_candidates = 0, l, i; unsigned int Yk; @@ -2676,70 +2937,82 @@ get_nCCE_offset(int *CCE_table, if (search_space_free == 1) { // printf("returning %d\n",m*L); - for (l = 0; l < L; l++) + for (l = 0; l < L; l++) { CCE_table[(m * L) + l] = 1; - + } return (m * L); } } - return (-1); - } else { // Find first available in ue specific search space - // according to procedure in Section 9.1.1 of 36.213 (v. 8.6) - // compute Yk - Yk = (unsigned int) rnti; - - for (i = 0; i <= subframe; i++) - Yk = (Yk * 39827) % 65537; + return -1; + } + // Find first available in ue specific search space + // according to procedure in Section 9.1.1 of 36.213 (v. 8.6) + // compute Yk + Yk = (unsigned int) rnti; - Yk = Yk % (nCCE / L); + for (i = 0; i <= subframe; i++) { + Yk = (Yk * 39827) % 65537; + } + Yk = Yk % (nCCE / L); - switch (L) { - case 1: - case 2: - nb_candidates = 6; - break; + switch (L) { + case 1: + case 2: + nb_candidates = 6; + break; - case 4: - case 8: - nb_candidates = 2; - break; + case 4: + case 8: + nb_candidates = 2; + break; - default: - DevParam(L, nCCE, rnti); - break; - } + default: + DevParam(L, + nCCE, + rnti); + break; + } - LOG_D(MAC, "rnti %x, Yk = %d, nCCE %d (nCCE/L %d),nb_cand %d\n", - rnti, Yk, nCCE, nCCE / L, nb_candidates); + LOG_D(MAC, "rnti %x, Yk = %d, nCCE %d (nCCE/L %d),nb_cand %d\n", + rnti, + Yk, + nCCE, + nCCE / L, + nb_candidates); - for (m = 0; m < nb_candidates; m++) { - search_space_free = 1; + for (m = 0; m < nb_candidates; m++) { + search_space_free = 1; - for (l = 0; l < L; l++) { - int cce = (((Yk + m) % (nCCE / L)) * L) + l; + for (l = 0; l < L; l++) { + int cce = (((Yk + m) % (nCCE / L)) * L) + l; - if (cce >= nCCE || CCE_table[cce] == 1) { - search_space_free = 0; - break; - } + if (cce >= nCCE || CCE_table[cce] == 1) { + search_space_free = 0; + break; } + } - if (search_space_free == 1) { - for (l = 0; l < L; l++) - CCE_table[(((Yk + m) % (nCCE / L)) * L) + l] = 1; - - return (((Yk + m) % (nCCE / L)) * L); + if (search_space_free == 1) { + for (l = 0; l < L; l++) { + CCE_table[(((Yk + m) % (nCCE / L)) * L) + l] = 1; } + return (((Yk + m) % (nCCE / L)) * L); } - - return (-1); } + + return -1; } +//------------------------------------------------------------------------------ void -dump_CCE_table(int *CCE_table, const int nCCE, - const unsigned short rnti, const int subframe, int L) { +dump_CCE_table(int *CCE_table, + const int nCCE, + const unsigned short rnti, + const int subframe, + int L) +//------------------------------------------------------------------------------ +{ int nb_candidates = 0, i; unsigned int Yk; printf("CCE 0: "); @@ -2748,14 +3021,15 @@ dump_CCE_table(int *CCE_table, const int nCCE, printf("%1d.", CCE_table[i]); if ((i & 7) == 7) - printf("\n CCE %d: ", i); + printf("\n CCE %d: ", + i); } Yk = (unsigned int) rnti; - for (i = 0; i <= subframe; i++) + for (i = 0; i <= subframe; i++) { Yk = (Yk * 39827) % 65537; - + } Yk = Yk % (nCCE / L); switch (L) { @@ -2774,12 +3048,21 @@ dump_CCE_table(int *CCE_table, const int nCCE, break; } - printf("rnti %x, Yk*L = %u, nCCE %d (nCCE/L %d),nb_cand*L %d\n", rnti, - Yk * L, nCCE, nCCE / L, nb_candidates * L); + LOG_I(PHY, "rnti %x, Yk*L = %u, nCCE %d (nCCE/L %d),nb_cand*L %d\n", + rnti, + Yk * L, + nCCE, + nCCE / L, + nb_candidates * L); } +//------------------------------------------------------------------------------ uint16_t -getnquad(COMMON_channels_t *cc, uint8_t num_pdcch_symbols, uint8_t mi) { +getnquad(COMMON_channels_t *cc, + uint8_t num_pdcch_symbols, + uint8_t mi) +//------------------------------------------------------------------------------ +{ uint16_t Nreg = 0; AssertFatal(cc != NULL, "cc is null\n"); AssertFatal(cc->mib != NULL, "cc->mib is null\n"); @@ -2787,16 +3070,16 @@ getnquad(COMMON_channels_t *cc, uint8_t num_pdcch_symbols, uint8_t mi) { int phich_resource = get_phich_resource_times6(cc); uint8_t Ngroup_PHICH = (phich_resource * N_RB_DL) / 48; - if (((phich_resource * N_RB_DL) % 48) > 0) + if (((phich_resource * N_RB_DL) % 48) > 0) { Ngroup_PHICH++; - + } if (cc->Ncp == 1) { Ngroup_PHICH <<= 1; } Ngroup_PHICH *= mi; - if ((num_pdcch_symbols > 0) && (num_pdcch_symbols < 4)) + if (num_pdcch_symbols > 0 && num_pdcch_symbols < 4) switch (N_RB_DL) { case 6: Nreg = 12 + (num_pdcch_symbols - 1) * 18; @@ -2815,20 +3098,32 @@ getnquad(COMMON_channels_t *cc, uint8_t num_pdcch_symbols, uint8_t mi) { break; default: - return (0); + return 0; } // printf("Nreg %d (%d)\n",Nreg,Nreg - 4 - (3*Ngroup_PHICH)); return (Nreg - 4 - (3 * Ngroup_PHICH)); } +//------------------------------------------------------------------------------ uint16_t -getnCCE(COMMON_channels_t *cc, uint8_t num_pdcch_symbols, uint8_t mi) { +getnCCE(COMMON_channels_t *cc, + uint8_t num_pdcch_symbols, + uint8_t mi) +//------------------------------------------------------------------------------ +{ AssertFatal(cc != NULL, "cc is null\n"); - return (getnquad(cc, num_pdcch_symbols, mi) / 9); + return (getnquad(cc, + num_pdcch_symbols, + mi) / 9); } -uint8_t getmi(COMMON_channels_t *cc, int subframe) { +//------------------------------------------------------------------------------ +uint8_t +getmi(COMMON_channels_t *cc, + int subframe) +//------------------------------------------------------------------------------ +{ AssertFatal(cc != NULL, "cc is null\n"); // for FDD @@ -2838,75 +3133,73 @@ uint8_t getmi(COMMON_channels_t *cc, int subframe) { // for TDD switch (cc->tdd_Config->subframeAssignment) { case 0: - if ((subframe == 0) || (subframe == 5)) - return (2); - else - return (1); - - break; + if (subframe == 0 || subframe == 5) { + return 2; + } + return 1; case 1: - if ((subframe == 0) || (subframe == 5)) - return (0); - else - return (1); - - break; + if (subframe == 0 || subframe == 5) { + return 0; + } + return 1; case 2: - if ((subframe == 3) || (subframe == 8)) - return (1); - else - return (0); - - break; - - case 3: - if ((subframe == 0) || (subframe == 8) || (subframe == 9)) - return (1); - else - return (0); + if (subframe == 3 || subframe == 8) { + return 0; + } + return 1; - break; + case 3: + if (subframe == 0 || subframe == 8 || subframe == 9) { + return 1; + } + return 0; case 4: - if ((subframe == 8) || (subframe == 9)) - return (1); - else - return (0); - - break; + if (subframe == 8 || subframe == 9) { + return 1; + } + return 0; case 5: - if (subframe == 8) - return (1); - else - return (0); - - break; + if (subframe == 8) { + return 1; + } + return 0; case 6: - return (1); - break; + return 1; default: - return (0); + break; } + return 0; } +//------------------------------------------------------------------------------ uint16_t -get_nCCE_max(COMMON_channels_t *cc, int num_pdcch_symbols, int subframe) { +get_nCCE_max(COMMON_channels_t *cc, + int num_pdcch_symbols, + int subframe) +//------------------------------------------------------------------------------ +{ AssertFatal(cc != NULL, "cc is null\n"); - return (getnCCE(cc, num_pdcch_symbols, getmi(cc, subframe))); + return (getnCCE(cc, + num_pdcch_symbols, + getmi(cc, + subframe))); } // Allocate the CCEs +//------------------------------------------------------------------------------ int allocate_CCEs(int module_idP, int CC_idP, frame_t frameP, sub_frame_t subframeP, int test_onlyP) +//------------------------------------------------------------------------------ { eNB_MAC_INST *eNB = RC.mac[module_idP]; int *CCE_table = eNB->CCE_table[CC_idP]; @@ -3204,89 +3497,85 @@ try_again: return 0; } -nfapi_ul_config_request_pdu_t *has_ul_grant(module_id_t module_idP, - int CC_idP, uint16_t absSFP, - uint16_t rnti) { - nfapi_ul_config_request_body_t *ul_req; - nfapi_ul_config_request_pdu_t *ul_config_pdu; - ul_req = &RC.mac[module_idP]->UL_req_tmp[CC_idP][absSFP % 10].ul_config_request_body; - ul_config_pdu = &ul_req->ul_config_pdu_list[0]; - LOG_D(MAC, - "Checking for rnti %x UL grant in subframeP %d (num pdu %d)\n", - rnti, absSFP % 10, ul_req->number_of_pdus); - - for (int i = 0; i < ul_req->number_of_pdus; i++) { - LOG_D(MAC, "PDU %d : type %d,rnti %x\n", i,ul_config_pdu[i].pdu_type, rnti); - - if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE) - && (ul_config_pdu[i].ulsch_pdu.ulsch_pdu_rel8.rnti == rnti)) - return (&ul_config_pdu[i]); - - if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE) - && (ul_config_pdu[i].ulsch_cqi_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti == rnti)) - return (&ul_config_pdu[i]); - - if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE) - && (ul_config_pdu[i].ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti == rnti)) - return (&ul_config_pdu[i]); - - if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE) - && (ul_config_pdu[i].ulsch_cqi_harq_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti == rnti)) - return (&ul_config_pdu[i]); - - if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE) - && (ul_config_pdu[i].uci_cqi_pdu.ue_information.ue_information_rel8.rnti == rnti)) - return (&ul_config_pdu[i]); - - if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE) - && (ul_config_pdu[i].uci_sr_pdu.ue_information.ue_information_rel8.rnti == rnti)) - return (&ul_config_pdu[i]); - - if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE) - && (ul_config_pdu[i].uci_harq_pdu.ue_information.ue_information_rel8.rnti == rnti)) - return (&ul_config_pdu[i]); - - if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE) - && (ul_config_pdu[i].uci_sr_harq_pdu.ue_information.ue_information_rel8.rnti == rnti)) - return (&ul_config_pdu[i]); - - if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE) - && (ul_config_pdu[i].uci_cqi_harq_pdu.ue_information.ue_information_rel8.rnti == rnti)) - return (&ul_config_pdu[i]); - - if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE) - && (ul_config_pdu[i].uci_cqi_sr_pdu.ue_information.ue_information_rel8.rnti == rnti)) - return (&ul_config_pdu[i]); - - if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE) - && (ul_config_pdu[i].uci_cqi_sr_harq_pdu.ue_information.ue_information_rel8.rnti == rnti)) - return (&ul_config_pdu[i]); - - if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE) - && (ul_config_pdu[i].ulsch_uci_csi_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti == rnti)) - return (&ul_config_pdu[i]); - - if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE) - && (ul_config_pdu[i].ulsch_uci_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti == rnti)) - return (&ul_config_pdu[i]); - - if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE) - && (ul_config_pdu[i].ulsch_csi_uci_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti == rnti)) - return (&ul_config_pdu[i]); +//------------------------------------------------------------------------------ +nfapi_ul_config_request_pdu_t * +has_ul_grant(module_id_t module_idP, + int CC_idP, + uint16_t absSFP, + uint16_t rnti) +//------------------------------------------------------------------------------ +{ + nfapi_ul_config_request_body_t *ul_req = &RC.mac[module_idP]->UL_req_tmp[CC_idP][absSFP % 10].ul_config_request_body; + nfapi_ul_config_request_pdu_t *ul_config_pdu = &ul_req->ul_config_pdu_list[0]; + uint8_t pdu_type; + + LOG_D(MAC, "Checking for rnti %x UL grant in subframeP %d (num pdu %d)\n", + rnti, + absSFP % 10, + ul_req->number_of_pdus); + + for (int i = 0; i < ul_req->number_of_pdus; i++, ul_config_pdu++) { + pdu_type = ul_config_pdu->pdu_type; + LOG_D(MAC, "PDU %d : type %d,rnti %x\n", + i, + pdu_type, + rnti); + + if (pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE && ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) + return ul_config_pdu; + + if (pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE && ul_config_pdu->ulsch_cqi_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) + return ul_config_pdu; + + if (pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE && ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) + return ul_config_pdu; + + if (pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE && ul_config_pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) + return ul_config_pdu; + + if (pdu_type == NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE && ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.rnti == rnti) + return ul_config_pdu; + + if (pdu_type == NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE && ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel8.rnti == rnti) + return ul_config_pdu; + + if (pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE && ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti == rnti) + return ul_config_pdu; + + if (pdu_type == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE && ul_config_pdu->uci_sr_harq_pdu.ue_information.ue_information_rel8.rnti == rnti) + return ul_config_pdu; + + if (pdu_type == NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE && ul_config_pdu->uci_cqi_harq_pdu.ue_information.ue_information_rel8.rnti == rnti) + return ul_config_pdu; + + if (pdu_type == NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE && ul_config_pdu->uci_cqi_sr_pdu.ue_information.ue_information_rel8.rnti == rnti) + return ul_config_pdu; + + if (pdu_type == NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE && ul_config_pdu->uci_cqi_sr_harq_pdu.ue_information.ue_information_rel8.rnti == rnti) + return ul_config_pdu; + + if (pdu_type == NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE && ul_config_pdu->ulsch_uci_csi_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) + return ul_config_pdu; + + if (pdu_type == NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE && ul_config_pdu->ulsch_uci_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) + return ul_config_pdu; + + if (pdu_type == NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE && ul_config_pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) + return ul_config_pdu; } return (NULL); // no ul grant at all for this UE } -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ boolean_t CCE_allocation_infeasible(int module_idP, int CC_idP, int format_flag, - int subframe, - int aggregation, - int rnti) -//----------------------------------------------------------------------------- + int subframe, + int aggregation, + int rnti) +//------------------------------------------------------------------------------ { nfapi_dl_config_request_body_t *DL_req = &RC.mac[module_idP]->DL_req[CC_idP].dl_config_request_body; nfapi_dl_config_request_pdu_t *dl_config_pdu = &DL_req->dl_config_pdu_list[DL_req->number_pdu]; @@ -3330,207 +3619,247 @@ CCE_allocation_infeasible(int module_idP, return res; } -void get_retransmission_timing(LTE_TDD_Config_t *tdd_Config, frame_t *frameP, - sub_frame_t *subframeP) { +//------------------------------------------------------------------------------ +void +get_retransmission_timing(LTE_TDD_Config_t *tdd_Config, + frame_t *frameP, + sub_frame_t *subframeP) +//------------------------------------------------------------------------------ +{ if (tdd_Config == NULL) { - if (*subframeP > 1) + if (*subframeP > 1) { *frameP = (*frameP + 1) % 1024; - + } *subframeP = (*subframeP + 8) % 10; } else { switch (tdd_Config->subframeAssignment) { //TODO fill in other TDD configs default: - printf("%s:%d: TODO\n", __FILE__, __LINE__); + printf("%s:%d: TODO\n", + __FILE__, + __LINE__); abort(); + break; case 1: if (*subframeP == 0 || *subframeP == 5) { *subframeP += 19; - *frameP = (*frameP + *subframeP/10) % 1024; + *frameP = (*frameP + (*subframeP / 10)) % 1024; *subframeP %= 10; } else if (*subframeP == 4 || *subframeP == 9) { *subframeP += 16; - *frameP = (*frameP + *subframeP/10) % 1024; + *frameP = (*frameP + (*subframeP / 10)) % 1024; *subframeP %= 10; } else { - AssertFatal(2 == 1, - "Illegal dl subframe %d for tdd config %ld\n", *subframeP, + AssertFatal(2 == 1, "Illegal dl subframe %d for tdd config %ld\n", + *subframeP, tdd_Config->subframeAssignment); } - break; } } + return; } -uint8_t get_dl_subframe_count(int tdd_config_sfa, sub_frame_t subframeP) { - uint8_t tdd1[10] = {1,-1,-1,-1,2,3,-1,-1,-1,4}; // special subframes 1,6 are excluded +//------------------------------------------------------------------------------ +uint8_t +get_dl_subframe_count(int tdd_config_sfa, + sub_frame_t subframeP) +//------------------------------------------------------------------------------ +{ + uint8_t tdd1[10] = {1, -1, -1, -1, 2, 3, -1, -1, -1, 4}; // special subframes 1,6 are excluded - switch(tdd_config_sfa) { // TODO fill in other tdd configs - case 1 : + switch (tdd_config_sfa) {// TODO fill in other tdd configs + case 1: return tdd1[subframeP]; - break; } return -1; } -uint8_t frame_subframe2_dl_harq_pid(LTE_TDD_Config_t *tdd_Config, int abs_frameP, sub_frame_t subframeP) { +//------------------------------------------------------------------------------ +uint8_t +frame_subframe2_dl_harq_pid(LTE_TDD_Config_t *tdd_Config, + int abs_frameP, + sub_frame_t subframeP) +//------------------------------------------------------------------------------ +{ int harq_pid; + uint8_t count; - if(tdd_Config) { + if (tdd_Config) { switch(tdd_Config->subframeAssignment) { //TODO fill in other tdd config case 1: - harq_pid = (((frame_cnt*1024 + abs_frameP) * 4) - 1 + get_dl_subframe_count(tdd_Config->subframeAssignment,subframeP))%7;//4 dl subframe in a frame + count = get_dl_subframe_count(tdd_Config->subframeAssignment, + subframeP); + harq_pid = (((frame_cnt * 1024 + abs_frameP) * 4) - 1 + count) % 7;//4 dl subframe in a frame - if(harq_pid < 0) + if (harq_pid < 0) { harq_pid += 7; + } LOG_D(MAC,"[frame_subframe2_dl_harq_pid] (%d,%d) calculate harq_pid ((( %d * 1024 + %d) *4) - 1 + %d) = %d \n", - (abs_frameP+1024)%1024,subframeP,frame_cnt,abs_frameP, - get_dl_subframe_count(tdd_Config->subframeAssignment,subframeP),harq_pid); + (abs_frameP + 1024) % 1024, + subframeP, + frame_cnt, + abs_frameP, + count, + harq_pid); return harq_pid; - break; } } else { - return ((abs_frameP*10)+subframeP)&7; + return ((abs_frameP * 10) + subframeP) & 7; } return -1; } -unsigned char ul_ACK_subframe2M(LTE_TDD_Config_t *tdd_Config,unsigned char subframe) { +//------------------------------------------------------------------------------ +unsigned char +ul_ACK_subframe2M(LTE_TDD_Config_t *tdd_Config, + unsigned char subframe) +//------------------------------------------------------------------------------ +{ if (tdd_Config == NULL) { - return(1); - } else { - switch (tdd_Config->subframeAssignment) { - case 1: - return 1; // don't ACK special subframe for now - - if (subframe == 2) { // ACK subframes 5 and 6 - return(2); - } else if (subframe == 3) { // ACK subframe 9 - return(1); // To be updated - } else if (subframe == 7) { // ACK subframes 0 and 1 - return(2); // To be updated - } else if (subframe == 8) { // ACK subframe 4 - return(1); // To be updated - } else { - AssertFatal(1==0,"illegal subframe %d for tdd_config %ld\n", - subframe,tdd_Config->subframeAssignment); - } - - break; - - case 3: - if (subframe == 2) { // ACK subframes 5 and 6 - return(2); // should be 3 - } else if (subframe == 3) { // ACK subframes 7 and 8 - return(2); // To be updated - } else if (subframe == 4) { // ACK subframes 9 and 0 - return(2); - } else { - AssertFatal(1==0,"illegal subframe %d for tdd_config %ld\n", - subframe,tdd_Config->subframeAssignment); - } - - break; - - case 4: - if (subframe == 2) { // ACK subframes 0,4 and 5 - return(3); // should be 4 - } else if (subframe == 3) { // ACK subframes 6,7,8 and 9 - return(4); - } else { - AssertFatal(1==0,"illegal subframe %d for tdd_config %ld\n", - subframe,tdd_Config->subframeAssignment); - } - - break; + return 1; + } + switch (tdd_Config->subframeAssignment) { + case 1: + return 1; // don't ACK special subframe for now + /* + if (subframe == 2) { // ACK subframes 5 and 6 + return(2); + } else if (subframe == 3) { // ACK subframe 9 + return(1); // To be updated + } else if (subframe == 7) { // ACK subframes 0 and 1 + return(2); // To be updated + } else if (subframe == 8) { // ACK subframe 4 + return(1); // To be updated + } else { + AssertFatal(1==0,"illegal subframe %d for tdd_config %ld\n", + subframe,tdd_Config->subframeAssignment); + } + break; + */ + case 3: + if (subframe == 2) { // ACK subframes 5 and 6 + return 2; // should be 3 + } + if (subframe == 3) { // ACK subframes 7 and 8 + return 2; // To be updated + } + if (subframe == 4) { // ACK subframes 9 and 0 + return 2; + } + AssertFatal(1==0,"illegal subframe %d for tdd_config %ld\n", + subframe, + tdd_Config->subframeAssignment); + break; - case 5: - if (subframe == 2) { // ACK subframes 0,3,4,5,6,7,8 and 9 - return(8); // should be 3 - } else { - AssertFatal(1==0,"illegal subframe %d for tdd_config %ld\n", - subframe,tdd_Config->subframeAssignment); - } + case 4: + if (subframe == 2) { // ACK subframes 0,4 and 5 + return 3; // should be 4 + } + if (subframe == 3) { // ACK subframes 6,7,8 and 9 + return 4; + } + AssertFatal(1==0,"illegal subframe %d for tdd_config %ld\n", + subframe, + tdd_Config->subframeAssignment); + break; - break; - } + case 5: + if (subframe == 2) { // ACK subframes 0,3,4,5,6,7,8 and 9 + return 8; // should be 3 + } + AssertFatal(1==0,"illegal subframe %d for tdd_config %ld\n", + subframe, + tdd_Config->subframeAssignment); + break; } - return(0); + return 0; } -unsigned char ul_ACK_subframe2dl_subframe(LTE_TDD_Config_t *tdd_Config,unsigned char subframe,unsigned char ACK_index) { +//------------------------------------------------------------------------------ +unsigned char +ul_ACK_subframe2dl_subframe(LTE_TDD_Config_t *tdd_Config, + unsigned char subframe, + unsigned char ACK_index) +//------------------------------------------------------------------------------ +{ if (tdd_Config == NULL) { - return((subframe<4) ? subframe+6 : subframe-4); - } else { - switch (tdd_Config->subframeAssignment) { - case 3: - if (subframe == 2) { // ACK subframes 5 and 6 - if (ACK_index==2) - return(1); - - return(5+ACK_index); - } else if (subframe == 3) { // ACK subframes 7 and 8 - return(7+ACK_index); // To be updated - } else if (subframe == 4) { // ACK subframes 9 and 0 - return((9+ACK_index)%10); - } else { - AssertFatal(1==0,"illegal subframe %d for tdd_config->subframeAssignment %ld\n", - subframe,tdd_Config->subframeAssignment); - } - - break; - - case 4: - if (subframe == 2) { // ACK subframes 0, 4 and 5 - //if (ACK_index==2) - // return(1); TBC - if (ACK_index==2) - return(0); - - return(4+ACK_index); - } else if (subframe == 3) { // ACK subframes 6, 7 8 and 9 - return(6+ACK_index); // To be updated - } else { - AssertFatal(1==0,"illegal subframe %d for tdd_config %ld\n", - subframe,tdd_Config->subframeAssignment); - } + return ((subframe < 4) ? subframe + 6 : subframe - 4); + } - break; + switch (tdd_Config->subframeAssignment) { + case 3: + if (subframe == 2) { // ACK subframes 5 and 6 + if (ACK_index == 2) return 1; + return (5 + ACK_index); + } + if (subframe == 3) { // ACK subframes 7 and 8 + return (7 + ACK_index); // To be updated + } + if (subframe == 4) { // ACK subframes 9 and 0 + return ((9 + ACK_index) % 10); + } + AssertFatal(1==0, "illegal subframe %d for tdd_config->subframeAssignment %ld\n", + subframe, + tdd_Config->subframeAssignment); + break; - case 1: - if (subframe == 2) { // ACK subframes 5 and 6 - return(5+ACK_index); - } else if (subframe == 3) { // ACK subframe 9 - return(9); // To be updated - } else if (subframe == 7) { // ACK subframes 0 and 1 - return(ACK_index); // To be updated - } else if (subframe == 8) { // ACK subframe 4 - return(4); // To be updated - } else { - AssertFatal(1==0,"illegal subframe %d for tdd_config %ld\n", - subframe,tdd_Config->subframeAssignment); - } + case 4: + if (subframe == 2) { // ACK subframes 0, 4 and 5 + //if (ACK_index==2) + // return(1); TBC + if (ACK_index == 2) return 0; + return (4 + ACK_index); + } + if (subframe == 3) { // ACK subframes 6, 7 8 and 9 + return (6 + ACK_index); // To be updated + } + AssertFatal(1 == 0, "illegal subframe %d for tdd_config %ld\n", + subframe, + tdd_Config->subframeAssignment); + break; - break; - } + case 1: + if (subframe == 2) { // ACK subframes 5 and 6 + return (5 + ACK_index); + } + if (subframe == 3) { // ACK subframe 9 + return 9; // To be updated + } + if (subframe == 7) { // ACK subframes 0 and 1 + return ACK_index; // To be updated + } + if (subframe == 8) { // ACK subframe 4 + return 4; // To be updated + } + AssertFatal(1 == 0, "illegal subframe %d for tdd_config %ld\n", + subframe, + tdd_Config->subframeAssignment); + break; } - - return(0); + return 0; } +//------------------------------------------------------------------------------ void -extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, - frame_t frameP, sub_frame_t subframeP, - void *harq_indication, int format) { - UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; +extract_harq(module_id_t mod_idP, + int CC_idP, + int UE_id, + frame_t frameP, + sub_frame_t subframeP, + void *harq_indication, + int format) +//------------------------------------------------------------------------------ +{ + eNB_MAC_INST *eNB = RC.mac[mod_idP]; + UE_list_t *UE_list = &eNB->UE_list; UE_sched_ctrl *sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; rnti_t rnti = UE_RNTI(mod_idP, UE_id); - COMMON_channels_t *cc = &RC.mac[mod_idP]->common_channels[CC_idP]; + COMMON_channels_t *cc = &eNB->common_channels[CC_idP]; nfapi_harq_indication_fdd_rel13_t *harq_indication_fdd; nfapi_harq_indication_tdd_rel13_t *harq_indication_tdd; uint16_t num_ack_nak; @@ -3543,22 +3872,22 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, sub_frame_t subframe_tx; int frame_tx; uint8_t harq_pid; -#if (LTE_RRC_VERSION >= MAKE_VERSION(13, 0, 0)) - if (UE_list->UE_template[pCCid][UE_id].physicalConfigDedicated != NULL && - UE_list->UE_template[pCCid][UE_id].physicalConfigDedicated->pucch_ConfigDedicated != NULL && - (UE_list->UE_template[pCCid][UE_id].physicalConfigDedicated->ext7) - && (UE_list->UE_template[pCCid][UE_id].physicalConfigDedicated->ext7->pucch_ConfigDedicated_r13) - && (((UE_list->UE_template[pCCid][UE_id].physicalConfigDedicated->ext7->pucch_ConfigDedicated_r13->spatialBundlingPUCCH_r13) && (format == 0)) - || ((UE_list->UE_template[pCCid][UE_id].physicalConfigDedicated->ext7->pucch_ConfigDedicated_r13->spatialBundlingPUSCH_r13) - && (format == 1)))) +#if (LTE_RRC_VERSION >= MAKE_VERSION(13, 0, 0)) + LTE_PhysicalConfigDedicated_t *physicalConfigDedicated = UE_list->UE_template[pCCid][UE_id].physicalConfigDedicated; + if (physicalConfigDedicated != NULL && physicalConfigDedicated->pucch_ConfigDedicated != NULL && + physicalConfigDedicated->ext7 != NULL && physicalConfigDedicated->ext7->pucch_ConfigDedicated_r13 != NULL && + ((physicalConfigDedicated->ext7->pucch_ConfigDedicated_r13->spatialBundlingPUCCH_r13 && format == 0) || + (physicalConfigDedicated->ext7->pucch_ConfigDedicated_r13->spatialBundlingPUSCH_r13 && format == 1))) { spatial_bundling = 1; - -#endif - - for (i = 0; i < numCC; i++) - tmode[i] = get_tmode(mod_idP, i, UE_id); - + } +#endif + + for (i = 0; i < numCC; i++) { + tmode[i] = get_tmode(mod_idP, + i, + UE_id); + } if (cc->tdd_Config) { harq_indication_tdd = (nfapi_harq_indication_tdd_rel13_t *) harq_indication; // pdu = &harq_indication_tdd->harq_tb_n[0]; @@ -3566,42 +3895,61 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, switch (harq_indication_tdd->mode) { case 0: // Format 1a/b bundling - AssertFatal(numCC == 1, "numCC %d > 1, should not be using Format1a/b\n", numCC); - int M = ul_ACK_subframe2M(cc->tdd_Config,subframeP); + AssertFatal(numCC == 1, "numCC %d > 1, should not be using Format1a/b\n", + numCC); + int M = ul_ACK_subframe2M(cc->tdd_Config, + subframeP); - for(m=0; m<M; m++) { - subframe_tx = ul_ACK_subframe2dl_subframe(cc->tdd_Config,subframeP,m); + for (m=0; m<M; m++) { + subframe_tx = ul_ACK_subframe2dl_subframe(cc->tdd_Config, + subframeP, + m); - if(frameP==1023&&subframeP>5) - frame_tx=-1; - else - frame_tx = subframeP < 4 ? frameP -1 : frameP; + if (frameP==1023&&subframeP>5) frame_tx=-1; + else frame_tx = subframeP < 4 ? frameP -1 : frameP; - harq_pid = frame_subframe2_dl_harq_pid(cc->tdd_Config,frame_tx,subframe_tx); - RA_t *ra = &RC.mac[mod_idP]->common_channels[CC_idP].ra[0]; + harq_pid = frame_subframe2_dl_harq_pid(cc->tdd_Config, + frame_tx, + subframe_tx); + RA_t *ra = &eNB->common_channels[CC_idP].ra[0]; - if(num_ack_nak==1) { - if(harq_indication_tdd->harq_data[0].bundling.value_0==1) { //ack + if(num_ack_nak == 1) { + if (harq_indication_tdd->harq_data[0].bundling.value_0 == 1) { //ack sched_ctl->round[CC_idP][harq_pid] = 8; // release HARQ process sched_ctl->tbcnt[CC_idP][harq_pid] = 0; - LOG_D(MAC,"frame %d subframe %d Acking (%d,%d) harq_pid %d round %d\n",frameP,subframeP,frame_tx,subframe_tx,harq_pid,sched_ctl->round[CC_idP][harq_pid]); + LOG_D(MAC, "frame %d subframe %d Acking (%d,%d) harq_pid %d round %d\n", + frameP, + subframeP, + frame_tx, + subframe_tx, + harq_pid, + sched_ctl->round[CC_idP][harq_pid]); } else { //nack - if( sched_ctl->round[CC_idP][harq_pid]<8) sched_ctl->round[CC_idP][harq_pid]++; + if (sched_ctl->round[CC_idP][harq_pid] < 8) sched_ctl->round[CC_idP][harq_pid]++; if (sched_ctl->round[CC_idP][harq_pid] == 4) { sched_ctl->round[CC_idP][harq_pid] = 8; // release HARQ process sched_ctl->tbcnt[CC_idP][harq_pid] = 0; } - LOG_D(MAC,"frame %d subframe %d Nacking (%d,%d) harq_pid %d round %d\n",frameP,subframeP,frame_tx,subframe_tx,harq_pid,sched_ctl->round[CC_idP][harq_pid]); + LOG_D(MAC,"frame %d subframe %d Nacking (%d,%d) harq_pid %d round %d\n", + frameP, + subframeP, + frame_tx, + subframe_tx, + harq_pid, + sched_ctl->round[CC_idP][harq_pid]); - if(sched_ctl->round[CC_idP][harq_pid] == 8) { + if (sched_ctl->round[CC_idP][harq_pid] == 8) { for (uint8_t ra_i = 0; ra_i < NB_RA_PROC_MAX; ra_i++) { - if((ra[ra_i].rnti == rnti) && (ra[ra_i].state == WAITMSG4ACK)) { + if (ra[ra_i].rnti == rnti && ra[ra_i].state == WAITMSG4ACK) { //Msg NACK num to MAC ,remove UE // add UE info to freeList - LOG_I(RRC, "put UE %x into freeList\n", rnti); - put_UE_in_freelist(mod_idP, rnti, 1); + LOG_I(RRC, "put UE %x into freeList\n", + rnti); + put_UE_in_freelist(mod_idP, + rnti, + 1); } } } @@ -3609,17 +3957,27 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, } for (uint8_t ra_i = 0; ra_i < NB_RA_PROC_MAX; ra_i++) { - if ((ra[ra_i].rnti == rnti) && (ra[ra_i].state == MSGCRNTI_ACK) && (ra[ra_i].crnti_harq_pid == harq_pid)) { - LOG_D(MAC,"CRNTI Reconfiguration: ACK %d rnti %x round %d frame %d subframe %d \n",harq_indication_tdd->harq_data[0].bundling.value_0,rnti,sched_ctl->round[CC_idP][harq_pid],frameP,subframeP); - - if(num_ack_nak == 1 && harq_indication_tdd->harq_data[0].bundling.value_0 == 1) { - cancel_ra_proc(mod_idP, CC_idP, frameP, ra[ra_i].rnti); + if (ra[ra_i].rnti == rnti && ra[ra_i].state == MSGCRNTI_ACK && ra[ra_i].crnti_harq_pid == harq_pid) { + LOG_D(MAC,"CRNTI Reconfiguration: ACK %d rnti %x round %d frame %d subframe %d \n", + harq_indication_tdd->harq_data[0].bundling.value_0, + rnti, + sched_ctl->round[CC_idP][harq_pid], + frameP, + subframeP); + + if (num_ack_nak == 1 && harq_indication_tdd->harq_data[0].bundling.value_0 == 1) { + cancel_ra_proc(mod_idP, + CC_idP, + frameP, + ra[ra_i].rnti); } else { if(sched_ctl->round[CC_idP][harq_pid] == 7) { - cancel_ra_proc(mod_idP, CC_idP, frameP, ra[ra_i].rnti); + cancel_ra_proc(mod_idP, + CC_idP, + frameP, + ra[ra_i].rnti); } } - break; } } @@ -3628,14 +3986,8 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, break; case 1: // Channel Selection - break; - case 2: // Format 3 - break; - case 3: // Format 4 - break; - case 4: // Format 5 break; } @@ -3644,58 +3996,81 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, num_ack_nak = harq_indication_fdd->number_of_ack_nack; pdu = &harq_indication_fdd->harq_tb_n[0]; harq_pid = ((10 * frameP) + subframeP + 10236) & 7; - LOG_D(MAC,"frame %d subframe %d harq_pid %d mode %d tmode[0] %d num_ack_nak %d round %d\n",frameP,subframeP,harq_pid,harq_indication_fdd->mode,tmode[0],num_ack_nak,sched_ctl->round[CC_idP][harq_pid]); + LOG_D(MAC, "frame %d subframe %d harq_pid %d mode %d tmode[0] %d num_ack_nak %d round %d\n", + frameP, + subframeP, + harq_pid, + harq_indication_fdd->mode, + tmode[0], + num_ack_nak, + sched_ctl->round[CC_idP][harq_pid]); // use 1 HARQ proces of BL/CE UE for now if (UE_list->UE_template[pCCid][UE_id].rach_resource_type > 0) harq_pid = 0; switch (harq_indication_fdd->mode) { - case 0: // Format 1a/b (10.1.2.1) - AssertFatal(numCC == 1, "numCC %d > 1, should not be using Format1a/b\n", numCC); - if (tmode[0] == 1 || tmode[0] == 2 || tmode[0] == 5 || tmode[0] == 6 || tmode[0] == 7) { // NOTE: have to handle the case of TM9-10 with 1 antenna port + case 0: // Format 1a/b (10.1.2.1) + AssertFatal(numCC == 1, "numCC %d > 1, should not be using Format1a/b\n", + numCC); + + if (tmode[0] == 1 || tmode[0] == 2 || tmode[0] == 5 || tmode[0] == 6 || tmode[0] == 7) { // NOTE: have to handle the case of TM9-10 with 1 antenna port // single ACK/NAK bit - AssertFatal(num_ack_nak == 1, "num_ack_nak %d > 1 for 1 CC and single-layer transmission frame:%d subframe:%d\n", num_ack_nak,frameP,subframeP); + AssertFatal(num_ack_nak == 1, "num_ack_nak %d > 1 for 1 CC and single-layer transmission frame:%d subframe:%d\n", + num_ack_nak, + frameP, + subframeP); // In case of nFAPI, sometimes timing of eNB and UE become different. - // So if nfapi_mode == 2(VNF) , this function don't check assertion to avoid process exit. + // So if nfapi_mode == 2(VNF), this function don't check assertion to avoid process exit. if (nfapi_mode != 2) { AssertFatal(sched_ctl->round[CC_idP][harq_pid] < 8, "Got ACK/NAK for inactive harq_pid %d for UE %d/%x\n", - harq_pid, - UE_id, - rnti); + harq_pid, + UE_id, + rnti); } else { if (sched_ctl->round[CC_idP][harq_pid] == 8) { - LOG_E(MAC,"Got ACK/NAK for inactive harq_pid %d for UE %d/%x\n", harq_pid, UE_id, rnti); + LOG_E(MAC,"Got ACK/NAK for inactive harq_pid %d for UE %d/%x\n", + harq_pid, + UE_id, + rnti); return; } } AssertFatal(pdu[0] == 1 || pdu[0] == 2 || pdu[0] == 4, "Received ACK/NAK %d which is not 1 or 2 for harq_pid %d from UE %d/%x\n", - pdu[0], - harq_pid, - UE_id, - rnti); + pdu[0], + harq_pid, + UE_id, + rnti); - LOG_D(MAC, "Received %d for harq_pid %d\n", pdu[0], harq_pid); + LOG_D(MAC, "Received %d for harq_pid %d\n", + pdu[0], + harq_pid); - RA_t *ra = &RC.mac[mod_idP]->common_channels[CC_idP].ra[0]; + RA_t *ra = &eNB->common_channels[CC_idP].ra[0]; for (uint8_t ra_i = 0; ra_i < NB_RA_PROC_MAX; ra_i++) { - if ((ra[ra_i].rnti == rnti) && (ra[ra_i].state == MSGCRNTI_ACK) && (ra[ra_i].crnti_harq_pid == harq_pid)) { + if (ra[ra_i].rnti == rnti && ra[ra_i].state == MSGCRNTI_ACK && ra[ra_i].crnti_harq_pid == harq_pid) { LOG_D(MAC,"CRNTI Reconfiguration: ACK %d rnti %x round %d frame %d subframe %d \n", pdu[0], rnti, sched_ctl->round[CC_idP][harq_pid], - frameP,subframeP); + frameP, + subframeP); if (pdu[0] == 1) { - cancel_ra_proc(mod_idP, CC_idP, frameP, ra[ra_i].rnti); + cancel_ra_proc(mod_idP, + CC_idP, + frameP, + ra[ra_i].rnti); } else { - if(sched_ctl->round[CC_idP][harq_pid] == 7) { - cancel_ra_proc(mod_idP, CC_idP, frameP, ra[ra_i].rnti); + if (sched_ctl->round[CC_idP][harq_pid] == 7) { + cancel_ra_proc(mod_idP, + CC_idP, + frameP, + ra[ra_i].rnti); } } - break; } } @@ -3716,22 +4091,21 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, if((ra[ra_i].rnti == rnti) && (ra[ra_i].state == WAITMSG4ACK)) { //Msg NACK num to MAC ,remove UE // add UE info to freeList - LOG_I(RRC, "put UE %x into freeList\n", rnti); - put_UE_in_freelist(mod_idP, rnti, 1); + LOG_I(RRC, "put UE %x into freeList\n", + rnti); + put_UE_in_freelist(mod_idP, + rnti, + 1); } } } } } else { // one or two ACK/NAK bits - AssertFatal(num_ack_nak <= 2, - "num_ack_nak %d > 2 for 1 CC and TM3/4/8/9/10\n", + AssertFatal(num_ack_nak <= 2, "num_ack_nak %d > 2 for 1 CC and TM3/4/8/9/10\n", num_ack_nak); - if ((num_ack_nak == 2) - && (sched_ctl->round[CC_idP][harq_pid] < 8) - && (sched_ctl->tbcnt[CC_idP][harq_pid] == 1) - && (pdu[0] == 1) && (pdu[1] == 1)) { + if (num_ack_nak == 2 && sched_ctl->round[CC_idP][harq_pid] < 8 && sched_ctl->tbcnt[CC_idP][harq_pid] == 1 && pdu[0] == 1 && pdu[1] == 1) { sched_ctl->round[CC_idP][harq_pid] = 8; sched_ctl->tbcnt[CC_idP][harq_pid] = 0; } @@ -3772,19 +4146,21 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, sched_ctl->tbcnt[CC_idP][harq_pid] = 0; } } else - AssertFatal(1 == 0, - "Illegal ACK/NAK/round combination (%d,%d,%d,%d,%d) for harq_pid %d, UE %d/%x\n", + AssertFatal(1 == 0, "Illegal ACK/NAK/round combination (%d,%d,%d,%d,%d) for harq_pid %d, UE %d/%x\n", num_ack_nak, sched_ctl->round[CC_idP][harq_pid], - sched_ctl->round[CC_idP][harq_pid], pdu[0], - pdu[1], harq_pid, UE_id, rnti); + sched_ctl->round[CC_idP][harq_pid], + pdu[0], + pdu[1], + harq_pid, + UE_id, + rnti); } break; case 1: // FDD Channel Selection (10.1.2.2.1), must be received for 2 serving cells - AssertFatal(numCC == 2, - "Should not receive harq indication with channel selection with %d active CCs\n", + AssertFatal(numCC == 2, "Should not receive harq indication with channel selection with %d active CCs\n", numCC); if ((num_ack_nak == 2) @@ -3826,18 +4202,21 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, pdu[1]); AssertFatal(pdu[2] <= 3, "pdu[2] %d is not ACK/NAK/DTX\n", pdu[2]); - AssertFatal(sched_ctl->tbcnt[pCCid][harq_pid] == 2, - "sched_ctl->tbcnt[%d][%d] != 2 for UE %d/%x\n", - pCCid, harq_pid, UE_id, rnti); - AssertFatal(sched_ctl->tbcnt[1 - pCCid][harq_pid] == 1, - "sched_ctl->tbcnt[%d][%d] != 1 for UE %d/%x\n", - 1 - pCCid, harq_pid, UE_id, rnti); - - if ((pdu[0] == 1) && (pdu[1] == 1)) { // both ACK + AssertFatal(sched_ctl->tbcnt[pCCid][harq_pid] == 2, "sched_ctl->tbcnt[%d][%d] != 2 for UE %d/%x\n", + pCCid, + harq_pid, + UE_id, + rnti); + AssertFatal(sched_ctl->tbcnt[1 - pCCid][harq_pid] == 1, "sched_ctl->tbcnt[%d][%d] != 1 for UE %d/%x\n", + 1 - pCCid, + harq_pid, + UE_id, + rnti); + + if (pdu[0] == 1 && pdu[1] == 1) { // both ACK sched_ctl->round[pCCid][harq_pid] = 8; sched_ctl->tbcnt[pCCid][harq_pid] = 0; - } else if (((pdu[0] == 2) && (pdu[1] == 1)) || - ((pdu[0] == 1) && (pdu[1] == 2))) { + } else if ((pdu[0] == 2 && pdu[1] == 1) || (pdu[0] == 1 && pdu[1] == 2)) { sched_ctl->round[pCCid][harq_pid]++; sched_ctl->tbcnt[pCCid][harq_pid] = 1; @@ -3854,8 +4233,7 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, } } - if (pdu[2] == 1) - sched_ctl->round[1 - pCCid][harq_pid] = 8; + if (pdu[2] == 1) sched_ctl->round[1 - pCCid][harq_pid] = 8; else { sched_ctl->round[1 - pCCid][harq_pid]++; @@ -3875,18 +4253,21 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, pdu[1]); AssertFatal(pdu[2] <= 3, "pdu[2] %d is not ACK/NAK/DTX\n", pdu[2]); - AssertFatal(sched_ctl->tbcnt[1 - pCCid][harq_pid] == 2, - "sched_ctl->tbcnt[%d][%d] != 2 for UE %d/%x\n", - 1 - pCCid, harq_pid, UE_id, rnti); - AssertFatal(sched_ctl->tbcnt[pCCid][harq_pid] == 1, - "sched_ctl->tbcnt[%d][%d] != 1 for UE %d/%x\n", - pCCid, harq_pid, UE_id, rnti); - - if ((pdu[0] == 1) && (pdu[1] == 1)) { // both ACK + AssertFatal(sched_ctl->tbcnt[1 - pCCid][harq_pid] == 2, "sched_ctl->tbcnt[%d][%d] != 2 for UE %d/%x\n", + 1 - pCCid, + harq_pid, + UE_id, + rnti); + AssertFatal(sched_ctl->tbcnt[pCCid][harq_pid] == 1, "sched_ctl->tbcnt[%d][%d] != 1 for UE %d/%x\n", + pCCid, + harq_pid, + UE_id, + rnti); + + if (pdu[0] == 1 && pdu[1] == 1) { // both ACK sched_ctl->round[1 - pCCid][harq_pid] = 8; sched_ctl->tbcnt[1 - pCCid][harq_pid] = 0; - } else if (((pdu[0] >= 2) && (pdu[1] == 1)) - || ((pdu[0] == 1) && (pdu[1] >= 2))) { // one ACK + } else if ((pdu[0] >= 2 && pdu[1] == 1) || (pdu[0] == 1 && pdu[1] >= 2)) { // one ACK sched_ctl->round[1 - pCCid][harq_pid]++; sched_ctl->tbcnt[1 - pCCid][harq_pid] = 1; @@ -3903,8 +4284,7 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, } } - if (pdu[2] == 1) - sched_ctl->round[pCCid][harq_pid] = 8; + if (pdu[2] == 1) sched_ctl->round[pCCid][harq_pid] = 8; else { sched_ctl->round[pCCid][harq_pid]++; @@ -3928,18 +4308,19 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, pdu[2]); AssertFatal(pdu[3] <= 3, "pdu[3] %d is not ACK/NAK/DTX\n", pdu[3]); - AssertFatal(sched_ctl->tbcnt[0][harq_pid] == 2, - "sched_ctl->tbcnt[0][%d] != 2 for UE %d/%x\n", - harq_pid, UE_id, rnti); - AssertFatal(sched_ctl->tbcnt[1][harq_pid] == 2, - "sched_ctl->tbcnt[1][%d] != 2 for UE %d/%x\n", - harq_pid, UE_id, rnti); - - if ((pdu[0] == 1) && (pdu[1] == 1)) { // both ACK + AssertFatal(sched_ctl->tbcnt[0][harq_pid] == 2, "sched_ctl->tbcnt[0][%d] != 2 for UE %d/%x\n", + harq_pid, + UE_id, + rnti); + AssertFatal(sched_ctl->tbcnt[1][harq_pid] == 2, "sched_ctl->tbcnt[1][%d] != 2 for UE %d/%x\n", + harq_pid, + UE_id, + rnti); + + if (pdu[0] == 1 && pdu[1] == 1) { // both ACK sched_ctl->round[0][harq_pid] = 8; sched_ctl->tbcnt[0][harq_pid] = 0; - } else if (((pdu[0] >= 2) && (pdu[1] == 1)) - || ((pdu[0] == 1) && (pdu[1] >= 2))) { // one ACK + } else if ((pdu[0] >= 2 && pdu[1] == 1) || (pdu[0] == 1 && pdu[1] >= 2)) { // one ACK sched_ctl->round[0][harq_pid]++; sched_ctl->tbcnt[0][harq_pid] = 1; @@ -3956,11 +4337,10 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, } } - if ((pdu[2] == 1) && (pdu[3] == 1)) { // both ACK + if (pdu[2] == 1 && pdu[3] == 1) { // both ACK sched_ctl->round[1][harq_pid] = 8; sched_ctl->tbcnt[1][harq_pid] = 0; - } else if (((pdu[2] >= 2) && (pdu[3] == 1)) - || ((pdu[2] == 1) && (pdu[3] >= 2))) { // one ACK + } else if ((pdu[2] >= 2 && pdu[3] == 1) || (pdu[2] == 1 && pdu[3] >= 2)) { // one ACK sched_ctl->round[1][harq_pid]++; sched_ctl->tbcnt[1][harq_pid] = 1; @@ -3982,14 +4362,12 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, break; case 2: // Format 3 - AssertFatal(numCC > 2, - "Should not receive harq indication with FDD format 3 with %d < 3 active CCs\n", + AssertFatal(numCC > 2, "Should not receive harq indication with FDD format 3 with %d < 3 active CCs\n", numCC); for (i = 0, j = 0; i < numCC; i++) { - if ((sched_ctl->round[i][harq_pid] < 8)) { - if (tmode[i] == 1 || tmode[i] == 2 || tmode[0] == 5 - || tmode[0] == 6 || tmode[0] == 7) { + if (sched_ctl->round[i][harq_pid] < 8) { + if (tmode[i] == 1 || tmode[i] == 2 || tmode[0] == 5 || tmode[0] == 6 || tmode[0] == 7) { if (pdu[j] == 1) { sched_ctl->round[i][harq_pid] = 8; sched_ctl->tbcnt[i][harq_pid] = 0; @@ -4001,18 +4379,19 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, sched_ctl->tbcnt[i][harq_pid] = 0; } } else - AssertFatal(1 == 0, - "Illegal harq_ack value for CC %d harq_pid %d (%d) UE %d/%x\n", - i, harq_pid, pdu[j], UE_id, rnti); + AssertFatal(1 == 0, "Illegal harq_ack value for CC %d harq_pid %d (%d) UE %d/%x\n", + i, + harq_pid, + pdu[j], + UE_id, + rnti); j++; } else if (spatial_bundling == 0) { - if ((sched_ctl->tbcnt[i][harq_pid] == 2) - && (pdu[j] == 1) && (pdu[j + 1] == 1)) { + if (sched_ctl->tbcnt[i][harq_pid] == 2 && pdu[j] == 1 && pdu[j + 1] == 1) { sched_ctl->round[i][harq_pid] = 8; sched_ctl->tbcnt[i][harq_pid] = 0; - } else if ((sched_ctl->tbcnt[i][harq_pid] == 2) - && (pdu[j] == 1) && (pdu[j + 1] == 2)) { + } else if (sched_ctl->tbcnt[i][harq_pid] == 2 && pdu[j] == 1 && pdu[j + 1] == 2) { sched_ctl->round[i][harq_pid]++; sched_ctl->tbcnt[i][harq_pid] = 1; @@ -4020,8 +4399,7 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, sched_ctl->round[i][harq_pid] = 8; sched_ctl->tbcnt[i][harq_pid] = 0; } - } else if ((sched_ctl->tbcnt[i][harq_pid] == 2) - && (pdu[j] == 2) && (pdu[j + 1] == 1)) { + } else if (sched_ctl->tbcnt[i][harq_pid] == 2 && pdu[j] == 2 && pdu[j + 1] == 1) { sched_ctl->round[i][harq_pid]++; sched_ctl->tbcnt[i][harq_pid] = 1; @@ -4029,8 +4407,7 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, sched_ctl->round[i][harq_pid] = 8; sched_ctl->tbcnt[i][harq_pid] = 0; } - } else if ((sched_ctl->tbcnt[i][harq_pid] == 2) - && (pdu[j] == 2) && (pdu[j + 1] == 2)) { + } else if (sched_ctl->tbcnt[i][harq_pid] == 2 && pdu[j] == 2 && pdu[j + 1] == 2) { sched_ctl->round[i][harq_pid]++; if (sched_ctl->round[i][harq_pid] == 4) { @@ -4038,11 +4415,14 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, sched_ctl->tbcnt[i][harq_pid] = 0; } } else - AssertFatal(1 == 0, - "Illegal combination for CC %d harq_pid %d (%d,%d,%d) UE %d/%x\n", - i, harq_pid, + AssertFatal(1 == 0, "Illegal combination for CC %d harq_pid %d (%d,%d,%d) UE %d/%x\n", + i, + harq_pid, sched_ctl->tbcnt[i][harq_pid], - pdu[j], pdu[j + 1], UE_id, rnti); + pdu[j], + pdu[j + 1], + UE_id, + rnti); j += 2; } else if (spatial_bundling == 1) { @@ -4056,73 +4436,86 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, sched_ctl->round[i][harq_pid] = 8; sched_ctl->tbcnt[i][harq_pid] = 0; } - } else - AssertFatal(1 == 0, - "Illegal hack_nak value %d for CC %d harq_pid %d UE %d/%x\n", - pdu[j], i, harq_pid, UE_id, rnti); - + } else { + AssertFatal(1 == 0, "Illegal hack_nak value %d for CC %d harq_pid %d UE %d/%x\n", + pdu[j], + i, + harq_pid, + UE_id, + rnti); + } j++; - } else - AssertFatal(1 == 0, - "Illegal value for spatial_bundling %d\n", + } else { + AssertFatal(1 == 0, "Illegal value for spatial_bundling %d\n", spatial_bundling); + } } } break; case 3: // Format 4 - AssertFatal(1 == 0, - "Should not receive harq indication with Format 4\n"); + AssertFatal(1 == 0, "Should not receive harq indication with Format 4\n"); break; case 4: // Format 5 - AssertFatal(1 == 0, - "Should not receive harq indication with Format 5\n"); + AssertFatal(1 == 0, "Should not receive harq indication with Format 5\n"); break; } } + return; } +//------------------------------------------------------------------------------ void -extract_pucch_csi(module_id_t mod_idP, int CC_idP, int UE_id, - frame_t frameP, sub_frame_t subframeP, - uint8_t *pdu, uint8_t length) { +extract_pucch_csi(module_id_t mod_idP, + int CC_idP, + int UE_id, + frame_t frameP, + sub_frame_t subframeP, + uint8_t *pdu, + uint8_t length) +//------------------------------------------------------------------------------ +{ UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; UE_sched_ctrl *sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; COMMON_channels_t *cc = &RC.mac[mod_idP]->common_channels[CC_idP]; - struct LTE_CQI_ReportPeriodic *cqi_ReportPeriodic; int no_pmi; uint8_t Ltab[6] = { 0, 2, 4, 4, 4, 4 }; uint8_t Jtab[6] = { 0, 2, 2, 3, 4, 4 }; int feedback_cnt; - AssertFatal(UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated != NULL, - "physicalConfigDedicated is null for UE %d\n", UE_id); - AssertFatal(UE_list-> - UE_template[CC_idP][UE_id].physicalConfigDedicated->cqi_ReportConfig != NULL, - "cqi_ReportConfig is null for UE %d\n", UE_id); - AssertFatal((cqi_ReportPeriodic = UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic) != NULL, - "cqi_ReportPeriodic is null for UE %d\n", UE_id); + + AssertFatal(UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated != NULL, "physicalConfigDedicated is null for UE %d\n", + UE_id); + AssertFatal(UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->cqi_ReportConfig != NULL, "cqi_ReportConfig is null for UE %d\n", + UE_id); + struct LTE_CQI_ReportPeriodic *cqi_ReportPeriodic = UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic; + AssertFatal(cqi_ReportPeriodic != NULL, "cqi_ReportPeriodic is null for UE %d\n", + UE_id); // determine feedback mode - AssertFatal(cqi_ReportPeriodic->present != LTE_CQI_ReportPeriodic_PR_NOTHING, - "cqi_ReportPeriodic->present == LTE_CQI_ReportPeriodic_PR_NOTHING!\n"); + AssertFatal(cqi_ReportPeriodic->present != LTE_CQI_ReportPeriodic_PR_NOTHING, "cqi_ReportPeriodic->present == LTE_CQI_ReportPeriodic_PR_NOTHING!\n"); AssertFatal(cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.present != LTE_CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_NOTHING, "cqi_ReportPeriodic->cqi_FormatIndicatorPeriodic.choice.setup.present == LTE_CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_NOTHING!\n"); uint16_t Npd, N_OFFSET_CQI; int H, K, bandwidth_part, L, Lmask; int ri = sched_ctl->periodic_ri_received[CC_idP]; - get_csi_params(cc, cqi_ReportPeriodic, &Npd, &N_OFFSET_CQI, &H); + + get_csi_params(cc, + cqi_ReportPeriodic, + &Npd, + &N_OFFSET_CQI, + &H); K = (H - 1) / Jtab[cc->mib->message.dl_Bandwidth]; L = Ltab[cc->mib->message.dl_Bandwidth]; Lmask = L - 1; feedback_cnt = (((frameP * 10) + subframeP) / Npd) % H; - if (feedback_cnt > 0) - bandwidth_part = (feedback_cnt - 1) % K; - else - bandwidth_part = 0; + if (feedback_cnt > 0) bandwidth_part = (feedback_cnt - 1) % K; + else bandwidth_part = 0; - switch (get_tmode(mod_idP, CC_idP, UE_id)) { + switch (get_tmode(mod_idP, + CC_idP, + UE_id)) { case 1: case 2: case 3: @@ -4139,40 +4532,38 @@ extract_pucch_csi(module_id_t mod_idP, int CC_idP, int UE_id, default: // note: need to check TM8-10 without PMI/RI or with 1 antenna port (see Section 5.2.3.3.1 from 36.213) no_pmi = 0; - } + break; +} - if ((cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.present == LTE_CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_widebandCQI) - || (feedback_cnt == 0)) { + if (cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.present == LTE_CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_widebandCQI || + feedback_cnt == 0) { // Note: This implements only Tables: 5.3.3.1-1,5.3.3.1-1A and 5.3.3.1-2 from 36.213 (1,2,4 antenna ports Wideband CQI/PMI) if (no_pmi == 1) { // get spatial_diffcqi if needed sched_ctl->periodic_wideband_cqi[CC_idP] = pdu[0] & 0xF; - sched_ctl->periodic_wideband_spatial_diffcqi[CC_idP] = - (pdu[0] >> 4) & 7; - } else if ((cc->p_eNB == 2) && (ri == 1)) { + sched_ctl->periodic_wideband_spatial_diffcqi[CC_idP] = (pdu[0] >> 4) & 7; + } else if (cc->p_eNB == 2 && ri == 1) { // p=2 Rank 1 wideband CQI/PMI 6 bits sched_ctl->periodic_wideband_cqi[CC_idP] = pdu[0] & 0xF; sched_ctl->periodic_wideband_pmi[CC_idP] = (pdu[0] >> 4) & 3; - } else if ((cc->p_eNB == 2) && (ri > 1)) { + } else if (cc->p_eNB == 2 && ri > 1) { // p=2 Rank 2 wideband CQI/PMI 8 bits sched_ctl->periodic_wideband_cqi[CC_idP] = pdu[0] & 0xF; - sched_ctl->periodic_wideband_spatial_diffcqi[CC_idP] = - (pdu[0] >> 4) & 7; + sched_ctl->periodic_wideband_spatial_diffcqi[CC_idP] = (pdu[0] >> 4) & 7; sched_ctl->periodic_wideband_pmi[CC_idP] = (pdu[0] >> 7) & 1; - } else if ((cc->p_eNB == 4) && (ri == 1)) { + } else if (cc->p_eNB == 4 && ri == 1) { // p=4 Rank 1 wideband CQI/PMI 8 bits sched_ctl->periodic_wideband_cqi[CC_idP] = pdu[0] & 0xF; - sched_ctl->periodic_wideband_pmi[CC_idP] = - (pdu[0] >> 4) & 0x0F; - } else if ((cc->p_eNB == 4) && (ri > 1)) { + sched_ctl->periodic_wideband_pmi[CC_idP] = (pdu[0] >> 4) & 0x0F; + } else if (cc->p_eNB == 4 && ri > 1) { // p=4 Rank 2 wideband CQI/PMI 11 bits sched_ctl->periodic_wideband_cqi[CC_idP] = pdu[0] & 0xF; - sched_ctl->periodic_wideband_spatial_diffcqi[CC_idP] = - (pdu[0] >> 4) & 7; + sched_ctl->periodic_wideband_spatial_diffcqi[CC_idP] = (pdu[0] >> 4) & 7; sched_ctl->periodic_wideband_pmi[CC_idP] = (pdu[0] >> 7) & 0xF; } else - AssertFatal(1 == 0, - "illegal combination p %d, ri %d, no_pmi %d\n", - cc->p_eNB, ri, no_pmi); + AssertFatal(1 == 0, "illegal combination p %d, ri %d, no_pmi %d\n", + cc->p_eNB, + ri, + no_pmi); } else if (cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic.present == LTE_CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_subbandCQI) { // This is Table 5.2.3.3.2-2 for 36.213 if (ri == 1) { @@ -4181,16 +4572,23 @@ extract_pucch_csi(module_id_t mod_idP, int CC_idP, int UE_id, } else if (ri > 1) { //7+Ltab[cc->mib->message.dl_Bandwidth] bits; sched_ctl->periodic_subband_spatial_diffcqi[CC_idP][(bandwidth_part * L) + ((pdu[0] >> 7) & Lmask)] = (pdu[0] >> 4) & 7; - sched_ctl->periodic_subband_cqi[CC_idP][(bandwidth_part * L) + ((pdu[0] >> 7) & Lmask)] = - pdu[0] & 0xF; + sched_ctl->periodic_subband_cqi[CC_idP][(bandwidth_part * L) + ((pdu[0] >> 7) & Lmask)] = pdu[0] & 0xF; } } + return; } +//------------------------------------------------------------------------------ void -extract_pusch_csi(module_id_t mod_idP, int CC_idP, int UE_id, - frame_t frameP, sub_frame_t subframeP, - uint8_t *pdu, uint8_t length) { +extract_pusch_csi(module_id_t mod_idP, + int CC_idP, + int UE_id, + frame_t frameP, + sub_frame_t subframeP, + uint8_t *pdu, + uint8_t length) +//------------------------------------------------------------------------------ +{ UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; COMMON_channels_t *cc = &RC.mac[mod_idP]->common_channels[CC_idP]; UE_sched_ctrl *sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; @@ -4202,13 +4600,14 @@ extract_pusch_csi(module_id_t mod_idP, int CC_idP, int UE_id, int i; uint64_t p = *(uint64_t *) pdu; int curbyte, curbit; - LTE_CQI_ReportModeAperiodic_t *cqi_ReportModeAperiodic; - AssertFatal(UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated != NULL, - "physicalConfigDedicated is null for UE %d\n", UE_id); - AssertFatal(UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->cqi_ReportConfig != NULL, - "cqi_ReportConfig is null for UE %d\n", UE_id); - AssertFatal((cqi_ReportModeAperiodic = UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic) != NULL, - "cqi_ReportModeAperiodic is null for UE %d\n", UE_id); + AssertFatal(UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated != NULL, "physicalConfigDedicated is null for UE %d\n", + UE_id); + AssertFatal(UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->cqi_ReportConfig != NULL, "cqi_ReportConfig is null for UE %d\n", + UE_id); + LTE_CQI_ReportModeAperiodic_t *cqi_ReportModeAperiodic + = UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic; + AssertFatal(cqi_ReportModeAperiodic != NULL, "cqi_ReportModeAperiodic is null for UE %d\n", + UE_id); int N = Ntab[cc->mib->message.dl_Bandwidth]; int tmode = get_tmode(mod_idP, CC_idP, UE_id); int ri = sched_ctl->aperiodic_ri_received[CC_idP]; @@ -4220,13 +4619,12 @@ extract_pusch_csi(module_id_t mod_idP, int CC_idP, int UE_id, case LTE_CQI_ReportModeAperiodic_rm12: AssertFatal(0 == 1, "to be fixed, don't use p but pdu directly\n"); // wideband multiple PMI (TM4/6), Table 5.2.2.6.1-1 (for TM4/6) - AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 || tmode == 10, - "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm12\n", + AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 || tmode == 10, "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm12\n", tmode); if (tmode <= 6) { //Table 5.2.2.6.1-1 36.213 - if ((ri == 1) && (cc->p_eNB == 2)) { - sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); + if (ri == 1 && cc->p_eNB == 2) { + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); p >>= 4; for (i = 0; i < N; i++) { @@ -4235,10 +4633,10 @@ extract_pusch_csi(module_id_t mod_idP, int CC_idP, int UE_id, } } - if ((ri == 2) && (cc->p_eNB == 2)) { - sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); + if (ri == 2 && cc->p_eNB == 2) { + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); p >>= 4; - sched_ctl->aperiodic_wideband_cqi1[CC_idP] = (uint8_t) (p & 0x0F); + sched_ctl->aperiodic_wideband_cqi1[CC_idP] = (uint8_t) (p & 0x0F); p >>= 4; for (i = 0; i < N; i++) { @@ -4247,8 +4645,8 @@ extract_pusch_csi(module_id_t mod_idP, int CC_idP, int UE_id, } } - if ((ri == 1) && (cc->p_eNB == 4)) { - sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); + if (ri == 1 && cc->p_eNB == 4) { + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); p >>= 4; for (i = 0; i < N; i++) { @@ -4257,10 +4655,10 @@ extract_pusch_csi(module_id_t mod_idP, int CC_idP, int UE_id, } } - if ((ri == 2) && (cc->p_eNB == 4)) { - sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); + if (ri == 2 && cc->p_eNB == 4) { + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); p >>= 4; - sched_ctl->aperiodic_wideband_cqi1[CC_idP] = (uint8_t) (p & 0x0F); + sched_ctl->aperiodic_wideband_cqi1[CC_idP] = (uint8_t) (p & 0x0F); p >>= 4; for (i = 0; i < N; i++) { @@ -4278,28 +4676,28 @@ extract_pusch_csi(module_id_t mod_idP, int CC_idP, int UE_id, case LTE_CQI_ReportModeAperiodic_rm20: AssertFatal(0 == 1, "to be fixed, don't use p but pdu directly\n"); // UE-selected subband CQI no PMI (TM1/2/3/7) , Table 5.2.2.6.3-1 from 36.213 - AssertFatal(tmode == 1 || tmode == 2 || tmode == 3 - || tmode == 7, - "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm20\n", + AssertFatal(tmode == 1 || tmode == 2 || tmode == 3 || tmode == 7, "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm20\n", tmode); sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); p >>= 4; diffcqi0 = (uint8_t) (p & 0x03); p >>= 2; r = (uint8_t) (p & ((1 >> Ltab_uesel[bw]) - 1)); - reverse_index(Ntab_uesel[bw], Mtab_uesel[bw], r, v); + reverse_index(Ntab_uesel[bw], + Mtab_uesel[bw], + r, + v); - for (m = 0; m < Mtab_uesel[bw]; m++) + for (m = 0; m < Mtab_uesel[bw]; m++) { sched_ctl->aperiodic_subband_diffcqi0[CC_idP][v[m]] = diffcqi0; + } break; case LTE_CQI_ReportModeAperiodic_rm22: AssertFatal(0 == 1, "to be fixed, don't use p but pdu directly\n"); // UE-selected subband CQI multiple PMI (TM4/6) Table 5.2.2.6.3-2 from 36.213 - AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 - || tmode == 10, - "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm22\n", + AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 || tmode == 10, "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm22\n", tmode); sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); p >>= 4; @@ -4316,13 +4714,16 @@ extract_pusch_csi(module_id_t mod_idP, int CC_idP, int UE_id, r = (uint8_t) (p & ((1 >> Ltab_uesel[bw]) - 1)); p >>= Ltab_uesel[bw]; - reverse_index(Ntab_uesel[bw], Mtab_uesel[bw], r, v); + reverse_index(Ntab_uesel[bw], + Mtab_uesel[bw], + r, + v); - if ((ri == 1) && (cc->p_eNB == 2)) { + if (ri == 1 && cc->p_eNB == 2) { pmi_uesel = p & 0x3; p >>= 2; sched_ctl->aperiodic_wideband_pmi[CC_idP] = p & 0x3; - } else if ((ri == 2) && (cc->p_eNB == 2)) { + } else if (ri == 2 && cc->p_eNB == 2) { pmi_uesel = p & 0x1; p >>= 1; sched_ctl->aperiodic_wideband_pmi[CC_idP] = p & 0x1; @@ -4335,9 +4736,7 @@ extract_pusch_csi(module_id_t mod_idP, int CC_idP, int UE_id, for (m = 0; m < Mtab_uesel[bw]; m++) { sched_ctl->aperiodic_subband_diffcqi0[CC_idP][v[m]] = diffcqi0; - if (ri > 1) - sched_ctl->aperiodic_subband_diffcqi1[CC_idP][v[m]] = - diffcqi1; + if (ri > 1) sched_ctl->aperiodic_subband_diffcqi1[CC_idP][v[m]] = diffcqi1; sched_ctl->aperiodic_subband_pmi[CC_idP][v[m]] = pmi_uesel; } @@ -4346,9 +4745,7 @@ extract_pusch_csi(module_id_t mod_idP, int CC_idP, int UE_id, case LTE_CQI_ReportModeAperiodic_rm30: //subband CQI no PMI (TM1/2/3/7) - AssertFatal(tmode == 1 || tmode == 2 || tmode == 3 - || tmode == 7, - "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm30\n", + AssertFatal(tmode == 1 || tmode == 2 || tmode == 3 || tmode == 7, "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm30\n", tmode); sched_ctl->aperiodic_wideband_cqi0[CC_idP] = pdu[0] >> 4; curbyte = 0; @@ -4365,89 +4762,75 @@ extract_pusch_csi(module_id_t mod_idP, int CC_idP, int UE_id, } } - sched_ctl->dl_cqi[CC_idP] = - sched_ctl->aperiodic_wideband_cqi0[CC_idP]; + sched_ctl->dl_cqi[CC_idP] = sched_ctl->aperiodic_wideband_cqi0[CC_idP]; + break; case LTE_CQI_ReportModeAperiodic_rm31: AssertFatal(0 == 1, "to be fixed, don't use p but pdu directly\n"); //subband CQI single PMI (TM4/5/6) - AssertFatal(tmode == 4 || tmode == 5 || tmode == 6 || tmode == 8 - || tmode == 9 - || tmode == 10, + AssertFatal(tmode == 4 || tmode == 5 || tmode == 6 || tmode == 8 || tmode == 9 || tmode == 10, "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm31\n", tmode); - if ((ri == 1) && (cc->p_eNB == 2)) { - sched_ctl->aperiodic_wideband_cqi0[CC_idP] = - (uint8_t) (p & 0x0F); + if (ri == 1 && cc->p_eNB == 2) { + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); p >>= 4; for (i = 0; i < N; i++) { - sched_ctl->aperiodic_subband_diffcqi0[CC_idP][i] = - (uint8_t) (p & 0x03); + sched_ctl->aperiodic_subband_diffcqi0[CC_idP][i] = (uint8_t) (p & 0x03); p >>= 2; } sched_ctl->aperiodic_wideband_pmi[CC_idP] = p & 0x03; } - if ((ri == 2) && (cc->p_eNB == 2)) { - sched_ctl->aperiodic_wideband_cqi0[CC_idP] = - (uint8_t) (p & 0x0F); + if (ri == 2 && cc->p_eNB == 2) { + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); p >>= 4; for (i = 0; i < N; i++) { - sched_ctl->aperiodic_subband_pmi[CC_idP][i] = - (uint8_t) (p & 0x01); + sched_ctl->aperiodic_subband_pmi[CC_idP][i] = (uint8_t) (p & 0x01); p >>= 1; } - sched_ctl->aperiodic_wideband_cqi1[CC_idP] = - (uint8_t) (p & 0x0F); + sched_ctl->aperiodic_wideband_cqi1[CC_idP] = (uint8_t) (p & 0x0F); p >>= 4; for (i = 0; i < N; i++) { - sched_ctl->aperiodic_subband_pmi[CC_idP][i] = - (uint8_t) (p & 0x01); + sched_ctl->aperiodic_subband_pmi[CC_idP][i] = (uint8_t) (p & 0x01); p >>= 1; } sched_ctl->aperiodic_wideband_pmi[CC_idP] = p & 0x01; } - if ((ri == 1) && (cc->p_eNB == 4)) { - sched_ctl->aperiodic_wideband_cqi0[CC_idP] = - (uint8_t) (p & 0x0F); + if (ri == 1 && cc->p_eNB == 4) { + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); p >>= 4; for (i = 0; i < N; i++) { - sched_ctl->aperiodic_subband_diffcqi0[CC_idP][i] = - (uint8_t) (p & 0x03); + sched_ctl->aperiodic_subband_diffcqi0[CC_idP][i] = (uint8_t) (p & 0x03); p >>= 2; } sched_ctl->aperiodic_wideband_pmi[CC_idP] = p & 0x0F; } - if ((ri > 1) && (cc->p_eNB == 4)) { // Note : 64 bits for 20 MHz - sched_ctl->aperiodic_wideband_cqi0[CC_idP] = - (uint8_t) (p & 0x0F); + if (ri > 1 && cc->p_eNB == 4) { // Note : 64 bits for 20 MHz + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); p >>= 4; for (i = 0; i < N; i++) { - sched_ctl->aperiodic_subband_pmi[CC_idP][i] = - (uint8_t) (p & 0x01); + sched_ctl->aperiodic_subband_pmi[CC_idP][i] = (uint8_t) (p & 0x01); p >>= 1; } - sched_ctl->aperiodic_wideband_cqi1[CC_idP] = - (uint8_t) (p & 0x0F); + sched_ctl->aperiodic_wideband_cqi1[CC_idP] = (uint8_t) (p & 0x0F); p >>= 4; for (i = 0; i < N; i++) { - sched_ctl->aperiodic_subband_pmi[CC_idP][i] = - (uint8_t) (p & 0x01); + sched_ctl->aperiodic_subband_pmi[CC_idP][i] = (uint8_t) (p & 0x01); p >>= 2; } @@ -4455,44 +4838,47 @@ extract_pusch_csi(module_id_t mod_idP, int CC_idP, int UE_id, } break; -#if (LTE_RRC_VERSION >= MAKE_VERSION(12, 5, 0)) +#if (LTE_RRC_VERSION >= MAKE_VERSION(12, 5, 0)) case LTE_CQI_ReportModeAperiodic_rm32_v1250: - AssertFatal(tmode == 4 || tmode == 5 || tmode == 6 || tmode == 8 - || tmode == 9 - || tmode == 10, + AssertFatal(tmode == 4 || tmode == 5 || tmode == 6 || tmode == 8 || tmode == 9 || tmode == 10, "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm32\n", tmode); AssertFatal(1 == 0, "CQI_ReportModeAperiodic_rm32 to be done\n"); break; #endif -#if (LTE_RRC_VERSION >= MAKE_VERSION(13, 1, 0)) +#if (LTE_RRC_VERSION >= MAKE_VERSION(13, 1, 0)) case LTE_CQI_ReportModeAperiodic_rm10_v1310: - AssertFatal(tmode == 1 || tmode == 2 || tmode == 3 - || tmode == 7, - "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm10\n", + AssertFatal(tmode == 1 || tmode == 2 || tmode == 3 || tmode == 7, "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm10\n", tmode); AssertFatal(1 == 0, "CQI_ReportModeAperiodic_rm10 to be done\n"); break; case LTE_CQI_ReportModeAperiodic_rm11_v1310: - AssertFatal(tmode == 4 || tmode == 5 || tmode == 6 || tmode == 8 - || tmode == 9 - || tmode == 10, + AssertFatal(tmode == 4 || tmode == 5 || tmode == 6 || tmode == 8 || tmode == 9 || tmode == 10, "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm11\n", tmode); AssertFatal(1 == 0, "CQI_ReportModeAperiodic_rm11 to be done\n"); break; #endif /* #if (LTE_RRC_VERSION >= MAKE_VERSION(13, 1, 0)) */ + } + return; } +//------------------------------------------------------------------------------ void -cqi_indication(module_id_t mod_idP, int CC_idP, frame_t frameP, - sub_frame_t subframeP, rnti_t rntiP, - nfapi_cqi_indication_rel9_t *rel9, uint8_t *pdu, - nfapi_ul_cqi_information_t *ul_cqi_information) { +cqi_indication(module_id_t mod_idP, + int CC_idP, + frame_t frameP, + sub_frame_t subframeP, + rnti_t rntiP, + nfapi_cqi_indication_rel9_t *rel9, + uint8_t *pdu, + nfapi_ul_cqi_information_t *ul_cqi_information) +//------------------------------------------------------------------------------ +{ int UE_id = find_UE_id(mod_idP, rntiP); UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; @@ -4504,22 +4890,40 @@ cqi_indication(module_id_t mod_idP, int CC_idP, frame_t frameP, UE_sched_ctrl *sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; if (UE_id >= 0) { - LOG_D(MAC,"%s() UE_id:%d channel:%d cqi:%d\n", __FUNCTION__, UE_id, ul_cqi_information->channel, ul_cqi_information->ul_cqi); + LOG_D(MAC,"%s() UE_id:%d channel:%d cqi:%d\n", + __FUNCTION__, + UE_id, + ul_cqi_information->channel, + ul_cqi_information->ul_cqi); if (ul_cqi_information->channel == 0) { // PUCCH // extract pucch csi information before changing RI information - extract_pucch_csi(mod_idP, CC_idP, UE_id, frameP, subframeP, + extract_pucch_csi(mod_idP, + CC_idP, + UE_id, + frameP, + subframeP, pdu, rel9->length); memcpy((void *) sched_ctl->periodic_ri_received, - (void *) rel9->ri, rel9->number_of_cc_reported); + (void *) rel9->ri, + rel9->number_of_cc_reported); // SNR for PUCCH2 sched_ctl->pucch2_snr[CC_idP] = ul_cqi_information->ul_cqi; } else { //PUSCH memcpy((void *) sched_ctl->aperiodic_ri_received, - (void *) rel9->ri, rel9->number_of_cc_reported); - extract_pusch_csi(mod_idP, CC_idP, UE_id, frameP, subframeP, - pdu, rel9->length); - LOG_D(MAC,"Frame %d Subframe %d update CQI:%d\n",frameP,subframeP,sched_ctl->dl_cqi[CC_idP]); + (void *) rel9->ri, + rel9->number_of_cc_reported); + extract_pusch_csi(mod_idP, + CC_idP, + UE_id, + frameP, + subframeP, + pdu, + rel9->length); + LOG_D(MAC,"Frame %d Subframe %d update CQI:%d\n", + frameP, + subframeP, + sched_ctl->dl_cqi[CC_idP]); sched_ctl->cqi_req_flag &= (~(1 << subframeP)); sched_ctl->cqi_received = 1; } @@ -4528,96 +4932,136 @@ cqi_indication(module_id_t mod_idP, int CC_idP, frame_t frameP, sched_ctl->timing_advance = rel9->timing_advance; sched_ctl->timing_advance_r9 = rel9->timing_advance_r9; } + return; } +//------------------------------------------------------------------------------ void -SR_indication(module_id_t mod_idP, int cc_idP, frame_t frameP, - sub_frame_t subframeP, rnti_t rntiP, uint8_t ul_cqi) { - T(T_ENB_MAC_SCHEDULING_REQUEST, T_INT(mod_idP), T_INT(cc_idP), - T_INT(frameP), T_INT(subframeP), T_INT(rntiP)); +SR_indication(module_id_t mod_idP, + int cc_idP, + frame_t frameP, + sub_frame_t subframeP, + rnti_t rntiP, + uint8_t ul_cqi) +//------------------------------------------------------------------------------ +{ + T(T_ENB_MAC_SCHEDULING_REQUEST, + T_INT(mod_idP), + T_INT(cc_idP), + T_INT(frameP), + T_INT(subframeP), + T_INT(rntiP)); int UE_id = find_UE_id(mod_idP, rntiP); UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; if (UE_id != -1) { - if (mac_eNB_get_rrc_status(mod_idP, UE_RNTI(mod_idP, UE_id)) < - RRC_CONNECTED) - LOG_D(MAC, - "[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d on CC_id %d\n", - mod_idP, rntiP, frameP, subframeP, UE_id, cc_idP); - + if (mac_eNB_get_rrc_status(mod_idP, UE_RNTI(mod_idP, UE_id)) < RRC_CONNECTED) { + LOG_D(MAC, "[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d on CC_id %d\n", + mod_idP, + rntiP, + frameP, + subframeP, + UE_id, + cc_idP); + } UE_list->UE_template[cc_idP][UE_id].ul_SR = 1; UE_list->UE_template[cc_idP][UE_id].ul_active = TRUE; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME - (VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION, 1); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME - (VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION, 0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION, 1); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION, 0); } else { // AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP); // AssertError(0, 0, "Frame %d: find_UE_id(%u,rnti %d) not found\n", frameP, enb_mod_idP, rntiP); - LOG_D(MAC, - "[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d (unknown UEid) on CC_id %d\n", - mod_idP, rntiP, frameP, subframeP, UE_id, cc_idP); + LOG_D(MAC, "[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d (unknown UEid) on CC_id %d\n", + mod_idP, + rntiP, + frameP, + subframeP, + UE_id, + cc_idP); } + return; } +//------------------------------------------------------------------------------ void -UL_failure_indication(module_id_t mod_idP, int cc_idP, frame_t frameP, - rnti_t rntiP, sub_frame_t subframeP) { +UL_failure_indication(module_id_t mod_idP, + int cc_idP, + frame_t frameP, + rnti_t rntiP, + sub_frame_t subframeP) +//------------------------------------------------------------------------------ +{ int UE_id = find_UE_id(mod_idP, rntiP); UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; if (UE_id != -1) { - LOG_D(MAC, - "[eNB %d][UE %d/%x] Frame %d subframeP %d Signaling UL Failure for UE %d on CC_id %d (timer %d)\n", - mod_idP, UE_id, rntiP, frameP, subframeP, UE_id, cc_idP, + LOG_D(MAC, "[eNB %d][UE %d/%x] Frame %d subframeP %d Signaling UL Failure for UE %d on CC_id %d (timer %d)\n", + mod_idP, + UE_id, + rntiP, + frameP, + subframeP, + UE_id, + cc_idP, UE_list->UE_sched_ctrl[UE_id].ul_failure_timer); - if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer == 0) - UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 1; + if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer == 0) UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 1; } else { // AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP); // AssertError(0, 0, "Frame %d: find_UE_id(%u,rnti %d) not found\n", frameP, enb_mod_idP, rntiP); - LOG_W(MAC, - "[eNB %d][SR %x] Frame %d subframeP %d Signaling UL Failure for UE %d (unknown UEid) on CC_id %d\n", - mod_idP, rntiP, frameP, subframeP, UE_id, cc_idP); + LOG_W(MAC, "[eNB %d][SR %x] Frame %d subframeP %d Signaling UL Failure for UE %d (unknown UEid) on CC_id %d\n", + mod_idP, + rntiP, + frameP, + subframeP, + UE_id, + cc_idP); } } -static int nack_or_dtx_reported( - COMMON_channels_t *cc, - nfapi_harq_indication_pdu_t *harq_pdu) { +//------------------------------------------------------------------------------ +static int +nack_or_dtx_reported(COMMON_channels_t *cc, + nfapi_harq_indication_pdu_t *harq_pdu) +//------------------------------------------------------------------------------ +{ int i; if (cc->tdd_Config) { nfapi_harq_indication_tdd_rel13_t *hi = &harq_pdu->harq_indication_tdd_rel13; - for (i = 0; i < hi->number_of_ack_nack; hi++) + for (i = 0; i < hi->number_of_ack_nack; hi++) { if (hi->harq_data[0].bundling.value_0 != 1) //only bundling is used for tdd for now return 1; - + } return 0; - } else { - nfapi_harq_indication_fdd_rel13_t *hi = &harq_pdu->harq_indication_fdd_rel13; - - for (i = 0; i < hi->number_of_ack_nack; hi++) - if (hi->harq_tb_n[i] != 1) - return 1; + } - return 0; + nfapi_harq_indication_fdd_rel13_t *hi = &harq_pdu->harq_indication_fdd_rel13; + for (i = 0; i < hi->number_of_ack_nack; hi++) { + if (hi->harq_tb_n[i] != 1) + return 1; } + return 0; } +//------------------------------------------------------------------------------ void -harq_indication(module_id_t mod_idP, int CC_idP, frame_t frameP, +harq_indication(module_id_t mod_idP, + int CC_idP, + frame_t frameP, sub_frame_t subframeP, - nfapi_harq_indication_pdu_t *harq_pdu) { + nfapi_harq_indication_pdu_t *harq_pdu) +//------------------------------------------------------------------------------ +{ rnti_t rnti = harq_pdu->rx_ue_information.rnti; uint8_t ul_cqi = harq_pdu->ul_cqi_information.ul_cqi; uint8_t channel = harq_pdu->ul_cqi_information.channel; int UE_id = find_UE_id(mod_idP, rnti); if (UE_id == -1) { - LOG_W(MAC, "harq_indication: UE %x not found\n", rnti); + LOG_W(MAC, "harq_indication: UE %x not found\n", + rnti); return; } @@ -4625,53 +5069,85 @@ harq_indication(module_id_t mod_idP, int CC_idP, frame_t frameP, UE_sched_ctrl *sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; COMMON_channels_t *cc = &RC.mac[mod_idP]->common_channels[CC_idP]; // extract HARQ Information - LOG_D(MAC, - "Frame %d, subframe %d: Received harq indication (%d) from UE %d/%x, ul_cqi %d\n", - frameP, subframeP, channel, UE_id, rnti, ul_cqi); + LOG_D(MAC, "Frame %d, subframe %d: Received harq indication (%d) from UE %d/%x, ul_cqi %d\n", + frameP, + subframeP, + channel, + UE_id, + rnti, + ul_cqi); - if (cc->tdd_Config) - extract_harq(mod_idP, CC_idP, UE_id, frameP, subframeP, + if (cc->tdd_Config) { + extract_harq(mod_idP, + CC_idP, + UE_id, + frameP, + subframeP, (void *) &harq_pdu->harq_indication_tdd_rel13, channel); - else - extract_harq(mod_idP, CC_idP, UE_id, frameP, subframeP, + } + else { + extract_harq(mod_idP, + CC_idP, + UE_id, + frameP, + subframeP, (void *) &harq_pdu->harq_indication_fdd_rel13, channel); - + } /* don't care about cqi reporting if NACK/DTX is there */ - if (channel == 0 && !nack_or_dtx_reported(cc, harq_pdu)) { + if (channel == 0 && !nack_or_dtx_reported(cc, + harq_pdu)) { sched_ctl->pucch1_snr[CC_idP] = ul_cqi; sched_ctl->pucch1_cqi_update[CC_idP] = 1; } + return; } // Flexran Slicing functions - -uint16_t nb_rbs_allowed_slice(float rb_percentage, int total_rbs) { +//------------------------------------------------------------------------------ +uint16_t +nb_rbs_allowed_slice(float rb_percentage, + int total_rbs) +//------------------------------------------------------------------------------ +{ return (uint16_t) floor(rb_percentage * total_rbs); } -int ue_dl_slice_membership(module_id_t mod_id, int UE_id, int slice_idx) { - if ((slice_idx < 0) - || (slice_idx >= RC.mac[mod_id]->slice_info.n_dl)) { +//------------------------------------------------------------------------------ +int +ue_dl_slice_membership(module_id_t mod_id, + int UE_id, + int slice_idx) +//------------------------------------------------------------------------------ +{ + eNB_MAC_INST *eNB = RC.mac[mod_id]; + + if (slice_idx < 0 || slice_idx >= eNB->slice_info.n_dl) { LOG_W(MAC, "out of range slice index %d (slice ID %d)\n", - slice_idx, RC.mac[mod_id]->slice_info.dl[slice_idx].id); + slice_idx, + eNB->slice_info.dl[slice_idx].id); return 0; } - return RC.mac[mod_id]->UE_list.active[UE_id] == TRUE - && RC.mac[mod_id]->UE_list.assoc_dl_slice_idx[UE_id] == slice_idx; + return eNB->UE_list.active[UE_id] == TRUE && eNB->UE_list.assoc_dl_slice_idx[UE_id] == slice_idx; } -int ue_ul_slice_membership(module_id_t mod_id, - int UE_id, - int slice_idx) +//------------------------------------------------------------------------------ +int +ue_ul_slice_membership(module_id_t mod_id, + int UE_id, + int slice_idx) +//------------------------------------------------------------------------------ { - if ((slice_idx < 0) || (slice_idx >= RC.mac[mod_id]->slice_info.n_ul)) { + eNB_MAC_INST *eNB = RC.mac[mod_id]; + + if (slice_idx < 0 || slice_idx >= eNB->slice_info.n_ul) { LOG_W(MAC, "out of range slice index %d (slice ID %d)\n", - slice_idx, RC.mac[mod_id]->slice_info.dl[slice_idx].id); + slice_idx, + eNB->slice_info.dl[slice_idx].id); return 0; } - return RC.mac[mod_id]->UE_list.active[UE_id] == TRUE && RC.mac[mod_id]->UE_list.assoc_ul_slice_idx[UE_id] == slice_idx; + return eNB->UE_list.active[UE_id] == TRUE && eNB->UE_list.assoc_ul_slice_idx[UE_id] == slice_idx; } diff --git a/openair2/LAYER2/MAC/mac_proto.h b/openair2/LAYER2/MAC/mac_proto.h index 6824e1b056fec72e7257850296b173d0825d6f46..d29debb2a30d3a4f5766e9176c6517314fac0bfd 100644 --- a/openair2/LAYER2/MAC/mac_proto.h +++ b/openair2/LAYER2/MAC/mac_proto.h @@ -441,7 +441,7 @@ void init_ue_sched_info(void); void add_ue_ulsch_info(module_id_t module_idP, int CC_id, int UE_id, sub_frame_t subframe, UE_ULSCH_STATUS status); void add_ue_dlsch_info(module_id_t module_idP, int CC_id, int UE_id, - sub_frame_t subframe, UE_DLSCH_STATUS status); + sub_frame_t subframe, UE_DLSCH_STATUS status, rnti_t rnti); int find_UE_id(module_id_t module_idP, rnti_t rnti); int find_RA_id(module_id_t mod_idP, int CC_idP, rnti_t rntiP); rnti_t UE_RNTI(module_id_t module_idP, int UE_id); @@ -1209,7 +1209,6 @@ void fill_nfapi_dlsch_config(eNB_MAC_INST * eNB, void fill_nfapi_harq_information(module_id_t module_idP, int CC_idP, uint16_t rntiP, - uint16_t absSFP, nfapi_ul_config_harq_information * harq_information, uint8_t cce_idxP); @@ -1221,9 +1220,10 @@ void fill_nfapi_ulsch_harq_information(module_id_t module_idP, sub_frame_t subframeP); uint16_t fill_nfapi_uci_acknak(module_id_t module_idP, - int CC_idP, - uint16_t rntiP, - uint16_t absSFP, uint8_t cce_idxP); + int CC_idP, + uint16_t rntiP, + uint16_t absSFP, + uint8_t cce_idxP); void fill_nfapi_dl_dci_1A(nfapi_dl_config_request_pdu_t * dl_config_pdu, uint8_t aggregation_level, diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index 608321d71d183bbfaf56689b5d2634aa01c9d8d6..88c7db83c02be05b4c374e9959d5a7a47bf2386b 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -460,7 +460,12 @@ void decode_slice_positioning(module_id_t Mod_idP, // This fuction sorts the UE in order their dlsch buffer and CQI -void sort_UEs(module_id_t Mod_idP, int slice_idx, int frameP, sub_frame_t subframeP) { +void +sort_UEs(module_id_t Mod_idP, + int slice_idx, + int frameP, + sub_frame_t subframeP) +{ int i; int list[MAX_MOBILES_PER_ENB]; int list_size = 0; @@ -468,16 +473,13 @@ void sort_UEs(module_id_t Mod_idP, int slice_idx, int frameP, sub_frame_t subfra UE_list_t *UE_list = &RC.mac[Mod_idP]->UE_list; for (i = 0; i < MAX_MOBILES_PER_ENB; i++) { - if (UE_list->active[i] == FALSE) continue; - - if (UE_RNTI(Mod_idP, i) == NOT_A_RNTI) continue; - if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) continue; - - if (!ue_dl_slice_membership(Mod_idP, i, slice_idx)) continue; - - list[list_size] = i; - list_size++; + if (UE_list->active[i] == TRUE && + UE_RNTI(Mod_idP, i) != NOT_A_RNTI && + UE_list->UE_sched_ctrl[i].ul_out_of_sync != 1 && + ue_dl_slice_membership(Mod_idP, i, slice_idx)) { + list[list_size++] = i; + } } decode_sorting_policy(Mod_idP, slice_idx); @@ -1170,12 +1172,15 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id, uint8_t CC_id; uint16_t i, j; int min_rb_unit[NFAPI_CC_MAX]; - slice_info_t *sli = &RC.mac[Mod_id]->slice_info; + + eNB_MAC_INST *eNB = RC.mac[Mod_id]; + slice_info_t *sli = &eNB->slice_info; uint16_t (*nb_rbs_required)[MAX_MOBILES_PER_ENB] = sli->pre_processor_results[slice_idx].nb_rbs_required; uint16_t (*nb_rbs_accounted)[MAX_MOBILES_PER_ENB] = sli->pre_processor_results[slice_idx].nb_rbs_accounted; uint16_t (*nb_rbs_remaining)[MAX_MOBILES_PER_ENB] = sli->pre_processor_results[slice_idx].nb_rbs_remaining; uint8_t (*MIMO_mode_indicator)[N_RBG_MAX] = sli->pre_processor_results[slice_idx].MIMO_mode_indicator; - UE_list_t *UE_list = &RC.mac[Mod_id]->UE_list; + + UE_list_t *UE_list = &eNB->UE_list; UE_sched_ctrl *ue_sched_ctl; // int rrc_status = RRC_IDLE; #ifdef TM5 @@ -1191,7 +1196,10 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id, // Initialize scheduling information for all active UEs memset(&sli->pre_processor_results[slice_idx], 0, sizeof(sli->pre_processor_results[slice_idx])); // FIXME: After the memset above, some of the resets in reset() are redundant - dlsch_scheduler_pre_processor_reset(Mod_id, slice_idx, frameP, subframeP, + dlsch_scheduler_pre_processor_reset(Mod_id, + slice_idx, + frameP, + subframeP, min_rb_unit, nb_rbs_required, rballoc_sub, @@ -1199,44 +1207,63 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id, mbsfn_flag); // FIXME: Not sure if useful // STATUS // Store the DLSCH buffer for each logical channel - store_dlsch_buffer(Mod_id, slice_idx, frameP, subframeP); + store_dlsch_buffer(Mod_id, + slice_idx, + frameP, + subframeP); + // Calculate the number of RBs required by each UE on the basis of logical channel's buffer - assign_rbs_required(Mod_id, slice_idx, frameP, subframeP, nb_rbs_required, min_rb_unit); + assign_rbs_required(Mod_id, + slice_idx, + frameP, + subframeP, + nb_rbs_required, + min_rb_unit); + // Sorts the user on the basis of dlsch logical channel buffer and CQI - sort_UEs(Mod_id, slice_idx, frameP, subframeP); + sort_UEs(Mod_id, + slice_idx, + frameP, + subframeP); + // ACCOUNTING // This procedure decides the number of RBs to allocate - dlsch_scheduler_pre_processor_accounting(Mod_id, slice_idx, frameP, subframeP, - min_rb_unit, - nb_rbs_required, - nb_rbs_accounted); + dlsch_scheduler_pre_processor_accounting(Mod_id, + slice_idx, + frameP, + subframeP, + min_rb_unit, + nb_rbs_required, + nb_rbs_accounted); // POSITIONING // This procedure does the main allocation of the RBs - dlsch_scheduler_pre_processor_positioning(Mod_id, slice_idx, - min_rb_unit, - nb_rbs_required, - nb_rbs_accounted, - nb_rbs_remaining, - rballoc_sub, - MIMO_mode_indicator); + dlsch_scheduler_pre_processor_positioning(Mod_id, + slice_idx, + min_rb_unit, + nb_rbs_required, + nb_rbs_accounted, + nb_rbs_remaining, + rballoc_sub, + MIMO_mode_indicator); // SHARING // If there are available RBs left in the slice, allocate them to the highest priority UEs - if (RC.mac[Mod_id]->slice_info.intraslice_share_active) { - dlsch_scheduler_pre_processor_intraslice_sharing(Mod_id, slice_idx, - min_rb_unit, - nb_rbs_required, - nb_rbs_accounted, - nb_rbs_remaining, - rballoc_sub, - MIMO_mode_indicator); + if (eNB->slice_info.intraslice_share_active) { + dlsch_scheduler_pre_processor_intraslice_sharing(Mod_id, + slice_idx, + min_rb_unit, + nb_rbs_required, + nb_rbs_accounted, + nb_rbs_remaining, + rballoc_sub, + MIMO_mode_indicator); } #ifdef TM5 // This has to be revisited!!!! for (CC_id = 0; CC_id < RC.nb_mac_CC[Mod_id]; CC_id++) { - COMMON_channels_t *cc = &RC.mac[Mod_id]->common_channels[CC_id]; + COMMON_channels_t *cc = &eNB->common_channels[CC_id]; int N_RBG = to_rbg(cc->mib->message.dl_Bandwidth); i1 = 0; i2 = 0; @@ -1244,35 +1271,25 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id, for (j = 0; j < N_RBG; j++) { if (MIMO_mode_indicator[CC_id][j] == 2) { - i1 = i1 + 1; + i1++; } else if (MIMO_mode_indicator[CC_id][j] == 1) { - i2 = i2 + 1; + i2++; } else if (MIMO_mode_indicator[CC_id][j] == 0) { - i3 = i3 + 1; + i3++; } } - if ((i1 < N_RBG) && (i2 > 0) && (i3 == 0)) { - PHY_vars_eNB_g[Mod_id][CC_id]->check_for_SUMIMO_transmissions = - PHY_vars_eNB_g[Mod_id][CC_id]-> - check_for_SUMIMO_transmissions + 1; - } - - if (i3 == N_RBG && i1 == 0 && i2 == 0) { - PHY_vars_eNB_g[Mod_id][CC_id]->FULL_MUMIMO_transmissions = - PHY_vars_eNB_g[Mod_id][CC_id]->FULL_MUMIMO_transmissions + - 1; - } - - if ((i1 < N_RBG) && (i3 > 0)) { - PHY_vars_eNB_g[Mod_id][CC_id]->check_for_MUMIMO_transmissions = - PHY_vars_eNB_g[Mod_id][CC_id]-> - check_for_MUMIMO_transmissions + 1; + if (i1 < N_RBG) { + if (i2 > 0 && i3 == 0) { + PHY_vars_eNB_g[Mod_id][CC_id]->check_for_SUMIMO_transmissions = PHY_vars_eNB_g[Mod_id][CC_id]->check_for_SUMIMO_transmissions + 1; + } else if (i3 > 0) { + PHY_vars_eNB_g[Mod_id][CC_id]->check_for_MUMIMO_transmissions = PHY_vars_eNB_g[Mod_id][CC_id]->check_for_MUMIMO_transmissions + 1; + } + } else if (i3 == N_RBG && i1 == 0 && i2 == 0) { + PHY_vars_eNB_g[Mod_id][CC_id]->FULL_MUMIMO_transmissions = PHY_vars_eNB_g[Mod_id][CC_id]->FULL_MUMIMO_transmissions + 1; } + PHY_vars_eNB_g[Mod_id][CC_id]->check_for_total_transmissions = PHY_vars_eNB_g[Mod_id][CC_id]->check_for_total_transmissions + 1; - PHY_vars_eNB_g[Mod_id][CC_id]->check_for_total_transmissions = - PHY_vars_eNB_g[Mod_id][CC_id]->check_for_total_transmissions + - 1; } #endif @@ -1283,22 +1300,30 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id, for (i = 0; i < UE_num_active_CC(UE_list, UE_id); i++) { CC_id = UE_list->ordered_CCids[i][UE_id]; //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].dl_pow_off = dl_pow_off[UE_id]; - COMMON_channels_t *cc = &RC.mac[Mod_id]->common_channels[CC_id]; + COMMON_channels_t *cc = &eNB->common_channels[CC_id]; int N_RBG = to_rbg(cc->mib->message.dl_Bandwidth); if (ue_sched_ctl->pre_nb_available_rbs[CC_id] > 0) { - LOG_D(MAC, "******************DL Scheduling Information for UE%d ************************\n", UE_id); - LOG_D(MAC, "dl power offset UE%d = %d \n", UE_id, ue_sched_ctl->dl_pow_off[CC_id]); - LOG_D(MAC, "***********RB Alloc for every subband for UE%d ***********\n", UE_id); + LOG_D(MAC, "******************DL Scheduling Information for UE%d ************************\n", + UE_id); + LOG_D(MAC, "dl power offset UE%d = %d \n", + UE_id, + ue_sched_ctl->dl_pow_off[CC_id]); + LOG_D(MAC, "***********RB Alloc for every subband for UE%d ***********\n", + UE_id); for (j = 0; j < N_RBG; j++) { //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].rballoc_sub[UE_id] = rballoc_sub_UE[CC_id][UE_id][UE_id]; - LOG_D(MAC, "RB Alloc for UE%d and Subband%d = %d\n", UE_id, j, ue_sched_ctl->rballoc_sub_UE[CC_id][j]); + LOG_D(MAC, "RB Alloc for UE%d and Subband%d = %d\n", + UE_id, j, + ue_sched_ctl->rballoc_sub_UE[CC_id][j]); } //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = pre_nb_available_rbs[CC_id][UE_id]; LOG_D(MAC, "[eNB %d][SLICE %d]Total RBs allocated for UE%d = %d\n", - Mod_id, RC.mac[Mod_id]->slice_info.dl[slice_idx].id, UE_id, + Mod_id, + eNB->slice_info.dl[slice_idx].id, + UE_id, ue_sched_ctl->pre_nb_available_rbs[CC_id]); } }