/* * Copyright (C) 2019,2020 by Sukchan Lee * * This file is part of Open5GS. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "ngap-build.h" ogs_pkbuf_t *ngap_build_ng_setup_response(void) { int i, j; NGAP_NGAP_PDU_t pdu; NGAP_SuccessfulOutcome_t *successfulOutcome = NULL; NGAP_NGSetupResponse_t *NGSetupResponse = NULL; NGAP_NGSetupResponseIEs_t *ie = NULL; NGAP_AMFName_t *AMFName = NULL; NGAP_ServedGUAMIList_t *ServedGUAMIList = NULL; NGAP_RelativeAMFCapacity_t *RelativeAMFCapacity = NULL; NGAP_PLMNSupportList_t *PLMNSupportList = NULL; memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome; pdu.choice.successfulOutcome = CALLOC(1, sizeof(NGAP_SuccessfulOutcome_t)); successfulOutcome = pdu.choice.successfulOutcome; successfulOutcome->procedureCode = NGAP_ProcedureCode_id_NGSetup; successfulOutcome->criticality = NGAP_Criticality_reject; successfulOutcome->value.present = NGAP_SuccessfulOutcome__value_PR_NGSetupResponse; NGSetupResponse = &successfulOutcome->value.choice.NGSetupResponse; ie = CALLOC(1, sizeof(NGAP_NGSetupResponseIEs_t)); ASN_SEQUENCE_ADD(&NGSetupResponse->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_AMFName; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_NGSetupResponseIEs__value_PR_AMFName; AMFName = &ie->value.choice.AMFName; ie = CALLOC(1, sizeof(NGAP_NGSetupResponseIEs_t)); ASN_SEQUENCE_ADD(&NGSetupResponse->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_ServedGUAMIList; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_NGSetupResponseIEs__value_PR_ServedGUAMIList; ServedGUAMIList = &ie->value.choice.ServedGUAMIList; ie = CALLOC(1, sizeof(NGAP_NGSetupResponseIEs_t)); ASN_SEQUENCE_ADD(&NGSetupResponse->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_RelativeAMFCapacity; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_NGSetupResponseIEs__value_PR_RelativeAMFCapacity; RelativeAMFCapacity = &ie->value.choice.RelativeAMFCapacity; ie = CALLOC(1, sizeof(NGAP_NGSetupResponseIEs_t)); ASN_SEQUENCE_ADD(&NGSetupResponse->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_PLMNSupportList; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_NGSetupResponseIEs__value_PR_PLMNSupportList; PLMNSupportList = &ie->value.choice.PLMNSupportList; ogs_asn_buffer_to_OCTET_STRING((char*)amf_self()->amf_name, strlen(amf_self()->amf_name), AMFName); for (i = 0; i < amf_self()->num_of_served_guami; i++) { NGAP_ServedGUAMIItem_t *ServedGUAMIItem = NULL; NGAP_GUAMI_t *gUAMI = NULL; NGAP_PLMNIdentity_t *pLMNIdentity = NULL; NGAP_AMFRegionID_t *aMFRegionID = NULL; NGAP_AMFSetID_t *aMFSetID = NULL; NGAP_AMFPointer_t *aMFPointer = NULL; ServedGUAMIItem = (NGAP_ServedGUAMIItem_t *) CALLOC(1, sizeof(NGAP_ServedGUAMIItem_t)); gUAMI = &ServedGUAMIItem->gUAMI; pLMNIdentity = &gUAMI->pLMNIdentity; aMFRegionID = &gUAMI->aMFRegionID; aMFSetID = &gUAMI->aMFSetID; aMFPointer = &gUAMI->aMFPointer; ogs_asn_buffer_to_OCTET_STRING( &amf_self()->served_guami[i].plmn_id, OGS_PLMN_ID_LEN, pLMNIdentity); ogs_ngap_uint8_to_AMFRegionID( ogs_amf_region_id(&amf_self()->served_guami[i].amf_id), aMFRegionID); ogs_ngap_uint16_to_AMFSetID( ogs_amf_set_id(&amf_self()->served_guami[i].amf_id), aMFSetID); ogs_ngap_uint8_to_AMFPointer( ogs_amf_pointer(&amf_self()->served_guami[i].amf_id), aMFPointer); ASN_SEQUENCE_ADD(&ServedGUAMIList->list, ServedGUAMIItem); } *RelativeAMFCapacity = amf_self()->relative_capacity; for (i = 0; i < amf_self()->num_of_plmn_support; i++) { NGAP_PLMNSupportItem_t *NGAP_PLMNSupportItem = NULL; NGAP_PLMNIdentity_t *pLMNIdentity = NULL; NGAP_SliceSupportList_t *sliceSupportList = NULL; NGAP_PLMNSupportItem = (NGAP_PLMNSupportItem_t *) CALLOC(1, sizeof(NGAP_PLMNSupportItem_t)); pLMNIdentity = &NGAP_PLMNSupportItem->pLMNIdentity; sliceSupportList = &NGAP_PLMNSupportItem->sliceSupportList; ogs_asn_buffer_to_OCTET_STRING( &amf_self()->plmn_support[i].plmn_id, OGS_PLMN_ID_LEN, pLMNIdentity); for (j = 0; j < amf_self()->plmn_support[i].num_of_s_nssai; j++) { NGAP_SliceSupportItem_t *NGAP_SliceSupportItem = NULL; NGAP_S_NSSAI_t *s_NSSAI = NULL; NGAP_SST_t *sST = NULL; NGAP_SliceSupportItem = (NGAP_SliceSupportItem_t *) CALLOC(1, sizeof(NGAP_SliceSupportItem_t)); s_NSSAI = &NGAP_SliceSupportItem->s_NSSAI; sST = &s_NSSAI->sST; ogs_asn_uint8_to_OCTET_STRING( amf_self()->plmn_support[i].s_nssai[j].sst, sST); if (amf_self()->plmn_support[i].s_nssai[j].sd.v != OGS_S_NSSAI_NO_SD_VALUE) { s_NSSAI->sD = CALLOC(1, sizeof(NGAP_SD_t)); ogs_asn_uint24_to_OCTET_STRING( amf_self()->plmn_support[i].s_nssai[j].sd, s_NSSAI->sD); } ASN_SEQUENCE_ADD(&sliceSupportList->list, NGAP_SliceSupportItem); } ASN_SEQUENCE_ADD(&PLMNSupportList->list, NGAP_PLMNSupportItem); } return ogs_ngap_encode(&pdu); } ogs_pkbuf_t *ngap_build_ng_setup_failure( NGAP_Cause_PR group, long cause, long time_to_wait) { NGAP_NGAP_PDU_t pdu; NGAP_UnsuccessfulOutcome_t *unsuccessfulOutcome = NULL; NGAP_NGSetupFailure_t *NGSetupFailure = NULL; NGAP_NGSetupFailureIEs_t *ie = NULL; NGAP_Cause_t *Cause = NULL; NGAP_TimeToWait_t *TimeToWait = NULL; ogs_debug(" Group[%d] Cause[%d] TimeToWait[%ld]", group, (int)cause, time_to_wait); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_unsuccessfulOutcome; pdu.choice.unsuccessfulOutcome = CALLOC(1, sizeof(NGAP_UnsuccessfulOutcome_t)); unsuccessfulOutcome = pdu.choice.unsuccessfulOutcome; unsuccessfulOutcome->procedureCode = NGAP_ProcedureCode_id_NGSetup; unsuccessfulOutcome->criticality = NGAP_Criticality_reject; unsuccessfulOutcome->value.present = NGAP_UnsuccessfulOutcome__value_PR_NGSetupFailure; NGSetupFailure = &unsuccessfulOutcome->value.choice.NGSetupFailure; if (time_to_wait > -1) { ie = CALLOC(1, sizeof(NGAP_NGSetupFailureIEs_t)); ASN_SEQUENCE_ADD(&NGSetupFailure->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_TimeToWait; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_NGSetupFailureIEs__value_PR_TimeToWait; TimeToWait = &ie->value.choice.TimeToWait; } ie = CALLOC(1, sizeof(NGAP_NGSetupFailureIEs_t)); ASN_SEQUENCE_ADD(&NGSetupFailure->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_Cause; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_NGSetupFailureIEs__value_PR_Cause; Cause = &ie->value.choice.Cause; Cause->present = group; Cause->choice.radioNetwork = cause; if (TimeToWait) *TimeToWait = time_to_wait; return ogs_ngap_encode(&pdu); } ogs_pkbuf_t *ngap_build_downlink_nas_transport( ran_ue_t *ran_ue, ogs_pkbuf_t *gmmbuf) { NGAP_NGAP_PDU_t pdu; NGAP_InitiatingMessage_t *initiatingMessage = NULL; NGAP_DownlinkNASTransport_t *DownlinkNASTransport = NULL; NGAP_DownlinkNASTransport_IEs_t *ie = NULL; NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; NGAP_NAS_PDU_t *NAS_PDU = NULL; ogs_assert(gmmbuf); ogs_assert(ran_ue); ogs_debug("DownlinkNASTransport"); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage; pdu.choice.initiatingMessage = CALLOC(1, sizeof(NGAP_InitiatingMessage_t)); initiatingMessage = pdu.choice.initiatingMessage; initiatingMessage->procedureCode = NGAP_ProcedureCode_id_DownlinkNASTransport; initiatingMessage->criticality = NGAP_Criticality_ignore; initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_DownlinkNASTransport; DownlinkNASTransport = &initiatingMessage->value.choice.DownlinkNASTransport; ie = CALLOC(1, sizeof(NGAP_DownlinkNASTransport_IEs_t)); ASN_SEQUENCE_ADD(&DownlinkNASTransport->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_DownlinkNASTransport_IEs__value_PR_AMF_UE_NGAP_ID; AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_DownlinkNASTransport_IEs_t)); ASN_SEQUENCE_ADD(&DownlinkNASTransport->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_DownlinkNASTransport_IEs__value_PR_RAN_UE_NGAP_ID; RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_DownlinkNASTransport_IEs_t)); ASN_SEQUENCE_ADD(&DownlinkNASTransport->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_NAS_PDU; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_DownlinkNASTransport_IEs__value_PR_NAS_PDU; NAS_PDU = &ie->value.choice.NAS_PDU; ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; NAS_PDU->size = gmmbuf->len; NAS_PDU->buf = CALLOC(NAS_PDU->size, sizeof(uint8_t)); memcpy(NAS_PDU->buf, gmmbuf->data, NAS_PDU->size); ogs_pkbuf_free(gmmbuf); return ogs_ngap_encode(&pdu); } ogs_pkbuf_t *ngap_build_initial_context_setup_request( amf_ue_t *amf_ue, ogs_pkbuf_t *gmmbuf) { int i, j; ran_ue_t *ran_ue = NULL; amf_sess_t *sess = NULL; NGAP_NGAP_PDU_t pdu; NGAP_InitiatingMessage_t *initiatingMessage = NULL; NGAP_InitialContextSetupRequest_t *InitialContextSetupRequest = NULL; NGAP_InitialContextSetupRequestIEs_t *ie = NULL; NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; NGAP_UEAggregateMaximumBitRate_t *UEAggregateMaximumBitRate = NULL; NGAP_PDUSessionResourceSetupListCxtReq_t *PDUSessionList = NULL; NGAP_PDUSessionResourceSetupItemCxtReq_t *PDUSessionItem = NULL; NGAP_GUAMI_t *GUAMI = NULL; NGAP_AllowedNSSAI_t *AllowedNSSAI = NULL; NGAP_UESecurityCapabilities_t *UESecurityCapabilities = NULL; NGAP_SecurityKey_t *SecurityKey = NULL; NGAP_MaskedIMEISV_t *MaskedIMEISV = NULL; NGAP_NAS_PDU_t *NAS_PDU = NULL; ogs_assert(amf_ue); ran_ue = amf_ue->ran_ue; ogs_assert(ran_ue); ogs_debug("Initial context setup request"); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage; pdu.choice.initiatingMessage = CALLOC(1, sizeof(NGAP_InitiatingMessage_t)); initiatingMessage = pdu.choice.initiatingMessage; initiatingMessage->procedureCode = NGAP_ProcedureCode_id_InitialContextSetup; initiatingMessage->criticality = NGAP_Criticality_reject; initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_InitialContextSetupRequest; InitialContextSetupRequest = &initiatingMessage->value.choice.InitialContextSetupRequest; ie = CALLOC(1, sizeof(NGAP_InitialContextSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_InitialContextSetupRequestIEs__value_PR_AMF_UE_NGAP_ID; AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_InitialContextSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_InitialContextSetupRequestIEs__value_PR_RAN_UE_NGAP_ID; RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; if (amf_ue->subscribed_ue_ambr.downlink || amf_ue->subscribed_ue_ambr.uplink) { ie = CALLOC(1, sizeof(NGAP_InitialContextSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_UEAggregateMaximumBitRate; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_InitialContextSetupRequestIEs__value_PR_UEAggregateMaximumBitRate; UEAggregateMaximumBitRate = &ie->value.choice.UEAggregateMaximumBitRate; asn_uint642INTEGER( &UEAggregateMaximumBitRate->uEAggregateMaximumBitRateUL, amf_ue->subscribed_ue_ambr.uplink); asn_uint642INTEGER( &UEAggregateMaximumBitRate->uEAggregateMaximumBitRateDL, amf_ue->subscribed_ue_ambr.downlink); } ie = CALLOC(1, sizeof(NGAP_InitialContextSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_GUAMI; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_InitialContextSetupRequestIEs__value_PR_GUAMI; GUAMI = &ie->value.choice.GUAMI; ogs_list_for_each(&amf_ue->sess_list, sess) { OCTET_STRING_t *transfer = NULL; NGAP_S_NSSAI_t *s_NSSAI = NULL; NGAP_SST_t *sST = NULL; if (!sess->pdu_session_resource_setup_request_transfer) continue; if (!PDUSessionList) { ie = CALLOC(1, sizeof(NGAP_InitialContextSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceSetupListCxtReq; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_InitialContextSetupRequestIEs__value_PR_PDUSessionResourceSetupListCxtReq; PDUSessionList = &ie->value.choice.PDUSessionResourceSetupListCxtReq; } PDUSessionItem = CALLOC(1, sizeof(struct NGAP_PDUSessionResourceSetupItemCxtReq)); ASN_SEQUENCE_ADD(&PDUSessionList->list, PDUSessionItem); PDUSessionItem->pDUSessionID = sess->psi; s_NSSAI = &PDUSessionItem->s_NSSAI; sST = &s_NSSAI->sST; ogs_asn_uint8_to_OCTET_STRING(sess->s_nssai.sst, sST); if (sess->s_nssai.sd.v != OGS_S_NSSAI_NO_SD_VALUE) { s_NSSAI->sD = CALLOC(1, sizeof(NGAP_SD_t)); ogs_asn_uint24_to_OCTET_STRING(sess->s_nssai.sd, s_NSSAI->sD); } transfer = &PDUSessionItem->pDUSessionResourceSetupRequestTransfer; transfer->size = sess->pdu_session_resource_setup_request_transfer->len; transfer->buf = CALLOC(transfer->size, sizeof(uint8_t)); memcpy(transfer->buf, sess->pdu_session_resource_setup_request_transfer->data, transfer->size); } ie = CALLOC(1, sizeof(NGAP_InitialContextSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_AllowedNSSAI; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_InitialContextSetupRequestIEs__value_PR_AllowedNSSAI; AllowedNSSAI = &ie->value.choice.AllowedNSSAI; ie = CALLOC(1, sizeof(NGAP_InitialContextSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_UESecurityCapabilities; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_InitialContextSetupRequestIEs__value_PR_UESecurityCapabilities; UESecurityCapabilities = &ie->value.choice.UESecurityCapabilities; ie = CALLOC(1, sizeof(NGAP_InitialContextSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_SecurityKey; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_InitialContextSetupRequestIEs__value_PR_SecurityKey; SecurityKey = &ie->value.choice.SecurityKey; ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; ogs_assert(amf_ue->guami); ogs_asn_buffer_to_OCTET_STRING(&amf_ue->guami->plmn_id, OGS_PLMN_ID_LEN, &GUAMI->pLMNIdentity); ogs_ngap_uint8_to_AMFRegionID(ogs_amf_region_id(&amf_ue->guami->amf_id), &GUAMI->aMFRegionID); ogs_ngap_uint16_to_AMFSetID(ogs_amf_set_id(&amf_ue->guami->amf_id), &GUAMI->aMFSetID); ogs_ngap_uint8_to_AMFPointer(ogs_amf_pointer(&amf_ue->guami->amf_id), &GUAMI->aMFPointer); for (i = 0; i < amf_self()->num_of_plmn_support; i++) { if (memcmp(&amf_ue->tai.plmn_id, &amf_self()->plmn_support[i].plmn_id, OGS_PLMN_ID_LEN) != 0) continue; for (j = 0; j < amf_self()->plmn_support[i].num_of_s_nssai; j++) { NGAP_AllowedNSSAI_Item_t *NGAP_AllowedNSSAI_Item = NULL; NGAP_S_NSSAI_t *s_NSSAI = NULL; NGAP_SST_t *sST = NULL; NGAP_AllowedNSSAI_Item = (NGAP_AllowedNSSAI_Item_t *) CALLOC(1, sizeof(NGAP_AllowedNSSAI_Item_t)); s_NSSAI = &NGAP_AllowedNSSAI_Item->s_NSSAI; sST = &s_NSSAI->sST; ogs_asn_uint8_to_OCTET_STRING( amf_self()->plmn_support[i].s_nssai[j].sst, sST); if (amf_self()->plmn_support[i].s_nssai[j].sd.v != OGS_S_NSSAI_NO_SD_VALUE) { s_NSSAI->sD = CALLOC(1, sizeof(NGAP_SD_t)); ogs_asn_uint24_to_OCTET_STRING( amf_self()->plmn_support[i].s_nssai[j].sd, s_NSSAI->sD); } ASN_SEQUENCE_ADD(&AllowedNSSAI->list, NGAP_AllowedNSSAI_Item); } } UESecurityCapabilities->nRencryptionAlgorithms.size = 2; UESecurityCapabilities->nRencryptionAlgorithms.buf = CALLOC(UESecurityCapabilities-> nRencryptionAlgorithms.size, sizeof(uint8_t)); UESecurityCapabilities->nRencryptionAlgorithms.bits_unused = 0; UESecurityCapabilities->nRencryptionAlgorithms.buf[0] = (amf_ue->ue_security_capability.nea << 1); UESecurityCapabilities->nRintegrityProtectionAlgorithms.size = 2; UESecurityCapabilities->nRintegrityProtectionAlgorithms.buf = CALLOC(UESecurityCapabilities-> nRintegrityProtectionAlgorithms.size, sizeof(uint8_t)); UESecurityCapabilities->nRintegrityProtectionAlgorithms.bits_unused = 0; UESecurityCapabilities->nRintegrityProtectionAlgorithms.buf[0] = (amf_ue->ue_security_capability.nia << 1); UESecurityCapabilities->eUTRAencryptionAlgorithms.size = 2; UESecurityCapabilities->eUTRAencryptionAlgorithms.buf = CALLOC(UESecurityCapabilities-> eUTRAencryptionAlgorithms.size, sizeof(uint8_t)); UESecurityCapabilities->eUTRAencryptionAlgorithms.bits_unused = 0; UESecurityCapabilities->eUTRAencryptionAlgorithms.buf[0] = (amf_ue->ue_security_capability.eps_ea << 1); UESecurityCapabilities->eUTRAintegrityProtectionAlgorithms.size = 2; UESecurityCapabilities->eUTRAintegrityProtectionAlgorithms.buf = CALLOC(UESecurityCapabilities-> eUTRAintegrityProtectionAlgorithms.size, sizeof(uint8_t)); UESecurityCapabilities->eUTRAintegrityProtectionAlgorithms.bits_unused = 0; UESecurityCapabilities->eUTRAintegrityProtectionAlgorithms.buf[0] = (amf_ue->ue_security_capability.eps_ia << 1); SecurityKey->size = OGS_SHA256_DIGEST_SIZE; SecurityKey->buf = CALLOC(SecurityKey->size, sizeof(uint8_t)); SecurityKey->bits_unused = 0; memcpy(SecurityKey->buf, amf_ue->kgnb, SecurityKey->size); if (amf_ue->ueRadioCapability.buf && amf_ue->ueRadioCapability.size) { /* Set UeRadioCapability if exists */ NGAP_UERadioCapability_t *UERadioCapability = NULL; ie = CALLOC(1, sizeof(NGAP_InitialContextSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_UERadioCapability; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_InitialContextSetupRequestIEs__value_PR_UERadioCapability; UERadioCapability = &ie->value.choice.UERadioCapability; ogs_assert(UERadioCapability); ogs_asn_buffer_to_OCTET_STRING( amf_ue->ueRadioCapability.buf, amf_ue->ueRadioCapability.size, UERadioCapability); } if (amf_ue->masked_imeisv_len) { ie = CALLOC(1, sizeof(NGAP_InitialContextSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_MaskedIMEISV; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_InitialContextSetupRequestIEs__value_PR_MaskedIMEISV; MaskedIMEISV = &ie->value.choice.MaskedIMEISV; MaskedIMEISV->size = amf_ue->masked_imeisv_len; MaskedIMEISV->buf = CALLOC(MaskedIMEISV->size, sizeof(uint8_t)); MaskedIMEISV->bits_unused = 0; memcpy(MaskedIMEISV->buf, amf_ue->masked_imeisv, MaskedIMEISV->size); } if (gmmbuf) { ie = CALLOC(1, sizeof(NGAP_InitialContextSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_NAS_PDU; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_InitialContextSetupRequestIEs__value_PR_NAS_PDU; NAS_PDU = &ie->value.choice.NAS_PDU; NAS_PDU->size = gmmbuf->len; NAS_PDU->buf = CALLOC(NAS_PDU->size, sizeof(uint8_t)); memcpy(NAS_PDU->buf, gmmbuf->data, NAS_PDU->size); ogs_pkbuf_free(gmmbuf); } return ogs_ngap_encode(&pdu); } #if 0 ogs_pkbuf_t *ngap_build_ue_context_modification_request(amf_ue_t *amf_ue) { NGAP_NGAP_PDU_t pdu; NGAP_InitiatingMessage_t *initiatingMessage = NULL; NGAP_UEContextModificationRequest_t *UEContextModificationRequest = NULL; NGAP_UEContextModificationRequestIEs_t *ie = NULL; NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; NGAP_UESecurityCapabilities_t *UESecurityCapabilities = NULL; NGAP_SecurityKey_t *SecurityKey = NULL; NGAP_CSFallbackIndicator_t *CSFallbackIndicator = NULL; NGAP_LAI_t *LAI = NULL; ran_ue_t *ran_ue = NULL; ogs_assert(amf_ue); ran_ue = amf_ue->ran_ue; ogs_assert(ran_ue); ogs_debug("UE context modification request"); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage; pdu.choice.initiatingMessage = CALLOC(1, sizeof(NGAP_InitiatingMessage_t)); initiatingMessage = pdu.choice.initiatingMessage; initiatingMessage->procedureCode = NGAP_ProcedureCode_id_UEContextModification; initiatingMessage->criticality = NGAP_Criticality_reject; initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_UEContextModificationRequest; UEContextModificationRequest = &initiatingMessage->value.choice.UEContextModificationRequest; ie = CALLOC(1, sizeof(NGAP_UEContextModificationRequestIEs_t)); ASN_SEQUENCE_ADD(&UEContextModificationRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_UEContextModificationRequestIEs__value_PR_AMF_UE_NGAP_ID, AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_UEContextModificationRequestIEs_t)); ASN_SEQUENCE_ADD(&UEContextModificationRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_UEContextModificationRequestIEs__value_PR_RAN_UE_NGAP_ID, RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; *AMF_UE_NGAP_ID = ran_ue->amf_ue_ngap_id; *RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%d]", ran_ue->ran_ue_ngap_id, ran_ue->amf_ue_ngap_id); if (amf_ue->nas_eps.type == AMF_EPS_TYPE_EXTENDED_SERVICE_REQUEST && AMF_P_TMSI_IS_AVAILABLE(amf_ue)) { ie = CALLOC(1, sizeof(NGAP_UEContextModificationRequestIEs_t)); ASN_SEQUENCE_ADD(&UEContextModificationRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_CSFallbackIndicator; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_UEContextModificationRequestIEs__value_PR_CSFallbackIndicator; CSFallbackIndicator = &ie->value.choice.CSFallbackIndicator; ogs_assert(CSFallbackIndicator); *CSFallbackIndicator = NGAP_CSFallbackIndicator_cs_fallback_required; ie = CALLOC(1, sizeof(NGAP_UEContextModificationRequestIEs_t)); ASN_SEQUENCE_ADD(&UEContextModificationRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_RegisteredLAI; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_UEContextModificationRequestIEs__value_PR_LAI; LAI = &ie->value.choice.LAI; ogs_assert(LAI); ogs_asn_buffer_to_OCTET_STRING( &amf_ue->tai.plmn_id, sizeof(ogs_plmn_id_t), &LAI->pLMNidentity); ogs_assert(amf_ue->csmap); ogs_assert(amf_ue->p_tmsi); ogs_asn_uint16_to_OCTET_STRING(amf_ue->csmap->lai.lac, &LAI->lAC); } else { ie = CALLOC(1, sizeof(NGAP_UEContextModificationRequestIEs_t)); ASN_SEQUENCE_ADD(&UEContextModificationRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_UESecurityCapabilities; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_UEContextModificationRequestIEs__value_PR_UESecurityCapabilities; UESecurityCapabilities = &ie->value.choice.UESecurityCapabilities; UESecurityCapabilities->encryptionAlgorithms.size = 2; UESecurityCapabilities->encryptionAlgorithms.buf = CALLOC(UESecurityCapabilities->encryptionAlgorithms.size, sizeof(uint8_t)); UESecurityCapabilities->encryptionAlgorithms.bits_unused = 0; UESecurityCapabilities->encryptionAlgorithms.buf[0] = (amf_ue->ue_network_capability.eea << 1); UESecurityCapabilities->integrityProtectionAlgorithms.size = 2; UESecurityCapabilities->integrityProtectionAlgorithms.buf = CALLOC(UESecurityCapabilities-> integrityProtectionAlgorithms.size, sizeof(uint8_t)); UESecurityCapabilities->integrityProtectionAlgorithms.bits_unused = 0; UESecurityCapabilities->integrityProtectionAlgorithms.buf[0] = (amf_ue->ue_network_capability.eia << 1); ie = CALLOC(1, sizeof(NGAP_UEContextModificationRequestIEs_t)); ASN_SEQUENCE_ADD(&UEContextModificationRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_SecurityKey; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_UEContextModificationRequestIEs__value_PR_SecurityKey; SecurityKey = &ie->value.choice.SecurityKey; SecurityKey->size = OGS_SHA256_DIGEST_SIZE; SecurityKey->buf = CALLOC(SecurityKey->size, sizeof(uint8_t)); SecurityKey->bits_unused = 0; memcpy(SecurityKey->buf, amf_ue->kgnb, SecurityKey->size); } return ogs_ngap_encode(&pdu); } #endif ogs_pkbuf_t *ngap_build_ue_context_release_command( ran_ue_t *ran_ue, NGAP_Cause_PR group, long cause) { NGAP_NGAP_PDU_t pdu; NGAP_InitiatingMessage_t *initiatingMessage = NULL; NGAP_UEContextReleaseCommand_t *UEContextReleaseCommand = NULL; NGAP_UEContextReleaseCommand_IEs_t *ie = NULL; NGAP_UE_NGAP_IDs_t *UE_NGAP_IDs = NULL; NGAP_Cause_t *Cause = NULL; ogs_assert(ran_ue); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage; pdu.choice.initiatingMessage = CALLOC(1, sizeof(NGAP_InitiatingMessage_t)); initiatingMessage = pdu.choice.initiatingMessage; initiatingMessage->procedureCode = NGAP_ProcedureCode_id_UEContextRelease; initiatingMessage->criticality = NGAP_Criticality_reject; initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_UEContextReleaseCommand; UEContextReleaseCommand = &initiatingMessage->value.choice.UEContextReleaseCommand; ie = CALLOC(1, sizeof(NGAP_UEContextReleaseCommand_IEs_t)); ASN_SEQUENCE_ADD(&UEContextReleaseCommand->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_UE_NGAP_IDs; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_UEContextReleaseCommand_IEs__value_PR_UE_NGAP_IDs; UE_NGAP_IDs = &ie->value.choice.UE_NGAP_IDs; ie = CALLOC(1, sizeof(NGAP_UEContextReleaseCommand_IEs_t)); ASN_SEQUENCE_ADD(&UEContextReleaseCommand->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_Cause; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_UEContextReleaseCommand_IEs__value_PR_Cause; Cause = &ie->value.choice.Cause; if (ran_ue->ran_ue_ngap_id == INVALID_UE_NGAP_ID) { UE_NGAP_IDs->present = NGAP_UE_NGAP_IDs_PR_aMF_UE_NGAP_ID; asn_uint642INTEGER( &UE_NGAP_IDs->choice.aMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id); } else { UE_NGAP_IDs->present = NGAP_UE_NGAP_IDs_PR_uE_NGAP_ID_pair; UE_NGAP_IDs->choice.uE_NGAP_ID_pair = CALLOC(1, sizeof(NGAP_UE_NGAP_ID_pair_t)); asn_uint642INTEGER( &UE_NGAP_IDs->choice.uE_NGAP_ID_pair->aMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id); UE_NGAP_IDs->choice.uE_NGAP_ID_pair->rAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; } Cause->present = group; Cause->choice.radioNetwork = cause; return ogs_ngap_encode(&pdu); } ogs_pkbuf_t *ngap_build_pdu_session_resource_setup_request( amf_sess_t *sess, ogs_pkbuf_t *gmmbuf, ogs_pkbuf_t *n2smbuf) { amf_ue_t *amf_ue = NULL; ran_ue_t *ran_ue = NULL; NGAP_NGAP_PDU_t pdu; NGAP_InitiatingMessage_t *initiatingMessage = NULL; NGAP_PDUSessionResourceSetupRequest_t *PDUSessionResourceSetupRequest; NGAP_PDUSessionResourceSetupRequestIEs_t *ie = NULL; NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; NGAP_PDUSessionResourceSetupListSUReq_t *PDUSessionList = NULL; NGAP_PDUSessionResourceSetupItemSUReq_t *PDUSessionItem = NULL; NGAP_NAS_PDU_t *pDUSessionNAS_PDU = NULL; NGAP_S_NSSAI_t *s_NSSAI = NULL; NGAP_SST_t *sST = NULL; OCTET_STRING_t *transfer = NULL; ogs_assert(gmmbuf); ogs_assert(n2smbuf); ogs_assert(sess); amf_ue = sess->amf_ue; ogs_assert(amf_ue); ran_ue = amf_ue->ran_ue; ogs_assert(ran_ue); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage; pdu.choice.initiatingMessage = CALLOC(1, sizeof(NGAP_InitiatingMessage_t)); initiatingMessage = pdu.choice.initiatingMessage; initiatingMessage->procedureCode = NGAP_ProcedureCode_id_PDUSessionResourceSetup; initiatingMessage->criticality = NGAP_Criticality_reject; initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_PDUSessionResourceSetupRequest; PDUSessionResourceSetupRequest = &initiatingMessage->value.choice.PDUSessionResourceSetupRequest; ie = CALLOC(1, sizeof(NGAP_PDUSessionResourceSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&PDUSessionResourceSetupRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_PDUSessionResourceSetupRequestIEs__value_PR_AMF_UE_NGAP_ID; AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_PDUSessionResourceSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&PDUSessionResourceSetupRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_PDUSessionResourceSetupRequestIEs__value_PR_RAN_UE_NGAP_ID; RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_PDUSessionResourceSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&PDUSessionResourceSetupRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceSetupListSUReq; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_PDUSessionResourceSetupRequestIEs__value_PR_PDUSessionResourceSetupListSUReq; PDUSessionList = &ie->value.choice.PDUSessionResourceSetupListSUReq; ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; PDUSessionItem = CALLOC(1, sizeof(struct NGAP_PDUSessionResourceSetupItemSUReq)); ASN_SEQUENCE_ADD(&PDUSessionList->list, PDUSessionItem); PDUSessionItem->pDUSessionID = sess->psi; pDUSessionNAS_PDU = CALLOC(1, sizeof(NGAP_NAS_PDU_t)); PDUSessionItem->pDUSessionNAS_PDU = pDUSessionNAS_PDU; pDUSessionNAS_PDU->size = gmmbuf->len; pDUSessionNAS_PDU->buf = CALLOC(pDUSessionNAS_PDU->size, sizeof(uint8_t)); memcpy(pDUSessionNAS_PDU->buf, gmmbuf->data, pDUSessionNAS_PDU->size); ogs_pkbuf_free(gmmbuf); s_NSSAI = &PDUSessionItem->s_NSSAI; sST = &s_NSSAI->sST; ogs_asn_uint8_to_OCTET_STRING(sess->s_nssai.sst, sST); if (sess->s_nssai.sd.v != OGS_S_NSSAI_NO_SD_VALUE) { s_NSSAI->sD = CALLOC(1, sizeof(NGAP_SD_t)); ogs_asn_uint24_to_OCTET_STRING(sess->s_nssai.sd, s_NSSAI->sD); } transfer = &PDUSessionItem->pDUSessionResourceSetupRequestTransfer; transfer->size = n2smbuf->len; transfer->buf = CALLOC(transfer->size, sizeof(uint8_t)); memcpy(transfer->buf, n2smbuf->data, transfer->size); ogs_pkbuf_free(n2smbuf); return ogs_ngap_encode(&pdu); } ogs_pkbuf_t *ngap_build_pdu_session_resource_release_command( amf_sess_t *sess, ogs_pkbuf_t *gmmbuf, ogs_pkbuf_t *n2smbuf) { amf_ue_t *amf_ue = NULL; ran_ue_t *ran_ue = NULL; NGAP_NGAP_PDU_t pdu; NGAP_InitiatingMessage_t *initiatingMessage = NULL; NGAP_PDUSessionResourceReleaseCommand_t *PDUSessionResourceReleaseCommand; NGAP_PDUSessionResourceReleaseCommandIEs_t *ie = NULL; NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; NGAP_NAS_PDU_t *NAS_PDU = NULL; NGAP_PDUSessionResourceToReleaseListRelCmd_t *PDUSessionList = NULL; NGAP_PDUSessionResourceToReleaseItemRelCmd_t *PDUSessionItem = NULL; OCTET_STRING_t *transfer = NULL; ogs_assert(gmmbuf); ogs_assert(n2smbuf); ogs_assert(sess); amf_ue = sess->amf_ue; ogs_assert(amf_ue); ran_ue = amf_ue->ran_ue; ogs_assert(ran_ue); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage; pdu.choice.initiatingMessage = CALLOC(1, sizeof(NGAP_InitiatingMessage_t)); initiatingMessage = pdu.choice.initiatingMessage; initiatingMessage->procedureCode = NGAP_ProcedureCode_id_PDUSessionResourceRelease; initiatingMessage->criticality = NGAP_Criticality_reject; initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_PDUSessionResourceReleaseCommand; PDUSessionResourceReleaseCommand = &initiatingMessage->value.choice.PDUSessionResourceReleaseCommand; ie = CALLOC(1, sizeof(NGAP_PDUSessionResourceReleaseCommandIEs_t)); ASN_SEQUENCE_ADD(&PDUSessionResourceReleaseCommand->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_PDUSessionResourceReleaseCommandIEs__value_PR_AMF_UE_NGAP_ID; AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_PDUSessionResourceReleaseCommandIEs_t)); ASN_SEQUENCE_ADD(&PDUSessionResourceReleaseCommand->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_PDUSessionResourceReleaseCommandIEs__value_PR_RAN_UE_NGAP_ID; RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_PDUSessionResourceReleaseCommandIEs_t)); ASN_SEQUENCE_ADD(&PDUSessionResourceReleaseCommand->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_NAS_PDU; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_PDUSessionResourceReleaseCommandIEs__value_PR_NAS_PDU; NAS_PDU = &ie->value.choice.NAS_PDU; ie = CALLOC(1, sizeof(NGAP_PDUSessionResourceReleaseCommandIEs_t)); ASN_SEQUENCE_ADD(&PDUSessionResourceReleaseCommand->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceToReleaseListRelCmd; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_PDUSessionResourceReleaseCommandIEs__value_PR_PDUSessionResourceToReleaseListRelCmd; PDUSessionList = &ie->value.choice.PDUSessionResourceToReleaseListRelCmd; ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); asn_uint642INTEGER(AMF_UE_NGAP_ID, ran_ue->amf_ue_ngap_id); *RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; NAS_PDU->size = gmmbuf->len; NAS_PDU->buf = CALLOC(NAS_PDU->size, sizeof(uint8_t)); memcpy(NAS_PDU->buf, gmmbuf->data, NAS_PDU->size); ogs_pkbuf_free(gmmbuf); PDUSessionItem = CALLOC(1, sizeof(struct NGAP_PDUSessionResourceToReleaseItemRelCmd)); ASN_SEQUENCE_ADD(&PDUSessionList->list, PDUSessionItem); PDUSessionItem->pDUSessionID = sess->psi; transfer = &PDUSessionItem->pDUSessionResourceReleaseCommandTransfer; transfer->size = n2smbuf->len; transfer->buf = CALLOC(transfer->size, sizeof(uint8_t)); memcpy(transfer->buf, n2smbuf->data, transfer->size); ogs_pkbuf_free(n2smbuf); return ogs_ngap_encode(&pdu); } #if 0 ogs_pkbuf_t *ngap_build_paging( amf_ue_t *amf_ue, NGAP_CNDomain_t cn_domain) { NGAP_NGAP_PDU_t pdu; NGAP_InitiatingMessage_t *initiatingMessage = NULL; NGAP_Paging_t *Paging = NULL; NGAP_PagingIEs_t *ie = NULL; NGAP_UEIdentityIndexValue_t *UEIdentityIndexValue = NULL; NGAP_UEPagingID_t *UEPagingID = NULL; NGAP_CNDomain_t *CNDomain = NULL; NGAP_TAIList_t *TAIList = NULL; NGAP_TAIItemIEs_t *item = NULL; NGAP_TAIItem_t *tai_item = NULL; uint16_t index_value; uint64_t ue_imsi_value = 0; int i = 0; ogs_assert(amf_ue); ogs_debug("Paging"); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage; pdu.choice.initiatingMessage = CALLOC(1, sizeof(NGAP_InitiatingMessage_t)); initiatingMessage = pdu.choice.initiatingMessage; initiatingMessage->procedureCode = NGAP_ProcedureCode_id_Paging; initiatingMessage->criticality = NGAP_Criticality_ignore; initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_Paging; Paging = &initiatingMessage->value.choice.Paging; ie = CALLOC(1, sizeof(NGAP_PagingIEs_t)); ASN_SEQUENCE_ADD(&Paging->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_UEIdentityIndexValue; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_PagingIEs__value_PR_UEIdentityIndexValue; UEIdentityIndexValue = &ie->value.choice.UEIdentityIndexValue; ie = CALLOC(1, sizeof(NGAP_PagingIEs_t)); ASN_SEQUENCE_ADD(&Paging->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_UEPagingID; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_PagingIEs__value_PR_UEPagingID; UEPagingID = &ie->value.choice.UEPagingID; ie = CALLOC(1, sizeof(NGAP_PagingIEs_t)); ASN_SEQUENCE_ADD(&Paging->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_CNDomain; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_PagingIEs__value_PR_CNDomain; CNDomain = &ie->value.choice.CNDomain; ie = CALLOC(1, sizeof(NGAP_PagingIEs_t)); ASN_SEQUENCE_ADD(&Paging->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_TAIList; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_PagingIEs__value_PR_TAIList; TAIList = &ie->value.choice.TAIList; /* Set UE Identity Index value : IMSI mod 4096 */ UEIdentityIndexValue->size = 2; UEIdentityIndexValue->buf = CALLOC(UEIdentityIndexValue->size, sizeof(uint8_t)); /* Conver string to value */ for (i = 0; i < strlen(amf_ue->imsi_bcd); i++) { ue_imsi_value = ue_imsi_value*10 + (amf_ue->imsi_bcd[i] - '0'); } /* index(10bit) = ue_imsi_value mod 1024 */ index_value = ue_imsi_value % 1024; UEIdentityIndexValue->buf[0] = index_value >> 2; UEIdentityIndexValue->buf[1] = (index_value & 0x3f) << 6; UEIdentityIndexValue->bits_unused = 6; /* Set Paging Identity */ UEPagingID->present = NGAP_UEPagingID_PR_s_TMSI; UEPagingID->choice.s_TMSI = CALLOC(1, sizeof(NGAP_S_TMSI_t)); ogs_asn_uint8_to_OCTET_STRING(amf_ue->guti.amf_code, &UEPagingID->choice.s_TMSI->mMEC); ogs_asn_uint32_to_OCTET_STRING(amf_ue->guti.m_tmsi, &UEPagingID->choice.s_TMSI->m_TMSI); ogs_debug(" AMF_CODE[%d] M_TMSI[0x%x]", amf_ue->guti.amf_code, amf_ue->guti.m_tmsi); ogs_debug(" CN_DOMAIN[%s]", cn_domain == NGAP_CNDomain_cs ? "CS" : cn_domain == NGAP_CNDomain_ps ? "PS" : "Unknown"); *CNDomain = cn_domain; item = CALLOC(1, sizeof(NGAP_TAIItemIEs_t)); ASN_SEQUENCE_ADD(&TAIList->list, item); item->id = NGAP_ProtocolIE_ID_id_TAIItem; item->criticality = NGAP_Criticality_ignore; item->value.present = NGAP_TAIItemIEs__value_PR_TAIItem; tai_item = &item->value.choice.TAIItem; ogs_asn_buffer_to_OCTET_STRING(&amf_ue->tai.plmn_id, sizeof(ogs_plmn_id_t), &tai_item->tAI.pLMNidentity); ogs_asn_uint16_to_OCTET_STRING(amf_ue->tai.tac, &tai_item->tAI.tAC); return ogs_ngap_encode(&pdu); } ogs_pkbuf_t *ngap_build_amf_configuration_transfer( NGAP_SONConfigurationTransfer_t *son_configuration_transfer) { int rv; NGAP_NGAP_PDU_t pdu; NGAP_InitiatingMessage_t *initiatingMessage = NULL; NGAP_AMFConfigurationTransfer_t *AMFConfigurationTransfer = NULL; NGAP_AMFConfigurationTransferIEs_t *ie = NULL; NGAP_SONConfigurationTransfer_t *SONConfigurationTransfer = NULL; ogs_assert(son_configuration_transfer); ogs_debug("AMF Configuration Transfer"); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage; pdu.choice.initiatingMessage = CALLOC(1, sizeof(NGAP_InitiatingMessage_t)); initiatingMessage = pdu.choice.initiatingMessage; initiatingMessage->procedureCode = NGAP_ProcedureCode_id_AMFConfigurationTransfer; initiatingMessage->criticality = NGAP_Criticality_ignore; initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_AMFConfigurationTransfer; AMFConfigurationTransfer = &initiatingMessage->value.choice.AMFConfigurationTransfer; ie = CALLOC(1, sizeof(NGAP_AMFConfigurationTransferIEs_t)); ASN_SEQUENCE_ADD(&AMFConfigurationTransfer->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_SONConfigurationTransferMCT; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_AMFConfigurationTransferIEs__value_PR_SONConfigurationTransfer; SONConfigurationTransfer = &ie->value.choice.SONConfigurationTransfer; rv = ogs_asn_copy_ie(&asn_DEF_NGAP_SONConfigurationTransfer, son_configuration_transfer, SONConfigurationTransfer); ogs_assert(rv == OGS_OK); return ogs_ngap_encode(&pdu); } ogs_pkbuf_t *ngap_build_path_switch_ack(amf_ue_t *amf_ue) { NGAP_NGAP_PDU_t pdu; NGAP_SuccessfulOutcome_t *successfulOutcome = NULL; NGAP_PathSwitchRequestAcknowledge_t *PathSwitchRequestAcknowledge = NULL; NGAP_PathSwitchRequestAcknowledgeIEs_t *ie = NULL; NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; NGAP_SecurityContext_t *SecurityContext = NULL; ran_ue_t *ran_ue = NULL; ogs_assert(amf_ue); ran_ue = amf_ue->ran_ue; ogs_assert(ran_ue); ogs_debug("Path switch acknowledge"); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome; pdu.choice.successfulOutcome = CALLOC(1, sizeof(NGAP_SuccessfulOutcome_t)); successfulOutcome = pdu.choice.successfulOutcome; successfulOutcome->procedureCode = NGAP_ProcedureCode_id_PathSwitchRequest; successfulOutcome->criticality = NGAP_Criticality_reject; successfulOutcome->value.present = NGAP_SuccessfulOutcome__value_PR_PathSwitchRequestAcknowledge; PathSwitchRequestAcknowledge = &successfulOutcome->value.choice.PathSwitchRequestAcknowledge; ie = CALLOC(1, sizeof(NGAP_PathSwitchRequestAcknowledgeIEs_t)); ASN_SEQUENCE_ADD(&PathSwitchRequestAcknowledge->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_PathSwitchRequestAcknowledgeIEs__value_PR_AMF_UE_NGAP_ID; AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_PathSwitchRequestAcknowledgeIEs_t)); ASN_SEQUENCE_ADD(&PathSwitchRequestAcknowledge->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_PathSwitchRequestAcknowledgeIEs__value_PR_RAN_UE_NGAP_ID; RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_PathSwitchRequestAcknowledgeIEs_t)); ASN_SEQUENCE_ADD(&PathSwitchRequestAcknowledge->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_SecurityContext; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_PathSwitchRequestAcknowledgeIEs__value_PR_SecurityContext; SecurityContext = &ie->value.choice.SecurityContext; ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%d]", ran_ue->ran_ue_ngap_id, ran_ue->amf_ue_ngap_id); *AMF_UE_NGAP_ID = ran_ue->amf_ue_ngap_id; *RAN_UE_NGAP_ID = ran_ue->ran_ue_ngap_id; SecurityContext->nextHopChainingCount = amf_ue->nhcc; SecurityContext->nextHopParameter.size = OGS_SHA256_DIGEST_SIZE; SecurityContext->nextHopParameter.buf = CALLOC(SecurityContext->nextHopParameter.size, sizeof(uint8_t)); SecurityContext->nextHopParameter.bits_unused = 0; memcpy(SecurityContext->nextHopParameter.buf, amf_ue->nh, SecurityContext->nextHopParameter.size); return ogs_ngap_encode(&pdu); } ogs_pkbuf_t *ngap_build_path_switch_failure( uint32_t ran_ue_ngap_id, uint32_t amf_ue_ngap_id, NGAP_Cause_PR group, long cause) { NGAP_NGAP_PDU_t pdu; NGAP_UnsuccessfulOutcome_t *unsuccessfulOutcome = NULL; NGAP_PathSwitchRequestFailure_t *PathSwitchRequestFailure = NULL; NGAP_PathSwitchRequestFailureIEs_t *ie = NULL; NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; NGAP_Cause_t *Cause = NULL; ogs_debug("Path switch failure"); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_unsuccessfulOutcome; pdu.choice.unsuccessfulOutcome = CALLOC(1, sizeof(NGAP_UnsuccessfulOutcome_t)); unsuccessfulOutcome = pdu.choice.unsuccessfulOutcome; unsuccessfulOutcome->procedureCode = NGAP_ProcedureCode_id_PathSwitchRequest; unsuccessfulOutcome->criticality = NGAP_Criticality_reject; unsuccessfulOutcome->value.present = NGAP_UnsuccessfulOutcome__value_PR_PathSwitchRequestFailure; PathSwitchRequestFailure = &unsuccessfulOutcome->value.choice.PathSwitchRequestFailure; ie = CALLOC(1, sizeof(NGAP_PathSwitchRequestFailureIEs_t)); ASN_SEQUENCE_ADD(&PathSwitchRequestFailure->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_PathSwitchRequestFailureIEs__value_PR_AMF_UE_NGAP_ID; AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_PathSwitchRequestFailureIEs_t)); ASN_SEQUENCE_ADD(&PathSwitchRequestFailure->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_PathSwitchRequestFailureIEs__value_PR_RAN_UE_NGAP_ID; RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_PathSwitchRequestFailureIEs_t)); ASN_SEQUENCE_ADD(&PathSwitchRequestFailure->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_Cause; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_PathSwitchRequestFailureIEs__value_PR_Cause; Cause = &ie->value.choice.Cause; ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%d]", ran_ue_ngap_id, amf_ue_ngap_id); ogs_debug(" Group[%d] Cause[%d]", group, (int)cause); *AMF_UE_NGAP_ID = amf_ue_ngap_id; *RAN_UE_NGAP_ID = ran_ue_ngap_id; Cause->present = group; Cause->choice.radioNetwork = cause; return ogs_ngap_encode(&pdu); } ogs_pkbuf_t *ngap_build_handover_command(ran_ue_t *source_ue) { int rv; NGAP_NGAP_PDU_t pdu; NGAP_SuccessfulOutcome_t *successfulOutcome = NULL; NGAP_HandoverCommand_t *HandoverCommand = NULL; NGAP_HandoverCommandIEs_t *ie = NULL; NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; NGAP_HandoverType_t *HandoverType = NULL; NGAP_E_RABSubjecttoDataForwardingList_t *E_RABSubjecttoDataForwardingList = NULL; NGAP_Target_ToSource_TransparentContainer_t *Target_ToSource_TransparentContainer = NULL; amf_ue_t *amf_ue = NULL; amf_sess_t *sess = NULL; amf_bearer_t *bearer = NULL; ogs_assert(source_ue); amf_ue = source_ue->amf_ue; ogs_debug("Handover command"); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome; pdu.choice.successfulOutcome = CALLOC(1, sizeof(NGAP_SuccessfulOutcome_t)); successfulOutcome = pdu.choice.successfulOutcome; successfulOutcome->procedureCode = NGAP_ProcedureCode_id_HandoverPreparation; successfulOutcome->criticality = NGAP_Criticality_reject; successfulOutcome->value.present = NGAP_SuccessfulOutcome__value_PR_HandoverCommand; HandoverCommand = &successfulOutcome->value.choice.HandoverCommand; ogs_assert(HandoverCommand); ie = CALLOC(1, sizeof(NGAP_HandoverCommandIEs_t)); ASN_SEQUENCE_ADD(&HandoverCommand->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_HandoverCommandIEs__value_PR_AMF_UE_NGAP_ID; AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_HandoverCommandIEs_t)); ASN_SEQUENCE_ADD(&HandoverCommand->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_HandoverCommandIEs__value_PR_RAN_UE_NGAP_ID; RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_HandoverCommandIEs_t)); ASN_SEQUENCE_ADD(&HandoverCommand->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_HandoverType; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_HandoverCommandIEs__value_PR_HandoverType; HandoverType = &ie->value.choice.HandoverType; *AMF_UE_NGAP_ID = source_ue->amf_ue_ngap_id; *RAN_UE_NGAP_ID = source_ue->ran_ue_ngap_id; *HandoverType = source_ue->handover_type; ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%d]", source_ue->ran_ue_ngap_id, source_ue->amf_ue_ngap_id); sess = amf_sess_first(amf_ue); while (sess) { bearer = amf_bearer_first(sess); while (bearer) { NGAP_E_RABDataForwardingItem_t *e_rab = NULL; if (AMF_HAVE_SGW_DL_INDIRECT_TUNNEL(bearer) || AMF_HAVE_SGW_UL_INDIRECT_TUNNEL(bearer)) { NGAP_E_RABDataForwardingItemIEs_t *item = NULL; if (E_RABSubjecttoDataForwardingList == NULL) { ie = CALLOC(1, sizeof(NGAP_HandoverCommandIEs_t)); ogs_assert(ie); ASN_SEQUENCE_ADD(&HandoverCommand->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_E_RABSubjecttoDataForwardingList; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_HandoverCommandIEs__value_PR_E_RABSubjecttoDataForwardingList; E_RABSubjecttoDataForwardingList = &ie->value.choice.E_RABSubjecttoDataForwardingList; } ogs_assert(E_RABSubjecttoDataForwardingList); item = CALLOC( 1, sizeof(NGAP_E_RABDataForwardingItemIEs_t)); ogs_assert(item); ASN_SEQUENCE_ADD(&E_RABSubjecttoDataForwardingList->list, item); item->id = NGAP_ProtocolIE_ID_id_E_RABDataForwardingItem; item->criticality = NGAP_Criticality_ignore; item->value.present = NGAP_E_RABDataForwardingItemIEs__value_PR_E_RABDataForwardingItem; e_rab = &item->value.choice.E_RABDataForwardingItem; ogs_assert(e_rab); e_rab->e_RAB_ID = bearer->ebi; } if (AMF_HAVE_SGW_DL_INDIRECT_TUNNEL(bearer)) { ogs_assert(e_rab); e_rab->dL_transportLayerAddress = (NGAP_TransportLayerAddress_t *) CALLOC(1, sizeof(NGAP_TransportLayerAddress_t)); rv = ogs_asn_ip_to_BIT_STRING( &bearer->sgw_dl_ip, e_rab->dL_transportLayerAddress); ogs_assert(rv == OGS_OK); e_rab->dL_gTP_TEID = (NGAP_GTP_TEID_t *) CALLOC(1, sizeof(NGAP_GTP_TEID_t)); ogs_asn_uint32_to_OCTET_STRING( bearer->sgw_dl_teid, e_rab->dL_gTP_TEID); ogs_debug(" SGW-DL-TEID[%d]", bearer->sgw_dl_teid); } if (AMF_HAVE_SGW_UL_INDIRECT_TUNNEL(bearer)) { ogs_assert(e_rab); e_rab->uL_TransportLayerAddress = (NGAP_TransportLayerAddress_t *) CALLOC(1, sizeof(NGAP_TransportLayerAddress_t)); rv = ogs_asn_ip_to_BIT_STRING( &bearer->sgw_ul_ip, e_rab->uL_TransportLayerAddress); ogs_assert(rv == OGS_OK); e_rab->uL_GTP_TEID = (NGAP_GTP_TEID_t *) CALLOC(1, sizeof(NGAP_GTP_TEID_t)); ogs_asn_uint32_to_OCTET_STRING( bearer->sgw_ul_teid, e_rab->uL_GTP_TEID); ogs_debug(" SGW-UL-TEID[%d]", bearer->sgw_dl_teid); } bearer = amf_bearer_next(bearer); } sess = amf_sess_next(sess); } ie = CALLOC(1, sizeof(NGAP_HandoverCommandIEs_t)); ASN_SEQUENCE_ADD(&HandoverCommand->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_Target_ToSource_TransparentContainer; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_HandoverCommandIEs__value_PR_Target_ToSource_TransparentContainer; Target_ToSource_TransparentContainer = &ie->value.choice.Target_ToSource_TransparentContainer; ogs_asn_buffer_to_OCTET_STRING(amf_ue->container.buf, amf_ue->container.size, Target_ToSource_TransparentContainer); return ogs_ngap_encode(&pdu); } ogs_pkbuf_t *ngap_build_handover_preparation_failure( ran_ue_t *source_ue, NGAP_Cause_t *cause) { NGAP_NGAP_PDU_t pdu; NGAP_UnsuccessfulOutcome_t *unsuccessfulOutcome = NULL; NGAP_HandoverPreparationFailure_t *HandoverPreparationFailure = NULL; NGAP_HandoverPreparationFailureIEs_t *ie = NULL; NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; NGAP_Cause_t *Cause = NULL; ogs_assert(source_ue); ogs_assert(cause); ogs_debug("Handover preparation failure"); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_unsuccessfulOutcome; pdu.choice.unsuccessfulOutcome = CALLOC(1, sizeof(NGAP_UnsuccessfulOutcome_t)); unsuccessfulOutcome = pdu.choice.unsuccessfulOutcome; unsuccessfulOutcome->procedureCode = NGAP_ProcedureCode_id_HandoverPreparation; unsuccessfulOutcome->criticality = NGAP_Criticality_reject; unsuccessfulOutcome->value.present = NGAP_UnsuccessfulOutcome__value_PR_HandoverPreparationFailure; HandoverPreparationFailure = &unsuccessfulOutcome->value.choice.HandoverPreparationFailure; ie = CALLOC(1, sizeof(NGAP_HandoverPreparationFailureIEs_t)); ASN_SEQUENCE_ADD(&HandoverPreparationFailure->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_HandoverPreparationFailureIEs__value_PR_AMF_UE_NGAP_ID; AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_HandoverPreparationFailureIEs_t)); ASN_SEQUENCE_ADD(&HandoverPreparationFailure->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_HandoverPreparationFailureIEs__value_PR_RAN_UE_NGAP_ID; RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_HandoverPreparationFailureIEs_t)); ASN_SEQUENCE_ADD(&HandoverPreparationFailure->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_Cause; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_HandoverPreparationFailureIEs__value_PR_Cause; Cause = &ie->value.choice.Cause; ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%d]", source_ue->ran_ue_ngap_id, source_ue->amf_ue_ngap_id); ogs_debug(" Group[%d] Cause[%d]", cause->present, (int)cause->choice.radioNetwork); *AMF_UE_NGAP_ID = source_ue->amf_ue_ngap_id; *RAN_UE_NGAP_ID = source_ue->ran_ue_ngap_id; Cause->present = cause->present; Cause->choice.radioNetwork = cause->choice.radioNetwork; return ogs_ngap_encode(&pdu); } ogs_pkbuf_t *ngap_build_handover_request( amf_ue_t *amf_ue, ran_ue_t *target_ue, NGAP_RAN_UE_NGAP_ID_t *ran_ue_ngap_id, NGAP_AMF_UE_NGAP_ID_t *amf_ue_ngap_id, NGAP_HandoverType_t *handovertype, NGAP_Cause_t *cause, NGAP_SourceToTarget_TransparentContainer_t *source_totarget_transparentContainer) { int rv; NGAP_NGAP_PDU_t pdu; NGAP_InitiatingMessage_t *initiatingMessage = NULL; NGAP_HandoverRequest_t *HandoverRequest = NULL; NGAP_HandoverRequestIEs_t *ie = NULL; NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; NGAP_HandoverType_t *HandoverType = NULL; NGAP_Cause_t *Cause = NULL; NGAP_UEAggregateMaximumBitrate_t *UEAggregateMaximumBitrate = NULL; NGAP_E_RABToBeSetupListHOReq_t *E_RABToBeSetupListHOReq = NULL; NGAP_Source_ToTarget_TransparentContainer_t *Source_ToTarget_TransparentContainer = NULL; NGAP_UESecurityCapabilities_t *UESecurityCapabilities = NULL; NGAP_SecurityContext_t *SecurityContext = NULL; amf_sess_t *sess = NULL; amf_bearer_t *bearer = NULL; ogs_diam_s6a_subscription_data_t *subscription_data = NULL; ogs_assert(handovertype); ogs_assert(cause); ogs_assert(source_totarget_transparentContainer); ogs_assert(target_ue); ogs_assert(amf_ue); subscription_data = &amf_ue->subscription_data; ogs_assert(subscription_data); ogs_debug("Handover request"); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage; pdu.choice.initiatingMessage = CALLOC(1, sizeof(NGAP_InitiatingMessage_t)); initiatingMessage = pdu.choice.initiatingMessage; initiatingMessage->procedureCode = NGAP_ProcedureCode_id_HandoverResourceAllocation; initiatingMessage->criticality = NGAP_Criticality_reject; initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_HandoverRequest; HandoverRequest = &initiatingMessage->value.choice.HandoverRequest; ie = CALLOC(1, sizeof(NGAP_HandoverRequestIEs_t)); ASN_SEQUENCE_ADD(&HandoverRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_HandoverRequestIEs__value_PR_AMF_UE_NGAP_ID; AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_HandoverRequestIEs_t)); ASN_SEQUENCE_ADD(&HandoverRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_HandoverType; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_HandoverRequestIEs__value_PR_HandoverType; HandoverType = &ie->value.choice.HandoverType; ie = CALLOC(1, sizeof(NGAP_HandoverRequestIEs_t)); ASN_SEQUENCE_ADD(&HandoverRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_Cause; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_HandoverRequestIEs__value_PR_Cause; Cause = &ie->value.choice.Cause; ie = CALLOC(1, sizeof(NGAP_HandoverRequestIEs_t)); ASN_SEQUENCE_ADD(&HandoverRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_uEaggregateMaximumBitrate; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_HandoverRequestIEs__value_PR_UEAggregateMaximumBitrate; UEAggregateMaximumBitrate = &ie->value.choice.UEAggregateMaximumBitrate; ie = CALLOC(1, sizeof(NGAP_HandoverRequestIEs_t)); ASN_SEQUENCE_ADD(&HandoverRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_E_RABToBeSetupListHOReq; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_HandoverRequestIEs__value_PR_E_RABToBeSetupListHOReq; E_RABToBeSetupListHOReq = &ie->value.choice.E_RABToBeSetupListHOReq; ie = CALLOC(1, sizeof(NGAP_HandoverRequestIEs_t)); ASN_SEQUENCE_ADD(&HandoverRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_Source_ToTarget_TransparentContainer; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_HandoverRequestIEs__value_PR_Source_ToTarget_TransparentContainer; Source_ToTarget_TransparentContainer = &ie->value.choice.Source_ToTarget_TransparentContainer; ie = CALLOC(1, sizeof(NGAP_HandoverRequestIEs_t)); ASN_SEQUENCE_ADD(&HandoverRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_UESecurityCapabilities; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_HandoverRequestIEs__value_PR_UESecurityCapabilities; UESecurityCapabilities = &ie->value.choice.UESecurityCapabilities; ie = CALLOC(1, sizeof(NGAP_HandoverRequestIEs_t)); ASN_SEQUENCE_ADD(&HandoverRequest->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_SecurityContext; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_HandoverRequestIEs__value_PR_SecurityContext; SecurityContext = &ie->value.choice.SecurityContext; *AMF_UE_NGAP_ID = target_ue->amf_ue_ngap_id; *HandoverType = *handovertype; Cause->present = cause->present; Cause->choice.radioNetwork = cause->choice.radioNetwork; asn_uint642INTEGER( &UEAggregateMaximumBitrate->uEaggregateMaximumBitRateUL, subscription_data->ambr.uplink); asn_uint642INTEGER( &UEAggregateMaximumBitrate->uEaggregateMaximumBitRateDL, subscription_data->ambr.downlink); sess = amf_sess_first(amf_ue); while (sess) { bearer = amf_bearer_first(sess); while (bearer) { NGAP_E_RABToBeSetupItemHOReqIEs_t *item = NULL; NGAP_E_RABToBeSetupItemHOReq_t *e_rab = NULL; NGAP_GBR_QosInformation_t *gbrQosInformation = NULL; item = CALLOC(1, sizeof(NGAP_E_RABToBeSetupItemHOReqIEs_t)); ASN_SEQUENCE_ADD(&E_RABToBeSetupListHOReq->list, item); item->id = NGAP_ProtocolIE_ID_id_E_RABToBeSetupItemHOReq; item->criticality = NGAP_Criticality_reject; item->value.present = NGAP_E_RABToBeSetupItemHOReqIEs__value_PR_E_RABToBeSetupItemHOReq; e_rab = &item->value.choice.E_RABToBeSetupItemHOReq; e_rab->e_RAB_ID = bearer->ebi; e_rab->e_RABlevelQosParameters.qCI = bearer->qos.qci; e_rab->e_RABlevelQosParameters.allocationRetentionPriority. priorityLevel = bearer->qos.arp.priority_level; e_rab->e_RABlevelQosParameters.allocationRetentionPriority. pre_emptionCapability = !(bearer->qos.arp.pre_emption_capability); e_rab->e_RABlevelQosParameters.allocationRetentionPriority. pre_emptionVulnerability = !(bearer->qos.arp.pre_emption_vulnerability); if (bearer->qos.mbr.downlink || bearer->qos.mbr.uplink || bearer->qos.gbr.downlink || bearer->qos.gbr.uplink) { if (bearer->qos.mbr.downlink == 0) bearer->qos.mbr.downlink = MAX_BIT_RATE; if (bearer->qos.mbr.uplink == 0) bearer->qos.mbr.uplink = MAX_BIT_RATE; if (bearer->qos.gbr.downlink == 0) bearer->qos.gbr.downlink = MAX_BIT_RATE; if (bearer->qos.gbr.uplink == 0) bearer->qos.gbr.uplink = MAX_BIT_RATE; gbrQosInformation = CALLOC(1, sizeof(struct NGAP_GBR_QosInformation)); asn_uint642INTEGER(&gbrQosInformation->e_RAB_MaximumBitrateDL, bearer->qos.mbr.downlink); asn_uint642INTEGER(&gbrQosInformation->e_RAB_MaximumBitrateUL, bearer->qos.mbr.uplink); asn_uint642INTEGER(&gbrQosInformation-> e_RAB_GuaranteedBitrateDL, bearer->qos.gbr.downlink); asn_uint642INTEGER(&gbrQosInformation-> e_RAB_GuaranteedBitrateUL, bearer->qos.gbr.uplink); e_rab->e_RABlevelQosParameters.gbrQosInformation = gbrQosInformation; } rv = ogs_asn_ip_to_BIT_STRING( &bearer->sgw_s1u_ip, &e_rab->transportLayerAddress); ogs_assert(rv == OGS_OK); ogs_asn_uint32_to_OCTET_STRING( bearer->sgw_s1u_teid, &e_rab->gTP_TEID); ogs_debug(" SGW-NGU-TEID[%d]", bearer->sgw_s1u_teid); bearer = amf_bearer_next(bearer); } sess = amf_sess_next(sess); } ogs_asn_buffer_to_OCTET_STRING( source_totarget_transparentContainer->buf, source_totarget_transparentContainer->size, Source_ToTarget_TransparentContainer); UESecurityCapabilities->encryptionAlgorithms.size = 2; UESecurityCapabilities->encryptionAlgorithms.buf = CALLOC(UESecurityCapabilities->encryptionAlgorithms.size, sizeof(uint8_t)); UESecurityCapabilities->encryptionAlgorithms.bits_unused = 0; UESecurityCapabilities->encryptionAlgorithms.buf[0] = (amf_ue->ue_network_capability.eea << 1); UESecurityCapabilities->integrityProtectionAlgorithms.size = 2; UESecurityCapabilities->integrityProtectionAlgorithms.buf = CALLOC(UESecurityCapabilities-> integrityProtectionAlgorithms.size, sizeof(uint8_t)); UESecurityCapabilities->integrityProtectionAlgorithms.bits_unused = 0; UESecurityCapabilities->integrityProtectionAlgorithms.buf[0] = (amf_ue->ue_network_capability.eia << 1); SecurityContext->nextHopChainingCount = amf_ue->nhcc; SecurityContext->nextHopParameter.size = OGS_SHA256_DIGEST_SIZE; SecurityContext->nextHopParameter.buf = CALLOC(SecurityContext->nextHopParameter.size, sizeof(uint8_t)); SecurityContext->nextHopParameter.bits_unused = 0; memcpy(SecurityContext->nextHopParameter.buf, amf_ue->nh, SecurityContext->nextHopParameter.size); return ogs_ngap_encode(&pdu); } ogs_pkbuf_t *ngap_build_handover_cancel_ack(ran_ue_t *source_ue) { NGAP_NGAP_PDU_t pdu; NGAP_SuccessfulOutcome_t *successfulOutcome = NULL; NGAP_HandoverCancelAcknowledge_t *HandoverCancelAcknowledge = NULL; NGAP_HandoverCancelAcknowledgeIEs_t *ie = NULL; NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; ogs_assert(source_ue); ogs_debug("Handover cancel acknowledge"); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome; pdu.choice.successfulOutcome = CALLOC(1, sizeof(NGAP_SuccessfulOutcome_t)); successfulOutcome = pdu.choice.successfulOutcome; successfulOutcome->procedureCode = NGAP_ProcedureCode_id_HandoverCancel; successfulOutcome->criticality = NGAP_Criticality_reject; successfulOutcome->value.present = NGAP_SuccessfulOutcome__value_PR_HandoverCancelAcknowledge; HandoverCancelAcknowledge = &successfulOutcome->value.choice.HandoverCancelAcknowledge; ie = CALLOC(1, sizeof(NGAP_HandoverCancelAcknowledgeIEs_t)); ASN_SEQUENCE_ADD(&HandoverCancelAcknowledge->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_HandoverCancelAcknowledgeIEs__value_PR_AMF_UE_NGAP_ID; AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_HandoverCancelAcknowledgeIEs_t)); ASN_SEQUENCE_ADD(&HandoverCancelAcknowledge->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_HandoverCancelAcknowledgeIEs__value_PR_RAN_UE_NGAP_ID; RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; *AMF_UE_NGAP_ID = source_ue->amf_ue_ngap_id; *RAN_UE_NGAP_ID = source_ue->ran_ue_ngap_id; ogs_debug(" Source : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%d]", source_ue->ran_ue_ngap_id, source_ue->amf_ue_ngap_id); return ogs_ngap_encode(&pdu); } ogs_pkbuf_t *ngap_build_amf_status_transfer( ran_ue_t *target_ue, NGAP_RANStatusTransfer_TransparentContainer_t *gnb_statustransfer_transparentContainer) { int rv; NGAP_NGAP_PDU_t pdu; NGAP_InitiatingMessage_t *initiatingMessage = NULL; NGAP_AMFStatusTransfer_t *AMFStatusTransfer = NULL; NGAP_AMFStatusTransferIEs_t *ie = NULL; NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; NGAP_RANStatusTransfer_TransparentContainer_t *RAN_StatusTransfer_TransparentContainer = NULL; ogs_assert(target_ue); ogs_assert(gnb_statustransfer_transparentContainer); ogs_debug("AMF status transfer"); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage; pdu.choice.initiatingMessage = CALLOC(1, sizeof(NGAP_InitiatingMessage_t)); initiatingMessage = pdu.choice.initiatingMessage; initiatingMessage->procedureCode = NGAP_ProcedureCode_id_AMFStatusTransfer; initiatingMessage->criticality = NGAP_Criticality_ignore; initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_AMFStatusTransfer; AMFStatusTransfer = &initiatingMessage->value.choice.AMFStatusTransfer; ie = CALLOC(1, sizeof(NGAP_AMFStatusTransferIEs_t)); ASN_SEQUENCE_ADD(&AMFStatusTransfer->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_AMFStatusTransferIEs__value_PR_AMF_UE_NGAP_ID; AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_AMFStatusTransferIEs_t)); ASN_SEQUENCE_ADD(&AMFStatusTransfer->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_AMFStatusTransferIEs__value_PR_RAN_UE_NGAP_ID; RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; ie = CALLOC(1, sizeof(NGAP_AMFStatusTransferIEs_t)); ASN_SEQUENCE_ADD(&AMFStatusTransfer->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_RAN_StatusTransfer_TransparentContainer; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_AMFStatusTransferIEs__value_PR_RAN_StatusTransfer_TransparentContainer; RAN_StatusTransfer_TransparentContainer = &ie->value.choice.RAN_StatusTransfer_TransparentContainer; *AMF_UE_NGAP_ID = target_ue->amf_ue_ngap_id; *RAN_UE_NGAP_ID = target_ue->ran_ue_ngap_id; ogs_debug(" Target : RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%d]", target_ue->ran_ue_ngap_id, target_ue->amf_ue_ngap_id); rv = ogs_asn_copy_ie( &asn_DEF_NGAP_RAN_StatusTransfer_TransparentContainer, gnb_statustransfer_transparentContainer, RAN_StatusTransfer_TransparentContainer); ogs_assert(rv == OGS_OK); return ogs_ngap_encode(&pdu); } #endif ogs_pkbuf_t *ngap_build_error_indication( uint32_t *ran_ue_ngap_id, uint64_t *amf_ue_ngap_id, NGAP_Cause_PR group, long cause) { NGAP_NGAP_PDU_t pdu; NGAP_InitiatingMessage_t *initiatingMessage = NULL; NGAP_ErrorIndication_t *ErrorIndication = NULL; NGAP_ErrorIndicationIEs_t *ie = NULL; NGAP_AMF_UE_NGAP_ID_t *AMF_UE_NGAP_ID = NULL; NGAP_RAN_UE_NGAP_ID_t *RAN_UE_NGAP_ID = NULL; NGAP_Cause_t *Cause = NULL; ogs_debug("Error Indication"); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage; pdu.choice.initiatingMessage = CALLOC(1, sizeof(NGAP_InitiatingMessage_t)); initiatingMessage = pdu.choice.initiatingMessage; initiatingMessage->procedureCode = NGAP_ProcedureCode_id_ErrorIndication; initiatingMessage->criticality = NGAP_Criticality_ignore; initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_ErrorIndication; ErrorIndication = &initiatingMessage->value.choice.ErrorIndication; if (amf_ue_ngap_id) { ie = CALLOC(1, sizeof(NGAP_ErrorIndicationIEs_t)); ASN_SEQUENCE_ADD(&ErrorIndication->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_ErrorIndicationIEs__value_PR_AMF_UE_NGAP_ID; AMF_UE_NGAP_ID = &ie->value.choice.AMF_UE_NGAP_ID; asn_uint642INTEGER(AMF_UE_NGAP_ID, *amf_ue_ngap_id); ogs_debug(" AMF_UE_NGAP_ID[%lld]", (long long)*amf_ue_ngap_id); } if (ran_ue_ngap_id) { ie = CALLOC(1, sizeof(NGAP_ErrorIndicationIEs_t)); ASN_SEQUENCE_ADD(&ErrorIndication->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_ErrorIndicationIEs__value_PR_RAN_UE_NGAP_ID; RAN_UE_NGAP_ID = &ie->value.choice.RAN_UE_NGAP_ID; *RAN_UE_NGAP_ID = *ran_ue_ngap_id; ogs_debug(" RAN_UE_NGAP_ID[%d]", (int)*ran_ue_ngap_id); } ie = CALLOC(1, sizeof(NGAP_ErrorIndicationIEs_t)); ASN_SEQUENCE_ADD(&ErrorIndication->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_Cause; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_ErrorIndicationIEs__value_PR_Cause; Cause = &ie->value.choice.Cause; Cause->present = group; Cause->choice.radioNetwork = cause; ogs_debug(" Group[%d] Cause[%d]", Cause->present, (int)Cause->choice.radioNetwork); return ogs_ngap_encode(&pdu); } #if 0 ogs_pkbuf_t *ngap_build_s1_reset( NGAP_Cause_PR group, long cause, NGAP_UE_associatedLogicalNG_connectionList_t *partOfNG_Interface) { NGAP_NGAP_PDU_t pdu; NGAP_InitiatingMessage_t *initiatingMessage = NULL; NGAP_Reset_t *Reset = NULL; NGAP_ResetIEs_t *ie = NULL; NGAP_Cause_t *Cause = NULL; NGAP_ResetType_t *ResetType = NULL; ogs_debug("Reset"); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage; pdu.choice.initiatingMessage = CALLOC(1, sizeof(NGAP_InitiatingMessage_t)); initiatingMessage = pdu.choice.initiatingMessage; initiatingMessage->procedureCode = NGAP_ProcedureCode_id_Reset; initiatingMessage->criticality = NGAP_Criticality_ignore; initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_Reset; Reset = &initiatingMessage->value.choice.Reset; ie = CALLOC(1, sizeof(NGAP_ResetIEs_t)); ASN_SEQUENCE_ADD(&Reset->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_Cause; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_ResetIEs__value_PR_Cause; Cause = &ie->value.choice.Cause; ie = CALLOC(1, sizeof(NGAP_ResetIEs_t)); ASN_SEQUENCE_ADD(&Reset->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_ResetType; ie->criticality = NGAP_Criticality_reject; ie->value.present = NGAP_ResetIEs__value_PR_ResetType; ResetType = &ie->value.choice.ResetType; Cause->present = group; Cause->choice.radioNetwork = cause; ogs_debug(" Group[%d] Cause[%d] partOfNG_Interface[%p]", Cause->present, (int)Cause->choice.radioNetwork, partOfNG_Interface); if (partOfNG_Interface) { ResetType->present = NGAP_ResetType_PR_partOfNG_Interface; ResetType->choice.partOfNG_Interface = partOfNG_Interface; } else { ResetType->present = NGAP_ResetType_PR_s1_Interface; ResetType->choice.s1_Interface = NGAP_ResetAll_reset_all; } return ogs_ngap_encode(&pdu); } ogs_pkbuf_t *ngap_build_s1_reset_partial( NGAP_Cause_PR group, long cause, NGAP_AMF_UE_NGAP_ID_t *amf_ue_ngap_id, NGAP_RAN_UE_NGAP_ID_t *ran_ue_ngap_id) { NGAP_UE_associatedLogicalNG_ConnectionListRes_t *partOfNG_Interface = NULL; NGAP_UE_associatedLogicalNG_ConnectionItemRes_t *ie2 = NULL; NGAP_UE_associatedLogicalNG_ConnectionItem_t *item = NULL; partOfNG_Interface = CALLOC(1, sizeof(NGAP_UE_associatedLogicalNG_ConnectionListRes_t)); ogs_assert(partOfNG_Interface); ie2 = CALLOC(1, sizeof(NGAP_UE_associatedLogicalNG_ConnectionItemRes_t)); ASN_SEQUENCE_ADD(&partOfNG_Interface->list, ie2); ie2->id = NGAP_ProtocolIE_ID_id_UE_associatedLogicalNG_ConnectionItem; ie2->criticality = NGAP_Criticality_reject; ie2->value.present = NGAP_UE_associatedLogicalNG_ConnectionItemRes__value_PR_UE_associatedLogicalNG_ConnectionItem; item = &ie2->value.choice.UE_associatedLogicalNG_ConnectionItem; item->aMF_UE_NGAP_ID = amf_ue_ngap_id; item->rAN_UE_NGAP_ID = ran_ue_ngap_id; return ngap_build_s1_reset(group, cause, partOfNG_Interface); } ogs_pkbuf_t *ngap_build_s1_reset_ack( NGAP_UE_associatedLogicalNG_connectionList_t *partOfNG_Interface) { NGAP_NGAP_PDU_t pdu; NGAP_SuccessfulOutcome_t *successfulOutcome = NULL; NGAP_ResetAcknowledge_t *ResetAcknowledge = NULL; NGAP_ResetAcknowledgeIEs_t *ie = NULL; ogs_debug("Reset acknowledge"); memset(&pdu, 0, sizeof (NGAP_NGAP_PDU_t)); pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome; pdu.choice.successfulOutcome = CALLOC(1, sizeof(NGAP_SuccessfulOutcome_t)); successfulOutcome = pdu.choice.successfulOutcome; successfulOutcome->procedureCode = NGAP_ProcedureCode_id_Reset; successfulOutcome->criticality = NGAP_Criticality_reject; successfulOutcome->value.present = NGAP_SuccessfulOutcome__value_PR_ResetAcknowledge; ResetAcknowledge = &successfulOutcome->value.choice.ResetAcknowledge; if (partOfNG_Interface && partOfNG_Interface->list.count) { int i = 0; NGAP_UE_associatedLogicalNG_ConnectionListResAck_t *list = NULL; ie = CALLOC(1, sizeof(NGAP_ResetAcknowledgeIEs_t)); ASN_SEQUENCE_ADD(&ResetAcknowledge->protocolIEs, ie); ie->id = NGAP_ProtocolIE_ID_id_UE_associatedLogicalNG_ConnectionListResAck; ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_ResetAcknowledgeIEs__value_PR_UE_associatedLogicalNG_ConnectionListResAck; list = &ie->value.choice.UE_associatedLogicalNG_ConnectionListResAck; for (i = 0; i < partOfNG_Interface->list.count; i++) { NGAP_UE_associatedLogicalNG_ConnectionItemRes_t *ie1 = NULL; NGAP_UE_associatedLogicalNG_ConnectionItem_t *item1 = NULL; NGAP_UE_associatedLogicalNG_ConnectionItemResAck_t *ie2 = NULL; NGAP_UE_associatedLogicalNG_ConnectionItem_t *item2 = NULL; ie1 = (NGAP_UE_associatedLogicalNG_ConnectionItemRes_t *) partOfNG_Interface->list.array[i]; ogs_assert(ie1); item1 = &ie1->value.choice.UE_associatedLogicalNG_ConnectionItem; ogs_assert(item1); if (item1->aMF_UE_NGAP_ID == NULL && item1->rAN_UE_NGAP_ID == NULL) { ogs_warn("No AMF_UE_NGAP_ID & RAN_UE_NGAP_ID"); continue; } ie2 = CALLOC(1, sizeof(NGAP_UE_associatedLogicalNG_ConnectionItemResAck_t)); ogs_assert(ie2); ASN_SEQUENCE_ADD(&list->list, ie2); ie2->id = NGAP_ProtocolIE_ID_id_UE_associatedLogicalNG_ConnectionItem; ie2->criticality = NGAP_Criticality_ignore; ie2->value.present = NGAP_UE_associatedLogicalNG_ConnectionItemResAck__value_PR_UE_associatedLogicalNG_ConnectionItem; item2 = &ie2->value.choice.UE_associatedLogicalNG_ConnectionItem; ogs_assert(item2); if (item1->aMF_UE_NGAP_ID) { item2->aMF_UE_NGAP_ID = CALLOC(1, sizeof(NGAP_AMF_UE_NGAP_ID_t)); ogs_assert(item2->aMF_UE_NGAP_ID); *item2->aMF_UE_NGAP_ID = *item1->aMF_UE_NGAP_ID; } if (item1->rAN_UE_NGAP_ID) { item2->rAN_UE_NGAP_ID = CALLOC(1, sizeof(NGAP_RAN_UE_NGAP_ID_t)); ogs_assert(item2->rAN_UE_NGAP_ID); *item2->rAN_UE_NGAP_ID = *item1->rAN_UE_NGAP_ID; } ogs_debug(" AMF_UE_NGAP_ID[%d] RAN_UE_NGAP_ID[%d]", item2->aMF_UE_NGAP_ID ? (int)*item2->aMF_UE_NGAP_ID : -1, item2->rAN_UE_NGAP_ID ? (int)*item2->rAN_UE_NGAP_ID : -1); } } return ogs_ngap_encode(&pdu); } #endif