Merge remote-tracking branch 'origin/f1-handover-minor-fixes' into integration_2025_w10
This commit is contained in:
@@ -1415,15 +1415,12 @@ int do_NR_Paging(uint8_t Mod_id, uint8_t *buffer, uint32_t tmsi)
|
||||
* in encoded form which we decode + add to the handoverPreparationInformation */
|
||||
int do_NR_HandoverPreparationInformation(const uint8_t *uecap_buf, int uecap_buf_size, uint8_t *buf, int buf_size)
|
||||
{
|
||||
NR_HandoverPreparationInformation_t *hpi = calloc(1, sizeof(*hpi));
|
||||
AssertFatal(hpi != NULL, "out of memory\n");
|
||||
NR_HandoverPreparationInformation_t *hpi = calloc_or_fail(1, sizeof(*hpi));
|
||||
hpi->criticalExtensions.present = NR_HandoverPreparationInformation__criticalExtensions_PR_c1;
|
||||
hpi->criticalExtensions.choice.c1 = calloc(1, sizeof(*hpi->criticalExtensions.choice.c1));
|
||||
AssertFatal(hpi->criticalExtensions.choice.c1 != NULL, "out of memory\n");
|
||||
hpi->criticalExtensions.choice.c1 = calloc_or_fail(1, sizeof(*hpi->criticalExtensions.choice.c1));
|
||||
hpi->criticalExtensions.choice.c1->present =
|
||||
NR_HandoverPreparationInformation__criticalExtensions__c1_PR_handoverPreparationInformation;
|
||||
NR_HandoverPreparationInformation_IEs_t *hpi_ie = calloc(1, sizeof(*hpi_ie));
|
||||
AssertFatal(hpi_ie != NULL, "out of memory\n");
|
||||
NR_HandoverPreparationInformation_IEs_t *hpi_ie = calloc_or_fail(1, sizeof(*hpi_ie));
|
||||
hpi->criticalExtensions.choice.c1->choice.handoverPreparationInformation = hpi_ie;
|
||||
|
||||
NR_UE_CapabilityRAT_ContainerList_t *list = NULL;
|
||||
|
||||
@@ -1276,7 +1276,11 @@ static void process_Event_Based_Measurement_Report(gNB_RRC_UE_t *ue, NR_ReportCo
|
||||
break;
|
||||
|
||||
case NR_EventTriggerConfig__eventId_PR_eventA3: {
|
||||
LOG_W(NR_RRC, "HO LOG: Event A3 Report - Neighbour Becomes Better than Serving!\n");
|
||||
LOG_W(NR_RRC, "HO LOG: Event A3 Report for UE %d - Neighbour Becomes Better than Serving!\n", ue->rrc_ue_id);
|
||||
if (!measurementReport->criticalExtensions.choice.measurementReport) {
|
||||
LOG_E(NR_RRC, "HO LOG: Event A3 Report: measurementReport is null\n");
|
||||
break;
|
||||
}
|
||||
const NR_MeasResults_t *measResults = &measurementReport->criticalExtensions.choice.measurementReport->measResults;
|
||||
|
||||
for (int serving_cell_idx = 0; serving_cell_idx < measResults->measResultServingMOList.list.count; serving_cell_idx++) {
|
||||
@@ -1290,11 +1294,11 @@ static void process_Event_Based_Measurement_Report(gNB_RRC_UE_t *ue, NR_ReportCo
|
||||
LOG_D(NR_RRC, "Serving Cell RSRP: %d\n", servingCellRSRP);
|
||||
}
|
||||
|
||||
if (measResults->measResultNeighCells == NULL)
|
||||
break;
|
||||
|
||||
if (measResults->measResultNeighCells->present != NR_MeasResults__measResultNeighCells_PR_measResultListNR)
|
||||
if (measResults->measResultNeighCells == NULL ||
|
||||
measResults->measResultNeighCells->present != NR_MeasResults__measResultNeighCells_PR_measResultListNR) {
|
||||
LOG_D(NR_RRC, "HO LOG: No neighbor cell measurements available\n");
|
||||
break;
|
||||
}
|
||||
|
||||
const NR_MeasResultListNR_t *measResultListNR = measResults->measResultNeighCells->choice.measResultListNR;
|
||||
for (int neigh_meas_idx = 0; neigh_meas_idx < measResultListNR->list.count; neigh_meas_idx++) {
|
||||
@@ -1392,7 +1396,7 @@ static void rrc_gNB_process_MeasurementReport(gNB_RRC_UE_t *UE, NR_MeasurementRe
|
||||
}
|
||||
}
|
||||
|
||||
if (report_config == NULL) {
|
||||
if (report_config == NULL || report_config->choice.reportConfigNR == NULL) {
|
||||
LOG_E(NR_RRC, "There is no related report configuration for this measId!\n");
|
||||
return;
|
||||
}
|
||||
@@ -1741,7 +1745,11 @@ static int rrc_gNB_decode_dcch(gNB_RRC_INST *rrc, const f1ap_ul_rrc_message_t *m
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_measurementReport:
|
||||
rrc_gNB_process_MeasurementReport(UE, ul_dcch_msg->message.choice.c1->choice.measurementReport);
|
||||
if (ul_dcch_msg->message.choice.c1->choice.measurementReport != NULL) {
|
||||
rrc_gNB_process_MeasurementReport(UE, ul_dcch_msg->message.choice.c1->choice.measurementReport);
|
||||
} else {
|
||||
LOG_E(NR_RRC, "UE %d: No measurementReport CHOICE is given\n", ue_context_p->ue_context.rrc_ue_id);
|
||||
}
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_ulInformationTransfer:
|
||||
|
||||
@@ -39,15 +39,12 @@
|
||||
typedef enum { HO_CTX_BOTH, HO_CTX_SOURCE, HO_CTX_TARGET } ho_ctx_type_t;
|
||||
static nr_handover_context_t *alloc_ho_ctx(ho_ctx_type_t type)
|
||||
{
|
||||
nr_handover_context_t *ho_ctx = calloc(1, sizeof(*ho_ctx));
|
||||
AssertFatal(ho_ctx != NULL, "out of memory\n");
|
||||
nr_handover_context_t *ho_ctx = calloc_or_fail(1, sizeof(*ho_ctx));
|
||||
if (type == HO_CTX_SOURCE || type == HO_CTX_BOTH) {
|
||||
ho_ctx->source = calloc(1, sizeof(*ho_ctx->source));
|
||||
AssertFatal(ho_ctx->source != NULL, "out of memory\n");
|
||||
ho_ctx->source = calloc_or_fail(1, sizeof(*ho_ctx->source));
|
||||
}
|
||||
if (type == HO_CTX_TARGET || type == HO_CTX_BOTH) {
|
||||
ho_ctx->target = calloc(1, sizeof(*ho_ctx->target));
|
||||
AssertFatal(ho_ctx->target != NULL, "out of memory\n");
|
||||
ho_ctx->target = calloc_or_fail(1, sizeof(*ho_ctx->target));
|
||||
}
|
||||
return ho_ctx;
|
||||
}
|
||||
@@ -132,9 +129,9 @@ static void nr_initiate_handover(const gNB_RRC_INST *rrc,
|
||||
.handoverPreparationInfo_length = ho_prep_len,
|
||||
};
|
||||
|
||||
f1ap_drb_to_be_setup_t drbs[32] = {0}; // maximum DRB can be 32
|
||||
f1ap_drb_to_be_setup_t drbs[MAX_DRBS_PER_UE] = {0};
|
||||
int nb_drb = 0;
|
||||
for (int i = 0; i < 32; ++i) { /* for each DRB */
|
||||
for (int i = 0; i < sizeofArray(drbs); ++i) {
|
||||
drb_t *rrc_drb = &ue->established_drbs[i];
|
||||
if (rrc_drb->status == DRB_INACTIVE)
|
||||
continue;
|
||||
@@ -157,8 +154,7 @@ static void nr_initiate_handover(const gNB_RRC_INST *rrc,
|
||||
// this changes
|
||||
AssertFatal(pdu->param.nb_qos == 1, "only 1 Qos flow supported\n");
|
||||
drb->drb_info.flows_to_be_setup_length = 1;
|
||||
drb->drb_info.flows_mapped_to_drb = calloc(1, sizeof(f1ap_flows_mapped_to_drb_t));
|
||||
AssertFatal(drb->drb_info.flows_mapped_to_drb, "could not allocate memory\n");
|
||||
drb->drb_info.flows_mapped_to_drb = calloc_or_fail(1, sizeof(f1ap_flows_mapped_to_drb_t));
|
||||
int qfi = rrc_drb->cnAssociation.sdap_config.mappedQoS_FlowsToAdd[0];
|
||||
DevAssert(qfi > 0);
|
||||
drb->drb_info.flows_mapped_to_drb[0].qfi = qfi;
|
||||
@@ -283,7 +279,7 @@ static void nr_rrc_f1_ho_complete(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE)
|
||||
f1ap_ue_context_release_cmd_t cmd = {
|
||||
.gNB_CU_ue_id = UE->rrc_ue_id,
|
||||
.gNB_DU_ue_id = source_ctx->du_ue_id,
|
||||
.cause = F1AP_CAUSE_RADIO_NETWORK, // better
|
||||
.cause = F1AP_CAUSE_RADIO_NETWORK,
|
||||
.cause_value = 5, // 5 = F1AP_CauseRadioNetwork_interaction_with_other_procedure
|
||||
.srb_id = DL_SCH_LCID_DCCH,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user