Provide means to look-up if UE has a CU-UP
It might happen that a UE has no CU-UP (e.g., never requested a PDU session). When triggering a release, we previously and implicitly associated a CU-UP in that case. That is not good, and confusing. This commit adds a function to look up if the UE has an associated CU-UP. We only send a release if it is the case. The function get_existing_cuup_for_ue() now instead verifies that a CU-UP exist, and does not implicitly create an association (which might be unwanted, see above).
This commit is contained in:
@@ -125,6 +125,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
|
||||
|
||||
void rrc_gNB_generate_dedicatedRRCReconfiguration(const protocol_ctxt_t *const ctxt_pP, rrc_gNB_ue_context_t *ue_context_pP);
|
||||
|
||||
bool ue_associated_to_cuup(const gNB_RRC_INST *rrc, const gNB_RRC_UE_t *ue);
|
||||
sctp_assoc_t get_existing_cuup_for_ue(const gNB_RRC_INST *rrc, const gNB_RRC_UE_t *ue);
|
||||
sctp_assoc_t get_new_cuup_for_ue(const gNB_RRC_INST *rrc, const gNB_RRC_UE_t *ue, int sst, int sd);
|
||||
int rrc_gNB_process_e1_setup_req(sctp_assoc_t assoc_id, e1ap_setup_req_t *req);
|
||||
|
||||
@@ -2542,12 +2542,16 @@ rrc_gNB_generate_RRCRelease(
|
||||
deliver_ue_ctxt_release_data_t data = {.rrc = rrc, .release_cmd = &ue_context_release_cmd, .assoc_id = ue_data.du_assoc_id};
|
||||
nr_pdcp_data_req_srb(ctxt_pP->rntiMaybeUEid, DCCH, rrc_gNB_mui++, size, buffer, rrc_deliver_ue_ctxt_release_cmd, &data);
|
||||
|
||||
sctp_assoc_t assoc_id = get_existing_cuup_for_ue(rrc, UE);
|
||||
e1ap_bearer_release_cmd_t cmd = {
|
||||
.gNB_cu_cp_ue_id = UE->rrc_ue_id,
|
||||
.gNB_cu_up_ue_id = UE->rrc_ue_id,
|
||||
};
|
||||
rrc->cucp_cuup.bearer_context_release(assoc_id, &cmd);
|
||||
/* a UE might not be associated to a CU-UP if it never requested a PDU
|
||||
* session (intentionally, or because of erros) */
|
||||
if (ue_associated_to_cuup(rrc, UE)) {
|
||||
sctp_assoc_t assoc_id = get_existing_cuup_for_ue(rrc, UE);
|
||||
e1ap_bearer_release_cmd_t cmd = {
|
||||
.gNB_cu_cp_ue_id = UE->rrc_ue_id,
|
||||
.gNB_cu_up_ue_id = UE->rrc_ue_id,
|
||||
};
|
||||
rrc->cucp_cuup.bearer_context_release(assoc_id, &cmd);
|
||||
}
|
||||
|
||||
/* UE will be freed after UE context release complete */
|
||||
}
|
||||
|
||||
@@ -75,14 +75,16 @@ static const nr_rrc_cuup_container_t *select_cuup_round_robin(size_t n_t, const
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool ue_associated_to_cuup(const gNB_RRC_INST *rrc, const gNB_RRC_UE_t *ue)
|
||||
{
|
||||
f1_ue_data_t ue_data = cu_get_f1_ue_data(ue->rrc_ue_id);
|
||||
return ue_data.e1_assoc_id != 0;
|
||||
}
|
||||
|
||||
sctp_assoc_t get_existing_cuup_for_ue(const gNB_RRC_INST *rrc, const gNB_RRC_UE_t *ue)
|
||||
{
|
||||
f1_ue_data_t ue_data = cu_get_f1_ue_data(ue->rrc_ue_id);
|
||||
if (ue_data.e1_assoc_id == 0) {
|
||||
LOG_W(RRC, "UE %d should be associated to CU-UP, but is not\n", ue->rrc_ue_id);
|
||||
/* we could possibly check the SST/SD from the PDU session */
|
||||
return get_new_cuup_for_ue(rrc, ue, 0, 0);
|
||||
}
|
||||
AssertFatal(ue_data.e1_assoc_id != 0, "UE %d should be associated to CU-UP, but is not\n", ue->rrc_ue_id);
|
||||
LOG_D(RRC, "UE %d using CU-UP assoc_id %d\n", ue->rrc_ue_id, ue_data.e1_assoc_id);
|
||||
return ue_data.e1_assoc_id;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user