put 50 PRB back in default enb configuration. added handling of UE release in L1/L2. detection of stale ULSCH configuration
This commit is contained in:
@@ -2402,7 +2402,9 @@ void fill_ulsch(PHY_VARS_eNB *eNB,nfapi_ul_config_ulsch_pdu *ulsch_pdu,int frame
|
||||
uint8_t UE_id;
|
||||
|
||||
AssertFatal((UE_id=find_ulsch(ulsch_pdu->ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE))>=0,
|
||||
"No existing UE ULSCH for rnti %x\n",ulsch_pdu->ulsch_pdu_rel8.rnti);
|
||||
"No existing/free UE ULSCH for rnti %x\n",ulsch_pdu->ulsch_pdu_rel8.rnti);
|
||||
|
||||
boolean_t new_ulsch = (find_ulsch(ulsch_pdu->ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST)==-1) ? TRUE : FALSE;
|
||||
|
||||
LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id];
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
|
||||
@@ -2414,6 +2416,7 @@ void fill_ulsch(PHY_VARS_eNB *eNB,nfapi_ul_config_ulsch_pdu *ulsch_pdu,int frame
|
||||
|
||||
ulsch->harq_processes[harq_pid]->frame = frame;
|
||||
ulsch->harq_processes[harq_pid]->subframe = subframe;
|
||||
ulsch->harq_processes[harq_pid]->handled = 0;
|
||||
|
||||
ulsch->harq_processes[harq_pid]->first_rb = ulsch_pdu->ulsch_pdu_rel8.resource_block_start;
|
||||
ulsch->harq_processes[harq_pid]->nb_rb = ulsch_pdu->ulsch_pdu_rel8.number_of_resource_blocks;
|
||||
@@ -2457,7 +2460,8 @@ void fill_ulsch(PHY_VARS_eNB *eNB,nfapi_ul_config_ulsch_pdu *ulsch_pdu,int frame
|
||||
ulsch->harq_processes[harq_pid]->O_ACK = 0;
|
||||
|
||||
if ((ulsch->harq_processes[harq_pid]->status == SCH_IDLE) ||
|
||||
(ulsch->harq_processes[harq_pid]->ndi != ulsch_pdu->ulsch_pdu_rel8.new_data_indication)){
|
||||
(ulsch->harq_processes[harq_pid]->ndi != ulsch_pdu->ulsch_pdu_rel8.new_data_indication) ||
|
||||
(new_ulsch == TRUE)){
|
||||
ulsch->harq_processes[harq_pid]->status = ACTIVE;
|
||||
|
||||
ulsch->harq_processes[harq_pid]->TBS = ulsch_pdu->ulsch_pdu_rel8.size<<3;
|
||||
@@ -2475,8 +2479,8 @@ void fill_ulsch(PHY_VARS_eNB *eNB,nfapi_ul_config_ulsch_pdu *ulsch_pdu,int frame
|
||||
else ulsch->harq_processes[harq_pid]->round++;
|
||||
|
||||
ulsch->rnti = ulsch_pdu->ulsch_pdu_rel8.rnti;
|
||||
LOG_D(PHY,"Filling ULSCH %x for Frame %d, Subframe %d : harq_pid %d, first_rb %d, nb_rb %d, rvidx %d, Qm %d, TBS %d, round %d \n",
|
||||
ulsch->rnti,
|
||||
LOG_D(PHY,"Filling ULSCH %x (new_ulsch %d) for Frame %d, Subframe %d : harq_pid %d, first_rb %d, nb_rb %d, rvidx %d, Qm %d, TBS %d, round %d \n",
|
||||
ulsch->rnti, new_ulsch,
|
||||
frame,
|
||||
subframe,
|
||||
harq_pid,
|
||||
|
||||
@@ -400,6 +400,8 @@ typedef struct {
|
||||
uint8_t subframe;
|
||||
/// Frame for reception
|
||||
uint32_t frame;
|
||||
/// Flag to indicate that the UL configuration has been handled. Used to remove a stale ULSCH when frame wraps around
|
||||
uint8_t handled;
|
||||
/// PHICH active flag
|
||||
uint8_t phich_active;
|
||||
/// PHICH ACK
|
||||
|
||||
@@ -887,17 +887,11 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
||||
x2 = ((uint32_t)ulsch->rnti<<14) + ((uint32_t)subframe<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.3.1
|
||||
ulsch_harq = ulsch->harq_processes[harq_pid];
|
||||
|
||||
if (harq_pid==255) {
|
||||
LOG_E(PHY, "FATAL ERROR: illegal harq_pid, returning\n");
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING0+harq_pid,0);
|
||||
return -1;
|
||||
}
|
||||
AssertFatal(harq_pid!=255,
|
||||
"FATAL ERROR: illegal harq_pid, returning\n");
|
||||
|
||||
if (ulsch_harq->Nsymb_pusch == 0) {
|
||||
LOG_E(PHY, "FATAL ERROR: harq_pid %d, Nsymb 0!\n",harq_pid);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING0+harq_pid,0);
|
||||
return 1+ulsch->max_turbo_iterations;
|
||||
}
|
||||
AssertFatal(ulsch_harq->Nsymb_pusch != 0,
|
||||
"FATAL ERROR: harq_pid %d, Nsymb 0!\n",harq_pid);
|
||||
|
||||
|
||||
nb_rb = ulsch_harq->nb_rb;
|
||||
@@ -1032,10 +1026,8 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,
|
||||
G = G - Q_RI - Q_CQI;
|
||||
ulsch_harq->G = G;
|
||||
|
||||
if ((int)G < 0) {
|
||||
LOG_E(PHY,"FATAL: ulsch_decoding.c G < 0 (%d) : Q_RI %d, Q_CQI %d\n",G,Q_RI,Q_CQI);
|
||||
return(-1);
|
||||
}
|
||||
AssertFatal((int)G > 0,
|
||||
"FATAL: ulsch_decoding.c G < 0 (%d) : Q_RI %d, Q_CQI %d\n",G,Q_RI,Q_CQI);
|
||||
|
||||
H = G + Q_CQI;
|
||||
Hprime = H/Q_m;
|
||||
|
||||
@@ -666,7 +666,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,
|
||||
{
|
||||
if (max_preamble_energy[0] > 350) {
|
||||
|
||||
LOG_I(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure with preamble %d, energy %d.%d dB, delay %d\n",
|
||||
LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure with preamble %d, energy %d.%d dB, delay %d\n",
|
||||
eNB->Mod_id,
|
||||
eNB->CC_id,
|
||||
frame,
|
||||
@@ -1294,11 +1294,12 @@ void pusch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) {
|
||||
if ((ulsch) &&
|
||||
(ulsch->rnti>0) &&
|
||||
(ulsch_harq->status == ACTIVE) &&
|
||||
(ulsch_harq->frame == frame) &&
|
||||
(ulsch_harq->subframe == subframe)) {
|
||||
(ulsch_harq->frame == frame) &&
|
||||
(ulsch_harq->subframe == subframe) &&
|
||||
(ulsch_harq->handled == 0)) {
|
||||
|
||||
|
||||
// UE is has ULSCH scheduling
|
||||
// UE has ULSCH scheduling
|
||||
|
||||
for (int rb=0;
|
||||
rb<=ulsch_harq->nb_rb;
|
||||
@@ -1469,9 +1470,23 @@ void pusch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) {
|
||||
eNB->UE_stats[i].ulsch_errors[harq_pid],
|
||||
eNB->UE_stats[i].ulsch_decoding_attempts[harq_pid][0]);
|
||||
|
||||
ulsch_harq->handled = 1;
|
||||
} // if ((ulsch) &&
|
||||
// (ulsch->rnti>0) &&
|
||||
// (ulsch_harq->status == ACTIVE))
|
||||
|
||||
else if ((ulsch) &&
|
||||
(ulsch->rnti>0) &&
|
||||
(ulsch_harq->status == ACTIVE) &&
|
||||
(ulsch_harq->frame == frame) &&
|
||||
(ulsch_harq->subframe == subframe) &&
|
||||
(ulsch_harq->handled == 1)) {
|
||||
// this harq process is stale, kill it, this 1024 frames later (10s), consider reducing that
|
||||
ulsch_harq->status = SCH_IDLE;
|
||||
ulsch->harq_mask = 0;
|
||||
LOG_W(PHY,"Removing stale ULSCH config for UE %x\n",ulsch->rnti);
|
||||
}
|
||||
|
||||
} // for (i=0; i<NUMBER_OF_UE_MAX; i++) {
|
||||
}
|
||||
|
||||
|
||||
@@ -807,6 +807,7 @@ typedef struct {
|
||||
uint16_t ta_timer;
|
||||
int16_t ta_update;
|
||||
uint8_t ul_cqi;
|
||||
uint16_t ul_consecutive_errors;
|
||||
int32_t context_active_timer;
|
||||
int32_t cqi_req_timer;
|
||||
int32_t ul_inactivity_timer;
|
||||
|
||||
@@ -86,8 +86,8 @@ void add_msg3(module_id_t module_idP,int CC_id, RA_TEMPLATE *RA_template, frame_
|
||||
LOG_D(MAC,"[eNB %d][RAPROC] Frame %d, Subframe %d : CC_id %d CE level %d is active, Msg3 in (%d,%d)\n",
|
||||
module_idP,frameP,subframeP,CC_id,RA_template->rach_resource_type-1,
|
||||
RA_template->Msg3_frame,RA_template->Msg3_subframe);
|
||||
LOG_D(MAC,"Frame %d, Subframe %d Adding Msg3 UL Config Request for (%d,%d)\n",
|
||||
frameP,subframeP,RA_template->Msg3_frame,RA_template->Msg3_subframe);
|
||||
LOG_D(MAC,"Frame %d, Subframe %d Adding Msg3 UL Config Request for (%d,%d) : (%d,%d)\n",
|
||||
frameP,subframeP,RA_template->Msg3_frame,RA_template->Msg3_subframe,RA_template->msg3_nb_rb,RA_template->msg3_round);
|
||||
|
||||
ul_config_pdu = &ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus];
|
||||
|
||||
@@ -123,8 +123,9 @@ void add_msg3(module_id_t module_idP,int CC_id, RA_TEMPLATE *RA_template, frame_
|
||||
LOG_D(MAC,"[eNB %d][RAPROC] Frame %d, Subframe %d : CC_id %d RA is active, Msg3 in (%d,%d)\n",
|
||||
module_idP,frameP,subframeP,CC_id,RA_template->Msg3_frame,RA_template->Msg3_subframe);
|
||||
|
||||
LOG_D(MAC,"Frame %d, Subframe %d Adding Msg3 UL Config Request for (%d,%d)\n",
|
||||
frameP,subframeP,RA_template->Msg3_frame,RA_template->Msg3_subframe);
|
||||
LOG_D(MAC,"Frame %d, Subframe %d Adding Msg3 UL Config Request for (%d,%d) : (%d,%d,%d)\n",
|
||||
frameP,subframeP,RA_template->Msg3_frame,RA_template->Msg3_subframe,
|
||||
RA_template->msg3_nb_rb,RA_template->msg3_first_rb,RA_template->msg3_round);
|
||||
|
||||
ul_config_pdu = &ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus];
|
||||
|
||||
@@ -813,7 +814,7 @@ void generate_Msg4(module_id_t module_idP,int CC_idP,frame_t frameP,sub_frame_t
|
||||
#endif
|
||||
{ // This is normal LTE case
|
||||
if ((RA_template->Msg4_frame == frameP) && (RA_template->Msg4_subframe == subframeP)) {
|
||||
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Generating Msg4 with RRC Piggyback (RNTI %x)\n",
|
||||
LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Generating Msg4 with RRC Piggyback (RNTI %x)\n",
|
||||
module_idP, CC_idP, frameP, subframeP,RA_template->rnti);
|
||||
|
||||
/// Choose first 4 RBs for Msg4, should really check that these are free!
|
||||
@@ -870,12 +871,12 @@ void generate_Msg4(module_id_t module_idP,int CC_idP,frame_t frameP,sub_frame_t
|
||||
RA_template->wait_ack_Msg4=1;
|
||||
|
||||
// increment Absolute subframe by 8 for Msg4 retransmission
|
||||
LOG_I(MAC,"Frame %d, Subframe %d: Preparing for Msg4 retransmission currently %d.%d\n",
|
||||
LOG_D(MAC,"Frame %d, Subframe %d: Preparing for Msg4 retransmission currently %d.%d\n",
|
||||
frameP,subframeP,RA_template->Msg4_frame,RA_template->Msg4_subframe);
|
||||
if (RA_template->Msg4_subframe > 1) RA_template->Msg4_frame++;
|
||||
RA_template->Msg4_frame&=1023;
|
||||
RA_template->Msg4_subframe = (RA_template->Msg4_subframe+8)%10;
|
||||
LOG_I(MAC,"Frame %d, Subframe %d: Msg4 retransmission in %d.%d\n",
|
||||
LOG_D(MAC,"Frame %d, Subframe %d: Msg4 retransmission in %d.%d\n",
|
||||
frameP,subframeP,RA_template->Msg4_frame,RA_template->Msg4_subframe);
|
||||
lcid=0;
|
||||
|
||||
@@ -1119,7 +1120,7 @@ void check_Msg4_retransmission(module_id_t module_idP,int CC_idP,frame_t frameP,
|
||||
} // Msg4 frame/subframe
|
||||
} // regular LTE case
|
||||
} else {
|
||||
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d : Msg4 acknowledged\n",module_idP,CC_idP,frameP,subframeP);
|
||||
LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d : Msg4 acknowledged\n",module_idP,CC_idP,frameP,subframeP);
|
||||
RA_template->wait_ack_Msg4=0;
|
||||
RA_template->RA_active=FALSE;
|
||||
UE_id = find_UE_id(module_idP,RA_template->rnti);
|
||||
@@ -1215,6 +1216,7 @@ void initiate_ra_proc(module_id_t module_idP,
|
||||
if (RA_template[i].RA_active==FALSE &&
|
||||
RA_template[i].wait_ack_Msg4 == 0) {
|
||||
int loop = 0;
|
||||
LOG_D(MAC,"Frame %d, Subframe %d: Activating RA process %d\n",frameP,subframeP,i);
|
||||
RA_template[i].RA_active = TRUE;
|
||||
RA_template[i].generate_rar = 1;
|
||||
RA_template[i].generate_Msg4 = 0;
|
||||
|
||||
@@ -111,35 +111,37 @@ void rx_sdu(const module_id_t enb_mod_idP,
|
||||
|
||||
AssertFatal(UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid] < 8,
|
||||
"round >= 8\n");
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer = 0;
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 0;
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_scheduled &= (~(1<<harq_pid));
|
||||
UE_list->UE_sched_ctrl[UE_id].ta_update = timing_advance;
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_cqi = ul_cqi;
|
||||
first_rb = UE_list->UE_template[CC_idP][UE_id].first_rb_ul[harq_pid];
|
||||
if (sduP!=NULL) {
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer = 0;
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 0;
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_scheduled &= (~(1<<harq_pid));
|
||||
UE_list->UE_sched_ctrl[UE_id].ta_update = timing_advance;
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_cqi = ul_cqi;
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_consecutive_errors = 0;
|
||||
first_rb = UE_list->UE_template[CC_idP][UE_id].first_rb_ul[harq_pid];
|
||||
|
||||
if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync > 0) {
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync=0;
|
||||
mac_eNB_rrc_ul_in_sync(enb_mod_idP,CC_idP,frameP,subframeP,UE_RNTI(enb_mod_idP,UE_id));
|
||||
if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync > 0) {
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync=0;
|
||||
mac_eNB_rrc_ul_in_sync(enb_mod_idP,CC_idP,frameP,subframeP,UE_RNTI(enb_mod_idP,UE_id));
|
||||
}
|
||||
}
|
||||
|
||||
if (sduP==NULL) { // we've got an error
|
||||
else { // we've got an error
|
||||
LOG_D(MAC,"[eNB %d][PUSCH %d] CC_id %d ULSCH in error in round %d, ul_cqi %d\n",enb_mod_idP,harq_pid,CC_idP,
|
||||
UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid],ul_cqi);
|
||||
UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid],ul_cqi);
|
||||
|
||||
// AssertFatal(1==0,"ulsch in error\n");
|
||||
if (UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid] == 3) {
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_scheduled &= (~(1<<harq_pid));
|
||||
UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid]=0;
|
||||
// here we increment error statistics
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_scheduled &= (~(1<<harq_pid));
|
||||
UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid]=0;
|
||||
if (UE_list->UE_sched_ctrl[UE_id].ul_consecutive_errors++ == 10)
|
||||
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 1;
|
||||
}
|
||||
else UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid]++;
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
else { // Check if this is an RA process for the rnti
|
||||
AssertFatal((RA_id = find_RA_id(enb_mod_idP,CC_idP,rntiP))!=-1,
|
||||
"Cannot find rnti %x in RA list\n",rntiP);
|
||||
else if ((RA_id = find_RA_id(enb_mod_idP,CC_idP,rntiP))!=-1) { // Check if this is an RA process for the rnti
|
||||
AssertFatal(eNB->common_channels[CC_idP].radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx>1,
|
||||
"maxHARQ %d should be greater than 1\n",
|
||||
(int)eNB->common_channels[CC_idP].radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx);
|
||||
@@ -158,15 +160,22 @@ void rx_sdu(const module_id_t enb_mod_idP,
|
||||
cancel_ra_proc(enb_mod_idP,CC_idP,frameP,rntiP);
|
||||
}
|
||||
|
||||
first_rb = UE_list->UE_template[CC_idP][UE_id].first_rb_ul[harq_pid];
|
||||
RA_template[RA_id].msg3_round++;
|
||||
// prepare handling of retransmission
|
||||
RA_template[RA_id].Msg3_frame += ((RA_template[RA_id].Msg3_subframe>1) ? 1 : 0);
|
||||
RA_template[RA_id].Msg3_subframe = (RA_template[RA_id].Msg3_subframe+8)%10;
|
||||
add_msg3(enb_mod_idP,CC_idP, &RA_template[RA_id],frameP,subframeP);
|
||||
else {
|
||||
first_rb = UE_list->UE_template[CC_idP][UE_id].first_rb_ul[harq_pid];
|
||||
RA_template[RA_id].msg3_round++;
|
||||
// prepare handling of retransmission
|
||||
RA_template[RA_id].Msg3_frame += ((RA_template[RA_id].Msg3_subframe>1) ? 1 : 0);
|
||||
RA_template[RA_id].Msg3_subframe = (RA_template[RA_id].Msg3_subframe+8)%10;
|
||||
add_msg3(enb_mod_idP,CC_idP, &RA_template[RA_id],frameP,subframeP);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
LOG_W(MAC,"Cannot find UE or RA corresponding to ULSCH rnti %x, dropping it\n",
|
||||
rntiP);
|
||||
return;
|
||||
}
|
||||
payload_ptr = parse_ulsch_header(sduP,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,sdu_lenP);
|
||||
|
||||
T(T_ENB_MAC_UE_UL_PDU, T_INT(enb_mod_idP), T_INT(CC_idP), T_INT(rntiP), T_INT(frameP), T_INT(subframeP),
|
||||
|
||||
@@ -36,7 +36,7 @@ eNBs =
|
||||
downlink_frequency = 2685000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 25;
|
||||
N_RB_DL = 50;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
|
||||
Reference in New Issue
Block a user