From b9edba2186104beba90a156c926f7917c3a2ff8d Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Thu, 17 Apr 2025 17:21:58 +0200 Subject: [PATCH] Reimplement NSA release using F1 The RLC function is not used, this is handled at the DU. --- openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c | 6 --- openair2/RRC/NR/nr_rrc_proto.h | 3 +- openair2/RRC/NR/rrc_gNB.c | 19 +++++++-- openair2/RRC/NR/rrc_gNB_nsa.c | 57 ++++++++++--------------- 4 files changed, 39 insertions(+), 46 deletions(-) diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c index 94079dada8..f1f06b2d56 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c @@ -899,12 +899,6 @@ void nr_rlc_remove_ue(int ue_id) nr_rlc_manager_unlock(nr_rlc_ue_manager); } -rlc_op_status_t rrc_rlc_remove_ue (const protocol_ctxt_t* const x) -{ - nr_rlc_remove_ue(x->rntiMaybeUEid); - return RLC_OP_STATUS_OK; -} - bool nr_rlc_update_id(int from_id, int to_id) { nr_rlc_manager_lock(nr_rlc_ue_manager); diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h index a06ef76581..b8aab08edb 100644 --- a/openair2/RRC/NR/nr_rrc_proto.h +++ b/openair2/RRC/NR/nr_rrc_proto.h @@ -43,8 +43,9 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc, x2ap_ENDC_sgnb_addition_req_t *m); void rrc_add_nsa_user_resp(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, const f1ap_ue_context_setup_t *resp); +void rrc_release_nsa_user(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context); +void rrc_remove_nsa_user_context(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context); -void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti); void rrc_remove_ue(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context_p); int parse_CG_ConfigInfo(gNB_RRC_INST *rrc, NR_CG_ConfigInfo_t *CG_ConfigInfo, x2ap_ENDC_sgnb_addition_req_t *m); diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index aecf702f8d..b7e452fd73 100644 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -2028,16 +2028,27 @@ void rrc_gNB_process_initial_ul_rrc_message(sctp_assoc_t assoc_id, const f1ap_in ASN_STRUCT_FREE(asn_DEF_NR_UL_CCCH_Message, ul_ccch_msg); } +static void rrc_gNB_trigger_nsa_release(module_id_t mod_id, int ue_id) +{ + gNB_RRC_INST *rrc = RC.nrrrc[mod_id]; + rrc_gNB_ue_context_t *ue_context = rrc_gNB_get_ue_context(rrc, ue_id); + if (!ue_context) { + LOG_E(NR_RRC, "could not find UE for ID %d\n", ue_id); + return; + } + rrc_release_nsa_user(rrc, ue_context); +} + void rrc_gNB_process_release_request(const module_id_t gnb_mod_idP, x2ap_ENDC_sgnb_release_request_t *m) { - gNB_RRC_INST *rrc = RC.nrrrc[gnb_mod_idP]; - rrc_remove_nsa_user(rrc, m->rnti); + /* it's not the RNTI, it's the UE ID ... */ + rrc_gNB_trigger_nsa_release(gnb_mod_idP, m->rnti); } void rrc_gNB_process_dc_overall_timeout(const module_id_t gnb_mod_idP, x2ap_ENDC_dc_overall_timeout_t *m) { - gNB_RRC_INST *rrc = RC.nrrrc[gnb_mod_idP]; - rrc_remove_nsa_user(rrc, m->rnti); + /* it's not the RNTI, it's the UE ID ... */ + rrc_gNB_trigger_nsa_release(gnb_mod_idP, m->rnti); } /* \brief fill E1 bearer modification's DRB from F1 DRB diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c index b2f0991da3..2683f10a41 100644 --- a/openair2/RRC/NR/rrc_gNB_nsa.c +++ b/openair2/RRC/NR/rrc_gNB_nsa.c @@ -61,6 +61,7 @@ #include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h" #include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h" #include "openair3/SECU/key_nas_deriver.h" +#include "openair2/SDAP/nr_sdap/nr_sdap_entity.h" #include "rrc_gNB_du.h" #include "rlc.h" #include "s1ap_messages_types.h" @@ -400,40 +401,26 @@ void rrc_add_nsa_user_resp(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, const f1ap_ue_co ASN_STRUCT_FREE(asn_DEF_NR_CG_Config, CG_Config); } -void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) { - protocol_ctxt_t ctxt; - rrc_gNB_ue_context_t *ue_context; - int e_rab; +void rrc_remove_nsa_user_context(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context) +{ + if (!IS_SOFTMODEM_NOS1) + gtpv1u_delete_all_s1u_tunnel(rrc->module_id, ue_context->ue_context.rrc_ue_id); + // we don't use E1 => we have to free SDAP + nr_sdap_delete_ue_entities(ue_context->ue_context.rrc_ue_id); + rrc_remove_ue(rrc, ue_context); +} - LOG_D(RRC, "calling rrc_remove_nsa_user rnti %x\n", rnti); - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, rrc->module_id, GNB_FLAG_YES, rnti, 0, 0, rrc->module_id); - - ue_context = rrc_gNB_get_ue_context_by_rnti_any_du(rrc, rnti); - if (ue_context == NULL) { - LOG_W(RRC, "rrc_remove_nsa_user: rnti %x not found\n", rnti); - return; - } - - nr_pdcp_remove_UE(ue_context->ue_context.rrc_ue_id); - rrc_rlc_remove_ue(&ctxt); - - // lock the scheduler before removing the UE. Note: mac_remove_nr_ue() checks - // that the scheduler is actually locked! - NR_SCHED_LOCK(&RC.nrmac[rrc->module_id]->sched_lock); - mac_remove_nr_ue(RC.nrmac[rrc->module_id], rnti); - NR_SCHED_UNLOCK(&RC.nrmac[rrc->module_id]->sched_lock); - gtpv1u_enb_delete_tunnel_req_t tmp={0}; - tmp.rnti=rnti; - tmp.from_gnb=1; - LOG_D(RRC, "ue_context->ue_context.nb_of_e_rabs %d will be deleted for rnti %x\n", ue_context->ue_context.nb_of_e_rabs, rnti); - for (e_rab = 0; e_rab < ue_context->ue_context.nb_of_e_rabs; e_rab++) { - tmp.eps_bearer_id[tmp.num_erab++]= ue_context->ue_context.nsa_gtp_ebi[e_rab]; - // erase data - ue_context->ue_context.nsa_gtp_teid[e_rab] = 0; - memset(&ue_context->ue_context.nsa_gtp_addrs[e_rab], 0, sizeof(ue_context->ue_context.nsa_gtp_addrs[e_rab])); - ue_context->ue_context.nsa_gtp_ebi[e_rab] = 0; - } - gtpv1u_delete_all_s1u_tunnel(rrc->module_id, rnti); - /* remove context */ - rrc_gNB_remove_ue_context(rrc, ue_context); +void rrc_release_nsa_user(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context) +{ + gNB_RRC_UE_t *UE = &ue_context->ue_context; + f1_ue_data_t ue_data = cu_get_f1_ue_data(UE->rrc_ue_id); + RETURN_IF_INVALID_ASSOC_ID(ue_data.du_assoc_id); + f1ap_ue_context_release_cmd_t cmd = { + .gNB_CU_ue_id = UE->rrc_ue_id, + .gNB_DU_ue_id = ue_data.secondary_ue, + .cause = F1AP_CAUSE_RADIO_NETWORK, + .cause_value = 10, // 10 = F1AP_CauseRadioNetwork_normal_release + }; + rrc->mac_rrc.ue_context_release_command(ue_data.du_assoc_id, &cmd); + rrc_remove_nsa_user_context(rrc, ue_context); }