do not send DU to CU container to CU if we can't serve the UE
This commit is contained in:
committed by
Robert Schmidt
parent
511f2f2487
commit
69ac704adc
@@ -2077,7 +2077,7 @@ static void nr_generate_Msg4_MsgB(module_id_t module_idP,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_check_Msg4_MsgB_Ack(module_id_t module_id, frame_t frame, slot_t slot, NR_UE_info_t *UE, bool success)
|
bool nr_check_Msg4_MsgB_Ack(module_id_t module_id, frame_t frame, slot_t slot, NR_UE_info_t *UE, bool success)
|
||||||
{
|
{
|
||||||
NR_RA_t *ra = UE->ra;
|
NR_RA_t *ra = UE->ra;
|
||||||
const char *ra_type_str = ra->ra_type == RA_2_STEP ? "MsgB" : "Msg4";
|
const char *ra_type_str = ra->ra_type == RA_2_STEP ? "MsgB" : "Msg4";
|
||||||
@@ -2092,10 +2092,21 @@ void nr_check_Msg4_MsgB_Ack(module_id_t module_id, frame_t frame, slot_t slot, N
|
|||||||
if (success) {
|
if (success) {
|
||||||
gNB_MAC_INST *nr_mac = RC.nrmac[module_id];
|
gNB_MAC_INST *nr_mac = RC.nrmac[module_id];
|
||||||
NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels[0].ServingCellConfigCommon;
|
NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels[0].ServingCellConfigCommon;
|
||||||
// we configure the UE using common search space with DCIX0 while waiting for a reconfiguration
|
LOG_A(NR_MAC,
|
||||||
configure_UE_BWP(nr_mac, scc, UE, false, NR_SearchSpace__searchSpaceType_PR_common, -1, -1);
|
"%4d.%2d UE %04x: Received Ack of %s. CBRA procedure succeeded (%s)\n",
|
||||||
transition_ra_connected_nr_ue(nr_mac, UE);
|
frame,
|
||||||
LOG_A(NR_MAC, "%4d.%2d UE %04x: Received Ack of %s. CBRA procedure succeeded!\n", frame, slot, UE->rnti, ra_type_str);
|
slot,
|
||||||
|
UE->rnti,
|
||||||
|
ra_type_str,
|
||||||
|
UE->CellGroup ? "UE Connected" : "UE Rejected");
|
||||||
|
if (UE->CellGroup) {
|
||||||
|
// we configure the UE using common search space with DCIX0 while waiting for a reconfiguration
|
||||||
|
configure_UE_BWP(nr_mac, scc, UE, false, NR_SearchSpace__searchSpaceType_PR_common, -1, -1);
|
||||||
|
transition_ra_connected_nr_ue(nr_mac, UE);
|
||||||
|
} else { // in case of UE reject
|
||||||
|
nr_release_ra_UE(nr_mac, UE->rnti);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_I(NR_MAC, "%4d.%2d UE %04x: RA Procedure failed at %s!\n", frame, slot, UE->rnti, ra_type_str);
|
LOG_I(NR_MAC, "%4d.%2d UE %04x: RA Procedure failed at %s!\n", frame, slot, UE->rnti, ra_type_str);
|
||||||
nr_mac_trigger_ul_failure(sched_ctrl, UE->current_DL_BWP.scs);
|
nr_mac_trigger_ul_failure(sched_ctrl, UE->current_DL_BWP.scs);
|
||||||
@@ -2108,6 +2119,7 @@ void nr_check_Msg4_MsgB_Ack(module_id_t module_id, frame_t frame, slot_t slot, N
|
|||||||
LOG_I(NR_MAC, "(UE %04x) Received Nack in %s, preparing retransmission!\n", UE->rnti, ra_type_str);
|
LOG_I(NR_MAC, "(UE %04x) Received Nack in %s, preparing retransmission!\n", UE->rnti, ra_type_str);
|
||||||
ra->ra_state = ra->ra_type == RA_4_STEP ? nrRA_Msg4 : nrRA_MsgB;
|
ra->ra_state = ra->ra_type == RA_4_STEP ? nrRA_Msg4 : nrRA_MsgB;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////
|
/////////////////////////////////////
|
||||||
@@ -2269,7 +2281,9 @@ void nr_schedule_RA(module_id_t module_idP,
|
|||||||
ra->contention_resolution_timer--;
|
ra->contention_resolution_timer--;
|
||||||
if (ra->contention_resolution_timer == 0) {
|
if (ra->contention_resolution_timer == 0) {
|
||||||
LOG_W(NR_MAC, "(%d.%d) RA Contention Resolution timer expired for UE 0x%04x, RA procedure failed...\n", frameP, slotP, UE->rnti);
|
LOG_W(NR_MAC, "(%d.%d) RA Contention Resolution timer expired for UE 0x%04x, RA procedure failed...\n", frameP, slotP, UE->rnti);
|
||||||
bool requested = nr_mac_request_release_ue(mac, UE->rnti);
|
bool requested = false;
|
||||||
|
if (UE->CellGroup) // request if we did not reject the UE
|
||||||
|
requested = nr_mac_request_release_ue(mac, UE->rnti);
|
||||||
if (!requested)
|
if (!requested)
|
||||||
nr_release_ra_UE(mac, UE->rnti);
|
nr_release_ra_UE(mac, UE->rnti);
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -3297,7 +3297,9 @@ void send_initial_ul_rrc_message(int rnti, const uint8_t *sdu, sdu_size_t sdu_le
|
|||||||
NR_SCHED_ENSURE_LOCKED(&mac->sched_lock);
|
NR_SCHED_ENSURE_LOCKED(&mac->sched_lock);
|
||||||
|
|
||||||
uint8_t du2cu[1024];
|
uint8_t du2cu[1024];
|
||||||
int encoded = encode_cellGroupConfig(UE->CellGroup, du2cu, sizeof(du2cu));
|
int encoded_len = 0;
|
||||||
|
if (UE->CellGroup)
|
||||||
|
encoded_len = encode_cellGroupConfig(UE->CellGroup, du2cu, sizeof(du2cu));
|
||||||
|
|
||||||
DevAssert(mac->f1_config.setup_req != NULL);
|
DevAssert(mac->f1_config.setup_req != NULL);
|
||||||
AssertFatal(mac->f1_config.setup_req->num_cells_available == 1, "can handle only one cell\n");
|
AssertFatal(mac->f1_config.setup_req->num_cells_available == 1, "can handle only one cell\n");
|
||||||
@@ -3308,8 +3310,8 @@ void send_initial_ul_rrc_message(int rnti, const uint8_t *sdu, sdu_size_t sdu_le
|
|||||||
.crnti = rnti,
|
.crnti = rnti,
|
||||||
.rrc_container = (uint8_t *) sdu,
|
.rrc_container = (uint8_t *) sdu,
|
||||||
.rrc_container_length = sdu_len,
|
.rrc_container_length = sdu_len,
|
||||||
.du2cu_rrc_container = (uint8_t *) du2cu,
|
.du2cu_rrc_container = encoded_len ? (uint8_t *) du2cu : NULL,
|
||||||
.du2cu_rrc_container_length = encoded
|
.du2cu_rrc_container_length = encoded_len
|
||||||
};
|
};
|
||||||
mac->mac_rrc.initial_ul_rrc_message_transfer(0, &ul_rrc_msg);
|
mac->mac_rrc.initial_ul_rrc_message_transfer(0, &ul_rrc_msg);
|
||||||
}
|
}
|
||||||
@@ -3331,12 +3333,14 @@ bool prepare_initial_ul_rrc_message(gNB_MAC_INST *mac, NR_UE_info_t *UE)
|
|||||||
ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig, UE->CellGroup);
|
ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig, UE->CellGroup);
|
||||||
UE->CellGroup = cellGroupConfig;
|
UE->CellGroup = cellGroupConfig;
|
||||||
|
|
||||||
|
if (!cellGroupConfig)
|
||||||
|
return true;
|
||||||
|
|
||||||
/* the cellGroup sent to CU specifies there is SRB1, so create it */
|
/* the cellGroup sent to CU specifies there is SRB1, so create it */
|
||||||
DevAssert(cellGroupConfig->rlc_BearerToAddModList->list.count == 1);
|
DevAssert(cellGroupConfig->rlc_BearerToAddModList->list.count == 1);
|
||||||
const NR_RLC_BearerConfig_t *bearer = cellGroupConfig->rlc_BearerToAddModList->list.array[0];
|
const NR_RLC_BearerConfig_t *bearer = cellGroupConfig->rlc_BearerToAddModList->list.array[0];
|
||||||
DevAssert(bearer->servedRadioBearer->choice.srb_Identity == srb_id);
|
DevAssert(bearer->servedRadioBearer->choice.srb_Identity == srb_id);
|
||||||
nr_rlc_add_srb(UE->rnti, bearer->servedRadioBearer->choice.srb_Identity, bearer);
|
nr_rlc_add_srb(UE->rnti, bearer->servedRadioBearer->choice.srb_Identity, bearer);
|
||||||
|
|
||||||
int priority = bearer->mac_LogicalChannelConfig->ul_SpecificParameters->priority;
|
int priority = bearer->mac_LogicalChannelConfig->ul_SpecificParameters->priority;
|
||||||
nr_lc_config_t c = {.lcid = bearer->logicalChannelIdentity, .priority = priority};
|
nr_lc_config_t c = {.lcid = bearer->logicalChannelIdentity, .priority = priority};
|
||||||
nr_mac_add_lcid(&UE->UE_sched_ctrl, &c);
|
nr_mac_add_lcid(&UE->UE_sched_ctrl, &c);
|
||||||
|
|||||||
@@ -899,8 +899,13 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id, frame_t frame, slot_t slot, con
|
|||||||
nr_mac_update_pdcch_closed_loop_adjust(sched_ctrl, harq_confidence != 0);
|
nr_mac_update_pdcch_closed_loop_adjust(sched_ctrl, harq_confidence != 0);
|
||||||
bool success = harq_value == 0 && harq_confidence == 0;
|
bool success = harq_value == 0 && harq_confidence == 0;
|
||||||
handle_dl_harq(UE, pid, success, nrmac->dl_bler.harq_round_max);
|
handle_dl_harq(UE, pid, success, nrmac->dl_bler.harq_round_max);
|
||||||
if (is_ra)
|
if (is_ra) {
|
||||||
nr_check_Msg4_MsgB_Ack(mod_id, frame, slot, UE, success);
|
bool ue_rejected = nr_check_Msg4_MsgB_Ack(mod_id, frame, slot, UE, success);
|
||||||
|
if (ue_rejected) {
|
||||||
|
NR_SCHED_UNLOCK(&nrmac->sched_lock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (harq_confidence == 1)
|
if (harq_confidence == 1)
|
||||||
UE->mac_stats.pucch0_DTX++;
|
UE->mac_stats.pucch0_DTX++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -319,7 +319,7 @@ void configure_UE_BWP(gNB_MAC_INST *nr_mac,
|
|||||||
|
|
||||||
bool transition_ra_connected_nr_ue(gNB_MAC_INST *nr_mac, NR_UE_info_t *UE);
|
bool transition_ra_connected_nr_ue(gNB_MAC_INST *nr_mac, NR_UE_info_t *UE);
|
||||||
bool add_connected_nr_ue(gNB_MAC_INST *nr_mac, NR_UE_info_t *UE);
|
bool add_connected_nr_ue(gNB_MAC_INST *nr_mac, NR_UE_info_t *UE);
|
||||||
void nr_check_Msg4_MsgB_Ack(module_id_t module_id, frame_t frame, slot_t slot, NR_UE_info_t *UE, bool success);
|
bool nr_check_Msg4_MsgB_Ack(module_id_t module_id, frame_t frame, slot_t slot, NR_UE_info_t *UE, bool success);
|
||||||
void mac_remove_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rnti);
|
void mac_remove_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rnti);
|
||||||
NR_UE_info_t *get_new_nr_ue_inst(uid_allocator_t *uia, rnti_t rnti, NR_CellGroupConfig_t *CellGroup);
|
NR_UE_info_t *get_new_nr_ue_inst(uid_allocator_t *uia, rnti_t rnti, NR_CellGroupConfig_t *CellGroup);
|
||||||
int nr_get_default_pucch_res(int pucch_ResourceCommon);
|
int nr_get_default_pucch_res(int pucch_ResourceCommon);
|
||||||
|
|||||||
@@ -3498,6 +3498,10 @@ NR_CellGroupConfig_t *get_initial_cellGroupConfig(int uid,
|
|||||||
const nr_mac_config_t *configuration,
|
const nr_mac_config_t *configuration,
|
||||||
const nr_rlc_configuration_t *default_rlc_config)
|
const nr_rlc_configuration_t *default_rlc_config)
|
||||||
{
|
{
|
||||||
|
NR_SpCellConfig_t *spCellConfig = get_initial_SpCellConfig(uid, scc, servingcellconfigdedicated, configuration);
|
||||||
|
if (!spCellConfig)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
NR_CellGroupConfig_t *cellGroupConfig = calloc(1, sizeof(*cellGroupConfig));
|
NR_CellGroupConfig_t *cellGroupConfig = calloc(1, sizeof(*cellGroupConfig));
|
||||||
cellGroupConfig->cellGroupId = 0;
|
cellGroupConfig->cellGroupId = 0;
|
||||||
|
|
||||||
@@ -3515,7 +3519,7 @@ NR_CellGroupConfig_t *get_initial_cellGroupConfig(int uid,
|
|||||||
|
|
||||||
cellGroupConfig->physicalCellGroupConfig = configure_phy_cellgroup();
|
cellGroupConfig->physicalCellGroupConfig = configure_phy_cellgroup();
|
||||||
|
|
||||||
cellGroupConfig->spCellConfig = get_initial_SpCellConfig(uid, scc, servingcellconfigdedicated, configuration);
|
cellGroupConfig->spCellConfig = spCellConfig;
|
||||||
|
|
||||||
cellGroupConfig->sCellToAddModList = NULL;
|
cellGroupConfig->sCellToAddModList = NULL;
|
||||||
cellGroupConfig->sCellToReleaseList = NULL;
|
cellGroupConfig->sCellToReleaseList = NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user