- all RAN code, CI code, configuration files, dockerfiles, in CSSL v1.0
- all deployment code (openshift, charts, ancillary files like shell
scripts), in MIT
- documentation in CC-BY-4.0
- exceptions might apply and are listed in NOTICE
- there is a new LICENSES folder with all licenses
- CONTRIBUTIONS.md has been updated accordingly
For automated changes based on OAI PL v1.1:
perl -i~ -0pe 's/\/\*.*Licensed to the OpenAirInterface.*openairinterface.org\n#?/\/*\n * SPDX-License-Identifier: LicenseRef-CSSL-1.0\n/s' **/*.{c,h,cpp}
perl -i~ -0pe 's/\/\*.*Licensed to the OpenAirInterface.*openairinterface.org\n#?/\/*\n * SPDX-License-Identifier: LicenseRef-CSSL-1.0\n/s' **/*.ts
perl -i~ -0pe 's/<!--.*Licensed to the OpenAirInterface.*openairinterface.org\n.*-->/<!-- SPDX-License-Identifier: LicenseRef-CSSL-1.0 -->/s' **/*.xml
The rest (cmake, files with missing license, cmake) manually.
130 lines
4.0 KiB
C
130 lines
4.0 KiB
C
/*
|
|
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
|
*/
|
|
|
|
#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,
|
|
};
|