/* * 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 // it seems that certain messages can be triggered before the ue has an AMF // UE NGAP ID (e.g., RRC setup). In that case, the AMF UE NGAP ID is set to // an invalid value. Below, check for this, and set 0 in that case (which // historically used to be in amf_ue_ngap_id). uint64_t auni = rrc_ue_context->amf_ue_ngap_id; ue_id.gnb.amf_ue_ngap_id = auni < (1LL << 40) ? auni : 0; // Mandatory //GUAMI 6.2.3.17 ue_id.gnb.guami.plmn_id = (e2sm_plmn_t){.mcc = rrc_ue_context->ue_guami.plmn.mcc, .mnc = rrc_ue_context->ue_guami.plmn.mnc, .mnc_digit_len = rrc_ue_context->ue_guami.plmn.mnc_digit_length}; 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, };