fix CRNTI process
This commit is contained in:
@@ -408,7 +408,9 @@ typedef enum {
|
|||||||
MSG2,
|
MSG2,
|
||||||
WAITMSG3,
|
WAITMSG3,
|
||||||
MSG4,
|
MSG4,
|
||||||
WAITMSG4ACK
|
WAITMSG4ACK,
|
||||||
|
MSGCRNTI,
|
||||||
|
MSGCRNTI_ACK
|
||||||
} RA_state;
|
} RA_state;
|
||||||
|
|
||||||
/*!\brief UE ULSCH scheduling states*/
|
/*!\brief UE ULSCH scheduling states*/
|
||||||
@@ -868,7 +870,8 @@ typedef struct {
|
|||||||
uint8_t aperiodic_wideband_cqi1[NFAPI_CC_MAX];
|
uint8_t aperiodic_wideband_cqi1[NFAPI_CC_MAX];
|
||||||
uint8_t aperiodic_wideband_pmi1[NFAPI_CC_MAX];
|
uint8_t aperiodic_wideband_pmi1[NFAPI_CC_MAX];
|
||||||
uint8_t dl_cqi[NFAPI_CC_MAX];
|
uint8_t dl_cqi[NFAPI_CC_MAX];
|
||||||
int32_t uplane_inactivity_timer;
|
int32_t uplane_inactivity_timer;
|
||||||
|
uint8_t crnti_reconfigurationcomplete_flag;
|
||||||
} UE_sched_ctrl;
|
} UE_sched_ctrl;
|
||||||
/*! \brief eNB template for the Random access information */
|
/*! \brief eNB template for the Random access information */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -927,6 +930,8 @@ typedef struct {
|
|||||||
uint8_t msg2_narrowband;
|
uint8_t msg2_narrowband;
|
||||||
uint8_t msg34_narrowband;
|
uint8_t msg34_narrowband;
|
||||||
#endif
|
#endif
|
||||||
|
int32_t crnti_rrc_mui;
|
||||||
|
int8_t crnti_harq_pid;
|
||||||
} RA_t;
|
} RA_t;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1000,6 +1000,16 @@ schedule_ue_spec(module_id_t module_idP,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&rrc_release_freelist);
|
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) &&
|
||||||
|
(ra[ra_ii].crnti_rrc_mui == rlc_status.rrc_mui)){
|
||||||
|
ra[ra_ii].crnti_harq_pid = harq_pid;
|
||||||
|
ra[ra_ii].state = MSGCRNTI_ACK;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
T(T_ENB_MAC_UE_DL_SDU, T_INT(module_idP),
|
T(T_ENB_MAC_UE_DL_SDU, T_INT(module_idP),
|
||||||
T_INT(CC_id), T_INT(rnti), T_INT(frameP),
|
T_INT(CC_id), T_INT(rnti), T_INT(frameP),
|
||||||
T_INT(subframeP), T_INT(harq_pid), T_INT(DCCH),
|
T_INT(subframeP), T_INT(harq_pid), T_INT(DCCH),
|
||||||
|
|||||||
@@ -3701,6 +3701,22 @@ extract_harq(module_id_t mod_idP, int CC_idP, int UE_id,
|
|||||||
LOG_D(MAC, "Received %d for harq_pid %d\n", pdu[0],
|
LOG_D(MAC, "Received %d for harq_pid %d\n", pdu[0],
|
||||||
harq_pid);
|
harq_pid);
|
||||||
|
|
||||||
|
RA_t *ra = &RC.mac[mod_idP]->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)) {
|
||||||
|
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);
|
||||||
|
if(pdu[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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (pdu[0] == 1) { // ACK
|
if (pdu[0] == 1) { // ACK
|
||||||
sched_ctl->round[CC_idP][harq_pid] = 8; // release HARQ process
|
sched_ctl->round[CC_idP][harq_pid] = 8; // release HARQ process
|
||||||
sched_ctl->tbcnt[CC_idP][harq_pid] = 0;
|
sched_ctl->tbcnt[CC_idP][harq_pid] = 0;
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ uint8_t rb_table[34] =
|
|||||||
{ 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32,
|
{ 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, 64, 72, 75, 80, 81, 90, 96, 100
|
36, 40, 45, 48, 50, 54, 60, 64, 72, 75, 80, 81, 90, 96, 100
|
||||||
};
|
};
|
||||||
|
extern mui_t rrc_eNB_mui;
|
||||||
|
|
||||||
void
|
void
|
||||||
rx_sdu(const module_id_t enb_mod_idP,
|
rx_sdu(const module_id_t enb_mod_idP,
|
||||||
@@ -273,8 +274,8 @@ rx_sdu(const module_id_t enb_mod_idP,
|
|||||||
enb_mod_idP, frameP, subframeP, CC_idP, rx_ces[i], i,
|
enb_mod_idP, frameP, subframeP, CC_idP, rx_ces[i], i,
|
||||||
num_ce, old_rnti, old_UE_id);
|
num_ce, old_rnti, old_UE_id);
|
||||||
/* receiving CRNTI means that the current rnti has to go away */
|
/* receiving CRNTI means that the current rnti has to go away */
|
||||||
cancel_ra_proc(enb_mod_idP, CC_idP, frameP,
|
//cancel_ra_proc(enb_mod_idP, CC_idP, frameP,
|
||||||
current_rnti);
|
// current_rnti);
|
||||||
if (old_UE_id != -1) {
|
if (old_UE_id != -1) {
|
||||||
/* TODO: if the UE did random access (followed by a MAC uplink with
|
/* TODO: if the UE did random access (followed by a MAC uplink with
|
||||||
* CRNTI) because none of its scheduling request was granted, then
|
* CRNTI) because none of its scheduling request was granted, then
|
||||||
@@ -287,20 +288,45 @@ rx_sdu(const module_id_t enb_mod_idP,
|
|||||||
* We have to take care of this. As the code is, nothing is done and
|
* We have to take care of this. As the code is, nothing is done and
|
||||||
* the UE state in the eNB is wrong.
|
* the UE state in the eNB is wrong.
|
||||||
*/
|
*/
|
||||||
UE_id = old_UE_id;
|
for (ii = 0; ii < NB_RA_PROC_MAX; ii++) {
|
||||||
UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer = 0;
|
ra = &mac->common_channels[CC_idP].ra[ii];
|
||||||
if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer > 0) {
|
if ((ra->rnti == current_rnti) && (ra->state != IDLE)) {
|
||||||
LOG_I(MAC, "UE %d rnti %x: UL Failure timer %d clear to 0\n", UE_id, old_rnti,
|
mac_rrc_data_ind(enb_mod_idP,
|
||||||
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer);
|
CC_idP,
|
||||||
}
|
frameP, subframeP,
|
||||||
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 0;
|
old_rnti,
|
||||||
if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync > 0) {
|
DCCH,
|
||||||
UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync = 0;
|
(uint8_t *) payload_ptr,
|
||||||
mac_eNB_rrc_ul_in_sync(enb_mod_idP, CC_idP, frameP,
|
rx_lengths[i],
|
||||||
subframeP, old_rnti);
|
ENB_FLAG_YES, enb_mod_idP, 0);
|
||||||
}
|
// prepare transmission of Msg4(RRCConnectionReconfiguration)
|
||||||
current_rnti = old_rnti;
|
ra->state = MSGCRNTI;
|
||||||
}
|
LOG_D(MAC,
|
||||||
|
"[eNB %d] Frame %d, Subframe %d CC_id %d : (rnti %x UE_id %d) RRCConnectionReconfiguration(Msg4)",
|
||||||
|
enb_mod_idP, frameP, subframeP, CC_idP, old_rnti, old_UE_id);
|
||||||
|
//
|
||||||
|
UE_id = old_UE_id;
|
||||||
|
current_rnti = old_rnti;
|
||||||
|
ra->rnti = old_rnti;
|
||||||
|
ra->crnti_rrc_mui = rrc_eNB_mui-1;
|
||||||
|
ra->crnti_harq_pid = -1;
|
||||||
|
//clear timer
|
||||||
|
UE_list->UE_sched_ctrl[UE_id].uplane_inactivity_timer = 0;
|
||||||
|
UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer = 0;
|
||||||
|
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 0;
|
||||||
|
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, old_rnti);
|
||||||
|
}
|
||||||
|
UE_list->UE_template[CC_idP][UE_id].ul_SR = 1;
|
||||||
|
UE_list->UE_sched_ctrl[UE_id].crnti_reconfigurationcomplete_flag = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
cancel_ra_proc(enb_mod_idP, CC_idP, frameP,current_rnti);
|
||||||
|
}
|
||||||
crnti_rx = 1;
|
crnti_rx = 1;
|
||||||
payload_ptr += 2;
|
payload_ptr += 2;
|
||||||
break;
|
break;
|
||||||
@@ -630,7 +656,7 @@ rx_sdu(const module_id_t enb_mod_idP,
|
|||||||
// Program Msg4 PDCCH+DLSCH/MPDCCH transmission 4 subframes from now, // Check if this is ok for BL/CE, or if the rule is different
|
// Program Msg4 PDCCH+DLSCH/MPDCCH transmission 4 subframes from now, // Check if this is ok for BL/CE, or if the rule is different
|
||||||
ra->Msg4_frame = frameP + ((subframeP > 5) ? 1 : 0);
|
ra->Msg4_frame = frameP + ((subframeP > 5) ? 1 : 0);
|
||||||
ra->Msg4_subframe = (subframeP + 4) % 10;
|
ra->Msg4_subframe = (subframeP + 4) % 10;
|
||||||
|
UE_list->UE_sched_ctrl[UE_id].crnti_reconfigurationcomplete_flag = 0;
|
||||||
} // if process is active
|
} // if process is active
|
||||||
} // loop on RA processes
|
} // loop on RA processes
|
||||||
|
|
||||||
|
|||||||
@@ -541,6 +541,7 @@ mac_rrc_data_ind(
|
|||||||
#endif // Rel10 || Rel14
|
#endif // Rel10 || Rel14
|
||||||
|
|
||||||
} else { // This is an eNB
|
} else { // This is an eNB
|
||||||
|
if((srb_idP & RAB_OFFSET) == CCCH) {
|
||||||
Srb_info = &RC.rrc[module_idP]->carrier[CC_id].Srb0;
|
Srb_info = &RC.rrc[module_idP]->carrier[CC_id].Srb0;
|
||||||
LOG_D(RRC,"[eNB %d] Received SDU for CCCH on SRB %d\n",module_idP,Srb_info->Srb_id);
|
LOG_D(RRC,"[eNB %d] Received SDU for CCCH on SRB %d\n",module_idP,Srb_info->Srb_id);
|
||||||
|
|
||||||
@@ -575,7 +576,17 @@ mac_rrc_data_ind(
|
|||||||
Srb_info->Rx_buffer.payload_size = sdu_lenP;
|
Srb_info->Rx_buffer.payload_size = sdu_lenP;
|
||||||
rrc_eNB_decode_ccch(&ctxt, Srb_info, CC_id);
|
rrc_eNB_decode_ccch(&ctxt, Srb_info, CC_id);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if((srb_idP & RAB_OFFSET) == DCCH) {
|
||||||
|
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
|
||||||
|
ue_context_p = rrc_eNB_get_ue_context(RC.rrc[ctxt.module_id],rntiP);
|
||||||
|
if(ue_context_p){
|
||||||
|
rrc_eNB_generate_defaultRRCConnectionReconfiguration(&ctxt,
|
||||||
|
ue_context_p,
|
||||||
|
0);
|
||||||
|
ue_context_p->ue_context.Status = RRC_RECONFIGURED;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6179,6 +6179,21 @@ rrc_eNB_decode_dcch(
|
|||||||
LOG_I(RRC,
|
LOG_I(RRC,
|
||||||
PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB, xid %ld)\n",
|
PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB, xid %ld)\n",
|
||||||
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier);
|
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier);
|
||||||
|
//clear
|
||||||
|
int16_t UE_id = find_UE_id(ctxt_pP->module_id, ctxt_pP->rnti);
|
||||||
|
if(UE_id == -1){
|
||||||
|
LOG_E(RRC,
|
||||||
|
PROTOCOL_RRC_CTXT_UE_FMT" RRCConnectionReconfigurationComplete without rnti %x, fault\n",
|
||||||
|
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ctxt_pP->rnti);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(RC.mac[ctxt_pP->module_id]->UE_list.UE_sched_ctrl[UE_id].crnti_reconfigurationcomplete_flag == 1){
|
||||||
|
LOG_I(RRC,
|
||||||
|
PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB, xid %ld) C-RNTI Complete\n",
|
||||||
|
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier);
|
||||||
|
dedicated_DRB = 2;
|
||||||
|
RC.mac[ctxt_pP->module_id]->UE_list.UE_sched_ctrl[UE_id].crnti_reconfigurationcomplete_flag = 0;
|
||||||
|
}
|
||||||
}else {
|
}else {
|
||||||
dedicated_DRB = 0;
|
dedicated_DRB = 0;
|
||||||
ue_context_p->ue_context.Status = RRC_RECONFIGURED;
|
ue_context_p->ue_context.Status = RRC_RECONFIGURED;
|
||||||
|
|||||||
Reference in New Issue
Block a user