diff --git a/openair2/E2AP/RAN_FUNCTION/CMakeLists.txt b/openair2/E2AP/RAN_FUNCTION/CMakeLists.txt index 3cb3d062f4..7feaf80bb1 100644 --- a/openair2/E2AP/RAN_FUNCTION/CMakeLists.txt +++ b/openair2/E2AP/RAN_FUNCTION/CMakeLists.txt @@ -6,6 +6,7 @@ add_library(e2_ran_func_cuup STATIC CUSTOMIZED/ran_func_pdcp.c # current implementation doesn't take split architecture into account, neither CU/DU nor CU-UP/CU-CP CUSTOMIZED/ran_func_tc.c # currently, not implemented; therefore, filling rnd data ../flexric/test/rnd/fill_rnd_data_tc.c + O-RAN/ran_e2sm_ue_id.c O-RAN/ran_func_kpm.c # this file should only contain PDCP-U/GTP; to be done in the future ../flexric/test/rnd/fill_rnd_data_kpm.c # this dependancy will be taken out once RAN Function Definition is implemented O-RAN/ran_func_rc.c # this file should only contain PDCP-U/GTP; to be done in the future @@ -23,6 +24,7 @@ add_library(e2_ran_func_du_cucp_cuup STATIC ../flexric/test/rnd/fill_rnd_data_e2_setup_req.c # this is not rnd data; it is used to fill E2 Node Component Configuration Addition List in E2 Setup Request message CUSTOMIZED/ran_func_gtp.c # current implementation doesn't take split architecture into account, neither CU/DU nor CU-UP/CU-CP CUSTOMIZED/ran_func_pdcp.c # current implementation doesn't take split architecture into account, neither CU/DU nor CU-UP/CU-CP + O-RAN/ran_e2sm_ue_id.c O-RAN/ran_func_kpm.c # this file should only contain RRC/PDCP-C; to be done in the future # when nr-softmodem is divided in separate executables ../flexric/test/rnd/fill_rnd_data_kpm.c # this dependancy will be taken out once RAN Function Definition is implemented diff --git a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_e2sm_ue_id.c b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_e2sm_ue_id.c new file mode 100644 index 0000000000..c3f6277f6f --- /dev/null +++ b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_e2sm_ue_id.c @@ -0,0 +1,143 @@ +/* + * 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 "ran_e2sm_ue_id.h" + +ue_id_e2sm_t fill_e2sm_gnb_ue_id_data(const gNB_RRC_UE_t *rrc_ue_context, __attribute__((unused))const uint32_t rrc_ue_id, __attribute__((unused))const ue_id_t cucp_ue_id) +{ + ue_id_e2sm_t ue_id = {0}; + + ue_id.type = GNB_UE_ID_E2SM; + + // 6.2.3.16 + // Mandatory + // AMF UE NGAP ID + ue_id.gnb.amf_ue_ngap_id = rrc_ue_context->amf_ue_ngap_id; + + // Mandatory + //GUAMI 6.2.3.17 + ue_id.gnb.guami.plmn_id = (e2sm_plmn_t) { + .mcc = rrc_ue_context->ue_guami.mcc, + .mnc = rrc_ue_context->ue_guami.mnc, + .mnc_digit_len = rrc_ue_context->ue_guami.mnc_len + }; + + ue_id.gnb.guami.amf_region_id = rrc_ue_context->ue_guami.amf_region_id; + ue_id.gnb.guami.amf_set_id = rrc_ue_context->ue_guami.amf_set_id; + ue_id.gnb.guami.amf_ptr = rrc_ue_context->ue_guami.amf_pointer; + + // RAN UE ID + // Optional + // 6.2.3.25 + // OCTET STRING (SIZE (8)) + // Defined in TS 38.473 (F1AP) + // clause 9.2.2.1 + // UE CONTEXT SETUP REQUEST + ue_id.gnb.ran_ue_id = calloc(1, sizeof(uint64_t)); + assert(ue_id.gnb.ran_ue_id != NULL); + *ue_id.gnb.ran_ue_id = rrc_ue_context->rrc_ue_id; + + return ue_id; +} + +ue_id_e2sm_t fill_e2sm_cu_ue_id_data(const gNB_RRC_UE_t *rrc_ue_context, const uint32_t rrc_ue_id, const ue_id_t cucp_ue_id) +{ + ue_id_e2sm_t ue_id = fill_e2sm_gnb_ue_id_data(rrc_ue_context, rrc_ue_id, cucp_ue_id); + + // gNB-CU UE F1AP ID List + // C-ifCUDUseparated + ue_id.gnb.gnb_cu_ue_f1ap_lst_len = 1; + ue_id.gnb.gnb_cu_ue_f1ap_lst = calloc(ue_id.gnb.gnb_cu_ue_f1ap_lst_len, sizeof(uint32_t)); + assert(ue_id.gnb.gnb_cu_ue_f1ap_lst != NULL && "Memory exhausted"); + ue_id.gnb.gnb_cu_ue_f1ap_lst[0] = rrc_ue_context->rrc_ue_id; + + return ue_id; +} + +ue_id_e2sm_t fill_e2sm_du_ue_id_data(__attribute__((unused))const gNB_RRC_UE_t *rrc_ue_context, const uint32_t rrc_ue_id, __attribute__((unused))const ue_id_t cucp_ue_id) +{ + ue_id_e2sm_t ue_id = {0}; + + ue_id.type = GNB_DU_UE_ID_E2SM; + + // 6.2.3.21 + // gNB CU UE F1AP + // Mandatory + ue_id.gnb_du.gnb_cu_ue_f1ap = rrc_ue_id; + + // 6.2.3.25 + // RAN UE ID + // Optional + ue_id.gnb_du.ran_ue_id = calloc(1, sizeof(uint64_t)); + assert(ue_id.gnb_du.ran_ue_id != NULL); + *ue_id.gnb_du.ran_ue_id = rrc_ue_id; + + return ue_id; +} + +ue_id_e2sm_t fill_e2sm_cucp_ue_id_data(const gNB_RRC_UE_t *rrc_ue_context, const uint32_t rrc_ue_id, const ue_id_t cucp_ue_id) +{ + ue_id_e2sm_t ue_id = fill_e2sm_gnb_ue_id_data(rrc_ue_context, rrc_ue_id, cucp_ue_id); + + //gNB-CU-CP UE E1AP ID List + //C-ifCPUPseparated + ue_id.gnb.gnb_cu_cp_ue_e1ap_lst_len = 1; + ue_id.gnb.gnb_cu_cp_ue_e1ap_lst = calloc(ue_id.gnb.gnb_cu_cp_ue_e1ap_lst_len, sizeof(uint32_t)); + assert(ue_id.gnb.gnb_cu_cp_ue_e1ap_lst != NULL && "Memory exhausted"); + ue_id.gnb.gnb_cu_cp_ue_e1ap_lst[0] = rrc_ue_context->rrc_ue_id; + + return ue_id; +} + +ue_id_e2sm_t fill_e2sm_cuup_ue_id_data(__attribute__((unused))const gNB_RRC_UE_t *rrc_ue_context, __attribute__((unused))const uint32_t rrc_ue_id, const ue_id_t cucp_ue_id) +{ + ue_id_e2sm_t ue_id = {0}; + + ue_id.type = GNB_CU_UP_UE_ID_E2SM; + + // 6.2.3.20 + // Mandatory + ue_id.gnb_cu_up.gnb_cu_cp_ue_e1ap = cucp_ue_id; // RAN UE NGAP ID = gNB UE NGAP ID = rrc_ue_id + + // 6.2.3.25 + // RAN UE ID + // Optional + ue_id.gnb_cu_up.ran_ue_id = calloc(1, sizeof(uint64_t)); + assert(ue_id.gnb_cu_up.ran_ue_id != NULL); + *ue_id.gnb_cu_up.ran_ue_id = cucp_ue_id; // RAN UE NGAP ID = gNB UE NGAP ID = rrc_ue_id + + return ue_id; +} + +get_ue_id fill_ue_id_data[END_NGRAN_NODE_TYPE] = +{ + NULL, + NULL, + fill_e2sm_gnb_ue_id_data, + NULL, + NULL, + fill_e2sm_cu_ue_id_data, + NULL, + fill_e2sm_du_ue_id_data, + NULL, + fill_e2sm_cucp_ue_id_data, + fill_e2sm_cuup_ue_id_data, +}; diff --git a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_e2sm_ue_id.h b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_e2sm_ue_id.h new file mode 100644 index 0000000000..769ff12673 --- /dev/null +++ b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_e2sm_ue_id.h @@ -0,0 +1,42 @@ +/* + * 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 + */ + +#ifndef RAN_E2SM_UE_ID_H +#define RAN_E2SM_UE_ID_H + +#include "openair2/E2AP/flexric/src/agent/../sm/sm_io.h" +#include "openair2/RRC/NR/rrc_gNB_UE_context.h" + +ue_id_e2sm_t fill_e2sm_gnb_ue_id_data(const gNB_RRC_UE_t *rrc_ue_context, const uint32_t rrc_ue_id, const ue_id_t cucp_ue_id); + +ue_id_e2sm_t fill_e2sm_cu_ue_id_data(const gNB_RRC_UE_t *rrc_ue_context, const uint32_t rrc_ue_id, const ue_id_t cucp_ue_id); + +ue_id_e2sm_t fill_e2sm_du_ue_id_data(const gNB_RRC_UE_t *rrc_ue_context, const uint32_t rrc_ue_id, const ue_id_t cucp_ue_id); + +ue_id_e2sm_t fill_e2sm_cucp_ue_id_data(const gNB_RRC_UE_t *rrc_ue_context, const uint32_t rrc_ue_id, const ue_id_t cucp_ue_id); + +ue_id_e2sm_t fill_e2sm_cuup_ue_id_data(const gNB_RRC_UE_t *rrc_ue_context, const uint32_t rrc_ue_id, const ue_id_t cucp_ue_id); + +typedef ue_id_e2sm_t (*get_ue_id)(const gNB_RRC_UE_t *rrc_ue_context, const uint32_t rrc_ue_id, const ue_id_t cucp_ue_id); + +extern get_ue_id fill_ue_id_data[END_NGRAN_NODE_TYPE]; + +#endif