diff --git a/openair2/COMMON/f1ap_messages_types.h b/openair2/COMMON/f1ap_messages_types.h index 89826e7ff5..e44e1dccb4 100644 --- a/openair2/COMMON/f1ap_messages_types.h +++ b/openair2/COMMON/f1ap_messages_types.h @@ -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; diff --git a/openair2/F1AP/lib/f1ap_ue_context.c b/openair2/F1AP/lib/f1ap_ue_context.c index a1b5531c2b..9d8cbfe15f 100644 --- a/openair2/F1AP/lib/f1ap_ue_context.c +++ b/openair2/F1AP/lib/f1ap_ue_context.c @@ -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); } diff --git a/openair2/F1AP/tests/f1ap_lib_test.c b/openair2/F1AP/tests/f1ap_lib_test.c index ebf90fc648..72ea809245 100644 --- a/openair2/F1AP/tests/f1ap_lib_test.c +++ b/openair2/F1AP/tests/f1ap_lib_test.c @@ -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); diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c index cf6c5b2563..deec619e3d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c +++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c @@ -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; diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c index 19bf8039b6..c7e23ed702 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c +++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c @@ -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;