diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index 2099cbc4325a3cacfa603a984417d416e8ce1798..7f97f51f8b07b9544dc8b547b36e67af60bcc332 100644 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -524,9 +524,6 @@ static void rrc_gNB_generate_defaultRRCReconfiguration(const protocol_ctxt_t *co uint8_t xid = rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id); ue_p->xids[xid] = RRC_DEFAULT_RECONF; - const nr_rrc_du_container_t *du = rrc->du; - DevAssert(du != NULL); - struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList *dedicatedNAS_MessageList = CALLOC(1, sizeof(*dedicatedNAS_MessageList)); /* Add all NAS PDUs to the list */ @@ -551,7 +548,8 @@ static void rrc_gNB_generate_defaultRRCReconfiguration(const protocol_ctxt_t *co dedicatedNAS_MessageList = NULL; } - AssertFatal(du->setup_req->num_cells_available == 1, "cannot handle more than one cell, but have %d\n", du->setup_req->num_cells_available); + const nr_rrc_du_container_t *du = get_du_for_ue(rrc, ue_p->rrc_ue_id); + DevAssert(du != NULL); f1ap_served_cell_info_t *cell_info = &du->setup_req->cell[0].info; int scs = get_ssb_scs(cell_info); int band = get_dl_band(cell_info); @@ -1241,10 +1239,12 @@ static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc, const NR_RRC ? "Other Failure" : (cause == NR_ReestablishmentCause_handoverFailure ? "Handover Failure" : "reconfigurationFailure")); - /* look up corresponding DU. For the moment, there is only one */ - const nr_rrc_du_container_t *du = rrc->du; - AssertFatal(du != NULL, "received CCCH message, but no corresponding DU found\n"); - AssertFatal(du->setup_req->num_cells_available == 1, "cannot handle more than one cell\n"); + sctp_assoc_t assoc_id = 0; // currently, we have only one DU + const nr_rrc_du_container_t *du = get_du_by_assoc_id(rrc, assoc_id); + if (du == NULL) { + LOG_E(RRC, "received CCCH message, but no corresponding DU found\n"); + return; + } const f1ap_served_cell_info_t *cell_info = &du->setup_req->cell[0].info; if (physCellId != cell_info->nr_pci) { /* UE was moving from previous cell so quickly that RRCReestablishment for previous cell was received in this cell */ @@ -1293,7 +1293,7 @@ static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc, const NR_RRC // update with new RNTI, and update secondary UE association UE->rnti = msg->crnti; cu_remove_f1_ue_data(UE->rrc_ue_id); - f1_ue_data_t ue_data = {.secondary_ue = msg->gNB_DU_ue_id, .du_assoc_id = assoc_id}; + f1_ue_data_t ue_data = {.secondary_ue = msg->gNB_DU_ue_id}; cu_add_f1_ue_data(UE->rrc_ue_id, &ue_data); UE->reestablishment_cause = cause; @@ -2417,9 +2417,6 @@ rrc_gNB_generate_SecurityModeCommand( cu2du.uE_CapabilityRAT_ContainerList_length = ue_p->ue_cap_buffer.len; } - const nr_rrc_du_container_t *du = rrc->du; - DevAssert(du != NULL); - /* the callback will fill the UE context setup request and forward it */ f1_ue_data_t ue_data = cu_get_f1_ue_data(ue_p->rrc_ue_id); f1ap_ue_context_setup_t ue_context_setup_req = { diff --git a/openair2/RRC/NR/rrc_gNB_du.c b/openair2/RRC/NR/rrc_gNB_du.c index a0eec6c82d619d1aa497d297e1af96b218bba339..98c3cd7a123f21a70c60aa58516d0af1cf7f4e5a 100644 --- a/openair2/RRC/NR/rrc_gNB_du.c +++ b/openair2/RRC/NR/rrc_gNB_du.c @@ -183,3 +183,16 @@ void rrc_CU_process_f1_lost_connection(gNB_RRC_INST *rrc, f1ap_lost_connection_t /* TODO invalidate UE assoc IDs */ } +nr_rrc_du_container_t *get_du_for_ue(gNB_RRC_INST *rrc, uint32_t ue_id) +{ + nr_rrc_du_container_t *du = rrc->du; + if (du == NULL) + return NULL; + return du; +} + +nr_rrc_du_container_t *get_du_by_assoc_id(gNB_RRC_INST *rrc, sctp_assoc_t assoc_id) +{ + AssertFatal(assoc_id == rrc->du->assoc_id, "cannot handle multiple DUs yet\n"); + return rrc->du; +} diff --git a/openair2/RRC/NR/rrc_gNB_du.h b/openair2/RRC/NR/rrc_gNB_du.h index 59236d16d54a70c487e92d7e18b7bb5e78f2bd2f..c7472d652c891899b78f8e0d8ed64049230e12f5 100644 --- a/openair2/RRC/NR/rrc_gNB_du.h +++ b/openair2/RRC/NR/rrc_gNB_du.h @@ -24,12 +24,17 @@ #include <netinet/in.h> #include <netinet/sctp.h> +#include <stdint.h> struct f1ap_setup_req_s; struct f1ap_lost_connection_t; struct gNB_RRC_INST_s; +struct nr_rrc_du_container_t; void rrc_gNB_process_f1_setup_req(struct f1ap_setup_req_s *req, sctp_assoc_t assoc_id); void rrc_CU_process_f1_lost_connection(struct gNB_RRC_INST_s *rrc, struct f1ap_lost_connection_t *lc, sctp_assoc_t assoc_id); +struct nr_rrc_du_container_t *get_du_for_ue(struct gNB_RRC_INST_s *rrc, uint32_t ue_id); +struct nr_rrc_du_container_t *get_du_by_assoc_id(struct gNB_RRC_INST_s *rrc, sctp_assoc_t assoc_id); + #endif /* RRC_GNB_DU_H_ */