Add F1AP procedures related to measurementTimingConfiguration

This commit is contained in:
rmagueta
2025-07-11 13:46:21 +01:00
parent 621aa3c12e
commit a13a8f01af
5 changed files with 27 additions and 3 deletions
+1
View File
@@ -381,6 +381,7 @@ typedef struct f1ap_cu_to_du_rrc_info_s {
byte_array_t *cg_configinfo;
byte_array_t *ue_cap;
byte_array_t *meas_config;
byte_array_t *meas_timing_config;
byte_array_t *ho_prep_info;
} f1ap_cu_to_du_rrc_info_t;
+24 -1
View File
@@ -57,8 +57,9 @@ static F1AP_CUtoDURRCInformation_t encode_cu_to_du_rrc_info(const f1ap_cu_to_du_
}
/* optional: HandoverPreparationInformation */
F1AP_ProtocolExtensionContainer_10696P60_t *p = NULL;
if (cu2du->ho_prep_info) {
F1AP_ProtocolExtensionContainer_10696P60_t *p = calloc_or_fail(1, sizeof(*p));
p = calloc_or_fail(1, sizeof(*p));
enc.iE_Extensions = (struct F1AP_ProtocolExtensionContainer *)p;
asn1cSequenceAdd(p->list, F1AP_CUtoDURRCInformation_ExtIEs_t, ie_ext);
ie_ext->id = F1AP_ProtocolIE_ID_id_HandoverPreparationInformation;
@@ -68,6 +69,20 @@ static F1AP_CUtoDURRCInformation_t encode_cu_to_du_rrc_info(const f1ap_cu_to_du_
F1AP_HandoverPreparationInformation_t *hpi = &ie_ext->extensionValue.choice.HandoverPreparationInformation;
OCTET_STRING_fromBuf(hpi, (const char *)ba->buf, ba->len);
}
/* optional: iE_Extensions */
if (cu2du->meas_timing_config) {
if (!p)
p = calloc_or_fail(1, sizeof(*p));
enc.iE_Extensions = (struct F1AP_ProtocolExtensionContainer *)p;
asn1cSequenceAdd(p->list, F1AP_CUtoDURRCInformation_ExtIEs_t, ie_ext);
ie_ext->id = F1AP_ProtocolIE_ID_id_MeasurementTimingConfiguration;
ie_ext->criticality = F1AP_Criticality_ignore;
ie_ext->extensionValue.present = F1AP_CUtoDURRCInformation_ExtIEs__extensionValue_PR_MeasurementTimingConfiguration;
const byte_array_t *ba = cu2du->meas_timing_config;
F1AP_MeasurementTimingConfiguration_t *mtc = &ie_ext->extensionValue.choice.MeasurementTimingConfiguration;
OCTET_STRING_fromBuf(mtc, (const char *)ba->buf, ba->len);
}
return enc;
}
@@ -98,6 +113,11 @@ static bool decode_cu_to_du_rrc_info(f1ap_cu_to_du_rrc_info_t *dec, const F1AP_C
const F1AP_HandoverPreparationInformation_t *hopi = &cu2du_info_ext->extensionValue.choice.HandoverPreparationInformation;
*dec->ho_prep_info = create_byte_array(hopi->size, (uint8_t*) hopi->buf);
break;
case F1AP_ProtocolIE_ID_id_MeasurementTimingConfiguration:
dec->meas_timing_config = calloc_or_fail(1, sizeof(*dec->meas_timing_config));
const F1AP_MeasurementTimingConfiguration_t *mtc = &cu2du_info_ext->extensionValue.choice.MeasurementTimingConfiguration;
*dec->meas_timing_config = create_byte_array(mtc->size, (uint8_t *)mtc->buf);
break;
default:
PRINT_ERROR("received unsupported F1AP CUtoDURRCInfo extension container %ld\n", cu2du_info_ext->id);
}
@@ -112,6 +132,7 @@ static f1ap_cu_to_du_rrc_info_t cp_cu_to_du_rrc_info(const f1ap_cu_to_du_rrc_inf
CP_OPT_BYTE_ARRAY(dst.cg_configinfo, src->cg_configinfo);
CP_OPT_BYTE_ARRAY(dst.ue_cap, src->ue_cap);
CP_OPT_BYTE_ARRAY(dst.meas_config, src->meas_config);
CP_OPT_BYTE_ARRAY(dst.meas_timing_config, src->meas_timing_config);
CP_OPT_BYTE_ARRAY(dst.ho_prep_info, src->ho_prep_info);
return dst;
}
@@ -126,6 +147,7 @@ static bool eq_cu_to_du_rrc_info(const f1ap_cu_to_du_rrc_info_t *a, const f1ap_c
_F1_EQ_CHECK_OPTIONAL_IE(a, b, cg_configinfo, eq_ba);
_F1_EQ_CHECK_OPTIONAL_IE(a, b, ue_cap, eq_ba);
_F1_EQ_CHECK_OPTIONAL_IE(a, b, meas_config, eq_ba);
_F1_EQ_CHECK_OPTIONAL_IE(a, b, meas_timing_config, eq_ba);
_F1_EQ_CHECK_OPTIONAL_IE(a, b, ho_prep_info, eq_ba);
return true;
}
@@ -135,6 +157,7 @@ static void free_cu_to_du_rrc_info(f1ap_cu_to_du_rrc_info_t *cu2du)
FREE_OPT_BYTE_ARRAY(cu2du->cg_configinfo);
FREE_OPT_BYTE_ARRAY(cu2du->ue_cap);
FREE_OPT_BYTE_ARRAY(cu2du->meas_config);
FREE_OPT_BYTE_ARRAY(cu2du->meas_timing_config);
FREE_OPT_BYTE_ARRAY(cu2du->ho_prep_info);
}
+2
View File
@@ -755,6 +755,7 @@ static void test_f1ap_ue_context_setup_request()
orig.cu_to_du_rrc_info.cg_configinfo = get_malloced_test_ba("CG-CONFIGINFO");
orig.cu_to_du_rrc_info.ue_cap = get_malloced_test_ba("UE CAP");
orig.cu_to_du_rrc_info.meas_config = get_malloced_test_ba("UE MEASUREMENT CONFIGURATION");
orig.cu_to_du_rrc_info.meas_timing_config = get_malloced_test_ba("MEASUREMENT TIMING CONFIGURATION");
orig.cu_to_du_rrc_info.ho_prep_info = get_malloced_test_ba("PREPARATION DATA FOR HANDOVER");
orig.srbs_len = 2;
orig.srbs = calloc_or_fail(orig.srbs_len, sizeof(*orig.srbs));
@@ -996,6 +997,7 @@ static void test_f1ap_ue_context_modification_request()
.cg_configinfo = get_malloced_test_ba("Modified"),
.ue_cap = get_malloced_test_ba("UE forgot to send earlier"),
.meas_config = get_malloced_test_ba("with updates from another cell"),
.meas_timing_config = get_malloced_test_ba("measurement timing configuration"),
.ho_prep_info = get_malloced_test_ba("prepare to ho soon!"),
};
_F1_MALLOC(orig.cu_to_du_rrc_info, cu2du);
@@ -93,7 +93,6 @@ static void ue_context_modification_required_direct(const f1ap_ue_context_modif_
du2cu->cellGroupConfig = malloc(du2cu->cellGroupConfig_length * sizeof(*du2cu->cellGroupConfig));
AssertFatal(du2cu->cellGroupConfig != NULL, "out of memory\n");
memcpy(du2cu->cellGroupConfig, required->du_to_cu_rrc_information->cellGroupConfig, du2cu->cellGroupConfig_length);
AssertFatal(required->du_to_cu_rrc_information->measGapConfig == NULL && required->du_to_cu_rrc_information->measGapConfig_length == 0, "not handled yet\n");
AssertFatal(required->du_to_cu_rrc_information->requestedP_MaxFR1 == NULL && required->du_to_cu_rrc_information->requestedP_MaxFR1_length == 0, "not handled yet\n");
}
f1ap_msg->cause = required->cause;
@@ -117,7 +117,6 @@ static void ue_context_modification_required_f1ap(const f1ap_ue_context_modif_re
du2cu->cellGroupConfig = malloc(du2cu->cellGroupConfig_length * sizeof(*du2cu->cellGroupConfig));
AssertFatal(du2cu->cellGroupConfig != NULL, "out of memory\n");
memcpy(du2cu->cellGroupConfig, required->du_to_cu_rrc_information->cellGroupConfig, du2cu->cellGroupConfig_length);
AssertFatal(required->du_to_cu_rrc_information->measGapConfig == NULL && required->du_to_cu_rrc_information->measGapConfig_length == 0, "not handled yet\n");
AssertFatal(required->du_to_cu_rrc_information->requestedP_MaxFR1 == NULL && required->du_to_cu_rrc_information->requestedP_MaxFR1_length == 0, "not handled yet\n");
}
f1ap_msg->cause = required->cause;