From 212fe8d2f35f94267a5c0cde3ed92bf9f326eed3 Mon Sep 17 00:00:00 2001 From: Guido Casati <hello@guidocasati.com> Date: Mon, 3 Feb 2025 15:58:04 +0100 Subject: [PATCH] Add common enc/dec E1AP libs to e1ap_lib_common.c * these functions are used in both interface management and bearer context management libraries --- openair2/E1AP/lib/CMakeLists.txt | 1 + openair2/E1AP/lib/e1ap_interface_management.c | 59 +------------- openair2/E1AP/lib/e1ap_lib_common.c | 81 +++++++++++++++++++ openair2/E1AP/lib/e1ap_lib_common.h | 5 ++ 4 files changed, 89 insertions(+), 57 deletions(-) create mode 100644 openair2/E1AP/lib/e1ap_lib_common.c diff --git a/openair2/E1AP/lib/CMakeLists.txt b/openair2/E1AP/lib/CMakeLists.txt index 27bfbcc8a2..332986dffb 100644 --- a/openair2/E1AP/lib/CMakeLists.txt +++ b/openair2/E1AP/lib/CMakeLists.txt @@ -1,6 +1,7 @@ add_library(e1ap_lib OBJECT e1ap_bearer_context_management.c e1ap_interface_management.c + e1ap_lib_common.c ) target_link_libraries(e1ap_lib PRIVATE asn1_e1ap) diff --git a/openair2/E1AP/lib/e1ap_interface_management.c b/openair2/E1AP/lib/e1ap_interface_management.c index 8f29ba07c5..681942f58b 100644 --- a/openair2/E1AP/lib/e1ap_interface_management.c +++ b/openair2/E1AP/lib/e1ap_interface_management.c @@ -508,61 +508,6 @@ bool eq_e1ap_cuup_setup_response(const e1ap_setup_resp_t *a, const e1ap_setup_re * GNB-CU-UP E1 SETUP FAILURE * ==================================== */ -static E1AP_Cause_t encode_e1ap_cause_ie(const e1ap_cause_t *cause) -{ - E1AP_Cause_t ie; - switch (cause->type) { - case E1AP_CAUSE_RADIO_NETWORK: - ie.present = E1AP_Cause_PR_radioNetwork; - ie.choice.radioNetwork = cause->value; - break; - case E1AP_CAUSE_TRANSPORT: - ie.present = E1AP_Cause_PR_transport; - ie.choice.transport = cause->value; - break; - case E1AP_CAUSE_PROTOCOL: - ie.present = E1AP_Cause_PR_protocol; - ie.choice.protocol = cause->value; - break; - case E1AP_CAUSE_MISC: - ie.present = E1AP_Cause_PR_misc; - ie.choice.misc = cause->value; - break; - default: - ie.present = E1AP_Cause_PR_NOTHING; - break; - } - return ie; -} - -static e1ap_cause_t decode_e1ap_cause_ie(const E1AP_Cause_t *ie) -{ - e1ap_cause_t cause; - // Decode the 'choice' field based on the 'present' value - switch (ie->present) { - case E1AP_Cause_PR_radioNetwork: - cause.value = ie->choice.radioNetwork; - cause.type = E1AP_CAUSE_RADIO_NETWORK; - break; - case E1AP_Cause_PR_transport: - cause.value = ie->choice.transport; - cause.type = E1AP_CAUSE_TRANSPORT; - break; - case E1AP_Cause_PR_protocol: - cause.value = ie->choice.protocol; - cause.type = E1AP_CAUSE_PROTOCOL; - break; - case E1AP_Cause_PR_misc: - cause.value = ie->choice.misc; - cause.type = E1AP_CAUSE_MISC; - break; - default: - cause.type = E1AP_CAUSE_NOTHING; - break; - } - return cause; -} - /** * @brief Encoder for GNB-CU-UP E1 Setup Failure * @ref 9.2.1.6 GNB-CU-UP E1 SETUP FAILURE of 3GPP TS 38.463 @@ -588,7 +533,7 @@ E1AP_E1AP_PDU_t *encode_e1ap_cuup_setup_failure(const e1ap_setup_fail_t *msg) ie2->id = E1AP_ProtocolIE_ID_id_Cause; ie2->criticality = E1AP_Criticality_ignore; ie2->value.present = E1AP_GNB_CU_UP_E1SetupFailureIEs__value_PR_Cause; - ie2->value.choice.Cause = encode_e1ap_cause_ie(&msg->cause); + ie2->value.choice.Cause = e1_encode_cause_ie(&msg->cause); // Time To Wait (O) if (msg->time_to_wait) { asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ie3); @@ -630,7 +575,7 @@ bool decode_e1ap_cuup_setup_failure(const E1AP_E1AP_PDU_t *pdu, e1ap_setup_fail_ case E1AP_ProtocolIE_ID_id_Cause: // Cause E1AP_LIB_FIND_IE(E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ie, in, E1AP_ProtocolIE_ID_id_Cause, true); - out->cause = decode_e1ap_cause_ie(&ie->value.choice.Cause); + out->cause = e1_decode_cause_ie(&ie->value.choice.Cause); break; case E1AP_ProtocolIE_ID_id_Transport_Layer_Address_Info: // Time To Wait (O) diff --git a/openair2/E1AP/lib/e1ap_lib_common.c b/openair2/E1AP/lib/e1ap_lib_common.c new file mode 100644 index 0000000000..02923b7cf7 --- /dev/null +++ b/openair2/E1AP/lib/e1ap_lib_common.c @@ -0,0 +1,81 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "e1ap_lib_common.h" +#include "e1ap_lib_includes.h" +#include "e1ap_messages_types.h" + +E1AP_Cause_t e1_encode_cause_ie(const e1ap_cause_t *cause) +{ + E1AP_Cause_t ie; + switch (cause->type) { + case E1AP_CAUSE_RADIO_NETWORK: + ie.present = E1AP_Cause_PR_radioNetwork; + ie.choice.radioNetwork = cause->value; + break; + case E1AP_CAUSE_TRANSPORT: + ie.present = E1AP_Cause_PR_transport; + ie.choice.transport = cause->value; + break; + case E1AP_CAUSE_PROTOCOL: + ie.present = E1AP_Cause_PR_protocol; + ie.choice.protocol = cause->value; + break; + case E1AP_CAUSE_MISC: + ie.present = E1AP_Cause_PR_misc; + ie.choice.misc = cause->value; + break; + default: + ie.present = E1AP_Cause_PR_NOTHING; + PRINT_ERROR("encode_e1ap_cause_ie: no cause value provided\n"); + break; + } + return ie; +} + +e1ap_cause_t e1_decode_cause_ie(const E1AP_Cause_t *ie) +{ + e1ap_cause_t cause; + // Decode the 'choice' field based on the 'present' value + switch (ie->present) { + case E1AP_Cause_PR_radioNetwork: + cause.value = ie->choice.radioNetwork; + cause.type = E1AP_CAUSE_RADIO_NETWORK; + break; + case E1AP_Cause_PR_transport: + cause.value = ie->choice.transport; + cause.type = E1AP_CAUSE_TRANSPORT; + break; + case E1AP_Cause_PR_protocol: + cause.value = ie->choice.protocol; + cause.type = E1AP_CAUSE_PROTOCOL; + break; + case E1AP_Cause_PR_misc: + cause.value = ie->choice.misc; + cause.type = E1AP_CAUSE_MISC; + break; + default: + cause.type = E1AP_CAUSE_NOTHING; + PRINT_ERROR("decode_e1ap_cause_ie: no cause value provided\n"); + break; + } + return cause; +} diff --git a/openair2/E1AP/lib/e1ap_lib_common.h b/openair2/E1AP/lib/e1ap_lib_common.h index eceddb263f..be11100d90 100644 --- a/openair2/E1AP/lib/e1ap_lib_common.h +++ b/openair2/E1AP/lib/e1ap_lib_common.h @@ -26,6 +26,7 @@ #include <stdint.h> #include <stdio.h> #include "openair3/UTILS/conversions.h" +#include "e1ap_messages_types.h" #ifdef ENABLE_TESTS #define PRINT_ERROR(...) fprintf(stderr, ##__VA_ARGS__); @@ -98,4 +99,8 @@ } \ } while (0) +struct E1AP_Cause; +struct E1AP_Cause e1_encode_cause_ie(const e1ap_cause_t *cause); +e1ap_cause_t e1_decode_cause_ie(const struct E1AP_Cause *ie); + #endif /* E1AP_LIB_COMMON_H_ */ -- 2.26.2