diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index bda156fcdff54f4ccbe49d536212a641f74a5d9d..b169cec4f0637f368c33cae3a0242644be1919a5 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -478,6 +478,8 @@ typedef struct{ uint8_t oldNDI_UL[8]; /// Flag to indicate UL has been scheduled at least once boolean_t ul_active; + /// Flag to indicate UE has been configured (ACK from RRCConnectionSetup received) + boolean_t configured; // PHY interface info diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index 1833858c1de5f35397e2e8dc2e351102f8c5d033..28b5ff76207ca19465fad2790b718d2eea51304b 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -484,56 +484,3 @@ void cancel_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP, rnti_t rn } } -void terminate_ra_proc(module_id_t module_idP,int CC_id,frame_t frameP,rnti_t rnti,unsigned char *msg3, uint16_t msg3_len) { - - unsigned char rx_ces[MAX_NUM_CE],num_ce,num_sdu,i,*payload_ptr; - unsigned char rx_lcids[NB_RB_MAX]; - uint16_t rx_lengths[NB_RB_MAX]; - int8_t UE_id; - RA_TEMPLATE *RA_template = (RA_TEMPLATE *)&eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[0]; - - LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, Received msg3 %x.%x.%x.%x.%x.%x, Terminating RA procedure for UE rnti %x\n", - module_idP,frameP, - msg3[3],msg3[4],msg3[5],msg3[6],msg3[7], msg3[8], rnti); - - for (i=0;i<NB_RA_PROC_MAX;i++) { - LOG_D(MAC,"[RAPROC] Checking proc %d : rnti (%x, %x), active %d\n",i, - RA_template[i].rnti, rnti, - RA_template[i].RA_active); - if ((RA_template[i].rnti==rnti) && - (RA_template[i].RA_active==TRUE)) { - - payload_ptr = parse_ulsch_header(msg3,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,msg3_len); - LOG_D(MAC,"[eNB %d][RAPROC] Frame %d Received CCCH: length %d, offset %d\n", - module_idP,frameP,rx_lengths[0],payload_ptr-msg3); - if (/*(num_ce == 0) &&*/ (num_sdu==1) && (rx_lcids[0] == CCCH)) { // This is an RRCConnectionRequest/Restablishment - memcpy(&RA_template[i].cont_res_id[0],payload_ptr,6); - LOG_D(MAC,"[eNB %d][RAPROC] Frame %d Received CCCH: length %d, offset %d\n", - module_idP,frameP,rx_lengths[0],payload_ptr-msg3); - UE_id=add_new_ue(module_idP,CC_id,RA_template[i].rnti); - if (UE_id==-1) { - mac_xface->macphy_exit("[MAC][eNB] Max user count reached\n"); - } - else { - LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Added user with rnti %x => UE %d\n", - module_idP,frameP,RA_template[i].rnti,UE_id); - } - - if (Is_rrc_registered == 1) - mac_rrc_data_ind(module_idP,frameP,CCCH,(uint8_t *)payload_ptr,rx_lengths[0],1,module_idP,0); - // add_user. This is needed to have the rnti for configuring UE (PHY). The UE is removed if RRC - // doesn't provide a CCCH SDU - - } - else if (num_ce >0) { // handle msg3 which is not RRCConnectionRequest - // process_ra_message(msg3,num_ce,rx_lcids,rx_ces); - } - - RA_template[i].generate_Msg4 = 1; - RA_template[i].wait_ack_Msg4 = 0; - - return; - } // if process is active - - } // loop on RA processes -} diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index fcbc6d8930d7d70c3ed20637416c5e32f84be78b..ec43348c90ef556e8b151b27501ff8b43ceb8c89 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -164,7 +164,7 @@ unsigned char generate_dlsch_header(unsigned char *mac_header, last_size=1; // msg("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); ((TIMING_ADVANCE_CMD *)ce_ptr)->R=0; - ((TIMING_ADVANCE_CMD *)ce_ptr)->TA=timing_advance_cmd&0x3f; + ((TIMING_ADVANCE_CMD *)ce_ptr)->TA=(timing_advance_cmd+31)&0x3f; LOG_I(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); @@ -290,6 +290,82 @@ unsigned char generate_dlsch_header(unsigned char *mac_header, } +void set_ul_DAI(int module_idP,int UE_idP, int CC_idP, int frameP, int subframeP, LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) { + + eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP]; + UE_list_t *UE_list = &eNB->UE_list; + unsigned char DAI; + + if (frame_parms[CC_idP]->frame_type == TDD) { + DAI = (UE_list->UE_template[CC_idP][UE_idP].DAI-1)&3; + LOG_D(MAC,"[eNB %d] Frame %d, subframe %d: DAI %d for UE %d\n",module_idP,frameP,subframeP,DAI,UE_idP); + // Save DAI for Format 0 DCI + + switch (frame_parms[CC_idP]->tdd_config) { + case 0: + // if ((subframeP==0)||(subframeP==1)||(subframeP==5)||(subframeP==6)) + break; + case 1: + switch (subframeP) { + case 1: + UE_list->UE_template[CC_idP][UE_idP].DAI_ul[7] = DAI; + break; + case 4: + UE_list->UE_template[CC_idP][UE_idP].DAI_ul[8] = DAI; + break; + case 6: + UE_list->UE_template[CC_idP][UE_idP].DAI_ul[2] = DAI; + break; + case 9: + UE_list->UE_template[CC_idP][UE_idP].DAI_ul[3] = DAI; + break; + } + case 2: + // if ((subframeP==3)||(subframeP==8)) + // UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI; + break; + case 3: + //if ((subframeP==6)||(subframeP==8)||(subframeP==0)) { + // LOG_D(MAC,"schedule_ue_spec: setting UL DAI to %d for subframeP %d => %d\n",DAI,subframeP, ((subframeP+8)%10)>>1); + // UE_list->UE_template[CC_idP][UE_idP].DAI_ul[((subframeP+8)%10)>>1] = DAI; + //} + switch (subframeP) { + case 5: + case 6: + case 1: + UE_list->UE_template[CC_idP][UE_idP].DAI_ul[2] = DAI; + break; + case 7: + case 8: + UE_list->UE_template[CC_idP][UE_idP].DAI_ul[3] = DAI; + break; + case 9: + case 0: + UE_list->UE_template[CC_idP][UE_idP].DAI_ul[4] = DAI; + break; + default: + break; + } + + break; + case 4: + // if ((subframeP==8)||(subframeP==9)) + // UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI; + break; + case 5: + // if (subframeP==8) + // UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI; + break; + case 6: + // if ((subframeP==1)||(subframeP==4)||(subframeP==6)||(subframeP==9)) + // UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI; + break; + default: + break; + } + } +} + void schedule_ue_spec(module_id_t module_idP, frame_t frameP, @@ -393,6 +469,18 @@ void schedule_ue_spec(module_id_t module_idP, // else // break; } + + if (frame_parms[CC_id]->frame_type == TDD) { + set_ue_dai (subframeP, + frame_parms[CC_id]->tdd_config, + UE_id, + CC_id, + UE_list); + // update UL DAI after DLSCH scheduling + set_ul_DAI(module_idP,UE_id,CC_id,frameP,subframeP,frame_parms); + + } + if (continue_flag == 1 ){ add_ue_dlsch_info(module_idP, CC_id, @@ -401,13 +489,7 @@ void schedule_ue_spec(module_id_t module_idP, S_DL_NONE); continue; } - if (frame_parms[CC_id]->frame_type == TDD) - set_ue_dai (subframeP, - frame_parms[CC_id]->tdd_config, - UE_id, - CC_id, - UE_list); - + nb_available_rb = pre_nb_available_rbs[CC_id][UE_id]; UE_list->eNB_UE_stats[CC_id][UE_id].crnti= rnti; UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status=mac_get_rrc_status(module_idP,1,UE_id); @@ -1064,54 +1146,7 @@ void schedule_ue_spec(module_id_t module_idP, } } if (frame_parms[CC_id]->frame_type == TDD) { - DAI = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - LOG_D(MAC,"[eNB %d] Frame %d: DAI %d for UE %d\n",module_idP,frameP,DAI,UE_id); - // Save DAI for Format 0 DCI - - switch (frame_parms[CC_id]->tdd_config) { - case 0: - // if ((subframeP==0)||(subframeP==1)||(subframeP==5)||(subframeP==6)) - break; - case 1: - switch (subframeP) { - case 1: - UE_list->UE_template[CC_id][UE_id].DAI_ul[7] = DAI; - break; - case 4: - UE_list->UE_template[CC_id][UE_id].DAI_ul[8] = DAI; - break; - case 6: - UE_list->UE_template[CC_id][UE_id].DAI_ul[2] = DAI; - break; - case 9: - UE_list->UE_template[CC_id][UE_id].DAI_ul[3] = DAI; - break; - } - case 2: - // if ((subframeP==3)||(subframeP==8)) - // UE_list->UE_template[CC_id][UE_id].DAI_ul = DAI; - break; - case 3: - if ((subframeP==6)||(subframeP==8)||(subframeP==0)) { - LOG_D(MAC,"schedule_ue_spec: setting UL DAI to %d for subframeP %d => %d\n",DAI,subframeP, ((subframeP+8)%10)>>1); - UE_list->UE_template[CC_id][UE_id].DAI_ul[((subframeP+8)%10)>>1] = DAI; - } - break; - case 4: - // if ((subframeP==8)||(subframeP==9)) - // UE_list->UE_template[CC_id][UE_id].DAI_ul = DAI; - break; - case 5: - // if (subframeP==8) - // UE_list->UE_template[CC_id][UE_id].DAI_ul = DAI; - break; - case 6: - // if ((subframeP==1)||(subframeP==4)||(subframeP==6)||(subframeP==9)) - // UE_list->UE_template[CC_id][UE_id].DAI_ul = DAI; - break; - default: - break; - } + set_ul_DAI(module_idP,UE_id,CC_id,frameP,subframeP,frame_parms); } } } @@ -1701,6 +1736,9 @@ void fill_DLSCH_dci(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframeP %d : Msg4 acknowledged\n",module_idP,frameP,subframeP); RA_template->wait_ack_Msg4=0; RA_template->RA_active=FALSE; + UE_id = find_UE_id(module_idP,RA_template->rnti); + eNB_mac_inst[module_idP].UE_list.UE_template[UE_PCCID(module_idP,UE_id)][UE_id].configured=TRUE; + } } } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index b0ddf15097cb7c2d4fa37779d31cc68b9e914eba..f6bd3adeb9995fef938efdb73510e784b3aff064 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -203,7 +203,7 @@ void dump_ue_list(UE_list_t *listP) { } } -int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP) { +int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP,int harq_pidP) { int UE_id; int j; @@ -218,18 +218,19 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP) { UE_list->next[UE_id] = UE_list->head; UE_list->head = UE_id; - UE_list->UE_template[cc_idP][UE_id].rnti = rntiP; - UE_list->numactiveCCs[UE_id] = 1; - UE_list->numactiveULCCs[UE_id] = 1; - UE_list->pCC_id[UE_id] = cc_idP; - UE_list->ordered_CCids[0][UE_id] = cc_idP; - UE_list->ordered_ULCCids[0][UE_id] = cc_idP; + 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; + UE_list->numactiveULCCs[UE_id] = 1; + UE_list->pCC_id[UE_id] = cc_idP; + UE_list->ordered_CCids[0][UE_id] = cc_idP; + UE_list->ordered_ULCCids[0][UE_id] = cc_idP; UE_list->num_UEs++; - UE_list->active[UE_id] = TRUE; + UE_list->active[UE_id] = TRUE; for (j=0;j<8;j++) { UE_list->UE_template[cc_idP][UE_id].oldNDI[j] = (j==0)?1:0; // 1 because first transmission is with format1A (Msg4) for harq_pid 0 - UE_list->UE_template[cc_idP][UE_id].oldNDI_UL[j] = 0; + UE_list->UE_template[cc_idP][UE_id].oldNDI_UL[j] = (j==harq_pidP)?0:1; // 1st transmission is with Msg3; } eNB_ulsch_info[mod_idP][UE_id].status = S_UL_WAITING; eNB_dlsch_info[mod_idP][UE_id].status = S_UL_WAITING; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index b30be0cbe1fef3c6cc424fca8456a2101115ca4c..3f95f52de577002a7a19863e8f6e9ca5b359e029 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -73,7 +73,7 @@ // This table holds the allowable PRB sizes for ULSCH transmissions uint8_t rb_table[33] = {1,2,3,4,5,6,8,9,10,12,15,16,18,20,24,25,27,30,32,36,40,45,48,50,54,60,72,75,80,81,90,96,100}; -void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_t *sdu, uint16_t sdu_len) { +void rx_sdu(module_id_t enb_mod_idP,int CC_idP,frame_t frameP,rnti_t rntiP,uint8_t *sduP, uint16_t sdu_lenP,int harq_pidP) { unsigned char rx_ces[MAX_NUM_CE],num_ce,num_sdu,i,*payload_ptr; unsigned char rx_lcids[NB_RB_MAX]; @@ -91,7 +91,7 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_ vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_SDU,1); LOG_D(MAC,"[eNB %d] Received ULSCH sdu from PHY (rnti %x, UE_id %d), parsing header\n",enb_mod_idP,rntiP,UE_id); - payload_ptr = parse_ulsch_header(sdu,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,sdu_len); + payload_ptr = parse_ulsch_header(sduP,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,sdu_lenP); // control element for (i=0;i<num_ce;i++) { @@ -99,8 +99,8 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_ switch (rx_ces[i]) { // implement and process BSR + CRNTI + case POWER_HEADROOM: if (UE_id != UE_INDEX_INVALID ){ - UE_list->UE_template[CC_id][UE_id].phr_info = (payload_ptr[0] & 0x3f) - PHR_MAPPING_OFFSET; - LOG_D(MAC, "[eNB] MAC CE_LCID %d : Received PHR PH = %d (db)\n", rx_ces[i], UE_list->UE_template[CC_id][UE_id].phr_info); + UE_list->UE_template[CC_idP][UE_id].phr_info = (payload_ptr[0] & 0x3f) - PHR_MAPPING_OFFSET; + LOG_D(MAC, "[eNB] MAC CE_LCID %d : Received PHR PH = %d (db)\n", rx_ces[i], UE_list->UE_template[CC_idP][UE_id].phr_info); } payload_ptr+=sizeof(POWER_HEADROOM_CMD); break; @@ -115,25 +115,25 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_ lcgid = (payload_ptr[0] >> 6); LOG_D(MAC, "[eNB] MAC CE_LCID %d : Received short BSR LCGID = %u bsr = %d\n", rx_ces[i], lcgid, payload_ptr[0] & 0x3f); - UE_list->UE_template[CC_id][UE_id].bsr_info[lcgid] = (payload_ptr[0] & 0x3f); + UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid] = (payload_ptr[0] & 0x3f); } payload_ptr += 1;//sizeof(SHORT_BSR); // fixme } break; case LONG_BSR: if (UE_id != UE_INDEX_INVALID ){ - UE_list->UE_template[CC_id][UE_id].bsr_info[LCGID0] = ((payload_ptr[0] & 0xFC) >> 2); - UE_list->UE_template[CC_id][UE_id].bsr_info[LCGID1] = + UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0] = ((payload_ptr[0] & 0xFC) >> 2); + UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1] = ((payload_ptr[0] & 0x03) << 4) | ((payload_ptr[1] & 0xF0) >> 4); - UE_list->UE_template[CC_id][UE_id].bsr_info[LCGID2] = + UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2] = ((payload_ptr[1] & 0x0F) << 2) | ((payload_ptr[2] & 0xC0) >> 6); - UE_list->UE_template[CC_id][UE_id].bsr_info[LCGID3] = (payload_ptr[2] & 0x3F); + UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3] = (payload_ptr[2] & 0x3F); LOG_D(MAC, "[eNB] MAC CE_LCID %d: Received long BSR LCGID0 = %u LCGID1 = " "%u LCGID2 = %u LCGID3 = %u\n", rx_ces[i], - UE_list->UE_template[CC_id][UE_id].bsr_info[LCGID0], - UE_list->UE_template[CC_id][UE_id].bsr_info[LCGID1], - UE_list->UE_template[CC_id][UE_id].bsr_info[LCGID2], - UE_list->UE_template[CC_id][UE_id].bsr_info[LCGID3]); + UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0], + UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1], + UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2], + UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3]); } payload_ptr += 3;////sizeof(LONG_BSR); break; @@ -154,26 +154,26 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_ for (ii=0;ii<NB_RA_PROC_MAX;ii++) { LOG_D(MAC,"[RAPROC] Checking proc %d : rnti (%x, %x), active %d\n",ii, - eNB->common_channels[CC_id].RA_template[ii].rnti, rntiP, - eNB->common_channels[CC_id].RA_template[ii].RA_active); + eNB->common_channels[CC_idP].RA_template[ii].rnti, rntiP, + eNB->common_channels[CC_idP].RA_template[ii].RA_active); - if ((eNB->common_channels[CC_id].RA_template[ii].rnti==rntiP) && - (eNB->common_channels[CC_id].RA_template[ii].RA_active==TRUE)) { + if ((eNB->common_channels[CC_idP].RA_template[ii].rnti==rntiP) && + (eNB->common_channels[CC_idP].RA_template[ii].RA_active==TRUE)) { //payload_ptr = parse_ulsch_header(msg3,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,msg3_len); if (UE_id < 0) { - memcpy(&eNB->common_channels[CC_id].RA_template[ii].cont_res_id[0],payload_ptr,6); + memcpy(&eNB->common_channels[CC_idP].RA_template[ii].cont_res_id[0],payload_ptr,6); LOG_I(MAC,"[eNB %d][RAPROC] Frame %d CCCH: Received RRCConnectionRequest: length %d, offset %d\n", - enb_mod_idP,frameP,rx_lengths[ii],payload_ptr-sdu); - if ((UE_id=add_new_ue(enb_mod_idP,CC_id,eNB->common_channels[CC_id].RA_template[ii].rnti)) == -1 ) + enb_mod_idP,frameP,rx_lengths[ii],payload_ptr-sduP); + if ((UE_id=add_new_ue(enb_mod_idP,CC_idP,eNB->common_channels[CC_idP].RA_template[ii].rnti,harq_pidP)) == -1 ) mac_xface->macphy_exit("[MAC][eNB] Max user count reached\n"); else LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Added user with rnti %x => UE %d\n", - enb_mod_idP,frameP,eNB->common_channels[CC_id].RA_template[ii].rnti,UE_id); + enb_mod_idP,frameP,eNB->common_channels[CC_idP].RA_template[ii].rnti,UE_id); } else { LOG_I(MAC,"[eNB %d][RAPROC] Frame %d CCCH: Received RRCConnectionReestablishment from UE %d: length %d, offset %d\n", - enb_mod_idP,frameP,UE_id,rx_lengths[ii],payload_ptr-sdu); + enb_mod_idP,frameP,UE_id,rx_lengths[ii],payload_ptr-sduP); } if (Is_rrc_registered == 1) @@ -184,8 +184,8 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_ // process_ra_message(msg3,num_ce,rx_lcids,rx_ces); } - eNB->common_channels[CC_id].RA_template[ii].generate_Msg4 = 1; - eNB->common_channels[CC_id].RA_template[ii].wait_ack_Msg4 = 0; + eNB->common_channels[CC_idP].RA_template[ii].generate_Msg4 = 1; + eNB->common_channels[CC_idP].RA_template[ii].wait_ack_Msg4 = 0; } // if process is active @@ -195,10 +195,10 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_ break; case DCCH : case DCCH1 : - // if(eNB_mac_inst[module_idP][CC_id].Dcch_lchan[UE_id].Active==1){ + // if(eNB_mac_inst[module_idP][CC_idP].Dcch_lchan[UE_id].Active==1){ #if defined(ENABLE_MAC_PAYLOAD_DEBUG) - LOG_T(MAC,"offset: %d\n",(unsigned char)((unsigned char*)payload_ptr-sdu)); + LOG_T(MAC,"offset: %d\n",(unsigned char)((unsigned char*)payload_ptr-sduP)); for (j=0;j<32;j++) LOG_T(MAC,"%x ",payload_ptr[j]); LOG_T(MAC,"\n"); @@ -215,17 +215,17 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_ rx_lengths[i], 1, NULL);//(unsigned int*)crc_status); - UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_rx[rx_lcids[i]]+=1; - UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i]; + UE_list->eNB_UE_stats[CC_idP][UE_id].num_pdu_rx[rx_lcids[i]]+=1; + UE_list->eNB_UE_stats[CC_idP][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i]; } // } break; case DTCH: // default DRB - // if(eNB_mac_inst[module_idP][CC_id].Dcch_lchan[UE_id].Active==1){ + // if(eNB_mac_inst[module_idP][CC_idP].Dcch_lchan[UE_id].Active==1){ #if defined(ENABLE_MAC_PAYLOAD_DEBUG) - LOG_T(MAC,"offset: %d\n",(unsigned char)((unsigned char*)payload_ptr-sdu)); + LOG_T(MAC,"offset: %d\n",(unsigned char)((unsigned char*)payload_ptr-sduP)); for (j=0;j<32;j++) LOG_T(MAC,"%x ",payload_ptr[j]); LOG_T(MAC,"\n"); @@ -241,14 +241,14 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_ rx_lengths[i], 1, NULL);//(unsigned int*)crc_status); - UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_rx[rx_lcids[i]]+=1; - UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i]; + UE_list->eNB_UE_stats[CC_idP][UE_id].num_pdu_rx[rx_lcids[i]]+=1; + UE_list->eNB_UE_stats[CC_idP][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i]; } // } break; default : //if (rx_lcids[i] >= DTCH) { - UE_list->eNB_UE_stats[CC_id][UE_id].num_errors_rx+=1; + UE_list->eNB_UE_stats[CC_idP][UE_id].num_errors_rx+=1; LOG_E(MAC,"[eNB %d] received unsupported or unknown LCID %d from UE %d ", rx_lcids[i], UE_id); break; } @@ -256,8 +256,8 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_ } - UE_list->eNB_UE_stats[CC_id][UE_id].total_pdu_bytes_rx+=sdu_len; - UE_list->eNB_UE_stats[CC_id][UE_id].total_num_pdus_rx+=1; + UE_list->eNB_UE_stats[CC_idP][UE_id].total_pdu_bytes_rx+=sdu_lenP; + UE_list->eNB_UE_stats[CC_idP][UE_id].total_num_pdus_rx+=1; vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_SDU,0); stop_meas(&eNB->rx_ulsch_sdu); @@ -499,7 +499,7 @@ void schedule_ulsch_rnti(module_id_t module_idP, UE_list_t *UE_list=&eNB->UE_list; UE_TEMPLATE *UE_template; - int rvidx_tab[4] = {0,3,1,2}; + int rvidx_tab[4] = {0,2,3,1}; // loop over all active UEs @@ -571,8 +571,7 @@ void schedule_ulsch_rnti(module_id_t module_idP, UE_template->oldNDI_UL[harq_pid]=ndi; mcs = openair_daq_vars.target_ue_ul_mcs; } - - LOG_D(MAC,"[eNB %d] ULSCH scheduler: Ndi %d, mcs %d\n",module_idP,ndi,mcs); + LOG_D(MAC,"[eNB %d] ULSCH scheduler: harq_pid %d, Ndi %d, mcs %d\n",module_idP,harq_pid,ndi,mcs); /* if((cooperation_flag > 0) && (UE_id == 1)) { // Allocation on same set of RBs // RIV:resource indication value // function in openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -623,11 +622,13 @@ void schedule_ulsch_rnti(module_id_t module_idP, } //rb_table_index = 8; - LOG_I(MAC,"[eNB %d][PUSCH %d/%x] Frame %d subframeP %d Scheduled UE (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)\n", - module_idP,harq_pid,rnti,frameP,subframeP,mcs, - *first_rb,rb_table[rb_table_index], - rb_table_index,mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]), - harq_pid); + LOG_I(MAC,"[eNB %d][PUSCH %d/%x] Frame %d subframeP %d Scheduled UE (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d,DAI %d)\n", + module_idP,harq_pid,rnti,frameP,subframeP,mcs, + *first_rb,rb_table[rb_table_index], + rb_table_index,mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]), + harq_pid, + UE_template->DAI_ul[sched_subframe]); + rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL, *first_rb, diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c index ad0a8811b16b18bb21789dbe6459dc8d1df48e32..ecedc90f74ae89fa2e7e7cf8411d8abc3107294a 100644 --- a/openair2/LAYER2/MAC/main.c +++ b/openair2/LAYER2/MAC/main.c @@ -417,7 +417,6 @@ int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, uint8_t cba_group_ mac_xface->eNB_dlsch_ulsch_scheduler = eNB_dlsch_ulsch_scheduler; mac_xface->get_dci_sdu = get_dci_sdu; mac_xface->fill_rar = fill_rar; - mac_xface->terminate_ra_proc = terminate_ra_proc; mac_xface->initiate_ra_proc = initiate_ra_proc; mac_xface->cancel_ra_proc = cancel_ra_proc; mac_xface->SR_indication = SR_indication; diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h index ab98bfd6b39779215cd2d7f33904c84bd7a73196..279a11bfa01a29e113ffea0c380a5c7cbe53aaad 100644 --- a/openair2/LAYER2/MAC/proto.h +++ b/openair2/LAYER2/MAC/proto.h @@ -258,13 +258,6 @@ uint16_t fill_rar(module_id_t module_idP, uint16_t N_RB_UL, uint8_t input_buffer_length); -/* \brief This function indicates the end of RA procedure and provides the l3msg received on ULSCH. -@param Mod_id Instance ID of eNB -@param rnti RNTI of UE transmitting l3msg -@param l3msg Pointer to received l3msg -*/ -void terminate_ra_proc(module_id_t module_idP,int CC_id,frame_t frameP, rnti_t rnti, uint8_t *l3msg, uint16_t l3msg_len); - /* \brief Function to indicate a failed RA response. It removes all temporary variables related to the initial connection of a UE @param Mod_id Instance ID of eNB @param preamble_index index of the received RA request. @@ -275,8 +268,9 @@ void cancel_ra_proc(module_id_t module_idP,int CC_id,frame_t frameP, uint16_t pr @param Mod_id Instance ID of eNB @param rnti RNTI of UE transmitting the SR @param sdu Pointer to received SDU +@param harq_pid Index of harq process corresponding to this sdu */ -void rx_sdu(module_id_t module_idP, int CC_id,frame_t frameP, rnti_t rnti, uint8_t *sdu, uint16_t sdu_len); +void rx_sdu(module_id_t module_idP, int CC_id,frame_t frameP, rnti_t rnti, uint8_t *sdu, uint16_t sdu_len, int harq_pid); /* \brief Function to indicate a scheduled schduling request (SR) was received by eNB. @param Mod_id Instance ID of eNB @@ -476,7 +470,7 @@ uint8_t *parse_ulsch_header(uint8_t *mac_header, int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, uint8_t cba_group_active, uint8_t HO_active); int mac_init(void); -int add_new_ue(module_id_t Mod_id, int CC_id, rnti_t rnti); +int add_new_ue(module_id_t Mod_id, int CC_id, rnti_t rnti,int harq_pid); int mac_remove_ue(module_id_t Mod_id, int UE_id); void swap_UEs(UE_list_t *listP,int nodeiP, int nodejP); diff --git a/openair2/PHY_INTERFACE/defs.h b/openair2/PHY_INTERFACE/defs.h index d1d27478c595e9b4288fc3f15c2ebdba048118f1..27bc59d1f5235417cb330bdf8edecd05748716f0 100755 --- a/openair2/PHY_INTERFACE/defs.h +++ b/openair2/PHY_INTERFACE/defs.h @@ -75,9 +75,6 @@ typedef struct /// Fill random access response sdu, passing timing advance uint16_t (*fill_rar)(module_id_t Mod_id,int CC_id,frame_t frameP,uint8_t *dlsch_buffer,uint16_t N_RB_UL, uint8_t input_buffer_length); - /// Terminate the RA procedure upon reception of l3msg on ulsch - void (*terminate_ra_proc)(module_id_t Mod_id,int CC_id,frame_t frameP,uint16_t UE_id, uint8_t *l3msg, uint16_t l3msg_len); - /// Initiate the RA procedure upon reception (hypothetical) of a valid preamble void (*initiate_ra_proc)(module_id_t Mod_id,int CC_id,frame_t frameP,uint16_t preamble,int16_t timing_offset,uint8_t sect_id,sub_frame_t subframe,uint8_t f_id); @@ -91,7 +88,7 @@ typedef struct uint8_t* (*get_dlsch_sdu)(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti,uint8_t TB_index); /// Send ULSCH sdu to MAC for given rnti - void (*rx_sdu)(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti, uint8_t *sdu,uint16_t sdu_len); + void (*rx_sdu)(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti, uint8_t *sdu,uint16_t sdu_len, int harq_pid); /// Indicate failure to synch to external source void (*mrbch_phy_sync_failure) (module_id_t Mod_id,frame_t frameP, uint8_t free_eNB_index);