diff --git a/lib/core/ogs-3gpp-types.h b/lib/core/ogs-3gpp-types.h index f122da77cb..9480e09956 100644 --- a/lib/core/ogs-3gpp-types.h +++ b/lib/core/ogs-3gpp-types.h @@ -47,6 +47,7 @@ extern "C" { #define OGS_MAX_NUM_OF_HOSTNAME 16 #define OGS_MAX_APN_LEN 100 +#define OGS_MAX_DNN_LEN 100 #define OGS_MAX_PCO_LEN 251 #define OGS_MAX_FQDN_LEN 256 #define OGS_MAX_IFNAME_LEN 32 diff --git a/lib/nas/5gs/decoder.c b/lib/nas/5gs/decoder.c new file mode 100644 index 0000000000..5558e979c9 --- /dev/null +++ b/lib/nas/5gs/decoder.c @@ -0,0 +1,2817 @@ +/* + * The MIT License + * + * Copyright (C) 2019,2020 by Sukchan Lee + * + * This file is part of Open5GS. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/******************************************************************************* + * This file had been created by nas-message.py script v0.2.0 + * Please do not modify this file but regenerate it via script. + * Created on: 2020-05-21 21:20:09.040737 by acetcom + * from 24501-g41.docx + ******************************************************************************/ + +#include "ogs-nas-5gs.h" + +int ogs_nas_decode_registration_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_registration_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_registration_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_registration_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_deregistration_request_from_ue(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_deregistration_request_to_ue(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_service_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_service_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_service_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_configuration_update_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_configuration_update_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_authentication_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_authentication_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_authentication_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_authentication_failure(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_authentication_result(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_identity_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_identity_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_security_mode_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_security_mode_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_security_mode_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gmm_status(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_notification(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_notification_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_ul_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_dl_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_establishment_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_establishment_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_establishment_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_authentication_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_authentication_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_authentication_result(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_modification_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_modification_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_modification_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_modification_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_modification_command_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_release_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_release_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_release_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_release_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gsm_status(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_registration_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_registration_request_t *registration_request = &message->gmm.registration_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode REGISTRATION_REQUEST\n"); + + size = ogs_nas_decode_5gs_registration_type(®istration_request->registration_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_5gs_mobile_identity(®istration_request->mobile_identity, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_REGISTRATION_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_TYPE: + size = ogs_nas_decode_key_set_identifier(®istration_request->non_current_native_nas_key_set_identifier, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE: + size = ogs_nas_decode_5gmm_capability(®istration_request->gmm_capability, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_5GMM_CAPABILITY_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE: + size = ogs_nas_decode_ue_security_capability(®istration_request->ue_security_capability, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_REQUESTED_NSSAI_TYPE: + size = ogs_nas_decode_nssai(®istration_request->requested_nssai, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_REQUESTED_NSSAI_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE: + size = ogs_nas_decode_5gs_tracking_area_identity(®istration_request->last_visited_registered_tai, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_S1_UE_NETWORK_CAPABILITY_TYPE: + size = ogs_nas_decode_s1_ue_network_capability(®istration_request->s1_ue_network_capability, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_S1_UE_NETWORK_CAPABILITY_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_UPLINK_DATA_STATUS_TYPE: + size = ogs_nas_decode_uplink_data_status(®istration_request->uplink_data_status, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_UPLINK_DATA_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_PDU_SESSION_STATUS_TYPE: + size = ogs_nas_decode_pdu_session_status(®istration_request->pdu_session_status, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_PDU_SESSION_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_MICO_INDICATION_TYPE: + size = ogs_nas_decode_mico_indication(®istration_request->mico_indication, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_MICO_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_UE_STATUS_TYPE: + size = ogs_nas_decode_ue_status(®istration_request->ue_status, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_UE_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_ADDITIONAL_GUTI_TYPE: + size = ogs_nas_decode_5gs_mobile_identity(®istration_request->additional_guti, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_ADDITIONAL_GUTI_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_ALLOWED_PDU_SESSION_STATUS_TYPE: + size = ogs_nas_decode_allowed_pdu_session_status(®istration_request->allowed_pdu_session_status, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_ALLOWED_PDU_SESSION_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_UE_USAGE_SETTING_TYPE: + size = ogs_nas_decode_ue_usage_setting(®istration_request->ue_usage_setting, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_UE_USAGE_SETTING_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_REQUESTED_DRX_PARAMETERS_TYPE: + size = ogs_nas_decode_5gs_drx_parameters(®istration_request->requested_drx_parameters, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_REQUESTED_DRX_PARAMETERS_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_EPS_NAS_MESSAGE_CONTAINER_TYPE: + size = ogs_nas_decode_eps_nas_message_container(®istration_request->eps_nas_message_container, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_EPS_NAS_MESSAGE_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_LADN_INDICATION_TYPE: + size = ogs_nas_decode_ladn_indication(®istration_request->ladn_indication, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_LADN_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_TYPE_TYPE: + size = ogs_nas_decode_payload_container_type(®istration_request->payload_container_type, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_TYPE_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_TYPE: + size = ogs_nas_decode_payload_container(®istration_request->payload_container, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_NETWORK_SLICING_INDICATION_TYPE: + size = ogs_nas_decode_network_slicing_indication(®istration_request->network_slicing_indication, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_NETWORK_SLICING_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_5GS_UPDATE_TYPE_TYPE: + size = ogs_nas_decode_5gs_update_type(®istration_request->update_type, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_5GS_UPDATE_TYPE_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_MOBILE_STATION_CLASSMARK_2_TYPE: + size = ogs_nas_decode_mobile_station_classmark_2(®istration_request->mobile_station_classmark_2, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_SUPPORTED_CODECS_TYPE: + size = ogs_nas_decode_supported_codec_list(®istration_request->supported_codecs, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_SUPPORTED_CODECS_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_TYPE: + size = ogs_nas_decode_message_container(®istration_request->nas_message_container, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_EPS_BEARER_CONTEXT_STATUS_TYPE: + size = ogs_nas_decode_eps_bearer_context_status(®istration_request->eps_bearer_context_status, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_REQUESTED_EXTENDED_DRX_PARAMETERS_TYPE: + size = ogs_nas_decode_extended_drx_parameters(®istration_request->requested_extended_drx_parameters, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_REQUESTED_EXTENDED_DRX_PARAMETERS_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_T3324_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(®istration_request->t3324_value, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_T3324_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_UE_RADIO_CAPABILITY_ID_TYPE: + size = ogs_nas_decode_ue_radio_capability_id(®istration_request->ue_radio_capability_id, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_UE_RADIO_CAPABILITY_ID_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_REQUESTED_MAPPED_NSSAI_TYPE: + size = ogs_nas_decode_mapped_nssai(®istration_request->requested_mapped_nssai, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_REQUESTED_MAPPED_NSSAI_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_TYPE: + size = ogs_nas_decode_additional_information_requested(®istration_request->additional_information_requested, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_TYPE: + size = ogs_nas_decode_wus_assistance_information(®istration_request->requested_wus_assistance_information, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REQUEST_N5GC_INDICATION_TYPE: + size = ogs_nas_decode_n5gc_indication(®istration_request->n5gc_indication, pkbuf); + ogs_assert(size >= 0); + registration_request->presencemask |= OGS_NAS_REGISTRATION_REQUEST_N5GC_INDICATION_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_registration_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_registration_accept_t *registration_accept = &message->gmm.registration_accept; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode REGISTRATION_ACCEPT\n"); + + size = ogs_nas_decode_5gs_registration_result(®istration_accept->registration_result, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_REGISTRATION_ACCEPT_5G_GUTI_TYPE: + size = ogs_nas_decode_5gs_mobile_identity(®istration_accept->guti, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_5G_GUTI_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_EQUIVALENT_PLMNS_TYPE: + size = ogs_nas_decode_plmn_list(®istration_accept->equivalent_plmns, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_EQUIVALENT_PLMNS_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_TAI_LIST_TYPE: + size = ogs_nas_decode_5gs_tracking_area_identity_list(®istration_accept->tai_list, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_TAI_LIST_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_ALLOWED_NSSAI_TYPE: + size = ogs_nas_decode_nssai(®istration_accept->allowed_nssai, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_ALLOWED_NSSAI_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_REJECTED_NSSAI_TYPE: + size = ogs_nas_decode_rejected_nssai(®istration_accept->rejected_nssai, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_REJECTED_NSSAI_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_CONFIGURED_NSSAI_TYPE: + size = ogs_nas_decode_nssai(®istration_accept->configured_nssai, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_CONFIGURED_NSSAI_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_5GS_NETWORK_FEATURE_SUPPORT_TYPE: + size = ogs_nas_decode_5gs_network_feature_support(®istration_accept->network_feature_support, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_5GS_NETWORK_FEATURE_SUPPORT_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_STATUS_TYPE: + size = ogs_nas_decode_pdu_session_status(®istration_accept->pdu_session_status, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_TYPE: + size = ogs_nas_decode_pdu_session_reactivation_result(®istration_accept->pdu_session_reactivation_result, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_TYPE: + size = ogs_nas_decode_pdu_session_reactivation_result_error_cause(®istration_accept->pdu_session_reactivation_result_error_cause, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_LADN_INFORMATION_TYPE: + size = ogs_nas_decode_ladn_information(®istration_accept->ladn_information, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_LADN_INFORMATION_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_MICO_INDICATION_TYPE: + size = ogs_nas_decode_mico_indication(®istration_accept->mico_indication, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_MICO_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_NETWORK_SLICING_INDICATION_TYPE: + size = ogs_nas_decode_network_slicing_indication(®istration_accept->network_slicing_indication, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_NETWORK_SLICING_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_SERVICE_AREA_LIST_TYPE: + size = ogs_nas_decode_service_area_list(®istration_accept->service_area_list, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_SERVICE_AREA_LIST_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_T3512_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(®istration_accept->t3512_value, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_T3512_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_NON_3GPP_DE_REGISTRATION_TIMER_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_2(®istration_accept->non_3gpp_de_registration_timer_value, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_NON_3GPP_DE_REGISTRATION_TIMER_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_T3502_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_2(®istration_accept->t3502_value, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_T3502_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_EMERGENCY_NUMBER_LIST_TYPE: + size = ogs_nas_decode_emergency_number_list(®istration_accept->emergency_number_list, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_TYPE: + size = ogs_nas_decode_extended_emergency_number_list(®istration_accept->extended_emergency_number_list, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_SOR_TRANSPARENT_CONTAINER_TYPE: + size = ogs_nas_decode_sor_transparent_container(®istration_accept->sor_transparent_container, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_SOR_TRANSPARENT_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_EAP_MESSAGE_TYPE: + size = ogs_nas_decode_eap_message(®istration_accept->eap_message, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_EAP_MESSAGE_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_NSSAI_INCLUSION_MODE_TYPE: + size = ogs_nas_decode_nssai_inclusion_mode(®istration_accept->nssai_inclusion_mode, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_NSSAI_INCLUSION_MODE_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_TYPE: + size = ogs_nas_decode_operator_defined_access_category_definitions(®istration_accept->operator_defined_access_category_definitions, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_DRX_PARAMETERS_TYPE: + size = ogs_nas_decode_5gs_drx_parameters(®istration_accept->negotiated_drx_parameters, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_DRX_PARAMETERS_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_NON_3GPP_NW_POLICIES_TYPE: + size = ogs_nas_decode_non_3gpp_nw_provided_policies(®istration_accept->non_3gpp_nw_policies, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_NON_3GPP_NW_POLICIES_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_EPS_BEARER_CONTEXT_STATUS_TYPE: + size = ogs_nas_decode_eps_bearer_context_status(®istration_accept->eps_bearer_context_status, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_EPS_BEARER_CONTEXT_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_EXTENDED_DRX_PARAMETERS_TYPE: + size = ogs_nas_decode_extended_drx_parameters(®istration_accept->negotiated_extended_drx_parameters, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_EXTENDED_DRX_PARAMETERS_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_T3447_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(®istration_accept->t3447_value, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_T3447_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_T3448_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(®istration_accept->t3448_value, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_T3448_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_T3324_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(®istration_accept->t3324_value, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_T3324_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_TYPE: + size = ogs_nas_decode_ue_radio_capability_id(®istration_accept->ue_radio_capability_id, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_TYPE: + size = ogs_nas_decode_ue_radio_capability_id_deletion_indication(®istration_accept->ue_radio_capability_id_deletion_indication, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_PENDING_NSSAI_TYPE: + size = ogs_nas_decode_nssai(®istration_accept->pending_nssai, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_PENDING_NSSAI_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_CIPHERING_KEY_DATA_TYPE: + size = ogs_nas_decode_ciphering_key_data(®istration_accept->ciphering_key_data, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_CIPHERING_KEY_DATA_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_CAG_INFORMATION_LIST_TYPE: + size = ogs_nas_decode_cag_information_list(®istration_accept->cag_information_list, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_CAG_INFORMATION_LIST_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_TRUNCATED_5G_S_TMSI_CONFIGURATION_TYPE: + size = ogs_nas_decode_truncated_5g_s_tmsi_configuration(®istration_accept->truncated_s_tmsi_configuration, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_TRUNCATED_5G_S_TMSI_CONFIGURATION_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_WUS_ASSISTANCE_INFORMATION_TYPE: + size = ogs_nas_decode_wus_assistance_information(®istration_accept->negotiated_wus_assistance_information, pkbuf); + ogs_assert(size >= 0); + registration_accept->presencemask |= OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_WUS_ASSISTANCE_INFORMATION_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_registration_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_registration_complete_t *registration_complete = &message->gmm.registration_complete; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode REGISTRATION_COMPLETE\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_REGISTRATION_COMPLETE_SOR_TRANSPARENT_CONTAINER_TYPE: + size = ogs_nas_decode_sor_transparent_container(®istration_complete->sor_transparent_container, pkbuf); + ogs_assert(size >= 0); + registration_complete->presencemask |= OGS_NAS_REGISTRATION_COMPLETE_SOR_TRANSPARENT_CONTAINER_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_registration_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_registration_reject_t *registration_reject = &message->gmm.registration_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode REGISTRATION_REJECT\n"); + + size = ogs_nas_decode_5gmm_cause(®istration_reject->gmm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_REGISTRATION_REJECT_T3346_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_2(®istration_reject->t3346_value, pkbuf); + ogs_assert(size >= 0); + registration_reject->presencemask |= OGS_NAS_REGISTRATION_REJECT_T3346_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REJECT_T3502_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_2(®istration_reject->t3502_value, pkbuf); + ogs_assert(size >= 0); + registration_reject->presencemask |= OGS_NAS_REGISTRATION_REJECT_T3502_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REJECT_EAP_MESSAGE_TYPE: + size = ogs_nas_decode_eap_message(®istration_reject->eap_message, pkbuf); + ogs_assert(size >= 0); + registration_reject->presencemask |= OGS_NAS_REGISTRATION_REJECT_EAP_MESSAGE_PRESENT; + decoded += size; + break; + case OGS_NAS_REGISTRATION_REJECT_REJECTED_NSSAI_TYPE: + size = ogs_nas_decode_rejected_nssai(®istration_reject->rejected_nssai, pkbuf); + ogs_assert(size >= 0); + registration_reject->presencemask |= OGS_NAS_REGISTRATION_REJECT_REJECTED_NSSAI_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_deregistration_request_from_ue(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_deregistration_request_from_ue_t *deregistration_request_from_ue = &message->gmm.deregistration_request_from_ue; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode DEREGISTRATION_REQUEST\n"); + + size = ogs_nas_decode_de_registration_type(&deregistration_request_from_ue->de_registration_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_5gs_mobile_identity(&deregistration_request_from_ue->mobile_identity, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_deregistration_request_to_ue(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_deregistration_request_to_ue_t *deregistration_request_to_ue = &message->gmm.deregistration_request_to_ue; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode DEREGISTRATION_REQUEST\n"); + + size = ogs_nas_decode_de_registration_type(&deregistration_request_to_ue->de_registration_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_DEREGISTRATION_REQUEST_5GMM_CAUSE_TYPE: + size = ogs_nas_decode_5gmm_cause(&deregistration_request_to_ue->gmm_cause, pkbuf); + ogs_assert(size >= 0); + deregistration_request_to_ue->presencemask |= OGS_NAS_DEREGISTRATION_REQUEST_5GMM_CAUSE_PRESENT; + decoded += size; + break; + case OGS_NAS_DEREGISTRATION_REQUEST_T3346_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_2(&deregistration_request_to_ue->t3346_value, pkbuf); + ogs_assert(size >= 0); + deregistration_request_to_ue->presencemask |= OGS_NAS_DEREGISTRATION_REQUEST_T3346_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_DEREGISTRATION_REQUEST_REJECTED_NSSAI_TYPE: + size = ogs_nas_decode_rejected_nssai(&deregistration_request_to_ue->rejected_nssai, pkbuf); + ogs_assert(size >= 0); + deregistration_request_to_ue->presencemask |= OGS_NAS_DEREGISTRATION_REQUEST_REJECTED_NSSAI_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_service_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_service_request_t *service_request = &message->gmm.service_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode SERVICE_REQUEST\n"); + + size = ogs_nas_decode_key_set_identifier(&service_request->ngksi, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_5gs_mobile_identity(&service_request->s_tmsi, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_SERVICE_REQUEST_UPLINK_DATA_STATUS_TYPE: + size = ogs_nas_decode_uplink_data_status(&service_request->uplink_data_status, pkbuf); + ogs_assert(size >= 0); + service_request->presencemask |= OGS_NAS_SERVICE_REQUEST_UPLINK_DATA_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_SERVICE_REQUEST_PDU_SESSION_STATUS_TYPE: + size = ogs_nas_decode_pdu_session_status(&service_request->pdu_session_status, pkbuf); + ogs_assert(size >= 0); + service_request->presencemask |= OGS_NAS_SERVICE_REQUEST_PDU_SESSION_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_SERVICE_REQUEST_ALLOWED_PDU_SESSION_STATUS_TYPE: + size = ogs_nas_decode_allowed_pdu_session_status(&service_request->allowed_pdu_session_status, pkbuf); + ogs_assert(size >= 0); + service_request->presencemask |= OGS_NAS_SERVICE_REQUEST_ALLOWED_PDU_SESSION_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_SERVICE_REQUEST_NAS_MESSAGE_CONTAINER_TYPE: + size = ogs_nas_decode_message_container(&service_request->nas_message_container, pkbuf); + ogs_assert(size >= 0); + service_request->presencemask |= OGS_NAS_SERVICE_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_service_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_service_reject_t *service_reject = &message->gmm.service_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode SERVICE_REJECT\n"); + + size = ogs_nas_decode_5gmm_cause(&service_reject->gmm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_SERVICE_REJECT_PDU_SESSION_STATUS_TYPE: + size = ogs_nas_decode_pdu_session_status(&service_reject->pdu_session_status, pkbuf); + ogs_assert(size >= 0); + service_reject->presencemask |= OGS_NAS_SERVICE_REJECT_PDU_SESSION_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_SERVICE_REJECT_T3346_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_2(&service_reject->t3346_value, pkbuf); + ogs_assert(size >= 0); + service_reject->presencemask |= OGS_NAS_SERVICE_REJECT_T3346_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_SERVICE_REJECT_EAP_MESSAGE_TYPE: + size = ogs_nas_decode_eap_message(&service_reject->eap_message, pkbuf); + ogs_assert(size >= 0); + service_reject->presencemask |= OGS_NAS_SERVICE_REJECT_EAP_MESSAGE_PRESENT; + decoded += size; + break; + case OGS_NAS_SERVICE_REJECT_T3448_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(&service_reject->t3448_value, pkbuf); + ogs_assert(size >= 0); + service_reject->presencemask |= OGS_NAS_SERVICE_REJECT_T3448_VALUE_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_service_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_service_accept_t *service_accept = &message->gmm.service_accept; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode SERVICE_ACCEPT\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_STATUS_TYPE: + size = ogs_nas_decode_pdu_session_status(&service_accept->pdu_session_status, pkbuf); + ogs_assert(size >= 0); + service_accept->presencemask |= OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_TYPE: + size = ogs_nas_decode_pdu_session_reactivation_result(&service_accept->pdu_session_reactivation_result, pkbuf); + ogs_assert(size >= 0); + service_accept->presencemask |= OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_PRESENT; + decoded += size; + break; + case OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_TYPE: + size = ogs_nas_decode_pdu_session_reactivation_result_error_cause(&service_accept->pdu_session_reactivation_result_error_cause, pkbuf); + ogs_assert(size >= 0); + service_accept->presencemask |= OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_PRESENT; + decoded += size; + break; + case OGS_NAS_SERVICE_ACCEPT_EAP_MESSAGE_TYPE: + size = ogs_nas_decode_eap_message(&service_accept->eap_message, pkbuf); + ogs_assert(size >= 0); + service_accept->presencemask |= OGS_NAS_SERVICE_ACCEPT_EAP_MESSAGE_PRESENT; + decoded += size; + break; + case OGS_NAS_SERVICE_ACCEPT_T3448_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(&service_accept->t3448_value, pkbuf); + ogs_assert(size >= 0); + service_accept->presencemask |= OGS_NAS_SERVICE_ACCEPT_T3448_VALUE_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_configuration_update_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_configuration_update_command_t *configuration_update_command = &message->gmm.configuration_update_command; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode CONFIGURATION_UPDATE_COMMAND\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CONFIGURATION_UPDATE_INDICATION_TYPE: + size = ogs_nas_decode_configuration_update_indication(&configuration_update_command->configuration_update_indication, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CONFIGURATION_UPDATE_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_5G_GUTI_TYPE: + size = ogs_nas_decode_5gs_mobile_identity(&configuration_update_command->guti, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_5G_GUTI_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_TAI_LIST_TYPE: + size = ogs_nas_decode_5gs_tracking_area_identity_list(&configuration_update_command->tai_list, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_TAI_LIST_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_ALLOWED_NSSAI_TYPE: + size = ogs_nas_decode_nssai(&configuration_update_command->allowed_nssai, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_ALLOWED_NSSAI_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SERVICE_AREA_LIST_TYPE: + size = ogs_nas_decode_service_area_list(&configuration_update_command->service_area_list, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SERVICE_AREA_LIST_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_FULL_NAME_FOR_NETWORK_TYPE: + size = ogs_nas_decode_network_name(&configuration_update_command->full_name_for_network, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_FULL_NAME_FOR_NETWORK_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SHORT_NAME_FOR_NETWORK_TYPE: + size = ogs_nas_decode_network_name(&configuration_update_command->short_name_for_network, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SHORT_NAME_FOR_NETWORK_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_LOCAL_TIME_ZONE_TYPE: + size = ogs_nas_decode_time_zone(&configuration_update_command->local_time_zone, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_LOCAL_TIME_ZONE_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_TYPE: + size = ogs_nas_decode_time_zone_and_time(&configuration_update_command->universal_time_and_local_time_zone, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_NETWORK_DAYLIGHT_SAVING_TIME_TYPE: + size = ogs_nas_decode_daylight_saving_time(&configuration_update_command->network_daylight_saving_time, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_NETWORK_DAYLIGHT_SAVING_TIME_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_LADN_INFORMATION_TYPE: + size = ogs_nas_decode_ladn_information(&configuration_update_command->ladn_information, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_LADN_INFORMATION_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_MICO_INDICATION_TYPE: + size = ogs_nas_decode_mico_indication(&configuration_update_command->mico_indication, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_MICO_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_NETWORK_SLICING_INDICATION_TYPE: + size = ogs_nas_decode_network_slicing_indication(&configuration_update_command->network_slicing_indication, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_NETWORK_SLICING_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CONFIGURED_NSSAI_TYPE: + size = ogs_nas_decode_nssai(&configuration_update_command->configured_nssai, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CONFIGURED_NSSAI_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_REJECTED_NSSAI_TYPE: + size = ogs_nas_decode_rejected_nssai(&configuration_update_command->rejected_nssai, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_REJECTED_NSSAI_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_TYPE: + size = ogs_nas_decode_operator_defined_access_category_definitions(&configuration_update_command->operator_defined_access_category_definitions, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SMS_INDICATION_TYPE: + size = ogs_nas_decode_sms_indication(&configuration_update_command->sms_indication, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SMS_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_T3447_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(&configuration_update_command->t3447_value, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_T3447_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CAG_INFORMATION_LIST_TYPE: + size = ogs_nas_decode_cag_information_list(&configuration_update_command->cag_information_list, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CAG_INFORMATION_LIST_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_TYPE: + size = ogs_nas_decode_ue_radio_capability_id(&configuration_update_command->ue_radio_capability_id, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_TYPE: + size = ogs_nas_decode_ue_radio_capability_id_deletion_indication(&configuration_update_command->ue_radio_capability_id_deletion_indication, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_5GS_REGISTRATION_RESULT_TYPE: + size = ogs_nas_decode_5gs_registration_result(&configuration_update_command->registration_result, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_5GS_REGISTRATION_RESULT_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND_TRUNCATED_5G_S_TMSI_CONFIGURATION_TYPE: + size = ogs_nas_decode_truncated_5g_s_tmsi_configuration(&configuration_update_command->truncated_s_tmsi_configuration, pkbuf); + ogs_assert(size >= 0); + configuration_update_command->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMMAND_TRUNCATED_5G_S_TMSI_CONFIGURATION_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_configuration_update_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_configuration_update_complete_t *configuration_update_complete = &message->gmm.configuration_update_complete; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode CONFIGURATION_UPDATE_COMPLETE\n"); + + size = ogs_nas_decode_control_plane_service_type(&configuration_update_complete->control_plane_service_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_CIOT_SMALL_DATA_CONTAINER_TYPE: + size = ogs_nas_decode_ciot_small_data_container(&configuration_update_complete->ciot_small_data_container, pkbuf); + ogs_assert(size >= 0); + configuration_update_complete->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_CIOT_SMALL_DATA_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PAYLOAD_CONTAINER_TYPE_TYPE: + size = ogs_nas_decode_payload_container_type(&configuration_update_complete->payload_container_type, pkbuf); + ogs_assert(size >= 0); + configuration_update_complete->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PAYLOAD_CONTAINER_TYPE_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PAYLOAD_CONTAINER_TYPE: + size = ogs_nas_decode_payload_container(&configuration_update_complete->payload_container, pkbuf); + ogs_assert(size >= 0); + configuration_update_complete->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PAYLOAD_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PDU_SESSION_STATUS_TYPE: + size = ogs_nas_decode_pdu_session_status(&configuration_update_complete->pdu_session_status, pkbuf); + ogs_assert(size >= 0); + configuration_update_complete->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PDU_SESSION_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_RELEASE_ASSISTANCE_INDICATION_TYPE: + size = ogs_nas_decode_release_assistance_indication(&configuration_update_complete->release_assistance_indication, pkbuf); + ogs_assert(size >= 0); + configuration_update_complete->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_RELEASE_ASSISTANCE_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_UPLINK_DATA_STATUS_TYPE: + size = ogs_nas_decode_uplink_data_status(&configuration_update_complete->uplink_data_status, pkbuf); + ogs_assert(size >= 0); + configuration_update_complete->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_UPLINK_DATA_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_NAS_MESSAGE_CONTAINER_TYPE: + size = ogs_nas_decode_message_container(&configuration_update_complete->nas_message_container, pkbuf); + ogs_assert(size >= 0); + configuration_update_complete->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_NAS_MESSAGE_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_ADDITIONAL_INFORMATION_TYPE: + size = ogs_nas_decode_additional_information(&configuration_update_complete->additional_information, pkbuf); + ogs_assert(size >= 0); + configuration_update_complete->presencemask |= OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_ADDITIONAL_INFORMATION_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_authentication_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_authentication_request_t *authentication_request = &message->gmm.authentication_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode AUTHENTICATION_REQUEST\n"); + + size = ogs_nas_decode_key_set_identifier(&authentication_request->ngksi, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_abba(&authentication_request->abba, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_RAND_TYPE: + size = ogs_nas_decode_authentication_parameter_rand(&authentication_request->authentication_parameter_rand, pkbuf); + ogs_assert(size >= 0); + authentication_request->presencemask |= OGS_NAS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_RAND_PRESENT; + decoded += size; + break; + case OGS_NAS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_AUTN_TYPE: + size = ogs_nas_decode_authentication_parameter_autn(&authentication_request->authentication_parameter_autn, pkbuf); + ogs_assert(size >= 0); + authentication_request->presencemask |= OGS_NAS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_AUTN_PRESENT; + decoded += size; + break; + case OGS_NAS_AUTHENTICATION_REQUEST_EAP_MESSAGE_TYPE: + size = ogs_nas_decode_eap_message(&authentication_request->eap_message, pkbuf); + ogs_assert(size >= 0); + authentication_request->presencemask |= OGS_NAS_AUTHENTICATION_REQUEST_EAP_MESSAGE_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_authentication_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_authentication_response_t *authentication_response = &message->gmm.authentication_response; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode AUTHENTICATION_RESPONSE\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_AUTHENTICATION_RESPONSE_AUTHENTICATION_RESPONSE_PARAMETER_TYPE: + size = ogs_nas_decode_authentication_response_parameter(&authentication_response->authentication_response_parameter, pkbuf); + ogs_assert(size >= 0); + authentication_response->presencemask |= OGS_NAS_AUTHENTICATION_RESPONSE_AUTHENTICATION_RESPONSE_PARAMETER_PRESENT; + decoded += size; + break; + case OGS_NAS_AUTHENTICATION_RESPONSE_EAP_MESSAGE_TYPE: + size = ogs_nas_decode_eap_message(&authentication_response->eap_message, pkbuf); + ogs_assert(size >= 0); + authentication_response->presencemask |= OGS_NAS_AUTHENTICATION_RESPONSE_EAP_MESSAGE_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_authentication_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_authentication_reject_t *authentication_reject = &message->gmm.authentication_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode AUTHENTICATION_REJECT\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_AUTHENTICATION_REJECT_EAP_MESSAGE_TYPE: + size = ogs_nas_decode_eap_message(&authentication_reject->eap_message, pkbuf); + ogs_assert(size >= 0); + authentication_reject->presencemask |= OGS_NAS_AUTHENTICATION_REJECT_EAP_MESSAGE_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_authentication_failure(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_authentication_failure_t *authentication_failure = &message->gmm.authentication_failure; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode AUTHENTICATION_FAILURE\n"); + + size = ogs_nas_decode_5gmm_cause(&authentication_failure->gmm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_TYPE: + size = ogs_nas_decode_authentication_failure_parameter(&authentication_failure->authentication_failure_parameter, pkbuf); + ogs_assert(size >= 0); + authentication_failure->presencemask |= OGS_NAS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_authentication_result(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_authentication_result_t *authentication_result = &message->gmm.authentication_result; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode AUTHENTICATION_RESULT\n"); + + size = ogs_nas_decode_key_set_identifier(&authentication_result->ngksi, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_eap_message(&authentication_result->eap_message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_AUTHENTICATION_RESULT_ABBA_TYPE: + size = ogs_nas_decode_abba(&authentication_result->abba, pkbuf); + ogs_assert(size >= 0); + authentication_result->presencemask |= OGS_NAS_AUTHENTICATION_RESULT_ABBA_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_identity_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_identity_request_t *identity_request = &message->gmm.identity_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode IDENTITY_REQUEST\n"); + + size = ogs_nas_decode_5gs_identity_type(&identity_request->identity_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_identity_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_identity_response_t *identity_response = &message->gmm.identity_response; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode IDENTITY_RESPONSE\n"); + + size = ogs_nas_decode_5gs_mobile_identity(&identity_response->mobile_identity, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_security_mode_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_security_mode_command_t *security_mode_command = &message->gmm.security_mode_command; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode SECURITY_MODE_COMMAND\n"); + + size = ogs_nas_decode_security_algorithms(&security_mode_command->selected_nas_security_algorithms, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_key_set_identifier(&security_mode_command->ngksi, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_ue_security_capability(&security_mode_command->replayed_ue_security_capabilities, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_TYPE: + size = ogs_nas_decode_imeisv_request(&security_mode_command->imeisv_request, pkbuf); + ogs_assert(size >= 0); + security_mode_command->presencemask |= OGS_NAS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT; + decoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMMAND_SELECTED_EPS_NAS_SECURITY_ALGORITHMS_TYPE: + size = ogs_nas_decode_eps_nas_security_algorithms(&security_mode_command->selected_eps_nas_security_algorithms, pkbuf); + ogs_assert(size >= 0); + security_mode_command->presencemask |= OGS_NAS_SECURITY_MODE_COMMAND_SELECTED_EPS_NAS_SECURITY_ALGORITHMS_PRESENT; + decoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMMAND_ADDITIONAL_5G_SECURITY_INFORMATION_TYPE: + size = ogs_nas_decode_additional_5g_security_information(&security_mode_command->additional_security_information, pkbuf); + ogs_assert(size >= 0); + security_mode_command->presencemask |= OGS_NAS_SECURITY_MODE_COMMAND_ADDITIONAL_5G_SECURITY_INFORMATION_PRESENT; + decoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMMAND_EAP_MESSAGE_TYPE: + size = ogs_nas_decode_eap_message(&security_mode_command->eap_message, pkbuf); + ogs_assert(size >= 0); + security_mode_command->presencemask |= OGS_NAS_SECURITY_MODE_COMMAND_EAP_MESSAGE_PRESENT; + decoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMMAND_ABBA_TYPE: + size = ogs_nas_decode_abba(&security_mode_command->abba, pkbuf); + ogs_assert(size >= 0); + security_mode_command->presencemask |= OGS_NAS_SECURITY_MODE_COMMAND_ABBA_PRESENT; + decoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMMAND_REPLAYED_S1_UE_SECURITY_CAPABILITIES_TYPE: + size = ogs_nas_decode_s1_ue_security_capability(&security_mode_command->replayed_s1_ue_security_capabilities, pkbuf); + ogs_assert(size >= 0); + security_mode_command->presencemask |= OGS_NAS_SECURITY_MODE_COMMAND_REPLAYED_S1_UE_SECURITY_CAPABILITIES_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_security_mode_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_security_mode_complete_t *security_mode_complete = &message->gmm.security_mode_complete; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode SECURITY_MODE_COMPLETE\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_SECURITY_MODE_COMPLETE_IMEISV_TYPE: + size = ogs_nas_decode_5gs_mobile_identity(&security_mode_complete->imeisv, pkbuf); + ogs_assert(size >= 0); + security_mode_complete->presencemask |= OGS_NAS_SECURITY_MODE_COMPLETE_IMEISV_PRESENT; + decoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMPLETE_NAS_MESSAGE_CONTAINER_TYPE: + size = ogs_nas_decode_message_container(&security_mode_complete->nas_message_container, pkbuf); + ogs_assert(size >= 0); + security_mode_complete->presencemask |= OGS_NAS_SECURITY_MODE_COMPLETE_NAS_MESSAGE_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMPLETE_NON_IMEISV_PEI_TYPE: + size = ogs_nas_decode_5gs_mobile_identity(&security_mode_complete->non_imeisv_pei, pkbuf); + ogs_assert(size >= 0); + security_mode_complete->presencemask |= OGS_NAS_SECURITY_MODE_COMPLETE_NON_IMEISV_PEI_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_security_mode_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_security_mode_reject_t *security_mode_reject = &message->gmm.security_mode_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode SECURITY_MODE_REJECT\n"); + + size = ogs_nas_decode_5gmm_cause(&security_mode_reject->gmm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_5gmm_status(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_5gmm_status_t *gmm_status = &message->gmm.gmm_status; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode 5GMM_STATUS\n"); + + size = ogs_nas_decode_5gmm_cause(&gmm_status->gmm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_notification(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_notification_t *notification = &message->gmm.notification; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode NOTIFICATION\n"); + + size = ogs_nas_decode_access_type(¬ification->access_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_notification_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_notification_response_t *notification_response = &message->gmm.notification_response; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode NOTIFICATION_RESPONSE\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_NOTIFICATION_RESPONSE_PDU_SESSION_STATUS_TYPE: + size = ogs_nas_decode_pdu_session_status(¬ification_response->pdu_session_status, pkbuf); + ogs_assert(size >= 0); + notification_response->presencemask |= OGS_NAS_NOTIFICATION_RESPONSE_PDU_SESSION_STATUS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_ul_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_ul_nas_transport_t *ul_nas_transport = &message->gmm.ul_nas_transport; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode UL_NAS_TRANSPORT\n"); + + size = ogs_nas_decode_payload_container_type(&ul_nas_transport->payload_container_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_payload_container(&ul_nas_transport->payload_container, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_UL_NAS_TRANSPORT_OLD_PDU_SESSION_ID_TYPE: + size = ogs_nas_decode_pdu_session_identity_2(&ul_nas_transport->old_pdu_session_id, pkbuf); + ogs_assert(size >= 0); + ul_nas_transport->presencemask |= OGS_NAS_UL_NAS_TRANSPORT_OLD_PDU_SESSION_ID_PRESENT; + decoded += size; + break; + case OGS_NAS_UL_NAS_TRANSPORT_REQUEST_TYPE_TYPE: + size = ogs_nas_decode_request_type(&ul_nas_transport->request_type, pkbuf); + ogs_assert(size >= 0); + ul_nas_transport->presencemask |= OGS_NAS_UL_NAS_TRANSPORT_REQUEST_TYPE_PRESENT; + decoded += size; + break; + case OGS_NAS_UL_NAS_TRANSPORT_S_NSSAI_TYPE: + size = ogs_nas_decode_s_nssai(&ul_nas_transport->s_nssai, pkbuf); + ogs_assert(size >= 0); + ul_nas_transport->presencemask |= OGS_NAS_UL_NAS_TRANSPORT_S_NSSAI_PRESENT; + decoded += size; + break; + case OGS_NAS_UL_NAS_TRANSPORT_DNN_TYPE: + size = ogs_nas_decode_dnn(&ul_nas_transport->dnn, pkbuf); + ogs_assert(size >= 0); + ul_nas_transport->presencemask |= OGS_NAS_UL_NAS_TRANSPORT_DNN_PRESENT; + decoded += size; + break; + case OGS_NAS_UL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE: + size = ogs_nas_decode_additional_information(&ul_nas_transport->additional_information, pkbuf); + ogs_assert(size >= 0); + ul_nas_transport->presencemask |= OGS_NAS_UL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT; + decoded += size; + break; + case OGS_NAS_UL_NAS_TRANSPORT_MA_PDU_SESSION_INFORMATION_TYPE: + size = ogs_nas_decode_ma_pdu_session_information(&ul_nas_transport->ma_pdu_session_information, pkbuf); + ogs_assert(size >= 0); + ul_nas_transport->presencemask |= OGS_NAS_UL_NAS_TRANSPORT_MA_PDU_SESSION_INFORMATION_PRESENT; + decoded += size; + break; + case OGS_NAS_UL_NAS_TRANSPORT_RELEASE_ASSISTANCE_INDICATION_TYPE: + size = ogs_nas_decode_release_assistance_indication(&ul_nas_transport->release_assistance_indication, pkbuf); + ogs_assert(size >= 0); + ul_nas_transport->presencemask |= OGS_NAS_UL_NAS_TRANSPORT_RELEASE_ASSISTANCE_INDICATION_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_dl_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_dl_nas_transport_t *dl_nas_transport = &message->gmm.dl_nas_transport; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode DL_NAS_TRANSPORT\n"); + + size = ogs_nas_decode_payload_container_type(&dl_nas_transport->payload_container_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_payload_container(&dl_nas_transport->payload_container, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_DL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE: + size = ogs_nas_decode_additional_information(&dl_nas_transport->additional_information, pkbuf); + ogs_assert(size >= 0); + dl_nas_transport->presencemask |= OGS_NAS_DL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT; + decoded += size; + break; + case OGS_NAS_DL_NAS_TRANSPORT_5GMM_CAUSE_TYPE: + size = ogs_nas_decode_5gmm_cause(&dl_nas_transport->gmm_cause, pkbuf); + ogs_assert(size >= 0); + dl_nas_transport->presencemask |= OGS_NAS_DL_NAS_TRANSPORT_5GMM_CAUSE_PRESENT; + decoded += size; + break; + case OGS_NAS_DL_NAS_TRANSPORT_BACK_OFF_TIMER_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(&dl_nas_transport->back_off_timer_value, pkbuf); + ogs_assert(size >= 0); + dl_nas_transport->presencemask |= OGS_NAS_DL_NAS_TRANSPORT_BACK_OFF_TIMER_VALUE_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdu_session_establishment_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdu_session_establishment_request_t *pdu_session_establishment_request = &message->gsm.pdu_session_establishment_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDU_SESSION_ESTABLISHMENT_REQUEST\n"); + + size = ogs_nas_decode_control_plane_service_type(&pdu_session_establishment_request->control_plane_service_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_CIOT_SMALL_DATA_CONTAINER_TYPE: + size = ogs_nas_decode_ciot_small_data_container(&pdu_session_establishment_request->ciot_small_data_container, pkbuf); + ogs_assert(size >= 0); + pdu_session_establishment_request->presencemask |= OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_CIOT_SMALL_DATA_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PAYLOAD_CONTAINER_TYPE_TYPE: + size = ogs_nas_decode_payload_container_type(&pdu_session_establishment_request->payload_container_type, pkbuf); + ogs_assert(size >= 0); + pdu_session_establishment_request->presencemask |= OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PAYLOAD_CONTAINER_TYPE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PAYLOAD_CONTAINER_TYPE: + size = ogs_nas_decode_payload_container(&pdu_session_establishment_request->payload_container, pkbuf); + ogs_assert(size >= 0); + pdu_session_establishment_request->presencemask |= OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PAYLOAD_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PDU_SESSION_STATUS_TYPE: + size = ogs_nas_decode_pdu_session_status(&pdu_session_establishment_request->pdu_session_status, pkbuf); + ogs_assert(size >= 0); + pdu_session_establishment_request->presencemask |= OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PDU_SESSION_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_RELEASE_ASSISTANCE_INDICATION_TYPE: + size = ogs_nas_decode_release_assistance_indication(&pdu_session_establishment_request->release_assistance_indication, pkbuf); + ogs_assert(size >= 0); + pdu_session_establishment_request->presencemask |= OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_RELEASE_ASSISTANCE_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_UPLINK_DATA_STATUS_TYPE: + size = ogs_nas_decode_uplink_data_status(&pdu_session_establishment_request->uplink_data_status, pkbuf); + ogs_assert(size >= 0); + pdu_session_establishment_request->presencemask |= OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_UPLINK_DATA_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_NAS_MESSAGE_CONTAINER_TYPE: + size = ogs_nas_decode_message_container(&pdu_session_establishment_request->nas_message_container, pkbuf); + ogs_assert(size >= 0); + pdu_session_establishment_request->presencemask |= OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_ADDITIONAL_INFORMATION_TYPE: + size = ogs_nas_decode_additional_information(&pdu_session_establishment_request->additional_information, pkbuf); + ogs_assert(size >= 0); + pdu_session_establishment_request->presencemask |= OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_ADDITIONAL_INFORMATION_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdu_session_establishment_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdu_session_establishment_accept_t *pdu_session_establishment_accept = &message->gsm.pdu_session_establishment_accept; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDU_SESSION_ESTABLISHMENT_ACCEPT\n"); + + size = ogs_nas_decode_s_nssai(&pdu_session_establishment_accept->s_nssai, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_eap_message(&pdu_session_establishment_accept->eap_message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_pdu_session_establishment_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdu_session_establishment_reject_t *pdu_session_establishment_reject = &message->gsm.pdu_session_establishment_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDU_SESSION_ESTABLISHMENT_REJECT\n"); + + size = ogs_nas_decode_s_nssai(&pdu_session_establishment_reject->s_nssai, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_eap_message(&pdu_session_establishment_reject->eap_message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_pdu_session_authentication_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdu_session_authentication_command_t *pdu_session_authentication_command = &message->gsm.pdu_session_authentication_command; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDU_SESSION_AUTHENTICATION_COMMAND\n"); + + size = ogs_nas_decode_s_nssai(&pdu_session_authentication_command->s_nssai, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_eap_message(&pdu_session_authentication_command->eap_message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_pdu_session_authentication_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdu_session_authentication_complete_t *pdu_session_authentication_complete = &message->gsm.pdu_session_authentication_complete; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDU_SESSION_AUTHENTICATION_COMPLETE\n"); + + size = ogs_nas_decode_integrity_protection_maximum_data_rate(&pdu_session_authentication_complete->integrity_protection_maximum_data_rate, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_PDU_SESSION_TYPE_TYPE: + size = ogs_nas_decode_pdu_session_type(&pdu_session_authentication_complete->pdu_session_type, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_complete->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_PDU_SESSION_TYPE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_SSC_MODE_TYPE: + size = ogs_nas_decode_ssc_mode(&pdu_session_authentication_complete->ssc_mode, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_complete->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_SSC_MODE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_5GSM_CAPABILITY_TYPE: + size = ogs_nas_decode_5gsm_capability(&pdu_session_authentication_complete->gsm_capability, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_complete->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_5GSM_CAPABILITY_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_TYPE: + size = ogs_nas_decode_maximum_number_of_supported_packet_filters(&pdu_session_authentication_complete->maximum_number_of_supported_packet_filters, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_complete->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_ALWAYS_ON_PDU_SESSION_REQUESTED_TYPE: + size = ogs_nas_decode_always_on_pdu_session_requested(&pdu_session_authentication_complete->always_on_pdu_session_requested, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_complete->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_ALWAYS_ON_PDU_SESSION_REQUESTED_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_SM_PDU_DN_REQUEST_CONTAINER_TYPE: + size = ogs_nas_decode_sm_pdu_dn_request_container(&pdu_session_authentication_complete->sm_pdu_dn_request_container, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_complete->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_SM_PDU_DN_REQUEST_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&pdu_session_authentication_complete->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_complete->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_HEADER_COMPRESSION_CONFIGURATION_TYPE: + size = ogs_nas_decode_header_compression_configuration(&pdu_session_authentication_complete->header_compression_configuration, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_complete->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_HEADER_COMPRESSION_CONFIGURATION_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_DS_TT_ETHERNET_PORT_MAC_ADDRESS_TYPE: + size = ogs_nas_decode_ds_tt_ethernet_port_mac_address(&pdu_session_authentication_complete->ds_tt_ethernet_port_mac_address, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_complete->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_DS_TT_ETHERNET_PORT_MAC_ADDRESS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_UE_DS_TT_RESIDENCE_TIME_TYPE: + size = ogs_nas_decode_ue_ds_tt_residence_time(&pdu_session_authentication_complete->ue_ds_tt_residence_time, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_complete->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_UE_DS_TT_RESIDENCE_TIME_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE: + size = ogs_nas_decode_port_management_information_container(&pdu_session_authentication_complete->port_management_information_container, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_complete->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdu_session_authentication_result(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdu_session_authentication_result_t *pdu_session_authentication_result = &message->gsm.pdu_session_authentication_result; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDU_SESSION_AUTHENTICATION_RESULT\n"); + + size = ogs_nas_decode_pdu_session_type(&pdu_session_authentication_result->selected_pdu_session_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_qos_rules(&pdu_session_authentication_result->authorized_qos_rules, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_session_ambr(&pdu_session_authentication_result->session_ambr, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_5GSM_CAUSE_TYPE: + size = ogs_nas_decode_5gsm_cause(&pdu_session_authentication_result->gsm_cause, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_result->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_5GSM_CAUSE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_PDU_ADDRESS_TYPE: + size = ogs_nas_decode_pdu_address(&pdu_session_authentication_result->pdu_address, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_result->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_PDU_ADDRESS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_RQ_TIMER_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer(&pdu_session_authentication_result->rq_timer_value, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_result->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_RQ_TIMER_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_S_NSSAI_TYPE: + size = ogs_nas_decode_s_nssai(&pdu_session_authentication_result->s_nssai, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_result->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_S_NSSAI_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_ALWAYS_ON_PDU_SESSION_INDICATION_TYPE: + size = ogs_nas_decode_always_on_pdu_session_indication(&pdu_session_authentication_result->always_on_pdu_session_indication, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_result->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_ALWAYS_ON_PDU_SESSION_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_MAPPED_EPS_BEARER_CONTEXTS_TYPE: + size = ogs_nas_decode_mapped_eps_bearer_contexts(&pdu_session_authentication_result->mapped_eps_bearer_contexts, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_result->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_MAPPED_EPS_BEARER_CONTEXTS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_EAP_MESSAGE_TYPE: + size = ogs_nas_decode_eap_message(&pdu_session_authentication_result->eap_message, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_result->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_EAP_MESSAGE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_TYPE: + size = ogs_nas_decode_qos_flow_descriptions(&pdu_session_authentication_result->authorized_qos_flow_descriptions, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_result->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&pdu_session_authentication_result->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_result->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_DNN_TYPE: + size = ogs_nas_decode_dnn(&pdu_session_authentication_result->dnn, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_result->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_DNN_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_5GSM_NETWORK_FEATURE_SUPPORT_TYPE: + size = ogs_nas_decode_5gsm_network_feature_support(&pdu_session_authentication_result->gsm_network_feature_support, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_result->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_5GSM_NETWORK_FEATURE_SUPPORT_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_SERVING_PLMN_RATE_CONTROL_TYPE: + size = ogs_nas_decode_serving_plmn_rate_control(&pdu_session_authentication_result->serving_plmn_rate_control, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_result->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_SERVING_PLMN_RATE_CONTROL_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_ATSSS_CONTAINER_TYPE: + size = ogs_nas_decode_atsss_container(&pdu_session_authentication_result->atsss_container, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_result->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_ATSSS_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_CONTROL_PLANE_ONLY_INDICATION_TYPE: + size = ogs_nas_decode_control_plane_only_indication(&pdu_session_authentication_result->control_plane_only_indication, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_result->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_CONTROL_PLANE_ONLY_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_HEADER_COMPRESSION_CONFIGURATION_TYPE: + size = ogs_nas_decode_header_compression_configuration(&pdu_session_authentication_result->header_compression_configuration, pkbuf); + ogs_assert(size >= 0); + pdu_session_authentication_result->presencemask |= OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_HEADER_COMPRESSION_CONFIGURATION_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdu_session_modification_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdu_session_modification_request_t *pdu_session_modification_request = &message->gsm.pdu_session_modification_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDU_SESSION_MODIFICATION_REQUEST\n"); + + size = ogs_nas_decode_5gsm_cause(&pdu_session_modification_request->gsm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_BACK_OFF_TIMER_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(&pdu_session_modification_request->back_off_timer_value, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_request->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_BACK_OFF_TIMER_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_ALLOWED_SSC_MODE_TYPE: + size = ogs_nas_decode_allowed_ssc_mode(&pdu_session_modification_request->allowed_ssc_mode, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_request->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_ALLOWED_SSC_MODE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_EAP_MESSAGE_TYPE: + size = ogs_nas_decode_eap_message(&pdu_session_modification_request->eap_message, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_request->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_EAP_MESSAGE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&pdu_session_modification_request->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_request->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_RE_ATTEMPT_INDICATOR_TYPE: + size = ogs_nas_decode_re_attempt_indicator(&pdu_session_modification_request->re_attempt_indicator, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_request->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_RE_ATTEMPT_INDICATOR_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_TYPE: + size = ogs_nas_decode_5gsm_congestion_re_attempt_indicator(&pdu_session_modification_request->gsm_congestion_re_attempt_indicator, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_request->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdu_session_modification_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdu_session_modification_reject_t *pdu_session_modification_reject = &message->gsm.pdu_session_modification_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDU_SESSION_MODIFICATION_REJECT\n"); + + size = ogs_nas_decode_eap_message(&pdu_session_modification_reject->eap_message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_PDU_SESSION_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&pdu_session_modification_reject->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_reject->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdu_session_modification_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdu_session_modification_command_t *pdu_session_modification_command = &message->gsm.pdu_session_modification_command; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDU_SESSION_MODIFICATION_COMMAND\n"); + + size = ogs_nas_decode_eap_message(&pdu_session_modification_command->eap_message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&pdu_session_modification_command->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_command->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdu_session_modification_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdu_session_modification_complete_t *pdu_session_modification_complete = &message->gsm.pdu_session_modification_complete; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDU_SESSION_MODIFICATION_COMPLETE\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_PDU_SESSION_MODIFICATION_COMPLETE_EAP_MESSAGE_TYPE: + size = ogs_nas_decode_eap_message(&pdu_session_modification_complete->eap_message, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_complete->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_COMPLETE_EAP_MESSAGE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&pdu_session_modification_complete->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_complete->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdu_session_modification_command_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdu_session_modification_command_reject_t *pdu_session_modification_command_reject = &message->gsm.pdu_session_modification_command_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDU_SESSION_MODIFICATION_COMMAND_REJECT\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_5GSM_CAPABILITY_TYPE: + size = ogs_nas_decode_5gsm_capability(&pdu_session_modification_command_reject->gsm_capability, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_command_reject->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_5GSM_CAPABILITY_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_5GSM_CAUSE_TYPE: + size = ogs_nas_decode_5gsm_cause(&pdu_session_modification_command_reject->gsm_cause, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_command_reject->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_5GSM_CAUSE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_TYPE: + size = ogs_nas_decode_maximum_number_of_supported_packet_filters(&pdu_session_modification_command_reject->maximum_number_of_supported_packet_filters, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_command_reject->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_ALWAYS_ON_PDU_SESSION_REQUESTED_TYPE: + size = ogs_nas_decode_always_on_pdu_session_requested(&pdu_session_modification_command_reject->always_on_pdu_session_requested, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_command_reject->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_ALWAYS_ON_PDU_SESSION_REQUESTED_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_INTEGRITY_PROTECTION_MAXIMUM_DATA_RATE_TYPE: + size = ogs_nas_decode_integrity_protection_maximum_data_rate(&pdu_session_modification_command_reject->integrity_protection_maximum_data_rate, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_command_reject->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_INTEGRITY_PROTECTION_MAXIMUM_DATA_RATE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_REQUESTED_QOS_RULES_TYPE: + size = ogs_nas_decode_qos_rules(&pdu_session_modification_command_reject->requested_qos_rules, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_command_reject->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_REQUESTED_QOS_RULES_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_REQUESTED_QOS_FLOW_DESCRIPTIONS_TYPE: + size = ogs_nas_decode_qos_flow_descriptions(&pdu_session_modification_command_reject->requested_qos_flow_descriptions, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_command_reject->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_REQUESTED_QOS_FLOW_DESCRIPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_MAPPED_EPS_BEARER_CONTEXTS_TYPE: + size = ogs_nas_decode_mapped_eps_bearer_contexts(&pdu_session_modification_command_reject->mapped_eps_bearer_contexts, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_command_reject->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_MAPPED_EPS_BEARER_CONTEXTS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&pdu_session_modification_command_reject->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_command_reject->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE: + size = ogs_nas_decode_port_management_information_container(&pdu_session_modification_command_reject->port_management_information_container, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_command_reject->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_HEADER_COMPRESSION_CONFIGURATION_TYPE: + size = ogs_nas_decode_header_compression_configuration(&pdu_session_modification_command_reject->header_compression_configuration, pkbuf); + ogs_assert(size >= 0); + pdu_session_modification_command_reject->presencemask |= OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_HEADER_COMPRESSION_CONFIGURATION_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdu_session_release_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdu_session_release_request_t *pdu_session_release_request = &message->gsm.pdu_session_release_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDU_SESSION_RELEASE_REQUEST\n"); + + size = ogs_nas_decode_5gsm_cause(&pdu_session_release_request->gsm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_PDU_SESSION_RELEASE_REQUEST_BACK_OFF_TIMER_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(&pdu_session_release_request->back_off_timer_value, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_request->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REQUEST_BACK_OFF_TIMER_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&pdu_session_release_request->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_request->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REQUEST_RE_ATTEMPT_INDICATOR_TYPE: + size = ogs_nas_decode_re_attempt_indicator(&pdu_session_release_request->re_attempt_indicator, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_request->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REQUEST_RE_ATTEMPT_INDICATOR_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REQUEST_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_TYPE: + size = ogs_nas_decode_5gsm_congestion_re_attempt_indicator(&pdu_session_release_request->gsm_congestion_re_attempt_indicator, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_request->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REQUEST_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdu_session_release_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdu_session_release_reject_t *pdu_session_release_reject = &message->gsm.pdu_session_release_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDU_SESSION_RELEASE_REJECT\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_PDU_SESSION_RELEASE_REJECT_5GSM_CAUSE_TYPE: + size = ogs_nas_decode_5gsm_cause(&pdu_session_release_reject->gsm_cause, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_reject->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REJECT_5GSM_CAUSE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REJECT_SESSION_AMBR_TYPE: + size = ogs_nas_decode_session_ambr(&pdu_session_release_reject->session_ambr, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_reject->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REJECT_SESSION_AMBR_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REJECT_RQ_TIMER_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer(&pdu_session_release_reject->rq_timer_value, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_reject->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REJECT_RQ_TIMER_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REJECT_ALWAYS_ON_PDU_SESSION_INDICATION_TYPE: + size = ogs_nas_decode_always_on_pdu_session_indication(&pdu_session_release_reject->always_on_pdu_session_indication, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_reject->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REJECT_ALWAYS_ON_PDU_SESSION_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REJECT_AUTHORIZED_QOS_RULES_TYPE: + size = ogs_nas_decode_qos_rules(&pdu_session_release_reject->authorized_qos_rules, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_reject->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REJECT_AUTHORIZED_QOS_RULES_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REJECT_MAPPED_EPS_BEARER_CONTEXTS_TYPE: + size = ogs_nas_decode_mapped_eps_bearer_contexts(&pdu_session_release_reject->mapped_eps_bearer_contexts, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_reject->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REJECT_MAPPED_EPS_BEARER_CONTEXTS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REJECT_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_TYPE: + size = ogs_nas_decode_qos_flow_descriptions(&pdu_session_release_reject->authorized_qos_flow_descriptions, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_reject->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REJECT_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&pdu_session_release_reject->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_reject->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REJECT_ATSSS_CONTAINER_TYPE: + size = ogs_nas_decode_atsss_container(&pdu_session_release_reject->atsss_container, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_reject->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REJECT_ATSSS_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REJECT_HEADER_COMPRESSION_CONFIGURATION_TYPE: + size = ogs_nas_decode_header_compression_configuration(&pdu_session_release_reject->header_compression_configuration, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_reject->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REJECT_HEADER_COMPRESSION_CONFIGURATION_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REJECT_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE: + size = ogs_nas_decode_port_management_information_container(&pdu_session_release_reject->port_management_information_container, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_reject->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REJECT_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REJECT_SERVING_PLMN_RATE_CONTROL_TYPE: + size = ogs_nas_decode_serving_plmn_rate_control(&pdu_session_release_reject->serving_plmn_rate_control, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_reject->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_REJECT_SERVING_PLMN_RATE_CONTROL_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdu_session_release_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdu_session_release_command_t *pdu_session_release_command = &message->gsm.pdu_session_release_command; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDU_SESSION_RELEASE_COMMAND\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_PDU_SESSION_RELEASE_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&pdu_session_release_command->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_command->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_COMMAND_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE: + size = ogs_nas_decode_port_management_information_container(&pdu_session_release_command->port_management_information_container, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_command->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_COMMAND_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdu_session_release_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdu_session_release_complete_t *pdu_session_release_complete = &message->gsm.pdu_session_release_complete; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDU_SESSION_RELEASE_COMPLETE\n"); + + size = ogs_nas_decode_5gsm_cause(&pdu_session_release_complete->gsm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_PDU_SESSION_RELEASE_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&pdu_session_release_complete->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdu_session_release_complete->presencemask |= OGS_NAS_PDU_SESSION_RELEASE_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_5gsm_status(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_5gsm_status_t *gsm_status = &message->gsm.gsm_status; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode 5GSM_STATUS\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { + case OGS_NAS_5GSM_STATUS_5GSM_CAUSE_TYPE: + size = ogs_nas_decode_5gsm_cause(&gsm_status->gsm_cause, pkbuf); + ogs_assert(size >= 0); + gsm_status->presencemask |= OGS_NAS_5GSM_STATUS_5GSM_CAUSE_PRESENT; + decoded += size; + break; + case OGS_NAS_5GSM_STATUS_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&gsm_status->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + gsm_status->presencemask |= OGS_NAS_5GSM_STATUS_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_5gmm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + int size = 0; + uint16_t decoded = 0; + + ogs_assert(pkbuf); + ogs_assert(pkbuf->data); + ogs_assert(pkbuf->len); + + memset(message, 0, sizeof(ogs_nas_message_t)); + + size = sizeof(ogs_nas_5gmm_header_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(&message->gmm.h, pkbuf->data - size, size); + decoded += size; + + switch(message->gmm.h.message_type) { + case OGS_NAS_REGISTRATION_REQUEST: + size = ogs_nas_decode_registration_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT: + size = ogs_nas_decode_registration_accept(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_REGISTRATION_COMPLETE: + size = ogs_nas_decode_registration_complete(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_REGISTRATION_REJECT: + size = ogs_nas_decode_registration_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_DEREGISTRATION_REQUEST: + size = ogs_nas_decode_deregistration_request_from_ue(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_DEREGISTRATION_ACCEPT: + break; + case OGS_NAS_SERVICE_REQUEST: + size = ogs_nas_decode_service_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_SERVICE_REJECT: + size = ogs_nas_decode_service_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_SERVICE_ACCEPT: + size = ogs_nas_decode_service_accept(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND: + size = ogs_nas_decode_configuration_update_command(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMPLETE: + size = ogs_nas_decode_configuration_update_complete(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_AUTHENTICATION_REQUEST: + size = ogs_nas_decode_authentication_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_AUTHENTICATION_RESPONSE: + size = ogs_nas_decode_authentication_response(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_AUTHENTICATION_REJECT: + size = ogs_nas_decode_authentication_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_AUTHENTICATION_FAILURE: + size = ogs_nas_decode_authentication_failure(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_AUTHENTICATION_RESULT: + size = ogs_nas_decode_authentication_result(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_IDENTITY_REQUEST: + size = ogs_nas_decode_identity_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_IDENTITY_RESPONSE: + size = ogs_nas_decode_identity_response(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMMAND: + size = ogs_nas_decode_security_mode_command(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMPLETE: + size = ogs_nas_decode_security_mode_complete(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_SECURITY_MODE_REJECT: + size = ogs_nas_decode_security_mode_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_5GMM_STATUS: + size = ogs_nas_decode_5gmm_status(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_NOTIFICATION: + size = ogs_nas_decode_notification(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_NOTIFICATION_RESPONSE: + size = ogs_nas_decode_notification_response(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_UL_NAS_TRANSPORT: + size = ogs_nas_decode_ul_nas_transport(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_DL_NAS_TRANSPORT: + size = ogs_nas_decode_dl_nas_transport(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->gmm.h.message_type); + break; + } + + ogs_assert(ogs_pkbuf_push(pkbuf, decoded)); + + return OGS_OK; +} +int ogs_nas_5gsm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + int size = 0; + uint16_t decoded = 0; + + ogs_assert(pkbuf); + ogs_assert(pkbuf->data); + ogs_assert(pkbuf->len); + + memset(message, 0, sizeof(ogs_nas_message_t)); + + size = sizeof(ogs_nas_5gsm_header_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(&message->gsm.h, pkbuf->data - size, size); + decoded += size; + + switch(message->gsm.h.message_type) { + case OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST: + size = ogs_nas_decode_pdu_session_establishment_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDU_SESSION_ESTABLISHMENT_ACCEPT: + size = ogs_nas_decode_pdu_session_establishment_accept(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDU_SESSION_ESTABLISHMENT_REJECT: + size = ogs_nas_decode_pdu_session_establishment_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_COMMAND: + size = ogs_nas_decode_pdu_session_authentication_command(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE: + size = ogs_nas_decode_pdu_session_authentication_complete(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT: + size = ogs_nas_decode_pdu_session_authentication_result(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST: + size = ogs_nas_decode_pdu_session_modification_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_REJECT: + size = ogs_nas_decode_pdu_session_modification_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND: + size = ogs_nas_decode_pdu_session_modification_command(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMPLETE: + size = ogs_nas_decode_pdu_session_modification_complete(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT: + size = ogs_nas_decode_pdu_session_modification_command_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REQUEST: + size = ogs_nas_decode_pdu_session_release_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REJECT: + size = ogs_nas_decode_pdu_session_release_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_COMMAND: + size = ogs_nas_decode_pdu_session_release_command(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_COMPLETE: + size = ogs_nas_decode_pdu_session_release_complete(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_5GSM_STATUS: + size = ogs_nas_decode_5gsm_status(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->gsm.h.message_type); + break; + } + + ogs_assert(ogs_pkbuf_push(pkbuf, decoded)); + + return OGS_OK; +} + diff --git a/lib/nas/5gs/encoder.c b/lib/nas/5gs/encoder.c new file mode 100644 index 0000000000..b7cc5694ae --- /dev/null +++ b/lib/nas/5gs/encoder.c @@ -0,0 +1,3187 @@ +/* + * The MIT License + * + * Copyright (C) 2019,2020 by Sukchan Lee + * + * This file is part of Open5GS. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/******************************************************************************* + * This file had been created by nas-message.py script v0.2.0 + * Please do not modify this file but regenerate it via script. + * Created on: 2020-05-21 21:20:09.052256 by acetcom + * from 24501-g41.docx + ******************************************************************************/ + +#include "ogs-nas-5gs.h" + +int ogs_nas_encode_registration_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_registration_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_registration_complete(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_registration_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_deregistration_request_from_ue(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_deregistration_request_to_ue(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_service_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_service_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_service_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_configuration_update_command(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_configuration_update_complete(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_authentication_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_authentication_response(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_authentication_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_authentication_failure(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_authentication_result(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_identity_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_identity_response(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_security_mode_command(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_security_mode_complete(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_security_mode_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_5gmm_status(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_notification(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_notification_response(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_ul_nas_transport(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_dl_nas_transport(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_pdu_session_establishment_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_pdu_session_establishment_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_pdu_session_establishment_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_pdu_session_authentication_command(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_pdu_session_authentication_complete(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_pdu_session_authentication_result(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_pdu_session_modification_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_pdu_session_modification_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_pdu_session_modification_command(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_pdu_session_modification_complete(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_pdu_session_modification_command_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_pdu_session_release_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_pdu_session_release_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_pdu_session_release_command(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_pdu_session_release_complete(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_5gsm_status(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); +int ogs_nas_encode_registration_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_registration_request_t *registration_request = &message->gmm.registration_request; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode REGISTRATION_REQUEST"); + + size = ogs_nas_encode_5gs_registration_type(pkbuf, ®istration_request->registration_type); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_mobile_identity(pkbuf, ®istration_request->mobile_identity); + ogs_assert(size >= 0); + encoded += size; + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_PRESENT) { + registration_request->non_current_native_nas_key_set_identifier.type = (OGS_NAS_REGISTRATION_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_TYPE >> 4); + + size = ogs_nas_encode_key_set_identifier(pkbuf, ®istration_request->non_current_native_nas_key_set_identifier); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_5GMM_CAPABILITY_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gmm_capability(pkbuf, ®istration_request->gmm_capability); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_ue_security_capability(pkbuf, ®istration_request->ue_security_capability); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_REQUESTED_NSSAI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_REQUESTED_NSSAI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_nssai(pkbuf, ®istration_request->requested_nssai); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_tracking_area_identity(pkbuf, ®istration_request->last_visited_registered_tai); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_S1_UE_NETWORK_CAPABILITY_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_S1_UE_NETWORK_CAPABILITY_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_s1_ue_network_capability(pkbuf, ®istration_request->s1_ue_network_capability); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_UPLINK_DATA_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_UPLINK_DATA_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_uplink_data_status(pkbuf, ®istration_request->uplink_data_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_PDU_SESSION_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_PDU_SESSION_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_pdu_session_status(pkbuf, ®istration_request->pdu_session_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_MICO_INDICATION_PRESENT) { + registration_request->mico_indication.type = (OGS_NAS_REGISTRATION_REQUEST_MICO_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_mico_indication(pkbuf, ®istration_request->mico_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_UE_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_UE_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_ue_status(pkbuf, ®istration_request->ue_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_ADDITIONAL_GUTI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_ADDITIONAL_GUTI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_mobile_identity(pkbuf, ®istration_request->additional_guti); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_ALLOWED_PDU_SESSION_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_ALLOWED_PDU_SESSION_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_allowed_pdu_session_status(pkbuf, ®istration_request->allowed_pdu_session_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_UE_USAGE_SETTING_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_UE_USAGE_SETTING_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_ue_usage_setting(pkbuf, ®istration_request->ue_usage_setting); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_REQUESTED_DRX_PARAMETERS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_REQUESTED_DRX_PARAMETERS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_drx_parameters(pkbuf, ®istration_request->requested_drx_parameters); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_EPS_NAS_MESSAGE_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_EPS_NAS_MESSAGE_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eps_nas_message_container(pkbuf, ®istration_request->eps_nas_message_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_LADN_INDICATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_LADN_INDICATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_ladn_indication(pkbuf, ®istration_request->ladn_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_TYPE_PRESENT) { + registration_request->payload_container_type.type = (OGS_NAS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_TYPE_TYPE >> 4); + + size = ogs_nas_encode_payload_container_type(pkbuf, ®istration_request->payload_container_type); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_payload_container(pkbuf, ®istration_request->payload_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_NETWORK_SLICING_INDICATION_PRESENT) { + registration_request->network_slicing_indication.type = (OGS_NAS_REGISTRATION_REQUEST_NETWORK_SLICING_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_network_slicing_indication(pkbuf, ®istration_request->network_slicing_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_5GS_UPDATE_TYPE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_5GS_UPDATE_TYPE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_update_type(pkbuf, ®istration_request->update_type); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_MOBILE_STATION_CLASSMARK_2_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_mobile_station_classmark_2(pkbuf, ®istration_request->mobile_station_classmark_2); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_SUPPORTED_CODECS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_SUPPORTED_CODECS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_supported_codec_list(pkbuf, ®istration_request->supported_codecs); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_message_container(pkbuf, ®istration_request->nas_message_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_EPS_BEARER_CONTEXT_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eps_bearer_context_status(pkbuf, ®istration_request->eps_bearer_context_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_REQUESTED_EXTENDED_DRX_PARAMETERS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_REQUESTED_EXTENDED_DRX_PARAMETERS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_extended_drx_parameters(pkbuf, ®istration_request->requested_extended_drx_parameters); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_T3324_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_T3324_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_3(pkbuf, ®istration_request->t3324_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_UE_RADIO_CAPABILITY_ID_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_UE_RADIO_CAPABILITY_ID_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_ue_radio_capability_id(pkbuf, ®istration_request->ue_radio_capability_id); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_REQUESTED_MAPPED_NSSAI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_REQUESTED_MAPPED_NSSAI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_mapped_nssai(pkbuf, ®istration_request->requested_mapped_nssai); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_additional_information_requested(pkbuf, ®istration_request->additional_information_requested); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_wus_assistance_information(pkbuf, ®istration_request->requested_wus_assistance_information); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_request->presencemask & OGS_NAS_REGISTRATION_REQUEST_N5GC_INDICATION_PRESENT) { + registration_request->n5gc_indication.type = OGS_NAS_REGISTRATION_REQUEST_N5GC_INDICATION_TYPE; + + size = ogs_nas_encode_n5gc_indication(pkbuf, ®istration_request->n5gc_indication); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_registration_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_registration_accept_t *registration_accept = &message->gmm.registration_accept; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode REGISTRATION_ACCEPT"); + + size = ogs_nas_encode_5gs_registration_result(pkbuf, ®istration_accept->registration_result); + ogs_assert(size >= 0); + encoded += size; + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_5G_GUTI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_5G_GUTI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_mobile_identity(pkbuf, ®istration_accept->guti); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_EQUIVALENT_PLMNS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_EQUIVALENT_PLMNS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_plmn_list(pkbuf, ®istration_accept->equivalent_plmns); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_TAI_LIST_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_TAI_LIST_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_tracking_area_identity_list(pkbuf, ®istration_accept->tai_list); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_ALLOWED_NSSAI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_ALLOWED_NSSAI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_nssai(pkbuf, ®istration_accept->allowed_nssai); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_REJECTED_NSSAI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_REJECTED_NSSAI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_rejected_nssai(pkbuf, ®istration_accept->rejected_nssai); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_CONFIGURED_NSSAI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_CONFIGURED_NSSAI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_nssai(pkbuf, ®istration_accept->configured_nssai); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_5GS_NETWORK_FEATURE_SUPPORT_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_5GS_NETWORK_FEATURE_SUPPORT_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_network_feature_support(pkbuf, ®istration_accept->network_feature_support); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_pdu_session_status(pkbuf, ®istration_accept->pdu_session_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_pdu_session_reactivation_result(pkbuf, ®istration_accept->pdu_session_reactivation_result); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_pdu_session_reactivation_result_error_cause(pkbuf, ®istration_accept->pdu_session_reactivation_result_error_cause); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_LADN_INFORMATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_LADN_INFORMATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_ladn_information(pkbuf, ®istration_accept->ladn_information); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_MICO_INDICATION_PRESENT) { + registration_accept->mico_indication.type = (OGS_NAS_REGISTRATION_ACCEPT_MICO_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_mico_indication(pkbuf, ®istration_accept->mico_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_NETWORK_SLICING_INDICATION_PRESENT) { + registration_accept->network_slicing_indication.type = (OGS_NAS_REGISTRATION_ACCEPT_NETWORK_SLICING_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_network_slicing_indication(pkbuf, ®istration_accept->network_slicing_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_SERVICE_AREA_LIST_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_SERVICE_AREA_LIST_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_service_area_list(pkbuf, ®istration_accept->service_area_list); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_T3512_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_T3512_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_3(pkbuf, ®istration_accept->t3512_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_NON_3GPP_DE_REGISTRATION_TIMER_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_NON_3GPP_DE_REGISTRATION_TIMER_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_2(pkbuf, ®istration_accept->non_3gpp_de_registration_timer_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_T3502_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_T3502_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_2(pkbuf, ®istration_accept->t3502_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_EMERGENCY_NUMBER_LIST_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_emergency_number_list(pkbuf, ®istration_accept->emergency_number_list); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_extended_emergency_number_list(pkbuf, ®istration_accept->extended_emergency_number_list); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_SOR_TRANSPARENT_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_SOR_TRANSPARENT_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_sor_transparent_container(pkbuf, ®istration_accept->sor_transparent_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_EAP_MESSAGE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_EAP_MESSAGE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eap_message(pkbuf, ®istration_accept->eap_message); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_NSSAI_INCLUSION_MODE_PRESENT) { + registration_accept->nssai_inclusion_mode.type = (OGS_NAS_REGISTRATION_ACCEPT_NSSAI_INCLUSION_MODE_TYPE >> 4); + + size = ogs_nas_encode_nssai_inclusion_mode(pkbuf, ®istration_accept->nssai_inclusion_mode); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_operator_defined_access_category_definitions(pkbuf, ®istration_accept->operator_defined_access_category_definitions); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_DRX_PARAMETERS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_DRX_PARAMETERS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_drx_parameters(pkbuf, ®istration_accept->negotiated_drx_parameters); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_NON_3GPP_NW_POLICIES_PRESENT) { + registration_accept->non_3gpp_nw_policies.type = (OGS_NAS_REGISTRATION_ACCEPT_NON_3GPP_NW_POLICIES_TYPE >> 4); + + size = ogs_nas_encode_non_3gpp_nw_provided_policies(pkbuf, ®istration_accept->non_3gpp_nw_policies); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_EPS_BEARER_CONTEXT_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_EPS_BEARER_CONTEXT_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eps_bearer_context_status(pkbuf, ®istration_accept->eps_bearer_context_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_EXTENDED_DRX_PARAMETERS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_EXTENDED_DRX_PARAMETERS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_extended_drx_parameters(pkbuf, ®istration_accept->negotiated_extended_drx_parameters); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_T3447_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_T3447_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_3(pkbuf, ®istration_accept->t3447_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_T3448_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_T3448_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_3(pkbuf, ®istration_accept->t3448_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_T3324_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_T3324_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_3(pkbuf, ®istration_accept->t3324_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_ue_radio_capability_id(pkbuf, ®istration_accept->ue_radio_capability_id); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_PRESENT) { + registration_accept->ue_radio_capability_id_deletion_indication.type = (OGS_NAS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_ue_radio_capability_id_deletion_indication(pkbuf, ®istration_accept->ue_radio_capability_id_deletion_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_PENDING_NSSAI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_PENDING_NSSAI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_nssai(pkbuf, ®istration_accept->pending_nssai); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_CIPHERING_KEY_DATA_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_CIPHERING_KEY_DATA_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_ciphering_key_data(pkbuf, ®istration_accept->ciphering_key_data); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_CAG_INFORMATION_LIST_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_CAG_INFORMATION_LIST_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_cag_information_list(pkbuf, ®istration_accept->cag_information_list); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_TRUNCATED_5G_S_TMSI_CONFIGURATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_TRUNCATED_5G_S_TMSI_CONFIGURATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_truncated_5g_s_tmsi_configuration(pkbuf, ®istration_accept->truncated_s_tmsi_configuration); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_accept->presencemask & OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_WUS_ASSISTANCE_INFORMATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_WUS_ASSISTANCE_INFORMATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_wus_assistance_information(pkbuf, ®istration_accept->negotiated_wus_assistance_information); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_registration_complete(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_registration_complete_t *registration_complete = &message->gmm.registration_complete; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode REGISTRATION_COMPLETE"); + + if (registration_complete->presencemask & OGS_NAS_REGISTRATION_COMPLETE_SOR_TRANSPARENT_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_COMPLETE_SOR_TRANSPARENT_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_sor_transparent_container(pkbuf, ®istration_complete->sor_transparent_container); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_registration_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_registration_reject_t *registration_reject = &message->gmm.registration_reject; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode REGISTRATION_REJECT"); + + size = ogs_nas_encode_5gmm_cause(pkbuf, ®istration_reject->gmm_cause); + ogs_assert(size >= 0); + encoded += size; + + if (registration_reject->presencemask & OGS_NAS_REGISTRATION_REJECT_T3346_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REJECT_T3346_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_2(pkbuf, ®istration_reject->t3346_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_reject->presencemask & OGS_NAS_REGISTRATION_REJECT_T3502_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REJECT_T3502_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_2(pkbuf, ®istration_reject->t3502_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_reject->presencemask & OGS_NAS_REGISTRATION_REJECT_EAP_MESSAGE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REJECT_EAP_MESSAGE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eap_message(pkbuf, ®istration_reject->eap_message); + ogs_assert(size >= 0); + encoded += size; + } + + if (registration_reject->presencemask & OGS_NAS_REGISTRATION_REJECT_REJECTED_NSSAI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_REGISTRATION_REJECT_REJECTED_NSSAI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_rejected_nssai(pkbuf, ®istration_reject->rejected_nssai); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_deregistration_request_from_ue(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_deregistration_request_from_ue_t *deregistration_request_from_ue = &message->gmm.deregistration_request_from_ue; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode DEREGISTRATION_REQUEST"); + + size = ogs_nas_encode_de_registration_type(pkbuf, &deregistration_request_from_ue->de_registration_type); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_mobile_identity(pkbuf, &deregistration_request_from_ue->mobile_identity); + ogs_assert(size >= 0); + encoded += size; + + return encoded; +} + +int ogs_nas_encode_deregistration_request_to_ue(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_deregistration_request_to_ue_t *deregistration_request_to_ue = &message->gmm.deregistration_request_to_ue; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode DEREGISTRATION_REQUEST"); + + size = ogs_nas_encode_de_registration_type(pkbuf, &deregistration_request_to_ue->de_registration_type); + ogs_assert(size >= 0); + encoded += size; + + if (deregistration_request_to_ue->presencemask & OGS_NAS_DEREGISTRATION_REQUEST_5GMM_CAUSE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_DEREGISTRATION_REQUEST_5GMM_CAUSE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gmm_cause(pkbuf, &deregistration_request_to_ue->gmm_cause); + ogs_assert(size >= 0); + encoded += size; + } + + if (deregistration_request_to_ue->presencemask & OGS_NAS_DEREGISTRATION_REQUEST_T3346_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_DEREGISTRATION_REQUEST_T3346_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_2(pkbuf, &deregistration_request_to_ue->t3346_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (deregistration_request_to_ue->presencemask & OGS_NAS_DEREGISTRATION_REQUEST_REJECTED_NSSAI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_DEREGISTRATION_REQUEST_REJECTED_NSSAI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_rejected_nssai(pkbuf, &deregistration_request_to_ue->rejected_nssai); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_service_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_service_request_t *service_request = &message->gmm.service_request; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode SERVICE_REQUEST"); + + size = ogs_nas_encode_key_set_identifier(pkbuf, &service_request->ngksi); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_mobile_identity(pkbuf, &service_request->s_tmsi); + ogs_assert(size >= 0); + encoded += size; + + if (service_request->presencemask & OGS_NAS_SERVICE_REQUEST_UPLINK_DATA_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SERVICE_REQUEST_UPLINK_DATA_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_uplink_data_status(pkbuf, &service_request->uplink_data_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (service_request->presencemask & OGS_NAS_SERVICE_REQUEST_PDU_SESSION_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SERVICE_REQUEST_PDU_SESSION_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_pdu_session_status(pkbuf, &service_request->pdu_session_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (service_request->presencemask & OGS_NAS_SERVICE_REQUEST_ALLOWED_PDU_SESSION_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SERVICE_REQUEST_ALLOWED_PDU_SESSION_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_allowed_pdu_session_status(pkbuf, &service_request->allowed_pdu_session_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (service_request->presencemask & OGS_NAS_SERVICE_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SERVICE_REQUEST_NAS_MESSAGE_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_message_container(pkbuf, &service_request->nas_message_container); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_service_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_service_reject_t *service_reject = &message->gmm.service_reject; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode SERVICE_REJECT"); + + size = ogs_nas_encode_5gmm_cause(pkbuf, &service_reject->gmm_cause); + ogs_assert(size >= 0); + encoded += size; + + if (service_reject->presencemask & OGS_NAS_SERVICE_REJECT_PDU_SESSION_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SERVICE_REJECT_PDU_SESSION_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_pdu_session_status(pkbuf, &service_reject->pdu_session_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (service_reject->presencemask & OGS_NAS_SERVICE_REJECT_T3346_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SERVICE_REJECT_T3346_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_2(pkbuf, &service_reject->t3346_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (service_reject->presencemask & OGS_NAS_SERVICE_REJECT_EAP_MESSAGE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SERVICE_REJECT_EAP_MESSAGE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eap_message(pkbuf, &service_reject->eap_message); + ogs_assert(size >= 0); + encoded += size; + } + + if (service_reject->presencemask & OGS_NAS_SERVICE_REJECT_T3448_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SERVICE_REJECT_T3448_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_3(pkbuf, &service_reject->t3448_value); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_service_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_service_accept_t *service_accept = &message->gmm.service_accept; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode SERVICE_ACCEPT"); + + if (service_accept->presencemask & OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_pdu_session_status(pkbuf, &service_accept->pdu_session_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (service_accept->presencemask & OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_pdu_session_reactivation_result(pkbuf, &service_accept->pdu_session_reactivation_result); + ogs_assert(size >= 0); + encoded += size; + } + + if (service_accept->presencemask & OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_pdu_session_reactivation_result_error_cause(pkbuf, &service_accept->pdu_session_reactivation_result_error_cause); + ogs_assert(size >= 0); + encoded += size; + } + + if (service_accept->presencemask & OGS_NAS_SERVICE_ACCEPT_EAP_MESSAGE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SERVICE_ACCEPT_EAP_MESSAGE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eap_message(pkbuf, &service_accept->eap_message); + ogs_assert(size >= 0); + encoded += size; + } + + if (service_accept->presencemask & OGS_NAS_SERVICE_ACCEPT_T3448_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SERVICE_ACCEPT_T3448_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_3(pkbuf, &service_accept->t3448_value); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_configuration_update_command(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_configuration_update_command_t *configuration_update_command = &message->gmm.configuration_update_command; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode CONFIGURATION_UPDATE_COMMAND"); + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CONFIGURATION_UPDATE_INDICATION_PRESENT) { + configuration_update_command->configuration_update_indication.type = (OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CONFIGURATION_UPDATE_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_configuration_update_indication(pkbuf, &configuration_update_command->configuration_update_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_5G_GUTI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_5G_GUTI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_mobile_identity(pkbuf, &configuration_update_command->guti); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_TAI_LIST_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_TAI_LIST_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_tracking_area_identity_list(pkbuf, &configuration_update_command->tai_list); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_ALLOWED_NSSAI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_ALLOWED_NSSAI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_nssai(pkbuf, &configuration_update_command->allowed_nssai); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SERVICE_AREA_LIST_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SERVICE_AREA_LIST_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_service_area_list(pkbuf, &configuration_update_command->service_area_list); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_FULL_NAME_FOR_NETWORK_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_FULL_NAME_FOR_NETWORK_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_network_name(pkbuf, &configuration_update_command->full_name_for_network); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SHORT_NAME_FOR_NETWORK_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SHORT_NAME_FOR_NETWORK_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_network_name(pkbuf, &configuration_update_command->short_name_for_network); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_LOCAL_TIME_ZONE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_LOCAL_TIME_ZONE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_time_zone(pkbuf, &configuration_update_command->local_time_zone); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_time_zone_and_time(pkbuf, &configuration_update_command->universal_time_and_local_time_zone); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_NETWORK_DAYLIGHT_SAVING_TIME_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_NETWORK_DAYLIGHT_SAVING_TIME_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_daylight_saving_time(pkbuf, &configuration_update_command->network_daylight_saving_time); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_LADN_INFORMATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_LADN_INFORMATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_ladn_information(pkbuf, &configuration_update_command->ladn_information); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_MICO_INDICATION_PRESENT) { + configuration_update_command->mico_indication.type = (OGS_NAS_CONFIGURATION_UPDATE_COMMAND_MICO_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_mico_indication(pkbuf, &configuration_update_command->mico_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_NETWORK_SLICING_INDICATION_PRESENT) { + configuration_update_command->network_slicing_indication.type = (OGS_NAS_CONFIGURATION_UPDATE_COMMAND_NETWORK_SLICING_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_network_slicing_indication(pkbuf, &configuration_update_command->network_slicing_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CONFIGURED_NSSAI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CONFIGURED_NSSAI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_nssai(pkbuf, &configuration_update_command->configured_nssai); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_REJECTED_NSSAI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_REJECTED_NSSAI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_rejected_nssai(pkbuf, &configuration_update_command->rejected_nssai); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_operator_defined_access_category_definitions(pkbuf, &configuration_update_command->operator_defined_access_category_definitions); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SMS_INDICATION_PRESENT) { + configuration_update_command->sms_indication.type = (OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SMS_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_sms_indication(pkbuf, &configuration_update_command->sms_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_T3447_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_T3447_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_3(pkbuf, &configuration_update_command->t3447_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CAG_INFORMATION_LIST_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CAG_INFORMATION_LIST_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_cag_information_list(pkbuf, &configuration_update_command->cag_information_list); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_ue_radio_capability_id(pkbuf, &configuration_update_command->ue_radio_capability_id); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_PRESENT) { + configuration_update_command->ue_radio_capability_id_deletion_indication.type = (OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_ue_radio_capability_id_deletion_indication(pkbuf, &configuration_update_command->ue_radio_capability_id_deletion_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_5GS_REGISTRATION_RESULT_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_5GS_REGISTRATION_RESULT_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_registration_result(pkbuf, &configuration_update_command->registration_result); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_command->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMMAND_TRUNCATED_5G_S_TMSI_CONFIGURATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMMAND_TRUNCATED_5G_S_TMSI_CONFIGURATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_truncated_5g_s_tmsi_configuration(pkbuf, &configuration_update_command->truncated_s_tmsi_configuration); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_configuration_update_complete(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_configuration_update_complete_t *configuration_update_complete = &message->gmm.configuration_update_complete; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode CONFIGURATION_UPDATE_COMPLETE"); + + size = ogs_nas_encode_control_plane_service_type(pkbuf, &configuration_update_complete->control_plane_service_type); + ogs_assert(size >= 0); + encoded += size; + + if (configuration_update_complete->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_CIOT_SMALL_DATA_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_CIOT_SMALL_DATA_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_ciot_small_data_container(pkbuf, &configuration_update_complete->ciot_small_data_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_complete->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PAYLOAD_CONTAINER_TYPE_PRESENT) { + configuration_update_complete->payload_container_type.type = (OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PAYLOAD_CONTAINER_TYPE_TYPE >> 4); + + size = ogs_nas_encode_payload_container_type(pkbuf, &configuration_update_complete->payload_container_type); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_complete->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PAYLOAD_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PAYLOAD_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_payload_container(pkbuf, &configuration_update_complete->payload_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_complete->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PDU_SESSION_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PDU_SESSION_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_pdu_session_status(pkbuf, &configuration_update_complete->pdu_session_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_complete->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_RELEASE_ASSISTANCE_INDICATION_PRESENT) { + configuration_update_complete->release_assistance_indication.type = (OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_RELEASE_ASSISTANCE_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_release_assistance_indication(pkbuf, &configuration_update_complete->release_assistance_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_complete->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_UPLINK_DATA_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_UPLINK_DATA_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_uplink_data_status(pkbuf, &configuration_update_complete->uplink_data_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_complete->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_NAS_MESSAGE_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_NAS_MESSAGE_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_message_container(pkbuf, &configuration_update_complete->nas_message_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (configuration_update_complete->presencemask & OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_ADDITIONAL_INFORMATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_ADDITIONAL_INFORMATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_additional_information(pkbuf, &configuration_update_complete->additional_information); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_authentication_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_authentication_request_t *authentication_request = &message->gmm.authentication_request; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode AUTHENTICATION_REQUEST"); + + size = ogs_nas_encode_key_set_identifier(pkbuf, &authentication_request->ngksi); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_abba(pkbuf, &authentication_request->abba); + ogs_assert(size >= 0); + encoded += size; + + if (authentication_request->presencemask & OGS_NAS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_RAND_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_RAND_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_authentication_parameter_rand(pkbuf, &authentication_request->authentication_parameter_rand); + ogs_assert(size >= 0); + encoded += size; + } + + if (authentication_request->presencemask & OGS_NAS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_AUTN_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_AUTN_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_authentication_parameter_autn(pkbuf, &authentication_request->authentication_parameter_autn); + ogs_assert(size >= 0); + encoded += size; + } + + if (authentication_request->presencemask & OGS_NAS_AUTHENTICATION_REQUEST_EAP_MESSAGE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_AUTHENTICATION_REQUEST_EAP_MESSAGE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eap_message(pkbuf, &authentication_request->eap_message); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_authentication_response(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_authentication_response_t *authentication_response = &message->gmm.authentication_response; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode AUTHENTICATION_RESPONSE"); + + if (authentication_response->presencemask & OGS_NAS_AUTHENTICATION_RESPONSE_AUTHENTICATION_RESPONSE_PARAMETER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_AUTHENTICATION_RESPONSE_AUTHENTICATION_RESPONSE_PARAMETER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_authentication_response_parameter(pkbuf, &authentication_response->authentication_response_parameter); + ogs_assert(size >= 0); + encoded += size; + } + + if (authentication_response->presencemask & OGS_NAS_AUTHENTICATION_RESPONSE_EAP_MESSAGE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_AUTHENTICATION_RESPONSE_EAP_MESSAGE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eap_message(pkbuf, &authentication_response->eap_message); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_authentication_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_authentication_reject_t *authentication_reject = &message->gmm.authentication_reject; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode AUTHENTICATION_REJECT"); + + if (authentication_reject->presencemask & OGS_NAS_AUTHENTICATION_REJECT_EAP_MESSAGE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_AUTHENTICATION_REJECT_EAP_MESSAGE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eap_message(pkbuf, &authentication_reject->eap_message); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_authentication_failure(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_authentication_failure_t *authentication_failure = &message->gmm.authentication_failure; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode AUTHENTICATION_FAILURE"); + + size = ogs_nas_encode_5gmm_cause(pkbuf, &authentication_failure->gmm_cause); + ogs_assert(size >= 0); + encoded += size; + + if (authentication_failure->presencemask & OGS_NAS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_authentication_failure_parameter(pkbuf, &authentication_failure->authentication_failure_parameter); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_authentication_result(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_authentication_result_t *authentication_result = &message->gmm.authentication_result; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode AUTHENTICATION_RESULT"); + + size = ogs_nas_encode_key_set_identifier(pkbuf, &authentication_result->ngksi); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eap_message(pkbuf, &authentication_result->eap_message); + ogs_assert(size >= 0); + encoded += size; + + if (authentication_result->presencemask & OGS_NAS_AUTHENTICATION_RESULT_ABBA_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_AUTHENTICATION_RESULT_ABBA_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_abba(pkbuf, &authentication_result->abba); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_identity_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_identity_request_t *identity_request = &message->gmm.identity_request; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode IDENTITY_REQUEST"); + + size = ogs_nas_encode_5gs_identity_type(pkbuf, &identity_request->identity_type); + ogs_assert(size >= 0); + encoded += size; + + return encoded; +} + +int ogs_nas_encode_identity_response(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_identity_response_t *identity_response = &message->gmm.identity_response; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode IDENTITY_RESPONSE"); + + size = ogs_nas_encode_5gs_mobile_identity(pkbuf, &identity_response->mobile_identity); + ogs_assert(size >= 0); + encoded += size; + + return encoded; +} + +int ogs_nas_encode_security_mode_command(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_security_mode_command_t *security_mode_command = &message->gmm.security_mode_command; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode SECURITY_MODE_COMMAND"); + + size = ogs_nas_encode_security_algorithms(pkbuf, &security_mode_command->selected_nas_security_algorithms); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_key_set_identifier(pkbuf, &security_mode_command->ngksi); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_ue_security_capability(pkbuf, &security_mode_command->replayed_ue_security_capabilities); + ogs_assert(size >= 0); + encoded += size; + + if (security_mode_command->presencemask & OGS_NAS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT) { + security_mode_command->imeisv_request.type = (OGS_NAS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_TYPE >> 4); + + size = ogs_nas_encode_imeisv_request(pkbuf, &security_mode_command->imeisv_request); + ogs_assert(size >= 0); + encoded += size; + } + + if (security_mode_command->presencemask & OGS_NAS_SECURITY_MODE_COMMAND_SELECTED_EPS_NAS_SECURITY_ALGORITHMS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SECURITY_MODE_COMMAND_SELECTED_EPS_NAS_SECURITY_ALGORITHMS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eps_nas_security_algorithms(pkbuf, &security_mode_command->selected_eps_nas_security_algorithms); + ogs_assert(size >= 0); + encoded += size; + } + + if (security_mode_command->presencemask & OGS_NAS_SECURITY_MODE_COMMAND_ADDITIONAL_5G_SECURITY_INFORMATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SECURITY_MODE_COMMAND_ADDITIONAL_5G_SECURITY_INFORMATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_additional_5g_security_information(pkbuf, &security_mode_command->additional_security_information); + ogs_assert(size >= 0); + encoded += size; + } + + if (security_mode_command->presencemask & OGS_NAS_SECURITY_MODE_COMMAND_EAP_MESSAGE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SECURITY_MODE_COMMAND_EAP_MESSAGE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eap_message(pkbuf, &security_mode_command->eap_message); + ogs_assert(size >= 0); + encoded += size; + } + + if (security_mode_command->presencemask & OGS_NAS_SECURITY_MODE_COMMAND_ABBA_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SECURITY_MODE_COMMAND_ABBA_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_abba(pkbuf, &security_mode_command->abba); + ogs_assert(size >= 0); + encoded += size; + } + + if (security_mode_command->presencemask & OGS_NAS_SECURITY_MODE_COMMAND_REPLAYED_S1_UE_SECURITY_CAPABILITIES_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SECURITY_MODE_COMMAND_REPLAYED_S1_UE_SECURITY_CAPABILITIES_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_s1_ue_security_capability(pkbuf, &security_mode_command->replayed_s1_ue_security_capabilities); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_security_mode_complete(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_security_mode_complete_t *security_mode_complete = &message->gmm.security_mode_complete; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode SECURITY_MODE_COMPLETE"); + + if (security_mode_complete->presencemask & OGS_NAS_SECURITY_MODE_COMPLETE_IMEISV_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SECURITY_MODE_COMPLETE_IMEISV_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_mobile_identity(pkbuf, &security_mode_complete->imeisv); + ogs_assert(size >= 0); + encoded += size; + } + + if (security_mode_complete->presencemask & OGS_NAS_SECURITY_MODE_COMPLETE_NAS_MESSAGE_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SECURITY_MODE_COMPLETE_NAS_MESSAGE_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_message_container(pkbuf, &security_mode_complete->nas_message_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (security_mode_complete->presencemask & OGS_NAS_SECURITY_MODE_COMPLETE_NON_IMEISV_PEI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SECURITY_MODE_COMPLETE_NON_IMEISV_PEI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gs_mobile_identity(pkbuf, &security_mode_complete->non_imeisv_pei); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_security_mode_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_security_mode_reject_t *security_mode_reject = &message->gmm.security_mode_reject; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode SECURITY_MODE_REJECT"); + + size = ogs_nas_encode_5gmm_cause(pkbuf, &security_mode_reject->gmm_cause); + ogs_assert(size >= 0); + encoded += size; + + return encoded; +} + +int ogs_nas_encode_5gmm_status(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_5gmm_status_t *gmm_status = &message->gmm.gmm_status; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode 5GMM_STATUS"); + + size = ogs_nas_encode_5gmm_cause(pkbuf, &gmm_status->gmm_cause); + ogs_assert(size >= 0); + encoded += size; + + return encoded; +} + +int ogs_nas_encode_notification(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_notification_t *notification = &message->gmm.notification; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode NOTIFICATION"); + + size = ogs_nas_encode_access_type(pkbuf, ¬ification->access_type); + ogs_assert(size >= 0); + encoded += size; + + return encoded; +} + +int ogs_nas_encode_notification_response(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_notification_response_t *notification_response = &message->gmm.notification_response; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode NOTIFICATION_RESPONSE"); + + if (notification_response->presencemask & OGS_NAS_NOTIFICATION_RESPONSE_PDU_SESSION_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_NOTIFICATION_RESPONSE_PDU_SESSION_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_pdu_session_status(pkbuf, ¬ification_response->pdu_session_status); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_ul_nas_transport(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_ul_nas_transport_t *ul_nas_transport = &message->gmm.ul_nas_transport; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode UL_NAS_TRANSPORT"); + + size = ogs_nas_encode_payload_container_type(pkbuf, &ul_nas_transport->payload_container_type); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_payload_container(pkbuf, &ul_nas_transport->payload_container); + ogs_assert(size >= 0); + encoded += size; + + if (ul_nas_transport->presencemask & OGS_NAS_UL_NAS_TRANSPORT_OLD_PDU_SESSION_ID_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_UL_NAS_TRANSPORT_OLD_PDU_SESSION_ID_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_pdu_session_identity_2(pkbuf, &ul_nas_transport->old_pdu_session_id); + ogs_assert(size >= 0); + encoded += size; + } + + if (ul_nas_transport->presencemask & OGS_NAS_UL_NAS_TRANSPORT_REQUEST_TYPE_PRESENT) { + ul_nas_transport->request_type.type = (OGS_NAS_UL_NAS_TRANSPORT_REQUEST_TYPE_TYPE >> 4); + + size = ogs_nas_encode_request_type(pkbuf, &ul_nas_transport->request_type); + ogs_assert(size >= 0); + encoded += size; + } + + if (ul_nas_transport->presencemask & OGS_NAS_UL_NAS_TRANSPORT_S_NSSAI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_UL_NAS_TRANSPORT_S_NSSAI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_s_nssai(pkbuf, &ul_nas_transport->s_nssai); + ogs_assert(size >= 0); + encoded += size; + } + + if (ul_nas_transport->presencemask & OGS_NAS_UL_NAS_TRANSPORT_DNN_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_UL_NAS_TRANSPORT_DNN_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_dnn(pkbuf, &ul_nas_transport->dnn); + ogs_assert(size >= 0); + encoded += size; + } + + if (ul_nas_transport->presencemask & OGS_NAS_UL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_UL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_additional_information(pkbuf, &ul_nas_transport->additional_information); + ogs_assert(size >= 0); + encoded += size; + } + + if (ul_nas_transport->presencemask & OGS_NAS_UL_NAS_TRANSPORT_MA_PDU_SESSION_INFORMATION_PRESENT) { + ul_nas_transport->ma_pdu_session_information.type = (OGS_NAS_UL_NAS_TRANSPORT_MA_PDU_SESSION_INFORMATION_TYPE >> 4); + + size = ogs_nas_encode_ma_pdu_session_information(pkbuf, &ul_nas_transport->ma_pdu_session_information); + ogs_assert(size >= 0); + encoded += size; + } + + if (ul_nas_transport->presencemask & OGS_NAS_UL_NAS_TRANSPORT_RELEASE_ASSISTANCE_INDICATION_PRESENT) { + ul_nas_transport->release_assistance_indication.type = (OGS_NAS_UL_NAS_TRANSPORT_RELEASE_ASSISTANCE_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_release_assistance_indication(pkbuf, &ul_nas_transport->release_assistance_indication); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_dl_nas_transport(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_dl_nas_transport_t *dl_nas_transport = &message->gmm.dl_nas_transport; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode DL_NAS_TRANSPORT"); + + size = ogs_nas_encode_payload_container_type(pkbuf, &dl_nas_transport->payload_container_type); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_payload_container(pkbuf, &dl_nas_transport->payload_container); + ogs_assert(size >= 0); + encoded += size; + + if (dl_nas_transport->presencemask & OGS_NAS_DL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_DL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_additional_information(pkbuf, &dl_nas_transport->additional_information); + ogs_assert(size >= 0); + encoded += size; + } + + if (dl_nas_transport->presencemask & OGS_NAS_DL_NAS_TRANSPORT_5GMM_CAUSE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_DL_NAS_TRANSPORT_5GMM_CAUSE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gmm_cause(pkbuf, &dl_nas_transport->gmm_cause); + ogs_assert(size >= 0); + encoded += size; + } + + if (dl_nas_transport->presencemask & OGS_NAS_DL_NAS_TRANSPORT_BACK_OFF_TIMER_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_DL_NAS_TRANSPORT_BACK_OFF_TIMER_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_3(pkbuf, &dl_nas_transport->back_off_timer_value); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_pdu_session_establishment_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_pdu_session_establishment_request_t *pdu_session_establishment_request = &message->gsm.pdu_session_establishment_request; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode PDU_SESSION_ESTABLISHMENT_REQUEST"); + + size = ogs_nas_encode_control_plane_service_type(pkbuf, &pdu_session_establishment_request->control_plane_service_type); + ogs_assert(size >= 0); + encoded += size; + + if (pdu_session_establishment_request->presencemask & OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_CIOT_SMALL_DATA_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_CIOT_SMALL_DATA_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_ciot_small_data_container(pkbuf, &pdu_session_establishment_request->ciot_small_data_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_establishment_request->presencemask & OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PAYLOAD_CONTAINER_TYPE_PRESENT) { + pdu_session_establishment_request->payload_container_type.type = (OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PAYLOAD_CONTAINER_TYPE_TYPE >> 4); + + size = ogs_nas_encode_payload_container_type(pkbuf, &pdu_session_establishment_request->payload_container_type); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_establishment_request->presencemask & OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PAYLOAD_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PAYLOAD_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_payload_container(pkbuf, &pdu_session_establishment_request->payload_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_establishment_request->presencemask & OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PDU_SESSION_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PDU_SESSION_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_pdu_session_status(pkbuf, &pdu_session_establishment_request->pdu_session_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_establishment_request->presencemask & OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_RELEASE_ASSISTANCE_INDICATION_PRESENT) { + pdu_session_establishment_request->release_assistance_indication.type = (OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_RELEASE_ASSISTANCE_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_release_assistance_indication(pkbuf, &pdu_session_establishment_request->release_assistance_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_establishment_request->presencemask & OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_UPLINK_DATA_STATUS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_UPLINK_DATA_STATUS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_uplink_data_status(pkbuf, &pdu_session_establishment_request->uplink_data_status); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_establishment_request->presencemask & OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_NAS_MESSAGE_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_message_container(pkbuf, &pdu_session_establishment_request->nas_message_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_establishment_request->presencemask & OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_ADDITIONAL_INFORMATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_ADDITIONAL_INFORMATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_additional_information(pkbuf, &pdu_session_establishment_request->additional_information); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_pdu_session_establishment_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_pdu_session_establishment_accept_t *pdu_session_establishment_accept = &message->gsm.pdu_session_establishment_accept; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode PDU_SESSION_ESTABLISHMENT_ACCEPT"); + + size = ogs_nas_encode_s_nssai(pkbuf, &pdu_session_establishment_accept->s_nssai); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eap_message(pkbuf, &pdu_session_establishment_accept->eap_message); + ogs_assert(size >= 0); + encoded += size; + + return encoded; +} + +int ogs_nas_encode_pdu_session_establishment_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_pdu_session_establishment_reject_t *pdu_session_establishment_reject = &message->gsm.pdu_session_establishment_reject; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode PDU_SESSION_ESTABLISHMENT_REJECT"); + + size = ogs_nas_encode_s_nssai(pkbuf, &pdu_session_establishment_reject->s_nssai); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eap_message(pkbuf, &pdu_session_establishment_reject->eap_message); + ogs_assert(size >= 0); + encoded += size; + + return encoded; +} + +int ogs_nas_encode_pdu_session_authentication_command(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_pdu_session_authentication_command_t *pdu_session_authentication_command = &message->gsm.pdu_session_authentication_command; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode PDU_SESSION_AUTHENTICATION_COMMAND"); + + size = ogs_nas_encode_s_nssai(pkbuf, &pdu_session_authentication_command->s_nssai); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eap_message(pkbuf, &pdu_session_authentication_command->eap_message); + ogs_assert(size >= 0); + encoded += size; + + return encoded; +} + +int ogs_nas_encode_pdu_session_authentication_complete(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_pdu_session_authentication_complete_t *pdu_session_authentication_complete = &message->gsm.pdu_session_authentication_complete; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode PDU_SESSION_AUTHENTICATION_COMPLETE"); + + size = ogs_nas_encode_integrity_protection_maximum_data_rate(pkbuf, &pdu_session_authentication_complete->integrity_protection_maximum_data_rate); + ogs_assert(size >= 0); + encoded += size; + + if (pdu_session_authentication_complete->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_PDU_SESSION_TYPE_PRESENT) { + pdu_session_authentication_complete->pdu_session_type.type = (OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_PDU_SESSION_TYPE_TYPE >> 4); + + size = ogs_nas_encode_pdu_session_type(pkbuf, &pdu_session_authentication_complete->pdu_session_type); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_complete->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_SSC_MODE_PRESENT) { + pdu_session_authentication_complete->ssc_mode.type = (OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_SSC_MODE_TYPE >> 4); + + size = ogs_nas_encode_ssc_mode(pkbuf, &pdu_session_authentication_complete->ssc_mode); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_complete->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_5GSM_CAPABILITY_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_5GSM_CAPABILITY_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gsm_capability(pkbuf, &pdu_session_authentication_complete->gsm_capability); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_complete->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_maximum_number_of_supported_packet_filters(pkbuf, &pdu_session_authentication_complete->maximum_number_of_supported_packet_filters); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_complete->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_ALWAYS_ON_PDU_SESSION_REQUESTED_PRESENT) { + pdu_session_authentication_complete->always_on_pdu_session_requested.type = (OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_ALWAYS_ON_PDU_SESSION_REQUESTED_TYPE >> 4); + + size = ogs_nas_encode_always_on_pdu_session_requested(pkbuf, &pdu_session_authentication_complete->always_on_pdu_session_requested); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_complete->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_SM_PDU_DN_REQUEST_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_SM_PDU_DN_REQUEST_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_sm_pdu_dn_request_container(pkbuf, &pdu_session_authentication_complete->sm_pdu_dn_request_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_complete->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_extended_protocol_configuration_options(pkbuf, &pdu_session_authentication_complete->extended_protocol_configuration_options); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_complete->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_HEADER_COMPRESSION_CONFIGURATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_HEADER_COMPRESSION_CONFIGURATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_header_compression_configuration(pkbuf, &pdu_session_authentication_complete->header_compression_configuration); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_complete->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_DS_TT_ETHERNET_PORT_MAC_ADDRESS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_DS_TT_ETHERNET_PORT_MAC_ADDRESS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_ds_tt_ethernet_port_mac_address(pkbuf, &pdu_session_authentication_complete->ds_tt_ethernet_port_mac_address); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_complete->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_UE_DS_TT_RESIDENCE_TIME_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_UE_DS_TT_RESIDENCE_TIME_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_ue_ds_tt_residence_time(pkbuf, &pdu_session_authentication_complete->ue_ds_tt_residence_time); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_complete->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_port_management_information_container(pkbuf, &pdu_session_authentication_complete->port_management_information_container); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_pdu_session_authentication_result(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_pdu_session_authentication_result_t *pdu_session_authentication_result = &message->gsm.pdu_session_authentication_result; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode PDU_SESSION_AUTHENTICATION_RESULT"); + + size = ogs_nas_encode_pdu_session_type(pkbuf, &pdu_session_authentication_result->selected_pdu_session_type); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_qos_rules(pkbuf, &pdu_session_authentication_result->authorized_qos_rules); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_session_ambr(pkbuf, &pdu_session_authentication_result->session_ambr); + ogs_assert(size >= 0); + encoded += size; + + if (pdu_session_authentication_result->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_5GSM_CAUSE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_5GSM_CAUSE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gsm_cause(pkbuf, &pdu_session_authentication_result->gsm_cause); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_result->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_PDU_ADDRESS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_PDU_ADDRESS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_pdu_address(pkbuf, &pdu_session_authentication_result->pdu_address); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_result->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_RQ_TIMER_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_RQ_TIMER_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer(pkbuf, &pdu_session_authentication_result->rq_timer_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_result->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_S_NSSAI_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_S_NSSAI_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_s_nssai(pkbuf, &pdu_session_authentication_result->s_nssai); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_result->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_ALWAYS_ON_PDU_SESSION_INDICATION_PRESENT) { + pdu_session_authentication_result->always_on_pdu_session_indication.type = (OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_ALWAYS_ON_PDU_SESSION_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_always_on_pdu_session_indication(pkbuf, &pdu_session_authentication_result->always_on_pdu_session_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_result->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_MAPPED_EPS_BEARER_CONTEXTS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_MAPPED_EPS_BEARER_CONTEXTS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_mapped_eps_bearer_contexts(pkbuf, &pdu_session_authentication_result->mapped_eps_bearer_contexts); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_result->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_EAP_MESSAGE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_EAP_MESSAGE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eap_message(pkbuf, &pdu_session_authentication_result->eap_message); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_result->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_qos_flow_descriptions(pkbuf, &pdu_session_authentication_result->authorized_qos_flow_descriptions); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_result->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_extended_protocol_configuration_options(pkbuf, &pdu_session_authentication_result->extended_protocol_configuration_options); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_result->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_DNN_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_DNN_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_dnn(pkbuf, &pdu_session_authentication_result->dnn); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_result->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_5GSM_NETWORK_FEATURE_SUPPORT_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_5GSM_NETWORK_FEATURE_SUPPORT_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gsm_network_feature_support(pkbuf, &pdu_session_authentication_result->gsm_network_feature_support); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_result->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_SERVING_PLMN_RATE_CONTROL_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_SERVING_PLMN_RATE_CONTROL_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_serving_plmn_rate_control(pkbuf, &pdu_session_authentication_result->serving_plmn_rate_control); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_result->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_ATSSS_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_ATSSS_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_atsss_container(pkbuf, &pdu_session_authentication_result->atsss_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_result->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_CONTROL_PLANE_ONLY_INDICATION_PRESENT) { + pdu_session_authentication_result->control_plane_only_indication.type = (OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_CONTROL_PLANE_ONLY_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_control_plane_only_indication(pkbuf, &pdu_session_authentication_result->control_plane_only_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_authentication_result->presencemask & OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_HEADER_COMPRESSION_CONFIGURATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_HEADER_COMPRESSION_CONFIGURATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_header_compression_configuration(pkbuf, &pdu_session_authentication_result->header_compression_configuration); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_pdu_session_modification_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_pdu_session_modification_request_t *pdu_session_modification_request = &message->gsm.pdu_session_modification_request; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode PDU_SESSION_MODIFICATION_REQUEST"); + + size = ogs_nas_encode_5gsm_cause(pkbuf, &pdu_session_modification_request->gsm_cause); + ogs_assert(size >= 0); + encoded += size; + + if (pdu_session_modification_request->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_BACK_OFF_TIMER_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_BACK_OFF_TIMER_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_3(pkbuf, &pdu_session_modification_request->back_off_timer_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_request->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_ALLOWED_SSC_MODE_PRESENT) { + pdu_session_modification_request->allowed_ssc_mode.type = (OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_ALLOWED_SSC_MODE_TYPE >> 4); + + size = ogs_nas_encode_allowed_ssc_mode(pkbuf, &pdu_session_modification_request->allowed_ssc_mode); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_request->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_EAP_MESSAGE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_EAP_MESSAGE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eap_message(pkbuf, &pdu_session_modification_request->eap_message); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_request->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_extended_protocol_configuration_options(pkbuf, &pdu_session_modification_request->extended_protocol_configuration_options); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_request->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_RE_ATTEMPT_INDICATOR_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_RE_ATTEMPT_INDICATOR_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_re_attempt_indicator(pkbuf, &pdu_session_modification_request->re_attempt_indicator); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_request->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gsm_congestion_re_attempt_indicator(pkbuf, &pdu_session_modification_request->gsm_congestion_re_attempt_indicator); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_pdu_session_modification_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_pdu_session_modification_reject_t *pdu_session_modification_reject = &message->gsm.pdu_session_modification_reject; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode PDU_SESSION_MODIFICATION_REJECT"); + + size = ogs_nas_encode_eap_message(pkbuf, &pdu_session_modification_reject->eap_message); + ogs_assert(size >= 0); + encoded += size; + + if (pdu_session_modification_reject->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_extended_protocol_configuration_options(pkbuf, &pdu_session_modification_reject->extended_protocol_configuration_options); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_pdu_session_modification_command(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_pdu_session_modification_command_t *pdu_session_modification_command = &message->gsm.pdu_session_modification_command; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode PDU_SESSION_MODIFICATION_COMMAND"); + + size = ogs_nas_encode_eap_message(pkbuf, &pdu_session_modification_command->eap_message); + ogs_assert(size >= 0); + encoded += size; + + if (pdu_session_modification_command->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_extended_protocol_configuration_options(pkbuf, &pdu_session_modification_command->extended_protocol_configuration_options); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_pdu_session_modification_complete(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_pdu_session_modification_complete_t *pdu_session_modification_complete = &message->gsm.pdu_session_modification_complete; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode PDU_SESSION_MODIFICATION_COMPLETE"); + + if (pdu_session_modification_complete->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_COMPLETE_EAP_MESSAGE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_COMPLETE_EAP_MESSAGE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_eap_message(pkbuf, &pdu_session_modification_complete->eap_message); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_complete->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_extended_protocol_configuration_options(pkbuf, &pdu_session_modification_complete->extended_protocol_configuration_options); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_pdu_session_modification_command_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_pdu_session_modification_command_reject_t *pdu_session_modification_command_reject = &message->gsm.pdu_session_modification_command_reject; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode PDU_SESSION_MODIFICATION_COMMAND_REJECT"); + + if (pdu_session_modification_command_reject->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_5GSM_CAPABILITY_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_5GSM_CAPABILITY_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gsm_capability(pkbuf, &pdu_session_modification_command_reject->gsm_capability); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_command_reject->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_5GSM_CAUSE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_5GSM_CAUSE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gsm_cause(pkbuf, &pdu_session_modification_command_reject->gsm_cause); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_command_reject->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_maximum_number_of_supported_packet_filters(pkbuf, &pdu_session_modification_command_reject->maximum_number_of_supported_packet_filters); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_command_reject->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_ALWAYS_ON_PDU_SESSION_REQUESTED_PRESENT) { + pdu_session_modification_command_reject->always_on_pdu_session_requested.type = (OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_ALWAYS_ON_PDU_SESSION_REQUESTED_TYPE >> 4); + + size = ogs_nas_encode_always_on_pdu_session_requested(pkbuf, &pdu_session_modification_command_reject->always_on_pdu_session_requested); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_command_reject->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_INTEGRITY_PROTECTION_MAXIMUM_DATA_RATE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_INTEGRITY_PROTECTION_MAXIMUM_DATA_RATE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_integrity_protection_maximum_data_rate(pkbuf, &pdu_session_modification_command_reject->integrity_protection_maximum_data_rate); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_command_reject->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_REQUESTED_QOS_RULES_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_REQUESTED_QOS_RULES_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_qos_rules(pkbuf, &pdu_session_modification_command_reject->requested_qos_rules); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_command_reject->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_REQUESTED_QOS_FLOW_DESCRIPTIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_REQUESTED_QOS_FLOW_DESCRIPTIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_qos_flow_descriptions(pkbuf, &pdu_session_modification_command_reject->requested_qos_flow_descriptions); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_command_reject->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_MAPPED_EPS_BEARER_CONTEXTS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_MAPPED_EPS_BEARER_CONTEXTS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_mapped_eps_bearer_contexts(pkbuf, &pdu_session_modification_command_reject->mapped_eps_bearer_contexts); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_command_reject->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_extended_protocol_configuration_options(pkbuf, &pdu_session_modification_command_reject->extended_protocol_configuration_options); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_command_reject->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_port_management_information_container(pkbuf, &pdu_session_modification_command_reject->port_management_information_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_modification_command_reject->presencemask & OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_HEADER_COMPRESSION_CONFIGURATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_HEADER_COMPRESSION_CONFIGURATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_header_compression_configuration(pkbuf, &pdu_session_modification_command_reject->header_compression_configuration); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_pdu_session_release_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_pdu_session_release_request_t *pdu_session_release_request = &message->gsm.pdu_session_release_request; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode PDU_SESSION_RELEASE_REQUEST"); + + size = ogs_nas_encode_5gsm_cause(pkbuf, &pdu_session_release_request->gsm_cause); + ogs_assert(size >= 0); + encoded += size; + + if (pdu_session_release_request->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REQUEST_BACK_OFF_TIMER_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_REQUEST_BACK_OFF_TIMER_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer_3(pkbuf, &pdu_session_release_request->back_off_timer_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_release_request->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_extended_protocol_configuration_options(pkbuf, &pdu_session_release_request->extended_protocol_configuration_options); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_release_request->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REQUEST_RE_ATTEMPT_INDICATOR_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_REQUEST_RE_ATTEMPT_INDICATOR_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_re_attempt_indicator(pkbuf, &pdu_session_release_request->re_attempt_indicator); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_release_request->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REQUEST_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_REQUEST_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gsm_congestion_re_attempt_indicator(pkbuf, &pdu_session_release_request->gsm_congestion_re_attempt_indicator); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_pdu_session_release_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_pdu_session_release_reject_t *pdu_session_release_reject = &message->gsm.pdu_session_release_reject; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode PDU_SESSION_RELEASE_REJECT"); + + if (pdu_session_release_reject->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REJECT_5GSM_CAUSE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_REJECT_5GSM_CAUSE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gsm_cause(pkbuf, &pdu_session_release_reject->gsm_cause); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_release_reject->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REJECT_SESSION_AMBR_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_REJECT_SESSION_AMBR_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_session_ambr(pkbuf, &pdu_session_release_reject->session_ambr); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_release_reject->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REJECT_RQ_TIMER_VALUE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_REJECT_RQ_TIMER_VALUE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_gprs_timer(pkbuf, &pdu_session_release_reject->rq_timer_value); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_release_reject->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REJECT_ALWAYS_ON_PDU_SESSION_INDICATION_PRESENT) { + pdu_session_release_reject->always_on_pdu_session_indication.type = (OGS_NAS_PDU_SESSION_RELEASE_REJECT_ALWAYS_ON_PDU_SESSION_INDICATION_TYPE >> 4); + + size = ogs_nas_encode_always_on_pdu_session_indication(pkbuf, &pdu_session_release_reject->always_on_pdu_session_indication); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_release_reject->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REJECT_AUTHORIZED_QOS_RULES_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_REJECT_AUTHORIZED_QOS_RULES_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_qos_rules(pkbuf, &pdu_session_release_reject->authorized_qos_rules); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_release_reject->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REJECT_MAPPED_EPS_BEARER_CONTEXTS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_REJECT_MAPPED_EPS_BEARER_CONTEXTS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_mapped_eps_bearer_contexts(pkbuf, &pdu_session_release_reject->mapped_eps_bearer_contexts); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_release_reject->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REJECT_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_REJECT_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_qos_flow_descriptions(pkbuf, &pdu_session_release_reject->authorized_qos_flow_descriptions); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_release_reject->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_extended_protocol_configuration_options(pkbuf, &pdu_session_release_reject->extended_protocol_configuration_options); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_release_reject->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REJECT_ATSSS_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_REJECT_ATSSS_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_atsss_container(pkbuf, &pdu_session_release_reject->atsss_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_release_reject->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REJECT_HEADER_COMPRESSION_CONFIGURATION_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_REJECT_HEADER_COMPRESSION_CONFIGURATION_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_header_compression_configuration(pkbuf, &pdu_session_release_reject->header_compression_configuration); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_release_reject->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REJECT_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_REJECT_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_port_management_information_container(pkbuf, &pdu_session_release_reject->port_management_information_container); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_release_reject->presencemask & OGS_NAS_PDU_SESSION_RELEASE_REJECT_SERVING_PLMN_RATE_CONTROL_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_REJECT_SERVING_PLMN_RATE_CONTROL_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_serving_plmn_rate_control(pkbuf, &pdu_session_release_reject->serving_plmn_rate_control); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_pdu_session_release_command(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_pdu_session_release_command_t *pdu_session_release_command = &message->gsm.pdu_session_release_command; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode PDU_SESSION_RELEASE_COMMAND"); + + if (pdu_session_release_command->presencemask & OGS_NAS_PDU_SESSION_RELEASE_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_extended_protocol_configuration_options(pkbuf, &pdu_session_release_command->extended_protocol_configuration_options); + ogs_assert(size >= 0); + encoded += size; + } + + if (pdu_session_release_command->presencemask & OGS_NAS_PDU_SESSION_RELEASE_COMMAND_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_COMMAND_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_port_management_information_container(pkbuf, &pdu_session_release_command->port_management_information_container); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_pdu_session_release_complete(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_pdu_session_release_complete_t *pdu_session_release_complete = &message->gsm.pdu_session_release_complete; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode PDU_SESSION_RELEASE_COMPLETE"); + + size = ogs_nas_encode_5gsm_cause(pkbuf, &pdu_session_release_complete->gsm_cause); + ogs_assert(size >= 0); + encoded += size; + + if (pdu_session_release_complete->presencemask & OGS_NAS_PDU_SESSION_RELEASE_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDU_SESSION_RELEASE_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_extended_protocol_configuration_options(pkbuf, &pdu_session_release_complete->extended_protocol_configuration_options); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +int ogs_nas_encode_5gsm_status(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) +{ + ogs_nas_5gsm_status_t *gsm_status = &message->gsm.gsm_status; + int encoded = 0; + int size = 0; + + ogs_trace("[NAS] Encode 5GSM_STATUS"); + + if (gsm_status->presencemask & OGS_NAS_5GSM_STATUS_5GSM_CAUSE_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_5GSM_STATUS_5GSM_CAUSE_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_5gsm_cause(pkbuf, &gsm_status->gsm_cause); + ogs_assert(size >= 0); + encoded += size; + } + + if (gsm_status->presencemask & OGS_NAS_5GSM_STATUS_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { + size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_5GSM_STATUS_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); + ogs_assert(size >= 0); + encoded += size; + + size = ogs_nas_encode_extended_protocol_configuration_options(pkbuf, &gsm_status->extended_protocol_configuration_options); + ogs_assert(size >= 0); + encoded += size; + } + + return encoded; +} + +ogs_pkbuf_t *ogs_nas_5gmm_encode(ogs_nas_message_t *message) +{ + ogs_pkbuf_t *pkbuf = NULL; + int size = 0; + int encoded = 0; + + ogs_assert(message); + + /* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM. + * When calculating AES_CMAC, we need to use the headroom of the packet. */ + pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); + ogs_assert(pkbuf); + ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM); + ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM); + + size = sizeof(ogs_nas_5gmm_header_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + + memcpy(pkbuf->data - size, &message->gmm.h, size); + encoded += size; + + switch(message->gmm.h.message_type) { + case OGS_NAS_REGISTRATION_REQUEST: + size = ogs_nas_encode_registration_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_REGISTRATION_ACCEPT: + size = ogs_nas_encode_registration_accept(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_REGISTRATION_COMPLETE: + size = ogs_nas_encode_registration_complete(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_REGISTRATION_REJECT: + size = ogs_nas_encode_registration_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_DEREGISTRATION_REQUEST: + size = ogs_nas_encode_deregistration_request_to_ue(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_DEREGISTRATION_ACCEPT: + break; + case OGS_NAS_SERVICE_REQUEST: + size = ogs_nas_encode_service_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_SERVICE_REJECT: + size = ogs_nas_encode_service_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_SERVICE_ACCEPT: + size = ogs_nas_encode_service_accept(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMMAND: + size = ogs_nas_encode_configuration_update_command(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_CONFIGURATION_UPDATE_COMPLETE: + size = ogs_nas_encode_configuration_update_complete(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_AUTHENTICATION_REQUEST: + size = ogs_nas_encode_authentication_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_AUTHENTICATION_RESPONSE: + size = ogs_nas_encode_authentication_response(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_AUTHENTICATION_REJECT: + size = ogs_nas_encode_authentication_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_AUTHENTICATION_FAILURE: + size = ogs_nas_encode_authentication_failure(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_AUTHENTICATION_RESULT: + size = ogs_nas_encode_authentication_result(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_IDENTITY_REQUEST: + size = ogs_nas_encode_identity_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_IDENTITY_RESPONSE: + size = ogs_nas_encode_identity_response(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMMAND: + size = ogs_nas_encode_security_mode_command(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMPLETE: + size = ogs_nas_encode_security_mode_complete(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_SECURITY_MODE_REJECT: + size = ogs_nas_encode_security_mode_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_5GMM_STATUS: + size = ogs_nas_encode_5gmm_status(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_NOTIFICATION: + size = ogs_nas_encode_notification(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_NOTIFICATION_RESPONSE: + size = ogs_nas_encode_notification_response(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_UL_NAS_TRANSPORT: + size = ogs_nas_encode_ul_nas_transport(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_DL_NAS_TRANSPORT: + size = ogs_nas_encode_dl_nas_transport(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->gmm.h.message_type); + ogs_pkbuf_free(pkbuf); + return NULL; + } + + ogs_assert(ogs_pkbuf_push(pkbuf, encoded)); + + pkbuf->len = encoded; + + return pkbuf; +} + +ogs_pkbuf_t *ogs_nas_5gsm_encode(ogs_nas_message_t *message) +{ + ogs_pkbuf_t *pkbuf = NULL; + int size = 0; + int encoded = 0; + + ogs_assert(message); + + /* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM. + * When calculating AES_CMAC, we need to use the headroom of the packet. */ + pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); + ogs_assert(pkbuf); + ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM); + ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM); + + size = sizeof(ogs_nas_5gsm_header_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &message->gsm.h, size); + encoded += size; + + switch(message->gsm.h.message_type) { + case OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST: + size = ogs_nas_encode_pdu_session_establishment_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDU_SESSION_ESTABLISHMENT_ACCEPT: + size = ogs_nas_encode_pdu_session_establishment_accept(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDU_SESSION_ESTABLISHMENT_REJECT: + size = ogs_nas_encode_pdu_session_establishment_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_COMMAND: + size = ogs_nas_encode_pdu_session_authentication_command(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE: + size = ogs_nas_encode_pdu_session_authentication_complete(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT: + size = ogs_nas_encode_pdu_session_authentication_result(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST: + size = ogs_nas_encode_pdu_session_modification_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_REJECT: + size = ogs_nas_encode_pdu_session_modification_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND: + size = ogs_nas_encode_pdu_session_modification_command(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMPLETE: + size = ogs_nas_encode_pdu_session_modification_complete(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT: + size = ogs_nas_encode_pdu_session_modification_command_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REQUEST: + size = ogs_nas_encode_pdu_session_release_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_REJECT: + size = ogs_nas_encode_pdu_session_release_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_COMMAND: + size = ogs_nas_encode_pdu_session_release_command(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDU_SESSION_RELEASE_COMPLETE: + size = ogs_nas_encode_pdu_session_release_complete(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_5GSM_STATUS: + size = ogs_nas_encode_5gsm_status(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->gsm.h.message_type); + ogs_pkbuf_free(pkbuf); + return NULL; + } + + ogs_assert(ogs_pkbuf_push(pkbuf, encoded)); + pkbuf->len = encoded; + + return pkbuf; +} + +ogs_pkbuf_t *ogs_nas_plain_encode(ogs_nas_message_t *message) +{ + ogs_assert(message); + + ogs_assert(message->gmm.h.extended_protocol_discriminator == + message->gsm.h.extended_protocol_discriminator); + + if (message->gmm.h.extended_protocol_discriminator == + OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_EMM) + return ogs_nas_5gmm_encode(message); + else if (message->gmm.h.extended_protocol_discriminator == + OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_ESM) + return ogs_nas_5gsm_encode(message); + + return NULL; +} diff --git a/lib/nas/5gs/ies.c b/lib/nas/5gs/ies.c new file mode 100644 index 0000000000..c270849981 --- /dev/null +++ b/lib/nas/5gs/ies.c @@ -0,0 +1,3678 @@ +/* + * The MIT License + * + * Copyright (C) 2019,2020 by Sukchan Lee + * + * This file is part of Open5GS. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/******************************************************************************* + * This file had been created by nas-message.py script v0.2.0 + * Please do not modify this file but regenerate it via script. + * Created on: 2020-05-21 21:20:09.023713 by acetcom + * from 24501-g41.docx + ******************************************************************************/ + +#include "ogs-nas-5gs.h" + +int ogs_nas_encode_optional_type(ogs_pkbuf_t *pkbuf, uint8_t type) +{ + uint16_t size = sizeof(uint8_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &type, size); + + return size; +} +/* 9.11.2.1 Additional information + * O TLV 3-n */ +int ogs_nas_decode_additional_information(ogs_nas_additional_information_t *additional_information, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_additional_information_t *source = (ogs_nas_additional_information_t *)pkbuf->data; + + additional_information->length = source->length; + size = additional_information->length + sizeof(additional_information->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(additional_information, pkbuf->data - size, size); + + ogs_trace(" ADDITIONAL_INFORMATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_additional_information(ogs_pkbuf_t *pkbuf, ogs_nas_additional_information_t *additional_information) +{ + uint16_t size = additional_information->length + sizeof(additional_information->length); + ogs_nas_additional_information_t target; + + memcpy(&target, additional_information, sizeof(ogs_nas_additional_information_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" ADDITIONAL_INFORMATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.2.1A Access type + * M V 1/2 */ +int ogs_nas_decode_access_type(ogs_nas_access_type_t *access_type, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_access_type_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(access_type, pkbuf->data - size, size); + + ogs_trace(" ACCESS_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_access_type(ogs_pkbuf_t *pkbuf, ogs_nas_access_type_t *access_type) +{ + uint16_t size = sizeof(ogs_nas_access_type_t); + ogs_nas_access_type_t target; + + memcpy(&target, access_type, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" ACCESS_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.2.1B DNN + * O TLV 3-102 */ +int ogs_nas_decode_dnn(ogs_nas_dnn_t *dnn, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_dnn_t *source = (ogs_nas_dnn_t *)pkbuf->data; + + dnn->length = source->length; + size = dnn->length + sizeof(dnn->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(dnn, pkbuf->data - size, size); + + { + char data_network_name[OGS_MAX_DNN_LEN]; + dnn->length = ogs_fqdn_parse(data_network_name, dnn->value, dnn->length); + ogs_cpystrn(dnn->value, data_network_name, ogs_min(dnn->length, OGS_MAX_DNN_LEN) + 1); + } + + ogs_trace(" DNN - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_dnn(ogs_pkbuf_t *pkbuf, ogs_nas_dnn_t *dnn) +{ + uint16_t size = dnn->length + sizeof(dnn->length); + ogs_nas_dnn_t target; + + memcpy(&target, dnn, sizeof(ogs_nas_dnn_t)); + target.length = ogs_fqdn_build(target.value, dnn->value, dnn->length); + size = target.length + sizeof(target.length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" DNN - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.2.2 EAP message + * O TLV-E 7-1503 */ +int ogs_nas_decode_eap_message(ogs_nas_eap_message_t *eap_message, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_eap_message_t *source = (ogs_nas_eap_message_t *)pkbuf->data; + + eap_message->length = be16toh(source->length); + size = eap_message->length + sizeof(eap_message->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + eap_message->buffer = pkbuf->data - size + sizeof(eap_message->length); + + ogs_trace(" EAP_MESSAGE - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)eap_message->buffer, eap_message->length); + + return size; +} + +int ogs_nas_encode_eap_message(ogs_pkbuf_t *pkbuf, ogs_nas_eap_message_t *eap_message) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(eap_message); + ogs_assert(eap_message->buffer); + + size = sizeof(eap_message->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(eap_message->length); + memcpy(pkbuf->data - size, &target, size); + + size = eap_message->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, eap_message->buffer, size); + + ogs_trace(" EAP_MESSAGE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return eap_message->length + sizeof(eap_message->length); +} + +/* 9.11.2.3 GPRS timer + * O TV 2 */ +int ogs_nas_decode_gprs_timer(ogs_nas_gprs_timer_t *gprs_timer, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_gprs_timer_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(gprs_timer, pkbuf->data - size, size); + + ogs_trace(" GPRS_TIMER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_gprs_timer(ogs_pkbuf_t *pkbuf, ogs_nas_gprs_timer_t *gprs_timer) +{ + uint16_t size = sizeof(ogs_nas_gprs_timer_t); + ogs_nas_gprs_timer_t target; + + memcpy(&target, gprs_timer, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" GPRS_TIMER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.2.4 GPRS timer 2 + * O TLV 3 */ +int ogs_nas_decode_gprs_timer_2(ogs_nas_gprs_timer_2_t *gprs_timer_2, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_gprs_timer_2_t *source = (ogs_nas_gprs_timer_2_t *)pkbuf->data; + + gprs_timer_2->length = source->length; + size = gprs_timer_2->length + sizeof(gprs_timer_2->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(gprs_timer_2, pkbuf->data - size, size); + + ogs_trace(" GPRS_TIMER_2 - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_gprs_timer_2(ogs_pkbuf_t *pkbuf, ogs_nas_gprs_timer_2_t *gprs_timer_2) +{ + uint16_t size = gprs_timer_2->length + sizeof(gprs_timer_2->length); + ogs_nas_gprs_timer_2_t target; + + memcpy(&target, gprs_timer_2, sizeof(ogs_nas_gprs_timer_2_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" GPRS_TIMER_2 - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.2.5 GPRS timer 3 + * O TLV 3 */ +int ogs_nas_decode_gprs_timer_3(ogs_nas_gprs_timer_3_t *gprs_timer_3, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_gprs_timer_3_t *source = (ogs_nas_gprs_timer_3_t *)pkbuf->data; + + gprs_timer_3->length = source->length; + size = gprs_timer_3->length + sizeof(gprs_timer_3->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(gprs_timer_3, pkbuf->data - size, size); + + ogs_trace(" GPRS_TIMER_3 - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_gprs_timer_3(ogs_pkbuf_t *pkbuf, ogs_nas_gprs_timer_3_t *gprs_timer_3) +{ + uint16_t size = gprs_timer_3->length + sizeof(gprs_timer_3->length); + ogs_nas_gprs_timer_3_t target; + + memcpy(&target, gprs_timer_3, sizeof(ogs_nas_gprs_timer_3_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" GPRS_TIMER_3 - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.2.8 S-NSSAI + * O TLV 3-10 */ +int ogs_nas_decode_s_nssai(ogs_nas_s_nssai_t *s_nssai, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_s_nssai_t *source = (ogs_nas_s_nssai_t *)pkbuf->data; + + s_nssai->length = source->length; + size = s_nssai->length + sizeof(s_nssai->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(s_nssai, pkbuf->data - size, size); + + ogs_trace(" S_NSSAI - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_s_nssai(ogs_pkbuf_t *pkbuf, ogs_nas_s_nssai_t *s_nssai) +{ + uint16_t size = s_nssai->length + sizeof(s_nssai->length); + ogs_nas_s_nssai_t target; + + memcpy(&target, s_nssai, sizeof(ogs_nas_s_nssai_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" S_NSSAI - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.1 5GMM capability + * O TLV 3-15 */ +int ogs_nas_decode_5gmm_capability(ogs_nas_5gmm_capability_t *gmm_capability, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_5gmm_capability_t *source = (ogs_nas_5gmm_capability_t *)pkbuf->data; + + gmm_capability->length = source->length; + size = gmm_capability->length + sizeof(gmm_capability->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(gmm_capability, pkbuf->data - size, size); + + ogs_trace(" 5GMM_CAPABILITY - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_5gmm_capability(ogs_pkbuf_t *pkbuf, ogs_nas_5gmm_capability_t *gmm_capability) +{ + uint16_t size = gmm_capability->length + sizeof(gmm_capability->length); + ogs_nas_5gmm_capability_t target; + + memcpy(&target, gmm_capability, sizeof(ogs_nas_5gmm_capability_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" 5GMM_CAPABILITY - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.10 ABBA + * M LV 3-n */ +int ogs_nas_decode_abba(ogs_nas_abba_t *abba, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_abba_t *source = (ogs_nas_abba_t *)pkbuf->data; + + abba->length = source->length; + size = abba->length + sizeof(abba->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(abba, pkbuf->data - size, size); + + ogs_trace(" ABBA - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_abba(ogs_pkbuf_t *pkbuf, ogs_nas_abba_t *abba) +{ + uint16_t size = abba->length + sizeof(abba->length); + ogs_nas_abba_t target; + + memcpy(&target, abba, sizeof(ogs_nas_abba_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" ABBA - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.12 Additional 5G security information + * O TLV 3 */ +int ogs_nas_decode_additional_5g_security_information(ogs_nas_additional_5g_security_information_t *additional_security_information, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_additional_5g_security_information_t *source = (ogs_nas_additional_5g_security_information_t *)pkbuf->data; + + additional_security_information->length = source->length; + size = additional_security_information->length + sizeof(additional_security_information->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(additional_security_information, pkbuf->data - size, size); + + ogs_trace(" ADDITIONAL_5G_SECURITY_INFORMATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_additional_5g_security_information(ogs_pkbuf_t *pkbuf, ogs_nas_additional_5g_security_information_t *additional_security_information) +{ + uint16_t size = additional_security_information->length + sizeof(additional_security_information->length); + ogs_nas_additional_5g_security_information_t target; + + memcpy(&target, additional_security_information, sizeof(ogs_nas_additional_5g_security_information_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" ADDITIONAL_5G_SECURITY_INFORMATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.12A Additional information requested + * O TLV 3 */ +int ogs_nas_decode_additional_information_requested(ogs_nas_additional_information_requested_t *additional_information_requested, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_additional_information_requested_t *source = (ogs_nas_additional_information_requested_t *)pkbuf->data; + + additional_information_requested->length = source->length; + size = additional_information_requested->length + sizeof(additional_information_requested->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(additional_information_requested, pkbuf->data - size, size); + + ogs_trace(" ADDITIONAL_INFORMATION_REQUESTED - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_additional_information_requested(ogs_pkbuf_t *pkbuf, ogs_nas_additional_information_requested_t *additional_information_requested) +{ + uint16_t size = additional_information_requested->length + sizeof(additional_information_requested->length); + ogs_nas_additional_information_requested_t target; + + memcpy(&target, additional_information_requested, sizeof(ogs_nas_additional_information_requested_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" ADDITIONAL_INFORMATION_REQUESTED - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.13 Allowed PDU session status + * O TLV 4-34 */ +int ogs_nas_decode_allowed_pdu_session_status(ogs_nas_allowed_pdu_session_status_t *allowed_pdu_session_status, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_allowed_pdu_session_status_t *source = (ogs_nas_allowed_pdu_session_status_t *)pkbuf->data; + + allowed_pdu_session_status->length = source->length; + size = allowed_pdu_session_status->length + sizeof(allowed_pdu_session_status->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(allowed_pdu_session_status, pkbuf->data - size, size); + + ogs_trace(" ALLOWED_PDU_SESSION_STATUS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_allowed_pdu_session_status(ogs_pkbuf_t *pkbuf, ogs_nas_allowed_pdu_session_status_t *allowed_pdu_session_status) +{ + uint16_t size = allowed_pdu_session_status->length + sizeof(allowed_pdu_session_status->length); + ogs_nas_allowed_pdu_session_status_t target; + + memcpy(&target, allowed_pdu_session_status, sizeof(ogs_nas_allowed_pdu_session_status_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" ALLOWED_PDU_SESSION_STATUS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.14 Authentication failure parameter + * O TLV 16 */ +int ogs_nas_decode_authentication_failure_parameter(ogs_nas_authentication_failure_parameter_t *authentication_failure_parameter, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_authentication_failure_parameter_t *source = (ogs_nas_authentication_failure_parameter_t *)pkbuf->data; + + authentication_failure_parameter->length = source->length; + size = authentication_failure_parameter->length + sizeof(authentication_failure_parameter->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(authentication_failure_parameter, pkbuf->data - size, size); + + ogs_trace(" AUTHENTICATION_FAILURE_PARAMETER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_authentication_failure_parameter(ogs_pkbuf_t *pkbuf, ogs_nas_authentication_failure_parameter_t *authentication_failure_parameter) +{ + uint16_t size = authentication_failure_parameter->length + sizeof(authentication_failure_parameter->length); + ogs_nas_authentication_failure_parameter_t target; + + memcpy(&target, authentication_failure_parameter, sizeof(ogs_nas_authentication_failure_parameter_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" AUTHENTICATION_FAILURE_PARAMETER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.15 Authentication parameter AUTN + * O TLV 18 */ +int ogs_nas_decode_authentication_parameter_autn(ogs_nas_authentication_parameter_autn_t *authentication_parameter_autn, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_authentication_parameter_autn_t *source = (ogs_nas_authentication_parameter_autn_t *)pkbuf->data; + + authentication_parameter_autn->length = source->length; + size = authentication_parameter_autn->length + sizeof(authentication_parameter_autn->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(authentication_parameter_autn, pkbuf->data - size, size); + + ogs_trace(" AUTHENTICATION_PARAMETER_AUTN - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_authentication_parameter_autn(ogs_pkbuf_t *pkbuf, ogs_nas_authentication_parameter_autn_t *authentication_parameter_autn) +{ + uint16_t size = authentication_parameter_autn->length + sizeof(authentication_parameter_autn->length); + ogs_nas_authentication_parameter_autn_t target; + + memcpy(&target, authentication_parameter_autn, sizeof(ogs_nas_authentication_parameter_autn_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" AUTHENTICATION_PARAMETER_AUTN - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.16 Authentication parameter RAND + * O TV 17 */ +int ogs_nas_decode_authentication_parameter_rand(ogs_nas_authentication_parameter_rand_t *authentication_parameter_rand, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_authentication_parameter_rand_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(authentication_parameter_rand, pkbuf->data - size, size); + + ogs_trace(" AUTHENTICATION_PARAMETER_RAND - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_authentication_parameter_rand(ogs_pkbuf_t *pkbuf, ogs_nas_authentication_parameter_rand_t *authentication_parameter_rand) +{ + uint16_t size = sizeof(ogs_nas_authentication_parameter_rand_t); + ogs_nas_authentication_parameter_rand_t target; + + memcpy(&target, authentication_parameter_rand, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" AUTHENTICATION_PARAMETER_RAND - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.17 Authentication response parameter + * O TLV 18 */ +int ogs_nas_decode_authentication_response_parameter(ogs_nas_authentication_response_parameter_t *authentication_response_parameter, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_authentication_response_parameter_t *source = (ogs_nas_authentication_response_parameter_t *)pkbuf->data; + + authentication_response_parameter->length = source->length; + size = authentication_response_parameter->length + sizeof(authentication_response_parameter->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(authentication_response_parameter, pkbuf->data - size, size); + + ogs_trace(" AUTHENTICATION_RESPONSE_PARAMETER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_authentication_response_parameter(ogs_pkbuf_t *pkbuf, ogs_nas_authentication_response_parameter_t *authentication_response_parameter) +{ + uint16_t size = authentication_response_parameter->length + sizeof(authentication_response_parameter->length); + ogs_nas_authentication_response_parameter_t target; + + memcpy(&target, authentication_response_parameter, sizeof(ogs_nas_authentication_response_parameter_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" AUTHENTICATION_RESPONSE_PARAMETER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.18 Configuration update indication + * O TV 1 */ +int ogs_nas_decode_configuration_update_indication(ogs_nas_configuration_update_indication_t *configuration_update_indication, ogs_pkbuf_t *pkbuf) +{ + memcpy(configuration_update_indication, pkbuf->data - 1, 1); + + ogs_trace(" CONFIGURATION_UPDATE_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_configuration_update_indication(ogs_pkbuf_t *pkbuf, ogs_nas_configuration_update_indication_t *configuration_update_indication) +{ + uint16_t size = sizeof(ogs_nas_configuration_update_indication_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, configuration_update_indication, size); + + ogs_trace(" CONFIGURATION_UPDATE_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.18A CAG information list + * O TLV-E 3-n */ +int ogs_nas_decode_cag_information_list(ogs_nas_cag_information_list_t *cag_information_list, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_cag_information_list_t *source = (ogs_nas_cag_information_list_t *)pkbuf->data; + + cag_information_list->length = be16toh(source->length); + size = cag_information_list->length + sizeof(cag_information_list->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + cag_information_list->buffer = pkbuf->data - size + sizeof(cag_information_list->length); + + ogs_trace(" CAG_INFORMATION_LIST - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)cag_information_list->buffer, cag_information_list->length); + + return size; +} + +int ogs_nas_encode_cag_information_list(ogs_pkbuf_t *pkbuf, ogs_nas_cag_information_list_t *cag_information_list) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(cag_information_list); + ogs_assert(cag_information_list->buffer); + + size = sizeof(cag_information_list->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(cag_information_list->length); + memcpy(pkbuf->data - size, &target, size); + + size = cag_information_list->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, cag_information_list->buffer, size); + + ogs_trace(" CAG_INFORMATION_LIST - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return cag_information_list->length + sizeof(cag_information_list->length); +} + +/* 9.11.3.18B CIoT small data container + * O TLV 4-257 */ +int ogs_nas_decode_ciot_small_data_container(ogs_nas_ciot_small_data_container_t *ciot_small_data_container, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_ciot_small_data_container_t *source = (ogs_nas_ciot_small_data_container_t *)pkbuf->data; + + ciot_small_data_container->length = source->length; + size = ciot_small_data_container->length + sizeof(ciot_small_data_container->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(ciot_small_data_container, pkbuf->data - size, size); + + ogs_trace(" CIOT_SMALL_DATA_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_ciot_small_data_container(ogs_pkbuf_t *pkbuf, ogs_nas_ciot_small_data_container_t *ciot_small_data_container) +{ + uint16_t size = ciot_small_data_container->length + sizeof(ciot_small_data_container->length); + ogs_nas_ciot_small_data_container_t target; + + memcpy(&target, ciot_small_data_container, sizeof(ogs_nas_ciot_small_data_container_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" CIOT_SMALL_DATA_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.18C Ciphering key data + * O TLV-E x-n */ +int ogs_nas_decode_ciphering_key_data(ogs_nas_ciphering_key_data_t *ciphering_key_data, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_ciphering_key_data_t *source = (ogs_nas_ciphering_key_data_t *)pkbuf->data; + + ciphering_key_data->length = be16toh(source->length); + size = ciphering_key_data->length + sizeof(ciphering_key_data->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + ciphering_key_data->buffer = pkbuf->data - size + sizeof(ciphering_key_data->length); + + ogs_trace(" CIPHERING_KEY_DATA - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)ciphering_key_data->buffer, ciphering_key_data->length); + + return size; +} + +int ogs_nas_encode_ciphering_key_data(ogs_pkbuf_t *pkbuf, ogs_nas_ciphering_key_data_t *ciphering_key_data) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(ciphering_key_data); + ogs_assert(ciphering_key_data->buffer); + + size = sizeof(ciphering_key_data->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(ciphering_key_data->length); + memcpy(pkbuf->data - size, &target, size); + + size = ciphering_key_data->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, ciphering_key_data->buffer, size); + + ogs_trace(" CIPHERING_KEY_DATA - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return ciphering_key_data->length + sizeof(ciphering_key_data->length); +} + +/* 9.11.3.18D Control plane service type + * M V 1/2 */ +int ogs_nas_decode_control_plane_service_type(ogs_nas_control_plane_service_type_t *control_plane_service_type, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_control_plane_service_type_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(control_plane_service_type, pkbuf->data - size, size); + + ogs_trace(" CONTROL_PLANE_SERVICE_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_control_plane_service_type(ogs_pkbuf_t *pkbuf, ogs_nas_control_plane_service_type_t *control_plane_service_type) +{ + uint16_t size = sizeof(ogs_nas_control_plane_service_type_t); + ogs_nas_control_plane_service_type_t target; + + memcpy(&target, control_plane_service_type, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" CONTROL_PLANE_SERVICE_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.19 Daylight saving time + * O TLV 3 */ +int ogs_nas_decode_daylight_saving_time(ogs_nas_daylight_saving_time_t *daylight_saving_time, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_daylight_saving_time_t *source = (ogs_nas_daylight_saving_time_t *)pkbuf->data; + + daylight_saving_time->length = source->length; + size = daylight_saving_time->length + sizeof(daylight_saving_time->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(daylight_saving_time, pkbuf->data - size, size); + + ogs_trace(" DAYLIGHT_SAVING_TIME - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_daylight_saving_time(ogs_pkbuf_t *pkbuf, ogs_nas_daylight_saving_time_t *daylight_saving_time) +{ + uint16_t size = daylight_saving_time->length + sizeof(daylight_saving_time->length); + ogs_nas_daylight_saving_time_t target; + + memcpy(&target, daylight_saving_time, sizeof(ogs_nas_daylight_saving_time_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" DAYLIGHT_SAVING_TIME - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.2 5GMM cause + * M V 1 */ +int ogs_nas_decode_5gmm_cause(ogs_nas_5gmm_cause_t *gmm_cause, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_5gmm_cause_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(gmm_cause, pkbuf->data - size, size); + + ogs_trace(" 5GMM_CAUSE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_5gmm_cause(ogs_pkbuf_t *pkbuf, ogs_nas_5gmm_cause_t *gmm_cause) +{ + uint16_t size = sizeof(ogs_nas_5gmm_cause_t); + ogs_nas_5gmm_cause_t target; + + memcpy(&target, gmm_cause, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" 5GMM_CAUSE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.20 De-registration type + * M V 1/2 */ +int ogs_nas_decode_de_registration_type(ogs_nas_de_registration_type_t *de_registration_type, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_de_registration_type_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(de_registration_type, pkbuf->data - size, size); + + ogs_trace(" DE_REGISTRATION_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_de_registration_type(ogs_pkbuf_t *pkbuf, ogs_nas_de_registration_type_t *de_registration_type) +{ + uint16_t size = sizeof(ogs_nas_de_registration_type_t); + ogs_nas_de_registration_type_t target; + + memcpy(&target, de_registration_type, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" DE_REGISTRATION_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.23 Emergency number list + * O TLV 5-50 */ +int ogs_nas_decode_emergency_number_list(ogs_nas_emergency_number_list_t *emergency_number_list, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_emergency_number_list_t *source = (ogs_nas_emergency_number_list_t *)pkbuf->data; + + emergency_number_list->length = source->length; + size = emergency_number_list->length + sizeof(emergency_number_list->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(emergency_number_list, pkbuf->data - size, size); + + ogs_trace(" EMERGENCY_NUMBER_LIST - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_emergency_number_list(ogs_pkbuf_t *pkbuf, ogs_nas_emergency_number_list_t *emergency_number_list) +{ + uint16_t size = emergency_number_list->length + sizeof(emergency_number_list->length); + ogs_nas_emergency_number_list_t target; + + memcpy(&target, emergency_number_list, sizeof(ogs_nas_emergency_number_list_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" EMERGENCY_NUMBER_LIST - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.23A EPS bearer context status + * O TLV 4 */ +int ogs_nas_decode_eps_bearer_context_status(ogs_nas_eps_bearer_context_status_t *eps_bearer_context_status, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_eps_bearer_context_status_t *source = (ogs_nas_eps_bearer_context_status_t *)pkbuf->data; + + eps_bearer_context_status->length = source->length; + size = eps_bearer_context_status->length + sizeof(eps_bearer_context_status->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(eps_bearer_context_status, pkbuf->data - size, size); + + ogs_trace(" EPS_BEARER_CONTEXT_STATUS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_eps_bearer_context_status(ogs_pkbuf_t *pkbuf, ogs_nas_eps_bearer_context_status_t *eps_bearer_context_status) +{ + uint16_t size = eps_bearer_context_status->length + sizeof(eps_bearer_context_status->length); + ogs_nas_eps_bearer_context_status_t target; + + memcpy(&target, eps_bearer_context_status, sizeof(ogs_nas_eps_bearer_context_status_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" EPS_BEARER_CONTEXT_STATUS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.24 EPS NAS message container + * O TLV-E 4-n */ +int ogs_nas_decode_eps_nas_message_container(ogs_nas_eps_nas_message_container_t *eps_nas_message_container, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_eps_nas_message_container_t *source = (ogs_nas_eps_nas_message_container_t *)pkbuf->data; + + eps_nas_message_container->length = be16toh(source->length); + size = eps_nas_message_container->length + sizeof(eps_nas_message_container->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + eps_nas_message_container->buffer = pkbuf->data - size + sizeof(eps_nas_message_container->length); + + ogs_trace(" EPS_NAS_MESSAGE_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)eps_nas_message_container->buffer, eps_nas_message_container->length); + + return size; +} + +int ogs_nas_encode_eps_nas_message_container(ogs_pkbuf_t *pkbuf, ogs_nas_eps_nas_message_container_t *eps_nas_message_container) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(eps_nas_message_container); + ogs_assert(eps_nas_message_container->buffer); + + size = sizeof(eps_nas_message_container->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(eps_nas_message_container->length); + memcpy(pkbuf->data - size, &target, size); + + size = eps_nas_message_container->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, eps_nas_message_container->buffer, size); + + ogs_trace(" EPS_NAS_MESSAGE_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return eps_nas_message_container->length + sizeof(eps_nas_message_container->length); +} + +/* 9.11.3.25 EPS NAS security algorithms + * O TV 2 */ +int ogs_nas_decode_eps_nas_security_algorithms(ogs_nas_eps_nas_security_algorithms_t *eps_nas_security_algorithms, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_eps_nas_security_algorithms_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(eps_nas_security_algorithms, pkbuf->data - size, size); + + ogs_trace(" EPS_NAS_SECURITY_ALGORITHMS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_eps_nas_security_algorithms(ogs_pkbuf_t *pkbuf, ogs_nas_eps_nas_security_algorithms_t *eps_nas_security_algorithms) +{ + uint16_t size = sizeof(ogs_nas_eps_nas_security_algorithms_t); + ogs_nas_eps_nas_security_algorithms_t target; + + memcpy(&target, eps_nas_security_algorithms, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" EPS_NAS_SECURITY_ALGORITHMS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.26 Extended emergency number list + * O TLV-E 7-65538 */ +int ogs_nas_decode_extended_emergency_number_list(ogs_nas_extended_emergency_number_list_t *extended_emergency_number_list, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_extended_emergency_number_list_t *source = (ogs_nas_extended_emergency_number_list_t *)pkbuf->data; + + extended_emergency_number_list->length = be16toh(source->length); + size = extended_emergency_number_list->length + sizeof(extended_emergency_number_list->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + extended_emergency_number_list->buffer = pkbuf->data - size + sizeof(extended_emergency_number_list->length); + + ogs_trace(" EXTENDED_EMERGENCY_NUMBER_LIST - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)extended_emergency_number_list->buffer, extended_emergency_number_list->length); + + return size; +} + +int ogs_nas_encode_extended_emergency_number_list(ogs_pkbuf_t *pkbuf, ogs_nas_extended_emergency_number_list_t *extended_emergency_number_list) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(extended_emergency_number_list); + ogs_assert(extended_emergency_number_list->buffer); + + size = sizeof(extended_emergency_number_list->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(extended_emergency_number_list->length); + memcpy(pkbuf->data - size, &target, size); + + size = extended_emergency_number_list->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, extended_emergency_number_list->buffer, size); + + ogs_trace(" EXTENDED_EMERGENCY_NUMBER_LIST - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return extended_emergency_number_list->length + sizeof(extended_emergency_number_list->length); +} + +/* 9.11.3.26A Extended DRX parameters + * O TLV 3 */ +int ogs_nas_decode_extended_drx_parameters(ogs_nas_extended_drx_parameters_t *extended_drx_parameters, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_extended_drx_parameters_t *source = (ogs_nas_extended_drx_parameters_t *)pkbuf->data; + + extended_drx_parameters->length = source->length; + size = extended_drx_parameters->length + sizeof(extended_drx_parameters->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(extended_drx_parameters, pkbuf->data - size, size); + + ogs_trace(" EXTENDED_DRX_PARAMETERS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_extended_drx_parameters(ogs_pkbuf_t *pkbuf, ogs_nas_extended_drx_parameters_t *extended_drx_parameters) +{ + uint16_t size = extended_drx_parameters->length + sizeof(extended_drx_parameters->length); + ogs_nas_extended_drx_parameters_t target; + + memcpy(&target, extended_drx_parameters, sizeof(ogs_nas_extended_drx_parameters_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" EXTENDED_DRX_PARAMETERS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.28 IMEISV request + * O TV 1 */ +int ogs_nas_decode_imeisv_request(ogs_nas_imeisv_request_t *imeisv_request, ogs_pkbuf_t *pkbuf) +{ + memcpy(imeisv_request, pkbuf->data - 1, 1); + + ogs_trace(" IMEISV_REQUEST - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_imeisv_request(ogs_pkbuf_t *pkbuf, ogs_nas_imeisv_request_t *imeisv_request) +{ + uint16_t size = sizeof(ogs_nas_imeisv_request_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, imeisv_request, size); + + ogs_trace(" IMEISV_REQUEST - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.29 LADN indication + * O TLV-E 3-811 */ +int ogs_nas_decode_ladn_indication(ogs_nas_ladn_indication_t *ladn_indication, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_ladn_indication_t *source = (ogs_nas_ladn_indication_t *)pkbuf->data; + + ladn_indication->length = be16toh(source->length); + size = ladn_indication->length + sizeof(ladn_indication->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + ladn_indication->buffer = pkbuf->data - size + sizeof(ladn_indication->length); + + ogs_trace(" LADN_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)ladn_indication->buffer, ladn_indication->length); + + return size; +} + +int ogs_nas_encode_ladn_indication(ogs_pkbuf_t *pkbuf, ogs_nas_ladn_indication_t *ladn_indication) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(ladn_indication); + ogs_assert(ladn_indication->buffer); + + size = sizeof(ladn_indication->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(ladn_indication->length); + memcpy(pkbuf->data - size, &target, size); + + size = ladn_indication->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, ladn_indication->buffer, size); + + ogs_trace(" LADN_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return ladn_indication->length + sizeof(ladn_indication->length); +} + +/* 9.11.3.2A 5GS DRX parameters + * O TLV 3 */ +int ogs_nas_decode_5gs_drx_parameters(ogs_nas_5gs_drx_parameters_t *drx_parameters, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_5gs_drx_parameters_t *source = (ogs_nas_5gs_drx_parameters_t *)pkbuf->data; + + drx_parameters->length = source->length; + size = drx_parameters->length + sizeof(drx_parameters->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(drx_parameters, pkbuf->data - size, size); + + ogs_trace(" 5GS_DRX_PARAMETERS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_5gs_drx_parameters(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_drx_parameters_t *drx_parameters) +{ + uint16_t size = drx_parameters->length + sizeof(drx_parameters->length); + ogs_nas_5gs_drx_parameters_t target; + + memcpy(&target, drx_parameters, sizeof(ogs_nas_5gs_drx_parameters_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" 5GS_DRX_PARAMETERS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.3 5GS identity type + * M V 1/2 */ +int ogs_nas_decode_5gs_identity_type(ogs_nas_5gs_identity_type_t *identity_type, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_5gs_identity_type_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(identity_type, pkbuf->data - size, size); + + ogs_trace(" 5GS_IDENTITY_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_5gs_identity_type(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_identity_type_t *identity_type) +{ + uint16_t size = sizeof(ogs_nas_5gs_identity_type_t); + ogs_nas_5gs_identity_type_t target; + + memcpy(&target, identity_type, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" 5GS_IDENTITY_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.30 LADN information + * O TLV-E 12-1715 */ +int ogs_nas_decode_ladn_information(ogs_nas_ladn_information_t *ladn_information, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_ladn_information_t *source = (ogs_nas_ladn_information_t *)pkbuf->data; + + ladn_information->length = be16toh(source->length); + size = ladn_information->length + sizeof(ladn_information->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + ladn_information->buffer = pkbuf->data - size + sizeof(ladn_information->length); + + ogs_trace(" LADN_INFORMATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)ladn_information->buffer, ladn_information->length); + + return size; +} + +int ogs_nas_encode_ladn_information(ogs_pkbuf_t *pkbuf, ogs_nas_ladn_information_t *ladn_information) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(ladn_information); + ogs_assert(ladn_information->buffer); + + size = sizeof(ladn_information->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(ladn_information->length); + memcpy(pkbuf->data - size, &target, size); + + size = ladn_information->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, ladn_information->buffer, size); + + ogs_trace(" LADN_INFORMATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return ladn_information->length + sizeof(ladn_information->length); +} + +/* 9.11.3.31 MICO indication + * O TV 1 */ +int ogs_nas_decode_mico_indication(ogs_nas_mico_indication_t *mico_indication, ogs_pkbuf_t *pkbuf) +{ + memcpy(mico_indication, pkbuf->data - 1, 1); + + ogs_trace(" MICO_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_mico_indication(ogs_pkbuf_t *pkbuf, ogs_nas_mico_indication_t *mico_indication) +{ + uint16_t size = sizeof(ogs_nas_mico_indication_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, mico_indication, size); + + ogs_trace(" MICO_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.31A MA PDU session information + * O TV 1 */ +int ogs_nas_decode_ma_pdu_session_information(ogs_nas_ma_pdu_session_information_t *ma_pdu_session_information, ogs_pkbuf_t *pkbuf) +{ + memcpy(ma_pdu_session_information, pkbuf->data - 1, 1); + + ogs_trace(" MA_PDU_SESSION_INFORMATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_ma_pdu_session_information(ogs_pkbuf_t *pkbuf, ogs_nas_ma_pdu_session_information_t *ma_pdu_session_information) +{ + uint16_t size = sizeof(ogs_nas_ma_pdu_session_information_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, ma_pdu_session_information, size); + + ogs_trace(" MA_PDU_SESSION_INFORMATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.31B Mapped NSSAI + * O TLV 3-42 */ +int ogs_nas_decode_mapped_nssai(ogs_nas_mapped_nssai_t *mapped_nssai, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_mapped_nssai_t *source = (ogs_nas_mapped_nssai_t *)pkbuf->data; + + mapped_nssai->length = source->length; + size = mapped_nssai->length + sizeof(mapped_nssai->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(mapped_nssai, pkbuf->data - size, size); + + ogs_trace(" MAPPED_NSSAI - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_mapped_nssai(ogs_pkbuf_t *pkbuf, ogs_nas_mapped_nssai_t *mapped_nssai) +{ + uint16_t size = mapped_nssai->length + sizeof(mapped_nssai->length); + ogs_nas_mapped_nssai_t target; + + memcpy(&target, mapped_nssai, sizeof(ogs_nas_mapped_nssai_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" MAPPED_NSSAI - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.31C Mobile station classmark 2 + * O TLV 5 */ +int ogs_nas_decode_mobile_station_classmark_2(ogs_nas_mobile_station_classmark_2_t *mobile_station_classmark_2, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_mobile_station_classmark_2_t *source = (ogs_nas_mobile_station_classmark_2_t *)pkbuf->data; + + mobile_station_classmark_2->length = source->length; + size = mobile_station_classmark_2->length + sizeof(mobile_station_classmark_2->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(mobile_station_classmark_2, pkbuf->data - size, size); + + ogs_trace(" MOBILE_STATION_CLASSMARK_2 - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_mobile_station_classmark_2(ogs_pkbuf_t *pkbuf, ogs_nas_mobile_station_classmark_2_t *mobile_station_classmark_2) +{ + uint16_t size = mobile_station_classmark_2->length + sizeof(mobile_station_classmark_2->length); + ogs_nas_mobile_station_classmark_2_t target; + + memcpy(&target, mobile_station_classmark_2, sizeof(ogs_nas_mobile_station_classmark_2_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" MOBILE_STATION_CLASSMARK_2 - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.32 key set identifier + * O TV 1 */ +int ogs_nas_decode_key_set_identifier(ogs_nas_key_set_identifier_t *key_set_identifier, ogs_pkbuf_t *pkbuf) +{ + memcpy(key_set_identifier, pkbuf->data - 1, 1); + + ogs_trace(" KEY_SET_IDENTIFIER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_key_set_identifier(ogs_pkbuf_t *pkbuf, ogs_nas_key_set_identifier_t *key_set_identifier) +{ + uint16_t size = sizeof(ogs_nas_key_set_identifier_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, key_set_identifier, size); + + ogs_trace(" KEY_SET_IDENTIFIER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.33 message container + * O TLV-E 4-n */ +int ogs_nas_decode_message_container(ogs_nas_message_container_t *message_container, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_message_container_t *source = (ogs_nas_message_container_t *)pkbuf->data; + + message_container->length = be16toh(source->length); + size = message_container->length + sizeof(message_container->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + message_container->buffer = pkbuf->data - size + sizeof(message_container->length); + + ogs_trace(" MESSAGE_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)message_container->buffer, message_container->length); + + return size; +} + +int ogs_nas_encode_message_container(ogs_pkbuf_t *pkbuf, ogs_nas_message_container_t *message_container) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(message_container); + ogs_assert(message_container->buffer); + + size = sizeof(message_container->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(message_container->length); + memcpy(pkbuf->data - size, &target, size); + + size = message_container->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, message_container->buffer, size); + + ogs_trace(" MESSAGE_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return message_container->length + sizeof(message_container->length); +} + +/* 9.11.3.34 security algorithms + * M V 1 */ +int ogs_nas_decode_security_algorithms(ogs_nas_security_algorithms_t *security_algorithms, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_security_algorithms_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(security_algorithms, pkbuf->data - size, size); + + ogs_trace(" SECURITY_ALGORITHMS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_security_algorithms(ogs_pkbuf_t *pkbuf, ogs_nas_security_algorithms_t *security_algorithms) +{ + uint16_t size = sizeof(ogs_nas_security_algorithms_t); + ogs_nas_security_algorithms_t target; + + memcpy(&target, security_algorithms, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" SECURITY_ALGORITHMS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.35 Network name + * O TLV 3-n */ +int ogs_nas_decode_network_name(ogs_nas_network_name_t *network_name, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_network_name_t *source = (ogs_nas_network_name_t *)pkbuf->data; + + network_name->length = source->length; + size = network_name->length + sizeof(network_name->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(network_name, pkbuf->data - size, size); + + ogs_trace(" NETWORK_NAME - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_network_name(ogs_pkbuf_t *pkbuf, ogs_nas_network_name_t *network_name) +{ + uint16_t size = network_name->length + sizeof(network_name->length); + ogs_nas_network_name_t target; + + memcpy(&target, network_name, sizeof(ogs_nas_network_name_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" NETWORK_NAME - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.36 Network slicing indication + * O TV 1 */ +int ogs_nas_decode_network_slicing_indication(ogs_nas_network_slicing_indication_t *network_slicing_indication, ogs_pkbuf_t *pkbuf) +{ + memcpy(network_slicing_indication, pkbuf->data - 1, 1); + + ogs_trace(" NETWORK_SLICING_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_network_slicing_indication(ogs_pkbuf_t *pkbuf, ogs_nas_network_slicing_indication_t *network_slicing_indication) +{ + uint16_t size = sizeof(ogs_nas_network_slicing_indication_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, network_slicing_indication, size); + + ogs_trace(" NETWORK_SLICING_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.36A Non-3GPP NW provided policies + * O TV 1 */ +int ogs_nas_decode_non_3gpp_nw_provided_policies(ogs_nas_non_3gpp_nw_provided_policies_t *non_3gpp_nw_provided_policies, ogs_pkbuf_t *pkbuf) +{ + memcpy(non_3gpp_nw_provided_policies, pkbuf->data - 1, 1); + + ogs_trace(" NON_3GPP_NW_PROVIDED_POLICIES - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_non_3gpp_nw_provided_policies(ogs_pkbuf_t *pkbuf, ogs_nas_non_3gpp_nw_provided_policies_t *non_3gpp_nw_provided_policies) +{ + uint16_t size = sizeof(ogs_nas_non_3gpp_nw_provided_policies_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, non_3gpp_nw_provided_policies, size); + + ogs_trace(" NON_3GPP_NW_PROVIDED_POLICIES - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.37 NSSAI + * O TLV 4-74 */ +int ogs_nas_decode_nssai(ogs_nas_nssai_t *nssai, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_nssai_t *source = (ogs_nas_nssai_t *)pkbuf->data; + + nssai->length = source->length; + size = nssai->length + sizeof(nssai->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(nssai, pkbuf->data - size, size); + + ogs_trace(" NSSAI - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_nssai(ogs_pkbuf_t *pkbuf, ogs_nas_nssai_t *nssai) +{ + uint16_t size = nssai->length + sizeof(nssai->length); + ogs_nas_nssai_t target; + + memcpy(&target, nssai, sizeof(ogs_nas_nssai_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" NSSAI - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.37A NSSAI inclusion mode + * O TV 1 */ +int ogs_nas_decode_nssai_inclusion_mode(ogs_nas_nssai_inclusion_mode_t *nssai_inclusion_mode, ogs_pkbuf_t *pkbuf) +{ + memcpy(nssai_inclusion_mode, pkbuf->data - 1, 1); + + ogs_trace(" NSSAI_INCLUSION_MODE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_nssai_inclusion_mode(ogs_pkbuf_t *pkbuf, ogs_nas_nssai_inclusion_mode_t *nssai_inclusion_mode) +{ + uint16_t size = sizeof(ogs_nas_nssai_inclusion_mode_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, nssai_inclusion_mode, size); + + ogs_trace(" NSSAI_INCLUSION_MODE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.38 Operator-defined access category definitions + * O TLV-E 3-n */ +int ogs_nas_decode_operator_defined_access_category_definitions(ogs_nas_operator_defined_access_category_definitions_t *operator_defined_access_category_definitions, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_operator_defined_access_category_definitions_t *source = (ogs_nas_operator_defined_access_category_definitions_t *)pkbuf->data; + + operator_defined_access_category_definitions->length = be16toh(source->length); + size = operator_defined_access_category_definitions->length + sizeof(operator_defined_access_category_definitions->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + operator_defined_access_category_definitions->buffer = pkbuf->data - size + sizeof(operator_defined_access_category_definitions->length); + + ogs_trace(" OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)operator_defined_access_category_definitions->buffer, operator_defined_access_category_definitions->length); + + return size; +} + +int ogs_nas_encode_operator_defined_access_category_definitions(ogs_pkbuf_t *pkbuf, ogs_nas_operator_defined_access_category_definitions_t *operator_defined_access_category_definitions) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(operator_defined_access_category_definitions); + ogs_assert(operator_defined_access_category_definitions->buffer); + + size = sizeof(operator_defined_access_category_definitions->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(operator_defined_access_category_definitions->length); + memcpy(pkbuf->data - size, &target, size); + + size = operator_defined_access_category_definitions->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, operator_defined_access_category_definitions->buffer, size); + + ogs_trace(" OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return operator_defined_access_category_definitions->length + sizeof(operator_defined_access_category_definitions->length); +} + +/* 9.11.3.39 Payload container + * O TLV-E 4-65538 */ +int ogs_nas_decode_payload_container(ogs_nas_payload_container_t *payload_container, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_payload_container_t *source = (ogs_nas_payload_container_t *)pkbuf->data; + + payload_container->length = be16toh(source->length); + size = payload_container->length + sizeof(payload_container->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + payload_container->buffer = pkbuf->data - size + sizeof(payload_container->length); + + ogs_trace(" PAYLOAD_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)payload_container->buffer, payload_container->length); + + return size; +} + +int ogs_nas_encode_payload_container(ogs_pkbuf_t *pkbuf, ogs_nas_payload_container_t *payload_container) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(payload_container); + ogs_assert(payload_container->buffer); + + size = sizeof(payload_container->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(payload_container->length); + memcpy(pkbuf->data - size, &target, size); + + size = payload_container->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, payload_container->buffer, size); + + ogs_trace(" PAYLOAD_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return payload_container->length + sizeof(payload_container->length); +} + +/* 9.11.3.4 5GS mobile identity + * M LV-E 6-n */ +int ogs_nas_decode_5gs_mobile_identity(ogs_nas_5gs_mobile_identity_t *mobile_identity, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_5gs_mobile_identity_t *source = (ogs_nas_5gs_mobile_identity_t *)pkbuf->data; + + mobile_identity->length = source->length; + size = mobile_identity->length + sizeof(mobile_identity->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(mobile_identity, pkbuf->data - size, size); + + if (mobile_identity->guti.type == OGS_NAS_5GS_MOBILE_IDENTITY_GUTI) { + mobile_identity->guti.m_tmsi = be32toh(mobile_identity->guti.m_tmsi); + } else if (mobile_identity->s_tmsi.type == OGS_NAS_5GS_MOBILE_IDENTITY_S_TMSI) { + mobile_identity->s_tmsi.m_tmsi = be32toh(mobile_identity->s_tmsi.m_tmsi); + } + + ogs_trace(" 5GS_MOBILE_IDENTITY - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_5gs_mobile_identity(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_mobile_identity_t *mobile_identity) +{ + uint16_t size = mobile_identity->length + sizeof(mobile_identity->length); + ogs_nas_5gs_mobile_identity_t target; + + memcpy(&target, mobile_identity, sizeof(ogs_nas_5gs_mobile_identity_t)); + if (mobile_identity->guti.type == OGS_NAS_5GS_MOBILE_IDENTITY_GUTI) { + target.guti.m_tmsi = htobe32(mobile_identity->guti.m_tmsi); + target.guti._0xf = 0xf; + } else if (mobile_identity->s_tmsi.type == OGS_NAS_5GS_MOBILE_IDENTITY_S_TMSI) { + target.s_tmsi.m_tmsi = htobe32(mobile_identity->s_tmsi.m_tmsi); + target.s_tmsi._0xf = 0xf; + } + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" 5GS_MOBILE_IDENTITY - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.40 Payload container type + * O TV 1 */ +int ogs_nas_decode_payload_container_type(ogs_nas_payload_container_type_t *payload_container_type, ogs_pkbuf_t *pkbuf) +{ + memcpy(payload_container_type, pkbuf->data - 1, 1); + + ogs_trace(" PAYLOAD_CONTAINER_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_payload_container_type(ogs_pkbuf_t *pkbuf, ogs_nas_payload_container_type_t *payload_container_type) +{ + uint16_t size = sizeof(ogs_nas_payload_container_type_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, payload_container_type, size); + + ogs_trace(" PAYLOAD_CONTAINER_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.41 PDU session identity 2 + * C TV 2 */ +int ogs_nas_decode_pdu_session_identity_2(ogs_nas_pdu_session_identity_2_t *pdu_session_identity_2, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_pdu_session_identity_2_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pdu_session_identity_2, pkbuf->data - size, size); + + ogs_trace(" PDU_SESSION_IDENTITY_2 - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_pdu_session_identity_2(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_session_identity_2_t *pdu_session_identity_2) +{ + uint16_t size = sizeof(ogs_nas_pdu_session_identity_2_t); + ogs_nas_pdu_session_identity_2_t target; + + memcpy(&target, pdu_session_identity_2, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" PDU_SESSION_IDENTITY_2 - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.42 PDU session reactivation result + * O TLV 4-34 */ +int ogs_nas_decode_pdu_session_reactivation_result(ogs_nas_pdu_session_reactivation_result_t *pdu_session_reactivation_result, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_pdu_session_reactivation_result_t *source = (ogs_nas_pdu_session_reactivation_result_t *)pkbuf->data; + + pdu_session_reactivation_result->length = source->length; + size = pdu_session_reactivation_result->length + sizeof(pdu_session_reactivation_result->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pdu_session_reactivation_result, pkbuf->data - size, size); + + ogs_trace(" PDU_SESSION_REACTIVATION_RESULT - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_pdu_session_reactivation_result(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_session_reactivation_result_t *pdu_session_reactivation_result) +{ + uint16_t size = pdu_session_reactivation_result->length + sizeof(pdu_session_reactivation_result->length); + ogs_nas_pdu_session_reactivation_result_t target; + + memcpy(&target, pdu_session_reactivation_result, sizeof(ogs_nas_pdu_session_reactivation_result_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" PDU_SESSION_REACTIVATION_RESULT - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.43 PDU session reactivation result error cause + * O TLV-E 5-515 */ +int ogs_nas_decode_pdu_session_reactivation_result_error_cause(ogs_nas_pdu_session_reactivation_result_error_cause_t *pdu_session_reactivation_result_error_cause, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_pdu_session_reactivation_result_error_cause_t *source = (ogs_nas_pdu_session_reactivation_result_error_cause_t *)pkbuf->data; + + pdu_session_reactivation_result_error_cause->length = be16toh(source->length); + size = pdu_session_reactivation_result_error_cause->length + sizeof(pdu_session_reactivation_result_error_cause->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + pdu_session_reactivation_result_error_cause->buffer = pkbuf->data - size + sizeof(pdu_session_reactivation_result_error_cause->length); + + ogs_trace(" PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)pdu_session_reactivation_result_error_cause->buffer, pdu_session_reactivation_result_error_cause->length); + + return size; +} + +int ogs_nas_encode_pdu_session_reactivation_result_error_cause(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_session_reactivation_result_error_cause_t *pdu_session_reactivation_result_error_cause) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(pdu_session_reactivation_result_error_cause); + ogs_assert(pdu_session_reactivation_result_error_cause->buffer); + + size = sizeof(pdu_session_reactivation_result_error_cause->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(pdu_session_reactivation_result_error_cause->length); + memcpy(pkbuf->data - size, &target, size); + + size = pdu_session_reactivation_result_error_cause->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, pdu_session_reactivation_result_error_cause->buffer, size); + + ogs_trace(" PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return pdu_session_reactivation_result_error_cause->length + sizeof(pdu_session_reactivation_result_error_cause->length); +} + +/* 9.11.3.44 PDU session status + * O TLV 4-34 */ +int ogs_nas_decode_pdu_session_status(ogs_nas_pdu_session_status_t *pdu_session_status, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_pdu_session_status_t *source = (ogs_nas_pdu_session_status_t *)pkbuf->data; + + pdu_session_status->length = source->length; + size = pdu_session_status->length + sizeof(pdu_session_status->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pdu_session_status, pkbuf->data - size, size); + + ogs_trace(" PDU_SESSION_STATUS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_pdu_session_status(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_session_status_t *pdu_session_status) +{ + uint16_t size = pdu_session_status->length + sizeof(pdu_session_status->length); + ogs_nas_pdu_session_status_t target; + + memcpy(&target, pdu_session_status, sizeof(ogs_nas_pdu_session_status_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" PDU_SESSION_STATUS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.45 PLMN list + * O TLV 5-47 */ +int ogs_nas_decode_plmn_list(ogs_nas_plmn_list_t *plmn_list, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_plmn_list_t *source = (ogs_nas_plmn_list_t *)pkbuf->data; + + plmn_list->length = source->length; + size = plmn_list->length + sizeof(plmn_list->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(plmn_list, pkbuf->data - size, size); + + ogs_trace(" PLMN_LIST - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_plmn_list(ogs_pkbuf_t *pkbuf, ogs_nas_plmn_list_t *plmn_list) +{ + uint16_t size = plmn_list->length + sizeof(plmn_list->length); + ogs_nas_plmn_list_t target; + + memcpy(&target, plmn_list, sizeof(ogs_nas_plmn_list_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" PLMN_LIST - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.46 Rejected NSSAI + * O TLV 4-42 */ +int ogs_nas_decode_rejected_nssai(ogs_nas_rejected_nssai_t *rejected_nssai, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_rejected_nssai_t *source = (ogs_nas_rejected_nssai_t *)pkbuf->data; + + rejected_nssai->length = source->length; + size = rejected_nssai->length + sizeof(rejected_nssai->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(rejected_nssai, pkbuf->data - size, size); + + ogs_trace(" REJECTED_NSSAI - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_rejected_nssai(ogs_pkbuf_t *pkbuf, ogs_nas_rejected_nssai_t *rejected_nssai) +{ + uint16_t size = rejected_nssai->length + sizeof(rejected_nssai->length); + ogs_nas_rejected_nssai_t target; + + memcpy(&target, rejected_nssai, sizeof(ogs_nas_rejected_nssai_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" REJECTED_NSSAI - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.46A Release assistance indication + * O TV 1 */ +int ogs_nas_decode_release_assistance_indication(ogs_nas_release_assistance_indication_t *release_assistance_indication, ogs_pkbuf_t *pkbuf) +{ + memcpy(release_assistance_indication, pkbuf->data - 1, 1); + + ogs_trace(" RELEASE_ASSISTANCE_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_release_assistance_indication(ogs_pkbuf_t *pkbuf, ogs_nas_release_assistance_indication_t *release_assistance_indication) +{ + uint16_t size = sizeof(ogs_nas_release_assistance_indication_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, release_assistance_indication, size); + + ogs_trace(" RELEASE_ASSISTANCE_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.47 Request type + * O TV 1 */ +int ogs_nas_decode_request_type(ogs_nas_request_type_t *request_type, ogs_pkbuf_t *pkbuf) +{ + memcpy(request_type, pkbuf->data - 1, 1); + + ogs_trace(" REQUEST_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_request_type(ogs_pkbuf_t *pkbuf, ogs_nas_request_type_t *request_type) +{ + uint16_t size = sizeof(ogs_nas_request_type_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, request_type, size); + + ogs_trace(" REQUEST_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.48 S1 UE network capability + * O TLV 4-15 */ +int ogs_nas_decode_s1_ue_network_capability(ogs_nas_s1_ue_network_capability_t *s1_ue_network_capability, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_s1_ue_network_capability_t *source = (ogs_nas_s1_ue_network_capability_t *)pkbuf->data; + + s1_ue_network_capability->length = source->length; + size = s1_ue_network_capability->length + sizeof(s1_ue_network_capability->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(s1_ue_network_capability, pkbuf->data - size, size); + + ogs_trace(" S1_UE_NETWORK_CAPABILITY - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_s1_ue_network_capability(ogs_pkbuf_t *pkbuf, ogs_nas_s1_ue_network_capability_t *s1_ue_network_capability) +{ + uint16_t size = s1_ue_network_capability->length + sizeof(s1_ue_network_capability->length); + ogs_nas_s1_ue_network_capability_t target; + + memcpy(&target, s1_ue_network_capability, sizeof(ogs_nas_s1_ue_network_capability_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" S1_UE_NETWORK_CAPABILITY - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.48A S1 UE security capability + * O TLV 4-7 */ +int ogs_nas_decode_s1_ue_security_capability(ogs_nas_s1_ue_security_capability_t *s1_ue_security_capability, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_s1_ue_security_capability_t *source = (ogs_nas_s1_ue_security_capability_t *)pkbuf->data; + + s1_ue_security_capability->length = source->length; + size = s1_ue_security_capability->length + sizeof(s1_ue_security_capability->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(s1_ue_security_capability, pkbuf->data - size, size); + + ogs_trace(" S1_UE_SECURITY_CAPABILITY - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_s1_ue_security_capability(ogs_pkbuf_t *pkbuf, ogs_nas_s1_ue_security_capability_t *s1_ue_security_capability) +{ + uint16_t size = s1_ue_security_capability->length + sizeof(s1_ue_security_capability->length); + ogs_nas_s1_ue_security_capability_t target; + + memcpy(&target, s1_ue_security_capability, sizeof(ogs_nas_s1_ue_security_capability_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" S1_UE_SECURITY_CAPABILITY - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.49 Service area list + * O TLV 6-114 */ +int ogs_nas_decode_service_area_list(ogs_nas_service_area_list_t *service_area_list, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_service_area_list_t *source = (ogs_nas_service_area_list_t *)pkbuf->data; + + service_area_list->length = source->length; + size = service_area_list->length + sizeof(service_area_list->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(service_area_list, pkbuf->data - size, size); + + ogs_trace(" SERVICE_AREA_LIST - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_service_area_list(ogs_pkbuf_t *pkbuf, ogs_nas_service_area_list_t *service_area_list) +{ + uint16_t size = service_area_list->length + sizeof(service_area_list->length); + ogs_nas_service_area_list_t target; + + memcpy(&target, service_area_list, sizeof(ogs_nas_service_area_list_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" SERVICE_AREA_LIST - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.5 5GS network feature support + * O TLV 3-5 */ +int ogs_nas_decode_5gs_network_feature_support(ogs_nas_5gs_network_feature_support_t *network_feature_support, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_5gs_network_feature_support_t *source = (ogs_nas_5gs_network_feature_support_t *)pkbuf->data; + + network_feature_support->length = source->length; + size = network_feature_support->length + sizeof(network_feature_support->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(network_feature_support, pkbuf->data - size, size); + + ogs_trace(" 5GS_NETWORK_FEATURE_SUPPORT - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_5gs_network_feature_support(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_network_feature_support_t *network_feature_support) +{ + uint16_t size = network_feature_support->length + sizeof(network_feature_support->length); + ogs_nas_5gs_network_feature_support_t target; + + memcpy(&target, network_feature_support, sizeof(ogs_nas_5gs_network_feature_support_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" 5GS_NETWORK_FEATURE_SUPPORT - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.50A SMS indication + * O TV 1 */ +int ogs_nas_decode_sms_indication(ogs_nas_sms_indication_t *sms_indication, ogs_pkbuf_t *pkbuf) +{ + memcpy(sms_indication, pkbuf->data - 1, 1); + + ogs_trace(" SMS_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_sms_indication(ogs_pkbuf_t *pkbuf, ogs_nas_sms_indication_t *sms_indication) +{ + uint16_t size = sizeof(ogs_nas_sms_indication_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, sms_indication, size); + + ogs_trace(" SMS_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.51 SOR transparent container + * O TLV-E 20-n */ +int ogs_nas_decode_sor_transparent_container(ogs_nas_sor_transparent_container_t *sor_transparent_container, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_sor_transparent_container_t *source = (ogs_nas_sor_transparent_container_t *)pkbuf->data; + + sor_transparent_container->length = be16toh(source->length); + size = sor_transparent_container->length + sizeof(sor_transparent_container->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + sor_transparent_container->buffer = pkbuf->data - size + sizeof(sor_transparent_container->length); + + ogs_trace(" SOR_TRANSPARENT_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)sor_transparent_container->buffer, sor_transparent_container->length); + + return size; +} + +int ogs_nas_encode_sor_transparent_container(ogs_pkbuf_t *pkbuf, ogs_nas_sor_transparent_container_t *sor_transparent_container) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(sor_transparent_container); + ogs_assert(sor_transparent_container->buffer); + + size = sizeof(sor_transparent_container->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(sor_transparent_container->length); + memcpy(pkbuf->data - size, &target, size); + + size = sor_transparent_container->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, sor_transparent_container->buffer, size); + + ogs_trace(" SOR_TRANSPARENT_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return sor_transparent_container->length + sizeof(sor_transparent_container->length); +} + +/* 9.11.3.51A Supported codec list + * O TLV 5-n */ +int ogs_nas_decode_supported_codec_list(ogs_nas_supported_codec_list_t *supported_codec_list, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_supported_codec_list_t *source = (ogs_nas_supported_codec_list_t *)pkbuf->data; + + supported_codec_list->length = source->length; + size = supported_codec_list->length + sizeof(supported_codec_list->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(supported_codec_list, pkbuf->data - size, size); + + ogs_trace(" SUPPORTED_CODEC_LIST - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_supported_codec_list(ogs_pkbuf_t *pkbuf, ogs_nas_supported_codec_list_t *supported_codec_list) +{ + uint16_t size = supported_codec_list->length + sizeof(supported_codec_list->length); + ogs_nas_supported_codec_list_t target; + + memcpy(&target, supported_codec_list, sizeof(ogs_nas_supported_codec_list_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" SUPPORTED_CODEC_LIST - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.52 Time zone + * O TV 2 */ +int ogs_nas_decode_time_zone(ogs_nas_time_zone_t *time_zone, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_time_zone_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(time_zone, pkbuf->data - size, size); + + ogs_trace(" TIME_ZONE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_time_zone(ogs_pkbuf_t *pkbuf, ogs_nas_time_zone_t *time_zone) +{ + uint16_t size = sizeof(ogs_nas_time_zone_t); + ogs_nas_time_zone_t target; + + memcpy(&target, time_zone, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" TIME_ZONE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.53 Time zone and time + * O TV 8 */ +int ogs_nas_decode_time_zone_and_time(ogs_nas_time_zone_and_time_t *time_zone_and_time, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_time_zone_and_time_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(time_zone_and_time, pkbuf->data - size, size); + + ogs_trace(" TIME_ZONE_AND_TIME - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_time_zone_and_time(ogs_pkbuf_t *pkbuf, ogs_nas_time_zone_and_time_t *time_zone_and_time) +{ + uint16_t size = sizeof(ogs_nas_time_zone_and_time_t); + ogs_nas_time_zone_and_time_t target; + + memcpy(&target, time_zone_and_time, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" TIME_ZONE_AND_TIME - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.54 UE security capability + * O TLV 4-10 */ +int ogs_nas_decode_ue_security_capability(ogs_nas_ue_security_capability_t *ue_security_capability, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_ue_security_capability_t *source = (ogs_nas_ue_security_capability_t *)pkbuf->data; + + ue_security_capability->length = source->length; + size = ue_security_capability->length + sizeof(ue_security_capability->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(ue_security_capability, pkbuf->data - size, size); + + ogs_trace(" UE_SECURITY_CAPABILITY - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_ue_security_capability(ogs_pkbuf_t *pkbuf, ogs_nas_ue_security_capability_t *ue_security_capability) +{ + uint16_t size = ue_security_capability->length + sizeof(ue_security_capability->length); + ogs_nas_ue_security_capability_t target; + + memcpy(&target, ue_security_capability, sizeof(ogs_nas_ue_security_capability_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" UE_SECURITY_CAPABILITY - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.55 UE usage setting + * O TLV 3 */ +int ogs_nas_decode_ue_usage_setting(ogs_nas_ue_usage_setting_t *ue_usage_setting, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_ue_usage_setting_t *source = (ogs_nas_ue_usage_setting_t *)pkbuf->data; + + ue_usage_setting->length = source->length; + size = ue_usage_setting->length + sizeof(ue_usage_setting->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(ue_usage_setting, pkbuf->data - size, size); + + ogs_trace(" UE_USAGE_SETTING - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_ue_usage_setting(ogs_pkbuf_t *pkbuf, ogs_nas_ue_usage_setting_t *ue_usage_setting) +{ + uint16_t size = ue_usage_setting->length + sizeof(ue_usage_setting->length); + ogs_nas_ue_usage_setting_t target; + + memcpy(&target, ue_usage_setting, sizeof(ogs_nas_ue_usage_setting_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" UE_USAGE_SETTING - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.56 UE status + * O TLV 3 */ +int ogs_nas_decode_ue_status(ogs_nas_ue_status_t *ue_status, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_ue_status_t *source = (ogs_nas_ue_status_t *)pkbuf->data; + + ue_status->length = source->length; + size = ue_status->length + sizeof(ue_status->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(ue_status, pkbuf->data - size, size); + + ogs_trace(" UE_STATUS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_ue_status(ogs_pkbuf_t *pkbuf, ogs_nas_ue_status_t *ue_status) +{ + uint16_t size = ue_status->length + sizeof(ue_status->length); + ogs_nas_ue_status_t target; + + memcpy(&target, ue_status, sizeof(ogs_nas_ue_status_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" UE_STATUS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.57 Uplink data status + * O TLV 4-34 */ +int ogs_nas_decode_uplink_data_status(ogs_nas_uplink_data_status_t *uplink_data_status, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_uplink_data_status_t *source = (ogs_nas_uplink_data_status_t *)pkbuf->data; + + uplink_data_status->length = source->length; + size = uplink_data_status->length + sizeof(uplink_data_status->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(uplink_data_status, pkbuf->data - size, size); + + ogs_trace(" UPLINK_DATA_STATUS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_uplink_data_status(ogs_pkbuf_t *pkbuf, ogs_nas_uplink_data_status_t *uplink_data_status) +{ + uint16_t size = uplink_data_status->length + sizeof(uplink_data_status->length); + ogs_nas_uplink_data_status_t target; + + memcpy(&target, uplink_data_status, sizeof(ogs_nas_uplink_data_status_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" UPLINK_DATA_STATUS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.6 5GS registration result + * M LV 2 */ +int ogs_nas_decode_5gs_registration_result(ogs_nas_5gs_registration_result_t *registration_result, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_5gs_registration_result_t *source = (ogs_nas_5gs_registration_result_t *)pkbuf->data; + + registration_result->length = source->length; + size = registration_result->length + sizeof(registration_result->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(registration_result, pkbuf->data - size, size); + + ogs_trace(" 5GS_REGISTRATION_RESULT - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_5gs_registration_result(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_registration_result_t *registration_result) +{ + uint16_t size = registration_result->length + sizeof(registration_result->length); + ogs_nas_5gs_registration_result_t target; + + memcpy(&target, registration_result, sizeof(ogs_nas_5gs_registration_result_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" 5GS_REGISTRATION_RESULT - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.68 UE radio capability ID + * O TLV 3-n */ +int ogs_nas_decode_ue_radio_capability_id(ogs_nas_ue_radio_capability_id_t *ue_radio_capability_id, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_ue_radio_capability_id_t *source = (ogs_nas_ue_radio_capability_id_t *)pkbuf->data; + + ue_radio_capability_id->length = source->length; + size = ue_radio_capability_id->length + sizeof(ue_radio_capability_id->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(ue_radio_capability_id, pkbuf->data - size, size); + + ogs_trace(" UE_RADIO_CAPABILITY_ID - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_ue_radio_capability_id(ogs_pkbuf_t *pkbuf, ogs_nas_ue_radio_capability_id_t *ue_radio_capability_id) +{ + uint16_t size = ue_radio_capability_id->length + sizeof(ue_radio_capability_id->length); + ogs_nas_ue_radio_capability_id_t target; + + memcpy(&target, ue_radio_capability_id, sizeof(ogs_nas_ue_radio_capability_id_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" UE_RADIO_CAPABILITY_ID - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.69 UE radio capability ID deletion indication + * O TV 1 */ +int ogs_nas_decode_ue_radio_capability_id_deletion_indication(ogs_nas_ue_radio_capability_id_deletion_indication_t *ue_radio_capability_id_deletion_indication, ogs_pkbuf_t *pkbuf) +{ + memcpy(ue_radio_capability_id_deletion_indication, pkbuf->data - 1, 1); + + ogs_trace(" UE_RADIO_CAPABILITY_ID_DELETION_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_ue_radio_capability_id_deletion_indication(ogs_pkbuf_t *pkbuf, ogs_nas_ue_radio_capability_id_deletion_indication_t *ue_radio_capability_id_deletion_indication) +{ + uint16_t size = sizeof(ogs_nas_ue_radio_capability_id_deletion_indication_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, ue_radio_capability_id_deletion_indication, size); + + ogs_trace(" UE_RADIO_CAPABILITY_ID_DELETION_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.7 5GS registration type + * M V 1/2 */ +int ogs_nas_decode_5gs_registration_type(ogs_nas_5gs_registration_type_t *registration_type, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_5gs_registration_type_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(registration_type, pkbuf->data - size, size); + + ogs_trace(" 5GS_REGISTRATION_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_5gs_registration_type(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_registration_type_t *registration_type) +{ + uint16_t size = sizeof(ogs_nas_5gs_registration_type_t); + ogs_nas_5gs_registration_type_t target; + + memcpy(&target, registration_type, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" 5GS_REGISTRATION_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.70 Truncated 5G-S-TMSI configuration + * O TLV 3 */ +int ogs_nas_decode_truncated_5g_s_tmsi_configuration(ogs_nas_truncated_5g_s_tmsi_configuration_t *truncated_s_tmsi_configuration, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_truncated_5g_s_tmsi_configuration_t *source = (ogs_nas_truncated_5g_s_tmsi_configuration_t *)pkbuf->data; + + truncated_s_tmsi_configuration->length = source->length; + size = truncated_s_tmsi_configuration->length + sizeof(truncated_s_tmsi_configuration->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(truncated_s_tmsi_configuration, pkbuf->data - size, size); + + ogs_trace(" TRUNCATED_5G_S_TMSI_CONFIGURATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_truncated_5g_s_tmsi_configuration(ogs_pkbuf_t *pkbuf, ogs_nas_truncated_5g_s_tmsi_configuration_t *truncated_s_tmsi_configuration) +{ + uint16_t size = truncated_s_tmsi_configuration->length + sizeof(truncated_s_tmsi_configuration->length); + ogs_nas_truncated_5g_s_tmsi_configuration_t target; + + memcpy(&target, truncated_s_tmsi_configuration, sizeof(ogs_nas_truncated_5g_s_tmsi_configuration_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" TRUNCATED_5G_S_TMSI_CONFIGURATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.71 WUS assistance information + * O TLV 3-n */ +int ogs_nas_decode_wus_assistance_information(ogs_nas_wus_assistance_information_t *wus_assistance_information, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_wus_assistance_information_t *source = (ogs_nas_wus_assistance_information_t *)pkbuf->data; + + wus_assistance_information->length = source->length; + size = wus_assistance_information->length + sizeof(wus_assistance_information->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(wus_assistance_information, pkbuf->data - size, size); + + ogs_trace(" WUS_ASSISTANCE_INFORMATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_wus_assistance_information(ogs_pkbuf_t *pkbuf, ogs_nas_wus_assistance_information_t *wus_assistance_information) +{ + uint16_t size = wus_assistance_information->length + sizeof(wus_assistance_information->length); + ogs_nas_wus_assistance_information_t target; + + memcpy(&target, wus_assistance_information, sizeof(ogs_nas_wus_assistance_information_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" WUS_ASSISTANCE_INFORMATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.72 N5GC indication + * O T 1 */ +int ogs_nas_decode_n5gc_indication(ogs_nas_n5gc_indication_t *n5gc_indication, ogs_pkbuf_t *pkbuf) +{ + memcpy(n5gc_indication, pkbuf->data - 1, 1); + + ogs_trace(" N5GC_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_n5gc_indication(ogs_pkbuf_t *pkbuf, ogs_nas_n5gc_indication_t *n5gc_indication) +{ + uint16_t size = sizeof(ogs_nas_n5gc_indication_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, n5gc_indication, size); + + ogs_trace(" N5GC_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.8 5GS tracking area identity + * O TV 7 */ +int ogs_nas_decode_5gs_tracking_area_identity(ogs_nas_5gs_tracking_area_identity_t *tracking_area_identity, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_5gs_tracking_area_identity_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(tracking_area_identity, pkbuf->data - size, size); + + tracking_area_identity->tac = be16toh(tracking_area_identity->tac); + + ogs_trace(" 5GS_TRACKING_AREA_IDENTITY - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_5gs_tracking_area_identity(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_tracking_area_identity_t *tracking_area_identity) +{ + uint16_t size = sizeof(ogs_nas_5gs_tracking_area_identity_t); + ogs_nas_5gs_tracking_area_identity_t target; + + memcpy(&target, tracking_area_identity, size); + target.tac = htobe16(tracking_area_identity->tac); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" 5GS_TRACKING_AREA_IDENTITY - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.9 5GS tracking area identity list + * O TLV 9-114 */ +int ogs_nas_decode_5gs_tracking_area_identity_list(ogs_nas_5gs_tracking_area_identity_list_t *tracking_area_identity_list, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_5gs_tracking_area_identity_list_t *source = (ogs_nas_5gs_tracking_area_identity_list_t *)pkbuf->data; + + tracking_area_identity_list->length = source->length; + size = tracking_area_identity_list->length + sizeof(tracking_area_identity_list->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(tracking_area_identity_list, pkbuf->data - size, size); + + ogs_trace(" 5GS_TRACKING_AREA_IDENTITY_LIST - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_5gs_tracking_area_identity_list(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_tracking_area_identity_list_t *tracking_area_identity_list) +{ + uint16_t size = tracking_area_identity_list->length + sizeof(tracking_area_identity_list->length); + ogs_nas_5gs_tracking_area_identity_list_t target; + + memcpy(&target, tracking_area_identity_list, sizeof(ogs_nas_5gs_tracking_area_identity_list_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" 5GS_TRACKING_AREA_IDENTITY_LIST - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.3.9A 5GS update type + * O TLV 3 */ +int ogs_nas_decode_5gs_update_type(ogs_nas_5gs_update_type_t *update_type, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_5gs_update_type_t *source = (ogs_nas_5gs_update_type_t *)pkbuf->data; + + update_type->length = source->length; + size = update_type->length + sizeof(update_type->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(update_type, pkbuf->data - size, size); + + ogs_trace(" 5GS_UPDATE_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_5gs_update_type(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_update_type_t *update_type) +{ + uint16_t size = update_type->length + sizeof(update_type->length); + ogs_nas_5gs_update_type_t target; + + memcpy(&target, update_type, sizeof(ogs_nas_5gs_update_type_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" 5GS_UPDATE_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.1 5GSM capability + * O TLV 3-15 */ +int ogs_nas_decode_5gsm_capability(ogs_nas_5gsm_capability_t *gsm_capability, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_5gsm_capability_t *source = (ogs_nas_5gsm_capability_t *)pkbuf->data; + + gsm_capability->length = source->length; + size = gsm_capability->length + sizeof(gsm_capability->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(gsm_capability, pkbuf->data - size, size); + + ogs_trace(" 5GSM_CAPABILITY - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_5gsm_capability(ogs_pkbuf_t *pkbuf, ogs_nas_5gsm_capability_t *gsm_capability) +{ + uint16_t size = gsm_capability->length + sizeof(gsm_capability->length); + ogs_nas_5gsm_capability_t target; + + memcpy(&target, gsm_capability, sizeof(ogs_nas_5gsm_capability_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" 5GSM_CAPABILITY - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.10 PDU address + * O TLV 7, 11 or 15 */ +int ogs_nas_decode_pdu_address(ogs_nas_pdu_address_t *pdu_address, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_pdu_address_t *source = (ogs_nas_pdu_address_t *)pkbuf->data; + + pdu_address->length = source->length; + size = pdu_address->length + sizeof(pdu_address->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pdu_address, pkbuf->data - size, size); + + ogs_trace(" PDU_ADDRESS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_pdu_address(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_address_t *pdu_address) +{ + uint16_t size = pdu_address->length + sizeof(pdu_address->length); + ogs_nas_pdu_address_t target; + + memcpy(&target, pdu_address, sizeof(ogs_nas_pdu_address_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" PDU_ADDRESS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.11 PDU session type + * O TV 1 */ +int ogs_nas_decode_pdu_session_type(ogs_nas_pdu_session_type_t *pdu_session_type, ogs_pkbuf_t *pkbuf) +{ + memcpy(pdu_session_type, pkbuf->data - 1, 1); + + ogs_trace(" PDU_SESSION_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_pdu_session_type(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_session_type_t *pdu_session_type) +{ + uint16_t size = sizeof(ogs_nas_pdu_session_type_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, pdu_session_type, size); + + ogs_trace(" PDU_SESSION_TYPE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.12 QoS flow descriptions + * O TLV-E 6-65538 */ +int ogs_nas_decode_qos_flow_descriptions(ogs_nas_qos_flow_descriptions_t *qos_flow_descriptions, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_qos_flow_descriptions_t *source = (ogs_nas_qos_flow_descriptions_t *)pkbuf->data; + + qos_flow_descriptions->length = be16toh(source->length); + size = qos_flow_descriptions->length + sizeof(qos_flow_descriptions->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + qos_flow_descriptions->buffer = pkbuf->data - size + sizeof(qos_flow_descriptions->length); + + ogs_trace(" QOS_FLOW_DESCRIPTIONS - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)qos_flow_descriptions->buffer, qos_flow_descriptions->length); + + return size; +} + +int ogs_nas_encode_qos_flow_descriptions(ogs_pkbuf_t *pkbuf, ogs_nas_qos_flow_descriptions_t *qos_flow_descriptions) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(qos_flow_descriptions); + ogs_assert(qos_flow_descriptions->buffer); + + size = sizeof(qos_flow_descriptions->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(qos_flow_descriptions->length); + memcpy(pkbuf->data - size, &target, size); + + size = qos_flow_descriptions->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, qos_flow_descriptions->buffer, size); + + ogs_trace(" QOS_FLOW_DESCRIPTIONS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return qos_flow_descriptions->length + sizeof(qos_flow_descriptions->length); +} + +/* 9.11.4.13 QoS rules + * M LV-E 6-65538 */ +int ogs_nas_decode_qos_rules(ogs_nas_qos_rules_t *qos_rules, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_qos_rules_t *source = (ogs_nas_qos_rules_t *)pkbuf->data; + + qos_rules->length = be16toh(source->length); + size = qos_rules->length + sizeof(qos_rules->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + qos_rules->buffer = pkbuf->data - size + sizeof(qos_rules->length); + + ogs_trace(" QOS_RULES - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)qos_rules->buffer, qos_rules->length); + + return size; +} + +int ogs_nas_encode_qos_rules(ogs_pkbuf_t *pkbuf, ogs_nas_qos_rules_t *qos_rules) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(qos_rules); + ogs_assert(qos_rules->buffer); + + size = sizeof(qos_rules->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(qos_rules->length); + memcpy(pkbuf->data - size, &target, size); + + size = qos_rules->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, qos_rules->buffer, size); + + ogs_trace(" QOS_RULES - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return qos_rules->length + sizeof(qos_rules->length); +} + +/* 9.11.4.14 Session-AMBR + * M LV 7 */ +int ogs_nas_decode_session_ambr(ogs_nas_session_ambr_t *session_ambr, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_session_ambr_t *source = (ogs_nas_session_ambr_t *)pkbuf->data; + + session_ambr->length = source->length; + size = session_ambr->length + sizeof(session_ambr->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(session_ambr, pkbuf->data - size, size); + + ogs_trace(" SESSION_AMBR - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_session_ambr(ogs_pkbuf_t *pkbuf, ogs_nas_session_ambr_t *session_ambr) +{ + uint16_t size = session_ambr->length + sizeof(session_ambr->length); + ogs_nas_session_ambr_t target; + + memcpy(&target, session_ambr, sizeof(ogs_nas_session_ambr_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" SESSION_AMBR - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.15 SM PDU DN request container + * O TLV 3-255 */ +int ogs_nas_decode_sm_pdu_dn_request_container(ogs_nas_sm_pdu_dn_request_container_t *sm_pdu_dn_request_container, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_sm_pdu_dn_request_container_t *source = (ogs_nas_sm_pdu_dn_request_container_t *)pkbuf->data; + + sm_pdu_dn_request_container->length = source->length; + size = sm_pdu_dn_request_container->length + sizeof(sm_pdu_dn_request_container->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(sm_pdu_dn_request_container, pkbuf->data - size, size); + + ogs_trace(" SM_PDU_DN_REQUEST_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_sm_pdu_dn_request_container(ogs_pkbuf_t *pkbuf, ogs_nas_sm_pdu_dn_request_container_t *sm_pdu_dn_request_container) +{ + uint16_t size = sm_pdu_dn_request_container->length + sizeof(sm_pdu_dn_request_container->length); + ogs_nas_sm_pdu_dn_request_container_t target; + + memcpy(&target, sm_pdu_dn_request_container, sizeof(ogs_nas_sm_pdu_dn_request_container_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" SM_PDU_DN_REQUEST_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.16 SSC mode + * O TV 1 */ +int ogs_nas_decode_ssc_mode(ogs_nas_ssc_mode_t *ssc_mode, ogs_pkbuf_t *pkbuf) +{ + memcpy(ssc_mode, pkbuf->data - 1, 1); + + ogs_trace(" SSC_MODE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_ssc_mode(ogs_pkbuf_t *pkbuf, ogs_nas_ssc_mode_t *ssc_mode) +{ + uint16_t size = sizeof(ogs_nas_ssc_mode_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, ssc_mode, size); + + ogs_trace(" SSC_MODE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.17 Re-attempt indicator + * O TLV 3 */ +int ogs_nas_decode_re_attempt_indicator(ogs_nas_re_attempt_indicator_t *re_attempt_indicator, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_re_attempt_indicator_t *source = (ogs_nas_re_attempt_indicator_t *)pkbuf->data; + + re_attempt_indicator->length = source->length; + size = re_attempt_indicator->length + sizeof(re_attempt_indicator->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(re_attempt_indicator, pkbuf->data - size, size); + + ogs_trace(" RE_ATTEMPT_INDICATOR - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_re_attempt_indicator(ogs_pkbuf_t *pkbuf, ogs_nas_re_attempt_indicator_t *re_attempt_indicator) +{ + uint16_t size = re_attempt_indicator->length + sizeof(re_attempt_indicator->length); + ogs_nas_re_attempt_indicator_t target; + + memcpy(&target, re_attempt_indicator, sizeof(ogs_nas_re_attempt_indicator_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" RE_ATTEMPT_INDICATOR - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.18 5GSM network feature support + * O TLV 3-15 */ +int ogs_nas_decode_5gsm_network_feature_support(ogs_nas_5gsm_network_feature_support_t *gsm_network_feature_support, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_5gsm_network_feature_support_t *source = (ogs_nas_5gsm_network_feature_support_t *)pkbuf->data; + + gsm_network_feature_support->length = source->length; + size = gsm_network_feature_support->length + sizeof(gsm_network_feature_support->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(gsm_network_feature_support, pkbuf->data - size, size); + + ogs_trace(" 5GSM_NETWORK_FEATURE_SUPPORT - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_5gsm_network_feature_support(ogs_pkbuf_t *pkbuf, ogs_nas_5gsm_network_feature_support_t *gsm_network_feature_support) +{ + uint16_t size = gsm_network_feature_support->length + sizeof(gsm_network_feature_support->length); + ogs_nas_5gsm_network_feature_support_t target; + + memcpy(&target, gsm_network_feature_support, sizeof(ogs_nas_5gsm_network_feature_support_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" 5GSM_NETWORK_FEATURE_SUPPORT - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.2 5GSM cause + * O TV 2 */ +int ogs_nas_decode_5gsm_cause(ogs_nas_5gsm_cause_t *gsm_cause, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_5gsm_cause_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(gsm_cause, pkbuf->data - size, size); + + ogs_trace(" 5GSM_CAUSE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_5gsm_cause(ogs_pkbuf_t *pkbuf, ogs_nas_5gsm_cause_t *gsm_cause) +{ + uint16_t size = sizeof(ogs_nas_5gsm_cause_t); + ogs_nas_5gsm_cause_t target; + + memcpy(&target, gsm_cause, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" 5GSM_CAUSE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.20 Serving PLMN rate control + * O TLV 4 */ +int ogs_nas_decode_serving_plmn_rate_control(ogs_nas_serving_plmn_rate_control_t *serving_plmn_rate_control, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_serving_plmn_rate_control_t *source = (ogs_nas_serving_plmn_rate_control_t *)pkbuf->data; + + serving_plmn_rate_control->length = source->length; + size = serving_plmn_rate_control->length + sizeof(serving_plmn_rate_control->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(serving_plmn_rate_control, pkbuf->data - size, size); + + ogs_trace(" SERVING_PLMN_RATE_CONTROL - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_serving_plmn_rate_control(ogs_pkbuf_t *pkbuf, ogs_nas_serving_plmn_rate_control_t *serving_plmn_rate_control) +{ + uint16_t size = serving_plmn_rate_control->length + sizeof(serving_plmn_rate_control->length); + ogs_nas_serving_plmn_rate_control_t target; + + memcpy(&target, serving_plmn_rate_control, sizeof(ogs_nas_serving_plmn_rate_control_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" SERVING_PLMN_RATE_CONTROL - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.21 5GSM congestion re-attempt indicator + * O TLV 3 */ +int ogs_nas_decode_5gsm_congestion_re_attempt_indicator(ogs_nas_5gsm_congestion_re_attempt_indicator_t *gsm_congestion_re_attempt_indicator, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_5gsm_congestion_re_attempt_indicator_t *source = (ogs_nas_5gsm_congestion_re_attempt_indicator_t *)pkbuf->data; + + gsm_congestion_re_attempt_indicator->length = source->length; + size = gsm_congestion_re_attempt_indicator->length + sizeof(gsm_congestion_re_attempt_indicator->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(gsm_congestion_re_attempt_indicator, pkbuf->data - size, size); + + ogs_trace(" 5GSM_CONGESTION_RE_ATTEMPT_INDICATOR - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_5gsm_congestion_re_attempt_indicator(ogs_pkbuf_t *pkbuf, ogs_nas_5gsm_congestion_re_attempt_indicator_t *gsm_congestion_re_attempt_indicator) +{ + uint16_t size = gsm_congestion_re_attempt_indicator->length + sizeof(gsm_congestion_re_attempt_indicator->length); + ogs_nas_5gsm_congestion_re_attempt_indicator_t target; + + memcpy(&target, gsm_congestion_re_attempt_indicator, sizeof(ogs_nas_5gsm_congestion_re_attempt_indicator_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" 5GSM_CONGESTION_RE_ATTEMPT_INDICATOR - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.22 ATSSS container + * O TLV-E 3-65538 */ +int ogs_nas_decode_atsss_container(ogs_nas_atsss_container_t *atsss_container, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_atsss_container_t *source = (ogs_nas_atsss_container_t *)pkbuf->data; + + atsss_container->length = be16toh(source->length); + size = atsss_container->length + sizeof(atsss_container->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + atsss_container->buffer = pkbuf->data - size + sizeof(atsss_container->length); + + ogs_trace(" ATSSS_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)atsss_container->buffer, atsss_container->length); + + return size; +} + +int ogs_nas_encode_atsss_container(ogs_pkbuf_t *pkbuf, ogs_nas_atsss_container_t *atsss_container) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(atsss_container); + ogs_assert(atsss_container->buffer); + + size = sizeof(atsss_container->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(atsss_container->length); + memcpy(pkbuf->data - size, &target, size); + + size = atsss_container->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, atsss_container->buffer, size); + + ogs_trace(" ATSSS_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return atsss_container->length + sizeof(atsss_container->length); +} + +/* 9.11.4.23 Control plane only indication + * O TV 1 */ +int ogs_nas_decode_control_plane_only_indication(ogs_nas_control_plane_only_indication_t *control_plane_only_indication, ogs_pkbuf_t *pkbuf) +{ + memcpy(control_plane_only_indication, pkbuf->data - 1, 1); + + ogs_trace(" CONTROL_PLANE_ONLY_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_control_plane_only_indication(ogs_pkbuf_t *pkbuf, ogs_nas_control_plane_only_indication_t *control_plane_only_indication) +{ + uint16_t size = sizeof(ogs_nas_control_plane_only_indication_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, control_plane_only_indication, size); + + ogs_trace(" CONTROL_PLANE_ONLY_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.24 Header compression configuration + * O TLV 5-257 */ +int ogs_nas_decode_header_compression_configuration(ogs_nas_header_compression_configuration_t *header_compression_configuration, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_header_compression_configuration_t *source = (ogs_nas_header_compression_configuration_t *)pkbuf->data; + + header_compression_configuration->length = source->length; + size = header_compression_configuration->length + sizeof(header_compression_configuration->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(header_compression_configuration, pkbuf->data - size, size); + + header_compression_configuration->max_cid = be16toh(header_compression_configuration->max_cid); + + ogs_trace(" HEADER_COMPRESSION_CONFIGURATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_header_compression_configuration(ogs_pkbuf_t *pkbuf, ogs_nas_header_compression_configuration_t *header_compression_configuration) +{ + uint16_t size = header_compression_configuration->length + sizeof(header_compression_configuration->length); + ogs_nas_header_compression_configuration_t target; + + memcpy(&target, header_compression_configuration, sizeof(ogs_nas_header_compression_configuration_t)); + target.max_cid = htobe16(header_compression_configuration->max_cid); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" HEADER_COMPRESSION_CONFIGURATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.25 DS-TT Ethernet port MAC address + * O TLV 8 */ +int ogs_nas_decode_ds_tt_ethernet_port_mac_address(ogs_nas_ds_tt_ethernet_port_mac_address_t *ds_tt_ethernet_port_mac_address, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_ds_tt_ethernet_port_mac_address_t *source = (ogs_nas_ds_tt_ethernet_port_mac_address_t *)pkbuf->data; + + ds_tt_ethernet_port_mac_address->length = source->length; + size = ds_tt_ethernet_port_mac_address->length + sizeof(ds_tt_ethernet_port_mac_address->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(ds_tt_ethernet_port_mac_address, pkbuf->data - size, size); + + ogs_trace(" DS_TT_ETHERNET_PORT_MAC_ADDRESS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_ds_tt_ethernet_port_mac_address(ogs_pkbuf_t *pkbuf, ogs_nas_ds_tt_ethernet_port_mac_address_t *ds_tt_ethernet_port_mac_address) +{ + uint16_t size = ds_tt_ethernet_port_mac_address->length + sizeof(ds_tt_ethernet_port_mac_address->length); + ogs_nas_ds_tt_ethernet_port_mac_address_t target; + + memcpy(&target, ds_tt_ethernet_port_mac_address, sizeof(ogs_nas_ds_tt_ethernet_port_mac_address_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" DS_TT_ETHERNET_PORT_MAC_ADDRESS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.26 UE-DS-TT residence time + * O TLV 10 */ +int ogs_nas_decode_ue_ds_tt_residence_time(ogs_nas_ue_ds_tt_residence_time_t *ue_ds_tt_residence_time, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_ue_ds_tt_residence_time_t *source = (ogs_nas_ue_ds_tt_residence_time_t *)pkbuf->data; + + ue_ds_tt_residence_time->length = source->length; + size = ue_ds_tt_residence_time->length + sizeof(ue_ds_tt_residence_time->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(ue_ds_tt_residence_time, pkbuf->data - size, size); + + ogs_trace(" UE_DS_TT_RESIDENCE_TIME - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_ue_ds_tt_residence_time(ogs_pkbuf_t *pkbuf, ogs_nas_ue_ds_tt_residence_time_t *ue_ds_tt_residence_time) +{ + uint16_t size = ue_ds_tt_residence_time->length + sizeof(ue_ds_tt_residence_time->length); + ogs_nas_ue_ds_tt_residence_time_t target; + + memcpy(&target, ue_ds_tt_residence_time, sizeof(ogs_nas_ue_ds_tt_residence_time_t)); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" UE_DS_TT_RESIDENCE_TIME - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.27 Port management information container + * O TLV-E 4-65538 */ +int ogs_nas_decode_port_management_information_container(ogs_nas_port_management_information_container_t *port_management_information_container, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_port_management_information_container_t *source = (ogs_nas_port_management_information_container_t *)pkbuf->data; + + port_management_information_container->length = be16toh(source->length); + size = port_management_information_container->length + sizeof(port_management_information_container->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + port_management_information_container->buffer = pkbuf->data - size + sizeof(port_management_information_container->length); + + ogs_trace(" PORT_MANAGEMENT_INFORMATION_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)port_management_information_container->buffer, port_management_information_container->length); + + return size; +} + +int ogs_nas_encode_port_management_information_container(ogs_pkbuf_t *pkbuf, ogs_nas_port_management_information_container_t *port_management_information_container) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(port_management_information_container); + ogs_assert(port_management_information_container->buffer); + + size = sizeof(port_management_information_container->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(port_management_information_container->length); + memcpy(pkbuf->data - size, &target, size); + + size = port_management_information_container->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, port_management_information_container->buffer, size); + + ogs_trace(" PORT_MANAGEMENT_INFORMATION_CONTAINER - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return port_management_information_container->length + sizeof(port_management_information_container->length); +} + +/* 9.11.4.3 Always-on PDU session indication + * O TV 1 */ +int ogs_nas_decode_always_on_pdu_session_indication(ogs_nas_always_on_pdu_session_indication_t *always_on_pdu_session_indication, ogs_pkbuf_t *pkbuf) +{ + memcpy(always_on_pdu_session_indication, pkbuf->data - 1, 1); + + ogs_trace(" ALWAYS_ON_PDU_SESSION_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_always_on_pdu_session_indication(ogs_pkbuf_t *pkbuf, ogs_nas_always_on_pdu_session_indication_t *always_on_pdu_session_indication) +{ + uint16_t size = sizeof(ogs_nas_always_on_pdu_session_indication_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, always_on_pdu_session_indication, size); + + ogs_trace(" ALWAYS_ON_PDU_SESSION_INDICATION - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.4 Always-on PDU session requested + * O TV 1 */ +int ogs_nas_decode_always_on_pdu_session_requested(ogs_nas_always_on_pdu_session_requested_t *always_on_pdu_session_requested, ogs_pkbuf_t *pkbuf) +{ + memcpy(always_on_pdu_session_requested, pkbuf->data - 1, 1); + + ogs_trace(" ALWAYS_ON_PDU_SESSION_REQUESTED - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_always_on_pdu_session_requested(ogs_pkbuf_t *pkbuf, ogs_nas_always_on_pdu_session_requested_t *always_on_pdu_session_requested) +{ + uint16_t size = sizeof(ogs_nas_always_on_pdu_session_requested_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, always_on_pdu_session_requested, size); + + ogs_trace(" ALWAYS_ON_PDU_SESSION_REQUESTED - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.5 Allowed SSC mode + * O TV 1 */ +int ogs_nas_decode_allowed_ssc_mode(ogs_nas_allowed_ssc_mode_t *allowed_ssc_mode, ogs_pkbuf_t *pkbuf) +{ + memcpy(allowed_ssc_mode, pkbuf->data - 1, 1); + + ogs_trace(" ALLOWED_SSC_MODE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1); + + return 0; +} + +int ogs_nas_encode_allowed_ssc_mode(ogs_pkbuf_t *pkbuf, ogs_nas_allowed_ssc_mode_t *allowed_ssc_mode) +{ + uint16_t size = sizeof(ogs_nas_allowed_ssc_mode_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, allowed_ssc_mode, size); + + ogs_trace(" ALLOWED_SSC_MODE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.6 Extended protocol configuration options + * O TLV-E 4-65538 */ +int ogs_nas_decode_extended_protocol_configuration_options(ogs_nas_extended_protocol_configuration_options_t *extended_protocol_configuration_options, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_extended_protocol_configuration_options_t *source = (ogs_nas_extended_protocol_configuration_options_t *)pkbuf->data; + + extended_protocol_configuration_options->length = be16toh(source->length); + size = extended_protocol_configuration_options->length + sizeof(extended_protocol_configuration_options->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + extended_protocol_configuration_options->buffer = pkbuf->data - size + sizeof(extended_protocol_configuration_options->length); + + ogs_trace(" EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)extended_protocol_configuration_options->buffer, extended_protocol_configuration_options->length); + + return size; +} + +int ogs_nas_encode_extended_protocol_configuration_options(ogs_pkbuf_t *pkbuf, ogs_nas_extended_protocol_configuration_options_t *extended_protocol_configuration_options) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(extended_protocol_configuration_options); + ogs_assert(extended_protocol_configuration_options->buffer); + + size = sizeof(extended_protocol_configuration_options->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(extended_protocol_configuration_options->length); + memcpy(pkbuf->data - size, &target, size); + + size = extended_protocol_configuration_options->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, extended_protocol_configuration_options->buffer, size); + + ogs_trace(" EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return extended_protocol_configuration_options->length + sizeof(extended_protocol_configuration_options->length); +} + +/* 9.11.4.7 Integrity protection maximum data rate + * M V 2 */ +int ogs_nas_decode_integrity_protection_maximum_data_rate(ogs_nas_integrity_protection_maximum_data_rate_t *integrity_protection_maximum_data_rate, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_integrity_protection_maximum_data_rate_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(integrity_protection_maximum_data_rate, pkbuf->data - size, size); + + ogs_trace(" INTEGRITY_PROTECTION_MAXIMUM_DATA_RATE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_integrity_protection_maximum_data_rate(ogs_pkbuf_t *pkbuf, ogs_nas_integrity_protection_maximum_data_rate_t *integrity_protection_maximum_data_rate) +{ + uint16_t size = sizeof(ogs_nas_integrity_protection_maximum_data_rate_t); + ogs_nas_integrity_protection_maximum_data_rate_t target; + + memcpy(&target, integrity_protection_maximum_data_rate, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" INTEGRITY_PROTECTION_MAXIMUM_DATA_RATE - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +/* 9.11.4.8 Mapped EPS bearer contexts + * O TLV-E 7-65538 */ +int ogs_nas_decode_mapped_eps_bearer_contexts(ogs_nas_mapped_eps_bearer_contexts_t *mapped_eps_bearer_contexts, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = 0; + ogs_nas_mapped_eps_bearer_contexts_t *source = (ogs_nas_mapped_eps_bearer_contexts_t *)pkbuf->data; + + mapped_eps_bearer_contexts->length = be16toh(source->length); + size = mapped_eps_bearer_contexts->length + sizeof(mapped_eps_bearer_contexts->length); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + mapped_eps_bearer_contexts->buffer = pkbuf->data - size + sizeof(mapped_eps_bearer_contexts->length); + + ogs_trace(" MAPPED_EPS_BEARER_CONTEXTS - "); + ogs_log_hexdump(OGS_LOG_TRACE, (void*)mapped_eps_bearer_contexts->buffer, mapped_eps_bearer_contexts->length); + + return size; +} + +int ogs_nas_encode_mapped_eps_bearer_contexts(ogs_pkbuf_t *pkbuf, ogs_nas_mapped_eps_bearer_contexts_t *mapped_eps_bearer_contexts) +{ + uint16_t size = 0; + uint16_t target; + + ogs_assert(mapped_eps_bearer_contexts); + ogs_assert(mapped_eps_bearer_contexts->buffer); + + size = sizeof(mapped_eps_bearer_contexts->length); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + target = htobe16(mapped_eps_bearer_contexts->length); + memcpy(pkbuf->data - size, &target, size); + + size = mapped_eps_bearer_contexts->length; + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, mapped_eps_bearer_contexts->buffer, size); + + ogs_trace(" MAPPED_EPS_BEARER_CONTEXTS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return mapped_eps_bearer_contexts->length + sizeof(mapped_eps_bearer_contexts->length); +} + +/* 9.11.4.9 Maximum number of supported packet filters + * O TV 3 */ +int ogs_nas_decode_maximum_number_of_supported_packet_filters(ogs_nas_maximum_number_of_supported_packet_filters_t *maximum_number_of_supported_packet_filters, ogs_pkbuf_t *pkbuf) +{ + uint16_t size = sizeof(ogs_nas_maximum_number_of_supported_packet_filters_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(maximum_number_of_supported_packet_filters, pkbuf->data - size, size); + + ogs_trace(" MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + +int ogs_nas_encode_maximum_number_of_supported_packet_filters(ogs_pkbuf_t *pkbuf, ogs_nas_maximum_number_of_supported_packet_filters_t *maximum_number_of_supported_packet_filters) +{ + uint16_t size = sizeof(ogs_nas_maximum_number_of_supported_packet_filters_t); + ogs_nas_maximum_number_of_supported_packet_filters_t target; + + memcpy(&target, maximum_number_of_supported_packet_filters, size); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &target, size); + + ogs_trace(" MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS - "); + ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size); + + return size; +} + diff --git a/lib/nas/5gs/ies.h b/lib/nas/5gs/ies.h new file mode 100644 index 0000000000..4696ac7223 --- /dev/null +++ b/lib/nas/5gs/ies.h @@ -0,0 +1,273 @@ +/* + * The MIT License + * + * Copyright (C) 2019,2020 by Sukchan Lee + * + * This file is part of Open5GS. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/******************************************************************************* + * This file had been created by nas-message.py script v0.2.0 + * Please do not modify this file but regenerate it via script. + * Created on: 2020-05-21 21:20:09.020951 by acetcom + * from 24501-g41.docx + ******************************************************************************/ + +#if !defined(OGS_NAS_INSIDE) && !defined(OGS_NAS_COMPILATION) +#error "This header cannot be included directly." +#endif + +#ifndef OGS_NAS_5GS_IES_H +#define OGS_NAS_5GS_IES_H + +#ifdef __cplusplus +extern "C" { +#endif + +int ogs_nas_encode_optional_type(ogs_pkbuf_t *pkbuf, uint8_t type); + +int ogs_nas_decode_additional_information(ogs_nas_additional_information_t *additional_information, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_access_type(ogs_nas_access_type_t *access_type, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_dnn(ogs_nas_dnn_t *dnn, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_eap_message(ogs_nas_eap_message_t *eap_message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_gprs_timer(ogs_nas_gprs_timer_t *gprs_timer, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_gprs_timer_2(ogs_nas_gprs_timer_2_t *gprs_timer_2, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_gprs_timer_3(ogs_nas_gprs_timer_3_t *gprs_timer_3, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_s_nssai(ogs_nas_s_nssai_t *s_nssai, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gmm_capability(ogs_nas_5gmm_capability_t *gmm_capability, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_abba(ogs_nas_abba_t *abba, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_additional_5g_security_information(ogs_nas_additional_5g_security_information_t *additional_security_information, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_additional_information_requested(ogs_nas_additional_information_requested_t *additional_information_requested, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_allowed_pdu_session_status(ogs_nas_allowed_pdu_session_status_t *allowed_pdu_session_status, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_authentication_failure_parameter(ogs_nas_authentication_failure_parameter_t *authentication_failure_parameter, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_authentication_parameter_autn(ogs_nas_authentication_parameter_autn_t *authentication_parameter_autn, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_authentication_parameter_rand(ogs_nas_authentication_parameter_rand_t *authentication_parameter_rand, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_authentication_response_parameter(ogs_nas_authentication_response_parameter_t *authentication_response_parameter, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_configuration_update_indication(ogs_nas_configuration_update_indication_t *configuration_update_indication, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_cag_information_list(ogs_nas_cag_information_list_t *cag_information_list, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_ciot_small_data_container(ogs_nas_ciot_small_data_container_t *ciot_small_data_container, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_ciphering_key_data(ogs_nas_ciphering_key_data_t *ciphering_key_data, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_control_plane_service_type(ogs_nas_control_plane_service_type_t *control_plane_service_type, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_daylight_saving_time(ogs_nas_daylight_saving_time_t *daylight_saving_time, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gmm_cause(ogs_nas_5gmm_cause_t *gmm_cause, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_de_registration_type(ogs_nas_de_registration_type_t *de_registration_type, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_emergency_number_list(ogs_nas_emergency_number_list_t *emergency_number_list, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_eps_bearer_context_status(ogs_nas_eps_bearer_context_status_t *eps_bearer_context_status, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_eps_nas_message_container(ogs_nas_eps_nas_message_container_t *eps_nas_message_container, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_eps_nas_security_algorithms(ogs_nas_eps_nas_security_algorithms_t *eps_nas_security_algorithms, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_extended_emergency_number_list(ogs_nas_extended_emergency_number_list_t *extended_emergency_number_list, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_extended_drx_parameters(ogs_nas_extended_drx_parameters_t *extended_drx_parameters, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_imeisv_request(ogs_nas_imeisv_request_t *imeisv_request, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_ladn_indication(ogs_nas_ladn_indication_t *ladn_indication, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gs_drx_parameters(ogs_nas_5gs_drx_parameters_t *drx_parameters, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gs_identity_type(ogs_nas_5gs_identity_type_t *identity_type, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_ladn_information(ogs_nas_ladn_information_t *ladn_information, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_mico_indication(ogs_nas_mico_indication_t *mico_indication, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_ma_pdu_session_information(ogs_nas_ma_pdu_session_information_t *ma_pdu_session_information, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_mapped_nssai(ogs_nas_mapped_nssai_t *mapped_nssai, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_mobile_station_classmark_2(ogs_nas_mobile_station_classmark_2_t *mobile_station_classmark_2, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_key_set_identifier(ogs_nas_key_set_identifier_t *key_set_identifier, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_message_container(ogs_nas_message_container_t *message_container, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_security_algorithms(ogs_nas_security_algorithms_t *security_algorithms, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_network_name(ogs_nas_network_name_t *network_name, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_network_slicing_indication(ogs_nas_network_slicing_indication_t *network_slicing_indication, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_non_3gpp_nw_provided_policies(ogs_nas_non_3gpp_nw_provided_policies_t *non_3gpp_nw_provided_policies, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_nssai(ogs_nas_nssai_t *nssai, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_nssai_inclusion_mode(ogs_nas_nssai_inclusion_mode_t *nssai_inclusion_mode, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_operator_defined_access_category_definitions(ogs_nas_operator_defined_access_category_definitions_t *operator_defined_access_category_definitions, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_payload_container(ogs_nas_payload_container_t *payload_container, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gs_mobile_identity(ogs_nas_5gs_mobile_identity_t *mobile_identity, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_payload_container_type(ogs_nas_payload_container_type_t *payload_container_type, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_identity_2(ogs_nas_pdu_session_identity_2_t *pdu_session_identity_2, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_reactivation_result(ogs_nas_pdu_session_reactivation_result_t *pdu_session_reactivation_result, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_reactivation_result_error_cause(ogs_nas_pdu_session_reactivation_result_error_cause_t *pdu_session_reactivation_result_error_cause, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_status(ogs_nas_pdu_session_status_t *pdu_session_status, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_plmn_list(ogs_nas_plmn_list_t *plmn_list, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_rejected_nssai(ogs_nas_rejected_nssai_t *rejected_nssai, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_release_assistance_indication(ogs_nas_release_assistance_indication_t *release_assistance_indication, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_request_type(ogs_nas_request_type_t *request_type, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_s1_ue_network_capability(ogs_nas_s1_ue_network_capability_t *s1_ue_network_capability, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_s1_ue_security_capability(ogs_nas_s1_ue_security_capability_t *s1_ue_security_capability, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_service_area_list(ogs_nas_service_area_list_t *service_area_list, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gs_network_feature_support(ogs_nas_5gs_network_feature_support_t *network_feature_support, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_sms_indication(ogs_nas_sms_indication_t *sms_indication, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_sor_transparent_container(ogs_nas_sor_transparent_container_t *sor_transparent_container, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_supported_codec_list(ogs_nas_supported_codec_list_t *supported_codec_list, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_time_zone(ogs_nas_time_zone_t *time_zone, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_time_zone_and_time(ogs_nas_time_zone_and_time_t *time_zone_and_time, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_ue_security_capability(ogs_nas_ue_security_capability_t *ue_security_capability, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_ue_usage_setting(ogs_nas_ue_usage_setting_t *ue_usage_setting, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_ue_status(ogs_nas_ue_status_t *ue_status, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_uplink_data_status(ogs_nas_uplink_data_status_t *uplink_data_status, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gs_registration_result(ogs_nas_5gs_registration_result_t *registration_result, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_ue_radio_capability_id(ogs_nas_ue_radio_capability_id_t *ue_radio_capability_id, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_ue_radio_capability_id_deletion_indication(ogs_nas_ue_radio_capability_id_deletion_indication_t *ue_radio_capability_id_deletion_indication, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gs_registration_type(ogs_nas_5gs_registration_type_t *registration_type, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_truncated_5g_s_tmsi_configuration(ogs_nas_truncated_5g_s_tmsi_configuration_t *truncated_s_tmsi_configuration, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_wus_assistance_information(ogs_nas_wus_assistance_information_t *wus_assistance_information, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_n5gc_indication(ogs_nas_n5gc_indication_t *n5gc_indication, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gs_tracking_area_identity(ogs_nas_5gs_tracking_area_identity_t *tracking_area_identity, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gs_tracking_area_identity_list(ogs_nas_5gs_tracking_area_identity_list_t *tracking_area_identity_list, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gs_update_type(ogs_nas_5gs_update_type_t *update_type, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gsm_capability(ogs_nas_5gsm_capability_t *gsm_capability, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_address(ogs_nas_pdu_address_t *pdu_address, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdu_session_type(ogs_nas_pdu_session_type_t *pdu_session_type, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_qos_flow_descriptions(ogs_nas_qos_flow_descriptions_t *qos_flow_descriptions, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_qos_rules(ogs_nas_qos_rules_t *qos_rules, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_session_ambr(ogs_nas_session_ambr_t *session_ambr, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_sm_pdu_dn_request_container(ogs_nas_sm_pdu_dn_request_container_t *sm_pdu_dn_request_container, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_ssc_mode(ogs_nas_ssc_mode_t *ssc_mode, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_re_attempt_indicator(ogs_nas_re_attempt_indicator_t *re_attempt_indicator, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gsm_network_feature_support(ogs_nas_5gsm_network_feature_support_t *gsm_network_feature_support, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gsm_cause(ogs_nas_5gsm_cause_t *gsm_cause, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_serving_plmn_rate_control(ogs_nas_serving_plmn_rate_control_t *serving_plmn_rate_control, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_5gsm_congestion_re_attempt_indicator(ogs_nas_5gsm_congestion_re_attempt_indicator_t *gsm_congestion_re_attempt_indicator, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_atsss_container(ogs_nas_atsss_container_t *atsss_container, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_control_plane_only_indication(ogs_nas_control_plane_only_indication_t *control_plane_only_indication, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_header_compression_configuration(ogs_nas_header_compression_configuration_t *header_compression_configuration, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_ds_tt_ethernet_port_mac_address(ogs_nas_ds_tt_ethernet_port_mac_address_t *ds_tt_ethernet_port_mac_address, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_ue_ds_tt_residence_time(ogs_nas_ue_ds_tt_residence_time_t *ue_ds_tt_residence_time, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_port_management_information_container(ogs_nas_port_management_information_container_t *port_management_information_container, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_always_on_pdu_session_indication(ogs_nas_always_on_pdu_session_indication_t *always_on_pdu_session_indication, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_always_on_pdu_session_requested(ogs_nas_always_on_pdu_session_requested_t *always_on_pdu_session_requested, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_allowed_ssc_mode(ogs_nas_allowed_ssc_mode_t *allowed_ssc_mode, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_extended_protocol_configuration_options(ogs_nas_extended_protocol_configuration_options_t *extended_protocol_configuration_options, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_integrity_protection_maximum_data_rate(ogs_nas_integrity_protection_maximum_data_rate_t *integrity_protection_maximum_data_rate, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_mapped_eps_bearer_contexts(ogs_nas_mapped_eps_bearer_contexts_t *mapped_eps_bearer_contexts, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_maximum_number_of_supported_packet_filters(ogs_nas_maximum_number_of_supported_packet_filters_t *maximum_number_of_supported_packet_filters, ogs_pkbuf_t *pkbuf); + +int ogs_nas_encode_additional_information(ogs_pkbuf_t *pkbuf, ogs_nas_additional_information_t *additional_information); +int ogs_nas_encode_access_type(ogs_pkbuf_t *pkbuf, ogs_nas_access_type_t *access_type); +int ogs_nas_encode_dnn(ogs_pkbuf_t *pkbuf, ogs_nas_dnn_t *dnn); +int ogs_nas_encode_eap_message(ogs_pkbuf_t *pkbuf, ogs_nas_eap_message_t *eap_message); +int ogs_nas_encode_gprs_timer(ogs_pkbuf_t *pkbuf, ogs_nas_gprs_timer_t *gprs_timer); +int ogs_nas_encode_gprs_timer_2(ogs_pkbuf_t *pkbuf, ogs_nas_gprs_timer_2_t *gprs_timer_2); +int ogs_nas_encode_gprs_timer_3(ogs_pkbuf_t *pkbuf, ogs_nas_gprs_timer_3_t *gprs_timer_3); +int ogs_nas_encode_s_nssai(ogs_pkbuf_t *pkbuf, ogs_nas_s_nssai_t *s_nssai); +int ogs_nas_encode_5gmm_capability(ogs_pkbuf_t *pkbuf, ogs_nas_5gmm_capability_t *gmm_capability); +int ogs_nas_encode_abba(ogs_pkbuf_t *pkbuf, ogs_nas_abba_t *abba); +int ogs_nas_encode_additional_5g_security_information(ogs_pkbuf_t *pkbuf, ogs_nas_additional_5g_security_information_t *additional_security_information); +int ogs_nas_encode_additional_information_requested(ogs_pkbuf_t *pkbuf, ogs_nas_additional_information_requested_t *additional_information_requested); +int ogs_nas_encode_allowed_pdu_session_status(ogs_pkbuf_t *pkbuf, ogs_nas_allowed_pdu_session_status_t *allowed_pdu_session_status); +int ogs_nas_encode_authentication_failure_parameter(ogs_pkbuf_t *pkbuf, ogs_nas_authentication_failure_parameter_t *authentication_failure_parameter); +int ogs_nas_encode_authentication_parameter_autn(ogs_pkbuf_t *pkbuf, ogs_nas_authentication_parameter_autn_t *authentication_parameter_autn); +int ogs_nas_encode_authentication_parameter_rand(ogs_pkbuf_t *pkbuf, ogs_nas_authentication_parameter_rand_t *authentication_parameter_rand); +int ogs_nas_encode_authentication_response_parameter(ogs_pkbuf_t *pkbuf, ogs_nas_authentication_response_parameter_t *authentication_response_parameter); +int ogs_nas_encode_configuration_update_indication(ogs_pkbuf_t *pkbuf, ogs_nas_configuration_update_indication_t *configuration_update_indication); +int ogs_nas_encode_cag_information_list(ogs_pkbuf_t *pkbuf, ogs_nas_cag_information_list_t *cag_information_list); +int ogs_nas_encode_ciot_small_data_container(ogs_pkbuf_t *pkbuf, ogs_nas_ciot_small_data_container_t *ciot_small_data_container); +int ogs_nas_encode_ciphering_key_data(ogs_pkbuf_t *pkbuf, ogs_nas_ciphering_key_data_t *ciphering_key_data); +int ogs_nas_encode_control_plane_service_type(ogs_pkbuf_t *pkbuf, ogs_nas_control_plane_service_type_t *control_plane_service_type); +int ogs_nas_encode_daylight_saving_time(ogs_pkbuf_t *pkbuf, ogs_nas_daylight_saving_time_t *daylight_saving_time); +int ogs_nas_encode_5gmm_cause(ogs_pkbuf_t *pkbuf, ogs_nas_5gmm_cause_t *gmm_cause); +int ogs_nas_encode_de_registration_type(ogs_pkbuf_t *pkbuf, ogs_nas_de_registration_type_t *de_registration_type); +int ogs_nas_encode_emergency_number_list(ogs_pkbuf_t *pkbuf, ogs_nas_emergency_number_list_t *emergency_number_list); +int ogs_nas_encode_eps_bearer_context_status(ogs_pkbuf_t *pkbuf, ogs_nas_eps_bearer_context_status_t *eps_bearer_context_status); +int ogs_nas_encode_eps_nas_message_container(ogs_pkbuf_t *pkbuf, ogs_nas_eps_nas_message_container_t *eps_nas_message_container); +int ogs_nas_encode_eps_nas_security_algorithms(ogs_pkbuf_t *pkbuf, ogs_nas_eps_nas_security_algorithms_t *eps_nas_security_algorithms); +int ogs_nas_encode_extended_emergency_number_list(ogs_pkbuf_t *pkbuf, ogs_nas_extended_emergency_number_list_t *extended_emergency_number_list); +int ogs_nas_encode_extended_drx_parameters(ogs_pkbuf_t *pkbuf, ogs_nas_extended_drx_parameters_t *extended_drx_parameters); +int ogs_nas_encode_imeisv_request(ogs_pkbuf_t *pkbuf, ogs_nas_imeisv_request_t *imeisv_request); +int ogs_nas_encode_ladn_indication(ogs_pkbuf_t *pkbuf, ogs_nas_ladn_indication_t *ladn_indication); +int ogs_nas_encode_5gs_drx_parameters(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_drx_parameters_t *drx_parameters); +int ogs_nas_encode_5gs_identity_type(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_identity_type_t *identity_type); +int ogs_nas_encode_ladn_information(ogs_pkbuf_t *pkbuf, ogs_nas_ladn_information_t *ladn_information); +int ogs_nas_encode_mico_indication(ogs_pkbuf_t *pkbuf, ogs_nas_mico_indication_t *mico_indication); +int ogs_nas_encode_ma_pdu_session_information(ogs_pkbuf_t *pkbuf, ogs_nas_ma_pdu_session_information_t *ma_pdu_session_information); +int ogs_nas_encode_mapped_nssai(ogs_pkbuf_t *pkbuf, ogs_nas_mapped_nssai_t *mapped_nssai); +int ogs_nas_encode_mobile_station_classmark_2(ogs_pkbuf_t *pkbuf, ogs_nas_mobile_station_classmark_2_t *mobile_station_classmark_2); +int ogs_nas_encode_key_set_identifier(ogs_pkbuf_t *pkbuf, ogs_nas_key_set_identifier_t *key_set_identifier); +int ogs_nas_encode_message_container(ogs_pkbuf_t *pkbuf, ogs_nas_message_container_t *message_container); +int ogs_nas_encode_security_algorithms(ogs_pkbuf_t *pkbuf, ogs_nas_security_algorithms_t *security_algorithms); +int ogs_nas_encode_network_name(ogs_pkbuf_t *pkbuf, ogs_nas_network_name_t *network_name); +int ogs_nas_encode_network_slicing_indication(ogs_pkbuf_t *pkbuf, ogs_nas_network_slicing_indication_t *network_slicing_indication); +int ogs_nas_encode_non_3gpp_nw_provided_policies(ogs_pkbuf_t *pkbuf, ogs_nas_non_3gpp_nw_provided_policies_t *non_3gpp_nw_provided_policies); +int ogs_nas_encode_nssai(ogs_pkbuf_t *pkbuf, ogs_nas_nssai_t *nssai); +int ogs_nas_encode_nssai_inclusion_mode(ogs_pkbuf_t *pkbuf, ogs_nas_nssai_inclusion_mode_t *nssai_inclusion_mode); +int ogs_nas_encode_operator_defined_access_category_definitions(ogs_pkbuf_t *pkbuf, ogs_nas_operator_defined_access_category_definitions_t *operator_defined_access_category_definitions); +int ogs_nas_encode_payload_container(ogs_pkbuf_t *pkbuf, ogs_nas_payload_container_t *payload_container); +int ogs_nas_encode_5gs_mobile_identity(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_mobile_identity_t *mobile_identity); +int ogs_nas_encode_payload_container_type(ogs_pkbuf_t *pkbuf, ogs_nas_payload_container_type_t *payload_container_type); +int ogs_nas_encode_pdu_session_identity_2(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_session_identity_2_t *pdu_session_identity_2); +int ogs_nas_encode_pdu_session_reactivation_result(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_session_reactivation_result_t *pdu_session_reactivation_result); +int ogs_nas_encode_pdu_session_reactivation_result_error_cause(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_session_reactivation_result_error_cause_t *pdu_session_reactivation_result_error_cause); +int ogs_nas_encode_pdu_session_status(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_session_status_t *pdu_session_status); +int ogs_nas_encode_plmn_list(ogs_pkbuf_t *pkbuf, ogs_nas_plmn_list_t *plmn_list); +int ogs_nas_encode_rejected_nssai(ogs_pkbuf_t *pkbuf, ogs_nas_rejected_nssai_t *rejected_nssai); +int ogs_nas_encode_release_assistance_indication(ogs_pkbuf_t *pkbuf, ogs_nas_release_assistance_indication_t *release_assistance_indication); +int ogs_nas_encode_request_type(ogs_pkbuf_t *pkbuf, ogs_nas_request_type_t *request_type); +int ogs_nas_encode_s1_ue_network_capability(ogs_pkbuf_t *pkbuf, ogs_nas_s1_ue_network_capability_t *s1_ue_network_capability); +int ogs_nas_encode_s1_ue_security_capability(ogs_pkbuf_t *pkbuf, ogs_nas_s1_ue_security_capability_t *s1_ue_security_capability); +int ogs_nas_encode_service_area_list(ogs_pkbuf_t *pkbuf, ogs_nas_service_area_list_t *service_area_list); +int ogs_nas_encode_5gs_network_feature_support(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_network_feature_support_t *network_feature_support); +int ogs_nas_encode_sms_indication(ogs_pkbuf_t *pkbuf, ogs_nas_sms_indication_t *sms_indication); +int ogs_nas_encode_sor_transparent_container(ogs_pkbuf_t *pkbuf, ogs_nas_sor_transparent_container_t *sor_transparent_container); +int ogs_nas_encode_supported_codec_list(ogs_pkbuf_t *pkbuf, ogs_nas_supported_codec_list_t *supported_codec_list); +int ogs_nas_encode_time_zone(ogs_pkbuf_t *pkbuf, ogs_nas_time_zone_t *time_zone); +int ogs_nas_encode_time_zone_and_time(ogs_pkbuf_t *pkbuf, ogs_nas_time_zone_and_time_t *time_zone_and_time); +int ogs_nas_encode_ue_security_capability(ogs_pkbuf_t *pkbuf, ogs_nas_ue_security_capability_t *ue_security_capability); +int ogs_nas_encode_ue_usage_setting(ogs_pkbuf_t *pkbuf, ogs_nas_ue_usage_setting_t *ue_usage_setting); +int ogs_nas_encode_ue_status(ogs_pkbuf_t *pkbuf, ogs_nas_ue_status_t *ue_status); +int ogs_nas_encode_uplink_data_status(ogs_pkbuf_t *pkbuf, ogs_nas_uplink_data_status_t *uplink_data_status); +int ogs_nas_encode_5gs_registration_result(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_registration_result_t *registration_result); +int ogs_nas_encode_ue_radio_capability_id(ogs_pkbuf_t *pkbuf, ogs_nas_ue_radio_capability_id_t *ue_radio_capability_id); +int ogs_nas_encode_ue_radio_capability_id_deletion_indication(ogs_pkbuf_t *pkbuf, ogs_nas_ue_radio_capability_id_deletion_indication_t *ue_radio_capability_id_deletion_indication); +int ogs_nas_encode_5gs_registration_type(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_registration_type_t *registration_type); +int ogs_nas_encode_truncated_5g_s_tmsi_configuration(ogs_pkbuf_t *pkbuf, ogs_nas_truncated_5g_s_tmsi_configuration_t *truncated_s_tmsi_configuration); +int ogs_nas_encode_wus_assistance_information(ogs_pkbuf_t *pkbuf, ogs_nas_wus_assistance_information_t *wus_assistance_information); +int ogs_nas_encode_n5gc_indication(ogs_pkbuf_t *pkbuf, ogs_nas_n5gc_indication_t *n5gc_indication); +int ogs_nas_encode_5gs_tracking_area_identity(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_tracking_area_identity_t *tracking_area_identity); +int ogs_nas_encode_5gs_tracking_area_identity_list(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_tracking_area_identity_list_t *tracking_area_identity_list); +int ogs_nas_encode_5gs_update_type(ogs_pkbuf_t *pkbuf, ogs_nas_5gs_update_type_t *update_type); +int ogs_nas_encode_5gsm_capability(ogs_pkbuf_t *pkbuf, ogs_nas_5gsm_capability_t *gsm_capability); +int ogs_nas_encode_pdu_address(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_address_t *pdu_address); +int ogs_nas_encode_pdu_session_type(ogs_pkbuf_t *pkbuf, ogs_nas_pdu_session_type_t *pdu_session_type); +int ogs_nas_encode_qos_flow_descriptions(ogs_pkbuf_t *pkbuf, ogs_nas_qos_flow_descriptions_t *qos_flow_descriptions); +int ogs_nas_encode_qos_rules(ogs_pkbuf_t *pkbuf, ogs_nas_qos_rules_t *qos_rules); +int ogs_nas_encode_session_ambr(ogs_pkbuf_t *pkbuf, ogs_nas_session_ambr_t *session_ambr); +int ogs_nas_encode_sm_pdu_dn_request_container(ogs_pkbuf_t *pkbuf, ogs_nas_sm_pdu_dn_request_container_t *sm_pdu_dn_request_container); +int ogs_nas_encode_ssc_mode(ogs_pkbuf_t *pkbuf, ogs_nas_ssc_mode_t *ssc_mode); +int ogs_nas_encode_re_attempt_indicator(ogs_pkbuf_t *pkbuf, ogs_nas_re_attempt_indicator_t *re_attempt_indicator); +int ogs_nas_encode_5gsm_network_feature_support(ogs_pkbuf_t *pkbuf, ogs_nas_5gsm_network_feature_support_t *gsm_network_feature_support); +int ogs_nas_encode_5gsm_cause(ogs_pkbuf_t *pkbuf, ogs_nas_5gsm_cause_t *gsm_cause); +int ogs_nas_encode_serving_plmn_rate_control(ogs_pkbuf_t *pkbuf, ogs_nas_serving_plmn_rate_control_t *serving_plmn_rate_control); +int ogs_nas_encode_5gsm_congestion_re_attempt_indicator(ogs_pkbuf_t *pkbuf, ogs_nas_5gsm_congestion_re_attempt_indicator_t *gsm_congestion_re_attempt_indicator); +int ogs_nas_encode_atsss_container(ogs_pkbuf_t *pkbuf, ogs_nas_atsss_container_t *atsss_container); +int ogs_nas_encode_control_plane_only_indication(ogs_pkbuf_t *pkbuf, ogs_nas_control_plane_only_indication_t *control_plane_only_indication); +int ogs_nas_encode_header_compression_configuration(ogs_pkbuf_t *pkbuf, ogs_nas_header_compression_configuration_t *header_compression_configuration); +int ogs_nas_encode_ds_tt_ethernet_port_mac_address(ogs_pkbuf_t *pkbuf, ogs_nas_ds_tt_ethernet_port_mac_address_t *ds_tt_ethernet_port_mac_address); +int ogs_nas_encode_ue_ds_tt_residence_time(ogs_pkbuf_t *pkbuf, ogs_nas_ue_ds_tt_residence_time_t *ue_ds_tt_residence_time); +int ogs_nas_encode_port_management_information_container(ogs_pkbuf_t *pkbuf, ogs_nas_port_management_information_container_t *port_management_information_container); +int ogs_nas_encode_always_on_pdu_session_indication(ogs_pkbuf_t *pkbuf, ogs_nas_always_on_pdu_session_indication_t *always_on_pdu_session_indication); +int ogs_nas_encode_always_on_pdu_session_requested(ogs_pkbuf_t *pkbuf, ogs_nas_always_on_pdu_session_requested_t *always_on_pdu_session_requested); +int ogs_nas_encode_allowed_ssc_mode(ogs_pkbuf_t *pkbuf, ogs_nas_allowed_ssc_mode_t *allowed_ssc_mode); +int ogs_nas_encode_extended_protocol_configuration_options(ogs_pkbuf_t *pkbuf, ogs_nas_extended_protocol_configuration_options_t *extended_protocol_configuration_options); +int ogs_nas_encode_integrity_protection_maximum_data_rate(ogs_pkbuf_t *pkbuf, ogs_nas_integrity_protection_maximum_data_rate_t *integrity_protection_maximum_data_rate); +int ogs_nas_encode_mapped_eps_bearer_contexts(ogs_pkbuf_t *pkbuf, ogs_nas_mapped_eps_bearer_contexts_t *mapped_eps_bearer_contexts); +int ogs_nas_encode_maximum_number_of_supported_packet_filters(ogs_pkbuf_t *pkbuf, ogs_nas_maximum_number_of_supported_packet_filters_t *maximum_number_of_supported_packet_filters); + +#ifdef __cplusplus +} +#endif + +#endif /* OGS_NAS_5GS_IES_H */ + diff --git a/lib/nas/5gs/meson.build b/lib/nas/5gs/meson.build new file mode 100644 index 0000000000..1a24eb6b45 --- /dev/null +++ b/lib/nas/5gs/meson.build @@ -0,0 +1,37 @@ +# Copyright (C) 2019 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 . + +libnas_5gs_sources = files(''' + ies.c + decoder.c + encoder.c +'''.split()) + +libnas_5gs_inc = include_directories('.') + +libnas_5gs = library('ogsnas-5gs', + sources : libnas_5gs_sources, + version : libogslib_version, + c_args : '-DOGS_NAS_COMPILATION', + include_directories : libnas_5gs_inc, + dependencies : libnas_common_dep, + install : true) + +libnas_5gs_dep = declare_dependency( + link_with : libnas_5gs, + include_directories : libnas_5gs_inc, + dependencies : libnas_common_dep) diff --git a/lib/nas/5gs/message.h b/lib/nas/5gs/message.h new file mode 100644 index 0000000000..e10fb4b1a2 --- /dev/null +++ b/lib/nas/5gs/message.h @@ -0,0 +1,1384 @@ +/* + * The MIT License + * + * Copyright (C) 2019,2020 by Sukchan Lee + * + * This file is part of Open5GS. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/******************************************************************************* + * This file had been created by nas-message.py script v0.2.0 + * Please do not modify this file but regenerate it via script. + * Created on: 2020-05-21 21:20:09.032866 by acetcom + * from 24501-g41.docx + ******************************************************************************/ + +#if !defined(OGS_NAS_INSIDE) && !defined(OGS_NAS_COMPILATION) +#error "This header cannot be included directly." +#endif + +#ifndef OGS_NAS_5GS_MESSAGE_H +#define OGS_NAS_5GS_MESSAGE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM. + * When calculating AES_CMAC, we need to use the headroom of the packet. */ +#define OGS_NAS_HEADROOM 16 + +#define OGS_NAS_SECURITY_HEADER_PLAIN_NAS_MESSAGE 0 +#define OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED 1 +#define OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED 2 +#define OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_NEW_SECURITY_CONTEXT 3 +#define OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHTERD_WITH_NEW_INTEGRITY_CONTEXT 4 +#define OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_PARTICALLY_CIPHTERD 5 + +#define OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_ESM 0x2e +#define OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_EMM 0x7e + +#define OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED 0 +#define OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED 0 + +typedef struct ogs_nas_5gmm_header_s { + uint8_t extended_protocol_discriminator; + uint8_t security_header_type; + uint8_t message_type; +} __attribute__ ((packed)) ogs_nas_5gmm_header_t; + +typedef struct ogs_nas_5gsm_header_s { + uint8_t extended_protocol_discriminator; + uint8_t pdu_session_identity; + uint8_t procedure_transaction_identity; + uint8_t message_type; +} __attribute__ ((packed)) ogs_nas_5gsm_header_t; + +typedef struct ogs_nas_security_header_s { + uint8_t extended_protocol_discriminator; + uint8_t security_header_type; + uint32_t message_authentication_code; + uint8_t sequence_number; +} __attribute__ ((packed)) ogs_nas_security_header_t; + +#define OGS_NAS_REGISTRATION_REQUEST 65 +#define OGS_NAS_REGISTRATION_ACCEPT 66 +#define OGS_NAS_REGISTRATION_COMPLETE 67 +#define OGS_NAS_REGISTRATION_REJECT 68 +#define OGS_NAS_DEREGISTRATION_REQUEST 69 +#define OGS_NAS_DEREGISTRATION_ACCEPT 70 +#define OGS_NAS_SERVICE_REQUEST 76 +#define OGS_NAS_SERVICE_REJECT 77 +#define OGS_NAS_SERVICE_ACCEPT 78 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND 84 +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE 85 +#define OGS_NAS_AUTHENTICATION_REQUEST 86 +#define OGS_NAS_AUTHENTICATION_RESPONSE 87 +#define OGS_NAS_AUTHENTICATION_REJECT 88 +#define OGS_NAS_AUTHENTICATION_FAILURE 89 +#define OGS_NAS_AUTHENTICATION_RESULT 90 +#define OGS_NAS_IDENTITY_REQUEST 91 +#define OGS_NAS_IDENTITY_RESPONSE 92 +#define OGS_NAS_SECURITY_MODE_COMMAND 93 +#define OGS_NAS_SECURITY_MODE_COMPLETE 94 +#define OGS_NAS_SECURITY_MODE_REJECT 95 +#define OGS_NAS_5GMM_STATUS 100 +#define OGS_NAS_NOTIFICATION 101 +#define OGS_NAS_NOTIFICATION_RESPONSE 102 +#define OGS_NAS_UL_NAS_TRANSPORT 103 +#define OGS_NAS_DL_NAS_TRANSPORT 104 +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST 193 +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_ACCEPT 194 +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REJECT 195 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMMAND 197 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE 198 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT 199 +#define OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST 201 +#define OGS_NAS_PDU_SESSION_MODIFICATION_REJECT 202 +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND 203 +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMPLETE 204 +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT 205 +#define OGS_NAS_PDU_SESSION_RELEASE_REQUEST 209 +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT 210 +#define OGS_NAS_PDU_SESSION_RELEASE_COMMAND 211 +#define OGS_NAS_PDU_SESSION_RELEASE_COMPLETE 212 +#define OGS_NAS_5GSM_STATUS 214 + + +/******************************************************* + * REGISTRATION REQUEST + ******************************************************/ +#define OGS_NAS_REGISTRATION_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_REGISTRATION_REQUEST_5GMM_CAPABILITY_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_REGISTRATION_REQUEST_REQUESTED_NSSAI_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_REGISTRATION_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT ((uint64_t)1<<4) +#define OGS_NAS_REGISTRATION_REQUEST_S1_UE_NETWORK_CAPABILITY_PRESENT ((uint64_t)1<<5) +#define OGS_NAS_REGISTRATION_REQUEST_UPLINK_DATA_STATUS_PRESENT ((uint64_t)1<<6) +#define OGS_NAS_REGISTRATION_REQUEST_PDU_SESSION_STATUS_PRESENT ((uint64_t)1<<7) +#define OGS_NAS_REGISTRATION_REQUEST_MICO_INDICATION_PRESENT ((uint64_t)1<<8) +#define OGS_NAS_REGISTRATION_REQUEST_UE_STATUS_PRESENT ((uint64_t)1<<9) +#define OGS_NAS_REGISTRATION_REQUEST_ADDITIONAL_GUTI_PRESENT ((uint64_t)1<<10) +#define OGS_NAS_REGISTRATION_REQUEST_ALLOWED_PDU_SESSION_STATUS_PRESENT ((uint64_t)1<<11) +#define OGS_NAS_REGISTRATION_REQUEST_UE_USAGE_SETTING_PRESENT ((uint64_t)1<<12) +#define OGS_NAS_REGISTRATION_REQUEST_REQUESTED_DRX_PARAMETERS_PRESENT ((uint64_t)1<<13) +#define OGS_NAS_REGISTRATION_REQUEST_EPS_NAS_MESSAGE_CONTAINER_PRESENT ((uint64_t)1<<14) +#define OGS_NAS_REGISTRATION_REQUEST_LADN_INDICATION_PRESENT ((uint64_t)1<<15) +#define OGS_NAS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_TYPE_PRESENT ((uint64_t)1<<16) +#define OGS_NAS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_PRESENT ((uint64_t)1<<17) +#define OGS_NAS_REGISTRATION_REQUEST_NETWORK_SLICING_INDICATION_PRESENT ((uint64_t)1<<18) +#define OGS_NAS_REGISTRATION_REQUEST_5GS_UPDATE_TYPE_PRESENT ((uint64_t)1<<19) +#define OGS_NAS_REGISTRATION_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT ((uint64_t)1<<20) +#define OGS_NAS_REGISTRATION_REQUEST_SUPPORTED_CODECS_PRESENT ((uint64_t)1<<21) +#define OGS_NAS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT ((uint64_t)1<<22) +#define OGS_NAS_REGISTRATION_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT ((uint64_t)1<<23) +#define OGS_NAS_REGISTRATION_REQUEST_REQUESTED_EXTENDED_DRX_PARAMETERS_PRESENT ((uint64_t)1<<24) +#define OGS_NAS_REGISTRATION_REQUEST_T3324_VALUE_PRESENT ((uint64_t)1<<25) +#define OGS_NAS_REGISTRATION_REQUEST_UE_RADIO_CAPABILITY_ID_PRESENT ((uint64_t)1<<26) +#define OGS_NAS_REGISTRATION_REQUEST_REQUESTED_MAPPED_NSSAI_PRESENT ((uint64_t)1<<27) +#define OGS_NAS_REGISTRATION_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_PRESENT ((uint64_t)1<<28) +#define OGS_NAS_REGISTRATION_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_PRESENT ((uint64_t)1<<29) +#define OGS_NAS_REGISTRATION_REQUEST_N5GC_INDICATION_PRESENT ((uint64_t)1<<30) +#define OGS_NAS_REGISTRATION_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_TYPE 0xC0 +#define OGS_NAS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE 0x10 +#define OGS_NAS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE 0x2E +#define OGS_NAS_REGISTRATION_REQUEST_REQUESTED_NSSAI_TYPE 0x2F +#define OGS_NAS_REGISTRATION_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE 0x52 +#define OGS_NAS_REGISTRATION_REQUEST_S1_UE_NETWORK_CAPABILITY_TYPE 0x17 +#define OGS_NAS_REGISTRATION_REQUEST_UPLINK_DATA_STATUS_TYPE 0x40 +#define OGS_NAS_REGISTRATION_REQUEST_PDU_SESSION_STATUS_TYPE 0x50 +#define OGS_NAS_REGISTRATION_REQUEST_MICO_INDICATION_TYPE 0xB0 +#define OGS_NAS_REGISTRATION_REQUEST_UE_STATUS_TYPE 0x2B +#define OGS_NAS_REGISTRATION_REQUEST_ADDITIONAL_GUTI_TYPE 0x77 +#define OGS_NAS_REGISTRATION_REQUEST_ALLOWED_PDU_SESSION_STATUS_TYPE 0x25 +#define OGS_NAS_REGISTRATION_REQUEST_UE_USAGE_SETTING_TYPE 0x18 +#define OGS_NAS_REGISTRATION_REQUEST_REQUESTED_DRX_PARAMETERS_TYPE 0x51 +#define OGS_NAS_REGISTRATION_REQUEST_EPS_NAS_MESSAGE_CONTAINER_TYPE 0x70 +#define OGS_NAS_REGISTRATION_REQUEST_LADN_INDICATION_TYPE 0x74 +#define OGS_NAS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_TYPE_TYPE 0x80 +#define OGS_NAS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_TYPE 0x7B +#define OGS_NAS_REGISTRATION_REQUEST_NETWORK_SLICING_INDICATION_TYPE 0x90 +#define OGS_NAS_REGISTRATION_REQUEST_5GS_UPDATE_TYPE_TYPE 0x53 +#define OGS_NAS_REGISTRATION_REQUEST_MOBILE_STATION_CLASSMARK_2_TYPE 0x41 +#define OGS_NAS_REGISTRATION_REQUEST_SUPPORTED_CODECS_TYPE 0x42 +#define OGS_NAS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_TYPE 0x71 +#define OGS_NAS_REGISTRATION_REQUEST_EPS_BEARER_CONTEXT_STATUS_TYPE 0x60 +#define OGS_NAS_REGISTRATION_REQUEST_REQUESTED_EXTENDED_DRX_PARAMETERS_TYPE 0x6E +#define OGS_NAS_REGISTRATION_REQUEST_T3324_VALUE_TYPE 0x6A +#define OGS_NAS_REGISTRATION_REQUEST_UE_RADIO_CAPABILITY_ID_TYPE 0x67 +#define OGS_NAS_REGISTRATION_REQUEST_REQUESTED_MAPPED_NSSAI_TYPE 0x35 +#define OGS_NAS_REGISTRATION_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_TYPE 0x48 +#define OGS_NAS_REGISTRATION_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_TYPE 0x1A +#define OGS_NAS_REGISTRATION_REQUEST_N5GC_INDICATION_TYPE 0xA1 + +typedef struct ogs_nas_registration_request_s { + /* Mandatory fields */ + ogs_nas_5gs_registration_type_t registration_type; + ogs_nas_5gs_mobile_identity_t mobile_identity; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_key_set_identifier_t non_current_native_nas_key_set_identifier; + ogs_nas_5gmm_capability_t gmm_capability; + ogs_nas_ue_security_capability_t ue_security_capability; + ogs_nas_nssai_t requested_nssai; + ogs_nas_5gs_tracking_area_identity_t last_visited_registered_tai; + ogs_nas_s1_ue_network_capability_t s1_ue_network_capability; + ogs_nas_uplink_data_status_t uplink_data_status; + ogs_nas_pdu_session_status_t pdu_session_status; + ogs_nas_mico_indication_t mico_indication; + ogs_nas_ue_status_t ue_status; + ogs_nas_5gs_mobile_identity_t additional_guti; + ogs_nas_allowed_pdu_session_status_t allowed_pdu_session_status; + ogs_nas_ue_usage_setting_t ue_usage_setting; + ogs_nas_5gs_drx_parameters_t requested_drx_parameters; + ogs_nas_eps_nas_message_container_t eps_nas_message_container; + ogs_nas_ladn_indication_t ladn_indication; + ogs_nas_payload_container_type_t payload_container_type; + ogs_nas_payload_container_t payload_container; + ogs_nas_network_slicing_indication_t network_slicing_indication; + ogs_nas_5gs_update_type_t update_type; + ogs_nas_mobile_station_classmark_2_t mobile_station_classmark_2; + ogs_nas_supported_codec_list_t supported_codecs; + ogs_nas_message_container_t nas_message_container; + ogs_nas_eps_bearer_context_status_t eps_bearer_context_status; + ogs_nas_extended_drx_parameters_t requested_extended_drx_parameters; + ogs_nas_gprs_timer_3_t t3324_value; + ogs_nas_ue_radio_capability_id_t ue_radio_capability_id; + ogs_nas_mapped_nssai_t requested_mapped_nssai; + ogs_nas_additional_information_requested_t additional_information_requested; + ogs_nas_wus_assistance_information_t requested_wus_assistance_information; + ogs_nas_n5gc_indication_t n5gc_indication; +} ogs_nas_registration_request_t; + + +/******************************************************* + * REGISTRATION ACCEPT + ******************************************************/ +#define OGS_NAS_REGISTRATION_ACCEPT_5G_GUTI_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_REGISTRATION_ACCEPT_EQUIVALENT_PLMNS_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_REGISTRATION_ACCEPT_TAI_LIST_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_REGISTRATION_ACCEPT_ALLOWED_NSSAI_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_REGISTRATION_ACCEPT_REJECTED_NSSAI_PRESENT ((uint64_t)1<<4) +#define OGS_NAS_REGISTRATION_ACCEPT_CONFIGURED_NSSAI_PRESENT ((uint64_t)1<<5) +#define OGS_NAS_REGISTRATION_ACCEPT_5GS_NETWORK_FEATURE_SUPPORT_PRESENT ((uint64_t)1<<6) +#define OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_STATUS_PRESENT ((uint64_t)1<<7) +#define OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_PRESENT ((uint64_t)1<<8) +#define OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_PRESENT ((uint64_t)1<<9) +#define OGS_NAS_REGISTRATION_ACCEPT_LADN_INFORMATION_PRESENT ((uint64_t)1<<10) +#define OGS_NAS_REGISTRATION_ACCEPT_MICO_INDICATION_PRESENT ((uint64_t)1<<11) +#define OGS_NAS_REGISTRATION_ACCEPT_NETWORK_SLICING_INDICATION_PRESENT ((uint64_t)1<<12) +#define OGS_NAS_REGISTRATION_ACCEPT_SERVICE_AREA_LIST_PRESENT ((uint64_t)1<<13) +#define OGS_NAS_REGISTRATION_ACCEPT_T3512_VALUE_PRESENT ((uint64_t)1<<14) +#define OGS_NAS_REGISTRATION_ACCEPT_NON_3GPP_DE_REGISTRATION_TIMER_VALUE_PRESENT ((uint64_t)1<<15) +#define OGS_NAS_REGISTRATION_ACCEPT_T3502_VALUE_PRESENT ((uint64_t)1<<16) +#define OGS_NAS_REGISTRATION_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT ((uint64_t)1<<17) +#define OGS_NAS_REGISTRATION_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_PRESENT ((uint64_t)1<<18) +#define OGS_NAS_REGISTRATION_ACCEPT_SOR_TRANSPARENT_CONTAINER_PRESENT ((uint64_t)1<<19) +#define OGS_NAS_REGISTRATION_ACCEPT_EAP_MESSAGE_PRESENT ((uint64_t)1<<20) +#define OGS_NAS_REGISTRATION_ACCEPT_NSSAI_INCLUSION_MODE_PRESENT ((uint64_t)1<<21) +#define OGS_NAS_REGISTRATION_ACCEPT_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_PRESENT ((uint64_t)1<<22) +#define OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_DRX_PARAMETERS_PRESENT ((uint64_t)1<<23) +#define OGS_NAS_REGISTRATION_ACCEPT_NON_3GPP_NW_POLICIES_PRESENT ((uint64_t)1<<24) +#define OGS_NAS_REGISTRATION_ACCEPT_EPS_BEARER_CONTEXT_STATUS_PRESENT ((uint64_t)1<<25) +#define OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_EXTENDED_DRX_PARAMETERS_PRESENT ((uint64_t)1<<26) +#define OGS_NAS_REGISTRATION_ACCEPT_T3447_VALUE_PRESENT ((uint64_t)1<<27) +#define OGS_NAS_REGISTRATION_ACCEPT_T3448_VALUE_PRESENT ((uint64_t)1<<28) +#define OGS_NAS_REGISTRATION_ACCEPT_T3324_VALUE_PRESENT ((uint64_t)1<<29) +#define OGS_NAS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_PRESENT ((uint64_t)1<<30) +#define OGS_NAS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_PRESENT ((uint64_t)1<<31) +#define OGS_NAS_REGISTRATION_ACCEPT_PENDING_NSSAI_PRESENT ((uint64_t)1<<32) +#define OGS_NAS_REGISTRATION_ACCEPT_CIPHERING_KEY_DATA_PRESENT ((uint64_t)1<<33) +#define OGS_NAS_REGISTRATION_ACCEPT_CAG_INFORMATION_LIST_PRESENT ((uint64_t)1<<34) +#define OGS_NAS_REGISTRATION_ACCEPT_TRUNCATED_5G_S_TMSI_CONFIGURATION_PRESENT ((uint64_t)1<<35) +#define OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_WUS_ASSISTANCE_INFORMATION_PRESENT ((uint64_t)1<<36) +#define OGS_NAS_REGISTRATION_ACCEPT_5G_GUTI_TYPE 0x77 +#define OGS_NAS_REGISTRATION_ACCEPT_EQUIVALENT_PLMNS_TYPE 0x4A +#define OGS_NAS_REGISTRATION_ACCEPT_TAI_LIST_TYPE 0x54 +#define OGS_NAS_REGISTRATION_ACCEPT_ALLOWED_NSSAI_TYPE 0x15 +#define OGS_NAS_REGISTRATION_ACCEPT_REJECTED_NSSAI_TYPE 0x11 +#define OGS_NAS_REGISTRATION_ACCEPT_CONFIGURED_NSSAI_TYPE 0x31 +#define OGS_NAS_REGISTRATION_ACCEPT_5GS_NETWORK_FEATURE_SUPPORT_TYPE 0x21 +#define OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_STATUS_TYPE 0x50 +#define OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_TYPE 0x26 +#define OGS_NAS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_TYPE 0x72 +#define OGS_NAS_REGISTRATION_ACCEPT_LADN_INFORMATION_TYPE 0x79 +#define OGS_NAS_REGISTRATION_ACCEPT_MICO_INDICATION_TYPE 0xB0 +#define OGS_NAS_REGISTRATION_ACCEPT_NETWORK_SLICING_INDICATION_TYPE 0x90 +#define OGS_NAS_REGISTRATION_ACCEPT_SERVICE_AREA_LIST_TYPE 0x27 +#define OGS_NAS_REGISTRATION_ACCEPT_T3512_VALUE_TYPE 0x5E +#define OGS_NAS_REGISTRATION_ACCEPT_NON_3GPP_DE_REGISTRATION_TIMER_VALUE_TYPE 0x5D +#define OGS_NAS_REGISTRATION_ACCEPT_T3502_VALUE_TYPE 0x16 +#define OGS_NAS_REGISTRATION_ACCEPT_EMERGENCY_NUMBER_LIST_TYPE 0x34 +#define OGS_NAS_REGISTRATION_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_TYPE 0x7A +#define OGS_NAS_REGISTRATION_ACCEPT_SOR_TRANSPARENT_CONTAINER_TYPE 0x73 +#define OGS_NAS_REGISTRATION_ACCEPT_EAP_MESSAGE_TYPE 0x78 +#define OGS_NAS_REGISTRATION_ACCEPT_NSSAI_INCLUSION_MODE_TYPE 0xA0 +#define OGS_NAS_REGISTRATION_ACCEPT_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_TYPE 0x76 +#define OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_DRX_PARAMETERS_TYPE 0x51 +#define OGS_NAS_REGISTRATION_ACCEPT_NON_3GPP_NW_POLICIES_TYPE 0xD0 +#define OGS_NAS_REGISTRATION_ACCEPT_EPS_BEARER_CONTEXT_STATUS_TYPE 0x60 +#define OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_EXTENDED_DRX_PARAMETERS_TYPE 0x6E +#define OGS_NAS_REGISTRATION_ACCEPT_T3447_VALUE_TYPE 0x6C +#define OGS_NAS_REGISTRATION_ACCEPT_T3448_VALUE_TYPE 0x6B +#define OGS_NAS_REGISTRATION_ACCEPT_T3324_VALUE_TYPE 0x6A +#define OGS_NAS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_TYPE 0x67 +#define OGS_NAS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_TYPE 0x68 +#define OGS_NAS_REGISTRATION_ACCEPT_PENDING_NSSAI_TYPE 0x39 +#define OGS_NAS_REGISTRATION_ACCEPT_CIPHERING_KEY_DATA_TYPE 0x74 +#define OGS_NAS_REGISTRATION_ACCEPT_CAG_INFORMATION_LIST_TYPE 0x75 +#define OGS_NAS_REGISTRATION_ACCEPT_TRUNCATED_5G_S_TMSI_CONFIGURATION_TYPE 0x1B +#define OGS_NAS_REGISTRATION_ACCEPT_NEGOTIATED_WUS_ASSISTANCE_INFORMATION_TYPE 0x1C + +typedef struct ogs_nas_registration_accept_s { + /* Mandatory fields */ + ogs_nas_5gs_registration_result_t registration_result; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_5gs_mobile_identity_t guti; + ogs_nas_plmn_list_t equivalent_plmns; + ogs_nas_5gs_tracking_area_identity_list_t tai_list; + ogs_nas_nssai_t allowed_nssai; + ogs_nas_rejected_nssai_t rejected_nssai; + ogs_nas_nssai_t configured_nssai; + ogs_nas_5gs_network_feature_support_t network_feature_support; + ogs_nas_pdu_session_status_t pdu_session_status; + ogs_nas_pdu_session_reactivation_result_t pdu_session_reactivation_result; + ogs_nas_pdu_session_reactivation_result_error_cause_t pdu_session_reactivation_result_error_cause; + ogs_nas_ladn_information_t ladn_information; + ogs_nas_mico_indication_t mico_indication; + ogs_nas_network_slicing_indication_t network_slicing_indication; + ogs_nas_service_area_list_t service_area_list; + ogs_nas_gprs_timer_3_t t3512_value; + ogs_nas_gprs_timer_2_t non_3gpp_de_registration_timer_value; + ogs_nas_gprs_timer_2_t t3502_value; + ogs_nas_emergency_number_list_t emergency_number_list; + ogs_nas_extended_emergency_number_list_t extended_emergency_number_list; + ogs_nas_sor_transparent_container_t sor_transparent_container; + ogs_nas_eap_message_t eap_message; + ogs_nas_nssai_inclusion_mode_t nssai_inclusion_mode; + ogs_nas_operator_defined_access_category_definitions_t operator_defined_access_category_definitions; + ogs_nas_5gs_drx_parameters_t negotiated_drx_parameters; + ogs_nas_non_3gpp_nw_provided_policies_t non_3gpp_nw_policies; + ogs_nas_eps_bearer_context_status_t eps_bearer_context_status; + ogs_nas_extended_drx_parameters_t negotiated_extended_drx_parameters; + ogs_nas_gprs_timer_3_t t3447_value; + ogs_nas_gprs_timer_3_t t3448_value; + ogs_nas_gprs_timer_3_t t3324_value; + ogs_nas_ue_radio_capability_id_t ue_radio_capability_id; + ogs_nas_ue_radio_capability_id_deletion_indication_t ue_radio_capability_id_deletion_indication; + ogs_nas_nssai_t pending_nssai; + ogs_nas_ciphering_key_data_t ciphering_key_data; + ogs_nas_cag_information_list_t cag_information_list; + ogs_nas_truncated_5g_s_tmsi_configuration_t truncated_s_tmsi_configuration; + ogs_nas_wus_assistance_information_t negotiated_wus_assistance_information; +} ogs_nas_registration_accept_t; + + +/******************************************************* + * REGISTRATION COMPLETE + ******************************************************/ +#define OGS_NAS_REGISTRATION_COMPLETE_SOR_TRANSPARENT_CONTAINER_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_REGISTRATION_COMPLETE_SOR_TRANSPARENT_CONTAINER_TYPE 0x73 + +typedef struct ogs_nas_registration_complete_s { + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_sor_transparent_container_t sor_transparent_container; +} ogs_nas_registration_complete_t; + + +/******************************************************* + * REGISTRATION REJECT + ******************************************************/ +#define OGS_NAS_REGISTRATION_REJECT_T3346_VALUE_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_REGISTRATION_REJECT_T3502_VALUE_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_REGISTRATION_REJECT_EAP_MESSAGE_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_REGISTRATION_REJECT_REJECTED_NSSAI_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_REGISTRATION_REJECT_T3346_VALUE_TYPE 0x5F +#define OGS_NAS_REGISTRATION_REJECT_T3502_VALUE_TYPE 0x16 +#define OGS_NAS_REGISTRATION_REJECT_EAP_MESSAGE_TYPE 0x78 +#define OGS_NAS_REGISTRATION_REJECT_REJECTED_NSSAI_TYPE 0x69 + +typedef struct ogs_nas_registration_reject_s { + /* Mandatory fields */ + ogs_nas_5gmm_cause_t gmm_cause; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_gprs_timer_2_t t3346_value; + ogs_nas_gprs_timer_2_t t3502_value; + ogs_nas_eap_message_t eap_message; + ogs_nas_rejected_nssai_t rejected_nssai; +} ogs_nas_registration_reject_t; + + +/******************************************************* + * DEREGISTRATION REQUEST FROM UE + ******************************************************/ + +typedef struct ogs_nas_deregistration_request_from_ue_s { + /* Mandatory fields */ + ogs_nas_de_registration_type_t de_registration_type; + ogs_nas_5gs_mobile_identity_t mobile_identity; +} ogs_nas_deregistration_request_from_ue_t; + + +/******************************************************* + * DEREGISTRATION REQUEST TO UE + ******************************************************/ +#define OGS_NAS_DEREGISTRATION_REQUEST_5GMM_CAUSE_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_DEREGISTRATION_REQUEST_T3346_VALUE_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_DEREGISTRATION_REQUEST_REJECTED_NSSAI_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_DEREGISTRATION_REQUEST_5GMM_CAUSE_TYPE 0x58 +#define OGS_NAS_DEREGISTRATION_REQUEST_T3346_VALUE_TYPE 0x5F +#define OGS_NAS_DEREGISTRATION_REQUEST_REJECTED_NSSAI_TYPE 0x6D + +typedef struct ogs_nas_deregistration_request_to_ue_s { + /* Mandatory fields */ + ogs_nas_de_registration_type_t de_registration_type; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_5gmm_cause_t gmm_cause; + ogs_nas_gprs_timer_2_t t3346_value; + ogs_nas_rejected_nssai_t rejected_nssai; +} ogs_nas_deregistration_request_to_ue_t; + + +/******************************************************* + * SERVICE REQUEST + ******************************************************/ +#define OGS_NAS_SERVICE_REQUEST_UPLINK_DATA_STATUS_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_SERVICE_REQUEST_PDU_SESSION_STATUS_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_SERVICE_REQUEST_ALLOWED_PDU_SESSION_STATUS_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_SERVICE_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_SERVICE_REQUEST_UPLINK_DATA_STATUS_TYPE 0x40 +#define OGS_NAS_SERVICE_REQUEST_PDU_SESSION_STATUS_TYPE 0x50 +#define OGS_NAS_SERVICE_REQUEST_ALLOWED_PDU_SESSION_STATUS_TYPE 0x25 +#define OGS_NAS_SERVICE_REQUEST_NAS_MESSAGE_CONTAINER_TYPE 0x71 + +typedef struct ogs_nas_service_request_s { + /* Mandatory fields */ + ogs_nas_key_set_identifier_t ngksi; + ogs_nas_5gs_mobile_identity_t s_tmsi; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_uplink_data_status_t uplink_data_status; + ogs_nas_pdu_session_status_t pdu_session_status; + ogs_nas_allowed_pdu_session_status_t allowed_pdu_session_status; + ogs_nas_message_container_t nas_message_container; +} ogs_nas_service_request_t; + + +/******************************************************* + * SERVICE REJECT + ******************************************************/ +#define OGS_NAS_SERVICE_REJECT_PDU_SESSION_STATUS_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_SERVICE_REJECT_T3346_VALUE_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_SERVICE_REJECT_EAP_MESSAGE_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_SERVICE_REJECT_T3448_VALUE_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_SERVICE_REJECT_PDU_SESSION_STATUS_TYPE 0x50 +#define OGS_NAS_SERVICE_REJECT_T3346_VALUE_TYPE 0x5F +#define OGS_NAS_SERVICE_REJECT_EAP_MESSAGE_TYPE 0x78 +#define OGS_NAS_SERVICE_REJECT_T3448_VALUE_TYPE 0x6B + +typedef struct ogs_nas_service_reject_s { + /* Mandatory fields */ + ogs_nas_5gmm_cause_t gmm_cause; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_pdu_session_status_t pdu_session_status; + ogs_nas_gprs_timer_2_t t3346_value; + ogs_nas_eap_message_t eap_message; + ogs_nas_gprs_timer_3_t t3448_value; +} ogs_nas_service_reject_t; + + +/******************************************************* + * SERVICE ACCEPT + ******************************************************/ +#define OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_STATUS_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_SERVICE_ACCEPT_EAP_MESSAGE_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_SERVICE_ACCEPT_T3448_VALUE_PRESENT ((uint64_t)1<<4) +#define OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_STATUS_TYPE 0x50 +#define OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_TYPE 0x26 +#define OGS_NAS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_TYPE 0x72 +#define OGS_NAS_SERVICE_ACCEPT_EAP_MESSAGE_TYPE 0x78 +#define OGS_NAS_SERVICE_ACCEPT_T3448_VALUE_TYPE 0x6B + +typedef struct ogs_nas_service_accept_s { + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_pdu_session_status_t pdu_session_status; + ogs_nas_pdu_session_reactivation_result_t pdu_session_reactivation_result; + ogs_nas_pdu_session_reactivation_result_error_cause_t pdu_session_reactivation_result_error_cause; + ogs_nas_eap_message_t eap_message; + ogs_nas_gprs_timer_3_t t3448_value; +} ogs_nas_service_accept_t; + + +/******************************************************* + * CONFIGURATION UPDATE COMMAND + ******************************************************/ +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CONFIGURATION_UPDATE_INDICATION_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_5G_GUTI_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_TAI_LIST_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_ALLOWED_NSSAI_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SERVICE_AREA_LIST_PRESENT ((uint64_t)1<<4) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_FULL_NAME_FOR_NETWORK_PRESENT ((uint64_t)1<<5) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SHORT_NAME_FOR_NETWORK_PRESENT ((uint64_t)1<<6) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_LOCAL_TIME_ZONE_PRESENT ((uint64_t)1<<7) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_PRESENT ((uint64_t)1<<8) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_NETWORK_DAYLIGHT_SAVING_TIME_PRESENT ((uint64_t)1<<9) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_LADN_INFORMATION_PRESENT ((uint64_t)1<<10) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_MICO_INDICATION_PRESENT ((uint64_t)1<<11) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_NETWORK_SLICING_INDICATION_PRESENT ((uint64_t)1<<12) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CONFIGURED_NSSAI_PRESENT ((uint64_t)1<<13) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_REJECTED_NSSAI_PRESENT ((uint64_t)1<<14) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_PRESENT ((uint64_t)1<<15) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SMS_INDICATION_PRESENT ((uint64_t)1<<16) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_T3447_VALUE_PRESENT ((uint64_t)1<<17) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CAG_INFORMATION_LIST_PRESENT ((uint64_t)1<<18) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_PRESENT ((uint64_t)1<<19) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_PRESENT ((uint64_t)1<<20) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_5GS_REGISTRATION_RESULT_PRESENT ((uint64_t)1<<21) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_TRUNCATED_5G_S_TMSI_CONFIGURATION_PRESENT ((uint64_t)1<<22) +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CONFIGURATION_UPDATE_INDICATION_TYPE 0xD0 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_5G_GUTI_TYPE 0x77 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_TAI_LIST_TYPE 0x54 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_ALLOWED_NSSAI_TYPE 0x15 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SERVICE_AREA_LIST_TYPE 0x27 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_FULL_NAME_FOR_NETWORK_TYPE 0x43 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SHORT_NAME_FOR_NETWORK_TYPE 0x45 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_LOCAL_TIME_ZONE_TYPE 0x46 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_TYPE 0x47 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_NETWORK_DAYLIGHT_SAVING_TIME_TYPE 0x49 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_LADN_INFORMATION_TYPE 0x79 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_MICO_INDICATION_TYPE 0xB0 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_NETWORK_SLICING_INDICATION_TYPE 0x90 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CONFIGURED_NSSAI_TYPE 0x31 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_REJECTED_NSSAI_TYPE 0x11 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_TYPE 0x76 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_SMS_INDICATION_TYPE 0xF0 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_T3447_VALUE_TYPE 0x6C +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_CAG_INFORMATION_LIST_TYPE 0x75 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_TYPE 0x67 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_TYPE 0x68 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_5GS_REGISTRATION_RESULT_TYPE 0x44 +#define OGS_NAS_CONFIGURATION_UPDATE_COMMAND_TRUNCATED_5G_S_TMSI_CONFIGURATION_TYPE 0x1B + +typedef struct ogs_nas_configuration_update_command_s { + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_configuration_update_indication_t configuration_update_indication; + ogs_nas_5gs_mobile_identity_t guti; + ogs_nas_5gs_tracking_area_identity_list_t tai_list; + ogs_nas_nssai_t allowed_nssai; + ogs_nas_service_area_list_t service_area_list; + ogs_nas_network_name_t full_name_for_network; + ogs_nas_network_name_t short_name_for_network; + ogs_nas_time_zone_t local_time_zone; + ogs_nas_time_zone_and_time_t universal_time_and_local_time_zone; + ogs_nas_daylight_saving_time_t network_daylight_saving_time; + ogs_nas_ladn_information_t ladn_information; + ogs_nas_mico_indication_t mico_indication; + ogs_nas_network_slicing_indication_t network_slicing_indication; + ogs_nas_nssai_t configured_nssai; + ogs_nas_rejected_nssai_t rejected_nssai; + ogs_nas_operator_defined_access_category_definitions_t operator_defined_access_category_definitions; + ogs_nas_sms_indication_t sms_indication; + ogs_nas_gprs_timer_3_t t3447_value; + ogs_nas_cag_information_list_t cag_information_list; + ogs_nas_ue_radio_capability_id_t ue_radio_capability_id; + ogs_nas_ue_radio_capability_id_deletion_indication_t ue_radio_capability_id_deletion_indication; + ogs_nas_5gs_registration_result_t registration_result; + ogs_nas_truncated_5g_s_tmsi_configuration_t truncated_s_tmsi_configuration; +} ogs_nas_configuration_update_command_t; + + +/******************************************************* + * CONFIGURATION UPDATE COMPLETE + ******************************************************/ +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_CIOT_SMALL_DATA_CONTAINER_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PAYLOAD_CONTAINER_TYPE_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PAYLOAD_CONTAINER_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PDU_SESSION_STATUS_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_RELEASE_ASSISTANCE_INDICATION_PRESENT ((uint64_t)1<<4) +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_UPLINK_DATA_STATUS_PRESENT ((uint64_t)1<<5) +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_NAS_MESSAGE_CONTAINER_PRESENT ((uint64_t)1<<6) +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_ADDITIONAL_INFORMATION_PRESENT ((uint64_t)1<<7) +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_CIOT_SMALL_DATA_CONTAINER_TYPE 0x6F +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PAYLOAD_CONTAINER_TYPE_TYPE 0x80 +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PAYLOAD_CONTAINER_TYPE 0x7B +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_PDU_SESSION_STATUS_TYPE 0x50 +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_RELEASE_ASSISTANCE_INDICATION_TYPE 0xF0 +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_UPLINK_DATA_STATUS_TYPE 0x40 +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_NAS_MESSAGE_CONTAINER_TYPE 0x71 +#define OGS_NAS_CONFIGURATION_UPDATE_COMPLETE_ADDITIONAL_INFORMATION_TYPE 0x24 + +typedef struct ogs_nas_configuration_update_complete_s { + /* Mandatory fields */ + ogs_nas_control_plane_service_type_t control_plane_service_type; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_ciot_small_data_container_t ciot_small_data_container; + ogs_nas_payload_container_type_t payload_container_type; + ogs_nas_payload_container_t payload_container; + ogs_nas_pdu_session_identity_2_t pdu_session_id; + ogs_nas_pdu_session_status_t pdu_session_status; + ogs_nas_release_assistance_indication_t release_assistance_indication; + ogs_nas_uplink_data_status_t uplink_data_status; + ogs_nas_message_container_t nas_message_container; + ogs_nas_additional_information_t additional_information; +} ogs_nas_configuration_update_complete_t; + + +/******************************************************* + * AUTHENTICATION REQUEST + ******************************************************/ +#define OGS_NAS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_RAND_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_AUTN_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_AUTHENTICATION_REQUEST_EAP_MESSAGE_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_RAND_TYPE 0x21 +#define OGS_NAS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_AUTN_TYPE 0x20 +#define OGS_NAS_AUTHENTICATION_REQUEST_EAP_MESSAGE_TYPE 0x78 + +typedef struct ogs_nas_authentication_request_s { + /* Mandatory fields */ + ogs_nas_key_set_identifier_t ngksi; + ogs_nas_abba_t abba; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_authentication_parameter_rand_t authentication_parameter_rand; + ogs_nas_authentication_parameter_autn_t authentication_parameter_autn; + ogs_nas_eap_message_t eap_message; +} ogs_nas_authentication_request_t; + + +/******************************************************* + * AUTHENTICATION RESPONSE + ******************************************************/ +#define OGS_NAS_AUTHENTICATION_RESPONSE_AUTHENTICATION_RESPONSE_PARAMETER_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_AUTHENTICATION_RESPONSE_EAP_MESSAGE_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_AUTHENTICATION_RESPONSE_AUTHENTICATION_RESPONSE_PARAMETER_TYPE 0x2D +#define OGS_NAS_AUTHENTICATION_RESPONSE_EAP_MESSAGE_TYPE 0x78 + +typedef struct ogs_nas_authentication_response_s { + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_authentication_response_parameter_t authentication_response_parameter; + ogs_nas_eap_message_t eap_message; +} ogs_nas_authentication_response_t; + + +/******************************************************* + * AUTHENTICATION REJECT + ******************************************************/ +#define OGS_NAS_AUTHENTICATION_REJECT_EAP_MESSAGE_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_AUTHENTICATION_REJECT_EAP_MESSAGE_TYPE 0x78 + +typedef struct ogs_nas_authentication_reject_s { + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_eap_message_t eap_message; +} ogs_nas_authentication_reject_t; + + +/******************************************************* + * AUTHENTICATION FAILURE + ******************************************************/ +#define OGS_NAS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_TYPE 0x30 + +typedef struct ogs_nas_authentication_failure_s { + /* Mandatory fields */ + ogs_nas_5gmm_cause_t gmm_cause; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_authentication_failure_parameter_t authentication_failure_parameter; +} ogs_nas_authentication_failure_t; + + +/******************************************************* + * AUTHENTICATION RESULT + ******************************************************/ +#define OGS_NAS_AUTHENTICATION_RESULT_ABBA_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_AUTHENTICATION_RESULT_ABBA_TYPE 0x38 + +typedef struct ogs_nas_authentication_result_s { + /* Mandatory fields */ + ogs_nas_key_set_identifier_t ngksi; + ogs_nas_eap_message_t eap_message; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_abba_t abba; +} ogs_nas_authentication_result_t; + + +/******************************************************* + * IDENTITY REQUEST + ******************************************************/ + +typedef struct ogs_nas_identity_request_s { + /* Mandatory fields */ + ogs_nas_5gs_identity_type_t identity_type; +} ogs_nas_identity_request_t; + + +/******************************************************* + * IDENTITY RESPONSE + ******************************************************/ + +typedef struct ogs_nas_identity_response_s { + /* Mandatory fields */ + ogs_nas_5gs_mobile_identity_t mobile_identity; +} ogs_nas_identity_response_t; + + +/******************************************************* + * SECURITY MODE COMMAND + ******************************************************/ +#define OGS_NAS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_SECURITY_MODE_COMMAND_SELECTED_EPS_NAS_SECURITY_ALGORITHMS_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_SECURITY_MODE_COMMAND_ADDITIONAL_5G_SECURITY_INFORMATION_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_SECURITY_MODE_COMMAND_EAP_MESSAGE_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_SECURITY_MODE_COMMAND_ABBA_PRESENT ((uint64_t)1<<4) +#define OGS_NAS_SECURITY_MODE_COMMAND_REPLAYED_S1_UE_SECURITY_CAPABILITIES_PRESENT ((uint64_t)1<<5) +#define OGS_NAS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_TYPE 0xE0 +#define OGS_NAS_SECURITY_MODE_COMMAND_SELECTED_EPS_NAS_SECURITY_ALGORITHMS_TYPE 0x57 +#define OGS_NAS_SECURITY_MODE_COMMAND_ADDITIONAL_5G_SECURITY_INFORMATION_TYPE 0x36 +#define OGS_NAS_SECURITY_MODE_COMMAND_EAP_MESSAGE_TYPE 0x78 +#define OGS_NAS_SECURITY_MODE_COMMAND_ABBA_TYPE 0x38 +#define OGS_NAS_SECURITY_MODE_COMMAND_REPLAYED_S1_UE_SECURITY_CAPABILITIES_TYPE 0x19 + +typedef struct ogs_nas_security_mode_command_s { + /* Mandatory fields */ + ogs_nas_security_algorithms_t selected_nas_security_algorithms; + ogs_nas_key_set_identifier_t ngksi; + ogs_nas_ue_security_capability_t replayed_ue_security_capabilities; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_imeisv_request_t imeisv_request; + ogs_nas_eps_nas_security_algorithms_t selected_eps_nas_security_algorithms; + ogs_nas_additional_5g_security_information_t additional_security_information; + ogs_nas_eap_message_t eap_message; + ogs_nas_abba_t abba; + ogs_nas_s1_ue_security_capability_t replayed_s1_ue_security_capabilities; +} ogs_nas_security_mode_command_t; + + +/******************************************************* + * SECURITY MODE COMPLETE + ******************************************************/ +#define OGS_NAS_SECURITY_MODE_COMPLETE_IMEISV_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_SECURITY_MODE_COMPLETE_NAS_MESSAGE_CONTAINER_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_SECURITY_MODE_COMPLETE_NON_IMEISV_PEI_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_SECURITY_MODE_COMPLETE_IMEISV_TYPE 0x77 +#define OGS_NAS_SECURITY_MODE_COMPLETE_NAS_MESSAGE_CONTAINER_TYPE 0x71 +#define OGS_NAS_SECURITY_MODE_COMPLETE_NON_IMEISV_PEI_TYPE 0x78 + +typedef struct ogs_nas_security_mode_complete_s { + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_5gs_mobile_identity_t imeisv; + ogs_nas_message_container_t nas_message_container; + ogs_nas_5gs_mobile_identity_t non_imeisv_pei; +} ogs_nas_security_mode_complete_t; + + +/******************************************************* + * SECURITY MODE REJECT + ******************************************************/ + +typedef struct ogs_nas_security_mode_reject_s { + /* Mandatory fields */ + ogs_nas_5gmm_cause_t gmm_cause; +} ogs_nas_security_mode_reject_t; + + +/******************************************************* + * 5GMM STATUS + ******************************************************/ + +typedef struct ogs_nas_5gmm_status_s { + /* Mandatory fields */ + ogs_nas_5gmm_cause_t gmm_cause; +} ogs_nas_5gmm_status_t; + + +/******************************************************* + * NOTIFICATION + ******************************************************/ + +typedef struct ogs_nas_notification_s { + /* Mandatory fields */ + ogs_nas_access_type_t access_type; +} ogs_nas_notification_t; + + +/******************************************************* + * NOTIFICATION RESPONSE + ******************************************************/ +#define OGS_NAS_NOTIFICATION_RESPONSE_PDU_SESSION_STATUS_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_NOTIFICATION_RESPONSE_PDU_SESSION_STATUS_TYPE 0x50 + +typedef struct ogs_nas_notification_response_s { + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_pdu_session_status_t pdu_session_status; +} ogs_nas_notification_response_t; + + +/******************************************************* + * UL NAS TRANSPORT + ******************************************************/ +#define OGS_NAS_UL_NAS_TRANSPORT_OLD_PDU_SESSION_ID_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_UL_NAS_TRANSPORT_REQUEST_TYPE_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_UL_NAS_TRANSPORT_S_NSSAI_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_UL_NAS_TRANSPORT_DNN_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_UL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT ((uint64_t)1<<4) +#define OGS_NAS_UL_NAS_TRANSPORT_MA_PDU_SESSION_INFORMATION_PRESENT ((uint64_t)1<<5) +#define OGS_NAS_UL_NAS_TRANSPORT_RELEASE_ASSISTANCE_INDICATION_PRESENT ((uint64_t)1<<6) +#define OGS_NAS_UL_NAS_TRANSPORT_OLD_PDU_SESSION_ID_TYPE 0x59 +#define OGS_NAS_UL_NAS_TRANSPORT_REQUEST_TYPE_TYPE 0x8 +#define OGS_NAS_UL_NAS_TRANSPORT_S_NSSAI_TYPE 0x22 +#define OGS_NAS_UL_NAS_TRANSPORT_DNN_TYPE 0x25 +#define OGS_NAS_UL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE 0x24 +#define OGS_NAS_UL_NAS_TRANSPORT_MA_PDU_SESSION_INFORMATION_TYPE 0xA0 +#define OGS_NAS_UL_NAS_TRANSPORT_RELEASE_ASSISTANCE_INDICATION_TYPE 0xF0 + +typedef struct ogs_nas_ul_nas_transport_s { + /* Mandatory fields */ + ogs_nas_payload_container_type_t payload_container_type; + ogs_nas_payload_container_t payload_container; + ogs_nas_pdu_session_identity_2_t pdu_session_id; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_pdu_session_identity_2_t old_pdu_session_id; + ogs_nas_request_type_t request_type; + ogs_nas_s_nssai_t s_nssai; + ogs_nas_dnn_t dnn; + ogs_nas_additional_information_t additional_information; + ogs_nas_ma_pdu_session_information_t ma_pdu_session_information; + ogs_nas_release_assistance_indication_t release_assistance_indication; +} ogs_nas_ul_nas_transport_t; + + +/******************************************************* + * DL NAS TRANSPORT + ******************************************************/ +#define OGS_NAS_DL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_DL_NAS_TRANSPORT_5GMM_CAUSE_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_DL_NAS_TRANSPORT_BACK_OFF_TIMER_VALUE_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_DL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE 0x24 +#define OGS_NAS_DL_NAS_TRANSPORT_5GMM_CAUSE_TYPE 0x58 +#define OGS_NAS_DL_NAS_TRANSPORT_BACK_OFF_TIMER_VALUE_TYPE 0x37 + +typedef struct ogs_nas_dl_nas_transport_s { + /* Mandatory fields */ + ogs_nas_payload_container_type_t payload_container_type; + ogs_nas_payload_container_t payload_container; + ogs_nas_pdu_session_identity_2_t pdu_session_id; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_additional_information_t additional_information; + ogs_nas_5gmm_cause_t gmm_cause; + ogs_nas_gprs_timer_3_t back_off_timer_value; +} ogs_nas_dl_nas_transport_t; + + +/******************************************************* + * PDU SESSION ESTABLISHMENT REQUEST + ******************************************************/ +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_CIOT_SMALL_DATA_CONTAINER_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PAYLOAD_CONTAINER_TYPE_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PAYLOAD_CONTAINER_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PDU_SESSION_STATUS_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_RELEASE_ASSISTANCE_INDICATION_PRESENT ((uint64_t)1<<4) +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_UPLINK_DATA_STATUS_PRESENT ((uint64_t)1<<5) +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT ((uint64_t)1<<6) +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_ADDITIONAL_INFORMATION_PRESENT ((uint64_t)1<<7) +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_CIOT_SMALL_DATA_CONTAINER_TYPE 0x6F +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PAYLOAD_CONTAINER_TYPE_TYPE 0x80 +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PAYLOAD_CONTAINER_TYPE 0x7B +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_PDU_SESSION_STATUS_TYPE 0x50 +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_RELEASE_ASSISTANCE_INDICATION_TYPE 0xF0 +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_UPLINK_DATA_STATUS_TYPE 0x40 +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_NAS_MESSAGE_CONTAINER_TYPE 0x71 +#define OGS_NAS_PDU_SESSION_ESTABLISHMENT_REQUEST_ADDITIONAL_INFORMATION_TYPE 0x24 + +typedef struct ogs_nas_pdu_session_establishment_request_s { + /* Mandatory fields */ + ogs_nas_control_plane_service_type_t control_plane_service_type; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_ciot_small_data_container_t ciot_small_data_container; + ogs_nas_payload_container_type_t payload_container_type; + ogs_nas_payload_container_t payload_container; + ogs_nas_pdu_session_identity_2_t pdu_session_id; + ogs_nas_pdu_session_status_t pdu_session_status; + ogs_nas_release_assistance_indication_t release_assistance_indication; + ogs_nas_uplink_data_status_t uplink_data_status; + ogs_nas_message_container_t nas_message_container; + ogs_nas_additional_information_t additional_information; +} ogs_nas_pdu_session_establishment_request_t; + + +/******************************************************* + * PDU SESSION ESTABLISHMENT ACCEPT + ******************************************************/ + +typedef struct ogs_nas_pdu_session_establishment_accept_s { + /* Mandatory fields */ + ogs_nas_s_nssai_t s_nssai; + ogs_nas_eap_message_t eap_message; +} ogs_nas_pdu_session_establishment_accept_t; + + +/******************************************************* + * PDU SESSION ESTABLISHMENT REJECT + ******************************************************/ + +typedef struct ogs_nas_pdu_session_establishment_reject_s { + /* Mandatory fields */ + ogs_nas_s_nssai_t s_nssai; + ogs_nas_eap_message_t eap_message; +} ogs_nas_pdu_session_establishment_reject_t; + + +/******************************************************* + * PDU SESSION AUTHENTICATION COMMAND + ******************************************************/ + +typedef struct ogs_nas_pdu_session_authentication_command_s { + /* Mandatory fields */ + ogs_nas_s_nssai_t s_nssai; + ogs_nas_eap_message_t eap_message; +} ogs_nas_pdu_session_authentication_command_t; + + +/******************************************************* + * PDU SESSION AUTHENTICATION COMPLETE + ******************************************************/ +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_PDU_SESSION_TYPE_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_SSC_MODE_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_5GSM_CAPABILITY_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_ALWAYS_ON_PDU_SESSION_REQUESTED_PRESENT ((uint64_t)1<<4) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_SM_PDU_DN_REQUEST_CONTAINER_PRESENT ((uint64_t)1<<5) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT ((uint64_t)1<<6) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_HEADER_COMPRESSION_CONFIGURATION_PRESENT ((uint64_t)1<<7) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_DS_TT_ETHERNET_PORT_MAC_ADDRESS_PRESENT ((uint64_t)1<<8) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_UE_DS_TT_RESIDENCE_TIME_PRESENT ((uint64_t)1<<9) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT ((uint64_t)1<<10) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_PDU_SESSION_TYPE_TYPE 0x90 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_SSC_MODE_TYPE 0xA0 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_5GSM_CAPABILITY_TYPE 0x28 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_TYPE 0x55 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_ALWAYS_ON_PDU_SESSION_REQUESTED_TYPE 0xB0 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_SM_PDU_DN_REQUEST_CONTAINER_TYPE 0x39 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE 0x7B +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_HEADER_COMPRESSION_CONFIGURATION_TYPE 0x66 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_DS_TT_ETHERNET_PORT_MAC_ADDRESS_TYPE 0x6E +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_UE_DS_TT_RESIDENCE_TIME_TYPE 0x6F +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_COMPLETE_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE 0x7C + +typedef struct ogs_nas_pdu_session_authentication_complete_s { + /* Mandatory fields */ + ogs_nas_integrity_protection_maximum_data_rate_t integrity_protection_maximum_data_rate; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_pdu_session_type_t pdu_session_type; + ogs_nas_ssc_mode_t ssc_mode; + ogs_nas_5gsm_capability_t gsm_capability; + ogs_nas_maximum_number_of_supported_packet_filters_t maximum_number_of_supported_packet_filters; + ogs_nas_always_on_pdu_session_requested_t always_on_pdu_session_requested; + ogs_nas_sm_pdu_dn_request_container_t sm_pdu_dn_request_container; + ogs_nas_extended_protocol_configuration_options_t extended_protocol_configuration_options; + ogs_nas_header_compression_configuration_t header_compression_configuration; + ogs_nas_ds_tt_ethernet_port_mac_address_t ds_tt_ethernet_port_mac_address; + ogs_nas_ue_ds_tt_residence_time_t ue_ds_tt_residence_time; + ogs_nas_port_management_information_container_t port_management_information_container; +} ogs_nas_pdu_session_authentication_complete_t; + + +/******************************************************* + * PDU SESSION AUTHENTICATION RESULT + ******************************************************/ +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_5GSM_CAUSE_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_PDU_ADDRESS_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_RQ_TIMER_VALUE_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_S_NSSAI_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_ALWAYS_ON_PDU_SESSION_INDICATION_PRESENT ((uint64_t)1<<4) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_MAPPED_EPS_BEARER_CONTEXTS_PRESENT ((uint64_t)1<<5) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_EAP_MESSAGE_PRESENT ((uint64_t)1<<6) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_PRESENT ((uint64_t)1<<7) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT ((uint64_t)1<<8) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_DNN_PRESENT ((uint64_t)1<<9) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_5GSM_NETWORK_FEATURE_SUPPORT_PRESENT ((uint64_t)1<<10) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_SERVING_PLMN_RATE_CONTROL_PRESENT ((uint64_t)1<<11) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_ATSSS_CONTAINER_PRESENT ((uint64_t)1<<12) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_CONTROL_PLANE_ONLY_INDICATION_PRESENT ((uint64_t)1<<13) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_HEADER_COMPRESSION_CONFIGURATION_PRESENT ((uint64_t)1<<14) +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_5GSM_CAUSE_TYPE 0x59 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_PDU_ADDRESS_TYPE 0x29 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_RQ_TIMER_VALUE_TYPE 0x56 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_S_NSSAI_TYPE 0x22 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_ALWAYS_ON_PDU_SESSION_INDICATION_TYPE 0x80 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_MAPPED_EPS_BEARER_CONTEXTS_TYPE 0x75 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_EAP_MESSAGE_TYPE 0x78 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_TYPE 0x79 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE 0x7B +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_DNN_TYPE 0x25 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_5GSM_NETWORK_FEATURE_SUPPORT_TYPE 0x17 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_SERVING_PLMN_RATE_CONTROL_TYPE 0x18 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_ATSSS_CONTAINER_TYPE 0x77 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_CONTROL_PLANE_ONLY_INDICATION_TYPE 0xC0 +#define OGS_NAS_PDU_SESSION_AUTHENTICATION_RESULT_HEADER_COMPRESSION_CONFIGURATION_TYPE 0x66 + +typedef struct ogs_nas_pdu_session_authentication_result_s { + /* Mandatory fields */ + ogs_nas_pdu_session_type_t selected_pdu_session_type; + ogs_nas_qos_rules_t authorized_qos_rules; + ogs_nas_session_ambr_t session_ambr; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_5gsm_cause_t gsm_cause; + ogs_nas_pdu_address_t pdu_address; + ogs_nas_gprs_timer_t rq_timer_value; + ogs_nas_s_nssai_t s_nssai; + ogs_nas_always_on_pdu_session_indication_t always_on_pdu_session_indication; + ogs_nas_mapped_eps_bearer_contexts_t mapped_eps_bearer_contexts; + ogs_nas_eap_message_t eap_message; + ogs_nas_qos_flow_descriptions_t authorized_qos_flow_descriptions; + ogs_nas_extended_protocol_configuration_options_t extended_protocol_configuration_options; + ogs_nas_dnn_t dnn; + ogs_nas_5gsm_network_feature_support_t gsm_network_feature_support; + ogs_nas_serving_plmn_rate_control_t serving_plmn_rate_control; + ogs_nas_atsss_container_t atsss_container; + ogs_nas_control_plane_only_indication_t control_plane_only_indication; + ogs_nas_header_compression_configuration_t header_compression_configuration; +} ogs_nas_pdu_session_authentication_result_t; + + +/******************************************************* + * PDU SESSION MODIFICATION REQUEST + ******************************************************/ +#define OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_BACK_OFF_TIMER_VALUE_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_ALLOWED_SSC_MODE_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_EAP_MESSAGE_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_RE_ATTEMPT_INDICATOR_PRESENT ((uint64_t)1<<4) +#define OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_PRESENT ((uint64_t)1<<5) +#define OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_BACK_OFF_TIMER_VALUE_TYPE 0x37 +#define OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_ALLOWED_SSC_MODE_TYPE 0xF0 +#define OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_EAP_MESSAGE_TYPE 0x78 +#define OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE 0x7B +#define OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_RE_ATTEMPT_INDICATOR_TYPE 0x1D +#define OGS_NAS_PDU_SESSION_MODIFICATION_REQUEST_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_TYPE 0x61 + +typedef struct ogs_nas_pdu_session_modification_request_s { + /* Mandatory fields */ + ogs_nas_5gsm_cause_t gsm_cause; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_gprs_timer_3_t back_off_timer_value; + ogs_nas_allowed_ssc_mode_t allowed_ssc_mode; + ogs_nas_eap_message_t eap_message; + ogs_nas_extended_protocol_configuration_options_t extended_protocol_configuration_options; + ogs_nas_re_attempt_indicator_t re_attempt_indicator; + ogs_nas_5gsm_congestion_re_attempt_indicator_t gsm_congestion_re_attempt_indicator; +} ogs_nas_pdu_session_modification_request_t; + + +/******************************************************* + * PDU SESSION MODIFICATION REJECT + ******************************************************/ +#define OGS_NAS_PDU_SESSION_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_PDU_SESSION_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE 0x7B + +typedef struct ogs_nas_pdu_session_modification_reject_s { + /* Mandatory fields */ + ogs_nas_eap_message_t eap_message; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_extended_protocol_configuration_options_t extended_protocol_configuration_options; +} ogs_nas_pdu_session_modification_reject_t; + + +/******************************************************* + * PDU SESSION MODIFICATION COMMAND + ******************************************************/ +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE 0x7B + +typedef struct ogs_nas_pdu_session_modification_command_s { + /* Mandatory fields */ + ogs_nas_eap_message_t eap_message; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_extended_protocol_configuration_options_t extended_protocol_configuration_options; +} ogs_nas_pdu_session_modification_command_t; + + +/******************************************************* + * PDU SESSION MODIFICATION COMPLETE + ******************************************************/ +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMPLETE_EAP_MESSAGE_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMPLETE_EAP_MESSAGE_TYPE 0x78 +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE 0x7B + +typedef struct ogs_nas_pdu_session_modification_complete_s { + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_eap_message_t eap_message; + ogs_nas_extended_protocol_configuration_options_t extended_protocol_configuration_options; +} ogs_nas_pdu_session_modification_complete_t; + + +/******************************************************* + * PDU SESSION MODIFICATION COMMAND REJECT + ******************************************************/ +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_5GSM_CAPABILITY_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_5GSM_CAUSE_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_ALWAYS_ON_PDU_SESSION_REQUESTED_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_INTEGRITY_PROTECTION_MAXIMUM_DATA_RATE_PRESENT ((uint64_t)1<<4) +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_REQUESTED_QOS_RULES_PRESENT ((uint64_t)1<<5) +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_REQUESTED_QOS_FLOW_DESCRIPTIONS_PRESENT ((uint64_t)1<<6) +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_MAPPED_EPS_BEARER_CONTEXTS_PRESENT ((uint64_t)1<<7) +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT ((uint64_t)1<<8) +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT ((uint64_t)1<<9) +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_HEADER_COMPRESSION_CONFIGURATION_PRESENT ((uint64_t)1<<10) +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_5GSM_CAPABILITY_TYPE 0x28 +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_5GSM_CAUSE_TYPE 0x59 +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_TYPE 0x55 +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_ALWAYS_ON_PDU_SESSION_REQUESTED_TYPE 0xB0 +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_INTEGRITY_PROTECTION_MAXIMUM_DATA_RATE_TYPE 0x13 +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_REQUESTED_QOS_RULES_TYPE 0x7A +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_REQUESTED_QOS_FLOW_DESCRIPTIONS_TYPE 0x79 +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_MAPPED_EPS_BEARER_CONTEXTS_TYPE 0x75 +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE 0x7B +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE 0x7C +#define OGS_NAS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_HEADER_COMPRESSION_CONFIGURATION_TYPE 0x66 + +typedef struct ogs_nas_pdu_session_modification_command_reject_s { + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_5gsm_capability_t gsm_capability; + ogs_nas_5gsm_cause_t gsm_cause; + ogs_nas_maximum_number_of_supported_packet_filters_t maximum_number_of_supported_packet_filters; + ogs_nas_always_on_pdu_session_requested_t always_on_pdu_session_requested; + ogs_nas_integrity_protection_maximum_data_rate_t integrity_protection_maximum_data_rate; + ogs_nas_qos_rules_t requested_qos_rules; + ogs_nas_qos_flow_descriptions_t requested_qos_flow_descriptions; + ogs_nas_mapped_eps_bearer_contexts_t mapped_eps_bearer_contexts; + ogs_nas_extended_protocol_configuration_options_t extended_protocol_configuration_options; + ogs_nas_port_management_information_container_t port_management_information_container; + ogs_nas_header_compression_configuration_t header_compression_configuration; +} ogs_nas_pdu_session_modification_command_reject_t; + + +/******************************************************* + * PDU SESSION RELEASE REQUEST + ******************************************************/ +#define OGS_NAS_PDU_SESSION_RELEASE_REQUEST_BACK_OFF_TIMER_VALUE_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_PDU_SESSION_RELEASE_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_PDU_SESSION_RELEASE_REQUEST_RE_ATTEMPT_INDICATOR_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_PDU_SESSION_RELEASE_REQUEST_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_PDU_SESSION_RELEASE_REQUEST_BACK_OFF_TIMER_VALUE_TYPE 0x37 +#define OGS_NAS_PDU_SESSION_RELEASE_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE 0x7B +#define OGS_NAS_PDU_SESSION_RELEASE_REQUEST_RE_ATTEMPT_INDICATOR_TYPE 0x1D +#define OGS_NAS_PDU_SESSION_RELEASE_REQUEST_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_TYPE 0x61 + +typedef struct ogs_nas_pdu_session_release_request_s { + /* Mandatory fields */ + ogs_nas_5gsm_cause_t gsm_cause; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_gprs_timer_3_t back_off_timer_value; + ogs_nas_extended_protocol_configuration_options_t extended_protocol_configuration_options; + ogs_nas_re_attempt_indicator_t re_attempt_indicator; + ogs_nas_5gsm_congestion_re_attempt_indicator_t gsm_congestion_re_attempt_indicator; +} ogs_nas_pdu_session_release_request_t; + + +/******************************************************* + * PDU SESSION RELEASE REJECT + ******************************************************/ +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_5GSM_CAUSE_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_SESSION_AMBR_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_RQ_TIMER_VALUE_PRESENT ((uint64_t)1<<2) +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_ALWAYS_ON_PDU_SESSION_INDICATION_PRESENT ((uint64_t)1<<3) +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_AUTHORIZED_QOS_RULES_PRESENT ((uint64_t)1<<4) +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_MAPPED_EPS_BEARER_CONTEXTS_PRESENT ((uint64_t)1<<5) +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_PRESENT ((uint64_t)1<<6) +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT ((uint64_t)1<<7) +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_ATSSS_CONTAINER_PRESENT ((uint64_t)1<<8) +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_HEADER_COMPRESSION_CONFIGURATION_PRESENT ((uint64_t)1<<9) +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT ((uint64_t)1<<10) +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_SERVING_PLMN_RATE_CONTROL_PRESENT ((uint64_t)1<<11) +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_5GSM_CAUSE_TYPE 0x59 +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_SESSION_AMBR_TYPE 0x2A +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_RQ_TIMER_VALUE_TYPE 0x56 +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_ALWAYS_ON_PDU_SESSION_INDICATION_TYPE 0x80 +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_AUTHORIZED_QOS_RULES_TYPE 0x7A +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_MAPPED_EPS_BEARER_CONTEXTS_TYPE 0x75 +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_TYPE 0x79 +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE 0x7B +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_ATSSS_CONTAINER_TYPE 0x77 +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_HEADER_COMPRESSION_CONFIGURATION_TYPE 0x66 +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE 0x7C +#define OGS_NAS_PDU_SESSION_RELEASE_REJECT_SERVING_PLMN_RATE_CONTROL_TYPE 0x1E + +typedef struct ogs_nas_pdu_session_release_reject_s { + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_5gsm_cause_t gsm_cause; + ogs_nas_session_ambr_t session_ambr; + ogs_nas_gprs_timer_t rq_timer_value; + ogs_nas_always_on_pdu_session_indication_t always_on_pdu_session_indication; + ogs_nas_qos_rules_t authorized_qos_rules; + ogs_nas_mapped_eps_bearer_contexts_t mapped_eps_bearer_contexts; + ogs_nas_qos_flow_descriptions_t authorized_qos_flow_descriptions; + ogs_nas_extended_protocol_configuration_options_t extended_protocol_configuration_options; + ogs_nas_atsss_container_t atsss_container; + ogs_nas_header_compression_configuration_t header_compression_configuration; + ogs_nas_port_management_information_container_t port_management_information_container; + ogs_nas_serving_plmn_rate_control_t serving_plmn_rate_control; +} ogs_nas_pdu_session_release_reject_t; + + +/******************************************************* + * PDU SESSION RELEASE COMMAND + ******************************************************/ +#define OGS_NAS_PDU_SESSION_RELEASE_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_PDU_SESSION_RELEASE_COMMAND_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_PDU_SESSION_RELEASE_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE 0x7B +#define OGS_NAS_PDU_SESSION_RELEASE_COMMAND_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE 0x7C + +typedef struct ogs_nas_pdu_session_release_command_s { + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_extended_protocol_configuration_options_t extended_protocol_configuration_options; + ogs_nas_port_management_information_container_t port_management_information_container; +} ogs_nas_pdu_session_release_command_t; + + +/******************************************************* + * PDU SESSION RELEASE COMPLETE + ******************************************************/ +#define OGS_NAS_PDU_SESSION_RELEASE_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_PDU_SESSION_RELEASE_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE 0x7B + +typedef struct ogs_nas_pdu_session_release_complete_s { + /* Mandatory fields */ + ogs_nas_5gsm_cause_t gsm_cause; + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_extended_protocol_configuration_options_t extended_protocol_configuration_options; +} ogs_nas_pdu_session_release_complete_t; + + +/******************************************************* + * 5GSM STATUS + ******************************************************/ +#define OGS_NAS_5GSM_STATUS_5GSM_CAUSE_PRESENT ((uint64_t)1<<0) +#define OGS_NAS_5GSM_STATUS_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT ((uint64_t)1<<1) +#define OGS_NAS_5GSM_STATUS_5GSM_CAUSE_TYPE 0x59 +#define OGS_NAS_5GSM_STATUS_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE 0x7B + +typedef struct ogs_nas_5gsm_status_s { + + /* Optional fields */ + uint64_t presencemask; + ogs_nas_5gsm_cause_t gsm_cause; + ogs_nas_extended_protocol_configuration_options_t extended_protocol_configuration_options; +} ogs_nas_5gsm_status_t; + + +typedef struct ogs_nas_5gmm_message_s { + ogs_nas_5gmm_header_t h; + union { + ogs_nas_registration_request_t registration_request; + ogs_nas_registration_accept_t registration_accept; + ogs_nas_registration_complete_t registration_complete; + ogs_nas_registration_reject_t registration_reject; + ogs_nas_deregistration_request_from_ue_t deregistration_request_from_ue; + ogs_nas_deregistration_request_to_ue_t deregistration_request_to_ue; + ogs_nas_service_request_t service_request; + ogs_nas_service_reject_t service_reject; + ogs_nas_service_accept_t service_accept; + ogs_nas_configuration_update_command_t configuration_update_command; + ogs_nas_configuration_update_complete_t configuration_update_complete; + ogs_nas_authentication_request_t authentication_request; + ogs_nas_authentication_response_t authentication_response; + ogs_nas_authentication_reject_t authentication_reject; + ogs_nas_authentication_failure_t authentication_failure; + ogs_nas_authentication_result_t authentication_result; + ogs_nas_identity_request_t identity_request; + ogs_nas_identity_response_t identity_response; + ogs_nas_security_mode_command_t security_mode_command; + ogs_nas_security_mode_complete_t security_mode_complete; + ogs_nas_security_mode_reject_t security_mode_reject; + ogs_nas_5gmm_status_t gmm_status; + ogs_nas_notification_t notification; + ogs_nas_notification_response_t notification_response; + ogs_nas_ul_nas_transport_t ul_nas_transport; + ogs_nas_dl_nas_transport_t dl_nas_transport; + }; +} ogs_nas_5gmm_message_t; + +typedef struct ogs_nas_5gsm_message_s { + ogs_nas_5gsm_header_t h; + union { + ogs_nas_pdu_session_establishment_request_t pdu_session_establishment_request; + ogs_nas_pdu_session_establishment_accept_t pdu_session_establishment_accept; + ogs_nas_pdu_session_establishment_reject_t pdu_session_establishment_reject; + ogs_nas_pdu_session_authentication_command_t pdu_session_authentication_command; + ogs_nas_pdu_session_authentication_complete_t pdu_session_authentication_complete; + ogs_nas_pdu_session_authentication_result_t pdu_session_authentication_result; + ogs_nas_pdu_session_modification_request_t pdu_session_modification_request; + ogs_nas_pdu_session_modification_reject_t pdu_session_modification_reject; + ogs_nas_pdu_session_modification_command_t pdu_session_modification_command; + ogs_nas_pdu_session_modification_complete_t pdu_session_modification_complete; + ogs_nas_pdu_session_modification_command_reject_t pdu_session_modification_command_reject; + ogs_nas_pdu_session_release_request_t pdu_session_release_request; + ogs_nas_pdu_session_release_reject_t pdu_session_release_reject; + ogs_nas_pdu_session_release_command_t pdu_session_release_command; + ogs_nas_pdu_session_release_complete_t pdu_session_release_complete; + ogs_nas_5gsm_status_t gsm_status; + }; +} ogs_nas_5gsm_message_t; + +typedef struct ogs_nas_message_s { + ogs_nas_security_header_t h; + union { + ogs_nas_5gmm_message_t gmm; + ogs_nas_5gsm_message_t gsm; + }; +} ogs_nas_message_t; + +ogs_pkbuf_t *ogs_nas_5gmm_encode(ogs_nas_message_t *message); +ogs_pkbuf_t *ogs_nas_5gsm_encode(ogs_nas_message_t *message); +int ogs_nas_5gmm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_5gsm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +ogs_pkbuf_t *ogs_nas_plain_encode(ogs_nas_message_t *message); + +#ifdef __cplusplus +} +#endif + +#endif /* OGS_NAS_5GS_MESSAGE_H */ diff --git a/lib/nas/5gs/ogs-nas-5gs.h b/lib/nas/5gs/ogs-nas-5gs.h new file mode 100644 index 0000000000..ecc6b1bab5 --- /dev/null +++ b/lib/nas/5gs/ogs-nas-5gs.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2019 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 . + */ + +#ifndef OGS_NAS_5GS_H +#define OGS_NAS_5GS_H + +#include "ogs-nas-common.h" + +#define OGS_NAS_INSIDE + +#include "nas/5gs/types.h" +#include "nas/5gs/ies.h" +#include "nas/5gs/message.h" + +#undef OGS_NAS_INSIDE + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* OGS_NAS_5GS_H */ diff --git a/lib/nas/5gs/support/24501-g41.docx b/lib/nas/5gs/support/24501-g41.docx new file mode 100644 index 0000000000..e02a5159c3 Binary files /dev/null and b/lib/nas/5gs/support/24501-g41.docx differ diff --git a/lib/nas/5gs/support/README.md b/lib/nas/5gs/support/README.md new file mode 100644 index 0000000000..1a34152a97 --- /dev/null +++ b/lib/nas/5gs/support/README.md @@ -0,0 +1,16 @@ + +* Install python-pip +user@host ~/Documents/git/open5gs/lib/gtp/support$ \ + sudo apt-get install python-pip + +* Install python-docx +user@host ~/Documents/git/open5gs/lib/gtp/support$ \ + sudo pip install python-docx + +* Change the format of standard specification + from 24301-d80.doc to 24301-d80.docx + using Microsoft Office 2007+ + +* Generate Message support files +user@host ~/Documents/git/open5gs/lib/s1ap/support$ \ + python nas-message.py -f 24501-g41.docx -o .. diff --git a/lib/nas/5gs/support/cache/nas-msg-100.py b/lib/nas/5gs/support/cache/nas-msg-100.py new file mode 100644 index 0000000000..a8a88b0f3e --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-100.py @@ -0,0 +1,3 @@ +ies = [] +ies.append({ "iei" : "", "value" : "5GMM cause", "type" : "5GMM cause", "reference" : "9.11.3.2", "presence" : "M", "format" : "V", "length" : "1"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-101.py b/lib/nas/5gs/support/cache/nas-msg-101.py new file mode 100644 index 0000000000..af587c8f43 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-101.py @@ -0,0 +1,3 @@ +ies = [] +ies.append({ "iei" : "", "value" : "Access type", "type" : "Access type", "reference" : "9.11.2.1A", "presence" : "M", "format" : "V", "length" : "1/2"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-102.py b/lib/nas/5gs/support/cache/nas-msg-102.py new file mode 100644 index 0000000000..bc94d9b415 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-102.py @@ -0,0 +1,3 @@ +ies = [] +ies.append({ "iei" : "50", "value" : "PDU session status", "type" : "PDU session status", "reference" : "9.11.3.44", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-103.py b/lib/nas/5gs/support/cache/nas-msg-103.py new file mode 100644 index 0000000000..8f0df721d7 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-103.py @@ -0,0 +1,12 @@ +ies = [] +ies.append({ "iei" : "", "value" : "Payload container type", "type" : "Payload container type", "reference" : "9.11.3.40", "presence" : "M", "format" : "V", "length" : "1/2"}) +ies.append({ "iei" : "", "value" : "Payload container", "type" : "Payload container", "reference" : "9.11.3.39", "presence" : "M", "format" : "LV-E", "length" : "3-65537"}) +ies.append({ "iei" : "12", "value" : "PDU session ID", "type" : "PDU session identity 2", "reference" : "9.11.3.41", "presence" : "C", "format" : "TV", "length" : "2"}) +ies.append({ "iei" : "59", "value" : "Old PDU session ID", "type" : "PDU session identity 2", "reference" : "9.11.3.41", "presence" : "O", "format" : "TV", "length" : "2"}) +ies.append({ "iei" : "8", "value" : "Request type", "type" : "Request type", "reference" : "9.11.3.47", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "22", "value" : "S-NSSAI", "type" : "S-NSSAI", "reference" : "9.11.2.8", "presence" : "O", "format" : "TLV", "length" : "3-10"}) +ies.append({ "iei" : "25", "value" : "DNN", "type" : "DNN", "reference" : "9.11.2.1B", "presence" : "O", "format" : "TLV", "length" : "3-102"}) +ies.append({ "iei" : "24", "value" : "Additional information", "type" : "Additional information", "reference" : "9.11.2.1", "presence" : "O", "format" : "TLV", "length" : "3-n"}) +ies.append({ "iei" : "A-", "value" : "MA PDU session information", "type" : "MA PDU session information", "reference" : "9.11.3.31A", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "F-", "value" : "Release assistance indication", "type" : "Release assistance indication", "reference" : "9.11.3.46A", "presence" : "O", "format" : "TV", "length" : "1"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-104.py b/lib/nas/5gs/support/cache/nas-msg-104.py new file mode 100644 index 0000000000..b061ecba82 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-104.py @@ -0,0 +1,8 @@ +ies = [] +ies.append({ "iei" : "", "value" : "Payload container type", "type" : "Payload container type", "reference" : "9.11.3.40", "presence" : "M", "format" : "V", "length" : "1/2"}) +ies.append({ "iei" : "", "value" : "Payload container", "type" : "Payload container", "reference" : "9.11.3.39", "presence" : "M", "format" : "LV-E", "length" : "3-65537"}) +ies.append({ "iei" : "12", "value" : "PDU session ID", "type" : "PDU session identity 2", "reference" : "9.11.3.41", "presence" : "C", "format" : "TV", "length" : "2"}) +ies.append({ "iei" : "24", "value" : "Additional information", "type" : "Additional information", "reference" : "9.11.2.1", "presence" : "O", "format" : "TLV", "length" : "3-n"}) +ies.append({ "iei" : "58", "value" : "5GMM cause", "type" : "5GMM cause", "reference" : "9.11.3.2", "presence" : "O", "format" : "TV", "length" : "2"}) +ies.append({ "iei" : "37", "value" : "Back-off timer value", "type" : "GPRS timer 3", "reference" : "9.11.2.5", "presence" : "O", "format" : "TLV", "length" : "3"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-193.py b/lib/nas/5gs/support/cache/nas-msg-193.py new file mode 100644 index 0000000000..452ffb7778 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-193.py @@ -0,0 +1,12 @@ +ies = [] +ies.append({ "iei" : "", "value" : "Control plane service type", "type" : "Control plane service type", "reference" : "9.11.3.18D", "presence" : "M", "format" : "V", "length" : "1/2"}) +ies.append({ "iei" : "6F", "value" : "CIoT small data container", "type" : "CIoT small data container", "reference" : "9.11.3.18B", "presence" : "O", "format" : "TLV", "length" : "4-257"}) +ies.append({ "iei" : "8-", "value" : "Payload container type", "type" : "Payload container type", "reference" : "9.11.3.40", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "7B", "value" : "Payload container", "type" : "Payload container", "reference" : "9.11.3.39", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +ies.append({ "iei" : "12", "value" : "PDU session ID", "type" : "PDU session identity 2", "reference" : "9.11.3.41", "presence" : "C", "format" : "TV", "length" : "2"}) +ies.append({ "iei" : "50", "value" : "PDU session status", "type" : "PDU session status", "reference" : "9.11.3.44", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +ies.append({ "iei" : "F-", "value" : "Release assistance indication", "type" : "Release assistance indication", "reference" : "9.11.3.46A", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "40", "value" : "Uplink data status", "type" : "Uplink data status", "reference" : "9.11.3.57", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +ies.append({ "iei" : "71", "value" : "NAS message container", "type" : "message container", "reference" : "9.11.3.33", "presence" : "O", "format" : "TLV-E", "length" : "4-n"}) +ies.append({ "iei" : "24", "value" : "Additional information", "type" : "Additional information", "reference" : "9.11.2.1", "presence" : "O", "format" : "TLV", "length" : "3-n"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-194.py b/lib/nas/5gs/support/cache/nas-msg-194.py new file mode 100644 index 0000000000..80034e7819 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-194.py @@ -0,0 +1,4 @@ +ies = [] +ies.append({ "iei" : "", "value" : "S-NSSAI", "type" : "S-NSSAI", "reference" : "9.11.2.8", "presence" : "M", "format" : "LV", "length" : "2-5"}) +ies.append({ "iei" : "", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "M", "format" : "LV-E", "length" : "6-1502"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-195.py b/lib/nas/5gs/support/cache/nas-msg-195.py new file mode 100644 index 0000000000..80034e7819 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-195.py @@ -0,0 +1,4 @@ +ies = [] +ies.append({ "iei" : "", "value" : "S-NSSAI", "type" : "S-NSSAI", "reference" : "9.11.2.8", "presence" : "M", "format" : "LV", "length" : "2-5"}) +ies.append({ "iei" : "", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "M", "format" : "LV-E", "length" : "6-1502"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-197.py b/lib/nas/5gs/support/cache/nas-msg-197.py new file mode 100644 index 0000000000..80034e7819 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-197.py @@ -0,0 +1,4 @@ +ies = [] +ies.append({ "iei" : "", "value" : "S-NSSAI", "type" : "S-NSSAI", "reference" : "9.11.2.8", "presence" : "M", "format" : "LV", "length" : "2-5"}) +ies.append({ "iei" : "", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "M", "format" : "LV-E", "length" : "6-1502"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-198.py b/lib/nas/5gs/support/cache/nas-msg-198.py new file mode 100644 index 0000000000..80bef0f875 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-198.py @@ -0,0 +1,14 @@ +ies = [] +ies.append({ "iei" : "", "value" : "Integrity protection maximum data rate", "type" : "Integrity protection maximum data rate", "reference" : "9.11.4.7", "presence" : "M", "format" : "V", "length" : "2"}) +ies.append({ "iei" : "9-", "value" : "PDU session type", "type" : "PDU session type", "reference" : "9.11.4.11", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "A-", "value" : "SSC mode", "type" : "SSC mode", "reference" : "9.11.4.16", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "28", "value" : "5GSM capability", "type" : "5GSM capability", "reference" : "9.11.4.1", "presence" : "O", "format" : "TLV", "length" : "3-15"}) +ies.append({ "iei" : "55", "value" : "Maximum number of supported packet filters", "type" : "Maximum number of supported packet filters", "reference" : "9.11.4.9", "presence" : "O", "format" : "TV", "length" : "3"}) +ies.append({ "iei" : "B-", "value" : "Always-on PDU session requested", "type" : "Always-on PDU session requested", "reference" : "9.11.4.4", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "39", "value" : "SM PDU DN request container", "type" : "SM PDU DN request container", "reference" : "9.11.4.15", "presence" : "O", "format" : "TLV", "length" : "3-255"}) +ies.append({ "iei" : "7B", "value" : "Extended protocol configuration options", "type" : "Extended protocol configuration options", "reference" : "9.11.4.6", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +ies.append({ "iei" : "66", "value" : "Header compression configuration", "type" : "Header compression configuration", "reference" : "9.11.4.24", "presence" : "O", "format" : "TLV", "length" : "5-257"}) +ies.append({ "iei" : "6E", "value" : "DS-TT Ethernet port MAC address", "type" : "DS-TT Ethernet port MAC address", "reference" : "9.11.4.25", "presence" : "O", "format" : "TLV", "length" : "8"}) +ies.append({ "iei" : "6F", "value" : "UE-DS-TT residence time", "type" : "UE-DS-TT residence time", "reference" : "9.11.4.26", "presence" : "O", "format" : "TLV", "length" : "10"}) +ies.append({ "iei" : "7C", "value" : "Port management information container", "type" : "Port management information container", "reference" : "9.11.4.27", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-199.py b/lib/nas/5gs/support/cache/nas-msg-199.py new file mode 100644 index 0000000000..b4ec01d615 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-199.py @@ -0,0 +1,20 @@ +ies = [] +ies.append({ "iei" : "", "value" : "Selected PDU session type", "type" : "PDU session type", "reference" : "9.11.4.11", "presence" : "M", "format" : "V", "length" : "1/2"}) +ies.append({ "iei" : "", "value" : "Authorized QoS rules", "type" : "QoS rules", "reference" : "9.11.4.13", "presence" : "M", "format" : "LV-E", "length" : "6-65538"}) +ies.append({ "iei" : "", "value" : "Session AMBR", "type" : "Session-AMBR", "reference" : "9.11.4.14", "presence" : "M", "format" : "LV", "length" : "7"}) +ies.append({ "iei" : "59", "value" : "5GSM cause", "type" : "5GSM cause", "reference" : "9.11.4.2", "presence" : "O", "format" : "TV", "length" : "2"}) +ies.append({ "iei" : "29", "value" : "PDU address", "type" : "PDU address", "reference" : "9.11.4.10", "presence" : "O", "format" : "TLV", "length" : "7, 11 or 15"}) +ies.append({ "iei" : "56", "value" : "RQ timer value", "type" : "GPRS timer", "reference" : "9.11.2.3", "presence" : "O", "format" : "TV", "length" : "2"}) +ies.append({ "iei" : "22", "value" : "S-NSSAI", "type" : "S-NSSAI", "reference" : "9.11.2.8", "presence" : "O", "format" : "TLV", "length" : "3-10"}) +ies.append({ "iei" : "8-", "value" : "Always-on PDU session indication", "type" : "Always-on PDU session indication", "reference" : "9.11.4.3", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "75", "value" : "Mapped EPS bearer contexts", "type" : "Mapped EPS bearer contexts", "reference" : "9.11.4.8", "presence" : "O", "format" : "TLV-E", "length" : "7-65538"}) +ies.append({ "iei" : "78", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "O", "format" : "TLV-E", "length" : "7-1503"}) +ies.append({ "iei" : "79", "value" : "Authorized QoS flow descriptions", "type" : "QoS flow descriptions", "reference" : "9.11.4.12", "presence" : "O", "format" : "TLV-E", "length" : "6-65538"}) +ies.append({ "iei" : "7B", "value" : "Extended protocol configuration options", "type" : "Extended protocol configuration options", "reference" : "9.11.4.6", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +ies.append({ "iei" : "25", "value" : "DNN", "type" : "DNN", "reference" : "9.11.2.1B", "presence" : "O", "format" : "TLV", "length" : "3-102"}) +ies.append({ "iei" : "17", "value" : "5GSM network feature support", "type" : "5GSM network feature support", "reference" : "9.11.4.18", "presence" : "O", "format" : "TLV", "length" : "3-15"}) +ies.append({ "iei" : "18", "value" : "Serving PLMN rate control", "type" : "Serving PLMN rate control", "reference" : "9.11.4.20", "presence" : "O", "format" : "TLV", "length" : "4"}) +ies.append({ "iei" : "77", "value" : "ATSSS container", "type" : "ATSSS container", "reference" : "9.11.4.22", "presence" : "O", "format" : "TLV-E", "length" : "3-65538"}) +ies.append({ "iei" : "C-", "value" : "Control plane only indication", "type" : "Control plane only indication", "reference" : "9.11.4.23", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "66", "value" : "Header compression configuration", "type" : "Header compression configuration", "reference" : "9.11.4.24", "presence" : "O", "format" : "TLV", "length" : "5-257"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-201.py b/lib/nas/5gs/support/cache/nas-msg-201.py new file mode 100644 index 0000000000..e3a62a38f5 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-201.py @@ -0,0 +1,9 @@ +ies = [] +ies.append({ "iei" : "", "value" : "5GSM cause", "type" : "5GSM cause", "reference" : "9.11.4.2", "presence" : "M", "format" : "V", "length" : "1"}) +ies.append({ "iei" : "37", "value" : "Back-off timer value", "type" : "GPRS timer 3", "reference" : "9.11.2.5", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "F-", "value" : "Allowed SSC mode", "type" : "Allowed SSC mode", "reference" : "9.11.4.5", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "78", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "O", "format" : "TLV-E", "length" : "7-1503"}) +ies.append({ "iei" : "7B", "value" : "Extended protocol configuration options", "type" : "Extended protocol configuration options", "reference" : "9.11.4.6", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +ies.append({ "iei" : "1D", "value" : "Re-attempt indicator", "type" : "Re-attempt indicator", "reference" : "9.11.4.17", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "61", "value" : "5GSM congestion re-attempt indicator", "type" : "5GSM congestion re-attempt indicator", "reference" : "9.11.4.21", "presence" : "O", "format" : "TLV", "length" : "3"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-202.py b/lib/nas/5gs/support/cache/nas-msg-202.py new file mode 100644 index 0000000000..1374b9c2ba --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-202.py @@ -0,0 +1,4 @@ +ies = [] +ies.append({ "iei" : "", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "M", "format" : "LV-E", "length" : "6-1502"}) +ies.append({ "iei" : "7B", "value" : "Extended protocol configuration options", "type" : "Extended protocol configuration options", "reference" : "9.11.4.6", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-203.py b/lib/nas/5gs/support/cache/nas-msg-203.py new file mode 100644 index 0000000000..1374b9c2ba --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-203.py @@ -0,0 +1,4 @@ +ies = [] +ies.append({ "iei" : "", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "M", "format" : "LV-E", "length" : "6-1502"}) +ies.append({ "iei" : "7B", "value" : "Extended protocol configuration options", "type" : "Extended protocol configuration options", "reference" : "9.11.4.6", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-204.py b/lib/nas/5gs/support/cache/nas-msg-204.py new file mode 100644 index 0000000000..45c5660344 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-204.py @@ -0,0 +1,4 @@ +ies = [] +ies.append({ "iei" : "78", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "O", "format" : "TLV-E", "length" : "7-1503"}) +ies.append({ "iei" : "7B", "value" : "Extended protocol configuration options", "type" : "Extended protocol configuration options", "reference" : "9.11.4.6", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-205.py b/lib/nas/5gs/support/cache/nas-msg-205.py new file mode 100644 index 0000000000..81241c2699 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-205.py @@ -0,0 +1,13 @@ +ies = [] +ies.append({ "iei" : "28", "value" : "5GSM capability", "type" : "5GSM capability", "reference" : "9.11.4.1", "presence" : "O", "format" : "TLV", "length" : "3-15"}) +ies.append({ "iei" : "59", "value" : "5GSM cause", "type" : "5GSM cause", "reference" : "9.11.4.2", "presence" : "O", "format" : "TV", "length" : "2"}) +ies.append({ "iei" : "55", "value" : "Maximum number of supported packet filters", "type" : "Maximum number of supported packet filters", "reference" : "9.11.4.9", "presence" : "O", "format" : "TV", "length" : "3"}) +ies.append({ "iei" : "B-", "value" : "Always-on PDU session requested", "type" : "Always-on PDU session requested", "reference" : "9.11.4.4", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "13", "value" : "Integrity protection maximum data rate", "type" : "Integrity protection maximum data rate", "reference" : "9.11.4.7", "presence" : "O", "format" : "TV", "length" : "3"}) +ies.append({ "iei" : "7A", "value" : "Requested QoS rules", "type" : "QoS rules", "reference" : "9.11.4.13", "presence" : "O", "format" : "TLV-E", "length" : "7-65538"}) +ies.append({ "iei" : "79", "value" : "Requested QoS flow descriptions", "type" : "QoS flow descriptions", "reference" : "9.11.4.12", "presence" : "O", "format" : "TLV-E", "length" : "6-65538"}) +ies.append({ "iei" : "75", "value" : "Mapped EPS bearer contexts", "type" : "Mapped EPS bearer contexts", "reference" : "9.11.4.8", "presence" : "O", "format" : "TLV-E", "length" : "7-65538"}) +ies.append({ "iei" : "7B", "value" : "Extended protocol configuration options", "type" : "Extended protocol configuration options", "reference" : "9.11.4.6", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +ies.append({ "iei" : "7C", "value" : "Port management information container", "type" : "Port management information container", "reference" : "9.11.4.27", "presence" : "O", "format" : "TLV-E", "length" : "3-65538"}) +ies.append({ "iei" : "66", "value" : "Header compression configuration", "type" : "Header compression configuration", "reference" : "9.11.4.24", "presence" : "O", "format" : "TLV", "length" : "5-257"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-209.py b/lib/nas/5gs/support/cache/nas-msg-209.py new file mode 100644 index 0000000000..42f75bd853 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-209.py @@ -0,0 +1,7 @@ +ies = [] +ies.append({ "iei" : "", "value" : "5GSM cause", "type" : "5GSM cause", "reference" : "9.11.4.2", "presence" : "M", "format" : "V", "length" : "1"}) +ies.append({ "iei" : "37", "value" : "Back-off timer value", "type" : "GPRS timer 3", "reference" : "9.11.2.5", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "7B", "value" : "Extended protocol configuration options", "type" : "Extended protocol configuration options", "reference" : "9.11.4.6", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +ies.append({ "iei" : "1D", "value" : "Re-attempt indicator", "type" : "Re-attempt indicator", "reference" : "9.11.4.17", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "61", "value" : "5GSM congestion re-attempt indicator", "type" : "5GSM congestion re-attempt indicator", "reference" : "9.11.4.21", "presence" : "O", "format" : "TLV", "length" : "3"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-210.py b/lib/nas/5gs/support/cache/nas-msg-210.py new file mode 100644 index 0000000000..4aaed74c77 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-210.py @@ -0,0 +1,14 @@ +ies = [] +ies.append({ "iei" : "59", "value" : "5GSM cause", "type" : "5GSM cause", "reference" : "9.11.4.2", "presence" : "O", "format" : "TV", "length" : "2"}) +ies.append({ "iei" : "2A", "value" : "Session AMBR", "type" : "Session-AMBR", "reference" : "9.11.4.14", "presence" : "O", "format" : "TLV", "length" : "8"}) +ies.append({ "iei" : "56", "value" : "RQ timer value", "type" : "GPRS timer", "reference" : "9.11.2.3", "presence" : "O", "format" : "TV", "length" : "2"}) +ies.append({ "iei" : "8-", "value" : "Always-on PDU session indication", "type" : "Always-on PDU session indication", "reference" : "9.11.4.3", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "7A", "value" : "Authorized QoS rules", "type" : "QoS rules", "reference" : "9.11.4.13", "presence" : "O", "format" : "TLV-E", "length" : "7-65538"}) +ies.append({ "iei" : "75", "value" : "Mapped EPS bearer contexts", "type" : "Mapped EPS bearer contexts", "reference" : "9.11.4.8", "presence" : "O", "format" : "TLV-E", "length" : "7-65538"}) +ies.append({ "iei" : "79", "value" : "Authorized QoS flow descriptions", "type" : "QoS flow descriptions", "reference" : "9.11.4.12", "presence" : "O", "format" : "TLV-E", "length" : "6-65538"}) +ies.append({ "iei" : "7B", "value" : "Extended protocol configuration options", "type" : "Extended protocol configuration options", "reference" : "9.11.4.6", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +ies.append({ "iei" : "77", "value" : "ATSSS container", "type" : "ATSSS container", "reference" : "9.11.4.22", "presence" : "O", "format" : "TLV-E", "length" : "3-65538"}) +ies.append({ "iei" : "66", "value" : "Header compression configuration", "type" : "Header compression configuration", "reference" : "9.11.4.24", "presence" : "O", "format" : "TLV", "length" : "5-257"}) +ies.append({ "iei" : "7C", "value" : "Port management information container", "type" : "Port management information container", "reference" : "9.11.4.27", "presence" : "O", "format" : "TLV-E", "length" : "3-65538"}) +ies.append({ "iei" : "1E", "value" : "Serving PLMN rate control", "type" : "Serving PLMN rate control", "reference" : "9.11.4.20", "presence" : "O", "format" : "TLV", "length" : "4"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-211.py b/lib/nas/5gs/support/cache/nas-msg-211.py new file mode 100644 index 0000000000..8d46a9f9fc --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-211.py @@ -0,0 +1,4 @@ +ies = [] +ies.append({ "iei" : "7B", "value" : "Extended protocol configuration options", "type" : "Extended protocol configuration options", "reference" : "9.11.4.6", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +ies.append({ "iei" : "7C", "value" : "Port management information container", "type" : "Port management information container", "reference" : "9.11.4.27", "presence" : "O", "format" : "TLV-E", "length" : "3-65538"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-212.py b/lib/nas/5gs/support/cache/nas-msg-212.py new file mode 100644 index 0000000000..e83f8213c9 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-212.py @@ -0,0 +1,4 @@ +ies = [] +ies.append({ "iei" : "", "value" : "5GSM cause", "type" : "5GSM cause", "reference" : "9.11.4.2", "presence" : "M", "format" : "V", "length" : "1"}) +ies.append({ "iei" : "7B", "value" : "Extended protocol configuration options", "type" : "Extended protocol configuration options", "reference" : "9.11.4.6", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-214.py b/lib/nas/5gs/support/cache/nas-msg-214.py new file mode 100644 index 0000000000..60af80af2b --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-214.py @@ -0,0 +1,4 @@ +ies = [] +ies.append({ "iei" : "59", "value" : "5GSM cause", "type" : "5GSM cause", "reference" : "9.11.4.2", "presence" : "O", "format" : "TV", "length" : "2"}) +ies.append({ "iei" : "7B", "value" : "Extended protocol configuration options", "type" : "Extended protocol configuration options", "reference" : "9.11.4.6", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-65.py b/lib/nas/5gs/support/cache/nas-msg-65.py new file mode 100644 index 0000000000..b7f78fda8c --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-65.py @@ -0,0 +1,35 @@ +ies = [] +ies.append({ "iei" : "", "value" : "5GS registration type", "type" : "5GS registration type", "reference" : "9.11.3.7", "presence" : "M", "format" : "V", "length" : "1/2"}) +ies.append({ "iei" : "", "value" : "5GS mobile identity", "type" : "5GS mobile identity", "reference" : "9.11.3.4", "presence" : "M", "format" : "LV-E", "length" : "6-n"}) +ies.append({ "iei" : "C-", "value" : "Non-current native NAS key set identifier", "type" : "key set identifier", "reference" : "9.11.3.32", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "10", "value" : "5GMM capability", "type" : "5GMM capability", "reference" : "9.11.3.1", "presence" : "O", "format" : "TLV", "length" : "3-15"}) +ies.append({ "iei" : "2E", "value" : "UE security capability", "type" : "UE security capability", "reference" : "9.11.3.54", "presence" : "O", "format" : "TLV", "length" : "4-10"}) +ies.append({ "iei" : "2F", "value" : "Requested NSSAI", "type" : "NSSAI", "reference" : "9.11.3.37", "presence" : "O", "format" : "TLV", "length" : "4-74"}) +ies.append({ "iei" : "52", "value" : "Last visited registered TAI", "type" : "5GS tracking area identity", "reference" : "9.11.3.8", "presence" : "O", "format" : "TV", "length" : "7"}) +ies.append({ "iei" : "17", "value" : "S1 UE network capability", "type" : "S1 UE network capability", "reference" : "9.11.3.48", "presence" : "O", "format" : "TLV", "length" : "4-15"}) +ies.append({ "iei" : "40", "value" : "Uplink data status", "type" : "Uplink data status", "reference" : "9.11.3.57", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +ies.append({ "iei" : "50", "value" : "PDU session status", "type" : "PDU session status", "reference" : "9.11.3.44", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +ies.append({ "iei" : "B-", "value" : "MICO indication", "type" : "MICO indication", "reference" : "9.11.3.31", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "2B", "value" : "UE status", "type" : "UE status", "reference" : "9.11.3.56", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "77", "value" : "Additional GUTI", "type" : "5GS mobile identity", "reference" : "9.11.3.4", "presence" : "O", "format" : "TLV-E", "length" : "14"}) +ies.append({ "iei" : "25", "value" : "Allowed PDU session status", "type" : "Allowed PDU session status", "reference" : "9.11.3.13", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +ies.append({ "iei" : "18", "value" : "UE usage setting", "type" : "UE usage setting", "reference" : "9.11.3.55", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "51", "value" : "Requested DRX parameters", "type" : "5GS DRX parameters", "reference" : "9.11.3.2A", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "70", "value" : "EPS NAS message container", "type" : "EPS NAS message container", "reference" : "9.11.3.24", "presence" : "O", "format" : "TLV-E", "length" : "4-n"}) +ies.append({ "iei" : "74", "value" : "LADN indication", "type" : "LADN indication", "reference" : "9.11.3.29", "presence" : "O", "format" : "TLV-E", "length" : "3-811"}) +ies.append({ "iei" : "8-", "value" : "Payload container type", "type" : "Payload container type", "reference" : "9.11.3.40", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "7B", "value" : "Payload container", "type" : "Payload container", "reference" : "9.11.3.39", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +ies.append({ "iei" : "9-", "value" : "Network slicing indication", "type" : "Network slicing indication", "reference" : "9.11.3.36", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "53", "value" : "5GS update type", "type" : "5GS update type", "reference" : "9.11.3.9A", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "41", "value" : "Mobile station classmark 2", "type" : "Mobile station classmark 2", "reference" : "9.11.3.31C", "presence" : "O", "format" : "TLV", "length" : "5"}) +ies.append({ "iei" : "42", "value" : "Supported codecs", "type" : "Supported codec list", "reference" : "9.11.3.51A", "presence" : "O", "format" : "TLV", "length" : "5-n"}) +ies.append({ "iei" : "71", "value" : "NAS message container", "type" : "message container", "reference" : "9.11.3.33", "presence" : "O", "format" : "TLV-E", "length" : "4-n"}) +ies.append({ "iei" : "60", "value" : "EPS bearer context status", "type" : "EPS bearer context status", "reference" : "9.11.3.23A", "presence" : "O", "format" : "TLV", "length" : "4"}) +ies.append({ "iei" : "6E", "value" : "Requested extended DRX parameters", "type" : "Extended DRX parameters", "reference" : "9.11.3.26A", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "6A", "value" : "T3324 value", "type" : "GPRS timer 3", "reference" : "9.11.2.5", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "67", "value" : "UE radio capability ID", "type" : "UE radio capability ID", "reference" : "9.11.3.68", "presence" : "O", "format" : "TLV", "length" : "3-n"}) +ies.append({ "iei" : "35", "value" : "Requested mapped NSSAI", "type" : "Mapped NSSAI", "reference" : "9.11.3.31B", "presence" : "O", "format" : "TLV", "length" : "3-42"}) +ies.append({ "iei" : "48", "value" : "Additional information requested", "type" : "Additional information requested", "reference" : "9.11.3.12A", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "1A", "value" : "Requested WUS assistance information", "type" : "WUS assistance information", "reference" : "9.11.3.71", "presence" : "O", "format" : "TLV", "length" : "3-n"}) +ies.append({ "iei" : "A1", "value" : "N5GC indication", "type" : "N5GC indication", "reference" : "9.11.3.72", "presence" : "O", "format" : "T", "length" : "1"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-66.py b/lib/nas/5gs/support/cache/nas-msg-66.py new file mode 100644 index 0000000000..3b16f61aee --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-66.py @@ -0,0 +1,40 @@ +ies = [] +ies.append({ "iei" : "", "value" : "5GS registration result", "type" : "5GS registration result", "reference" : "9.11.3.6", "presence" : "M", "format" : "LV", "length" : "2"}) +ies.append({ "iei" : "77", "value" : "5G-GUTI", "type" : "5GS mobile identity", "reference" : "9.11.3.4", "presence" : "O", "format" : "TLV-E", "length" : "14"}) +ies.append({ "iei" : "4A", "value" : "Equivalent PLMNs", "type" : "PLMN list", "reference" : "9.11.3.45", "presence" : "O", "format" : "TLV", "length" : "5-47"}) +ies.append({ "iei" : "54", "value" : "TAI list", "type" : "5GS tracking area identity list", "reference" : "9.11.3.9", "presence" : "O", "format" : "TLV", "length" : "9-114"}) +ies.append({ "iei" : "15", "value" : "Allowed NSSAI", "type" : "NSSAI", "reference" : "9.11.3.37", "presence" : "O", "format" : "TLV", "length" : "4-74"}) +ies.append({ "iei" : "11", "value" : "Rejected NSSAI", "type" : "Rejected NSSAI", "reference" : "9.11.3.46", "presence" : "O", "format" : "TLV", "length" : "4-42"}) +ies.append({ "iei" : "31", "value" : "Configured NSSAI", "type" : "NSSAI", "reference" : "9.11.3.37", "presence" : "O", "format" : "TLV", "length" : "4-146"}) +ies.append({ "iei" : "21", "value" : "5GS network feature support", "type" : "5GS network feature support", "reference" : "9.11.3.5", "presence" : "O", "format" : "TLV", "length" : "3-5"}) +ies.append({ "iei" : "50", "value" : "PDU session status", "type" : "PDU session status", "reference" : "9.11.3.44", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +ies.append({ "iei" : "26", "value" : "PDU session reactivation result", "type" : "PDU session reactivation result", "reference" : "9.11.3.42", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +ies.append({ "iei" : "72", "value" : "PDU session reactivation result error cause", "type" : "PDU session reactivation result error cause", "reference" : "9.11.3.43", "presence" : "O", "format" : "TLV-E", "length" : "5-515"}) +ies.append({ "iei" : "79", "value" : "LADN information", "type" : "LADN information", "reference" : "9.11.3.30", "presence" : "O", "format" : "TLV-E", "length" : "12-1715"}) +ies.append({ "iei" : "B-", "value" : "MICO indication", "type" : "MICO indication", "reference" : "9.11.3.31", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "9-", "value" : "Network slicing indication", "type" : "Network slicing indication", "reference" : "9.11.3.36", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "27", "value" : "Service area list", "type" : "Service area list", "reference" : "9.11.3.49", "presence" : "O", "format" : "TLV", "length" : "6-114"}) +ies.append({ "iei" : "5E", "value" : "T3512 value", "type" : "GPRS timer 3", "reference" : "9.11.2.5", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "5D", "value" : "Non-3GPP de-registration timer value", "type" : "GPRS timer 2", "reference" : "9.11.2.4", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "16", "value" : "T3502 value", "type" : "GPRS timer 2", "reference" : "9.11.2.4", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "34", "value" : "Emergency number list", "type" : "Emergency number list", "reference" : "9.11.3.23", "presence" : "O", "format" : "TLV", "length" : "5-50"}) +ies.append({ "iei" : "7A", "value" : "Extended emergency number list", "type" : "Extended emergency number list", "reference" : "9.11.3.26", "presence" : "O", "format" : "TLV-E", "length" : "7-65538"}) +ies.append({ "iei" : "73", "value" : "SOR transparent container", "type" : "SOR transparent container", "reference" : "9.11.3.51", "presence" : "O", "format" : "TLV-E", "length" : "20-n"}) +ies.append({ "iei" : "78", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "O", "format" : "TLV-E", "length" : "7-1503"}) +ies.append({ "iei" : "A-", "value" : "NSSAI inclusion mode", "type" : "NSSAI inclusion mode", "reference" : "9.11.3.37A", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "76", "value" : "Operator-defined access category definitions", "type" : "Operator-defined access category definitions", "reference" : "9.11.3.38", "presence" : "O", "format" : "TLV-E", "length" : "3-n"}) +ies.append({ "iei" : "51", "value" : "Negotiated DRX parameters", "type" : "5GS DRX parameters", "reference" : "9.11.3.2A", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "D-", "value" : "Non-3GPP NW policies", "type" : "Non-3GPP NW provided policies", "reference" : "9.11.3.36A", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "60", "value" : "EPS bearer context status", "type" : "EPS bearer context status", "reference" : "9.11.3.23A", "presence" : "O", "format" : "TLV", "length" : "4"}) +ies.append({ "iei" : "6E", "value" : "Negotiated extended DRX parameters", "type" : "Extended DRX parameters", "reference" : "9.11.3.26A", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "6C", "value" : "T3447 value", "type" : "GPRS timer 3", "reference" : "9.11.2.5", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "6B", "value" : "T3448 value", "type" : "GPRS timer 3", "reference" : "9.11.2.4", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "6A", "value" : "T3324 value", "type" : "GPRS timer 3", "reference" : "9.11.2.5", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "67", "value" : "UE radio capability ID", "type" : "UE radio capability ID", "reference" : "9.11.3.68", "presence" : "O", "format" : "TLV", "length" : "3-n"}) +ies.append({ "iei" : "68", "value" : "UE radio capability ID deletion indication", "type" : "UE radio capability ID deletion indication", "reference" : "9.11.3.69", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "39", "value" : "Pending NSSAI", "type" : "NSSAI", "reference" : "9.11.3.37", "presence" : "O", "format" : "TLV", "length" : "4-74"}) +ies.append({ "iei" : "74", "value" : "Ciphering key data", "type" : "Ciphering key data", "reference" : "9.11.3.18C", "presence" : "O", "format" : "TLV-E", "length" : "x-n"}) +ies.append({ "iei" : "75", "value" : "CAG information list", "type" : "CAG information list", "reference" : "9.11.3.18A", "presence" : "O", "format" : "TLV-E", "length" : "3-n"}) +ies.append({ "iei" : "1B", "value" : "Truncated 5G-S-TMSI configuration", "type" : "Truncated 5G-S-TMSI configuration", "reference" : "9.11.3.70", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "1C", "value" : "Negotiated WUS assistance information", "type" : "WUS assistance information", "reference" : "9.11.3.71", "presence" : "O", "format" : "TLV", "length" : "3-n"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-67.py b/lib/nas/5gs/support/cache/nas-msg-67.py new file mode 100644 index 0000000000..635573721e --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-67.py @@ -0,0 +1,3 @@ +ies = [] +ies.append({ "iei" : "73", "value" : "SOR transparent container", "type" : "SOR transparent container", "reference" : "9.11.3.51", "presence" : "O", "format" : "TLV-E", "length" : "20"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-68.py b/lib/nas/5gs/support/cache/nas-msg-68.py new file mode 100644 index 0000000000..66552e0c03 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-68.py @@ -0,0 +1,7 @@ +ies = [] +ies.append({ "iei" : "", "value" : "5GMM cause", "type" : "5GMM cause", "reference" : "9.11.3.2", "presence" : "M", "format" : "V", "length" : "1"}) +ies.append({ "iei" : "5F", "value" : "T3346 value", "type" : "GPRS timer 2", "reference" : "9.11.2.4", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "16", "value" : "T3502 value", "type" : "GPRS timer 2", "reference" : "9.11.2.4", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "78", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "O", "format" : "TLV-E", "length" : "7-1503"}) +ies.append({ "iei" : "69", "value" : "Rejected NSSAI", "type" : "Rejected NSSAI", "reference" : "9.11.3.46", "presence" : "O", "format" : "TLV", "length" : "4-42"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-69.py b/lib/nas/5gs/support/cache/nas-msg-69.py new file mode 100644 index 0000000000..e11046f1bb --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-69.py @@ -0,0 +1,4 @@ +ies = [] +ies.append({ "iei" : "", "value" : "De-registration type", "type" : "De-registration type", "reference" : "9.11.3.20", "presence" : "M", "format" : "V", "length" : "1/2"}) +ies.append({ "iei" : "", "value" : "5GS mobile identity", "type" : "5GS mobile identity", "reference" : "9.11.3.4", "presence" : "M", "format" : "LV-E", "length" : "6-n"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/support/cache/nas-msg-70.py b/lib/nas/5gs/support/cache/nas-msg-70.py similarity index 100% rename from lib/nas/support/cache/nas-msg-70.py rename to lib/nas/5gs/support/cache/nas-msg-70.py diff --git a/lib/nas/5gs/support/cache/nas-msg-71.py b/lib/nas/5gs/support/cache/nas-msg-71.py new file mode 100644 index 0000000000..499906a7f2 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-71.py @@ -0,0 +1,6 @@ +ies = [] +ies.append({ "iei" : "", "value" : "De-registration type", "type" : "De-registration type", "reference" : "9.11.3.20", "presence" : "M", "format" : "V", "length" : "1/2"}) +ies.append({ "iei" : "58", "value" : "5GMM cause", "type" : "5GMM cause", "reference" : "9.11.3.2", "presence" : "O", "format" : "TV", "length" : "2"}) +ies.append({ "iei" : "5F", "value" : "T3346 value", "type" : "GPRS timer 2", "reference" : "9.11.2.4", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "6D", "value" : "Rejected NSSAI", "type" : "Rejected NSSAI", "reference" : "9.11.3.46", "presence" : "O", "format" : "TLV", "length" : "4-42"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/support/cache/nas-msg-217.py b/lib/nas/5gs/support/cache/nas-msg-72.py similarity index 100% rename from lib/nas/support/cache/nas-msg-217.py rename to lib/nas/5gs/support/cache/nas-msg-72.py diff --git a/lib/nas/5gs/support/cache/nas-msg-76.py b/lib/nas/5gs/support/cache/nas-msg-76.py new file mode 100644 index 0000000000..c7ab0dbc27 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-76.py @@ -0,0 +1,8 @@ +ies = [] +ies.append({ "iei" : "", "value" : "ngKSI", "type" : "key set identifier", "reference" : "9.11.3.32", "presence" : "M", "format" : "V", "length" : "1/2"}) +ies.append({ "iei" : "", "value" : "5G-S-TMSI", "type" : "5GS mobile identity", "reference" : "9.11.3.4", "presence" : "M", "format" : "LV-E", "length" : "9"}) +ies.append({ "iei" : "40", "value" : "Uplink data status", "type" : "Uplink data status", "reference" : "9.11.3.57", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +ies.append({ "iei" : "50", "value" : "PDU session status", "type" : "PDU session status", "reference" : "9.11.3.44", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +ies.append({ "iei" : "25", "value" : "Allowed PDU session status", "type" : "Allowed PDU session status", "reference" : "9.11.3.13", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +ies.append({ "iei" : "71", "value" : "NAS message container", "type" : "message container", "reference" : "9.11.3.33", "presence" : "O", "format" : "TLV-E", "length" : "4-n"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-77.py b/lib/nas/5gs/support/cache/nas-msg-77.py new file mode 100644 index 0000000000..5369611da1 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-77.py @@ -0,0 +1,7 @@ +ies = [] +ies.append({ "iei" : "", "value" : "5GMM cause", "type" : "5GMM cause", "reference" : "9.11.3.2", "presence" : "M", "format" : "V", "length" : "1"}) +ies.append({ "iei" : "50", "value" : "PDU session status", "type" : "PDU session status", "reference" : "9.11.3.44", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +ies.append({ "iei" : "5F", "value" : "T3346 value", "type" : "GPRS timer 2", "reference" : "9.11.2.4", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "78", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "O", "format" : "TLV-E", "length" : "7-1503"}) +ies.append({ "iei" : "6B", "value" : "T3448 value", "type" : "GPRS timer 3", "reference" : "9.11.2.4", "presence" : "O", "format" : "TLV", "length" : "3"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-78.py b/lib/nas/5gs/support/cache/nas-msg-78.py new file mode 100644 index 0000000000..b0adf26138 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-78.py @@ -0,0 +1,7 @@ +ies = [] +ies.append({ "iei" : "50", "value" : "PDU session status", "type" : "PDU session status", "reference" : "9.11.3.44", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +ies.append({ "iei" : "26", "value" : "PDU session reactivation result", "type" : "PDU session reactivation result", "reference" : "9.11.3.42", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +ies.append({ "iei" : "72", "value" : "PDU session reactivation result error cause", "type" : "PDU session reactivation result error cause", "reference" : "9.11.3.43", "presence" : "O", "format" : "TLV-E", "length" : "5-515"}) +ies.append({ "iei" : "78", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "O", "format" : "TLV-E", "length" : "7-1503"}) +ies.append({ "iei" : "6B", "value" : "T3448 value", "type" : "GPRS timer 3", "reference" : "9.11.2.4", "presence" : "O", "format" : "TLV", "length" : "3"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-84.py b/lib/nas/5gs/support/cache/nas-msg-84.py new file mode 100644 index 0000000000..f2355ad6e5 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-84.py @@ -0,0 +1,25 @@ +ies = [] +ies.append({ "iei" : "D-", "value" : "Configuration update indication", "type" : "Configuration update indication", "reference" : "9.11.3.18", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "77", "value" : "5G-GUTI", "type" : "5GS mobile identity", "reference" : "9.11.3.4", "presence" : "O", "format" : "TLV-E", "length" : "14"}) +ies.append({ "iei" : "54", "value" : "TAI list", "type" : "5GS tracking area identity list", "reference" : "9.11.3.9", "presence" : "O", "format" : "TLV", "length" : "9-114"}) +ies.append({ "iei" : "15", "value" : "Allowed NSSAI", "type" : "NSSAI", "reference" : "9.11.3.37", "presence" : "O", "format" : "TLV", "length" : "4-74"}) +ies.append({ "iei" : "27", "value" : "Service area list", "type" : "Service area list", "reference" : "9.11.3.49", "presence" : "O", "format" : "TLV", "length" : "6-114"}) +ies.append({ "iei" : "43", "value" : "Full name for network", "type" : "Network name", "reference" : "9.11.3.35", "presence" : "O", "format" : "TLV", "length" : "3-n"}) +ies.append({ "iei" : "45", "value" : "Short name for network", "type" : "Network name", "reference" : "9.11.3.35", "presence" : "O", "format" : "TLV", "length" : "3-n"}) +ies.append({ "iei" : "46", "value" : "Local time zone", "type" : "Time zone", "reference" : "9.11.3.52", "presence" : "O", "format" : "TV", "length" : "2"}) +ies.append({ "iei" : "47", "value" : "Universal time and local time zone", "type" : "Time zone and time", "reference" : "9.11.3.53", "presence" : "O", "format" : "TV", "length" : "8"}) +ies.append({ "iei" : "49", "value" : "Network daylight saving time", "type" : "Daylight saving time", "reference" : "9.11.3.19", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "79", "value" : "LADN information", "type" : "LADN information", "reference" : "9.11.3.30", "presence" : "O", "format" : "TLV-E", "length" : "3-1715"}) +ies.append({ "iei" : "B-", "value" : "MICO indication", "type" : "MICO indication", "reference" : "9.11.3.31", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "9-", "value" : "Network slicing indication", "type" : "Network slicing indication", "reference" : "9.11.3.36", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "31", "value" : "Configured NSSAI", "type" : "NSSAI", "reference" : "9.11.3.37", "presence" : "O", "format" : "TLV", "length" : "4-146"}) +ies.append({ "iei" : "11", "value" : "Rejected NSSAI", "type" : "Rejected NSSAI", "reference" : "9.11.3.46", "presence" : "O", "format" : "TLV", "length" : "4-42"}) +ies.append({ "iei" : "76", "value" : "Operator-defined access category definitions", "type" : "Operator-defined access category definitions", "reference" : "9.11.3.38", "presence" : "O", "format" : "TLV-E", "length" : "3-n"}) +ies.append({ "iei" : "F-", "value" : "SMS indication", "type" : "SMS indication", "reference" : "9.11.3.50A", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "6C", "value" : "T3447 value", "type" : "GPRS timer 3", "reference" : "9.11.2.5", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "75", "value" : "CAG information list", "type" : "CAG information list", "reference" : "9.11.3.18A", "presence" : "O", "format" : "TLV-E", "length" : "3-n"}) +ies.append({ "iei" : "67", "value" : "UE radio capability ID", "type" : "UE radio capability ID", "reference" : "9.11.3.68", "presence" : "O", "format" : "TLV", "length" : "3-n"}) +ies.append({ "iei" : "68", "value" : "UE radio capability ID deletion indication", "type" : "UE radio capability ID deletion indication", "reference" : "9.11.3.69", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "44", "value" : "5GS registration result", "type" : "5GS registration result", "reference" : "9.11.3.6", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "1B", "value" : "Truncated 5G-S-TMSI configuration", "type" : "Truncated 5G-S-TMSI configuration", "reference" : "9.11.3.70", "presence" : "O", "format" : "TLV", "length" : "3"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-85.py b/lib/nas/5gs/support/cache/nas-msg-85.py new file mode 100644 index 0000000000..452ffb7778 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-85.py @@ -0,0 +1,12 @@ +ies = [] +ies.append({ "iei" : "", "value" : "Control plane service type", "type" : "Control plane service type", "reference" : "9.11.3.18D", "presence" : "M", "format" : "V", "length" : "1/2"}) +ies.append({ "iei" : "6F", "value" : "CIoT small data container", "type" : "CIoT small data container", "reference" : "9.11.3.18B", "presence" : "O", "format" : "TLV", "length" : "4-257"}) +ies.append({ "iei" : "8-", "value" : "Payload container type", "type" : "Payload container type", "reference" : "9.11.3.40", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "7B", "value" : "Payload container", "type" : "Payload container", "reference" : "9.11.3.39", "presence" : "O", "format" : "TLV-E", "length" : "4-65538"}) +ies.append({ "iei" : "12", "value" : "PDU session ID", "type" : "PDU session identity 2", "reference" : "9.11.3.41", "presence" : "C", "format" : "TV", "length" : "2"}) +ies.append({ "iei" : "50", "value" : "PDU session status", "type" : "PDU session status", "reference" : "9.11.3.44", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +ies.append({ "iei" : "F-", "value" : "Release assistance indication", "type" : "Release assistance indication", "reference" : "9.11.3.46A", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "40", "value" : "Uplink data status", "type" : "Uplink data status", "reference" : "9.11.3.57", "presence" : "O", "format" : "TLV", "length" : "4-34"}) +ies.append({ "iei" : "71", "value" : "NAS message container", "type" : "message container", "reference" : "9.11.3.33", "presence" : "O", "format" : "TLV-E", "length" : "4-n"}) +ies.append({ "iei" : "24", "value" : "Additional information", "type" : "Additional information", "reference" : "9.11.2.1", "presence" : "O", "format" : "TLV", "length" : "3-n"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-86.py b/lib/nas/5gs/support/cache/nas-msg-86.py new file mode 100644 index 0000000000..efd901a6d1 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-86.py @@ -0,0 +1,7 @@ +ies = [] +ies.append({ "iei" : "", "value" : "ngKSI", "type" : "key set identifier", "reference" : "9.11.3.32", "presence" : "M", "format" : "V", "length" : "1/2"}) +ies.append({ "iei" : "", "value" : "ABBA", "type" : "ABBA", "reference" : "9.11.3.10", "presence" : "M", "format" : "LV", "length" : "3-n"}) +ies.append({ "iei" : "21", "value" : "Authentication parameter RAND", "type" : "Authentication parameter RAND", "reference" : "9.11.3.16", "presence" : "O", "format" : "TV", "length" : "17"}) +ies.append({ "iei" : "20", "value" : "Authentication parameter AUTN", "type" : "Authentication parameter AUTN", "reference" : "9.11.3.15", "presence" : "O", "format" : "TLV", "length" : "18"}) +ies.append({ "iei" : "78", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "O", "format" : "TLV-E", "length" : "7-1503"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-87.py b/lib/nas/5gs/support/cache/nas-msg-87.py new file mode 100644 index 0000000000..eb55600ea2 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-87.py @@ -0,0 +1,4 @@ +ies = [] +ies.append({ "iei" : "2D", "value" : "Authentication response parameter", "type" : "Authentication response parameter", "reference" : "9.11.3.17", "presence" : "O", "format" : "TLV", "length" : "18"}) +ies.append({ "iei" : "78", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "O", "format" : "TLV-E", "length" : "7-1503"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-88.py b/lib/nas/5gs/support/cache/nas-msg-88.py new file mode 100644 index 0000000000..c6cb0bdc35 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-88.py @@ -0,0 +1,3 @@ +ies = [] +ies.append({ "iei" : "78", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "O", "format" : "TLV-E", "length" : "7-1503"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-89.py b/lib/nas/5gs/support/cache/nas-msg-89.py new file mode 100644 index 0000000000..49095eb487 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-89.py @@ -0,0 +1,4 @@ +ies = [] +ies.append({ "iei" : "", "value" : "5GMM cause", "type" : "5GMM cause", "reference" : "9.11.3.2", "presence" : "M", "format" : "V", "length" : "1"}) +ies.append({ "iei" : "30", "value" : "Authentication failure parameter", "type" : "Authentication failure parameter", "reference" : "9.11.3.14", "presence" : "O", "format" : "TLV", "length" : "16"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-90.py b/lib/nas/5gs/support/cache/nas-msg-90.py new file mode 100644 index 0000000000..882feafaac --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-90.py @@ -0,0 +1,5 @@ +ies = [] +ies.append({ "iei" : "", "value" : "ngKSI", "type" : "key set identifier", "reference" : "9.11.3.32", "presence" : "M", "format" : "V", "length" : "1/2"}) +ies.append({ "iei" : "", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "M", "format" : "LV-E", "length" : "6-1502"}) +ies.append({ "iei" : "38", "value" : "ABBA", "type" : "ABBA", "reference" : "9.11.3.10", "presence" : "O", "format" : "TLV", "length" : "4-n"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-91.py b/lib/nas/5gs/support/cache/nas-msg-91.py new file mode 100644 index 0000000000..555ace432d --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-91.py @@ -0,0 +1,3 @@ +ies = [] +ies.append({ "iei" : "", "value" : "Identity type", "type" : "5GS identity type", "reference" : "9.11.3.3", "presence" : "M", "format" : "V", "length" : "1/2"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-92.py b/lib/nas/5gs/support/cache/nas-msg-92.py new file mode 100644 index 0000000000..acc8669730 --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-92.py @@ -0,0 +1,3 @@ +ies = [] +ies.append({ "iei" : "", "value" : "Mobile identity", "type" : "5GS mobile identity", "reference" : "9.11.3.4", "presence" : "M", "format" : "LV-E", "length" : "3-n"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-93.py b/lib/nas/5gs/support/cache/nas-msg-93.py new file mode 100644 index 0000000000..eacf13d03f --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-93.py @@ -0,0 +1,11 @@ +ies = [] +ies.append({ "iei" : "", "value" : "Selected NAS security algorithms", "type" : "security algorithms", "reference" : "9.11.3.34", "presence" : "M", "format" : "V", "length" : "1"}) +ies.append({ "iei" : "", "value" : "ngKSI", "type" : "key set identifier", "reference" : "9.11.3.32", "presence" : "M", "format" : "V", "length" : "1/2"}) +ies.append({ "iei" : "", "value" : "Replayed UE security capabilities", "type" : "UE security capability", "reference" : "9.11.3.54", "presence" : "M", "format" : "LV", "length" : "3-9"}) +ies.append({ "iei" : "E-", "value" : "IMEISV request", "type" : "IMEISV request", "reference" : "9.11.3.28", "presence" : "O", "format" : "TV", "length" : "1"}) +ies.append({ "iei" : "57", "value" : "Selected EPS NAS security algorithms", "type" : "EPS NAS security algorithms", "reference" : "9.11.3.25", "presence" : "O", "format" : "TV", "length" : "2"}) +ies.append({ "iei" : "36", "value" : "Additional 5G security information", "type" : "Additional 5G security information", "reference" : "9.11.3.12", "presence" : "O", "format" : "TLV", "length" : "3"}) +ies.append({ "iei" : "78", "value" : "EAP message", "type" : "EAP message", "reference" : "9.11.2.2", "presence" : "O", "format" : "TLV-E", "length" : "7-1503"}) +ies.append({ "iei" : "38", "value" : "ABBA", "type" : "ABBA", "reference" : "9.11.3.10", "presence" : "O", "format" : "TLV", "length" : "4-n"}) +ies.append({ "iei" : "19", "value" : "Replayed S1 UE security capabilities", "type" : "S1 UE security capability", "reference" : "9.11.3.48A", "presence" : "O", "format" : "TLV", "length" : "4-7"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-94.py b/lib/nas/5gs/support/cache/nas-msg-94.py new file mode 100644 index 0000000000..cee2b8deec --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-94.py @@ -0,0 +1,5 @@ +ies = [] +ies.append({ "iei" : "77", "value" : "IMEISV", "type" : "5GS mobile identity", "reference" : "9.11.3.4", "presence" : "O", "format" : "TLV-E", "length" : "12"}) +ies.append({ "iei" : "71", "value" : "NAS message container", "type" : "message container", "reference" : "9.11.3.33", "presence" : "O", "format" : "TLV-E", "length" : "4-n"}) +ies.append({ "iei" : "78", "value" : "non-IMEISV PEI", "type" : "5GS mobile identity", "reference" : "9.11.3.4", "presence" : "O", "format" : "TLV-E", "length" : "7-n"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/cache/nas-msg-95.py b/lib/nas/5gs/support/cache/nas-msg-95.py new file mode 100644 index 0000000000..a8a88b0f3e --- /dev/null +++ b/lib/nas/5gs/support/cache/nas-msg-95.py @@ -0,0 +1,3 @@ +ies = [] +ies.append({ "iei" : "", "value" : "5GMM cause", "type" : "5GMM cause", "reference" : "9.11.3.2", "presence" : "M", "format" : "V", "length" : "1"}) +msg_list[key]["ies"] = ies diff --git a/lib/nas/5gs/support/nas-message.py b/lib/nas/5gs/support/nas-message.py new file mode 100644 index 0000000000..98ec0af572 --- /dev/null +++ b/lib/nas/5gs/support/nas-message.py @@ -0,0 +1,965 @@ +# The MIT License + +# Copyright (C) 2019,2020 by Sukchan Lee + +# This file is part of Open5GS. + +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: + +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +from docx import Document +import re, os, sys, string +import datetime +import getopt +import getpass + +version = "0.2.0" + +msg_list = {} +type_list = {} + +verbosity = 0 +filename = "" +outdir = './' +cachedir = './cache/' +currentdir = './' + +FAIL = '\033[91m' +INFO = '\033[93m' +ENDC = '\033[0m' + +def d_print(string): + if verbosity > 0: + sys.stdout.write(string) + +def d_info(string): + sys.stdout.write(INFO + string + ENDC + "\n") + +def d_error(string): + sys.stderr.write(FAIL + string + ENDC + "\n") + sys.exit(0) + +def write_file(f, string): + f.write(string) + d_print(string) + +def output_header_to_file(f): + now = datetime.datetime.now() + f.write("""/* + * The MIT License + * + * Copyright (C) 2019,2020 by Sukchan Lee + * + * This file is part of Open5GS. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +""") + f.write("/*******************************************************************************\n") + f.write(" * This file had been created by nas-message.py script v%s\n" % (version)) + f.write(" * Please do not modify this file but regenerate it via script.\n") + f.write(" * Created on: %s by %s\n * from %s\n" % (str(now), getpass.getuser(), filename)) + f.write(" ******************************************************************************/\n\n") + +def usage(): + print "Python generating NAS Message encoder/decoder v%s" % (version) + print "Usage: python nas-message.py [options]" + print "Available options:" + print "-d Enable script debug" + print "-f [file] Input file to parse" + print "-o [dir] Output files to given directory" + print "-c [dir] Cache files to given directory" + print "-h Print this help and return" + +def v_upper(v): + return re.sub('_TO_UE', '', re.sub('_FROM_UE', '', re.sub('\'', '_', re.sub('/', '_', re.sub('-', '_', re.sub(' ', '_', v)))).upper())) + +def v_lower(v): + return re.sub('\'', '_', re.sub('/', '_', re.sub('-', '_', re.sub(' ', '_', v)))).lower() + +def get_value(v): + return re.sub('5gs_', '', re.sub('5g_', '', re.sub('5gsm', 'gsm', re.sub('5gmm', 'gmm', re.sub('\'', '_', re.sub('/', '_', re.sub('-', '_', re.sub(' ', '_', v)))).lower())))) + +def get_cells(cells): + iei = cells[0].text.encode('ascii', 'ignore') + value = re.sub("\s*$", "", re.sub("\s*\n*\s*\([^\)]*\)*", "", re.sub("'s", "", cells[1].text))).encode('ascii', 'ignore') + type = re.sub("^NAS ", "", re.sub("'s", "", re.sub('\s*\n\s*[a-zA-Z0-9.]*', '', cells[2].text))).encode('ascii', 'ignore') + reference = re.sub('[a-zA-Z0-9\'\-\s]*\n\s*', '', cells[2].text).encode('ascii', 'ignore') + presence = cells[3].text.encode('ascii', 'ignore') + format = cells[4].text.encode('ascii', 'ignore') + length = cells[5].text.encode('ascii', 'ignore') + + return { "iei" : iei, "value" : value, "type" : type, "reference" : reference, "presence" : presence, "format" : format, "length" : length } + +def write_cells_to_file(name, cells): + write_file(f, name + ".append({ \"iei\" : \"" + cells["iei"] + \ + "\", \"value\" : \"" + cells["value"] + \ + "\", \"type\" : \"" + cells["type"] + \ + "\", \"reference\" : \"" + cells["reference"] + \ + "\", \"presence\" : \"" + cells["presence"] + \ + "\", \"format\" : \"" + cells["format"] + \ + "\", \"length\" : \"" + cells["length"] + "\"})\n") + +try: + opts, args = getopt.getopt(sys.argv[1:], "df:ho:c:", ["debug", "file", "help", "output", "cache"]) +except getopt.GetoptError as err: + # print help information and exit: + usage() + sys.exit(2) + +for o, a in opts: + if o in ("-d", "--debug"): + verbosity = 1 + if o in ("-f", "--file"): + filename = a + if o in ("-o", "--output"): + outdir = a + if outdir.rfind('/') != len(outdir): + outdir += '/' + if o in ("-c", "--cache"): + cache = a + if cachedir.rfind('/') != len(cachedir): + cachedir += '/' + if o in ("-h", "--help"): + usage() + sys.exit(2) + +# Message Type List + +msg_list["REGISTRATION REQUEST"] = { "type" : "65" } +msg_list["REGISTRATION ACCEPT"] = { "type" : "66" } +msg_list["REGISTRATION COMPLETE"] = { "type" : "67" } +msg_list["REGISTRATION REJECT"] = { "type" : "68" } +msg_list["DEREGISTRATION REQUEST FROM UE"] = { "type" : "69" } +msg_list["DEREGISTRATION ACCEPT FROM UE"] = { "type" : "70" } +msg_list["DEREGISTRATION REQUEST TO UE"] = { "type" : "71" } +msg_list["DEREGISTRATION ACCEPT TO UE"] = { "type" : "72" } +msg_list["SERVICE REQUEST"] = { "type" : "76" } +msg_list["SERVICE REJECT"] = { "type" : "77" } +msg_list["SERVICE ACCEPT"] = { "type" : "78" } +msg_list["CONFIGURATION UPDATE COMMAND"] = { "type" : "84" } +msg_list["CONFIGURATION UPDATE COMPLETE"] = { "type" : "85" } +msg_list["AUTHENTICATION REQUEST"] = { "type" : "86" } +msg_list["AUTHENTICATION RESPONSE"] = { "type" : "87" } +msg_list["AUTHENTICATION REJECT"] = { "type" : "88" } +msg_list["AUTHENTICATION FAILURE"] = { "type" : "89" } +msg_list["AUTHENTICATION RESULT"] = { "type" : "90" } +msg_list["IDENTITY REQUEST"] = { "type" : "91" } +msg_list["IDENTITY RESPONSE"] = { "type" : "92" } +msg_list["SECURITY MODE COMMAND"] = { "type" : "93" } +msg_list["SECURITY MODE COMPLETE"] = { "type" : "94" } +msg_list["SECURITY MODE REJECT"] = { "type" : "95" } +msg_list["5GMM STATUS"] = { "type" : "100" } +msg_list["NOTIFICATION"] = { "type" : "101" } +msg_list["NOTIFICATION RESPONSE"] = { "type" : "102" } +msg_list["UL NAS TRANSPORT"] = { "type" : "103" } +msg_list["DL NAS TRANSPORT"] = { "type" : "104" } + +msg_list["PDU SESSION ESTABLISHMENT REQUEST"] = { "type" : "193" } +msg_list["PDU SESSION ESTABLISHMENT ACCEPT"] = { "type" : "194" } +msg_list["PDU SESSION ESTABLISHMENT REJECT"] = { "type" : "195" } +msg_list["PDU SESSION AUTHENTICATION COMMAND"] = { "type" : "197" } +msg_list["PDU SESSION AUTHENTICATION COMPLETE"] = { "type" : "198" } +msg_list["PDU SESSION AUTHENTICATION RESULT"] = { "type" : "199" } +msg_list["PDU SESSION MODIFICATION REQUEST"] = { "type" : "201" } +msg_list["PDU SESSION MODIFICATION REJECT"] = { "type" : "202" } +msg_list["PDU SESSION MODIFICATION COMMAND"] = { "type" : "203" } +msg_list["PDU SESSION MODIFICATION COMPLETE"] = { "type" : "204" } +msg_list["PDU SESSION MODIFICATION COMMAND REJECT"] = { "type" : "205" } +msg_list["PDU SESSION RELEASE REQUEST"] = { "type" : "209" } +msg_list["PDU SESSION RELEASE REJECT"] = { "type" : "210" } +msg_list["PDU SESSION RELEASE COMMAND"] = { "type" : "211" } +msg_list["PDU SESSION RELEASE COMPLETE"] = { "type" : "212" } +msg_list["5GSM STATUS"] = { "type" : "214" } + +# Table number for Message List +msg_list["AUTHENTICATION REQUEST"]["table"] = 0 +msg_list["AUTHENTICATION RESPONSE"]["table"] = 1 +msg_list["AUTHENTICATION RESULT"]["table"] = 2 +msg_list["AUTHENTICATION FAILURE"]["table"] = 3 +msg_list["AUTHENTICATION REJECT"]["table"] = 4 +msg_list["REGISTRATION REQUEST"]["table"] = 5 +msg_list["REGISTRATION ACCEPT"]["table"] = 6 +msg_list["REGISTRATION COMPLETE"]["table"] = 7 +msg_list["REGISTRATION REJECT"]["table"] = 8 +msg_list["UL NAS TRANSPORT"]["table"] = 9 +msg_list["DL NAS TRANSPORT"]["table"] = 10 +msg_list["DEREGISTRATION REQUEST FROM UE"]["table"] = 11 +msg_list["DEREGISTRATION ACCEPT FROM UE"]["table"] = 12 +msg_list["DEREGISTRATION REQUEST TO UE"]["table"] = 13 +msg_list["DEREGISTRATION ACCEPT TO UE"]["table"] = 14 +msg_list["SERVICE REQUEST"]["table"] = 15 +msg_list["SERVICE ACCEPT"]["table"] = 16 +msg_list["SERVICE REJECT"]["table"] = 17 +msg_list["CONFIGURATION UPDATE COMMAND"]["table"] = 18 +msg_list["CONFIGURATION UPDATE COMPLETE"]["table"] = 29 +msg_list["IDENTITY REQUEST"]["table"] = 20 +msg_list["IDENTITY RESPONSE"]["table"] = 21 +msg_list["NOTIFICATION"]["table"] = 22 +msg_list["NOTIFICATION RESPONSE"]["table"] = 23 +msg_list["SECURITY MODE COMMAND"]["table"] = 24 +msg_list["SECURITY MODE COMPLETE"]["table"] = 25 +msg_list["SECURITY MODE REJECT"]["table"] = 26 +msg_list["5GMM STATUS"]["table"] = 28 + +msg_list["PDU SESSION ESTABLISHMENT REQUEST"]["table"] = 29 +msg_list["PDU SESSION ESTABLISHMENT ACCEPT"]["table"] = 30 +msg_list["PDU SESSION ESTABLISHMENT REJECT"]["table"] = 31 +msg_list["PDU SESSION AUTHENTICATION COMMAND"]["table"] = 32 +msg_list["PDU SESSION AUTHENTICATION COMPLETE"]["table"] = 33 +msg_list["PDU SESSION AUTHENTICATION RESULT"]["table"] = 34 +msg_list["PDU SESSION MODIFICATION REQUEST"]["table"] = 35 +msg_list["PDU SESSION MODIFICATION REJECT"]["table"] = 36 +msg_list["PDU SESSION MODIFICATION COMMAND"]["table"] = 37 +msg_list["PDU SESSION MODIFICATION COMPLETE"]["table"] = 38 +msg_list["PDU SESSION MODIFICATION COMMAND REJECT"]["table"] = 39 +msg_list["PDU SESSION RELEASE REQUEST"]["table"] = 40 +msg_list["PDU SESSION RELEASE REJECT"]["table"] = 41 +msg_list["PDU SESSION RELEASE COMMAND"]["table"] = 42 +msg_list["PDU SESSION RELEASE COMPLETE"]["table"] = 43 +msg_list["5GSM STATUS"]["table"] = 44 + +for key in msg_list.keys(): + if "table" not in msg_list[key].keys(): + continue; + + d_info("[" + key + "]") + cachefile = cachedir + "nas-msg-" + msg_list[key]["type"] + ".py" + if os.path.isfile(cachefile) and os.access(cachefile, os.R_OK): + execfile(cachefile) + print "Read from " + cachefile + else: + document = Document(filename) + f = open(cachefile, 'w') + + ies = [] + write_file(f, "ies = []\n") + table = document.tables[msg_list[key]["table"]] + + start_row = 0 + for start_row, row in enumerate(table.rows): + cells = get_cells(row.cells); + if cells["type"].find('Message type') != -1: + break + if cells["type"].find('KSI and sequence number') != -1: + start_row -= 1 + break + + assert start_row <= 4, "Can't find message type" + + half_length = True; + for row in table.rows[start_row+1:]: + cells = get_cells(row.cells) + if cells is None: + continue + + if cells["length"] == "1/2": + if half_length is True: + half_length = False; + else: + half_length = True; + continue; + + ies.append(cells) + write_cells_to_file("ies", cells) + + msg_list[key]["ies"] = ies + write_file(f, "msg_list[key][\"ies\"] = ies\n") + + f.close() + + +tmp = [(k, v["type"]) for k, v in msg_list.items()] +sorted_msg_list = sorted(tmp, key=lambda tup: float(tup[1])) + +for (k, v) in sorted_msg_list: + if "ies" not in msg_list[k]: + continue; + + for ie in msg_list[k]["ies"]: + key = ie["type"] + if key in type_list.keys() and (type_list[key]["presence"] != ie["presence"] or type_list[key]["format"] != ie["format"] or type_list[key]["length"] != ie["length"]): + d_print("KEY type different : %s\n" % key) + d_print("%s.%s %s %s %s\n" % (v_lower(type_list[key]["message"]), type_list[key]["value"], type_list[key]["presence"], type_list[key]["format"], type_list[key]["length"])) + d_print("%s.%s %s %s %s\n\n" % (v_lower(k), ie["value"], ie["presence"], ie["format"], ie["length"])) + continue + type_list[key] = { "reference" : ie["reference"], "presence" : ie["presence"], "format" : ie["format"], "length" : ie["length"], "message" : k, "value" : ie["value"] } + +d_info("[Type List]") +typefile = currentdir + "type-list.py" +if os.path.isfile(typefile) and os.access(typefile, os.R_OK): + execfile(typefile) + print "Read from " + typefile + +tmp = [(k, v["reference"]) for k, v in type_list.items()] +sorted_type_list = sorted(tmp, key=lambda tup: tup[1]) + +f = open(outdir + 'ies.h', 'w') +output_header_to_file(f) +f.write("""#if !defined(OGS_NAS_INSIDE) && !defined(OGS_NAS_COMPILATION) +#error "This header cannot be included directly." +#endif + +#ifndef OGS_NAS_5GS_IES_H +#define OGS_NAS_5GS_IES_H + +#ifdef __cplusplus +extern "C" { +#endif + +int ogs_nas_encode_optional_type(ogs_pkbuf_t *pkbuf, uint8_t type); + +""") + +for (k, v) in sorted_type_list: + f.write("int ogs_nas_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf);\n" % (v_lower(k), v_lower(k), get_value(k))) +f.write("\n") + +for (k, v) in sorted_type_list: + f.write("int ogs_nas_encode_%s(ogs_pkbuf_t *pkbuf, ogs_nas_%s_t *%s);\n" % (v_lower(k), v_lower(k), get_value(k))) +f.write("\n") + + +f.write("""#ifdef __cplusplus +} +#endif + +#endif /* OGS_NAS_5GS_IES_H */ + +""") +f.close() + +f = open(outdir + 'ies.c', 'w') +output_header_to_file(f) +f.write("""#include "ogs-nas-5gs.h" + +int ogs_nas_encode_optional_type(ogs_pkbuf_t *pkbuf, uint8_t type) +{ + uint16_t size = sizeof(uint8_t); + + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &type, size); + + return size; +} +""") + +for (k, v) in sorted_type_list: +# d_print("%s = %s\n" % (k, type_list[k])) + f.write("/* %s %s\n" % (type_list[k]["reference"], k)) + f.write(" * %s %s %s */\n" % (type_list[k]["presence"], type_list[k]["format"], type_list[k]["length"])) + if (type_list[k]["format"] == "TV" or type_list[k]["format"] == "T") and type_list[k]["length"] == "1": + f.write("int ogs_nas_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), get_value(k))) + f.write("{\n") + f.write(" memcpy(%s, pkbuf->data - 1, 1);\n\n" % get_value(k)) + f.write(" ogs_trace(\" %s - \");\n" % v_upper(k)) + f.write(" ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - 1, 1);\n\n"); + f.write(" return 0;\n") + f.write("}\n\n") + f.write("int ogs_nas_encode_%s(ogs_pkbuf_t *pkbuf, ogs_nas_%s_t *%s)\n" % (v_lower(k), v_lower(k), get_value(k))) + f.write("{\n") + f.write(" uint16_t size = sizeof(ogs_nas_%s_t);\n\n" % v_lower(k)) + f.write(" ogs_assert(ogs_pkbuf_pull(pkbuf, size));\n") + f.write(" memcpy(pkbuf->data - size, %s, size);\n\n" % get_value(k)) + f.write(" ogs_trace(\" %s - \");\n" % v_upper(k)) + f.write(" ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size);\n\n"); + f.write(" return size;\n") + f.write("}\n\n") + elif type_list[k]["format"] == "TV" or type_list[k]["format"] == "V": + f.write("int ogs_nas_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), get_value(k))) + f.write("{\n") + if type_list[k]["length"] == "4": + f.write(" uint16_t size = 3;\n\n") + else: + f.write(" uint16_t size = sizeof(ogs_nas_%s_t);\n\n" % v_lower(k)) + f.write(" ogs_assert(ogs_pkbuf_pull(pkbuf, size));\n") + f.write(" memcpy(%s, pkbuf->data - size, size);\n\n" % get_value(k)) + if "decode" in type_list[k]: + f.write("%s" % type_list[k]["decode"]) + f.write(" ogs_trace(\" %s - \");\n" % v_upper(k)) + f.write(" ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size);\n\n"); + f.write(" return size;\n") + f.write("}\n\n") + f.write("int ogs_nas_encode_%s(ogs_pkbuf_t *pkbuf, ogs_nas_%s_t *%s)\n" % (v_lower(k), v_lower(k), get_value(k))) + f.write("{\n") + if type_list[k]["length"] == "4": + f.write(" uint16_t size = 3;\n") + else: + f.write(" uint16_t size = sizeof(ogs_nas_%s_t);\n" % v_lower(k)) + f.write(" ogs_nas_%s_t target;\n\n" % v_lower(k)) + f.write(" memcpy(&target, %s, size);\n" % get_value(k)) + if "encode" in type_list[k]: + f.write("%s" % type_list[k]["encode"]) + f.write(" ogs_assert(ogs_pkbuf_pull(pkbuf, size));\n") + f.write(" memcpy(pkbuf->data - size, &target, size);\n\n") + f.write(" ogs_trace(\" %s - \");\n" % v_upper(k)) + f.write(" ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size);\n\n"); + f.write(" return size;\n") + f.write("}\n\n") + elif (type_list[k]["format"] == "LV-E" or type_list[k]["format"] == "TLV-E") and type_list[k]["value"] != "5GS mobile identity": + f.write("int ogs_nas_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), get_value(k))) + f.write("{\n") + f.write(" uint16_t size = 0;\n") + f.write(" ogs_nas_%s_t *source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % (v_lower(k), v_lower(k))) + f.write(" %s->length = be16toh(source->length);\n" % get_value(k)) + f.write(" size = %s->length + sizeof(%s->length);\n\n" % (get_value(k), get_value(k))) + f.write(" ogs_assert(ogs_pkbuf_pull(pkbuf, size));\n") + f.write(" %s->buffer = pkbuf->data - size + sizeof(%s->length);\n\n" % (get_value(k), get_value(k))) + f.write(" ogs_trace(\" %s - \");\n" % v_upper(k)) + f.write(" ogs_log_hexdump(OGS_LOG_TRACE, (void*)%s->buffer, %s->length);\n\n" % (get_value(k), get_value(k))); + f.write(" return size;\n") + f.write("}\n\n") + f.write("int ogs_nas_encode_%s(ogs_pkbuf_t *pkbuf, ogs_nas_%s_t *%s)\n" % (v_lower(k), v_lower(k), get_value(k))) + f.write("{\n") + f.write(" uint16_t size = 0;\n") + f.write(" uint16_t target;\n\n") + f.write(" ogs_assert(%s);\n" % get_value(k)) + f.write(" ogs_assert(%s->buffer);\n\n" % get_value(k)) + f.write(" size = sizeof(%s->length);\n" % get_value(k)) + f.write(" ogs_assert(ogs_pkbuf_pull(pkbuf, size));\n") + f.write(" target = htobe16(%s->length);\n" % get_value(k)) + f.write(" memcpy(pkbuf->data - size, &target, size);\n\n") + f.write(" size = %s->length;\n" % get_value(k)) + f.write(" ogs_assert(ogs_pkbuf_pull(pkbuf, size));\n") + f.write(" memcpy(pkbuf->data - size, %s->buffer, size);\n\n" % get_value(k)) + f.write(" ogs_trace(\" %s - \");\n" % v_upper(k)) + f.write(" ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size);\n\n"); + f.write(" return %s->length + sizeof(%s->length);\n" % (get_value(k), get_value(k))) + f.write("}\n\n"); + else: + f.write("int ogs_nas_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), get_value(k))) + f.write("{\n") + f.write(" uint16_t size = 0;\n") + f.write(" ogs_nas_%s_t *source = (ogs_nas_%s_t *)pkbuf->data;\n\n" % (v_lower(k), v_lower(k))) + f.write(" %s->length = source->length;\n" % get_value(k)) + f.write(" size = %s->length + sizeof(%s->length);\n\n" % (get_value(k), get_value(k))) + f.write(" ogs_assert(ogs_pkbuf_pull(pkbuf, size));\n") + f.write(" memcpy(%s, pkbuf->data - size, size);\n\n" % get_value(k)) + if "decode" in type_list[k]: + f.write("%s" % type_list[k]["decode"]) + f.write(" ogs_trace(\" %s - \");\n" % v_upper(k)) + f.write(" ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size);\n\n"); + f.write(" return size;\n") + f.write("}\n\n") + f.write("int ogs_nas_encode_%s(ogs_pkbuf_t *pkbuf, ogs_nas_%s_t *%s)\n" % (v_lower(k), v_lower(k), get_value(k))) + f.write("{\n") + f.write(" uint16_t size = %s->length + sizeof(%s->length);\n" % (get_value(k), get_value(k))) + f.write(" ogs_nas_%s_t target;\n\n" % v_lower(k)) + f.write(" memcpy(&target, %s, sizeof(ogs_nas_%s_t));\n" % (get_value(k), v_lower(k))) + if "encode" in type_list[k]: + f.write("%s" % type_list[k]["encode"]) + f.write(" ogs_assert(ogs_pkbuf_pull(pkbuf, size));\n") + f.write(" memcpy(pkbuf->data - size, &target, size);\n\n") + f.write(" ogs_trace(\" %s - \");\n" % v_upper(k)) + f.write(" ogs_log_hexdump(OGS_LOG_TRACE, pkbuf->data - size, size);\n\n"); + f.write(" return size;\n") + f.write("}\n\n"); +f.close() + +f = open(outdir + 'message.h', 'w') +output_header_to_file(f) +f.write("""#if !defined(OGS_NAS_INSIDE) && !defined(OGS_NAS_COMPILATION) +#error "This header cannot be included directly." +#endif + +#ifndef OGS_NAS_5GS_MESSAGE_H +#define OGS_NAS_5GS_MESSAGE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM. + * When calculating AES_CMAC, we need to use the headroom of the packet. */ +#define OGS_NAS_HEADROOM 16 + +#define OGS_NAS_SECURITY_HEADER_PLAIN_NAS_MESSAGE 0 +#define OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED 1 +#define OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED 2 +#define OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_NEW_SECURITY_CONTEXT 3 +#define OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHTERD_WITH_NEW_INTEGRITY_CONTEXT 4 +#define OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_PARTICALLY_CIPHTERD 5 + +#define OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_ESM 0x2e +#define OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_EMM 0x7e + +#define OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED 0 +#define OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED 0 + +typedef struct ogs_nas_5gmm_header_s { + uint8_t extended_protocol_discriminator; + uint8_t security_header_type; + uint8_t message_type; +} __attribute__ ((packed)) ogs_nas_5gmm_header_t; + +typedef struct ogs_nas_5gsm_header_s { + uint8_t extended_protocol_discriminator; + uint8_t pdu_session_identity; + uint8_t procedure_transaction_identity; + uint8_t message_type; +} __attribute__ ((packed)) ogs_nas_5gsm_header_t; + +typedef struct ogs_nas_security_header_s { + uint8_t extended_protocol_discriminator; + uint8_t security_header_type; + uint32_t message_authentication_code; + uint8_t sequence_number; +} __attribute__ ((packed)) ogs_nas_security_header_t; + +""") + +for (k, v) in sorted_msg_list: + if k.find("TO UE") == -1: + f.write("#define OGS_NAS_" + v_upper(k) + " " + v.split('.')[0] + "\n") +f.write("\n") + +for (k, v) in sorted_msg_list: + if "ies" not in msg_list[k]: + continue; + if len(msg_list[k]["ies"]) == 0: + continue; + + f.write("\n/*******************************************************\n") + f.write(" * %s\n" % k) + f.write(" ******************************************************/") + + for i, ie in enumerate([ies for ies in msg_list[k]["ies"] if ies["presence"] == "O"]): + f.write("\n#define OGS_NAS_%s_%s_PRESENT ((uint64_t)1<<%d)" % (v_upper(k), v_upper(ie["value"]), i)) + + for i, ie in enumerate([ies for ies in msg_list[k]["ies"] if ies["presence"] == "O"]): + f.write("\n#define OGS_NAS_%s_%s_TYPE 0x%s" % (v_upper(k), v_upper(ie["value"]), re.sub('-', '0', ie["iei"]))) + + f.write("\n\ntypedef struct ogs_nas_%s_s {\n" % v_lower(k)) + + mandatory_fields = False; + optional_fields = False; + for ie in msg_list[k]["ies"]: + if ie["presence"] == "M" and mandatory_fields is False: + f.write(" /* Mandatory fields */\n") + mandatory_fields = True; + + if ie["presence"] == "O" and optional_fields is False: + f.write("\n /* Optional fields */\n") + f.write(" uint64_t presencemask;\n"); + optional_fields = True; + + f.write(" ogs_nas_" + v_lower(ie["type"]) + "_t " + \ + get_value(ie["value"]) + ";\n") + + f.write("} ogs_nas_%s_t;\n\n" % v_lower(k)) + +f.write("\n") + +f.write("""typedef struct ogs_nas_5gmm_message_s { + ogs_nas_5gmm_header_t h; + union { +""") +for (k, v) in sorted_msg_list: + if "ies" not in msg_list[k]: + continue; + if len(msg_list[k]["ies"]) == 0: + continue; + if float(msg_list[k]["type"]) < 192: + f.write(" ogs_nas_%s_t %s;\n" % (v_lower(k), get_value(k))) +f.write(""" }; +} ogs_nas_5gmm_message_t; + +typedef struct ogs_nas_5gsm_message_s { + ogs_nas_5gsm_header_t h; + union { +""") +for (k, v) in sorted_msg_list: + if "ies" not in msg_list[k]: + continue; + if len(msg_list[k]["ies"]) == 0: + continue; + if float(msg_list[k]["type"]) >= 192: + f.write(" ogs_nas_%s_t %s;\n" % (v_lower(k), get_value(k))) + +f.write(""" }; +} ogs_nas_5gsm_message_t; + +typedef struct ogs_nas_message_s { + ogs_nas_security_header_t h; + union { + ogs_nas_5gmm_message_t gmm; + ogs_nas_5gsm_message_t gsm; + }; +} ogs_nas_message_t; + +ogs_pkbuf_t *ogs_nas_5gmm_encode(ogs_nas_message_t *message); +ogs_pkbuf_t *ogs_nas_5gsm_encode(ogs_nas_message_t *message); +int ogs_nas_5gmm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_5gsm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +ogs_pkbuf_t *ogs_nas_plain_encode(ogs_nas_message_t *message); + +#ifdef __cplusplus +} +#endif + +#endif /* OGS_NAS_5GS_MESSAGE_H */ +""") + +f.close() + + + +f = open(outdir + 'decoder.c', 'w') +output_header_to_file(f) +f.write("""#include "ogs-nas-5gs.h" + +""") + +for (k, v) in sorted_msg_list: + if "ies" not in msg_list[k]: + continue + if len(msg_list[k]["ies"]) == 0: + continue + f.write("int ogs_nas_decode_%s(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf);\n" % v_lower(k)) + +for (k, v) in sorted_msg_list: + if "ies" not in msg_list[k]: + continue + if len(msg_list[k]["ies"]) == 0: + continue + + f.write("int ogs_nas_decode_%s(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf)\n{\n" % v_lower(k)) + if float(msg_list[k]["type"]) < 192: + f.write(" ogs_nas_%s_t *%s = &message->gmm.%s;\n" % (v_lower(k), get_value(k), get_value(k))) + else: + f.write(" ogs_nas_%s_t *%s = &message->gsm.%s;\n" % (v_lower(k), get_value(k), get_value(k))) + f.write(" int decoded = 0;\n") + f.write(" int size = 0;\n\n") + f.write(" ogs_trace(\"[NAS] Decode %s\\n\");\n\n" % v_upper(k)) + + for ie in [ies for ies in msg_list[k]["ies"] if ies["presence"] == "M"]: + f.write(" size = ogs_nas_decode_%s(&%s->%s, pkbuf);\n" % (v_lower(ie["type"]), get_value(k), get_value(ie["value"]))) + f.write(" ogs_assert(size >= 0);\n") + f.write(" decoded += size;\n\n") + + optional_fields = False; + for ie in [ies for ies in msg_list[k]["ies"] if ies["presence"] == "O"]: + if optional_fields is False: + f.write(""" while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch(type) { +""") + optional_fields = True; + + f.write(" case OGS_NAS_%s_%s_TYPE:\n" % (v_upper(k), v_upper(ie["value"]))) + f.write(" size = ogs_nas_decode_%s(&%s->%s, pkbuf);\n" % (v_lower(ie["type"]), get_value(k), get_value(ie["value"]))) + f.write(" ogs_assert(size >= 0);\n") + f.write(" %s->presencemask |= OGS_NAS_%s_%s_PRESENT;\n" % (get_value(k), v_upper(k), v_upper(ie["value"]))) + f.write(" decoded += size;\n") + f.write(" break;\n") + + if [ies for ies in msg_list[k]["ies"] if ies["presence"] == "O"]: + f.write(""" default: + ogs_warn("Unknown type(0x%x) or not implemented\\n", type); + break; + } + } + +""") + f.write(""" return decoded; +} + +""") + +f.write("""int ogs_nas_5gmm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + int size = 0; + uint16_t decoded = 0; + + ogs_assert(pkbuf); + ogs_assert(pkbuf->data); + ogs_assert(pkbuf->len); + + memset(message, 0, sizeof(ogs_nas_message_t)); + + size = sizeof(ogs_nas_5gmm_header_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(&message->gmm.h, pkbuf->data - size, size); + decoded += size; + + switch(message->gmm.h.message_type) { +""") +for (k, v) in sorted_msg_list: + if "ies" not in msg_list[k]: + continue; + if float(msg_list[k]["type"]) < 192 and k.find("TO UE") == -1: + f.write(" case OGS_NAS_%s:\n" % v_upper(k)) + if len(msg_list[k]["ies"]) != 0: + f.write(" size = ogs_nas_decode_%s(message, pkbuf);\n" % v_lower(k)) + f.write(" ogs_assert(size >= 0);\n") + f.write(" decoded += size;\n") + f.write(" break;\n") + +f.write(""" default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->gmm.h.message_type); + break; + } + + ogs_assert(ogs_pkbuf_push(pkbuf, decoded)); + + return OGS_OK; +} +""") + +f.write("""int ogs_nas_5gsm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + int size = 0; + uint16_t decoded = 0; + + ogs_assert(pkbuf); + ogs_assert(pkbuf->data); + ogs_assert(pkbuf->len); + + memset(message, 0, sizeof(ogs_nas_message_t)); + + size = sizeof(ogs_nas_5gsm_header_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(&message->gsm.h, pkbuf->data - size, size); + decoded += size; + + switch(message->gsm.h.message_type) { +""") +for (k, v) in sorted_msg_list: + if "ies" not in msg_list[k]: + continue; + if float(msg_list[k]["type"]) >= 192: + f.write(" case OGS_NAS_%s:\n" % v_upper(k)) + if len(msg_list[k]["ies"]) != 0: + f.write(" size = ogs_nas_decode_%s(message, pkbuf);\n" % v_lower(k)) + f.write(" ogs_assert(size >= 0);\n") + f.write(" decoded += size;\n") + f.write(" break;\n") + +f.write(""" default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->gsm.h.message_type); + break; + } + + ogs_assert(ogs_pkbuf_push(pkbuf, decoded)); + + return OGS_OK; +} + +""") + +f.close() + +f = open(outdir + 'encoder.c', 'w') +output_header_to_file(f) +f.write("""#include "ogs-nas-5gs.h" + +""") + +for (k, v) in sorted_msg_list: + if "ies" not in msg_list[k]: + continue; + if len(msg_list[k]["ies"]) == 0: + continue + f.write("int ogs_nas_encode_%s(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message);\n" % v_lower(k)) + +for (k, v) in sorted_msg_list: + if "ies" not in msg_list[k]: + continue; + if len(msg_list[k]["ies"]) == 0: + continue + + f.write("int ogs_nas_encode_%s(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message)\n{\n" % v_lower(k)) + if float(msg_list[k]["type"]) < 192: + f.write(" ogs_nas_%s_t *%s = &message->gmm.%s;\n" % (v_lower(k), get_value(k), get_value(k))) + else: + f.write(" ogs_nas_%s_t *%s = &message->gsm.%s;\n" % (v_lower(k), get_value(k), get_value(k))) + f.write(" int encoded = 0;\n") + f.write(" int size = 0;\n\n") + f.write(" ogs_trace(\"[NAS] Encode %s\");\n\n" % v_upper(k)) + + for ie in [ies for ies in msg_list[k]["ies"] if ies["presence"] == "M"]: + f.write(" size = ogs_nas_encode_%s(pkbuf, &%s->%s);\n" % (v_lower(ie["type"]), get_value(k), get_value(ie["value"]))) + f.write(" ogs_assert(size >= 0);\n") + f.write(" encoded += size;\n\n") + + for ie in [ies for ies in msg_list[k]["ies"] if ies["presence"] == "O"]: + f.write(" if (%s->presencemask & OGS_NAS_%s_%s_PRESENT) {\n" % (get_value(k), v_upper(k), v_upper(ie["value"]))) + if ie["length"] == "1" and ie["format"] == "TV": + f.write(" %s->%s.type = (OGS_NAS_%s_%s_TYPE >> 4);\n\n" % (get_value(k), get_value(ie["value"]), v_upper(k), v_upper(ie["value"]))) + elif ie["length"] == "1" and ie["format"] == "T": + f.write(" %s->%s.type = OGS_NAS_%s_%s_TYPE;\n\n" % (get_value(k), get_value(ie["value"]), v_upper(k), v_upper(ie["value"]))) + else: + f.write(" size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_%s_%s_TYPE);\n" % (v_upper(k), v_upper(ie["value"]))) + f.write(" ogs_assert(size >= 0);\n") + f.write(" encoded += size;\n\n") + f.write(" size = ogs_nas_encode_%s(pkbuf, &%s->%s);\n" % (v_lower(ie["type"]), get_value(k), get_value(ie["value"]))) + f.write(" ogs_assert(size >= 0);\n") + f.write(" encoded += size;\n") + f.write(" }\n\n") + + f.write(""" return encoded; +} + +""") + + +f.write("""ogs_pkbuf_t *ogs_nas_5gmm_encode(ogs_nas_message_t *message) +{ + ogs_pkbuf_t *pkbuf = NULL; + int size = 0; + int encoded = 0; + + ogs_assert(message); + + /* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM. + * When calculating AES_CMAC, we need to use the headroom of the packet. */ + pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); + ogs_assert(pkbuf); + ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM); + ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM); + + size = sizeof(ogs_nas_5gmm_header_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + + memcpy(pkbuf->data - size, &message->gmm.h, size); + encoded += size; + + switch(message->gmm.h.message_type) { +""") + +for (k, v) in sorted_msg_list: + if "ies" not in msg_list[k]: + continue; + if float(msg_list[k]["type"]) < 192 and k.find("FROM UE") == -1: + f.write(" case OGS_NAS_%s:\n" % v_upper(k)) + if len(msg_list[k]["ies"]) != 0: + f.write(" size = ogs_nas_encode_%s(pkbuf, message);\n" % v_lower(k)) + f.write(" ogs_assert(size >= 0);\n") + f.write(" encoded += size;\n") + f.write(" break;\n") + +f.write(""" default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->gmm.h.message_type); + ogs_pkbuf_free(pkbuf); + return NULL; + } + + ogs_assert(ogs_pkbuf_push(pkbuf, encoded)); + + pkbuf->len = encoded; + + return pkbuf; +} + +""") + +f.write("""ogs_pkbuf_t *ogs_nas_5gsm_encode(ogs_nas_message_t *message) +{ + ogs_pkbuf_t *pkbuf = NULL; + int size = 0; + int encoded = 0; + + ogs_assert(message); + + /* The Packet Buffer(ogs_pkbuf_t) for NAS message MUST make a HEADROOM. + * When calculating AES_CMAC, we need to use the headroom of the packet. */ + pkbuf = ogs_pkbuf_alloc(NULL, OGS_MAX_SDU_LEN); + ogs_assert(pkbuf); + ogs_pkbuf_reserve(pkbuf, OGS_NAS_HEADROOM); + ogs_pkbuf_put(pkbuf, OGS_MAX_SDU_LEN-OGS_NAS_HEADROOM); + + size = sizeof(ogs_nas_5gsm_header_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(pkbuf->data - size, &message->gsm.h, size); + encoded += size; + + switch(message->gsm.h.message_type) { +""") + +for (k, v) in sorted_msg_list: + if "ies" not in msg_list[k]: + continue; + if float(msg_list[k]["type"]) >= 192: + f.write(" case OGS_NAS_%s:\n" % v_upper(k)) + if len(msg_list[k]["ies"]) != 0: + f.write(" size = ogs_nas_encode_%s(pkbuf, message);\n" % v_lower(k)) + f.write(" ogs_assert(size >= 0);\n") + f.write(" encoded += size;\n") + f.write(" break;\n") + +f.write(""" default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->gsm.h.message_type); + ogs_pkbuf_free(pkbuf); + return NULL; + } + + ogs_assert(ogs_pkbuf_push(pkbuf, encoded)); + pkbuf->len = encoded; + + return pkbuf; +} + +ogs_pkbuf_t *ogs_nas_plain_encode(ogs_nas_message_t *message) +{ + ogs_assert(message); + + ogs_assert(message->gmm.h.extended_protocol_discriminator == + message->gsm.h.extended_protocol_discriminator); + + if (message->gmm.h.extended_protocol_discriminator == + OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_EMM) + return ogs_nas_5gmm_encode(message); + else if (message->gmm.h.extended_protocol_discriminator == + OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_ESM) + return ogs_nas_5gsm_encode(message); + + return NULL; +} +""") + +f.close() + diff --git a/lib/nas/5gs/support/type-list.py b/lib/nas/5gs/support/type-list.py new file mode 100644 index 0000000000..94a68d19a6 --- /dev/null +++ b/lib/nas/5gs/support/type-list.py @@ -0,0 +1,53 @@ + +# Copyright (C) 2019 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 . + +type_list["5GS tracking area identity"]["decode"] = \ +" tracking_area_identity->tac = be16toh(tracking_area_identity->tac);\n\n" +type_list["5GS tracking area identity"]["encode"] = \ +" target.tac = htobe16(tracking_area_identity->tac);\n\n" + +type_list["5GS mobile identity"]["decode"] = \ +" if (mobile_identity->guti.type == OGS_NAS_5GS_MOBILE_IDENTITY_GUTI) {\n" \ +" mobile_identity->guti.m_tmsi = be32toh(mobile_identity->guti.m_tmsi);\n" \ +" } else if (mobile_identity->s_tmsi.type == OGS_NAS_5GS_MOBILE_IDENTITY_S_TMSI) {\n" \ +" mobile_identity->s_tmsi.m_tmsi = be32toh(mobile_identity->s_tmsi.m_tmsi);\n" \ +" }\n\n" +type_list["5GS mobile identity"]["encode"] = \ +" if (mobile_identity->guti.type == OGS_NAS_5GS_MOBILE_IDENTITY_GUTI) {\n" \ +" target.guti.m_tmsi = htobe32(mobile_identity->guti.m_tmsi);\n" \ +" target.guti._0xf = 0xf;\n" \ +" } else if (mobile_identity->s_tmsi.type == OGS_NAS_5GS_MOBILE_IDENTITY_S_TMSI) {\n" \ +" target.s_tmsi.m_tmsi = htobe32(mobile_identity->s_tmsi.m_tmsi);\n" \ +" target.s_tmsi._0xf = 0xf;\n" \ +" }\n\n" + +type_list["Header compression configuration"]["decode"] = \ +" header_compression_configuration->max_cid = be16toh(header_compression_configuration->max_cid);\n\n" +type_list["Header compression configuration"]["encode"] = \ +" target.max_cid = htobe16(header_compression_configuration->max_cid);\n\n" + +type_list["DNN"]["decode"] = \ +" {\n" \ +" char data_network_name[OGS_MAX_DNN_LEN];\n" \ +" dnn->length = ogs_fqdn_parse(data_network_name, dnn->value, dnn->length);\n" \ +" ogs_cpystrn(dnn->value, data_network_name, ogs_min(dnn->length, OGS_MAX_DNN_LEN) + 1);\n" \ +" }\n\n" + +type_list["DNN"]["encode"] = \ +" target.length = ogs_fqdn_build(target.value, dnn->value, dnn->length);\n" \ +" size = target.length + sizeof(target.length);\n\n" diff --git a/lib/nas/5gs/types.h b/lib/nas/5gs/types.h new file mode 100644 index 0000000000..eb3e1efa8a --- /dev/null +++ b/lib/nas/5gs/types.h @@ -0,0 +1,959 @@ +/* + * Copyright (C) 2019 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 . + */ + +#if !defined(OGS_NAS_INSIDE) && !defined(OGS_NAS_COMPILATION) +#error "This header cannot be included directly." +#endif + +#ifndef OGS_NAS_5GS_TYPES_H +#define OGS_NAS_5GS_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* 9.11.2.1A DNN + * O TLV 3-102 */ +typedef struct ogs_nas_dnn_s { + uint8_t length; + char value[OGS_MAX_DNN_LEN]; +} ogs_nas_dnn_t; + +/* 9.11.2.2 EAP message + * O TLV-E 7-1503 */ +typedef struct ogs_nas_eap_message_s { + uint16_t length; + uint8_t *buffer; +} ogs_nas_eap_message_t; + +/* 9.11.2.8.1 S-NSSAI + * O TLV 3-10 */ +#define OGS_NAS_S_NSSAI_SST_LEN 1 +#define OGS_NAS_S_NSSAI_SST_AND_MAPPED_HPLMN_SST_LEN 2 +#define OGS_NAS_S_NSSAI_SST_AND_SD 4 +#define OGS_NAS_S_NSSAI_SST_SD_AND_MAPPED_HPLMN_SST_LEN 5 +#define OGS_NAS_MAX_S_NSSAI_LEN 8 +typedef struct ogs_nas_s_nssai_s { + uint8_t length; + uint32_t sst_sd; + uint32_t mapped_sst_sd; +} __attribute__ ((packed)) ogs_nas_s_nssai_t; + +/* 9.11.3.1 5GMM capability + * O TLV 3-15 */ +typedef struct ogs_nas_5gmm_capability_s { + uint8_t length; +ED4(uint8_t spare:5;, + uint8_t lpp:1;, + uint8_t ho:1;, + uint8_t s1:1;) +} __attribute__ ((packed)) ogs_nas_5gmm_capability_t; + +/* 9.11.3.2 5GMM cause + * M V 1 */ +#define OGS_NAS_GMM_ILLEGAL_UE 3 +#define OGS_NAS_GMM_PEI_NOT_ACCEPTED 5 +#define OGS_NAS_GMM_ILLEGAL_ME 6 +#define OGS_NAS_GMM_5GS_SERVICES_NOT_ALLOWED 7 +#define OGS_NAS_GMM_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK 9 +#define OGS_NAS_GMM_IMPLICITLY_DE_REGISTERED 10 +#define OGS_NAS_GMM_PLMN_NOT_ALLOWED 11 +#define OGS_NAS_GMM_TRACKING_AREA_NOT_ALLOWED 12 +#define OGS_NAS_GMM_ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA 13 +#define OGS_NAS_GMM_NO_SUITABLE_CELLS_IN_TRACKING_AREA 15 +#define OGS_NAS_GMM_MAC_FAILURE 20 +#define OGS_NAS_GMM_SYNCH_FAILURE 21 +#define OGS_NAS_GMM_CONGESTION 22 +#define OGS_NAS_GMM_UE_SECURITY_CAPABILITIES_MISMATCH 23 +#define OGS_NAS_GMM_SECURITY_MODE_REJECTED_UNSPECIFIED 24 +#define OGS_NAS_GMM_NON_5G_AUTHENTICATION_UNACCEPTABLE 26 +#define OGS_NAS_GMM_N1_MODE_NOT_ALLOWED 27 +#define OGS_NAS_GMM_RESTRICTED_SERVICE_AREA 28 +#define OGS_NAS_GMM_LADN_NOT_AVAILABLE 43 +#define OGS_NAS_GMM_MAXIMUM_NUMBER_OF_PDU_SESSIONS_REACHED 65 +#define OGS_NAS_GMM_INSUFFICIENT_RESOURCES_FOR_SPECIFIC_SLICE_AND_DNN 67 +#define OGS_NAS_GMM_INSUFFICIENT_RESOURCES_FOR_SPECIFIC_SLICE 69 +#define OGS_NAS_GMM_NGKSI_ALREADY_IN_USE 71 +#define OGS_NAS_GMM_NON_3GPP_ACCESS_TO_5GCN_NOT_ALLOWED 72 +#define OGS_NAS_GMM_SERVING_NETWORK_NOT_AUTHORIZED 73 +#define OGS_NAS_GMM_PAYLOAD_WAS_NOT_FORWARDED 90 +#define OGS_NAS_GMM_DNN_NOT_SUPPORTED_OR_NOT_SUBSCRIBED_IN_THE_SLICE 91 +#define OGS_NAS_GMM_INSUFFICIENT_USER_PLANE_RESOURCES_FOR_THE_PDU_SESSION 92 +#define OGS_NAS_GMM_SEMANTICALLY_INCORRECT_MESSAGE 95 +#define OGS_NAS_GMM_INVALID_MANDATORY_INFORMATION 96 +#define OGS_NAS_GMM_MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED 97 +#define OGS_NAS_GMM_MESSAGE_TYPE_NOT_COMPATIBLE_WITH_THE_PROTOCOL_STATE 98 +#define OGS_NAS_GMM_INFORMATION_ELEMENT_NON_EXISTENT_OR_NOT_IMPLEMENTED 99 +#define OGS_NAS_GMM_CONDITIONAL_IE_ERROR 100 +#define OGS_NAS_GMM_MESSAGE_NOT_COMPATIBLE_WITH_THE_PROTOCOL_STATE 101 +#define OGS_NAS_GMM_PROTOCOL_ERROR_UNSPECIFIED 111 +typedef uint8_t ogs_nas_5gmm_cause_t; + +/* 9.11.3.2A 5GS DRX parameters + * O TLV 3 */ +#define OGS_NAS_DRX_CYCLE_PARAMETER_T_32 1 +#define OGS_NAS_DRX_CYCLE_PARAMETER_T_64 2 +#define OGS_NAS_DRX_CYCLE_PARAMETER_T_128 3 +#define OGS_NAS_DRX_CYCLE_PARAMETER_T_256 4 +typedef struct ogs_nas_5gs_drx_parameters_s { + uint8_t length; +ED2(uint8_t spare:4;, + uint8_t value:4;) +} __attribute__ ((packed)) ogs_nas_5gs_drx_parameters_t; + +/* 9.11.3.3 5GS identity type + * M V 1/2 */ +#define OGS_NAS_5GS_MOBILE_IDENTITY_IS_NOT_AVAILABLE 0 +#define OGS_NAS_5GS_MOBILE_IDENTITY_SUCI 1 +#define OGS_NAS_5GS_MOBILE_IDENTITY_GUTI 2 +#define OGS_NAS_5GS_MOBILE_IDENTITY_IMEI 3 +#define OGS_NAS_5GS_MOBILE_IDENTITY_S_TMSI 4 +#define OGS_NAS_5GS_MOBILE_IDENTITY_IMEISV 5 +typedef struct ogs_nas_5gs_identity_type_s { +ED3(uint8_t type:4;, + uint8_t spare:1;, + uint8_t value:3;) +} __attribute__ ((packed)) ogs_nas_5gs_identity_type_t; + +/* 9.11.3.4 5GS mobile identity + * M LV-E 6-n */ +#define OGS_NAS_GET_AMF_SET_ID(_iDentity) \ + ((_iDentity)->amf_set_id2 + ((_iDentity)->amf_set_id1 << 2)) +#define OGS_NAS_SET_AMF_SET_ID(_iDentity, _aMFSetId) \ + do { \ + ogs_assert((_iDentity)); \ + (_iDentity)->amf_set_id1 = (_aMFSetId >> 2) & 0x000f; \ + (_iDentity)->amf_set_id2 = _aMFSetId & 0x0003; \ + } while(0) +typedef struct ogs_nas_5gs_mobile_identity_guti_s { +ED3(uint8_t _0xf:4;, + uint8_t spare:1;, + uint8_t type:3;) + ogs_nas_plmn_id_t nas_plmn_id; + uint16_t amf_region_id; + uint8_t amf_set_id1; +ED2(uint8_t amf_set_id2:2;, + uint8_t amf_pointer:6;) + uint32_t m_tmsi; +} __attribute__ ((packed)) ogs_nas_5gs_mobile_identity_guti_t; +typedef struct ogs_nas_5gs_mobile_identity_s_tmsi_s { +ED3(uint8_t _0xf:4;, + uint8_t spare:1;, + uint8_t type:3;) + uint16_t amf_region_id; + uint8_t amf_set_id1; +ED2(uint8_t amf_set_id2:2;, + uint8_t amf_pointer:6;) + uint32_t m_tmsi; +} __attribute__ ((packed)) ogs_nas_5gs_mobile_identity_s_tmsi_t; +typedef struct ogs_nas_5gs_mobile_identity_s { + uint16_t length; + union { + ogs_nas_mobile_identity_imsi_t imsi; + ogs_nas_5gs_mobile_identity_guti_t guti; + ogs_nas_5gs_mobile_identity_s_tmsi_t s_tmsi; + ogs_nas_mobile_identity_imei_t imei; + ogs_nas_mobile_identity_imeisv_t imeisv; + }; +} ogs_nas_5gs_mobile_identity_t; + +/* 9.11.3.5 5GS network feature support + * M LV 2 */ +typedef struct ogs_nas_5gs_network_feature_support_s { + uint8_t length; +ED6(uint8_t mpsi:1;, + uint8_t iwk_n26:1;, + uint8_t emf:2;, + uint8_t msc:2;, + uint8_t ims_vops_n3gpp:1;, + uint8_t ims_vops_3gpp:1;) +ED3(uint8_t spare:6;, + uint8_t mcsi:1;, + uint8_t emcn :1;) +} ogs_nas_5gs_network_feature_support_t; + +/* 9.11.3.6 5GS registration result + * O TLV 3-5 */ +#define OGS_NAS_5GS_REGISTRATION_TYPE_3GPP_ACCESS 0 +#define OGS_NAS_5GS_REGISTRATION_TYPE_NON_3GPP_ACCESS 1 +#define OGS_NAS_5GS_REGISTRATION_TYPE_3GPP_AND_NON_3GPP_ACCESS 2 +typedef struct ogs_nas_5gs_registration_result_s { + uint8_t length; +ED3(uint8_t spare:4;, + uint8_t sms_allowed:1;, + uint8_t value:3;) +} ogs_nas_5gs_registration_result_t; + +/* 9.11.3.7 5GS registration type + * M V 1/2 */ +#define OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL 1 +#define OGS_NAS_5GS_REGISTRATION_TYPE_MOBILITY_UPDATING 2 +#define OGS_NAS_5GS_REGISTRATION_TYPE_PERIODIC_UPDATING 3 +#define OGS_NAS_5GS_REGISTRATION_TYPE_EMERGENCY 4 +typedef struct ogs_nas_5gs_registration_type_s { +ED3(uint8_t type:4;, + uint8_t follow_on_request:1;, + uint8_t value:3;) +} ogs_nas_5gs_registration_type_t; + +/* 9.11.3.8 5GS tracking area identity + * O TV 6 */ +typedef ogs_nas_tracking_area_identity_t ogs_nas_5gs_tracking_area_identity_t; + +/* 9.11.3.9 5GS tracking area identity list + * O TLV 9-114 */ +typedef ogs_nas_tracking_area_identity_list_t ogs_nas_5gs_tracking_area_identity_list_t; + +/* 9.11.3.9A 5GS update type + * O TLV 3 */ +typedef struct ogs_nas_5gs_update_type_s { + uint8_t length; +ED6(uint8_t spare:2;, + uint8_t pnb_ciot_eps:1;, + uint8_t pnb_ciot_5gs:1;, + uint8_t ng_ran_rcu:1;, + uint8_t sms_requested:1;, + uint8_t amf_pointer_value:2;) +} __attribute__ ((packed)) ogs_nas_5gs_update_type_t; + +/* 9.11.3.10 ABBA + * M LV 3-n */ +#define OGS_NAS_ABBA_LEN 255 +typedef struct ogs_nas_abba_s { + uint8_t length; + uint8_t abba[OGS_NAS_ABBA_LEN]; +} ogs_nas_abba_t; + +/* 9.11.3.11 Access Type + * M V 1/2 */ +#define OGS_NAS_NOTIFICATION_ACCESS_TYPE_3GPP 1 +#define OGS_NAS_NOTIFICATION_ACCESS_TYPE_NON_3GPP 2 +typedef struct ogs_nas_access_type_s { +ED2(uint8_t spare:5;, + uint8_t value:3;) +} __attribute__ ((packed)) ogs_nas_access_type_t; + +/* 9.11.3.12 Additional 5G security information + * O TLV 3 */ +typedef struct ogs_nas_additional_5g_security_information_s { + uint8_t length; +ED3(uint8_t spare:6;, + uint8_t rinmr:1;, + uint8_t hdr:1;) +} __attribute__ ((packed)) ogs_nas_additional_5g_security_information_t; + +/* 9.11.3.12A Additional information requested + * O TLV 3 */ +typedef struct ogs_nas_additional_information_requested_s { + uint8_t length; +ED2(uint8_t spare:7;, + uint8_t cipher_key:1;) +} ogs_nas_additional_information_requested_t; + +/* 9.11.3.13 Allowed PDU session status + * O TLV 4-34 */ +typedef struct ogs_nas_allowed_pdu_session_status_s { + uint8_t length; +ED8(uint8_t psi7:1;, + uint8_t psi6:1;, + uint8_t psi5:1;, + uint8_t psi4:1;, + uint8_t psi3:1;, + uint8_t psi2:1;, + uint8_t psi1:1;, + uint8_t hdr0:1;) +ED8(uint8_t psi15:1;, + uint8_t psi14:1;, + uint8_t psi13:1;, + uint8_t psi12:1;, + uint8_t psi11:1;, + uint8_t psi10:1;, + uint8_t psi9:1;, + uint8_t psi8:1;) +} __attribute__ ((packed)) ogs_nas_allowed_pdu_session_status_t; + +/* 9.11.3.18 Configuration update indication + * O TV 1 */ +typedef struct ogs_nas_configuration_update_indication_s { +ED4(uint8_t type:4;, + uint8_t spare:2;, + uint8_t red:1;, + uint8_t ack:1;) +} __attribute__ ((packed)) ogs_nas_configuration_update_indication_t; + +/* 9.11.3.18A CAG information list + * O TLV-E 3-n */ +typedef struct ogs_nas_cag_information_list_s { + uint8_t length; + uint8_t *buffer; +} ogs_nas_cag_information_list_t; + +/* 9.11.3.18B CIoT small data container + * O TLV 4-257 */ +#define OGS_NAS_MAX_CIOT_SMALL_DATA_CONTAINER_LEN 254 +typedef struct ogs_nas_ciot_small_data_container_s { + uint8_t length; +ED3(uint8_t data_type:3;, + uint8_t ddx:2;, + uint8_t pdu_session_identity:1;) + uint8_t buffer[OGS_NAS_MAX_CIOT_SMALL_DATA_CONTAINER_LEN]; +} __attribute__ ((packed)) ogs_nas_ciot_small_data_container_t; + +/* 9.11.3.18C Ciphering key data + * O TLV-E x-n */ +typedef struct ogs_nas_ciphering_key_data_s { + uint8_t length; + uint8_t *buffer; +} ogs_nas_ciphering_key_data_t; + +/* 9.11.3.18D Control plane service type + * M V 1/2 */ +typedef struct ogs_nas_control_plane_service_type_s { +ED3(uint8_t type:4;, + uint8_t spare:1;, + uint8_t value:1;) +} __attribute__ ((packed)) ogs_nas_control_plane_service_type_t; + +/* 9.11.3.20 De-registration type + * M V 1/2 */ +typedef struct ogs_nas_de_registration_type_s { +ED4(uint8_t type:4;, + uint8_t switch_off:1;, + uint8_t re_registration_required:1;, + uint8_t value:1;) +} __attribute__ ((packed)) ogs_nas_de_registration_type_t; + +/* 9.11.3.24 EPS NAS message container + * O TLV-E 4-n */ +typedef struct ogs_nas_eps_nas_message_container_s { + uint16_t length; + uint8_t *buffer; +} ogs_nas_eps_nas_message_container_t; + +/* 9.11.3.25 EPS NAS security algorithms + * O TV 2 */ +#define OGS_NAS_SECURITY_ALGORITHMS_EIA0 0 +#define OGS_NAS_SECURITY_ALGORITHMS_128_EIA1 1 +#define OGS_NAS_SECURITY_ALGORITHMS_128_EIA2 2 +#define OGS_NAS_SECURITY_ALGORITHMS_128_EIA3 3 +#define OGS_NAS_SECURITY_ALGORITHMS_EEA0 0 +#define OGS_NAS_SECURITY_ALGORITHMS_128_EEA1 1 +#define OGS_NAS_SECURITY_ALGORITHMS_128_EEA2 2 +#define OGS_NAS_SECURITY_ALGORITHMS_128_EEA3 3 +typedef struct ogs_nas_eps_nas_security_algorithms_s { +ED4(uint8_t spare1:1;, + uint8_t type_of_ciphering_algorithm:3;, + uint8_t spare2:1;, + uint8_t type_of_integrity_protection_algorithm:3;) +} __attribute__ ((packed)) ogs_nas_eps_nas_security_algorithms_t; + +/* 9.11.3.29 LADN indication + * O TLV-E 3-811 */ +typedef struct ogs_nas_ladn_indication_s { + uint16_t length; + uint8_t *buffer; +} ogs_nas_ladn_indication_t; + +/* 9.11.3.30 LADN information + * O TLV-E 12-1715 */ +typedef struct ogs_nas_ladn_information_s { + uint16_t length; + uint8_t *buffer; +} ogs_nas_ladn_information_t; + +/* 9.11.3.31 MICO indication + * O TV 1 */ +typedef struct ogs_nas_mico_indication_s { +ED3(uint8_t type:4;, + uint8_t spare:3;, + uint8_t raai:1;) +} __attribute__ ((packed)) ogs_nas_mico_indication_t; + +/* 9.11.3.31A MA PDU session information + * O TV 1 */ +typedef struct ogs_nas_ma_pdu_session_information_s { +ED2(uint8_t type:4;, + uint8_t value:4;) +} __attribute__ ((packed)) ogs_nas_ma_pdu_session_information_t; + +/* 9.11.3.31B Mapped NSSAI + * O TLV 3-42 */ +#define OGS_NAS_MAX_MAPPED_NSSAI_LEN 40 +typedef struct ogs_nas_mapped_nssai_s { + uint8_t length; + uint8_t buffer[OGS_NAS_MAX_MAPPED_NSSAI_LEN]; +} ogs_nas_mapped_nssai_t; + +/* 9.11.3.33 message container + * O TLV-E 4-n */ +typedef struct ogs_nas_message_container_s { + uint16_t length; + uint8_t *buffer; +} __attribute__ ((packed)) ogs_nas_message_container_t; + +/* 9.11.3.34 security algorithms + * M V 1 */ +#define OGS_NAS_SECURITY_ALGORITHMS_IA0 0 +#define OGS_NAS_SECURITY_ALGORITHMS_128_IA1 1 +#define OGS_NAS_SECURITY_ALGORITHMS_128_IA2 2 +#define OGS_NAS_SECURITY_ALGORITHMS_128_IA3 3 +#define OGS_NAS_SECURITY_ALGORITHMS_IA4 4 +#define OGS_NAS_SECURITY_ALGORITHMS_IA5 5 +#define OGS_NAS_SECURITY_ALGORITHMS_IA6 6 +#define OGS_NAS_SECURITY_ALGORITHMS_IA7 7 +#define OGS_NAS_SECURITY_ALGORITHMS_EA0 0 +#define OGS_NAS_SECURITY_ALGORITHMS_128_EA1 1 +#define OGS_NAS_SECURITY_ALGORITHMS_128_EA2 2 +#define OGS_NAS_SECURITY_ALGORITHMS_128_EA3 3 +#define OGS_NAS_SECURITY_ALGORITHMS_EA4 4 +#define OGS_NAS_SECURITY_ALGORITHMS_EA5 5 +#define OGS_NAS_SECURITY_ALGORITHMS_EA6 6 +#define OGS_NAS_SECURITY_ALGORITHMS_EA7 7 +typedef struct ogs_nas_security_algorithms_s { +ED4(uint8_t spare1:1;, + uint8_t type_of_ciphering_algorithm:3;, + uint8_t spare2:1;, + uint8_t type_of_integrity_protection_algorithm:3;) +} __attribute__ ((packed)) ogs_nas_security_algorithms_t; + +/* 9.11.3.36 Network slicing indication + * O TV 1 */ +typedef struct ogs_nas_network_slicing_indication_s { +ED4(uint8_t type:4;, + uint8_t spare:2;, + uint8_t dcni:1;, + uint8_t nssci:1;) +} __attribute__ ((packed)) ogs_nas_network_slicing_indication_t; + +/* 9.11.3.37 NSSAI + * O TLV 4-72 */ +#define MAX_NAS_NSSAI_LEN 72 +typedef struct ogs_nas_nssai_s { + uint8_t length; + uint8_t buffer[MAX_NAS_NSSAI_LEN]; +} __attribute__ ((packed)) ogs_nas_nssai_t; + +/* 9.11.3.37A NSSAI inclusion mode + * O TV 1 */ +#define OGS_NAS_NSSAI_INCLUSION_MODE_A 0 +#define OGS_NAS_NSSAI_INCLUSION_MODE_B 1 +#define OGS_NAS_NSSAI_INCLUSION_MODE_C 2 +#define OGS_NAS_NSSAI_INCLUSION_MODE_D 3 +typedef struct ogs_nas_nssai_inclusion_mode_s { +ED3(uint8_t type:4;, + uint8_t spare:2;, + uint8_t value:2;) +} __attribute__ ((packed)) ogs_nas_nssai_inclusion_mode_t; + +/* 9.11.3.38 Operator-defined access category definitions + * O TLV-E 3-n */ +typedef struct ogs_nas_operator_defined_access_category_definitions_s { + uint16_t length; + uint8_t *buffer; +} ogs_nas_operator_defined_access_category_definitions_t; + +/* 9.11.3.39 Payload container + * O TLV-E 4-65535 */ +typedef struct ogs_nas_payload_container_s { + uint16_t length; + uint8_t *buffer; +} ogs_nas_payload_container_t; + +/* 9.11.3.40 Payload container type + * O TV 1 */ +typedef struct ogs_nas_payload_container_type_s { +ED2(uint8_t type:4;, + uint8_t value:4;) +} __attribute__ ((packed)) ogs_nas_payload_container_type_t; + +/* 9.11.3.41 PDU session identity 2 + * C TV 2 */ +typedef struct ogs_nas_pdu_session_identity_2_s { + uint8_t type; + uint8_t value; +} __attribute__ ((packed)) ogs_nas_pdu_session_identity_2_t; + +/* 9.11.3.42 PDU session reactivation result + * O TLV 4-34 */ +typedef ogs_nas_allowed_pdu_session_status_t ogs_nas_pdu_session_reactivation_result_t; + +/* 9.11.3.43 PDU session reactivation result error cause + * O TLV-E 5-515 */ +typedef struct ogs_nas_pdu_session_reactivation_result_error_cause_s { + uint8_t length; + uint8_t *buffer; +} ogs_nas_pdu_session_reactivation_result_error_cause_t; + +/* 9.11.3.44 PDU session status + * O TLV 4-34 */ +typedef ogs_nas_allowed_pdu_session_status_t ogs_nas_pdu_session_status_t; + +/* 9.11.3.46 Rejected NSSAI + * O TLV 4-42 */ +#define OGS_MAX_NAS_REJECTED_NSSAI_LEN 40 +typedef struct ogs_nas_rejected_nssai_s { + uint8_t length; + uint8_t buffer[OGS_MAX_NAS_REJECTED_NSSAI_LEN]; +} ogs_nas_rejected_nssai_t; + +/* 9.11.3.47 Request type + * O TV 1 */ +#define OGS_NAS_REQUEST_TYPE_INITIAL 1 +#define OGS_NAS_REQUEST_TYPE_EXISTING_PDU_SESSION 2 +#define OGS_NAS_REQUEST_TYPE_INITIAL_EMERGENCY 3 +#define OGS_NAS_REQUEST_TYPE_EXISTING_PDU_SESSION_EMERGENCY 4 +#define OGS_NAS_REQUEST_TYPE_MODIFICATION 5 +typedef struct ogs_nas_request_type_s { +ED3(uint8_t type:4;, + uint8_t spare:1;, + uint8_t value:3;) +} __attribute__ ((packed)) ogs_nas_request_type_t; + +/* 9.11.3.49 Service area list + * O TLV 6-114 */ +#define OGS_NAS_MAX_SERVICE_AREA_LIST_LEN 112 +typedef struct ogs_nas_service_area_list_s { + uint8_t length; + uint8_t buffer[112]; +} ogs_nas_service_area_list_t; + +/* 9.11.3.50 Service type + * M V 1/2 */ +#define OGS_NAS_SERVICE_TYPE_SIGNALLING 0 +#define OGS_NAS_SERVICE_TYPE_DATA 1 +#define OGS_NAS_SERVICE_TYPE_MOBILE_TERMINATED_SERVICES 2 +#define OGS_NAS_SERVICE_TYPE_EMERGENCY_SERVICES 3 +#define OGS_NAS_SERVICE_TYPE_EMERGENCY_SERVICES_FALLBACK 4 +#define OGS_NAS_SERVICE_TYPE_HIGH_PRIORITY_ACCESS 5 +#define OGS_NAS_SERVICE_TYPE_ELEVATED_SIGNALLING 6 +/* 7(unused) shall be interpreted as "signalling", if received by the network + * 8(unused) shall be interpreted as "signalling", if received by the network + * 9(unused) shall be interpreted as "signalling", if received by the network + * 10(unused) shall be interpreted as "data", if received by the network + * 11(unused) shall be interpreted as "data", if received by the network */ +typedef struct ogs_nas_service_type_s { +ED2(uint8_t type:4;, + uint8_t value:4;) +} __attribute__ ((packed)) ogs_nas_service_type_t; + +/* 9.11.3.50A SMS indication + * O TV 1 */ +typedef struct ogs_nas_sms_indication_s { +ED2(uint8_t type:4;, + uint8_t sai:4;) +} ogs_nas_sms_indication_t; + +/* 9.11.3.51 SOR transparent container + * O TLV-E 20-n */ +typedef struct ogs_nas_sor_transparent_container_s { + uint8_t length; + uint8_t *buffer; +} ogs_nas_sor_transparent_container_t; + +/* 9.11.3.54 UE security capability + * O TLV 4-10 */ +typedef struct ogs_nas_ue_security_capability_s { + uint8_t length; + union { + struct { + ED8(uint8_t ea0_5g:1;, + uint8_t ea1_5g_128:1;, + uint8_t ea2_5g_128:1;, + uint8_t ea3_5g_128:1;, + uint8_t ea4_5g:1;, + uint8_t ea5_5g:1;, + uint8_t ea6_5g:1;, + uint8_t ea7_5g:1;) + }; + uint8_t ea_5g; + }; + union { + struct { + ED8(uint8_t ia0_5g:1;, + uint8_t ia1_5g_128:1;, + uint8_t ia2_5g_128:1;, + uint8_t ia3_5g_128:1;, + uint8_t ia4_5g:1;, + uint8_t ia5_5g:1;, + uint8_t ia6_5g:1;, + uint8_t ia7_5g:1;) + }; + uint8_t ia_5g; + }; + union { + struct { + ED8(uint8_t eea0:1;, + uint8_t eea1_128:1;, + uint8_t eea2_128:1;, + uint8_t eea3_128:1;, + uint8_t eea4:1;, + uint8_t eea5:1;, + uint8_t eea6:1;, + uint8_t eea7:1;) + }; + uint8_t ea; + }; + union { + struct { + ED8(uint8_t eia0:1;, + uint8_t eia1_128:1;, + uint8_t eia2_128:1;, + uint8_t eia3_128:1;, + uint8_t eia4:1;, + uint8_t eia5:1;, + uint8_t eia6:1;, + uint8_t eia7:1;) + }; + uint8_t ia; + }; +} __attribute__ ((packed)) ogs_nas_ue_security_capability_t; + +/* 9.11.3.55 UE usage setting + * O TLV 3 */ +typedef struct ogs_nas_ue_usage_setting_s { + uint8_t length; +ED2(uint8_t spare:6;, + uint8_t value:2;) +} __attribute__ ((packed)) ogs_nas_ue_usage_setting_t; + +/* 9.11.3.56 UE status + * O TLV 3 */ +typedef struct ogs_nas_ue_status_s { + uint8_t length; +ED3(uint8_t spare:6;, + uint8_t n1:1;, + uint8_t s1:1;) +} __attribute__ ((packed)) ogs_nas_ue_status_t; + +/* 9.11.3.57 Uplink data status + * O TLV 4-34 */ +typedef ogs_nas_allowed_pdu_session_status_t ogs_nas_uplink_data_status_t; + +/* 9.11.3.68 UE radio capability ID + * O TLV 3-n */ +#define OGS_NAS_MAX_UE_RADIO_CAPABILITY_ID_LEN 255 +typedef struct ogs_nas_ue_radio_capability_id_s { + uint8_t length; + uint8_t buffer[OGS_NAS_MAX_UE_RADIO_CAPABILITY_ID_LEN]; +} ogs_nas_ue_radio_capability_id_t; + +/* 9.11.3.69 UE radio capability ID deletion infication + * O TV 1 */ +typedef struct ogs_nas_ue_radio_capability_id_deletion_indication_s { +ED3(uint8_t type:4;, + uint8_t spare:1;, + uint8_t value:3;) +} __attribute__ ((packed)) ogs_nas_ue_radio_capability_id_deletion_indication_t; + +/* 9.11.3.70 Truncated 5G-S-TMSI configuration + * O TLV 3 */ +typedef struct ogs_nas_truncated_5g_s_tmsi_configuration_s { + uint8_t length; +ED2(uint8_t amf_set_id:4;, + uint8_t amf_pointer_value:4;) +} __attribute__ ((packed)) ogs_nas_truncated_5g_s_tmsi_configuration_t; + +/* 9.11.4.1 5GSM capability + * O TLV 3-15 */ +typedef struct ogs_nas_5gsm_capability_s { + uint8_t length; +ED3(uint8_t spare:6;, + uint8_t mh6_pdu:1;, + uint8_t rqos:1;) +} __attribute__ ((packed)) ogs_nas_5gsm_capability_t; + +/* 9.11.4.2 5GSM cause + * O TV 2 */ +#define OGS_NAS_GSM_OPERATOR_DETERMINED_BARRING 8 +#define OGS_NAS_GSM_INSUFFICIENT_RESOURCES 26 +#define OGS_NAS_GSM_MISSING_OR_UNKNOWN_DNN 27 +#define OGS_NAS_GSM_UNKNOWN_PDU_SESSION_TYPE 28 +#define OGS_NAS_GSM_USER_AUTHENTICATION_OR_AUTHORIZATION_FAILED 29 +#define OGS_NAS_GSM_REQUEST_REJECTED_UNSPECIFIED 31 +#define OGS_NAS_GSM_SERVICE_OPTION_NOT_SUPPORTED 32 +#define OGS_NAS_GSM_REQUESTED_SERVICE_OPTION_NOT_SUBSCRIBED 33 +#define OGS_NAS_GSM_SERVICE_OPTION_TEMPORARILY_OUT_OF_ORDER 34 +#define OGS_NAS_GSM_PTI_ALREADY_IN_USE 35 +#define OGS_NAS_GSM_REGULAR_DEACTIVATION 36 +#define OGS_NAS_GSM_NETWORK_FAILURE 38 +#define OGS_NAS_GSM_REACTIVATION_REQUESTED 39 +#define OGS_NAS_GSM_INVALID_PDU_SESSION_IDENTITY 43 +#define OGS_NAS_GSM_SEMANTIC_ERRORS_IN_PACKET_FILTERS 44 +#define OGS_NAS_GSM_SYNTACTICAL_ERROR_IN_PACKET_FILTERS 45 +#define OGS_NAS_GSM_OUT_OF_LADN_SERVICE_AREA 46 +#define OGS_NAS_GSM_PTI_MISMATCH 47 +#define OGS_NAS_GSM_PDU_SESSION_TYPE_IPV4_ONLY_ALLOWED 50 +#define OGS_NAS_GSM_PDU_SESSION_TYPE_IPV6_ONLY_ALLOWED 51 +#define OGS_NAS_GSM_PDU_SESSION_DOES_NOT_EXIST 54 +#define OGS_NAS_GSM_INSUFFICIENT_RESOURCES_FOR_SPECIFIC_SLICE_AND_DNN 67 +#define OGS_NAS_GSM_NOT_SUPPORTED_SSC_MODE 68 +#define OGS_NAS_GSM_INSUFFICIENT_RESOURCES_FOR_SPECIFIC_SLICE 69 +#define OGS_NAS_GSM_MISSING_OR_UNKNOWN_DNN_IN_A_SLICE 70 +#define OGS_NAS_GSM_INVALID_PTI_VALUE 81 +#define OGS_NAS_GSM_MAXIMUM_DATA_RATE_PER_UE_FOR_USER_PLANE_INTEGRITY_PROTECTION_IS_TOO_LOW 82 +#define OGS_NAS_GSM_SEMANTIC_ERROR_IN_THE_QOS_OPERATION 83 +#define OGS_NAS_GSM_SYNTACTICAL_ERROR_IN_THE_QOS_OPERATION 84 +#define OGS_NAS_GSM_INVALID_MAPPED_EPS_BEARER_IDENTITY 85 +#define OGS_NAS_GSM_SEMANTICALLY_INCORRECT_MESSAGE 95 +#define OGS_NAS_GSM_INVALID_MANDATORY_INFORMATION 96 +#define OGS_NAS_GSM_MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED 97 +#define OGS_NAS_GSM_MESSAGE_TYPE_NOT_COMPATIBLE_WITH_THE_PROTOCOL_STATE 98 +#define OGS_NAS_GSM_INFORMATION_ELEMENT_NON_EXISTENT_OR_NOT IMPLEMENTED 99 +#define OGS_NAS_GSM_CONDITIONAL_IE_ERROR 100 +#define OGS_NAS_GSM_MESSAGE_NOT_COMPATIBLE_WITH_THE_PROTOCOL_STATE 101 +#define OGS_NAS_GSM_PROTOCOL_ERROR_UNSPECIFIED 111 +typedef uint8_t ogs_nas_5gsm_cause_t; + +/* 9.11.4.21 5GSM congestion re-attempt indicator + * O TLV 3 */ +typedef struct ogs_nas_5gsm_congestion_re_attempt_indicator_s { + uint8_t length; +ED2(uint8_t spare:7;, + uint8_t abo:1;) +} __attribute__ ((packed)) ogs_nas_5gsm_congestion_re_attempt_indicator_t; + +/* 9.11.4.3 Always-on PDU session indication + * O TV 1 */ +typedef struct ogs_nas_always_on_pdu_session_indication_s { +ED3(uint8_t type:4;, + uint8_t spare:1;, + uint8_t apsi:3;) +} __attribute__ ((packed)) ogs_nas_always_on_pdu_session_indication_t; + +/* 9.11.4.4 Always-on PDU session requested + * O TV 1 */ +typedef struct ogs_nas_always_on_pdu_session_requested_s { +ED3(uint8_t type:4;, + uint8_t spare:3;, + uint8_t apsr:1;) +} __attribute__ ((packed)) ogs_nas_always_on_pdu_session_requested_t; + +/* 9.11.4.5 Allowed SSC mode + * O TV 1 */ +typedef struct ogs_nas_allowed_ssc_mode_s { +ED5(uint8_t type:4;, + uint8_t spare:1;, + uint8_t ssc3:1;, + uint8_t ssc2:1;, + uint8_t ssc1:1;) +} __attribute__ ((packed)) ogs_nas_allowed_ssc_mode_t; + +/* 9.11.4.7 Integrity protection maximum data rate + * M V 2 */ +typedef struct ogs_nas_integrity_protection_maximum_data_rate_s { + uint8_t ul; + uint8_t dl; +} __attribute__ ((packed)) ogs_nas_integrity_protection_maximum_data_rate_t; + +/* 9.11.4.8 Mapped EPS bearer contexts + * O TLV-E 7-65535 */ +typedef struct ogs_nas_mapped_eps_bearer_contexts_s { + uint8_t length; + uint8_t *buffer; +} __attribute__ ((packed)) ogs_nas_mapped_eps_bearer_contexts_t; + +/* 9.11.4.9 Maximum number of supported packet filters + * O TV 3 */ +typedef struct ogs_nas_maximum_number_of_supported_packet_filters_s { + uint8_t max1; +ED2(uint8_t max2:3;, + uint8_t spare:5;) +} __attribute__ ((packed)) ogs_nas_maximum_number_of_supported_packet_filters_t; + +/* 9.11.4.10 PDU address + * O TLV 7, 11 or 15 */ +#define OGS_NAS_PDU_ADDRESS_TYPE_IPV4 1 +#define OGS_NAS_PDU_ADDRESS_TYPE_IPV6 2 +#define OGS_NAS_PDU_ADDRESS_TYPE_IPV4V6 3 +typedef struct ogs_nas_pdu_address_s { + uint8_t length; +ED2(uint8_t reserved:5;, + uint8_t type:3;) + union { + uint32_t addr; + struct { + uint8_t addr6[OGS_IPV6_LEN>>1]; /* Interface Identifer Only */ + }; + struct { + uint8_t addr6[OGS_IPV6_LEN>>1]; /* Interface Identifer Only */ + uint32_t addr; + } both; + }; +} __attribute__ ((packed)) ogs_nas_pdu_address_t; + +/* 9.11.4.11 PDU session type + * O TV 1 */ +#define OGS_NAS_PDU_SESSION_TYPE_IPV4 1 +#define OGS_NAS_PDU_SESSION_TYPE_IPV6 2 +#define OGS_NAS_PDU_SESSION_TYPE_IPV4V6 3 +#define OGS_NAS_PDU_SESSION_TYPE_UNSTRUCTURED 4 +#define OGS_NAS_PDU_SESSION_TYPE_ETHERNET 5 +typedef struct ogs_nas_pdu_session_type_s { +ED3(uint8_t type:4;, + uint8_t spare:1;, + uint8_t value:3;) +} __attribute__ ((packed)) ogs_nas_pdu_session_type_t; + +/* 9.11.4.12 QoS flow descriptions + * O TLV-E 6-65535 */ +typedef struct ogs_nas_qos_flow_descriptions_s { + uint8_t length; + uint8_t *buffer; +} ogs_nas_qos_flow_descriptions_t; + +/* 9.11.4.13 QoS rules + * M LV-E 6-65535 */ +typedef struct ogs_nas_qos_rules_s { + uint8_t length; + uint8_t *buffer; +} ogs_nas_qos_rules_t; + +/* 9.11.4.14 Session-AMBR + * M LV 7 */ +#define OGS_NAS_BR_UNIT_1K 1 +#define OGS_NAS_BR_UNIT_4K 2 +#define OGS_NAS_BR_UNIT_16K 3 +#define OGS_NAS_BR_UNIT_64K 4 +#define OGS_NAS_BR_UNIT_256K 5 +#define OGS_NAS_BR_UNIT_1M 6 +#define OGS_NAS_BR_UNIT_4M 7 +#define OGS_NAS_BR_UNIT_16M 8 +#define OGS_NAS_BR_UNIT_64M 9 +#define OGS_NAS_BR_UNIT_256M 10 +#define OGS_NAS_BR_UNIT_1G 11 +#define OGS_NAS_BR_UNIT_4G 12 +#define OGS_NAS_BR_UNIT_16G 13 +#define OGS_NAS_BR_UNIT_64G 14 +#define OGS_NAS_BR_UNIT_256G 15 +#define OGS_NAS_BR_UNIT_1T 16 +#define OGS_NAS_BR_UNIT_4T 17 +#define OGS_NAS_BR_UNIT_16T 18 +#define OGS_NAS_BR_UNIT_64T 19 +#define OGS_NAS_BR_UNIT_256T 20 +#define OGS_NAS_BR_UNIT_1P 21 +#define OGS_NAS_BR_UNIT_4P 22 +#define OGS_NAS_BR_UNIT_16P 23 +#define OGS_NAS_BR_UNIT_64P 24 +#define OGS_NAS_BR_UNIT_256P 25 +typedef struct ogs_nas_session_ambr_s { + uint8_t length; + struct { + uint8_t unit; + uint16_t br; + } dl; + struct { + uint8_t unit; + uint16_t br; + } ul; +} __attribute__ ((packed)) ogs_nas_session_ambr_t; + +/* 9.11.4.15 SM PDU DN request container + * O TLV 3-255 */ +#define OGS_NAX_MAX_SM_PDU_DN_REQUESTER_CONTAINER 255 +typedef struct ogs_nas_sm_pdu_dn_request_container_s { + uint8_t length; + uint8_t buffer[OGS_NAX_MAX_SM_PDU_DN_REQUESTER_CONTAINER]; +} ogs_nas_sm_pdu_dn_request_container_t; + +/* 9.11.4.16 SSC mode + * O TV 1 */ +#define OGS_NAS_SSC_MODE_1 1 +#define OGS_NAS_SSC_MODE_2 2 +#define OGS_NAS_SSC_MODE_3 3 +/* 4(unused) shall be interpreted as "SSC mode 1", if received by the network */ +/* 5(unused) shall be interpreted as "SSC mode 2", if received by the network */ +/* 6(unused) shall be interpreted as "SSC mode 3", if received by the network */ +typedef struct ogs_nas_ssc_mode_s { +ED3(uint8_t type:4;, + uint8_t spare:1;, + uint8_t value:3;) +} __attribute__ ((packed)) ogs_nas_ssc_mode_t; + +/* 9.11.4.18 5GSM network feature support + * O TLV 3-15 */ +typedef struct ogs_nas_5gsm_network_feature_support_s { + uint8_t length; +ED2(uint8_t spare:7;, + uint8_t s1:1;) +} __attribute__ ((packed)) ogs_nas_5gsm_network_feature_support_t; + +/* 9.11.4.22 ATSSS container + * O TLV-E 3-65535 */ +typedef struct ogs_nas_atsss_container_s { + uint8_t length; + uint8_t *buffer; +} ogs_nas_atsss_container_t; + +/* 9.9.4.25 Release assistance indication + * O TV 1 + * + * Release assistance indication value + * + * Downlink data expected (DDX) + * + * Bits + * 0 0 No information regarding DDX is conveyed by the information element. + * If received it shall be interpreted as 'neither value "01" nor "10" + * applies + * 0 1 No further uplink or downlink data transmission subsequent to the + * uplink data transmission is expected + * 1 0 Only a single downlink data transmission and no further uplink data + * transmission subsequent to the uplink data transmission is expected + * 1 1 reserved */ +typedef struct ogs_nas_release_assistance_indication_s { +ED3(uint8_t type:4;, + uint8_t spare:2;, + uint8_t value:2;) +} __attribute__ ((packed)) ogs_nas_release_assistance_indication_t; + +/* 9.11.4.25 DS-TT Ethernet port MAC address + * O TLV 8 */ +#define OGS_NAX_MAX_EHTERNET_MAC_ADDRESS_LEN 6 +typedef struct ogs_nas_ds_tt_ethernet_port_mac_address_s { + uint8_t length; + uint8_t buffer[OGS_NAX_MAX_EHTERNET_MAC_ADDRESS_LEN]; +} ogs_nas_ds_tt_ethernet_port_mac_address_t; + +/* 9.11.4.26 UE-DS-TT residence time + * O TLV 10 */ +#define OGS_NAS_MAX_UE_DS_TT_REDISENCE_TIME_LEN 8 +typedef struct ogs_nas_ue_ds_tt_residence_time_s { + uint8_t length; + uint8_t buffer[OGS_NAS_MAX_UE_DS_TT_REDISENCE_TIME_LEN]; +} ogs_nas_ue_ds_tt_residence_time_t; + +/* 9.11.4.27 Port management information container + * O TLV-E 4-65535 */ +typedef struct ogs_nas_port_management_information_container_s { + uint8_t length; + uint8_t *buffer; +} ogs_nas_port_management_information_container_t; + +/* 9.11.3.72 N5GC indication + * O T 1 */ +typedef struct ogs_nas_n5gc_indication_s { + uint8_t type; +} ogs_nas_n5gc_indication_t; + + +#ifdef __cplusplus +} +#endif + +#endif /* OGS_NAS_5GS_TYPES_H */ diff --git a/lib/nas/conv.c b/lib/nas/common/conv.c similarity index 99% rename from lib/nas/conv.c rename to lib/nas/common/conv.c index 5b029a4261..512604ce97 100644 --- a/lib/nas/conv.c +++ b/lib/nas/common/conv.c @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -#include "ogs-nas.h" +#include "ogs-nas-common.h" void ogs_nas_imsi_to_bcd( ogs_nas_mobile_identity_imsi_t *imsi, uint8_t imsi_len, char *bcd) diff --git a/lib/nas/conv.h b/lib/nas/common/conv.h similarity index 91% rename from lib/nas/conv.h rename to lib/nas/common/conv.h index 31e95f8d2a..6692a27f8f 100644 --- a/lib/nas/conv.h +++ b/lib/nas/common/conv.h @@ -21,10 +21,10 @@ #error "This header cannot be included directly." #endif -#ifndef OGS_NAS_CONV_H -#define OGS_NAS_CONV_H +#ifndef OGS_NAS_COMMON_CONV_H +#define OGS_NAS_COMMON_CONV_H -#include "ogs-nas.h" +#include "ogs-nas-common.h" #ifdef __cplusplus extern "C" { @@ -44,5 +44,5 @@ void ogs_nas_imeisv_to_bcd( } #endif -#endif /* OGS_NAS_CONV_H */ +#endif /* OGS_NAS_COMMON_CONV_H */ diff --git a/lib/nas/common/meson.build b/lib/nas/common/meson.build new file mode 100644 index 0000000000..685caffe9e --- /dev/null +++ b/lib/nas/common/meson.build @@ -0,0 +1,36 @@ +# Copyright (C) 2019 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 . + +libnas_common_sources = files(''' + conv.c + types.c +'''.split()) + +libnas_common_inc = include_directories('.') + +libnas_common = library('ogsnas-common', + sources : libnas_common_sources, + version : libogslib_version, + c_args : '-DOGS_NAS_COMPILATION', + include_directories : [libnas_common_inc, libcrypt_inc, libinc], + dependencies : libcore_dep, + install : true) + +libnas_common_dep = declare_dependency( + link_with : libnas_common, + include_directories : [libnas_common_inc, libcrypt_inc, libinc], + dependencies : libcore_dep) diff --git a/lib/nas/ogs-nas.h b/lib/nas/common/ogs-nas-common.h similarity index 87% rename from lib/nas/ogs-nas.h rename to lib/nas/common/ogs-nas-common.h index 6e80897d2d..5acdf65a6e 100644 --- a/lib/nas/ogs-nas.h +++ b/lib/nas/common/ogs-nas-common.h @@ -17,18 +17,16 @@ * along with this program. If not, see . */ -#ifndef OGS_NAS_H -#define OGS_NAS_H +#ifndef OGS_NAS_COMMON_H +#define OGS_NAS_COMMON_H #include "ogs-core.h" #include "ogs-crypt.h" #define OGS_NAS_INSIDE -#include "nas/types.h" -#include "nas/conv.h" -#include "nas/ies.h" -#include "nas/message.h" +#include "nas/common/types.h" +#include "nas/common/conv.h" #undef OGS_NAS_INSIDE @@ -45,4 +43,4 @@ extern int __ogs_nas_domain; } #endif -#endif /* OGS_NAS_H */ +#endif /* OGS_NAS_COMMON_H */ diff --git a/lib/nas/types.c b/lib/nas/common/types.c similarity index 99% rename from lib/nas/types.c rename to lib/nas/common/types.c index 16b54455be..c35c157d01 100644 --- a/lib/nas/types.c +++ b/lib/nas/common/types.c @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -#include "ogs-nas.h" +#include "ogs-nas-common.h" int __ogs_nas_domain; diff --git a/lib/nas/common/types.h b/lib/nas/common/types.h new file mode 100644 index 0000000000..183c138b41 --- /dev/null +++ b/lib/nas/common/types.h @@ -0,0 +1,763 @@ +/* + * Copyright (C) 2019 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 . + */ + +#if !defined(OGS_NAS_INSIDE) && !defined(OGS_NAS_COMPILATION) +#error "This header cannot be included directly." +#endif + +#ifndef OGS_NAS_COMMON_TYPES_H +#define OGS_NAS_COMMON_TYPES_H + +#include "ogs-core.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define OGS_NAS_CLEAR_DATA(__dATA) \ + do { \ + ogs_assert((__dATA)); \ + if ((__dATA)->buffer) { \ + ogs_free((__dATA)->buffer); \ + (__dATA)->buffer = NULL; \ + (__dATA)->length = 0; \ + } \ + } while(0) +#define OGS_NAS_STORE_DATA(__dST, __sRC) \ + do { \ + ogs_assert((__sRC)); \ + ogs_assert((__sRC)->buffer); \ + ogs_assert((__dST)); \ + OGS_NAS_CLEAR_DATA(__dST); \ + (__dST)->length = (__sRC)->length; \ + (__dST)->buffer = ogs_calloc((__dST)->length, sizeof(uint8_t)); \ + memcpy((__dST)->buffer, (__sRC)->buffer, (__dST)->length); \ + } while(0) + +#define OGS_NAS_KSI_NO_KEY_IS_AVAILABLE 0x7 + +/********************************** + * NAS PLMN_ID Structure */ +typedef struct ogs_nas_plmn_id_s { +ED2(uint8_t mcc2:4;, + uint8_t mcc1:4;) +ED2(uint8_t mnc3:4;, + uint8_t mcc3:4;) +ED2(uint8_t mnc2:4;, + uint8_t mnc1:4;) +} __attribute__ ((packed)) ogs_nas_plmn_id_t; + +void *ogs_nas_from_plmn_id( + ogs_nas_plmn_id_t *ogs_nas_plmn_id, ogs_plmn_id_t *plmn_id); +void *ogs_nas_to_plmn_id( + ogs_plmn_id_t *plmn_id, ogs_nas_plmn_id_t *ogs_nas_plmn_id); + +typedef struct ogs_nas_guti_s { + ogs_nas_plmn_id_t nas_plmn_id; + uint16_t mme_gid; + uint8_t mme_code; + uint32_t m_tmsi; +} __attribute__ ((packed)) ogs_nas_guti_t; + +/* 9.9.2.0 Additional information + * O TLV 3-n */ +#define NAX_MAX_ADDITIONAL_INFORMATION_LEN 255 +typedef struct ogs_nas_additional_information_s { + uint8_t length; + uint8_t buffer[NAX_MAX_ADDITIONAL_INFORMATION_LEN]; +} __attribute__ ((packed)) ogs_nas_additional_information_t; + +/* 9.9.2.1 EPS bearer context status + * O TLV 4 */ +typedef struct ogs_nas_eps_bearer_context_status_s { + uint8_t length; +ED8(uint8_t ebi7:1;, + uint8_t ebi6:1;, + uint8_t ebi5:1;, + uint8_t ebi4:1;, + uint8_t ebi3:1;, + uint8_t ebi2:1;, + uint8_t ebi1:1;, + uint8_t ebi0:1;) +ED8(uint8_t ebi15:1;, + uint8_t ebi14:1;, + uint8_t ebi13:1;, + uint8_t ebi12:1;, + uint8_t ebi11:1;, + uint8_t ebi10:1;, + uint8_t ebi9:1;, + uint8_t ebi8:1;) +} __attribute__ ((packed)) ogs_nas_eps_bearer_context_status_t; + +/* 9.9.2.3 Mobile identity + * See subclause 10.5.1.4 in 3GPP TS 24.008 [13]. + * O TLV 7-10 */ +#define OGS_NAS_MOBILE_IDENTITY_NONE 0 +#define OGS_NAS_MOBILE_IDENTITY_IMSI 1 +#define OGS_NAS_MOBILE_IDENTITY_IMEI 2 +#define OGS_NAS_MOBILE_IDENTITY_IMEISV 3 +#define OGS_NAS_MOBILE_IDENTITY_TMSI 4 +#define OGS_NAS_MOBILE_IDENTITY_TMGI 5 +#define OGS_NAS_MOBILE_IDENTITY_GUTI 6 + +#define OGS_NAS_MOBILE_IDENTITY_EVEN 0 +#define OGS_NAS_MOBILE_IDENTITY_ODD 1 +typedef struct ogs_nas_mobile_identity_imsi_s { +ED3(uint8_t digit1:4;, + uint8_t odd_even:1;, + uint8_t type:3;) +ED2(uint8_t digit3:4;, + uint8_t digit2:4;) +ED2(uint8_t digit5:4;, + uint8_t digit4:4;) +ED2(uint8_t digit7:4;, + uint8_t digit6:4;) +ED2(uint8_t digit9:4;, + uint8_t digit8:4;) +ED2(uint8_t digit11:4;, + uint8_t digit10:4;) +ED2(uint8_t digit13:4;, + uint8_t digit12:4;) +ED2(uint8_t digit15:4;, + uint8_t digit14:4;) +} __attribute__ ((packed)) ogs_nas_mobile_identity_imsi_t; + +typedef ogs_nas_mobile_identity_imsi_t ogs_nas_mobile_identity_imei_t; + +typedef struct ogs_nas_mobile_identity_tmsi_s { +ED3(uint8_t spare:4;, + uint8_t odd_even:1;, + uint8_t type:3;) + uint32_t tmsi; +} __attribute__ ((packed)) ogs_nas_mobile_identity_tmsi_t; + +typedef struct ogs_nas_mobile_identity_tmgi_s { +ED5(uint8_t spare:2;, + uint8_t mbms_session_id:1;, + uint8_t mcc_mnc:1;, + uint8_t odd_even:1;, + uint8_t type:3;) + uint8_t mbms_servicec_id[3]; + ogs_nas_plmn_id_t nas_plmn_id; + uint8_t mbms_session_identity; +} __attribute__ ((packed)) ogs_nas_mobile_identity_tmgi_t; + +typedef struct ogs_nas_mobile_identity_imeisv_s { +ED3(uint8_t digit1:4;, + uint8_t odd_even:1;, + uint8_t type:3;) +ED2(uint8_t digit3:4;, + uint8_t digit2:4;) +ED2(uint8_t digit5:4;, + uint8_t digit4:4;) +ED2(uint8_t digit7:4;, + uint8_t digit6:4;) +ED2(uint8_t digit9:4;, + uint8_t digit8:4;) +ED2(uint8_t digit11:4;, + uint8_t digit10:4;) +ED2(uint8_t digit13:4;, + uint8_t digit12:4;) +ED2(uint8_t digit15:4;, + uint8_t digit14:4;) +ED2(uint8_t digit17:4;, + uint8_t digit16:4;) +} __attribute__ ((packed)) ogs_nas_mobile_identity_imeisv_t; + +typedef struct ogs_nas_mobile_identity_s { + uint8_t length; + union { + ogs_nas_mobile_identity_imsi_t imsi; + ogs_nas_mobile_identity_tmsi_t tmsi; + ogs_nas_mobile_identity_tmgi_t tmgi; + ogs_nas_mobile_identity_imeisv_t imeisv; + }; +} ogs_nas_mobile_identity_t; + +/* 9.9.2.4 Mobile station classmark 2 + * See subclause 10.5.1.6 in 3GPP TS 24.008 + * O TLV 5 */ +#define OGS_NAS_MS_CLASSMARK_2_REVISION_GSM_PHASE1 0 +#define OGS_NAS_MS_CLASSMARK_2_REVISION_GSM_PHASE2 1 +#define OGS_NAS_MS_CLASSMARK_2_REVISION_R99 2 +#define OGS_NAS_MS_CLASSMARK_2_REVISION_RESERVED 2 + +#define OGS_NAS_MS_CLASSMARK_2_RF_CLASS1 0 +#define OGS_NAS_MS_CLASSMARK_2_RF_CLASS2 1 +#define OGS_NAS_MS_CLASSMARK_2_RF_CLASS3 2 +#define OGS_NAS_MS_CLASSMARK_2_RF_CLASS4 3 +#define OGS_NAS_MS_CLASSMARK_2_RF_CLASS5 4 +#define OGS_NAS_MS_CLASSMARK_2_RF_IRRELEVANT 7 +typedef struct ogs_nas_mobile_station_classmark_2_t { + uint8_t length; +ED5(uint8_t spare1:1;, + uint8_t revision_level:2;, + uint8_t es_ind:1;, + uint8_t a5_1:1;, + uint8_t rf_power_capability:3;) +ED7(uint8_t spare:1;, + uint8_t ps_capa:1;, + uint8_t ss_screen_indicator:2;, + uint8_t sm_capabi:1;, + uint8_t vbs:1;, + uint8_t vgcs:1;, + uint8_t fc:1;) +ED8(uint8_t cm3:1;, + uint8_t spare2:1;, + uint8_t lcsva_cap:1;, + uint8_t ucs2:1;, + uint8_t solsa:1;, + uint8_t cmsp:1;, + uint8_t a5_3:1;, + uint8_t a5_2:1;) +} __attribute__ ((packed)) ogs_nas_mobile_station_classmark_2_t; + +/* 9.9.2.8 PLMN list + * See subclause 10.5.1.13 in 3GPP TS 24.008 [13]. + * O TLV 5-47 */ +#define OGS_NAS_MAX_PLMN 15 +typedef struct ogs_nas_plmn_list_s { + uint8_t length; + ogs_nas_plmn_id_t nas_plmn_id[OGS_NAS_MAX_PLMN]; +} __attribute__ ((packed)) ogs_nas_plmn_list_t; + +/* 9.9.2.10 Supported codec list + * See subclause 10.5.4.32 in 3GPP TS 24.008 [13]. + * O TLV 5-n */ +typedef struct ogs_nas_supported_codec_item_s { + uint8_t system_identification; + uint8_t length_of_bitmap; + uint16_t codec_bitmap; +} __attribute__ ((packed)) ogs_nas_supported_codec_item_t; + +#define OGS_NAS_MAX_SUPPORTED_CODECS 8 +typedef struct ogs_nas_supported_codec_list_s { + uint8_t length; + ogs_nas_supported_codec_item_t item[OGS_NAS_MAX_SUPPORTED_CODECS]; +} __attribute__ ((packed)) ogs_nas_supported_codec_list_t; + +/* 9.9.3.1 Authentication failure parameter + * See subclause 10.5.3.2.2 in 3GPP TS 24.008 [13]. + * O TLV 16 */ +typedef struct ogs_nas_authentication_failure_parameter_s { + uint8_t length; + uint8_t auts[OGS_AUTS_LEN]; +} __attribute__ ((packed)) ogs_nas_authentication_failure_parameter_t; + +/* 9.9.3.2 Authentication parameter AUTN + * See subclause 10.5.3.1.1 in 3GPP TS 24.008 [13]. + * M LV 17 */ +typedef struct ogs_nas_authentication_parameter_autn_s { + uint8_t length; + uint8_t autn[OGS_AUTN_LEN]; +} ogs_nas_authentication_parameter_autn_t; + +/* 9.9.3.3 Authentication parameter RAND + * See subclause 10.5.3.1 in 3GPP TS 24.008 [13]. + * M V 16 */ +typedef struct ogs_nas_authentication_parameter_rand_s { + uint8_t rand[OGS_RAND_LEN]; +} ogs_nas_authentication_parameter_rand_t; + +/* 9.9.3.4 Authentication response parameter + * M LV 5-17 */ +typedef struct ogs_nas_authentication_response_parameter_s { + uint8_t length; + uint8_t res[OGS_MAX_RES_LEN]; +} ogs_nas_authentication_response_parameter_t; + +/* 9.9.3.6 Daylight saving time + * See subclause 10.5.3.12 in 3GPP TS 24.008 [13]. + * O TLV 3 */ +#define OGS_NAS_NO_ADJUSTMENT_FOR_DAYLIGHT_SAVING_TIME 0 +#define OGS_NAS_PLUS_1_HOUR_ADJUSTMENT_FOR_DAYLIGHT_SAVING_TIME 1 +#define OGS_NAS_PLUS_2_HOURS_ADJUSTMENT_FOR_DAYLIGHT_SAVING_TIME 2 +typedef struct ogs_nas_daylight_saving_time_s { + uint8_t length; +ED2(uint8_t spare:6;, + uint8_t value:2;) +} __attribute__ ((packed)) ogs_nas_daylight_saving_time_t; + +/* 9.9.3.16 GPRS timer + * See subclause 10.5.7.3 in 3GPP TS 24.008 [13]. + * M V 1 or O TV 2 */ +#define OGS_NAS_GRPS_TIMER_UNIT_MULTIPLES_OF_2_SS 0 +#define OGS_NAS_GRPS_TIMER_UNIT_MULTIPLES_OF_1_MM 1 +#define OGS_NAS_GRPS_TIMER_UNIT_MULTIPLES_OF_DECI_HH 2 +#define OGS_NAS_GRPS_TIMER_UNIT_DEACTIVATED 7 +typedef struct ogs_nas_gprs_timer_s { +ED2(uint8_t unit:3;, + uint8_t value:5;) +} __attribute__ ((packed)) ogs_nas_gprs_timer_t; + +/* 9.9.3.16A GPRS timer 2 + * See subclause 10.5.7.4 in 3GPP TS 24.008 [13]. + * O TLV 3 */ +typedef struct ogs_nas_gprs_timer_2_s { + uint8_t length; + uint8_t gprs_timer_2_value; +} __attribute__ ((packed)) ogs_nas_gprs_timer_2_t; + +/* 9.9.3.16B GPRS timer 3 + * See subclause 10.5.7.4a in 3GPP TS 24.008 [13]. + * O TLV 3 */ +#define OGS_NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_10_MM 0 +#define OGS_NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_1_HH 1 +#define OGS_NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_10_HH 2 +#define OGS_NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_2_SS 3 +#define OGS_NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_30_SS 4 +#define OGS_NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_1_MM 5 +#define OGS_NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_320_HH 6 +#define OGS_NAS_GRPS_TIMER_3_UNIT_DEACTIVATED 7 + +typedef struct ogs_nas_gprs_timer_3_s { + uint8_t length; +ED2(uint8_t unit:3;, + uint8_t timer_value:5;) +} __attribute__ ((packed)) ogs_nas_gprs_timer_3_t; + +/* 9.9.3.18 IMEISV request + * See subclause 10.5.5.10 in 3GPP TS 24.008 [13]. + * O TV 1 */ +typedef struct ogs_nas_imeisv_request_s { +#define OGS_NAS_IMEISV_TYPE 0xc +ED3(uint8_t type:4;, + uint8_t spare:1;, +#define OGS_NAS_IMEISV_NOT_REQUESTED 0 +#define OGS_NAS_IMEISV_REQUESTED 1 + uint8_t imeisv_request_value:3;) +} __attribute__ ((packed)) ogs_nas_imeisv_request_t; + +/* 9.9.3.21 NAS key set identifier + * M V 1/2 + * 9.9.2.9 Spare half octet + * M V 1/2 */ +typedef struct ogs_nas_key_set_identifier_s { +ED3(uint8_t type:4;, + uint8_t tsc:1;, + uint8_t value:3;) +} __attribute__ ((packed)) ogs_nas_key_set_identifier_t; + +/* 9.9.3.24 Network name + * See subclause 10.5.3.5a in 3GPP TS 24.008 [13]. + * O TLV 3-n */ +#define OGS_NAS_MAX_NETWORK_NAME_LEN 255 +typedef struct ogs_nas_network_name_s { + uint8_t length; +ED4(uint8_t ext:1;, + uint8_t coding_scheme:3;, + uint8_t add_ci:1;, + uint8_t number_of_spare_bits_in_last_octet:3;) + uint8_t name[OGS_NAS_MAX_NETWORK_NAME_LEN]; +} __attribute__ ((packed)) ogs_nas_network_name_t; + +/* 9.9.3.29 Time zone + * See subclause 10.5.3.8 in 3GPP TS 24.008 [13]. + * O TV 2 */ +typedef uint8_t ogs_nas_time_zone_t; + +/* 9.9.3.30 Time zone and time + * See subclause 10.5.3.9 in 3GPP TS 24.008 [13]. + * 9.2.3.11 TPServiceCentreTimeStamp (TPSCTS) in 3GPP TS 23.040 [90] + * O TV 8 */ +#define OGS_OGS_NAS_TIME_TO_BCD(x) OGS_TIME_TO_BCD(x) +typedef struct ogs_nas_time_zone_and_time_s { + uint8_t year; + uint8_t mon; + uint8_t mday; + uint8_t hour; + uint8_t min; + uint8_t sec; + /* The Time Zone indicates the difference, expressed in quarters of an hour, + * between the local time and GMT. In the first of the two semi-octets, + * the first bit (bit 3 of the seventh octet of + * the TP-Service-Centre-Time-Stamp field) represents + * the algebraic sign of this difference (0: positive, 1: negative). */ + uint8_t timezone; +} ogs_nas_time_zone_and_time_t; + +/* 9.9.3.32 Tracking area identity + * O TV 6 */ +typedef struct ogs_nas_tracking_area_identity_s { + ogs_nas_plmn_id_t nas_plmn_id; + uint16_t tac; +} __attribute__ ((packed)) ogs_nas_tracking_area_identity_t; + +typedef ogs_nas_tracking_area_identity_t ogs_nas_tai_t; + +/* 9.9.3.33 Tracking area identity list + * M LV 7-97 */ +#define OGS_NAS_MAX_TAI_LIST_LEN 96 +#define TAI0_TYPE 0 +#define TAI1_TYPE 1 +#define TAI2_TYPE 2 +typedef struct tai0_list_s { + struct { + ED3(uint8_t spare:1;, + uint8_t type:2;, + uint8_t num:5;) + /* + * Do not change 'ogs_plmn_id_t' to 'ogs_nas_plmn_id_t'. + * Use 'ogs_plmn_id_t' for easy implementation. + * ogs_nas_tai_list_build() changes to NAS format(ogs_nas_plmn_id_t) + * and is sent to the UE. + */ + ogs_plmn_id_t plmn_id; + uint16_t tac[OGS_MAX_NUM_OF_TAI]; + } __attribute__ ((packed)) tai[OGS_MAX_NUM_OF_TAI]; +} __attribute__ ((packed)) tai0_list_t; + +typedef struct tai2_list_s { +ED3(uint8_t spare:1;, + uint8_t type:2;, + uint8_t num:5;) + /* + * Do not change 'ogs_tai_t' to 'ogs_nas_tracking_area_identity_t'. + * Use 'ogs_tai_t' for easy implementation. + * ogs_nas_tai_list_build() changes to NAS + * format(ogs_nas_tracking_area_identity_t) + * and is sent to the UE. + */ + ogs_tai_t tai[OGS_MAX_NUM_OF_TAI]; +} __attribute__ ((packed)) tai2_list_t; + +typedef struct ogs_nas_tracking_area_identity_list_s { + uint8_t length; + uint8_t buffer[OGS_NAS_MAX_TAI_LIST_LEN]; +} __attribute__ ((packed)) ogs_nas_tracking_area_identity_list_t; + +void ogs_nas_tai_list_build( + ogs_nas_tracking_area_identity_list_t *target, + tai0_list_t *source0, tai2_list_t *source2); + +/* 9.9.3.34 UE network capability + * M LV 3-14 */ +typedef struct ogs_nas_s1_ue_network_capability_s { + uint8_t length; + union { + struct { + ED8(uint8_t eea0:1;, + uint8_t eea1:1;, + uint8_t eea2:1;, + uint8_t eea3:1;, + uint8_t eea4:1;, + uint8_t eea5:1;, + uint8_t eea6:1;, + uint8_t eea7:1;) + }; + uint8_t eea; + }; + union { + struct { + ED8(uint8_t eia0:1;, + uint8_t eia1:1;, + uint8_t eia2:1;, + uint8_t eia3:1;, + uint8_t eia4:1;, + uint8_t eia5:1;, + uint8_t eia6:1;, + uint8_t eia7:1;) + }; + uint8_t eia; + }; + union { + struct { + ED8(uint8_t uea0:1;, + uint8_t uea1:1;, + uint8_t uea2:1;, + uint8_t uea3:1;, + uint8_t uea4:1;, + uint8_t uea5:1;, + uint8_t uea6:1;, + uint8_t uea7:1;) + }; + uint8_t uea; + }; + union { + struct { + ED8(uint8_t ucs2:1;, + uint8_t uia1:1;, + uint8_t uia2:1;, + uint8_t uia3:1;, + uint8_t uia4:1;, + uint8_t uia5:1;, + uint8_t uia6:1;, + uint8_t uia7:1;) + }; + uint8_t uia; + }; +ED8(uint8_t prose_dd:1;, + uint8_t prose:1;, + uint8_t h_245_ash:1;, + uint8_t acc_csfb:1;, + uint8_t lpp:1;, + uint8_t lcs:1;, + uint8_t srvcc:1;, + uint8_t nf:1;) +ED8(uint8_t epco:1;, + uint8_t hc_cp_ciot:1;, + uint8_t erw_opdn:1;, + uint8_t s1u_data:1;, + uint8_t up_ciot:1;, + uint8_t cp_ciot:1;, + uint8_t prose_relay:1;, + uint8_t prose_dc:1;) +ED2(uint8_t spare:7;, + uint8_t multiple_drb:1;) +} __attribute__ ((packed)) ogs_nas_s1_ue_network_capability_t; + +/* 9.9.3.36 UE security capability + * M LV 3-6 */ +typedef struct ogs_nas_s1_ue_security_capability_s { + uint8_t length; + union { + struct { + ED8(uint8_t eea0:1;, + uint8_t eea1:1;, + uint8_t eea2:1;, + uint8_t eea3:1;, + uint8_t eea4:1;, + uint8_t eea5:1;, + uint8_t eea6:1;, + uint8_t eea7:1;) + }; + uint8_t eea; + }; + union { + struct { + ED8(uint8_t eia0:1;, + uint8_t eia1:1;, + uint8_t eia2:1;, + uint8_t eia3:1;, + uint8_t eia4:1;, + uint8_t eia5:1;, + uint8_t eia6:1;, + uint8_t eia7:1;) + }; + uint8_t eia; + }; + union { + struct { + ED8(uint8_t uea0:1;, + uint8_t uea1:1;, + uint8_t uea2:1;, + uint8_t uea3:1;, + uint8_t uea4:1;, + uint8_t uea5:1;, + uint8_t uea6:1;, + uint8_t uea7:1;) + }; + uint8_t uea; + }; + union { + struct { + ED8(uint8_t spare1:1;, + uint8_t uia1:1;, + uint8_t uia2:1;, + uint8_t uia3:1;, + uint8_t uia4:1;, + uint8_t uia5:1;, + uint8_t uia6:1;, + uint8_t uia7:1;) + }; + uint8_t uia; + }; + union { + struct { + ED8(uint8_t spare2:1;, + uint8_t gea1:1;, + uint8_t gea2:1;, + uint8_t gea3:1;, + uint8_t gea4:1;, + uint8_t gea5:1;, + uint8_t gea6:1;, + uint8_t gea7:1;) + }; + uint8_t gea; + }; +} __attribute__ ((packed)) ogs_nas_s1_ue_security_capability_t; + +/* 9.9.3.62 WUS assistance information + * O TLV 3-n */ +#define OGS_MAX_NAS_WUS_ASSISTANCE_INFORAMTION_LEN 255 +typedef struct ogs_nas_wus_assistance_information_s { + uint8_t length; + uint8_t buffer[OGS_MAX_NAS_WUS_ASSISTANCE_INFORAMTION_LEN]; +} ogs_nas_wus_assistance_information_t; + +/* 9.11.3.36A Non-3GPP NW provided policies + * See subclause 10.5.5.37 in 3GPP TS 24.008 [12]. + * O TV 1 */ +typedef struct ogs_nas_non_3gpp_nw_provided_policies_s { +ED3(uint8_t type:4;, + uint8_t apre:3;, + uint8_t value:3;) +} ogs_nas_non_3gpp_nw_provided_policies_t; + +/* buffer : 9.9.3.37 Emergency number list + * See subclause 10.5.3.13 in 3GPP TS 24.008 [13]. + * O TLV 5-50 */ +#define OGS_NAS_MAX_EMERGENCY_NUMBER_LIST_LEN 48 +typedef struct ogs_nas_emergency_number_list_s { + uint16_t length; + uint8_t buffer[OGS_NAS_MAX_EMERGENCY_NUMBER_LIST_LEN]; +} __attribute__ ((packed)) ogs_nas_emergency_number_list_t; + +/* 9.9.3.37A Extended emergency number list + * O TLV-E 7-65535 */ +typedef struct ogs_nas_extended_emergency_number_list_s { + uint8_t length; + uint8_t *buffer; +} ogs_nas_extended_emergency_number_list_t; + +/* 9.9.3.46 Extended DRX parameters + * See subclause 10.5.5.32 in 3GPP TS 24.008 [13]. + * O TLV 3 */ +typedef struct ogs_nas_extended_drx_parameters_s { + uint8_t length; +ED2(uint8_t paging_time_window:4;, + uint8_t e_drx_value:4;) +} __attribute__ ((packed)) ogs_nas_extended_drx_parameters_t; + +/* 9.9.4.2 APN aggregate maximum bit rate + * O TLV 4-8 */ +typedef struct ogs_nas_apn_aggregate_maximum_bit_rate_s { + uint8_t length; + uint8_t dl_apn_ambr; + uint8_t ul_apn_ambr; + uint8_t dl_apn_ambr_extended; + uint8_t ul_apn_ambr_extended; + uint8_t dl_apn_ambr_extended2; + uint8_t ul_apn_ambr_extended2; +} __attribute__ ((packed)) ogs_nas_apn_aggregate_maximum_bit_rate_t; + +void apn_ambr_build( + ogs_nas_apn_aggregate_maximum_bit_rate_t * apn_aggregate_maximum_bit_rate, + uint32_t dl_ambr, uint32_t ul_ambr); + +/* 9.9.4.3 EPS quality of service + * M LV 2-14 */ +typedef struct ogs_nas_eps_quality_of_service_s { + uint8_t length; + uint8_t qci; + uint8_t ul_mbr; + uint8_t dl_mbr; + uint8_t ul_gbr; + uint8_t dl_gbr; + uint8_t ul_mbr_extended; + uint8_t dl_mbr_extended; + uint8_t ul_gbr_extended; + uint8_t dl_gbr_extended; + uint8_t ul_mbr_extended2; + uint8_t dl_mbr_extended2; + uint8_t ul_gbr_extended2; + uint8_t dl_gbr_extended2; +} ogs_nas_eps_quality_of_service_t; + +void eps_qos_build(ogs_nas_eps_quality_of_service_t *eps_qos, + uint8_t qci, + uint64_t dl_mbr, uint64_t ul_mbr, uint64_t dl_gbr, uint64_t ul_gbr); + +/* 9.9.4.13A Re-attempt indicator + * O TLV 3 */ +typedef struct ogs_nas_re_attempt_indicator_s { + uint8_t length; +ED3(uint8_t spare:3;, /* allowed in A/Gb mode or Iu mode */ + uint8_t eplmnc:1;, /* allowed in an equivalent PLMN */ + uint8_t ratc:1;) +} __attribute__ ((packed)) ogs_nas_re_attempt_indicator_t; + +/* 9.9.4.19 NBIFOM container + * See subclause 10.5.6.21 in 3GPP TS 24.008 [4]. + * O TLV 3-257 */ +#define MAX_OGS_NAS_NBIFOM_CONTAINER_LEN 255 +typedef struct ogs_nas_nbifom_container_s { + uint8_t length; + uint8_t buffer[MAX_OGS_NAS_NBIFOM_CONTAINER_LEN]; +} __attribute__ ((packed)) ogs_nas_nbifom_container_t; + +/* 9.9.4.22 Header compression configuration + * O TLV 5-257 */ +#define MAX_OGS_NAS_HEADER_COMPRESSION_CONTAINER_LEN 251 +typedef struct ogs_nas_header_compression_configuration_s { + uint8_t length; +ED8(uint8_t spare:1;, + uint8_t profile0x0104:1;, + uint8_t profile0x0103:1;, + uint8_t profile0x0102:1;, + uint8_t profile0x0006:1;, + uint8_t profile0x0004:1;, + uint8_t profile0x0003:1;, + uint8_t profile0x0002:1;) + uint16_t max_cid; +#define OGS_NAS_HEADER_COMPRESSION_NO_COMPRESSION 0 +#define OGS_NAS_HEADER_COMPRESSION_PROFILE_0x0002_UDP_IP 1 +#define OGS_NAS_HEADER_COMPRESSION_PROFILE_0x0003_ESP_IP 2 +#define OGS_NAS_HEADER_COMPRESSION_PROFILE_0x0004 3 +#define OGS_NAS_HEADER_COMPRESSION_PROFILE_0x0006 4 +#define OGS_NAS_HEADER_COMPRESSION_PROFILE_0x0102_UDP_IP 5 +#define OGS_NAS_HEADER_COMPRESSION_PROFILE_0x0103_ESP_IP 6 +#define OGS_NAS_HEADER_COMPRESSION_PROFILE_0x0104_IP 7 + uint8_t type; + uint8_t container[MAX_OGS_NAS_NBIFOM_CONTAINER_LEN]; +} __attribute__ ((packed)) ogs_nas_header_compression_configuration_t; + +/* 9.9.4.23 Control plane only indication + * O TV 1 */ +typedef struct ogs_nas_control_plane_only_indication_s { +ED3(uint8_t type:4;, + uint8_t spare:3;, + uint8_t ciot_eps_optimization:1;) +} __attribute__ ((packed)) ogs_nas_control_plane_only_indication_t; + +/* 9.9.4.26 Extended protocol configuration options + * See subclause 10.5.6.3A in 3GPP TS 24.008 [12] + * O TLV-E 4-65538 */ +typedef struct ogs_nas_extended_protocol_configuration_options_s { + uint16_t length; + uint8_t *buffer; +} __attribute__ ((packed)) ogs_nas_extended_protocol_configuration_options_t; + +/* 9.9.4.28 Serving PLMN rate control + * O TLV 4 */ +typedef struct ogs_nas_serving_plmn_rate_control_s { + uint8_t length; +ED8(uint8_t ebi7:1;, + uint8_t ebi6:1;, + uint8_t ebi5:1;, + uint8_t ebi4:1;, + uint8_t ebi3:1;, + uint8_t ebi2:1;, + uint8_t ebi1:1;, + uint8_t ebi0:1;) +ED8(uint8_t ebi15:1;, + uint8_t ebi14:1;, + uint8_t ebi13:1;, + uint8_t ebi12:1;, + uint8_t ebi11:1;, + uint8_t ebi10:1;, + uint8_t ebi9:1;, + uint8_t ebi8:1;) +} __attribute__ ((packed)) ogs_nas_serving_plmn_rate_control_t; + +#ifdef __cplusplus +} +#endif + +#endif /* OGS_NAS_COMMON_TYPES_H */ diff --git a/lib/nas/decoder.c b/lib/nas/decoder.c deleted file mode 100644 index 82b47e7d74..0000000000 --- a/lib/nas/decoder.c +++ /dev/null @@ -1,3030 +0,0 @@ -/* - * The MIT License - * - * Copyright (C) 2019,2020 by Sukchan Lee - * - * This file is part of Open5GS. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/******************************************************************************* - * This file had been created by nas-message.py script v0.1.0 - * Please do not modify this file but regenerate it via script. - * Created on: 2020-04-24 08:50:31.643694 by acetcom - * from 24301-d80.docx - ******************************************************************************/ - -#include "ogs-nas.h" - -int ogs_nas_decode_attach_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_attach_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_attach_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_attach_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_detach_request_from_ue(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_detach_request_to_ue(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_tracking_area_update_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_tracking_area_update_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_tracking_area_update_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_extended_service_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_service_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_service_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_guti_reallocation_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_authentication_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_authentication_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_identity_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_identity_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_authentication_failure(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_security_mode_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_security_mode_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_security_mode_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_emm_status(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_emm_information(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_downlink_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_uplink_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_cs_service_notification(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_uplink_generic_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_downlink_generic_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_activate_default_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_activate_default_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_activate_default_eps_bearer_context_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_activate_dedicated_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_activate_dedicated_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_activate_dedicated_eps_bearer_context_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_modify_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_modify_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_modify_eps_bearer_context_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_deactivate_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_deactivate_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_pdn_connectivity_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_pdn_connectivity_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_pdn_disconnect_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_pdn_disconnect_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_bearer_resource_allocation_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_bearer_resource_allocation_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_bearer_resource_modification_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_bearer_resource_modification_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_esm_information_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_esm_status(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); -int ogs_nas_decode_attach_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_attach_request_t *attach_request = &message->emm.attach_request; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode ATTACH_REQUEST\n"); - - size = ogs_nas_decode_eps_attach_type(&attach_request->eps_attach_type, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_eps_mobile_identity(&attach_request->eps_mobile_identity, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_ue_network_capability(&attach_request->ue_network_capability, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_esm_message_container(&attach_request->esm_message_container, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_TYPE: - size = ogs_nas_decode_p_tmsi_signature(&attach_request->old_p_tmsi_signature, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_ADDITIONAL_GUTI_TYPE: - size = ogs_nas_decode_eps_mobile_identity(&attach_request->additional_guti, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_ADDITIONAL_GUTI_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE: - size = ogs_nas_decode_tracking_area_identity(&attach_request->last_visited_registered_tai, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_DRX_PARAMETER_TYPE: - size = ogs_nas_decode_drx_parameter(&attach_request->drx_parameter, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_DRX_PARAMETER_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_MS_NETWORK_CAPABILITY_TYPE: - size = ogs_nas_decode_ms_network_capability(&attach_request->ms_network_capability, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_MS_NETWORK_CAPABILITY_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_TYPE: - size = ogs_nas_decode_location_area_identification(&attach_request->old_location_area_identification, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_TMSI_STATUS_TYPE: - size = ogs_nas_decode_tmsi_status(&attach_request->tmsi_status, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_TMSI_STATUS_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_2_TYPE: - size = ogs_nas_decode_mobile_station_classmark_2(&attach_request->mobile_station_classmark_2, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_TYPE: - size = ogs_nas_decode_mobile_station_classmark_3(&attach_request->mobile_station_classmark_3, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_SUPPORTED_CODECS_TYPE: - size = ogs_nas_decode_supported_codec_list(&attach_request->supported_codecs, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_SUPPORTED_CODECS_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_TYPE: - size = ogs_nas_decode_additional_update_type(&attach_request->additional_update_type, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_TYPE: - size = ogs_nas_decode_voice_domain_preference_and_ue_usage_setting(&attach_request->voice_domain_preference_and_ue_usage_setting, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_DEVICE_PROPERTIES_TYPE: - size = ogs_nas_decode_device_properties(&attach_request->device_properties, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_DEVICE_PROPERTIES_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_OLD_GUTI_TYPE_TYPE: - size = ogs_nas_decode_guti_type(&attach_request->old_guti_type, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_OLD_GUTI_TYPE_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_TYPE: - size = ogs_nas_decode_ms_network_feature_support(&attach_request->ms_network_feature_support, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_TYPE: - size = ogs_nas_decode_network_resource_identifier_container(&attach_request->tmsi_based_nri_container, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_T3324_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_2(&attach_request->t3324_value, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_T3324_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_3(&attach_request->t3412_extended_value, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_TYPE: - size = ogs_nas_decode_extended_drx_parameters(&attach_request->extended_drx_parameters, pkbuf); - ogs_assert(size >= 0); - attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_attach_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_attach_accept_t *attach_accept = &message->emm.attach_accept; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode ATTACH_ACCEPT\n"); - - size = ogs_nas_decode_eps_attach_result(&attach_accept->eps_attach_result, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_gprs_timer(&attach_accept->t3412_value, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_tracking_area_identity_list(&attach_accept->tai_list, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_esm_message_container(&attach_accept->esm_message_container, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_ATTACH_ACCEPT_GUTI_TYPE: - size = ogs_nas_decode_eps_mobile_identity(&attach_accept->guti, pkbuf); - ogs_assert(size >= 0); - attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_GUTI_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_ACCEPT_LOCATION_AREA_IDENTIFICATION_TYPE: - size = ogs_nas_decode_location_area_identification(&attach_accept->location_area_identification, pkbuf); - ogs_assert(size >= 0); - attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_ACCEPT_MS_IDENTITY_TYPE: - size = ogs_nas_decode_mobile_identity(&attach_accept->ms_identity, pkbuf); - ogs_assert(size >= 0); - attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_MS_IDENTITY_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_ACCEPT_EMM_CAUSE_TYPE: - size = ogs_nas_decode_emm_cause(&attach_accept->emm_cause, pkbuf); - ogs_assert(size >= 0); - attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_EMM_CAUSE_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_ACCEPT_T3402_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer(&attach_accept->t3402_value, pkbuf); - ogs_assert(size >= 0); - attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_T3402_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_ACCEPT_T3423_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer(&attach_accept->t3423_value, pkbuf); - ogs_assert(size >= 0); - attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_T3423_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_ACCEPT_EQUIVALENT_PLMNS_TYPE: - size = ogs_nas_decode_plmn_list(&attach_accept->equivalent_plmns, pkbuf); - ogs_assert(size >= 0); - attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_EQUIVALENT_PLMNS_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_ACCEPT_EMERGENCY_NUMBER_LIST_TYPE: - size = ogs_nas_decode_emergency_number_list(&attach_accept->emergency_number_list, pkbuf); - ogs_assert(size >= 0); - attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_TYPE: - size = ogs_nas_decode_eps_network_feature_support(&attach_accept->eps_network_feature_support, pkbuf); - ogs_assert(size >= 0); - attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_ACCEPT_ADDITIONAL_UPDATE_RESULT_TYPE: - size = ogs_nas_decode_additional_update_result(&attach_accept->additional_update_result, pkbuf); - ogs_assert(size >= 0); - attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_ADDITIONAL_UPDATE_RESULT_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_ACCEPT_T3412_EXTENDED_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_3(&attach_accept->t3412_extended_value, pkbuf); - ogs_assert(size >= 0); - attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_T3412_EXTENDED_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_ACCEPT_T3324_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_2(&attach_accept->t3324_value, pkbuf); - ogs_assert(size >= 0); - attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_T3324_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_ACCEPT_EXTENDED_DRX_PARAMETERS_TYPE: - size = ogs_nas_decode_extended_drx_parameters(&attach_accept->extended_drx_parameters, pkbuf); - ogs_assert(size >= 0); - attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_EXTENDED_DRX_PARAMETERS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_attach_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_attach_complete_t *attach_complete = &message->emm.attach_complete; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode ATTACH_COMPLETE\n"); - - size = ogs_nas_decode_esm_message_container(&attach_complete->esm_message_container, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - return decoded; -} - -int ogs_nas_decode_attach_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_attach_reject_t *attach_reject = &message->emm.attach_reject; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode ATTACH_REJECT\n"); - - size = ogs_nas_decode_emm_cause(&attach_reject->emm_cause, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_TYPE: - size = ogs_nas_decode_esm_message_container(&attach_reject->esm_message_container, pkbuf); - ogs_assert(size >= 0); - attach_reject->presencemask |= OGS_NAS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REJECT_T3346_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_2(&attach_reject->t3346_value, pkbuf); - ogs_assert(size >= 0); - attach_reject->presencemask |= OGS_NAS_ATTACH_REJECT_T3346_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REJECT_T3402_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_2(&attach_reject->t3402_value, pkbuf); - ogs_assert(size >= 0); - attach_reject->presencemask |= OGS_NAS_ATTACH_REJECT_T3402_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_ATTACH_REJECT_EXTENDED_EMM_CAUSE_TYPE: - size = ogs_nas_decode_extended_emm_cause(&attach_reject->extended_emm_cause, pkbuf); - ogs_assert(size >= 0); - attach_reject->presencemask |= OGS_NAS_ATTACH_REJECT_EXTENDED_EMM_CAUSE_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_detach_request_from_ue(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_detach_request_from_ue_t *detach_request_from_ue = &message->emm.detach_request_from_ue; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode DETACH_REQUEST\n"); - - size = ogs_nas_decode_detach_type(&detach_request_from_ue->detach_type, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_eps_mobile_identity(&detach_request_from_ue->eps_mobile_identity, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - return decoded; -} - -int ogs_nas_decode_detach_request_to_ue(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_detach_request_to_ue_t *detach_request_to_ue = &message->emm.detach_request_to_ue; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode DETACH_REQUEST\n"); - - size = ogs_nas_decode_detach_type(&detach_request_to_ue->detach_type, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_DETACH_REQUEST_EMM_CAUSE_TYPE: - size = ogs_nas_decode_emm_cause(&detach_request_to_ue->emm_cause, pkbuf); - ogs_assert(size >= 0); - detach_request_to_ue->presencemask |= OGS_NAS_DETACH_REQUEST_EMM_CAUSE_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_tracking_area_update_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_tracking_area_update_request_t *tracking_area_update_request = &message->emm.tracking_area_update_request; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode TRACKING_AREA_UPDATE_REQUEST\n"); - - size = ogs_nas_decode_eps_update_type(&tracking_area_update_request->eps_update_type, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_eps_mobile_identity(&tracking_area_update_request->old_guti, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_TYPE: - size = ogs_nas_decode_key_set_identifier(&tracking_area_update_request->non_current_native_nas_key_set_identifier, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_GPRS_CIPHERING_KEY_SEQUENCE_NUMBER_TYPE: - size = ogs_nas_decode_ciphering_key_sequence_number(&tracking_area_update_request->gprs_ciphering_key_sequence_number, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_GPRS_CIPHERING_KEY_SEQUENCE_NUMBER_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_P_TMSI_SIGNATURE_TYPE: - size = ogs_nas_decode_p_tmsi_signature(&tracking_area_update_request->old_p_tmsi_signature, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_P_TMSI_SIGNATURE_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_GUTI_TYPE: - size = ogs_nas_decode_eps_mobile_identity(&tracking_area_update_request->additional_guti, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_GUTI_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_NONCEUE_TYPE: - size = ogs_nas_decode_nonce(&tracking_area_update_request->nonceue, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_NONCEUE_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_UE_NETWORK_CAPABILITY_TYPE: - size = ogs_nas_decode_ue_network_capability(&tracking_area_update_request->ue_network_capability, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_UE_NETWORK_CAPABILITY_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE: - size = ogs_nas_decode_tracking_area_identity(&tracking_area_update_request->last_visited_registered_tai, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_DRX_PARAMETER_TYPE: - size = ogs_nas_decode_drx_parameter(&tracking_area_update_request->drx_parameter, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_DRX_PARAMETER_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_UE_RADIO_CAPABILITY_INFORMATION_UPDATE_NEEDED_TYPE: - size = ogs_nas_decode_ue_radio_capability_information_update_needed(&tracking_area_update_request->ue_radio_capability_information_update_needed, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_UE_RADIO_CAPABILITY_INFORMATION_UPDATE_NEEDED_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_EPS_BEARER_CONTEXT_STATUS_TYPE: - size = ogs_nas_decode_eps_bearer_context_status(&tracking_area_update_request->eps_bearer_context_status, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_CAPABILITY_TYPE: - size = ogs_nas_decode_ms_network_capability(&tracking_area_update_request->ms_network_capability, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_CAPABILITY_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_TYPE: - size = ogs_nas_decode_location_area_identification(&tracking_area_update_request->old_location_area_identification, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_TMSI_STATUS_TYPE: - size = ogs_nas_decode_tmsi_status(&tracking_area_update_request->tmsi_status, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_TMSI_STATUS_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_2_TYPE: - size = ogs_nas_decode_mobile_station_classmark_2(&tracking_area_update_request->mobile_station_classmark_2, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_3_TYPE: - size = ogs_nas_decode_mobile_station_classmark_3(&tracking_area_update_request->mobile_station_classmark_3, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_3_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_SUPPORTED_CODECS_TYPE: - size = ogs_nas_decode_supported_codec_list(&tracking_area_update_request->supported_codecs, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_SUPPORTED_CODECS_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_UPDATE_TYPE_TYPE: - size = ogs_nas_decode_additional_update_type(&tracking_area_update_request->additional_update_type, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_TYPE: - size = ogs_nas_decode_voice_domain_preference_and_ue_usage_setting(&tracking_area_update_request->voice_domain_preference_and_ue_usage_setting, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_GUTI_TYPE_TYPE: - size = ogs_nas_decode_guti_type(&tracking_area_update_request->old_guti_type, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_GUTI_TYPE_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_DEVICE_PROPERTIES_TYPE: - size = ogs_nas_decode_device_properties(&tracking_area_update_request->device_properties, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_DEVICE_PROPERTIES_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_FEATURE_SUPPORT_TYPE: - size = ogs_nas_decode_ms_network_feature_support(&tracking_area_update_request->ms_network_feature_support, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_TMSI_BASED_NRI_CONTAINER_TYPE: - size = ogs_nas_decode_network_resource_identifier_container(&tracking_area_update_request->tmsi_based_nri_container, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_TMSI_BASED_NRI_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_T3324_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_2(&tracking_area_update_request->t3324_value, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_T3324_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_T3412_EXTENDED_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_3(&tracking_area_update_request->t3412_extended_value, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_T3412_EXTENDED_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_EXTENDED_DRX_PARAMETERS_TYPE: - size = ogs_nas_decode_extended_drx_parameters(&tracking_area_update_request->extended_drx_parameters, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_EXTENDED_DRX_PARAMETERS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_tracking_area_update_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_tracking_area_update_accept_t *tracking_area_update_accept = &message->emm.tracking_area_update_accept; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode TRACKING_AREA_UPDATE_ACCEPT\n"); - - size = ogs_nas_decode_eps_update_result(&tracking_area_update_accept->eps_update_result, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3412_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer(&tracking_area_update_accept->t3412_value, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3412_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_GUTI_TYPE: - size = ogs_nas_decode_eps_mobile_identity(&tracking_area_update_accept->guti, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_GUTI_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_TAI_LIST_TYPE: - size = ogs_nas_decode_tracking_area_identity_list(&tracking_area_update_accept->tai_list, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_TAI_LIST_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EPS_BEARER_CONTEXT_STATUS_TYPE: - size = ogs_nas_decode_eps_bearer_context_status(&tracking_area_update_accept->eps_bearer_context_status, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EPS_BEARER_CONTEXT_STATUS_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_LOCATION_AREA_IDENTIFICATION_TYPE: - size = ogs_nas_decode_location_area_identification(&tracking_area_update_accept->location_area_identification, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_MS_IDENTITY_TYPE: - size = ogs_nas_decode_mobile_identity(&tracking_area_update_accept->ms_identity, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_MS_IDENTITY_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EMM_CAUSE_TYPE: - size = ogs_nas_decode_emm_cause(&tracking_area_update_accept->emm_cause, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EMM_CAUSE_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3402_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer(&tracking_area_update_accept->t3402_value, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3402_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3423_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer(&tracking_area_update_accept->t3423_value, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3423_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EQUIVALENT_PLMNS_TYPE: - size = ogs_nas_decode_plmn_list(&tracking_area_update_accept->equivalent_plmns, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EQUIVALENT_PLMNS_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EMERGENCY_NUMBER_LIST_TYPE: - size = ogs_nas_decode_emergency_number_list(&tracking_area_update_accept->emergency_number_list, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_TYPE: - size = ogs_nas_decode_eps_network_feature_support(&tracking_area_update_accept->eps_network_feature_support, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_ADDITIONAL_UPDATE_RESULT_TYPE: - size = ogs_nas_decode_additional_update_result(&tracking_area_update_accept->additional_update_result, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_ADDITIONAL_UPDATE_RESULT_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3412_EXTENDED_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_3(&tracking_area_update_accept->t3412_extended_value, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3412_EXTENDED_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3324_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_2(&tracking_area_update_accept->t3324_value, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3324_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EXTENDED_DRX_PARAMETERS_TYPE: - size = ogs_nas_decode_extended_drx_parameters(&tracking_area_update_accept->extended_drx_parameters, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EXTENDED_DRX_PARAMETERS_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_HEADER_COMPRESSION_CONFIGURATION_STATUS_TYPE: - size = ogs_nas_decode_header_compression_configuration_status(&tracking_area_update_accept->header_compression_configuration_status, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_HEADER_COMPRESSION_CONFIGURATION_STATUS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_tracking_area_update_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_tracking_area_update_reject_t *tracking_area_update_reject = &message->emm.tracking_area_update_reject; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode TRACKING_AREA_UPDATE_REJECT\n"); - - size = ogs_nas_decode_emm_cause(&tracking_area_update_reject->emm_cause, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_TRACKING_AREA_UPDATE_REJECT_T3346_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_2(&tracking_area_update_reject->t3346_value, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_reject->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REJECT_T3346_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REJECT_EXTENDED_EMM_CAUSE_TYPE: - size = ogs_nas_decode_extended_emm_cause(&tracking_area_update_reject->extended_emm_cause, pkbuf); - ogs_assert(size >= 0); - tracking_area_update_reject->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REJECT_EXTENDED_EMM_CAUSE_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_extended_service_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_extended_service_request_t *extended_service_request = &message->emm.extended_service_request; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode EXTENDED_SERVICE_REQUEST\n"); - - size = ogs_nas_decode_service_type(&extended_service_request->service_type, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_mobile_identity(&extended_service_request->m_tmsi, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_EXTENDED_SERVICE_REQUEST_CSFB_RESPONSE_TYPE: - size = ogs_nas_decode_csfb_response(&extended_service_request->csfb_response, pkbuf); - ogs_assert(size >= 0); - extended_service_request->presencemask |= OGS_NAS_EXTENDED_SERVICE_REQUEST_CSFB_RESPONSE_PRESENT; - decoded += size; - break; - case OGS_NAS_EXTENDED_SERVICE_REQUEST_EPS_BEARER_CONTEXT_STATUS_TYPE: - size = ogs_nas_decode_eps_bearer_context_status(&extended_service_request->eps_bearer_context_status, pkbuf); - ogs_assert(size >= 0); - extended_service_request->presencemask |= OGS_NAS_EXTENDED_SERVICE_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT; - decoded += size; - break; - case OGS_NAS_EXTENDED_SERVICE_REQUEST_DEVICE_PROPERTIES_TYPE: - size = ogs_nas_decode_device_properties(&extended_service_request->device_properties, pkbuf); - ogs_assert(size >= 0); - extended_service_request->presencemask |= OGS_NAS_EXTENDED_SERVICE_REQUEST_DEVICE_PROPERTIES_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_service_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_service_request_t *service_request = &message->emm.service_request; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode SERVICE_REQUEST\n"); - - size = ogs_nas_decode_ksi_and_sequence_number(&service_request->ksi_and_sequence_number, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_short_mac(&service_request->message_authentication_code, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - return decoded; -} - -int ogs_nas_decode_service_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_service_reject_t *service_reject = &message->emm.service_reject; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode SERVICE_REJECT\n"); - - size = ogs_nas_decode_emm_cause(&service_reject->emm_cause, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_SERVICE_REJECT_T3346_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_2(&service_reject->t3346_value, pkbuf); - ogs_assert(size >= 0); - service_reject->presencemask |= OGS_NAS_SERVICE_REJECT_T3346_VALUE_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_guti_reallocation_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_guti_reallocation_command_t *guti_reallocation_command = &message->emm.guti_reallocation_command; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode GUTI_REALLOCATION_COMMAND\n"); - - size = ogs_nas_decode_eps_mobile_identity(&guti_reallocation_command->guti, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_GUTI_REALLOCATION_COMMAND_TAI_LIST_TYPE: - size = ogs_nas_decode_tracking_area_identity_list(&guti_reallocation_command->tai_list, pkbuf); - ogs_assert(size >= 0); - guti_reallocation_command->presencemask |= OGS_NAS_GUTI_REALLOCATION_COMMAND_TAI_LIST_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_authentication_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_authentication_request_t *authentication_request = &message->emm.authentication_request; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode AUTHENTICATION_REQUEST\n"); - - size = ogs_nas_decode_key_set_identifier(&authentication_request->nas_key_set_identifierasme, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_authentication_parameter_rand(&authentication_request->authentication_parameter_rand, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_authentication_parameter_autn(&authentication_request->authentication_parameter_autn, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - return decoded; -} - -int ogs_nas_decode_authentication_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_authentication_response_t *authentication_response = &message->emm.authentication_response; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode AUTHENTICATION_RESPONSE\n"); - - size = ogs_nas_decode_authentication_response_parameter(&authentication_response->authentication_response_parameter, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - return decoded; -} - -int ogs_nas_decode_identity_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_identity_request_t *identity_request = &message->emm.identity_request; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode IDENTITY_REQUEST\n"); - - size = ogs_nas_decode_identity_type_2(&identity_request->identity_type, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - return decoded; -} - -int ogs_nas_decode_identity_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_identity_response_t *identity_response = &message->emm.identity_response; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode IDENTITY_RESPONSE\n"); - - size = ogs_nas_decode_mobile_identity(&identity_response->mobile_identity, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - return decoded; -} - -int ogs_nas_decode_authentication_failure(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_authentication_failure_t *authentication_failure = &message->emm.authentication_failure; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode AUTHENTICATION_FAILURE\n"); - - size = ogs_nas_decode_emm_cause(&authentication_failure->emm_cause, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_TYPE: - size = ogs_nas_decode_authentication_failure_parameter(&authentication_failure->authentication_failure_parameter, pkbuf); - ogs_assert(size >= 0); - authentication_failure->presencemask |= OGS_NAS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_security_mode_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_security_mode_command_t *security_mode_command = &message->emm.security_mode_command; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode SECURITY_MODE_COMMAND\n"); - - size = ogs_nas_decode_security_algorithms(&security_mode_command->selected_nas_security_algorithms, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_key_set_identifier(&security_mode_command->nas_key_set_identifier, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_ue_security_capability(&security_mode_command->replayed_ue_security_capabilities, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_TYPE: - size = ogs_nas_decode_imeisv_request(&security_mode_command->imeisv_request, pkbuf); - ogs_assert(size >= 0); - security_mode_command->presencemask |= OGS_NAS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT; - decoded += size; - break; - case OGS_NAS_SECURITY_MODE_COMMAND_REPLAYED_NONCEUE_TYPE: - size = ogs_nas_decode_nonce(&security_mode_command->replayed_nonceue, pkbuf); - ogs_assert(size >= 0); - security_mode_command->presencemask |= OGS_NAS_SECURITY_MODE_COMMAND_REPLAYED_NONCEUE_PRESENT; - decoded += size; - break; - case OGS_NAS_SECURITY_MODE_COMMAND_NONCEMME_TYPE: - size = ogs_nas_decode_nonce(&security_mode_command->noncemme, pkbuf); - ogs_assert(size >= 0); - security_mode_command->presencemask |= OGS_NAS_SECURITY_MODE_COMMAND_NONCEMME_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_security_mode_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_security_mode_complete_t *security_mode_complete = &message->emm.security_mode_complete; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode SECURITY_MODE_COMPLETE\n"); - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_SECURITY_MODE_COMPLETE_IMEISV_TYPE: - size = ogs_nas_decode_mobile_identity(&security_mode_complete->imeisv, pkbuf); - ogs_assert(size >= 0); - security_mode_complete->presencemask |= OGS_NAS_SECURITY_MODE_COMPLETE_IMEISV_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_security_mode_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_security_mode_reject_t *security_mode_reject = &message->emm.security_mode_reject; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode SECURITY_MODE_REJECT\n"); - - size = ogs_nas_decode_emm_cause(&security_mode_reject->emm_cause, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - return decoded; -} - -int ogs_nas_decode_emm_status(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_emm_status_t *emm_status = &message->emm.emm_status; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode EMM_STATUS\n"); - - size = ogs_nas_decode_emm_cause(&emm_status->emm_cause, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - return decoded; -} - -int ogs_nas_decode_emm_information(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_emm_information_t *emm_information = &message->emm.emm_information; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode EMM_INFORMATION\n"); - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_EMM_INFORMATION_FULL_NAME_FOR_NETWORK_TYPE: - size = ogs_nas_decode_network_name(&emm_information->full_name_for_network, pkbuf); - ogs_assert(size >= 0); - emm_information->presencemask |= OGS_NAS_EMM_INFORMATION_FULL_NAME_FOR_NETWORK_PRESENT; - decoded += size; - break; - case OGS_NAS_EMM_INFORMATION_SHORT_NAME_FOR_NETWORK_TYPE: - size = ogs_nas_decode_network_name(&emm_information->short_name_for_network, pkbuf); - ogs_assert(size >= 0); - emm_information->presencemask |= OGS_NAS_EMM_INFORMATION_SHORT_NAME_FOR_NETWORK_PRESENT; - decoded += size; - break; - case OGS_NAS_EMM_INFORMATION_LOCAL_TIME_ZONE_TYPE: - size = ogs_nas_decode_time_zone(&emm_information->local_time_zone, pkbuf); - ogs_assert(size >= 0); - emm_information->presencemask |= OGS_NAS_EMM_INFORMATION_LOCAL_TIME_ZONE_PRESENT; - decoded += size; - break; - case OGS_NAS_EMM_INFORMATION_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_TYPE: - size = ogs_nas_decode_time_zone_and_time(&emm_information->universal_time_and_local_time_zone, pkbuf); - ogs_assert(size >= 0); - emm_information->presencemask |= OGS_NAS_EMM_INFORMATION_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_PRESENT; - decoded += size; - break; - case OGS_NAS_EMM_INFORMATION_NETWORK_DAYLIGHT_SAVING_TIME_TYPE: - size = ogs_nas_decode_daylight_saving_time(&emm_information->network_daylight_saving_time, pkbuf); - ogs_assert(size >= 0); - emm_information->presencemask |= OGS_NAS_EMM_INFORMATION_NETWORK_DAYLIGHT_SAVING_TIME_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_downlink_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_downlink_nas_transport_t *downlink_nas_transport = &message->emm.downlink_nas_transport; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode DOWNLINK_NAS_TRANSPORT\n"); - - size = ogs_nas_decode_message_container(&downlink_nas_transport->nas_message_container, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - return decoded; -} - -int ogs_nas_decode_uplink_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_uplink_nas_transport_t *uplink_nas_transport = &message->emm.uplink_nas_transport; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode UPLINK_NAS_TRANSPORT\n"); - - size = ogs_nas_decode_message_container(&uplink_nas_transport->nas_message_container, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - return decoded; -} - -int ogs_nas_decode_cs_service_notification(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_cs_service_notification_t *cs_service_notification = &message->emm.cs_service_notification; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode CS_SERVICE_NOTIFICATION\n"); - - size = ogs_nas_decode_paging_identity(&cs_service_notification->paging_identity, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_CS_SERVICE_NOTIFICATION_CLI_TYPE: - size = ogs_nas_decode_cli(&cs_service_notification->cli, pkbuf); - ogs_assert(size >= 0); - cs_service_notification->presencemask |= OGS_NAS_CS_SERVICE_NOTIFICATION_CLI_PRESENT; - decoded += size; - break; - case OGS_NAS_CS_SERVICE_NOTIFICATION_SS_CODE_TYPE: - size = ogs_nas_decode_ss_code(&cs_service_notification->ss_code, pkbuf); - ogs_assert(size >= 0); - cs_service_notification->presencemask |= OGS_NAS_CS_SERVICE_NOTIFICATION_SS_CODE_PRESENT; - decoded += size; - break; - case OGS_NAS_CS_SERVICE_NOTIFICATION_LCS_INDICATOR_TYPE: - size = ogs_nas_decode_lcs_indicator(&cs_service_notification->lcs_indicator, pkbuf); - ogs_assert(size >= 0); - cs_service_notification->presencemask |= OGS_NAS_CS_SERVICE_NOTIFICATION_LCS_INDICATOR_PRESENT; - decoded += size; - break; - case OGS_NAS_CS_SERVICE_NOTIFICATION_LCS_CLIENT_IDENTITY_TYPE: - size = ogs_nas_decode_lcs_client_identity(&cs_service_notification->lcs_client_identity, pkbuf); - ogs_assert(size >= 0); - cs_service_notification->presencemask |= OGS_NAS_CS_SERVICE_NOTIFICATION_LCS_CLIENT_IDENTITY_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_uplink_generic_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_uplink_generic_nas_transport_t *uplink_generic_nas_transport = &message->emm.uplink_generic_nas_transport; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode UPLINK_GENERIC_NAS_TRANSPORT\n"); - - size = ogs_nas_decode_generic_message_container_type(&uplink_generic_nas_transport->generic_message_container_type, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_generic_message_container(&uplink_generic_nas_transport->generic_message_container, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_UPLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE: - size = ogs_nas_decode_additional_information(&uplink_generic_nas_transport->additional_information, pkbuf); - ogs_assert(size >= 0); - uplink_generic_nas_transport->presencemask |= OGS_NAS_UPLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_downlink_generic_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_downlink_generic_nas_transport_t *downlink_generic_nas_transport = &message->emm.downlink_generic_nas_transport; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode DOWNLINK_GENERIC_NAS_TRANSPORT\n"); - - size = ogs_nas_decode_generic_message_container_type(&downlink_generic_nas_transport->generic_message_container_type, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_generic_message_container(&downlink_generic_nas_transport->generic_message_container, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_DOWNLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE: - size = ogs_nas_decode_additional_information(&downlink_generic_nas_transport->additional_information, pkbuf); - ogs_assert(size >= 0); - downlink_generic_nas_transport->presencemask |= OGS_NAS_DOWNLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_activate_default_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_activate_default_eps_bearer_context_request_t *activate_default_eps_bearer_context_request = &message->esm.activate_default_eps_bearer_context_request; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST\n"); - - size = ogs_nas_decode_eps_quality_of_service(&activate_default_eps_bearer_context_request->eps_qos, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_access_point_name(&activate_default_eps_bearer_context_request->access_point_name, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_pdn_address(&activate_default_eps_bearer_context_request->pdn_address, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_TYPE: - size = ogs_nas_decode_transaction_identifier(&activate_default_eps_bearer_context_request->transaction_identifier, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_TYPE: - size = ogs_nas_decode_quality_of_service(&activate_default_eps_bearer_context_request->negotiated_qos, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_TYPE: - size = ogs_nas_decode_llc_service_access_point_identifier(&activate_default_eps_bearer_context_request->negotiated_llc_sapi, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_TYPE: - size = ogs_nas_decode_radio_priority(&activate_default_eps_bearer_context_request->radio_priority, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_TYPE: - size = ogs_nas_decode_packet_flow_identifier(&activate_default_eps_bearer_context_request->packet_flow_identifier, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_TYPE: - size = ogs_nas_decode_apn_aggregate_maximum_bit_rate(&activate_default_eps_bearer_context_request->apn_ambr, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_TYPE: - size = ogs_nas_decode_esm_cause(&activate_default_eps_bearer_context_request->esm_cause, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&activate_default_eps_bearer_context_request->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONNECTIVITY_TYPE_TYPE: - size = ogs_nas_decode_connectivity_type(&activate_default_eps_bearer_context_request->connectivity_type, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONNECTIVITY_TYPE_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE: - size = ogs_nas_decode_wlan_offload_acceptability(&activate_default_eps_bearer_context_request->wlan_offload_indication, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE: - size = ogs_nas_decode_nbifom_container(&activate_default_eps_bearer_context_request->nbifom_container, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE: - size = ogs_nas_decode_header_compression_configuration(&activate_default_eps_bearer_context_request->header_compression_configuration, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONTROL_PLANE_ONLY_INDICATION_TYPE: - size = ogs_nas_decode_control_plane_only_indication(&activate_default_eps_bearer_context_request->control_plane_only_indication, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONTROL_PLANE_ONLY_INDICATION_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&activate_default_eps_bearer_context_request->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_SERVING_PLMN_RATE_CONTROL_TYPE: - size = ogs_nas_decode_serving_plmn_rate_control(&activate_default_eps_bearer_context_request->serving_plmn_rate_control, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_SERVING_PLMN_RATE_CONTROL_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_activate_default_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_activate_default_eps_bearer_context_accept_t *activate_default_eps_bearer_context_accept = &message->esm.activate_default_eps_bearer_context_accept; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT\n"); - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&activate_default_eps_bearer_context_accept->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_accept->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&activate_default_eps_bearer_context_accept->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_accept->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_activate_default_eps_bearer_context_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_activate_default_eps_bearer_context_reject_t *activate_default_eps_bearer_context_reject = &message->esm.activate_default_eps_bearer_context_reject; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT\n"); - - size = ogs_nas_decode_esm_cause(&activate_default_eps_bearer_context_reject->esm_cause, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&activate_default_eps_bearer_context_reject->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_reject->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&activate_default_eps_bearer_context_reject->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - activate_default_eps_bearer_context_reject->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_activate_dedicated_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_activate_dedicated_eps_bearer_context_request_t *activate_dedicated_eps_bearer_context_request = &message->esm.activate_dedicated_eps_bearer_context_request; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST\n"); - - size = ogs_nas_decode_linked_eps_bearer_identity(&activate_dedicated_eps_bearer_context_request->linked_eps_bearer_identity, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_eps_quality_of_service(&activate_dedicated_eps_bearer_context_request->eps_qos, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_traffic_flow_template(&activate_dedicated_eps_bearer_context_request->tft, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_TYPE: - size = ogs_nas_decode_transaction_identifier(&activate_dedicated_eps_bearer_context_request->transaction_identifier, pkbuf); - ogs_assert(size >= 0); - activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_TYPE: - size = ogs_nas_decode_quality_of_service(&activate_dedicated_eps_bearer_context_request->negotiated_qos, pkbuf); - ogs_assert(size >= 0); - activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_TYPE: - size = ogs_nas_decode_llc_service_access_point_identifier(&activate_dedicated_eps_bearer_context_request->negotiated_llc_sapi, pkbuf); - ogs_assert(size >= 0); - activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_TYPE: - size = ogs_nas_decode_radio_priority(&activate_dedicated_eps_bearer_context_request->radio_priority, pkbuf); - ogs_assert(size >= 0); - activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_TYPE: - size = ogs_nas_decode_packet_flow_identifier(&activate_dedicated_eps_bearer_context_request->packet_flow_identifier, pkbuf); - ogs_assert(size >= 0); - activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&activate_dedicated_eps_bearer_context_request->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE: - size = ogs_nas_decode_wlan_offload_acceptability(&activate_dedicated_eps_bearer_context_request->wlan_offload_indication, pkbuf); - ogs_assert(size >= 0); - activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE: - size = ogs_nas_decode_nbifom_container(&activate_dedicated_eps_bearer_context_request->nbifom_container, pkbuf); - ogs_assert(size >= 0); - activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&activate_dedicated_eps_bearer_context_request->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_activate_dedicated_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_activate_dedicated_eps_bearer_context_accept_t *activate_dedicated_eps_bearer_context_accept = &message->esm.activate_dedicated_eps_bearer_context_accept; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT\n"); - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&activate_dedicated_eps_bearer_context_accept->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - activate_dedicated_eps_bearer_context_accept->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_TYPE: - size = ogs_nas_decode_nbifom_container(&activate_dedicated_eps_bearer_context_accept->nbifom_container, pkbuf); - ogs_assert(size >= 0); - activate_dedicated_eps_bearer_context_accept->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&activate_dedicated_eps_bearer_context_accept->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - activate_dedicated_eps_bearer_context_accept->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_activate_dedicated_eps_bearer_context_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_activate_dedicated_eps_bearer_context_reject_t *activate_dedicated_eps_bearer_context_reject = &message->esm.activate_dedicated_eps_bearer_context_reject; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT\n"); - - size = ogs_nas_decode_esm_cause(&activate_dedicated_eps_bearer_context_reject->esm_cause, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&activate_dedicated_eps_bearer_context_reject->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - activate_dedicated_eps_bearer_context_reject->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_TYPE: - size = ogs_nas_decode_nbifom_container(&activate_dedicated_eps_bearer_context_reject->nbifom_container, pkbuf); - ogs_assert(size >= 0); - activate_dedicated_eps_bearer_context_reject->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&activate_dedicated_eps_bearer_context_reject->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - activate_dedicated_eps_bearer_context_reject->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_modify_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_modify_eps_bearer_context_request_t *modify_eps_bearer_context_request = &message->esm.modify_eps_bearer_context_request; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode MODIFY_EPS_BEARER_CONTEXT_REQUEST\n"); - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_EPS_QOS_TYPE: - size = ogs_nas_decode_eps_quality_of_service(&modify_eps_bearer_context_request->new_eps_qos, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_EPS_QOS_PRESENT; - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_TFT_TYPE: - size = ogs_nas_decode_traffic_flow_template(&modify_eps_bearer_context_request->tft, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_TFT_PRESENT; - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_QOS_TYPE: - size = ogs_nas_decode_quality_of_service(&modify_eps_bearer_context_request->new_qos, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_QOS_PRESENT; - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_TYPE: - size = ogs_nas_decode_llc_service_access_point_identifier(&modify_eps_bearer_context_request->negotiated_llc_sapi, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_PRESENT; - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_TYPE: - size = ogs_nas_decode_radio_priority(&modify_eps_bearer_context_request->radio_priority, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_PRESENT; - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_TYPE: - size = ogs_nas_decode_packet_flow_identifier(&modify_eps_bearer_context_request->packet_flow_identifier, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_PRESENT; - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_TYPE: - size = ogs_nas_decode_apn_aggregate_maximum_bit_rate(&modify_eps_bearer_context_request->apn_ambr, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_PRESENT; - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&modify_eps_bearer_context_request->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE: - size = ogs_nas_decode_wlan_offload_acceptability(&modify_eps_bearer_context_request->wlan_offload_indication, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT; - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE: - size = ogs_nas_decode_nbifom_container(&modify_eps_bearer_context_request->nbifom_container, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE: - size = ogs_nas_decode_header_compression_configuration(&modify_eps_bearer_context_request->header_compression_configuration, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT; - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&modify_eps_bearer_context_request->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_modify_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_modify_eps_bearer_context_accept_t *modify_eps_bearer_context_accept = &message->esm.modify_eps_bearer_context_accept; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode MODIFY_EPS_BEARER_CONTEXT_ACCEPT\n"); - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&modify_eps_bearer_context_accept->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_accept->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_TYPE: - size = ogs_nas_decode_nbifom_container(&modify_eps_bearer_context_accept->nbifom_container, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_accept->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&modify_eps_bearer_context_accept->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_accept->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_modify_eps_bearer_context_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_modify_eps_bearer_context_reject_t *modify_eps_bearer_context_reject = &message->esm.modify_eps_bearer_context_reject; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode MODIFY_EPS_BEARER_CONTEXT_REJECT\n"); - - size = ogs_nas_decode_esm_cause(&modify_eps_bearer_context_reject->esm_cause, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&modify_eps_bearer_context_reject->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_reject->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_TYPE: - size = ogs_nas_decode_nbifom_container(&modify_eps_bearer_context_reject->nbifom_container, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_reject->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&modify_eps_bearer_context_reject->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - modify_eps_bearer_context_reject->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_deactivate_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_deactivate_eps_bearer_context_request_t *deactivate_eps_bearer_context_request = &message->esm.deactivate_eps_bearer_context_request; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST\n"); - - size = ogs_nas_decode_esm_cause(&deactivate_eps_bearer_context_request->esm_cause, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&deactivate_eps_bearer_context_request->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - deactivate_eps_bearer_context_request->presencemask |= OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_T3396_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_3(&deactivate_eps_bearer_context_request->t3396_value, pkbuf); - ogs_assert(size >= 0); - deactivate_eps_bearer_context_request->presencemask |= OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_T3396_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE: - size = ogs_nas_decode_wlan_offload_acceptability(&deactivate_eps_bearer_context_request->wlan_offload_indication, pkbuf); - ogs_assert(size >= 0); - deactivate_eps_bearer_context_request->presencemask |= OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT; - decoded += size; - break; - case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE: - size = ogs_nas_decode_nbifom_container(&deactivate_eps_bearer_context_request->nbifom_container, pkbuf); - ogs_assert(size >= 0); - deactivate_eps_bearer_context_request->presencemask |= OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&deactivate_eps_bearer_context_request->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - deactivate_eps_bearer_context_request->presencemask |= OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_deactivate_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_deactivate_eps_bearer_context_accept_t *deactivate_eps_bearer_context_accept = &message->esm.deactivate_eps_bearer_context_accept; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT\n"); - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&deactivate_eps_bearer_context_accept->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - deactivate_eps_bearer_context_accept->presencemask |= OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&deactivate_eps_bearer_context_accept->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - deactivate_eps_bearer_context_accept->presencemask |= OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_pdn_connectivity_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_pdn_connectivity_request_t *pdn_connectivity_request = &message->esm.pdn_connectivity_request; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode PDN_CONNECTIVITY_REQUEST\n"); - - size = ogs_nas_decode_request_type(&pdn_connectivity_request->request_type, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_PDN_CONNECTIVITY_REQUEST_ESM_INFORMATION_TRANSFER_FLAG_TYPE: - size = ogs_nas_decode_esm_information_transfer_flag(&pdn_connectivity_request->esm_information_transfer_flag, pkbuf); - ogs_assert(size >= 0); - pdn_connectivity_request->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REQUEST_ESM_INFORMATION_TRANSFER_FLAG_PRESENT; - decoded += size; - break; - case OGS_NAS_PDN_CONNECTIVITY_REQUEST_ACCESS_POINT_NAME_TYPE: - size = ogs_nas_decode_access_point_name(&pdn_connectivity_request->access_point_name, pkbuf); - ogs_assert(size >= 0); - pdn_connectivity_request->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REQUEST_ACCESS_POINT_NAME_PRESENT; - decoded += size; - break; - case OGS_NAS_PDN_CONNECTIVITY_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&pdn_connectivity_request->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - pdn_connectivity_request->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_PDN_CONNECTIVITY_REQUEST_DEVICE_PROPERTIES_TYPE: - size = ogs_nas_decode_device_properties(&pdn_connectivity_request->device_properties, pkbuf); - ogs_assert(size >= 0); - pdn_connectivity_request->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REQUEST_DEVICE_PROPERTIES_PRESENT; - decoded += size; - break; - case OGS_NAS_PDN_CONNECTIVITY_REQUEST_NBIFOM_CONTAINER_TYPE: - size = ogs_nas_decode_nbifom_container(&pdn_connectivity_request->nbifom_container, pkbuf); - ogs_assert(size >= 0); - pdn_connectivity_request->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REQUEST_NBIFOM_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_PDN_CONNECTIVITY_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE: - size = ogs_nas_decode_header_compression_configuration(&pdn_connectivity_request->header_compression_configuration, pkbuf); - ogs_assert(size >= 0); - pdn_connectivity_request->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT; - decoded += size; - break; - case OGS_NAS_PDN_CONNECTIVITY_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&pdn_connectivity_request->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - pdn_connectivity_request->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_pdn_connectivity_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_pdn_connectivity_reject_t *pdn_connectivity_reject = &message->esm.pdn_connectivity_reject; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode PDN_CONNECTIVITY_REJECT\n"); - - size = ogs_nas_decode_esm_cause(&pdn_connectivity_reject->esm_cause, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_PDN_CONNECTIVITY_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&pdn_connectivity_reject->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - pdn_connectivity_reject->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_PDN_CONNECTIVITY_REJECT_BACK_OFF_TIMER_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_3(&pdn_connectivity_reject->back_off_timer_value, pkbuf); - ogs_assert(size >= 0); - pdn_connectivity_reject->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REJECT_BACK_OFF_TIMER_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_PDN_CONNECTIVITY_REJECT_RE_ATTEMPT_INDICATOR_TYPE: - size = ogs_nas_decode_re_attempt_indicator(&pdn_connectivity_reject->re_attempt_indicator, pkbuf); - ogs_assert(size >= 0); - pdn_connectivity_reject->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REJECT_RE_ATTEMPT_INDICATOR_PRESENT; - decoded += size; - break; - case OGS_NAS_PDN_CONNECTIVITY_REJECT_NBIFOM_CONTAINER_TYPE: - size = ogs_nas_decode_nbifom_container(&pdn_connectivity_reject->nbifom_container, pkbuf); - ogs_assert(size >= 0); - pdn_connectivity_reject->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REJECT_NBIFOM_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_PDN_CONNECTIVITY_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&pdn_connectivity_reject->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - pdn_connectivity_reject->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_pdn_disconnect_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_pdn_disconnect_request_t *pdn_disconnect_request = &message->esm.pdn_disconnect_request; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode PDN_DISCONNECT_REQUEST\n"); - - size = ogs_nas_decode_linked_eps_bearer_identity(&pdn_disconnect_request->linked_eps_bearer_identity, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_PDN_DISCONNECT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&pdn_disconnect_request->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - pdn_disconnect_request->presencemask |= OGS_NAS_PDN_DISCONNECT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_PDN_DISCONNECT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&pdn_disconnect_request->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - pdn_disconnect_request->presencemask |= OGS_NAS_PDN_DISCONNECT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_pdn_disconnect_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_pdn_disconnect_reject_t *pdn_disconnect_reject = &message->esm.pdn_disconnect_reject; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode PDN_DISCONNECT_REJECT\n"); - - size = ogs_nas_decode_esm_cause(&pdn_disconnect_reject->esm_cause, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_PDN_DISCONNECT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&pdn_disconnect_reject->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - pdn_disconnect_reject->presencemask |= OGS_NAS_PDN_DISCONNECT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_PDN_DISCONNECT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&pdn_disconnect_reject->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - pdn_disconnect_reject->presencemask |= OGS_NAS_PDN_DISCONNECT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_bearer_resource_allocation_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_bearer_resource_allocation_request_t *bearer_resource_allocation_request = &message->esm.bearer_resource_allocation_request; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode BEARER_RESOURCE_ALLOCATION_REQUEST\n"); - - size = ogs_nas_decode_linked_eps_bearer_identity(&bearer_resource_allocation_request->linked_eps_bearer_identity, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_traffic_flow_aggregate_description(&bearer_resource_allocation_request->traffic_flow_aggregate, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_eps_quality_of_service(&bearer_resource_allocation_request->required_traffic_flow_qos, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&bearer_resource_allocation_request->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - bearer_resource_allocation_request->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_DEVICE_PROPERTIES_TYPE: - size = ogs_nas_decode_device_properties(&bearer_resource_allocation_request->device_properties, pkbuf); - ogs_assert(size >= 0); - bearer_resource_allocation_request->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_DEVICE_PROPERTIES_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_NBIFOM_CONTAINER_TYPE: - size = ogs_nas_decode_nbifom_container(&bearer_resource_allocation_request->nbifom_container, pkbuf); - ogs_assert(size >= 0); - bearer_resource_allocation_request->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_NBIFOM_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&bearer_resource_allocation_request->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - bearer_resource_allocation_request->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_bearer_resource_allocation_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_bearer_resource_allocation_reject_t *bearer_resource_allocation_reject = &message->esm.bearer_resource_allocation_reject; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode BEARER_RESOURCE_ALLOCATION_REJECT\n"); - - size = ogs_nas_decode_esm_cause(&bearer_resource_allocation_reject->esm_cause, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&bearer_resource_allocation_reject->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - bearer_resource_allocation_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_BACK_OFF_TIMER_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_3(&bearer_resource_allocation_reject->back_off_timer_value, pkbuf); - ogs_assert(size >= 0); - bearer_resource_allocation_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_BACK_OFF_TIMER_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_RE_ATTEMPT_INDICATOR_TYPE: - size = ogs_nas_decode_re_attempt_indicator(&bearer_resource_allocation_reject->re_attempt_indicator, pkbuf); - ogs_assert(size >= 0); - bearer_resource_allocation_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_RE_ATTEMPT_INDICATOR_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_NBIFOM_CONTAINER_TYPE: - size = ogs_nas_decode_nbifom_container(&bearer_resource_allocation_reject->nbifom_container, pkbuf); - ogs_assert(size >= 0); - bearer_resource_allocation_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_NBIFOM_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&bearer_resource_allocation_reject->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - bearer_resource_allocation_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_bearer_resource_modification_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_bearer_resource_modification_request_t *bearer_resource_modification_request = &message->esm.bearer_resource_modification_request; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode BEARER_RESOURCE_MODIFICATION_REQUEST\n"); - - size = ogs_nas_decode_linked_eps_bearer_identity(&bearer_resource_modification_request->eps_bearer_identity_for_packet_filter, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - size = ogs_nas_decode_traffic_flow_aggregate_description(&bearer_resource_modification_request->traffic_flow_aggregate, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_REQUIRED_TRAFFIC_FLOW_QOS_TYPE: - size = ogs_nas_decode_eps_quality_of_service(&bearer_resource_modification_request->required_traffic_flow_qos, pkbuf); - ogs_assert(size >= 0); - bearer_resource_modification_request->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_REQUIRED_TRAFFIC_FLOW_QOS_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_ESM_CAUSE_TYPE: - size = ogs_nas_decode_esm_cause(&bearer_resource_modification_request->esm_cause, pkbuf); - ogs_assert(size >= 0); - bearer_resource_modification_request->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_ESM_CAUSE_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&bearer_resource_modification_request->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - bearer_resource_modification_request->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_DEVICE_PROPERTIES_TYPE: - size = ogs_nas_decode_device_properties(&bearer_resource_modification_request->device_properties, pkbuf); - ogs_assert(size >= 0); - bearer_resource_modification_request->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_DEVICE_PROPERTIES_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_NBIFOM_CONTAINER_TYPE: - size = ogs_nas_decode_nbifom_container(&bearer_resource_modification_request->nbifom_container, pkbuf); - ogs_assert(size >= 0); - bearer_resource_modification_request->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_NBIFOM_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE: - size = ogs_nas_decode_header_compression_configuration(&bearer_resource_modification_request->header_compression_configuration, pkbuf); - ogs_assert(size >= 0); - bearer_resource_modification_request->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&bearer_resource_modification_request->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - bearer_resource_modification_request->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_bearer_resource_modification_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_bearer_resource_modification_reject_t *bearer_resource_modification_reject = &message->esm.bearer_resource_modification_reject; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode BEARER_RESOURCE_MODIFICATION_REJECT\n"); - - size = ogs_nas_decode_esm_cause(&bearer_resource_modification_reject->esm_cause, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&bearer_resource_modification_reject->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - bearer_resource_modification_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_BACK_OFF_TIMER_VALUE_TYPE: - size = ogs_nas_decode_gprs_timer_3(&bearer_resource_modification_reject->back_off_timer_value, pkbuf); - ogs_assert(size >= 0); - bearer_resource_modification_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_BACK_OFF_TIMER_VALUE_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_RE_ATTEMPT_INDICATOR_TYPE: - size = ogs_nas_decode_re_attempt_indicator(&bearer_resource_modification_reject->re_attempt_indicator, pkbuf); - ogs_assert(size >= 0); - bearer_resource_modification_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_RE_ATTEMPT_INDICATOR_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_NBIFOM_CONTAINER_TYPE: - size = ogs_nas_decode_nbifom_container(&bearer_resource_modification_reject->nbifom_container, pkbuf); - ogs_assert(size >= 0); - bearer_resource_modification_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_NBIFOM_CONTAINER_PRESENT; - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&bearer_resource_modification_reject->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - bearer_resource_modification_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_esm_information_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_esm_information_response_t *esm_information_response = &message->esm.esm_information_response; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode ESM_INFORMATION_RESPONSE\n"); - - while(pkbuf->len > 0) - { - uint8_t *buffer = pkbuf->data; - uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); - - size = sizeof(uint8_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - decoded += size; - - switch(type) - { - case OGS_NAS_ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_TYPE: - size = ogs_nas_decode_access_point_name(&esm_information_response->access_point_name, pkbuf); - ogs_assert(size >= 0); - esm_information_response->presencemask |= OGS_NAS_ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_PRESENT; - decoded += size; - break; - case OGS_NAS_ESM_INFORMATION_RESPONSE_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_protocol_configuration_options(&esm_information_response->protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - esm_information_response->presencemask |= OGS_NAS_ESM_INFORMATION_RESPONSE_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - case OGS_NAS_ESM_INFORMATION_RESPONSE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: - size = ogs_nas_decode_extended_protocol_configuration_options(&esm_information_response->extended_protocol_configuration_options, pkbuf); - ogs_assert(size >= 0); - esm_information_response->presencemask |= OGS_NAS_ESM_INFORMATION_RESPONSE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - decoded += size; - break; - default: - ogs_warn("Unknown type(0x%x) or not implemented\n", type); - break; - } - } - - return decoded; -} - -int ogs_nas_decode_esm_status(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - ogs_nas_esm_status_t *esm_status = &message->esm.esm_status; - int decoded = 0; - int size = 0; - - ogs_trace("[NAS] Decode ESM_STATUS\n"); - - size = ogs_nas_decode_esm_cause(&esm_status->esm_cause, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - return decoded; -} - -int ogs_nas_emm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - int size = 0; - uint16_t decoded = 0; - - ogs_assert(pkbuf); - ogs_assert(pkbuf->data); - ogs_assert(pkbuf->len); - - memset(message, 0, sizeof(ogs_nas_message_t)); - - size = sizeof(ogs_nas_emm_header_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - memcpy(&message->emm.h, pkbuf->data - size, size); - decoded += size; - - if (message->emm.h.security_header_type >= - OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) - { - ogs_assert(ogs_pkbuf_push(pkbuf, 1)); - decoded -= 1; - size = ogs_nas_decode_service_request(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - - goto out; - } - - switch(message->emm.h.message_type) - { - case OGS_NAS_ATTACH_REQUEST: - size = ogs_nas_decode_attach_request(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_ATTACH_ACCEPT: - size = ogs_nas_decode_attach_accept(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_ATTACH_COMPLETE: - size = ogs_nas_decode_attach_complete(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_ATTACH_REJECT: - size = ogs_nas_decode_attach_reject(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_DETACH_REQUEST: - size = ogs_nas_decode_detach_request_from_ue(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_DETACH_ACCEPT: - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST: - size = ogs_nas_decode_tracking_area_update_request(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT: - size = ogs_nas_decode_tracking_area_update_accept(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_COMPLETE: - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REJECT: - size = ogs_nas_decode_tracking_area_update_reject(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_EXTENDED_SERVICE_REQUEST: - size = ogs_nas_decode_extended_service_request(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_SERVICE_REJECT: - size = ogs_nas_decode_service_reject(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_GUTI_REALLOCATION_COMMAND: - size = ogs_nas_decode_guti_reallocation_command(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_GUTI_REALLOCATION_COMPLETE: - break; - case OGS_NAS_AUTHENTICATION_REQUEST: - size = ogs_nas_decode_authentication_request(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_AUTHENTICATION_RESPONSE: - size = ogs_nas_decode_authentication_response(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_AUTHENTICATION_REJECT: - break; - case OGS_NAS_IDENTITY_REQUEST: - size = ogs_nas_decode_identity_request(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_IDENTITY_RESPONSE: - size = ogs_nas_decode_identity_response(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_AUTHENTICATION_FAILURE: - size = ogs_nas_decode_authentication_failure(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_SECURITY_MODE_COMMAND: - size = ogs_nas_decode_security_mode_command(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_SECURITY_MODE_COMPLETE: - size = ogs_nas_decode_security_mode_complete(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_SECURITY_MODE_REJECT: - size = ogs_nas_decode_security_mode_reject(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_EMM_STATUS: - size = ogs_nas_decode_emm_status(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_EMM_INFORMATION: - size = ogs_nas_decode_emm_information(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_DOWNLINK_NAS_TRANSPORT: - size = ogs_nas_decode_downlink_nas_transport(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_UPLINK_NAS_TRANSPORT: - size = ogs_nas_decode_uplink_nas_transport(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_CS_SERVICE_NOTIFICATION: - size = ogs_nas_decode_cs_service_notification(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_UPLINK_GENERIC_NAS_TRANSPORT: - size = ogs_nas_decode_uplink_generic_nas_transport(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_DOWNLINK_GENERIC_NAS_TRANSPORT: - size = ogs_nas_decode_downlink_generic_nas_transport(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - default: - ogs_error("Unknown message type (0x%x) or not implemented", - message->emm.h.message_type); - break; - } - -out: - ogs_assert(ogs_pkbuf_push(pkbuf, decoded)); - - return OGS_OK; -} -int ogs_nas_esm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) -{ - int size = 0; - uint16_t decoded = 0; - - ogs_assert(pkbuf); - ogs_assert(pkbuf->data); - ogs_assert(pkbuf->len); - - memset(message, 0, sizeof(ogs_nas_message_t)); - - size = sizeof(ogs_nas_esm_header_t); - ogs_assert(ogs_pkbuf_pull(pkbuf, size)); - memcpy(&message->esm.h, pkbuf->data - size, size); - decoded += size; - - switch(message->esm.h.message_type) - { - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST: - size = ogs_nas_decode_activate_default_eps_bearer_context_request(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT: - size = ogs_nas_decode_activate_default_eps_bearer_context_accept(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT: - size = ogs_nas_decode_activate_default_eps_bearer_context_reject(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST: - size = ogs_nas_decode_activate_dedicated_eps_bearer_context_request(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT: - size = ogs_nas_decode_activate_dedicated_eps_bearer_context_accept(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT: - size = ogs_nas_decode_activate_dedicated_eps_bearer_context_reject(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST: - size = ogs_nas_decode_modify_eps_bearer_context_request(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT: - size = ogs_nas_decode_modify_eps_bearer_context_accept(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT: - size = ogs_nas_decode_modify_eps_bearer_context_reject(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST: - size = ogs_nas_decode_deactivate_eps_bearer_context_request(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT: - size = ogs_nas_decode_deactivate_eps_bearer_context_accept(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_PDN_CONNECTIVITY_REQUEST: - size = ogs_nas_decode_pdn_connectivity_request(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_PDN_CONNECTIVITY_REJECT: - size = ogs_nas_decode_pdn_connectivity_reject(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_PDN_DISCONNECT_REQUEST: - size = ogs_nas_decode_pdn_disconnect_request(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_PDN_DISCONNECT_REJECT: - size = ogs_nas_decode_pdn_disconnect_reject(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST: - size = ogs_nas_decode_bearer_resource_allocation_request(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT: - size = ogs_nas_decode_bearer_resource_allocation_reject(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST: - size = ogs_nas_decode_bearer_resource_modification_request(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT: - size = ogs_nas_decode_bearer_resource_modification_reject(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_ESM_INFORMATION_REQUEST: - break; - case OGS_NAS_ESM_INFORMATION_RESPONSE: - size = ogs_nas_decode_esm_information_response(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - case OGS_NAS_ESM_STATUS: - size = ogs_nas_decode_esm_status(message, pkbuf); - ogs_assert(size >= 0); - decoded += size; - break; - default: - ogs_error("Unknown message type (0x%x) or not implemented", - message->esm.h.message_type); - break; - } - - ogs_assert(ogs_pkbuf_push(pkbuf, decoded)); - - return OGS_OK; -} - diff --git a/lib/nas/eps/decoder.c b/lib/nas/eps/decoder.c new file mode 100644 index 0000000000..2b36eb1253 --- /dev/null +++ b/lib/nas/eps/decoder.c @@ -0,0 +1,2953 @@ +/* + * The MIT License + * + * Copyright (C) 2019,2020 by Sukchan Lee + * + * This file is part of Open5GS. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/******************************************************************************* + * This file had been created by nas-message.py script v0.1.0 + * Please do not modify this file but regenerate it via script. + * Created on: 2020-05-21 20:07:15.951142 by acetcom + * from 24301-d80.docx + ******************************************************************************/ + +#include "ogs-nas-eps.h" + +int ogs_nas_decode_attach_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_attach_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_attach_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_attach_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_detach_request_from_ue(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_detach_request_to_ue(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_tracking_area_update_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_tracking_area_update_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_tracking_area_update_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_extended_service_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_service_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_service_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_guti_reallocation_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_authentication_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_authentication_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_identity_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_identity_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_authentication_failure(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_security_mode_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_security_mode_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_security_mode_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_emm_status(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_emm_information(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_downlink_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_uplink_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_cs_service_notification(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_uplink_generic_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_downlink_generic_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_activate_default_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_activate_default_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_activate_default_eps_bearer_context_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_activate_dedicated_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_activate_dedicated_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_activate_dedicated_eps_bearer_context_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_modify_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_modify_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_modify_eps_bearer_context_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_deactivate_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_deactivate_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdn_connectivity_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdn_connectivity_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdn_disconnect_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_pdn_disconnect_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_bearer_resource_allocation_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_bearer_resource_allocation_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_bearer_resource_modification_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_bearer_resource_modification_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_esm_information_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_esm_status(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf); +int ogs_nas_decode_attach_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_attach_request_t *attach_request = &message->emm.attach_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode ATTACH_REQUEST\n"); + + size = ogs_nas_decode_eps_attach_type(&attach_request->eps_attach_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_eps_mobile_identity(&attach_request->eps_mobile_identity, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_ue_network_capability(&attach_request->ue_network_capability, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_esm_message_container(&attach_request->esm_message_container, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_TYPE: + size = ogs_nas_decode_p_tmsi_signature(&attach_request->old_p_tmsi_signature, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_ADDITIONAL_GUTI_TYPE: + size = ogs_nas_decode_eps_mobile_identity(&attach_request->additional_guti, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_ADDITIONAL_GUTI_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE: + size = ogs_nas_decode_tracking_area_identity(&attach_request->last_visited_registered_tai, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_DRX_PARAMETER_TYPE: + size = ogs_nas_decode_drx_parameter(&attach_request->drx_parameter, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_DRX_PARAMETER_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_MS_NETWORK_CAPABILITY_TYPE: + size = ogs_nas_decode_ms_network_capability(&attach_request->ms_network_capability, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_MS_NETWORK_CAPABILITY_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_TYPE: + size = ogs_nas_decode_location_area_identification(&attach_request->old_location_area_identification, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_TMSI_STATUS_TYPE: + size = ogs_nas_decode_tmsi_status(&attach_request->tmsi_status, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_TMSI_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_2_TYPE: + size = ogs_nas_decode_mobile_station_classmark_2(&attach_request->mobile_station_classmark_2, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_TYPE: + size = ogs_nas_decode_mobile_station_classmark_3(&attach_request->mobile_station_classmark_3, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_SUPPORTED_CODECS_TYPE: + size = ogs_nas_decode_supported_codec_list(&attach_request->supported_codecs, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_SUPPORTED_CODECS_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_TYPE: + size = ogs_nas_decode_additional_update_type(&attach_request->additional_update_type, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_TYPE: + size = ogs_nas_decode_voice_domain_preference_and_ue_usage_setting(&attach_request->voice_domain_preference_and_ue_usage_setting, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_DEVICE_PROPERTIES_TYPE: + size = ogs_nas_decode_device_properties(&attach_request->device_properties, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_DEVICE_PROPERTIES_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_OLD_GUTI_TYPE_TYPE: + size = ogs_nas_decode_guti_type(&attach_request->old_guti_type, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_OLD_GUTI_TYPE_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_TYPE: + size = ogs_nas_decode_ms_network_feature_support(&attach_request->ms_network_feature_support, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_TYPE: + size = ogs_nas_decode_network_resource_identifier_container(&attach_request->tmsi_based_nri_container, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_T3324_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_2(&attach_request->t3324_value, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_T3324_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(&attach_request->t3412_extended_value, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_TYPE: + size = ogs_nas_decode_extended_drx_parameters(&attach_request->extended_drx_parameters, pkbuf); + ogs_assert(size >= 0); + attach_request->presencemask |= OGS_NAS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_attach_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_attach_accept_t *attach_accept = &message->emm.attach_accept; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode ATTACH_ACCEPT\n"); + + size = ogs_nas_decode_eps_attach_result(&attach_accept->eps_attach_result, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_gprs_timer(&attach_accept->t3412_value, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_tracking_area_identity_list(&attach_accept->tai_list, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_esm_message_container(&attach_accept->esm_message_container, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_ATTACH_ACCEPT_GUTI_TYPE: + size = ogs_nas_decode_eps_mobile_identity(&attach_accept->guti, pkbuf); + ogs_assert(size >= 0); + attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_GUTI_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_ACCEPT_LOCATION_AREA_IDENTIFICATION_TYPE: + size = ogs_nas_decode_location_area_identification(&attach_accept->location_area_identification, pkbuf); + ogs_assert(size >= 0); + attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_ACCEPT_MS_IDENTITY_TYPE: + size = ogs_nas_decode_mobile_identity(&attach_accept->ms_identity, pkbuf); + ogs_assert(size >= 0); + attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_MS_IDENTITY_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_ACCEPT_EMM_CAUSE_TYPE: + size = ogs_nas_decode_emm_cause(&attach_accept->emm_cause, pkbuf); + ogs_assert(size >= 0); + attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_EMM_CAUSE_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_ACCEPT_T3402_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer(&attach_accept->t3402_value, pkbuf); + ogs_assert(size >= 0); + attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_T3402_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_ACCEPT_T3423_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer(&attach_accept->t3423_value, pkbuf); + ogs_assert(size >= 0); + attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_T3423_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_ACCEPT_EQUIVALENT_PLMNS_TYPE: + size = ogs_nas_decode_plmn_list(&attach_accept->equivalent_plmns, pkbuf); + ogs_assert(size >= 0); + attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_EQUIVALENT_PLMNS_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_ACCEPT_EMERGENCY_NUMBER_LIST_TYPE: + size = ogs_nas_decode_emergency_number_list(&attach_accept->emergency_number_list, pkbuf); + ogs_assert(size >= 0); + attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_TYPE: + size = ogs_nas_decode_eps_network_feature_support(&attach_accept->eps_network_feature_support, pkbuf); + ogs_assert(size >= 0); + attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_ACCEPT_ADDITIONAL_UPDATE_RESULT_TYPE: + size = ogs_nas_decode_additional_update_result(&attach_accept->additional_update_result, pkbuf); + ogs_assert(size >= 0); + attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_ADDITIONAL_UPDATE_RESULT_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_ACCEPT_T3412_EXTENDED_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(&attach_accept->t3412_extended_value, pkbuf); + ogs_assert(size >= 0); + attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_T3412_EXTENDED_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_ACCEPT_T3324_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_2(&attach_accept->t3324_value, pkbuf); + ogs_assert(size >= 0); + attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_T3324_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_ACCEPT_EXTENDED_DRX_PARAMETERS_TYPE: + size = ogs_nas_decode_extended_drx_parameters(&attach_accept->extended_drx_parameters, pkbuf); + ogs_assert(size >= 0); + attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_EXTENDED_DRX_PARAMETERS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_attach_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_attach_complete_t *attach_complete = &message->emm.attach_complete; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode ATTACH_COMPLETE\n"); + + size = ogs_nas_decode_esm_message_container(&attach_complete->esm_message_container, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_attach_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_attach_reject_t *attach_reject = &message->emm.attach_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode ATTACH_REJECT\n"); + + size = ogs_nas_decode_emm_cause(&attach_reject->emm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_TYPE: + size = ogs_nas_decode_esm_message_container(&attach_reject->esm_message_container, pkbuf); + ogs_assert(size >= 0); + attach_reject->presencemask |= OGS_NAS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REJECT_T3346_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_2(&attach_reject->t3346_value, pkbuf); + ogs_assert(size >= 0); + attach_reject->presencemask |= OGS_NAS_ATTACH_REJECT_T3346_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REJECT_T3402_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_2(&attach_reject->t3402_value, pkbuf); + ogs_assert(size >= 0); + attach_reject->presencemask |= OGS_NAS_ATTACH_REJECT_T3402_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_ATTACH_REJECT_EXTENDED_EMM_CAUSE_TYPE: + size = ogs_nas_decode_extended_emm_cause(&attach_reject->extended_emm_cause, pkbuf); + ogs_assert(size >= 0); + attach_reject->presencemask |= OGS_NAS_ATTACH_REJECT_EXTENDED_EMM_CAUSE_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_detach_request_from_ue(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_detach_request_from_ue_t *detach_request_from_ue = &message->emm.detach_request_from_ue; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode DETACH_REQUEST\n"); + + size = ogs_nas_decode_detach_type(&detach_request_from_ue->detach_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_eps_mobile_identity(&detach_request_from_ue->eps_mobile_identity, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_detach_request_to_ue(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_detach_request_to_ue_t *detach_request_to_ue = &message->emm.detach_request_to_ue; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode DETACH_REQUEST\n"); + + size = ogs_nas_decode_detach_type(&detach_request_to_ue->detach_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_DETACH_REQUEST_EMM_CAUSE_TYPE: + size = ogs_nas_decode_emm_cause(&detach_request_to_ue->emm_cause, pkbuf); + ogs_assert(size >= 0); + detach_request_to_ue->presencemask |= OGS_NAS_DETACH_REQUEST_EMM_CAUSE_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_tracking_area_update_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_tracking_area_update_request_t *tracking_area_update_request = &message->emm.tracking_area_update_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode TRACKING_AREA_UPDATE_REQUEST\n"); + + size = ogs_nas_decode_eps_update_type(&tracking_area_update_request->eps_update_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_eps_mobile_identity(&tracking_area_update_request->old_guti, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_TYPE: + size = ogs_nas_decode_key_set_identifier(&tracking_area_update_request->non_current_native_nas_key_set_identifier, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_GPRS_CIPHERING_KEY_SEQUENCE_NUMBER_TYPE: + size = ogs_nas_decode_ciphering_key_sequence_number(&tracking_area_update_request->gprs_ciphering_key_sequence_number, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_GPRS_CIPHERING_KEY_SEQUENCE_NUMBER_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_P_TMSI_SIGNATURE_TYPE: + size = ogs_nas_decode_p_tmsi_signature(&tracking_area_update_request->old_p_tmsi_signature, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_P_TMSI_SIGNATURE_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_GUTI_TYPE: + size = ogs_nas_decode_eps_mobile_identity(&tracking_area_update_request->additional_guti, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_GUTI_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_NONCEUE_TYPE: + size = ogs_nas_decode_nonce(&tracking_area_update_request->nonceue, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_NONCEUE_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_UE_NETWORK_CAPABILITY_TYPE: + size = ogs_nas_decode_ue_network_capability(&tracking_area_update_request->ue_network_capability, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_UE_NETWORK_CAPABILITY_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE: + size = ogs_nas_decode_tracking_area_identity(&tracking_area_update_request->last_visited_registered_tai, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_DRX_PARAMETER_TYPE: + size = ogs_nas_decode_drx_parameter(&tracking_area_update_request->drx_parameter, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_DRX_PARAMETER_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_UE_RADIO_CAPABILITY_INFORMATION_UPDATE_NEEDED_TYPE: + size = ogs_nas_decode_ue_radio_capability_information_update_needed(&tracking_area_update_request->ue_radio_capability_information_update_needed, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_UE_RADIO_CAPABILITY_INFORMATION_UPDATE_NEEDED_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_EPS_BEARER_CONTEXT_STATUS_TYPE: + size = ogs_nas_decode_eps_bearer_context_status(&tracking_area_update_request->eps_bearer_context_status, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_CAPABILITY_TYPE: + size = ogs_nas_decode_ms_network_capability(&tracking_area_update_request->ms_network_capability, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_CAPABILITY_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_TYPE: + size = ogs_nas_decode_location_area_identification(&tracking_area_update_request->old_location_area_identification, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_TMSI_STATUS_TYPE: + size = ogs_nas_decode_tmsi_status(&tracking_area_update_request->tmsi_status, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_TMSI_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_2_TYPE: + size = ogs_nas_decode_mobile_station_classmark_2(&tracking_area_update_request->mobile_station_classmark_2, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_3_TYPE: + size = ogs_nas_decode_mobile_station_classmark_3(&tracking_area_update_request->mobile_station_classmark_3, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_3_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_SUPPORTED_CODECS_TYPE: + size = ogs_nas_decode_supported_codec_list(&tracking_area_update_request->supported_codecs, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_SUPPORTED_CODECS_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_UPDATE_TYPE_TYPE: + size = ogs_nas_decode_additional_update_type(&tracking_area_update_request->additional_update_type, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_TYPE: + size = ogs_nas_decode_voice_domain_preference_and_ue_usage_setting(&tracking_area_update_request->voice_domain_preference_and_ue_usage_setting, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_GUTI_TYPE_TYPE: + size = ogs_nas_decode_guti_type(&tracking_area_update_request->old_guti_type, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_GUTI_TYPE_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_DEVICE_PROPERTIES_TYPE: + size = ogs_nas_decode_device_properties(&tracking_area_update_request->device_properties, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_DEVICE_PROPERTIES_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_FEATURE_SUPPORT_TYPE: + size = ogs_nas_decode_ms_network_feature_support(&tracking_area_update_request->ms_network_feature_support, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_TMSI_BASED_NRI_CONTAINER_TYPE: + size = ogs_nas_decode_network_resource_identifier_container(&tracking_area_update_request->tmsi_based_nri_container, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_TMSI_BASED_NRI_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_T3324_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_2(&tracking_area_update_request->t3324_value, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_T3324_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_T3412_EXTENDED_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(&tracking_area_update_request->t3412_extended_value, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_T3412_EXTENDED_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_EXTENDED_DRX_PARAMETERS_TYPE: + size = ogs_nas_decode_extended_drx_parameters(&tracking_area_update_request->extended_drx_parameters, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_request->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_EXTENDED_DRX_PARAMETERS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_tracking_area_update_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_tracking_area_update_accept_t *tracking_area_update_accept = &message->emm.tracking_area_update_accept; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode TRACKING_AREA_UPDATE_ACCEPT\n"); + + size = ogs_nas_decode_eps_update_result(&tracking_area_update_accept->eps_update_result, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3412_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer(&tracking_area_update_accept->t3412_value, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3412_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_GUTI_TYPE: + size = ogs_nas_decode_eps_mobile_identity(&tracking_area_update_accept->guti, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_GUTI_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_TAI_LIST_TYPE: + size = ogs_nas_decode_tracking_area_identity_list(&tracking_area_update_accept->tai_list, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_TAI_LIST_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EPS_BEARER_CONTEXT_STATUS_TYPE: + size = ogs_nas_decode_eps_bearer_context_status(&tracking_area_update_accept->eps_bearer_context_status, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EPS_BEARER_CONTEXT_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_LOCATION_AREA_IDENTIFICATION_TYPE: + size = ogs_nas_decode_location_area_identification(&tracking_area_update_accept->location_area_identification, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_MS_IDENTITY_TYPE: + size = ogs_nas_decode_mobile_identity(&tracking_area_update_accept->ms_identity, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_MS_IDENTITY_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EMM_CAUSE_TYPE: + size = ogs_nas_decode_emm_cause(&tracking_area_update_accept->emm_cause, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EMM_CAUSE_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3402_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer(&tracking_area_update_accept->t3402_value, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3402_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3423_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer(&tracking_area_update_accept->t3423_value, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3423_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EQUIVALENT_PLMNS_TYPE: + size = ogs_nas_decode_plmn_list(&tracking_area_update_accept->equivalent_plmns, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EQUIVALENT_PLMNS_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EMERGENCY_NUMBER_LIST_TYPE: + size = ogs_nas_decode_emergency_number_list(&tracking_area_update_accept->emergency_number_list, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_TYPE: + size = ogs_nas_decode_eps_network_feature_support(&tracking_area_update_accept->eps_network_feature_support, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_ADDITIONAL_UPDATE_RESULT_TYPE: + size = ogs_nas_decode_additional_update_result(&tracking_area_update_accept->additional_update_result, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_ADDITIONAL_UPDATE_RESULT_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3412_EXTENDED_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(&tracking_area_update_accept->t3412_extended_value, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3412_EXTENDED_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3324_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_2(&tracking_area_update_accept->t3324_value, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3324_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EXTENDED_DRX_PARAMETERS_TYPE: + size = ogs_nas_decode_extended_drx_parameters(&tracking_area_update_accept->extended_drx_parameters, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EXTENDED_DRX_PARAMETERS_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_HEADER_COMPRESSION_CONFIGURATION_STATUS_TYPE: + size = ogs_nas_decode_header_compression_configuration_status(&tracking_area_update_accept->header_compression_configuration_status, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_accept->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_HEADER_COMPRESSION_CONFIGURATION_STATUS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_tracking_area_update_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_tracking_area_update_reject_t *tracking_area_update_reject = &message->emm.tracking_area_update_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode TRACKING_AREA_UPDATE_REJECT\n"); + + size = ogs_nas_decode_emm_cause(&tracking_area_update_reject->emm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_TRACKING_AREA_UPDATE_REJECT_T3346_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_2(&tracking_area_update_reject->t3346_value, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_reject->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REJECT_T3346_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REJECT_EXTENDED_EMM_CAUSE_TYPE: + size = ogs_nas_decode_extended_emm_cause(&tracking_area_update_reject->extended_emm_cause, pkbuf); + ogs_assert(size >= 0); + tracking_area_update_reject->presencemask |= OGS_NAS_TRACKING_AREA_UPDATE_REJECT_EXTENDED_EMM_CAUSE_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_extended_service_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_extended_service_request_t *extended_service_request = &message->emm.extended_service_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode EXTENDED_SERVICE_REQUEST\n"); + + size = ogs_nas_decode_service_type(&extended_service_request->service_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_mobile_identity(&extended_service_request->m_tmsi, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_EXTENDED_SERVICE_REQUEST_CSFB_RESPONSE_TYPE: + size = ogs_nas_decode_csfb_response(&extended_service_request->csfb_response, pkbuf); + ogs_assert(size >= 0); + extended_service_request->presencemask |= OGS_NAS_EXTENDED_SERVICE_REQUEST_CSFB_RESPONSE_PRESENT; + decoded += size; + break; + case OGS_NAS_EXTENDED_SERVICE_REQUEST_EPS_BEARER_CONTEXT_STATUS_TYPE: + size = ogs_nas_decode_eps_bearer_context_status(&extended_service_request->eps_bearer_context_status, pkbuf); + ogs_assert(size >= 0); + extended_service_request->presencemask |= OGS_NAS_EXTENDED_SERVICE_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT; + decoded += size; + break; + case OGS_NAS_EXTENDED_SERVICE_REQUEST_DEVICE_PROPERTIES_TYPE: + size = ogs_nas_decode_device_properties(&extended_service_request->device_properties, pkbuf); + ogs_assert(size >= 0); + extended_service_request->presencemask |= OGS_NAS_EXTENDED_SERVICE_REQUEST_DEVICE_PROPERTIES_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_service_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_service_request_t *service_request = &message->emm.service_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode SERVICE_REQUEST\n"); + + size = ogs_nas_decode_ksi_and_sequence_number(&service_request->ksi_and_sequence_number, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_short_mac(&service_request->message_authentication_code, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_service_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_service_reject_t *service_reject = &message->emm.service_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode SERVICE_REJECT\n"); + + size = ogs_nas_decode_emm_cause(&service_reject->emm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_SERVICE_REJECT_T3346_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_2(&service_reject->t3346_value, pkbuf); + ogs_assert(size >= 0); + service_reject->presencemask |= OGS_NAS_SERVICE_REJECT_T3346_VALUE_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_guti_reallocation_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_guti_reallocation_command_t *guti_reallocation_command = &message->emm.guti_reallocation_command; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode GUTI_REALLOCATION_COMMAND\n"); + + size = ogs_nas_decode_eps_mobile_identity(&guti_reallocation_command->guti, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_GUTI_REALLOCATION_COMMAND_TAI_LIST_TYPE: + size = ogs_nas_decode_tracking_area_identity_list(&guti_reallocation_command->tai_list, pkbuf); + ogs_assert(size >= 0); + guti_reallocation_command->presencemask |= OGS_NAS_GUTI_REALLOCATION_COMMAND_TAI_LIST_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_authentication_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_authentication_request_t *authentication_request = &message->emm.authentication_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode AUTHENTICATION_REQUEST\n"); + + size = ogs_nas_decode_key_set_identifier(&authentication_request->nas_key_set_identifierasme, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_authentication_parameter_rand(&authentication_request->authentication_parameter_rand, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_authentication_parameter_autn(&authentication_request->authentication_parameter_autn, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_authentication_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_authentication_response_t *authentication_response = &message->emm.authentication_response; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode AUTHENTICATION_RESPONSE\n"); + + size = ogs_nas_decode_authentication_response_parameter(&authentication_response->authentication_response_parameter, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_identity_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_identity_request_t *identity_request = &message->emm.identity_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode IDENTITY_REQUEST\n"); + + size = ogs_nas_decode_identity_type_2(&identity_request->identity_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_identity_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_identity_response_t *identity_response = &message->emm.identity_response; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode IDENTITY_RESPONSE\n"); + + size = ogs_nas_decode_mobile_identity(&identity_response->mobile_identity, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_authentication_failure(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_authentication_failure_t *authentication_failure = &message->emm.authentication_failure; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode AUTHENTICATION_FAILURE\n"); + + size = ogs_nas_decode_emm_cause(&authentication_failure->emm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_TYPE: + size = ogs_nas_decode_authentication_failure_parameter(&authentication_failure->authentication_failure_parameter, pkbuf); + ogs_assert(size >= 0); + authentication_failure->presencemask |= OGS_NAS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_security_mode_command(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_security_mode_command_t *security_mode_command = &message->emm.security_mode_command; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode SECURITY_MODE_COMMAND\n"); + + size = ogs_nas_decode_security_algorithms(&security_mode_command->selected_nas_security_algorithms, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_key_set_identifier(&security_mode_command->nas_key_set_identifier, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_ue_security_capability(&security_mode_command->replayed_ue_security_capabilities, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_TYPE: + size = ogs_nas_decode_imeisv_request(&security_mode_command->imeisv_request, pkbuf); + ogs_assert(size >= 0); + security_mode_command->presencemask |= OGS_NAS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT; + decoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMMAND_REPLAYED_NONCEUE_TYPE: + size = ogs_nas_decode_nonce(&security_mode_command->replayed_nonceue, pkbuf); + ogs_assert(size >= 0); + security_mode_command->presencemask |= OGS_NAS_SECURITY_MODE_COMMAND_REPLAYED_NONCEUE_PRESENT; + decoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMMAND_NONCEMME_TYPE: + size = ogs_nas_decode_nonce(&security_mode_command->noncemme, pkbuf); + ogs_assert(size >= 0); + security_mode_command->presencemask |= OGS_NAS_SECURITY_MODE_COMMAND_NONCEMME_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_security_mode_complete(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_security_mode_complete_t *security_mode_complete = &message->emm.security_mode_complete; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode SECURITY_MODE_COMPLETE\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_SECURITY_MODE_COMPLETE_IMEISV_TYPE: + size = ogs_nas_decode_mobile_identity(&security_mode_complete->imeisv, pkbuf); + ogs_assert(size >= 0); + security_mode_complete->presencemask |= OGS_NAS_SECURITY_MODE_COMPLETE_IMEISV_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_security_mode_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_security_mode_reject_t *security_mode_reject = &message->emm.security_mode_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode SECURITY_MODE_REJECT\n"); + + size = ogs_nas_decode_emm_cause(&security_mode_reject->emm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_emm_status(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_emm_status_t *emm_status = &message->emm.emm_status; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode EMM_STATUS\n"); + + size = ogs_nas_decode_emm_cause(&emm_status->emm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_emm_information(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_emm_information_t *emm_information = &message->emm.emm_information; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode EMM_INFORMATION\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_EMM_INFORMATION_FULL_NAME_FOR_NETWORK_TYPE: + size = ogs_nas_decode_network_name(&emm_information->full_name_for_network, pkbuf); + ogs_assert(size >= 0); + emm_information->presencemask |= OGS_NAS_EMM_INFORMATION_FULL_NAME_FOR_NETWORK_PRESENT; + decoded += size; + break; + case OGS_NAS_EMM_INFORMATION_SHORT_NAME_FOR_NETWORK_TYPE: + size = ogs_nas_decode_network_name(&emm_information->short_name_for_network, pkbuf); + ogs_assert(size >= 0); + emm_information->presencemask |= OGS_NAS_EMM_INFORMATION_SHORT_NAME_FOR_NETWORK_PRESENT; + decoded += size; + break; + case OGS_NAS_EMM_INFORMATION_LOCAL_TIME_ZONE_TYPE: + size = ogs_nas_decode_time_zone(&emm_information->local_time_zone, pkbuf); + ogs_assert(size >= 0); + emm_information->presencemask |= OGS_NAS_EMM_INFORMATION_LOCAL_TIME_ZONE_PRESENT; + decoded += size; + break; + case OGS_NAS_EMM_INFORMATION_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_TYPE: + size = ogs_nas_decode_time_zone_and_time(&emm_information->universal_time_and_local_time_zone, pkbuf); + ogs_assert(size >= 0); + emm_information->presencemask |= OGS_NAS_EMM_INFORMATION_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_PRESENT; + decoded += size; + break; + case OGS_NAS_EMM_INFORMATION_NETWORK_DAYLIGHT_SAVING_TIME_TYPE: + size = ogs_nas_decode_daylight_saving_time(&emm_information->network_daylight_saving_time, pkbuf); + ogs_assert(size >= 0); + emm_information->presencemask |= OGS_NAS_EMM_INFORMATION_NETWORK_DAYLIGHT_SAVING_TIME_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_downlink_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_downlink_nas_transport_t *downlink_nas_transport = &message->emm.downlink_nas_transport; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode DOWNLINK_NAS_TRANSPORT\n"); + + size = ogs_nas_decode_message_container(&downlink_nas_transport->nas_message_container, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_uplink_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_uplink_nas_transport_t *uplink_nas_transport = &message->emm.uplink_nas_transport; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode UPLINK_NAS_TRANSPORT\n"); + + size = ogs_nas_decode_message_container(&uplink_nas_transport->nas_message_container, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_decode_cs_service_notification(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_cs_service_notification_t *cs_service_notification = &message->emm.cs_service_notification; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode CS_SERVICE_NOTIFICATION\n"); + + size = ogs_nas_decode_paging_identity(&cs_service_notification->paging_identity, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_CS_SERVICE_NOTIFICATION_CLI_TYPE: + size = ogs_nas_decode_cli(&cs_service_notification->cli, pkbuf); + ogs_assert(size >= 0); + cs_service_notification->presencemask |= OGS_NAS_CS_SERVICE_NOTIFICATION_CLI_PRESENT; + decoded += size; + break; + case OGS_NAS_CS_SERVICE_NOTIFICATION_SS_CODE_TYPE: + size = ogs_nas_decode_ss_code(&cs_service_notification->ss_code, pkbuf); + ogs_assert(size >= 0); + cs_service_notification->presencemask |= OGS_NAS_CS_SERVICE_NOTIFICATION_SS_CODE_PRESENT; + decoded += size; + break; + case OGS_NAS_CS_SERVICE_NOTIFICATION_LCS_INDICATOR_TYPE: + size = ogs_nas_decode_lcs_indicator(&cs_service_notification->lcs_indicator, pkbuf); + ogs_assert(size >= 0); + cs_service_notification->presencemask |= OGS_NAS_CS_SERVICE_NOTIFICATION_LCS_INDICATOR_PRESENT; + decoded += size; + break; + case OGS_NAS_CS_SERVICE_NOTIFICATION_LCS_CLIENT_IDENTITY_TYPE: + size = ogs_nas_decode_lcs_client_identity(&cs_service_notification->lcs_client_identity, pkbuf); + ogs_assert(size >= 0); + cs_service_notification->presencemask |= OGS_NAS_CS_SERVICE_NOTIFICATION_LCS_CLIENT_IDENTITY_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_uplink_generic_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_uplink_generic_nas_transport_t *uplink_generic_nas_transport = &message->emm.uplink_generic_nas_transport; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode UPLINK_GENERIC_NAS_TRANSPORT\n"); + + size = ogs_nas_decode_generic_message_container_type(&uplink_generic_nas_transport->generic_message_container_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_generic_message_container(&uplink_generic_nas_transport->generic_message_container, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_UPLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE: + size = ogs_nas_decode_additional_information(&uplink_generic_nas_transport->additional_information, pkbuf); + ogs_assert(size >= 0); + uplink_generic_nas_transport->presencemask |= OGS_NAS_UPLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_downlink_generic_nas_transport(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_downlink_generic_nas_transport_t *downlink_generic_nas_transport = &message->emm.downlink_generic_nas_transport; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode DOWNLINK_GENERIC_NAS_TRANSPORT\n"); + + size = ogs_nas_decode_generic_message_container_type(&downlink_generic_nas_transport->generic_message_container_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_generic_message_container(&downlink_generic_nas_transport->generic_message_container, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_DOWNLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE: + size = ogs_nas_decode_additional_information(&downlink_generic_nas_transport->additional_information, pkbuf); + ogs_assert(size >= 0); + downlink_generic_nas_transport->presencemask |= OGS_NAS_DOWNLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_activate_default_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_activate_default_eps_bearer_context_request_t *activate_default_eps_bearer_context_request = &message->esm.activate_default_eps_bearer_context_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST\n"); + + size = ogs_nas_decode_eps_quality_of_service(&activate_default_eps_bearer_context_request->eps_qos, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_access_point_name(&activate_default_eps_bearer_context_request->access_point_name, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_pdn_address(&activate_default_eps_bearer_context_request->pdn_address, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_TYPE: + size = ogs_nas_decode_transaction_identifier(&activate_default_eps_bearer_context_request->transaction_identifier, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_TYPE: + size = ogs_nas_decode_quality_of_service(&activate_default_eps_bearer_context_request->negotiated_qos, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_TYPE: + size = ogs_nas_decode_llc_service_access_point_identifier(&activate_default_eps_bearer_context_request->negotiated_llc_sapi, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_TYPE: + size = ogs_nas_decode_radio_priority(&activate_default_eps_bearer_context_request->radio_priority, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_TYPE: + size = ogs_nas_decode_packet_flow_identifier(&activate_default_eps_bearer_context_request->packet_flow_identifier, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_TYPE: + size = ogs_nas_decode_apn_aggregate_maximum_bit_rate(&activate_default_eps_bearer_context_request->apn_ambr, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_TYPE: + size = ogs_nas_decode_esm_cause(&activate_default_eps_bearer_context_request->esm_cause, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&activate_default_eps_bearer_context_request->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONNECTIVITY_TYPE_TYPE: + size = ogs_nas_decode_connectivity_type(&activate_default_eps_bearer_context_request->connectivity_type, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONNECTIVITY_TYPE_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE: + size = ogs_nas_decode_wlan_offload_acceptability(&activate_default_eps_bearer_context_request->wlan_offload_indication, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE: + size = ogs_nas_decode_nbifom_container(&activate_default_eps_bearer_context_request->nbifom_container, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE: + size = ogs_nas_decode_header_compression_configuration(&activate_default_eps_bearer_context_request->header_compression_configuration, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONTROL_PLANE_ONLY_INDICATION_TYPE: + size = ogs_nas_decode_control_plane_only_indication(&activate_default_eps_bearer_context_request->control_plane_only_indication, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONTROL_PLANE_ONLY_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&activate_default_eps_bearer_context_request->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_SERVING_PLMN_RATE_CONTROL_TYPE: + size = ogs_nas_decode_serving_plmn_rate_control(&activate_default_eps_bearer_context_request->serving_plmn_rate_control, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_SERVING_PLMN_RATE_CONTROL_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_activate_default_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_activate_default_eps_bearer_context_accept_t *activate_default_eps_bearer_context_accept = &message->esm.activate_default_eps_bearer_context_accept; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&activate_default_eps_bearer_context_accept->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_accept->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&activate_default_eps_bearer_context_accept->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_accept->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_activate_default_eps_bearer_context_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_activate_default_eps_bearer_context_reject_t *activate_default_eps_bearer_context_reject = &message->esm.activate_default_eps_bearer_context_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT\n"); + + size = ogs_nas_decode_esm_cause(&activate_default_eps_bearer_context_reject->esm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&activate_default_eps_bearer_context_reject->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_reject->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&activate_default_eps_bearer_context_reject->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + activate_default_eps_bearer_context_reject->presencemask |= OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_activate_dedicated_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_activate_dedicated_eps_bearer_context_request_t *activate_dedicated_eps_bearer_context_request = &message->esm.activate_dedicated_eps_bearer_context_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST\n"); + + size = ogs_nas_decode_linked_eps_bearer_identity(&activate_dedicated_eps_bearer_context_request->linked_eps_bearer_identity, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_eps_quality_of_service(&activate_dedicated_eps_bearer_context_request->eps_qos, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_traffic_flow_template(&activate_dedicated_eps_bearer_context_request->tft, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_TYPE: + size = ogs_nas_decode_transaction_identifier(&activate_dedicated_eps_bearer_context_request->transaction_identifier, pkbuf); + ogs_assert(size >= 0); + activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_TYPE: + size = ogs_nas_decode_quality_of_service(&activate_dedicated_eps_bearer_context_request->negotiated_qos, pkbuf); + ogs_assert(size >= 0); + activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_TYPE: + size = ogs_nas_decode_llc_service_access_point_identifier(&activate_dedicated_eps_bearer_context_request->negotiated_llc_sapi, pkbuf); + ogs_assert(size >= 0); + activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_TYPE: + size = ogs_nas_decode_radio_priority(&activate_dedicated_eps_bearer_context_request->radio_priority, pkbuf); + ogs_assert(size >= 0); + activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_TYPE: + size = ogs_nas_decode_packet_flow_identifier(&activate_dedicated_eps_bearer_context_request->packet_flow_identifier, pkbuf); + ogs_assert(size >= 0); + activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&activate_dedicated_eps_bearer_context_request->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE: + size = ogs_nas_decode_wlan_offload_acceptability(&activate_dedicated_eps_bearer_context_request->wlan_offload_indication, pkbuf); + ogs_assert(size >= 0); + activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE: + size = ogs_nas_decode_nbifom_container(&activate_dedicated_eps_bearer_context_request->nbifom_container, pkbuf); + ogs_assert(size >= 0); + activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&activate_dedicated_eps_bearer_context_request->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_activate_dedicated_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_activate_dedicated_eps_bearer_context_accept_t *activate_dedicated_eps_bearer_context_accept = &message->esm.activate_dedicated_eps_bearer_context_accept; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&activate_dedicated_eps_bearer_context_accept->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + activate_dedicated_eps_bearer_context_accept->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_TYPE: + size = ogs_nas_decode_nbifom_container(&activate_dedicated_eps_bearer_context_accept->nbifom_container, pkbuf); + ogs_assert(size >= 0); + activate_dedicated_eps_bearer_context_accept->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&activate_dedicated_eps_bearer_context_accept->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + activate_dedicated_eps_bearer_context_accept->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_activate_dedicated_eps_bearer_context_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_activate_dedicated_eps_bearer_context_reject_t *activate_dedicated_eps_bearer_context_reject = &message->esm.activate_dedicated_eps_bearer_context_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT\n"); + + size = ogs_nas_decode_esm_cause(&activate_dedicated_eps_bearer_context_reject->esm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&activate_dedicated_eps_bearer_context_reject->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + activate_dedicated_eps_bearer_context_reject->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_TYPE: + size = ogs_nas_decode_nbifom_container(&activate_dedicated_eps_bearer_context_reject->nbifom_container, pkbuf); + ogs_assert(size >= 0); + activate_dedicated_eps_bearer_context_reject->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&activate_dedicated_eps_bearer_context_reject->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + activate_dedicated_eps_bearer_context_reject->presencemask |= OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_modify_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_modify_eps_bearer_context_request_t *modify_eps_bearer_context_request = &message->esm.modify_eps_bearer_context_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode MODIFY_EPS_BEARER_CONTEXT_REQUEST\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_EPS_QOS_TYPE: + size = ogs_nas_decode_eps_quality_of_service(&modify_eps_bearer_context_request->new_eps_qos, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_EPS_QOS_PRESENT; + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_TFT_TYPE: + size = ogs_nas_decode_traffic_flow_template(&modify_eps_bearer_context_request->tft, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_TFT_PRESENT; + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_QOS_TYPE: + size = ogs_nas_decode_quality_of_service(&modify_eps_bearer_context_request->new_qos, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_QOS_PRESENT; + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_TYPE: + size = ogs_nas_decode_llc_service_access_point_identifier(&modify_eps_bearer_context_request->negotiated_llc_sapi, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_PRESENT; + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_TYPE: + size = ogs_nas_decode_radio_priority(&modify_eps_bearer_context_request->radio_priority, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_PRESENT; + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_TYPE: + size = ogs_nas_decode_packet_flow_identifier(&modify_eps_bearer_context_request->packet_flow_identifier, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_PRESENT; + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_TYPE: + size = ogs_nas_decode_apn_aggregate_maximum_bit_rate(&modify_eps_bearer_context_request->apn_ambr, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_PRESENT; + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&modify_eps_bearer_context_request->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE: + size = ogs_nas_decode_wlan_offload_acceptability(&modify_eps_bearer_context_request->wlan_offload_indication, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE: + size = ogs_nas_decode_nbifom_container(&modify_eps_bearer_context_request->nbifom_container, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE: + size = ogs_nas_decode_header_compression_configuration(&modify_eps_bearer_context_request->header_compression_configuration, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT; + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&modify_eps_bearer_context_request->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_request->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_modify_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_modify_eps_bearer_context_accept_t *modify_eps_bearer_context_accept = &message->esm.modify_eps_bearer_context_accept; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode MODIFY_EPS_BEARER_CONTEXT_ACCEPT\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&modify_eps_bearer_context_accept->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_accept->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_TYPE: + size = ogs_nas_decode_nbifom_container(&modify_eps_bearer_context_accept->nbifom_container, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_accept->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&modify_eps_bearer_context_accept->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_accept->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_modify_eps_bearer_context_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_modify_eps_bearer_context_reject_t *modify_eps_bearer_context_reject = &message->esm.modify_eps_bearer_context_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode MODIFY_EPS_BEARER_CONTEXT_REJECT\n"); + + size = ogs_nas_decode_esm_cause(&modify_eps_bearer_context_reject->esm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&modify_eps_bearer_context_reject->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_reject->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_TYPE: + size = ogs_nas_decode_nbifom_container(&modify_eps_bearer_context_reject->nbifom_container, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_reject->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&modify_eps_bearer_context_reject->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + modify_eps_bearer_context_reject->presencemask |= OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_deactivate_eps_bearer_context_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_deactivate_eps_bearer_context_request_t *deactivate_eps_bearer_context_request = &message->esm.deactivate_eps_bearer_context_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST\n"); + + size = ogs_nas_decode_esm_cause(&deactivate_eps_bearer_context_request->esm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&deactivate_eps_bearer_context_request->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + deactivate_eps_bearer_context_request->presencemask |= OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_T3396_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(&deactivate_eps_bearer_context_request->t3396_value, pkbuf); + ogs_assert(size >= 0); + deactivate_eps_bearer_context_request->presencemask |= OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_T3396_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE: + size = ogs_nas_decode_wlan_offload_acceptability(&deactivate_eps_bearer_context_request->wlan_offload_indication, pkbuf); + ogs_assert(size >= 0); + deactivate_eps_bearer_context_request->presencemask |= OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT; + decoded += size; + break; + case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE: + size = ogs_nas_decode_nbifom_container(&deactivate_eps_bearer_context_request->nbifom_container, pkbuf); + ogs_assert(size >= 0); + deactivate_eps_bearer_context_request->presencemask |= OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&deactivate_eps_bearer_context_request->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + deactivate_eps_bearer_context_request->presencemask |= OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_deactivate_eps_bearer_context_accept(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_deactivate_eps_bearer_context_accept_t *deactivate_eps_bearer_context_accept = &message->esm.deactivate_eps_bearer_context_accept; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&deactivate_eps_bearer_context_accept->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + deactivate_eps_bearer_context_accept->presencemask |= OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&deactivate_eps_bearer_context_accept->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + deactivate_eps_bearer_context_accept->presencemask |= OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdn_connectivity_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdn_connectivity_request_t *pdn_connectivity_request = &message->esm.pdn_connectivity_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDN_CONNECTIVITY_REQUEST\n"); + + size = ogs_nas_decode_request_type(&pdn_connectivity_request->request_type, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_PDN_CONNECTIVITY_REQUEST_ESM_INFORMATION_TRANSFER_FLAG_TYPE: + size = ogs_nas_decode_esm_information_transfer_flag(&pdn_connectivity_request->esm_information_transfer_flag, pkbuf); + ogs_assert(size >= 0); + pdn_connectivity_request->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REQUEST_ESM_INFORMATION_TRANSFER_FLAG_PRESENT; + decoded += size; + break; + case OGS_NAS_PDN_CONNECTIVITY_REQUEST_ACCESS_POINT_NAME_TYPE: + size = ogs_nas_decode_access_point_name(&pdn_connectivity_request->access_point_name, pkbuf); + ogs_assert(size >= 0); + pdn_connectivity_request->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REQUEST_ACCESS_POINT_NAME_PRESENT; + decoded += size; + break; + case OGS_NAS_PDN_CONNECTIVITY_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&pdn_connectivity_request->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdn_connectivity_request->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDN_CONNECTIVITY_REQUEST_DEVICE_PROPERTIES_TYPE: + size = ogs_nas_decode_device_properties(&pdn_connectivity_request->device_properties, pkbuf); + ogs_assert(size >= 0); + pdn_connectivity_request->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REQUEST_DEVICE_PROPERTIES_PRESENT; + decoded += size; + break; + case OGS_NAS_PDN_CONNECTIVITY_REQUEST_NBIFOM_CONTAINER_TYPE: + size = ogs_nas_decode_nbifom_container(&pdn_connectivity_request->nbifom_container, pkbuf); + ogs_assert(size >= 0); + pdn_connectivity_request->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REQUEST_NBIFOM_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_PDN_CONNECTIVITY_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE: + size = ogs_nas_decode_header_compression_configuration(&pdn_connectivity_request->header_compression_configuration, pkbuf); + ogs_assert(size >= 0); + pdn_connectivity_request->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT; + decoded += size; + break; + case OGS_NAS_PDN_CONNECTIVITY_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&pdn_connectivity_request->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdn_connectivity_request->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdn_connectivity_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdn_connectivity_reject_t *pdn_connectivity_reject = &message->esm.pdn_connectivity_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDN_CONNECTIVITY_REJECT\n"); + + size = ogs_nas_decode_esm_cause(&pdn_connectivity_reject->esm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_PDN_CONNECTIVITY_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&pdn_connectivity_reject->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdn_connectivity_reject->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDN_CONNECTIVITY_REJECT_BACK_OFF_TIMER_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(&pdn_connectivity_reject->back_off_timer_value, pkbuf); + ogs_assert(size >= 0); + pdn_connectivity_reject->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REJECT_BACK_OFF_TIMER_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_PDN_CONNECTIVITY_REJECT_RE_ATTEMPT_INDICATOR_TYPE: + size = ogs_nas_decode_re_attempt_indicator(&pdn_connectivity_reject->re_attempt_indicator, pkbuf); + ogs_assert(size >= 0); + pdn_connectivity_reject->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REJECT_RE_ATTEMPT_INDICATOR_PRESENT; + decoded += size; + break; + case OGS_NAS_PDN_CONNECTIVITY_REJECT_NBIFOM_CONTAINER_TYPE: + size = ogs_nas_decode_nbifom_container(&pdn_connectivity_reject->nbifom_container, pkbuf); + ogs_assert(size >= 0); + pdn_connectivity_reject->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REJECT_NBIFOM_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_PDN_CONNECTIVITY_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&pdn_connectivity_reject->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdn_connectivity_reject->presencemask |= OGS_NAS_PDN_CONNECTIVITY_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdn_disconnect_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdn_disconnect_request_t *pdn_disconnect_request = &message->esm.pdn_disconnect_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDN_DISCONNECT_REQUEST\n"); + + size = ogs_nas_decode_linked_eps_bearer_identity(&pdn_disconnect_request->linked_eps_bearer_identity, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_PDN_DISCONNECT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&pdn_disconnect_request->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdn_disconnect_request->presencemask |= OGS_NAS_PDN_DISCONNECT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDN_DISCONNECT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&pdn_disconnect_request->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdn_disconnect_request->presencemask |= OGS_NAS_PDN_DISCONNECT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_pdn_disconnect_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_pdn_disconnect_reject_t *pdn_disconnect_reject = &message->esm.pdn_disconnect_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode PDN_DISCONNECT_REJECT\n"); + + size = ogs_nas_decode_esm_cause(&pdn_disconnect_reject->esm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_PDN_DISCONNECT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&pdn_disconnect_reject->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdn_disconnect_reject->presencemask |= OGS_NAS_PDN_DISCONNECT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_PDN_DISCONNECT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&pdn_disconnect_reject->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + pdn_disconnect_reject->presencemask |= OGS_NAS_PDN_DISCONNECT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_bearer_resource_allocation_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_bearer_resource_allocation_request_t *bearer_resource_allocation_request = &message->esm.bearer_resource_allocation_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode BEARER_RESOURCE_ALLOCATION_REQUEST\n"); + + size = ogs_nas_decode_linked_eps_bearer_identity(&bearer_resource_allocation_request->linked_eps_bearer_identity, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_traffic_flow_aggregate_description(&bearer_resource_allocation_request->traffic_flow_aggregate, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_eps_quality_of_service(&bearer_resource_allocation_request->required_traffic_flow_qos, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&bearer_resource_allocation_request->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + bearer_resource_allocation_request->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_DEVICE_PROPERTIES_TYPE: + size = ogs_nas_decode_device_properties(&bearer_resource_allocation_request->device_properties, pkbuf); + ogs_assert(size >= 0); + bearer_resource_allocation_request->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_DEVICE_PROPERTIES_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_NBIFOM_CONTAINER_TYPE: + size = ogs_nas_decode_nbifom_container(&bearer_resource_allocation_request->nbifom_container, pkbuf); + ogs_assert(size >= 0); + bearer_resource_allocation_request->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_NBIFOM_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&bearer_resource_allocation_request->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + bearer_resource_allocation_request->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_bearer_resource_allocation_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_bearer_resource_allocation_reject_t *bearer_resource_allocation_reject = &message->esm.bearer_resource_allocation_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode BEARER_RESOURCE_ALLOCATION_REJECT\n"); + + size = ogs_nas_decode_esm_cause(&bearer_resource_allocation_reject->esm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&bearer_resource_allocation_reject->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + bearer_resource_allocation_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_BACK_OFF_TIMER_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(&bearer_resource_allocation_reject->back_off_timer_value, pkbuf); + ogs_assert(size >= 0); + bearer_resource_allocation_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_BACK_OFF_TIMER_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_RE_ATTEMPT_INDICATOR_TYPE: + size = ogs_nas_decode_re_attempt_indicator(&bearer_resource_allocation_reject->re_attempt_indicator, pkbuf); + ogs_assert(size >= 0); + bearer_resource_allocation_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_RE_ATTEMPT_INDICATOR_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_NBIFOM_CONTAINER_TYPE: + size = ogs_nas_decode_nbifom_container(&bearer_resource_allocation_reject->nbifom_container, pkbuf); + ogs_assert(size >= 0); + bearer_resource_allocation_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_NBIFOM_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&bearer_resource_allocation_reject->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + bearer_resource_allocation_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_bearer_resource_modification_request(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_bearer_resource_modification_request_t *bearer_resource_modification_request = &message->esm.bearer_resource_modification_request; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode BEARER_RESOURCE_MODIFICATION_REQUEST\n"); + + size = ogs_nas_decode_linked_eps_bearer_identity(&bearer_resource_modification_request->eps_bearer_identity_for_packet_filter, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + size = ogs_nas_decode_traffic_flow_aggregate_description(&bearer_resource_modification_request->traffic_flow_aggregate, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_REQUIRED_TRAFFIC_FLOW_QOS_TYPE: + size = ogs_nas_decode_eps_quality_of_service(&bearer_resource_modification_request->required_traffic_flow_qos, pkbuf); + ogs_assert(size >= 0); + bearer_resource_modification_request->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_REQUIRED_TRAFFIC_FLOW_QOS_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_ESM_CAUSE_TYPE: + size = ogs_nas_decode_esm_cause(&bearer_resource_modification_request->esm_cause, pkbuf); + ogs_assert(size >= 0); + bearer_resource_modification_request->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_ESM_CAUSE_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&bearer_resource_modification_request->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + bearer_resource_modification_request->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_DEVICE_PROPERTIES_TYPE: + size = ogs_nas_decode_device_properties(&bearer_resource_modification_request->device_properties, pkbuf); + ogs_assert(size >= 0); + bearer_resource_modification_request->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_DEVICE_PROPERTIES_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_NBIFOM_CONTAINER_TYPE: + size = ogs_nas_decode_nbifom_container(&bearer_resource_modification_request->nbifom_container, pkbuf); + ogs_assert(size >= 0); + bearer_resource_modification_request->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_NBIFOM_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE: + size = ogs_nas_decode_header_compression_configuration(&bearer_resource_modification_request->header_compression_configuration, pkbuf); + ogs_assert(size >= 0); + bearer_resource_modification_request->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&bearer_resource_modification_request->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + bearer_resource_modification_request->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_bearer_resource_modification_reject(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_bearer_resource_modification_reject_t *bearer_resource_modification_reject = &message->esm.bearer_resource_modification_reject; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode BEARER_RESOURCE_MODIFICATION_REJECT\n"); + + size = ogs_nas_decode_esm_cause(&bearer_resource_modification_reject->esm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&bearer_resource_modification_reject->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + bearer_resource_modification_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_BACK_OFF_TIMER_VALUE_TYPE: + size = ogs_nas_decode_gprs_timer_3(&bearer_resource_modification_reject->back_off_timer_value, pkbuf); + ogs_assert(size >= 0); + bearer_resource_modification_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_BACK_OFF_TIMER_VALUE_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_RE_ATTEMPT_INDICATOR_TYPE: + size = ogs_nas_decode_re_attempt_indicator(&bearer_resource_modification_reject->re_attempt_indicator, pkbuf); + ogs_assert(size >= 0); + bearer_resource_modification_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_RE_ATTEMPT_INDICATOR_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_NBIFOM_CONTAINER_TYPE: + size = ogs_nas_decode_nbifom_container(&bearer_resource_modification_reject->nbifom_container, pkbuf); + ogs_assert(size >= 0); + bearer_resource_modification_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_NBIFOM_CONTAINER_PRESENT; + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&bearer_resource_modification_reject->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + bearer_resource_modification_reject->presencemask |= OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_esm_information_response(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_esm_information_response_t *esm_information_response = &message->esm.esm_information_response; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode ESM_INFORMATION_RESPONSE\n"); + + while (pkbuf->len > 0) { + uint8_t *buffer = pkbuf->data; + uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); + + size = sizeof(uint8_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + decoded += size; + + switch (type) { + case OGS_NAS_ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_TYPE: + size = ogs_nas_decode_access_point_name(&esm_information_response->access_point_name, pkbuf); + ogs_assert(size >= 0); + esm_information_response->presencemask |= OGS_NAS_ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_PRESENT; + decoded += size; + break; + case OGS_NAS_ESM_INFORMATION_RESPONSE_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_protocol_configuration_options(&esm_information_response->protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + esm_information_response->presencemask |= OGS_NAS_ESM_INFORMATION_RESPONSE_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + case OGS_NAS_ESM_INFORMATION_RESPONSE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE: + size = ogs_nas_decode_extended_protocol_configuration_options(&esm_information_response->extended_protocol_configuration_options, pkbuf); + ogs_assert(size >= 0); + esm_information_response->presencemask |= OGS_NAS_ESM_INFORMATION_RESPONSE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; + decoded += size; + break; + default: + ogs_warn("Unknown type(0x%x) or not implemented\n", type); + break; + } + } + + return decoded; +} + +int ogs_nas_decode_esm_status(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + ogs_nas_esm_status_t *esm_status = &message->esm.esm_status; + int decoded = 0; + int size = 0; + + ogs_trace("[NAS] Decode ESM_STATUS\n"); + + size = ogs_nas_decode_esm_cause(&esm_status->esm_cause, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + return decoded; +} + +int ogs_nas_emm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + int size = 0; + uint16_t decoded = 0; + + ogs_assert(pkbuf); + ogs_assert(pkbuf->data); + ogs_assert(pkbuf->len); + + memset(message, 0, sizeof(ogs_nas_message_t)); + + size = sizeof(ogs_nas_emm_header_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(&message->emm.h, pkbuf->data - size, size); + decoded += size; + + if (message->emm.h.security_header_type >= + OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) { + ogs_assert(ogs_pkbuf_push(pkbuf, 1)); + decoded -= 1; + size = ogs_nas_decode_service_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + + goto out; + } + + switch (message->emm.h.message_type) { + case OGS_NAS_ATTACH_REQUEST: + size = ogs_nas_decode_attach_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_ATTACH_ACCEPT: + size = ogs_nas_decode_attach_accept(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_ATTACH_COMPLETE: + size = ogs_nas_decode_attach_complete(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_ATTACH_REJECT: + size = ogs_nas_decode_attach_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_DETACH_REQUEST: + size = ogs_nas_decode_detach_request_from_ue(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_DETACH_ACCEPT: + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST: + size = ogs_nas_decode_tracking_area_update_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT: + size = ogs_nas_decode_tracking_area_update_accept(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_COMPLETE: + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REJECT: + size = ogs_nas_decode_tracking_area_update_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_EXTENDED_SERVICE_REQUEST: + size = ogs_nas_decode_extended_service_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_SERVICE_REJECT: + size = ogs_nas_decode_service_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_GUTI_REALLOCATION_COMMAND: + size = ogs_nas_decode_guti_reallocation_command(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_GUTI_REALLOCATION_COMPLETE: + break; + case OGS_NAS_AUTHENTICATION_REQUEST: + size = ogs_nas_decode_authentication_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_AUTHENTICATION_RESPONSE: + size = ogs_nas_decode_authentication_response(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_AUTHENTICATION_REJECT: + break; + case OGS_NAS_IDENTITY_REQUEST: + size = ogs_nas_decode_identity_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_IDENTITY_RESPONSE: + size = ogs_nas_decode_identity_response(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_AUTHENTICATION_FAILURE: + size = ogs_nas_decode_authentication_failure(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMMAND: + size = ogs_nas_decode_security_mode_command(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMPLETE: + size = ogs_nas_decode_security_mode_complete(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_SECURITY_MODE_REJECT: + size = ogs_nas_decode_security_mode_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_EMM_STATUS: + size = ogs_nas_decode_emm_status(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_EMM_INFORMATION: + size = ogs_nas_decode_emm_information(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_DOWNLINK_NAS_TRANSPORT: + size = ogs_nas_decode_downlink_nas_transport(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_UPLINK_NAS_TRANSPORT: + size = ogs_nas_decode_uplink_nas_transport(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_CS_SERVICE_NOTIFICATION: + size = ogs_nas_decode_cs_service_notification(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_UPLINK_GENERIC_NAS_TRANSPORT: + size = ogs_nas_decode_uplink_generic_nas_transport(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_DOWNLINK_GENERIC_NAS_TRANSPORT: + size = ogs_nas_decode_downlink_generic_nas_transport(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->emm.h.message_type); + break; + } + +out: + ogs_assert(ogs_pkbuf_push(pkbuf, decoded)); + + return OGS_OK; +} +int ogs_nas_esm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf) +{ + int size = 0; + uint16_t decoded = 0; + + ogs_assert(pkbuf); + ogs_assert(pkbuf->data); + ogs_assert(pkbuf->len); + + memset(message, 0, sizeof(ogs_nas_message_t)); + + size = sizeof(ogs_nas_esm_header_t); + ogs_assert(ogs_pkbuf_pull(pkbuf, size)); + memcpy(&message->esm.h, pkbuf->data - size, size); + decoded += size; + + switch (message->esm.h.message_type) { + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST: + size = ogs_nas_decode_activate_default_eps_bearer_context_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT: + size = ogs_nas_decode_activate_default_eps_bearer_context_accept(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT: + size = ogs_nas_decode_activate_default_eps_bearer_context_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST: + size = ogs_nas_decode_activate_dedicated_eps_bearer_context_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT: + size = ogs_nas_decode_activate_dedicated_eps_bearer_context_accept(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT: + size = ogs_nas_decode_activate_dedicated_eps_bearer_context_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST: + size = ogs_nas_decode_modify_eps_bearer_context_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT: + size = ogs_nas_decode_modify_eps_bearer_context_accept(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT: + size = ogs_nas_decode_modify_eps_bearer_context_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST: + size = ogs_nas_decode_deactivate_eps_bearer_context_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT: + size = ogs_nas_decode_deactivate_eps_bearer_context_accept(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDN_CONNECTIVITY_REQUEST: + size = ogs_nas_decode_pdn_connectivity_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDN_CONNECTIVITY_REJECT: + size = ogs_nas_decode_pdn_connectivity_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDN_DISCONNECT_REQUEST: + size = ogs_nas_decode_pdn_disconnect_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_PDN_DISCONNECT_REJECT: + size = ogs_nas_decode_pdn_disconnect_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST: + size = ogs_nas_decode_bearer_resource_allocation_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT: + size = ogs_nas_decode_bearer_resource_allocation_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST: + size = ogs_nas_decode_bearer_resource_modification_request(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT: + size = ogs_nas_decode_bearer_resource_modification_reject(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_ESM_INFORMATION_REQUEST: + break; + case OGS_NAS_ESM_INFORMATION_RESPONSE: + size = ogs_nas_decode_esm_information_response(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + case OGS_NAS_ESM_STATUS: + size = ogs_nas_decode_esm_status(message, pkbuf); + ogs_assert(size >= 0); + decoded += size; + break; + default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->esm.h.message_type); + break; + } + + ogs_assert(ogs_pkbuf_push(pkbuf, decoded)); + + return OGS_OK; +} + diff --git a/lib/nas/encoder.c b/lib/nas/eps/encoder.c similarity index 86% rename from lib/nas/encoder.c rename to lib/nas/eps/encoder.c index 0ef01f2ce0..3c29fed248 100644 --- a/lib/nas/encoder.c +++ b/lib/nas/eps/encoder.c @@ -28,11 +28,11 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2020-04-24 08:50:31.653587 by acetcom + * Created on: 2020-05-21 20:07:15.961620 by acetcom * from 24301-d80.docx ******************************************************************************/ -#include "ogs-nas.h" +#include "ogs-nas-eps.h" int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); int ogs_nas_encode_attach_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message); @@ -107,8 +107,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message ogs_assert(size >= 0); encoded += size; - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -118,8 +117,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_ADDITIONAL_GUTI_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_ADDITIONAL_GUTI_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REQUEST_ADDITIONAL_GUTI_TYPE); ogs_assert(size >= 0); encoded += size; @@ -129,8 +127,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE); ogs_assert(size >= 0); encoded += size; @@ -140,8 +137,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_DRX_PARAMETER_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_DRX_PARAMETER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REQUEST_DRX_PARAMETER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -151,8 +147,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_MS_NETWORK_CAPABILITY_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_MS_NETWORK_CAPABILITY_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REQUEST_MS_NETWORK_CAPABILITY_TYPE); ogs_assert(size >= 0); encoded += size; @@ -162,8 +157,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_TYPE); ogs_assert(size >= 0); encoded += size; @@ -173,8 +167,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_TMSI_STATUS_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_TMSI_STATUS_PRESENT) { attach_request->tmsi_status.type = (OGS_NAS_ATTACH_REQUEST_TMSI_STATUS_TYPE >> 4); size = ogs_nas_encode_tmsi_status(pkbuf, &attach_request->tmsi_status); @@ -182,8 +175,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_2_TYPE); ogs_assert(size >= 0); encoded += size; @@ -193,8 +185,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_TYPE); ogs_assert(size >= 0); encoded += size; @@ -204,8 +195,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_SUPPORTED_CODECS_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_SUPPORTED_CODECS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REQUEST_SUPPORTED_CODECS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -215,8 +205,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT) { attach_request->additional_update_type.type = (OGS_NAS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_TYPE >> 4); size = ogs_nas_encode_additional_update_type(pkbuf, &attach_request->additional_update_type); @@ -224,8 +213,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_TYPE); ogs_assert(size >= 0); encoded += size; @@ -235,8 +223,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_DEVICE_PROPERTIES_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_DEVICE_PROPERTIES_PRESENT) { attach_request->device_properties.type = (OGS_NAS_ATTACH_REQUEST_DEVICE_PROPERTIES_TYPE >> 4); size = ogs_nas_encode_device_properties(pkbuf, &attach_request->device_properties); @@ -244,8 +231,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_OLD_GUTI_TYPE_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_OLD_GUTI_TYPE_PRESENT) { attach_request->old_guti_type.type = (OGS_NAS_ATTACH_REQUEST_OLD_GUTI_TYPE_TYPE >> 4); size = ogs_nas_encode_guti_type(pkbuf, &attach_request->old_guti_type); @@ -253,8 +239,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT) { attach_request->ms_network_feature_support.type = (OGS_NAS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_TYPE >> 4); size = ogs_nas_encode_ms_network_feature_support(pkbuf, &attach_request->ms_network_feature_support); @@ -262,8 +247,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -273,8 +257,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_T3324_VALUE_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_T3324_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REQUEST_T3324_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -284,8 +267,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -295,8 +277,7 @@ int ogs_nas_encode_attach_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message encoded += size; } - if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_PRESENT) - { + if (attach_request->presencemask & OGS_NAS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -333,8 +314,7 @@ int ogs_nas_encode_attach_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) ogs_assert(size >= 0); encoded += size; - if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_GUTI_PRESENT) - { + if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_GUTI_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_ACCEPT_GUTI_TYPE); ogs_assert(size >= 0); encoded += size; @@ -344,8 +324,7 @@ int ogs_nas_encode_attach_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) encoded += size; } - if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT) - { + if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_ACCEPT_LOCATION_AREA_IDENTIFICATION_TYPE); ogs_assert(size >= 0); encoded += size; @@ -355,8 +334,7 @@ int ogs_nas_encode_attach_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) encoded += size; } - if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_MS_IDENTITY_PRESENT) - { + if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_MS_IDENTITY_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_ACCEPT_MS_IDENTITY_TYPE); ogs_assert(size >= 0); encoded += size; @@ -366,8 +344,7 @@ int ogs_nas_encode_attach_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) encoded += size; } - if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_EMM_CAUSE_PRESENT) - { + if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_EMM_CAUSE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_ACCEPT_EMM_CAUSE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -377,8 +354,7 @@ int ogs_nas_encode_attach_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) encoded += size; } - if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_T3402_VALUE_PRESENT) - { + if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_T3402_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_ACCEPT_T3402_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -388,8 +364,7 @@ int ogs_nas_encode_attach_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) encoded += size; } - if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_T3423_VALUE_PRESENT) - { + if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_T3423_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_ACCEPT_T3423_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -399,8 +374,7 @@ int ogs_nas_encode_attach_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) encoded += size; } - if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_EQUIVALENT_PLMNS_PRESENT) - { + if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_EQUIVALENT_PLMNS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_ACCEPT_EQUIVALENT_PLMNS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -410,8 +384,7 @@ int ogs_nas_encode_attach_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) encoded += size; } - if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT) - { + if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_ACCEPT_EMERGENCY_NUMBER_LIST_TYPE); ogs_assert(size >= 0); encoded += size; @@ -421,8 +394,7 @@ int ogs_nas_encode_attach_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) encoded += size; } - if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_PRESENT) - { + if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_TYPE); ogs_assert(size >= 0); encoded += size; @@ -432,8 +404,7 @@ int ogs_nas_encode_attach_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) encoded += size; } - if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_ADDITIONAL_UPDATE_RESULT_PRESENT) - { + if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_ADDITIONAL_UPDATE_RESULT_PRESENT) { attach_accept->additional_update_result.type = (OGS_NAS_ATTACH_ACCEPT_ADDITIONAL_UPDATE_RESULT_TYPE >> 4); size = ogs_nas_encode_additional_update_result(pkbuf, &attach_accept->additional_update_result); @@ -441,8 +412,7 @@ int ogs_nas_encode_attach_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) encoded += size; } - if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_T3412_EXTENDED_VALUE_PRESENT) - { + if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_T3412_EXTENDED_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_ACCEPT_T3412_EXTENDED_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -452,8 +422,7 @@ int ogs_nas_encode_attach_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) encoded += size; } - if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_T3324_VALUE_PRESENT) - { + if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_T3324_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_ACCEPT_T3324_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -463,8 +432,7 @@ int ogs_nas_encode_attach_accept(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) encoded += size; } - if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_EXTENDED_DRX_PARAMETERS_PRESENT) - { + if (attach_accept->presencemask & OGS_NAS_ATTACH_ACCEPT_EXTENDED_DRX_PARAMETERS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_ACCEPT_EXTENDED_DRX_PARAMETERS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -504,8 +472,7 @@ int ogs_nas_encode_attach_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) ogs_assert(size >= 0); encoded += size; - if (attach_reject->presencemask & OGS_NAS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_PRESENT) - { + if (attach_reject->presencemask & OGS_NAS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -515,8 +482,7 @@ int ogs_nas_encode_attach_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) encoded += size; } - if (attach_reject->presencemask & OGS_NAS_ATTACH_REJECT_T3346_VALUE_PRESENT) - { + if (attach_reject->presencemask & OGS_NAS_ATTACH_REJECT_T3346_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REJECT_T3346_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -526,8 +492,7 @@ int ogs_nas_encode_attach_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) encoded += size; } - if (attach_reject->presencemask & OGS_NAS_ATTACH_REJECT_T3402_VALUE_PRESENT) - { + if (attach_reject->presencemask & OGS_NAS_ATTACH_REJECT_T3402_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ATTACH_REJECT_T3402_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -537,8 +502,7 @@ int ogs_nas_encode_attach_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message) encoded += size; } - if (attach_reject->presencemask & OGS_NAS_ATTACH_REJECT_EXTENDED_EMM_CAUSE_PRESENT) - { + if (attach_reject->presencemask & OGS_NAS_ATTACH_REJECT_EXTENDED_EMM_CAUSE_PRESENT) { attach_reject->extended_emm_cause.type = (OGS_NAS_ATTACH_REJECT_EXTENDED_EMM_CAUSE_TYPE >> 4); size = ogs_nas_encode_extended_emm_cause(pkbuf, &attach_reject->extended_emm_cause); @@ -580,8 +544,7 @@ int ogs_nas_encode_detach_request_to_ue(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *m ogs_assert(size >= 0); encoded += size; - if (detach_request_to_ue->presencemask & OGS_NAS_DETACH_REQUEST_EMM_CAUSE_PRESENT) - { + if (detach_request_to_ue->presencemask & OGS_NAS_DETACH_REQUEST_EMM_CAUSE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_DETACH_REQUEST_EMM_CAUSE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -610,8 +573,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess ogs_assert(size >= 0); encoded += size; - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_PRESENT) { tracking_area_update_request->non_current_native_nas_key_set_identifier.type = (OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_TYPE >> 4); size = ogs_nas_encode_key_set_identifier(pkbuf, &tracking_area_update_request->non_current_native_nas_key_set_identifier); @@ -619,8 +581,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_GPRS_CIPHERING_KEY_SEQUENCE_NUMBER_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_GPRS_CIPHERING_KEY_SEQUENCE_NUMBER_PRESENT) { tracking_area_update_request->gprs_ciphering_key_sequence_number.type = (OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_GPRS_CIPHERING_KEY_SEQUENCE_NUMBER_TYPE >> 4); size = ogs_nas_encode_ciphering_key_sequence_number(pkbuf, &tracking_area_update_request->gprs_ciphering_key_sequence_number); @@ -628,8 +589,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_P_TMSI_SIGNATURE_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_P_TMSI_SIGNATURE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_P_TMSI_SIGNATURE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -639,8 +599,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_GUTI_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_GUTI_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_GUTI_TYPE); ogs_assert(size >= 0); encoded += size; @@ -650,8 +609,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_NONCEUE_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_NONCEUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_NONCEUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -661,8 +619,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_UE_NETWORK_CAPABILITY_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_UE_NETWORK_CAPABILITY_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_UE_NETWORK_CAPABILITY_TYPE); ogs_assert(size >= 0); encoded += size; @@ -672,8 +629,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE); ogs_assert(size >= 0); encoded += size; @@ -683,8 +639,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_DRX_PARAMETER_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_DRX_PARAMETER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_DRX_PARAMETER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -694,8 +649,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_UE_RADIO_CAPABILITY_INFORMATION_UPDATE_NEEDED_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_UE_RADIO_CAPABILITY_INFORMATION_UPDATE_NEEDED_PRESENT) { tracking_area_update_request->ue_radio_capability_information_update_needed.type = (OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_UE_RADIO_CAPABILITY_INFORMATION_UPDATE_NEEDED_TYPE >> 4); size = ogs_nas_encode_ue_radio_capability_information_update_needed(pkbuf, &tracking_area_update_request->ue_radio_capability_information_update_needed); @@ -703,8 +657,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_EPS_BEARER_CONTEXT_STATUS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -714,8 +667,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_CAPABILITY_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_CAPABILITY_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_CAPABILITY_TYPE); ogs_assert(size >= 0); encoded += size; @@ -725,8 +677,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_TYPE); ogs_assert(size >= 0); encoded += size; @@ -736,8 +687,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_TMSI_STATUS_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_TMSI_STATUS_PRESENT) { tracking_area_update_request->tmsi_status.type = (OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_TMSI_STATUS_TYPE >> 4); size = ogs_nas_encode_tmsi_status(pkbuf, &tracking_area_update_request->tmsi_status); @@ -745,8 +695,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_2_TYPE); ogs_assert(size >= 0); encoded += size; @@ -756,8 +705,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_3_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_3_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_3_TYPE); ogs_assert(size >= 0); encoded += size; @@ -767,8 +715,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_SUPPORTED_CODECS_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_SUPPORTED_CODECS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_SUPPORTED_CODECS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -778,8 +725,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT) { tracking_area_update_request->additional_update_type.type = (OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_UPDATE_TYPE_TYPE >> 4); size = ogs_nas_encode_additional_update_type(pkbuf, &tracking_area_update_request->additional_update_type); @@ -787,8 +733,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_TYPE); ogs_assert(size >= 0); encoded += size; @@ -798,8 +743,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_GUTI_TYPE_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_GUTI_TYPE_PRESENT) { tracking_area_update_request->old_guti_type.type = (OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_OLD_GUTI_TYPE_TYPE >> 4); size = ogs_nas_encode_guti_type(pkbuf, &tracking_area_update_request->old_guti_type); @@ -807,8 +751,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_DEVICE_PROPERTIES_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_DEVICE_PROPERTIES_PRESENT) { tracking_area_update_request->device_properties.type = (OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_DEVICE_PROPERTIES_TYPE >> 4); size = ogs_nas_encode_device_properties(pkbuf, &tracking_area_update_request->device_properties); @@ -816,8 +759,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT) { tracking_area_update_request->ms_network_feature_support.type = (OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_FEATURE_SUPPORT_TYPE >> 4); size = ogs_nas_encode_ms_network_feature_support(pkbuf, &tracking_area_update_request->ms_network_feature_support); @@ -825,8 +767,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_TMSI_BASED_NRI_CONTAINER_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_TMSI_BASED_NRI_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_TMSI_BASED_NRI_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -836,8 +777,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_T3324_VALUE_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_T3324_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_T3324_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -847,8 +787,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_T3412_EXTENDED_VALUE_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_T3412_EXTENDED_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_T3412_EXTENDED_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -858,8 +797,7 @@ int ogs_nas_encode_tracking_area_update_request(ogs_pkbuf_t *pkbuf, ogs_nas_mess encoded += size; } - if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_EXTENDED_DRX_PARAMETERS_PRESENT) - { + if (tracking_area_update_request->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_EXTENDED_DRX_PARAMETERS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REQUEST_EXTENDED_DRX_PARAMETERS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -884,8 +822,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa ogs_assert(size >= 0); encoded += size; - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3412_VALUE_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3412_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3412_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -895,8 +832,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_GUTI_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_GUTI_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_GUTI_TYPE); ogs_assert(size >= 0); encoded += size; @@ -906,8 +842,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_TAI_LIST_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_TAI_LIST_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_TAI_LIST_TYPE); ogs_assert(size >= 0); encoded += size; @@ -917,8 +852,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EPS_BEARER_CONTEXT_STATUS_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EPS_BEARER_CONTEXT_STATUS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EPS_BEARER_CONTEXT_STATUS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -928,8 +862,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_LOCATION_AREA_IDENTIFICATION_TYPE); ogs_assert(size >= 0); encoded += size; @@ -939,8 +872,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_MS_IDENTITY_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_MS_IDENTITY_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_MS_IDENTITY_TYPE); ogs_assert(size >= 0); encoded += size; @@ -950,8 +882,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EMM_CAUSE_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EMM_CAUSE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EMM_CAUSE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -961,8 +892,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3402_VALUE_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3402_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3402_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -972,8 +902,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3423_VALUE_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3423_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3423_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -983,8 +912,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EQUIVALENT_PLMNS_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EQUIVALENT_PLMNS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EQUIVALENT_PLMNS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -994,8 +922,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EMERGENCY_NUMBER_LIST_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1005,8 +932,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1016,8 +942,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_ADDITIONAL_UPDATE_RESULT_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_ADDITIONAL_UPDATE_RESULT_PRESENT) { tracking_area_update_accept->additional_update_result.type = (OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_ADDITIONAL_UPDATE_RESULT_TYPE >> 4); size = ogs_nas_encode_additional_update_result(pkbuf, &tracking_area_update_accept->additional_update_result); @@ -1025,8 +950,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3412_EXTENDED_VALUE_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3412_EXTENDED_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3412_EXTENDED_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1036,8 +960,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3324_VALUE_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3324_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_T3324_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1047,8 +970,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EXTENDED_DRX_PARAMETERS_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EXTENDED_DRX_PARAMETERS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_EXTENDED_DRX_PARAMETERS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1058,8 +980,7 @@ int ogs_nas_encode_tracking_area_update_accept(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_HEADER_COMPRESSION_CONFIGURATION_STATUS_PRESENT) - { + if (tracking_area_update_accept->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_HEADER_COMPRESSION_CONFIGURATION_STATUS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT_HEADER_COMPRESSION_CONFIGURATION_STATUS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1084,8 +1005,7 @@ int ogs_nas_encode_tracking_area_update_reject(ogs_pkbuf_t *pkbuf, ogs_nas_messa ogs_assert(size >= 0); encoded += size; - if (tracking_area_update_reject->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REJECT_T3346_VALUE_PRESENT) - { + if (tracking_area_update_reject->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REJECT_T3346_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_TRACKING_AREA_UPDATE_REJECT_T3346_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1095,8 +1015,7 @@ int ogs_nas_encode_tracking_area_update_reject(ogs_pkbuf_t *pkbuf, ogs_nas_messa encoded += size; } - if (tracking_area_update_reject->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REJECT_EXTENDED_EMM_CAUSE_PRESENT) - { + if (tracking_area_update_reject->presencemask & OGS_NAS_TRACKING_AREA_UPDATE_REJECT_EXTENDED_EMM_CAUSE_PRESENT) { tracking_area_update_reject->extended_emm_cause.type = (OGS_NAS_TRACKING_AREA_UPDATE_REJECT_EXTENDED_EMM_CAUSE_TYPE >> 4); size = ogs_nas_encode_extended_emm_cause(pkbuf, &tracking_area_update_reject->extended_emm_cause); @@ -1123,8 +1042,7 @@ int ogs_nas_encode_extended_service_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_ ogs_assert(size >= 0); encoded += size; - if (extended_service_request->presencemask & OGS_NAS_EXTENDED_SERVICE_REQUEST_CSFB_RESPONSE_PRESENT) - { + if (extended_service_request->presencemask & OGS_NAS_EXTENDED_SERVICE_REQUEST_CSFB_RESPONSE_PRESENT) { extended_service_request->csfb_response.type = (OGS_NAS_EXTENDED_SERVICE_REQUEST_CSFB_RESPONSE_TYPE >> 4); size = ogs_nas_encode_csfb_response(pkbuf, &extended_service_request->csfb_response); @@ -1132,8 +1050,7 @@ int ogs_nas_encode_extended_service_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_ encoded += size; } - if (extended_service_request->presencemask & OGS_NAS_EXTENDED_SERVICE_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT) - { + if (extended_service_request->presencemask & OGS_NAS_EXTENDED_SERVICE_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_EXTENDED_SERVICE_REQUEST_EPS_BEARER_CONTEXT_STATUS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1143,8 +1060,7 @@ int ogs_nas_encode_extended_service_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_ encoded += size; } - if (extended_service_request->presencemask & OGS_NAS_EXTENDED_SERVICE_REQUEST_DEVICE_PROPERTIES_PRESENT) - { + if (extended_service_request->presencemask & OGS_NAS_EXTENDED_SERVICE_REQUEST_DEVICE_PROPERTIES_PRESENT) { extended_service_request->device_properties.type = (OGS_NAS_EXTENDED_SERVICE_REQUEST_DEVICE_PROPERTIES_TYPE >> 4); size = ogs_nas_encode_device_properties(pkbuf, &extended_service_request->device_properties); @@ -1186,8 +1102,7 @@ int ogs_nas_encode_service_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *message ogs_assert(size >= 0); encoded += size; - if (service_reject->presencemask & OGS_NAS_SERVICE_REJECT_T3346_VALUE_PRESENT) - { + if (service_reject->presencemask & OGS_NAS_SERVICE_REJECT_T3346_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SERVICE_REJECT_T3346_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1212,8 +1127,7 @@ int ogs_nas_encode_guti_reallocation_command(ogs_pkbuf_t *pkbuf, ogs_nas_message ogs_assert(size >= 0); encoded += size; - if (guti_reallocation_command->presencemask & OGS_NAS_GUTI_REALLOCATION_COMMAND_TAI_LIST_PRESENT) - { + if (guti_reallocation_command->presencemask & OGS_NAS_GUTI_REALLOCATION_COMMAND_TAI_LIST_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_GUTI_REALLOCATION_COMMAND_TAI_LIST_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1306,8 +1220,7 @@ int ogs_nas_encode_authentication_failure(ogs_pkbuf_t *pkbuf, ogs_nas_message_t ogs_assert(size >= 0); encoded += size; - if (authentication_failure->presencemask & OGS_NAS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_PRESENT) - { + if (authentication_failure->presencemask & OGS_NAS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1340,8 +1253,7 @@ int ogs_nas_encode_security_mode_command(ogs_pkbuf_t *pkbuf, ogs_nas_message_t * ogs_assert(size >= 0); encoded += size; - if (security_mode_command->presencemask & OGS_NAS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT) - { + if (security_mode_command->presencemask & OGS_NAS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT) { security_mode_command->imeisv_request.type = (OGS_NAS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_TYPE >> 4); size = ogs_nas_encode_imeisv_request(pkbuf, &security_mode_command->imeisv_request); @@ -1349,8 +1261,7 @@ int ogs_nas_encode_security_mode_command(ogs_pkbuf_t *pkbuf, ogs_nas_message_t * encoded += size; } - if (security_mode_command->presencemask & OGS_NAS_SECURITY_MODE_COMMAND_REPLAYED_NONCEUE_PRESENT) - { + if (security_mode_command->presencemask & OGS_NAS_SECURITY_MODE_COMMAND_REPLAYED_NONCEUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SECURITY_MODE_COMMAND_REPLAYED_NONCEUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1360,8 +1271,7 @@ int ogs_nas_encode_security_mode_command(ogs_pkbuf_t *pkbuf, ogs_nas_message_t * encoded += size; } - if (security_mode_command->presencemask & OGS_NAS_SECURITY_MODE_COMMAND_NONCEMME_PRESENT) - { + if (security_mode_command->presencemask & OGS_NAS_SECURITY_MODE_COMMAND_NONCEMME_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SECURITY_MODE_COMMAND_NONCEMME_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1382,8 +1292,7 @@ int ogs_nas_encode_security_mode_complete(ogs_pkbuf_t *pkbuf, ogs_nas_message_t ogs_trace("[NAS] Encode SECURITY_MODE_COMPLETE"); - if (security_mode_complete->presencemask & OGS_NAS_SECURITY_MODE_COMPLETE_IMEISV_PRESENT) - { + if (security_mode_complete->presencemask & OGS_NAS_SECURITY_MODE_COMPLETE_IMEISV_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_SECURITY_MODE_COMPLETE_IMEISV_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1434,8 +1343,7 @@ int ogs_nas_encode_emm_information(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *messag ogs_trace("[NAS] Encode EMM_INFORMATION"); - if (emm_information->presencemask & OGS_NAS_EMM_INFORMATION_FULL_NAME_FOR_NETWORK_PRESENT) - { + if (emm_information->presencemask & OGS_NAS_EMM_INFORMATION_FULL_NAME_FOR_NETWORK_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_EMM_INFORMATION_FULL_NAME_FOR_NETWORK_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1445,8 +1353,7 @@ int ogs_nas_encode_emm_information(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *messag encoded += size; } - if (emm_information->presencemask & OGS_NAS_EMM_INFORMATION_SHORT_NAME_FOR_NETWORK_PRESENT) - { + if (emm_information->presencemask & OGS_NAS_EMM_INFORMATION_SHORT_NAME_FOR_NETWORK_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_EMM_INFORMATION_SHORT_NAME_FOR_NETWORK_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1456,8 +1363,7 @@ int ogs_nas_encode_emm_information(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *messag encoded += size; } - if (emm_information->presencemask & OGS_NAS_EMM_INFORMATION_LOCAL_TIME_ZONE_PRESENT) - { + if (emm_information->presencemask & OGS_NAS_EMM_INFORMATION_LOCAL_TIME_ZONE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_EMM_INFORMATION_LOCAL_TIME_ZONE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1467,8 +1373,7 @@ int ogs_nas_encode_emm_information(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *messag encoded += size; } - if (emm_information->presencemask & OGS_NAS_EMM_INFORMATION_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_PRESENT) - { + if (emm_information->presencemask & OGS_NAS_EMM_INFORMATION_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_EMM_INFORMATION_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1478,8 +1383,7 @@ int ogs_nas_encode_emm_information(ogs_pkbuf_t *pkbuf, ogs_nas_message_t *messag encoded += size; } - if (emm_information->presencemask & OGS_NAS_EMM_INFORMATION_NETWORK_DAYLIGHT_SAVING_TIME_PRESENT) - { + if (emm_information->presencemask & OGS_NAS_EMM_INFORMATION_NETWORK_DAYLIGHT_SAVING_TIME_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_EMM_INFORMATION_NETWORK_DAYLIGHT_SAVING_TIME_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1534,8 +1438,7 @@ int ogs_nas_encode_cs_service_notification(ogs_pkbuf_t *pkbuf, ogs_nas_message_t ogs_assert(size >= 0); encoded += size; - if (cs_service_notification->presencemask & OGS_NAS_CS_SERVICE_NOTIFICATION_CLI_PRESENT) - { + if (cs_service_notification->presencemask & OGS_NAS_CS_SERVICE_NOTIFICATION_CLI_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CS_SERVICE_NOTIFICATION_CLI_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1545,8 +1448,7 @@ int ogs_nas_encode_cs_service_notification(ogs_pkbuf_t *pkbuf, ogs_nas_message_t encoded += size; } - if (cs_service_notification->presencemask & OGS_NAS_CS_SERVICE_NOTIFICATION_SS_CODE_PRESENT) - { + if (cs_service_notification->presencemask & OGS_NAS_CS_SERVICE_NOTIFICATION_SS_CODE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CS_SERVICE_NOTIFICATION_SS_CODE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1556,8 +1458,7 @@ int ogs_nas_encode_cs_service_notification(ogs_pkbuf_t *pkbuf, ogs_nas_message_t encoded += size; } - if (cs_service_notification->presencemask & OGS_NAS_CS_SERVICE_NOTIFICATION_LCS_INDICATOR_PRESENT) - { + if (cs_service_notification->presencemask & OGS_NAS_CS_SERVICE_NOTIFICATION_LCS_INDICATOR_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CS_SERVICE_NOTIFICATION_LCS_INDICATOR_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1567,8 +1468,7 @@ int ogs_nas_encode_cs_service_notification(ogs_pkbuf_t *pkbuf, ogs_nas_message_t encoded += size; } - if (cs_service_notification->presencemask & OGS_NAS_CS_SERVICE_NOTIFICATION_LCS_CLIENT_IDENTITY_PRESENT) - { + if (cs_service_notification->presencemask & OGS_NAS_CS_SERVICE_NOTIFICATION_LCS_CLIENT_IDENTITY_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_CS_SERVICE_NOTIFICATION_LCS_CLIENT_IDENTITY_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1597,8 +1497,7 @@ int ogs_nas_encode_uplink_generic_nas_transport(ogs_pkbuf_t *pkbuf, ogs_nas_mess ogs_assert(size >= 0); encoded += size; - if (uplink_generic_nas_transport->presencemask & OGS_NAS_UPLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT) - { + if (uplink_generic_nas_transport->presencemask & OGS_NAS_UPLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_UPLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1627,8 +1526,7 @@ int ogs_nas_encode_downlink_generic_nas_transport(ogs_pkbuf_t *pkbuf, ogs_nas_me ogs_assert(size >= 0); encoded += size; - if (downlink_generic_nas_transport->presencemask & OGS_NAS_DOWNLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT) - { + if (downlink_generic_nas_transport->presencemask & OGS_NAS_DOWNLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_DOWNLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1661,8 +1559,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_request(ogs_pkbuf_t *pkbu ogs_assert(size >= 0); encoded += size; - if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_PRESENT) - { + if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1672,8 +1569,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_request(ogs_pkbuf_t *pkbu encoded += size; } - if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_PRESENT) - { + if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1683,8 +1579,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_request(ogs_pkbuf_t *pkbu encoded += size; } - if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_PRESENT) - { + if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1694,8 +1589,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_request(ogs_pkbuf_t *pkbu encoded += size; } - if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_PRESENT) - { + if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_PRESENT) { activate_default_eps_bearer_context_request->radio_priority.type = (OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_TYPE >> 4); size = ogs_nas_encode_radio_priority(pkbuf, &activate_default_eps_bearer_context_request->radio_priority); @@ -1703,8 +1597,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_request(ogs_pkbuf_t *pkbu encoded += size; } - if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_PRESENT) - { + if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1714,8 +1607,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_request(ogs_pkbuf_t *pkbu encoded += size; } - if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_PRESENT) - { + if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1725,8 +1617,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_request(ogs_pkbuf_t *pkbu encoded += size; } - if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_PRESENT) - { + if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1736,8 +1627,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_request(ogs_pkbuf_t *pkbu encoded += size; } - if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1747,8 +1637,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_request(ogs_pkbuf_t *pkbu encoded += size; } - if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONNECTIVITY_TYPE_PRESENT) - { + if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONNECTIVITY_TYPE_PRESENT) { activate_default_eps_bearer_context_request->connectivity_type.type = (OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONNECTIVITY_TYPE_TYPE >> 4); size = ogs_nas_encode_connectivity_type(pkbuf, &activate_default_eps_bearer_context_request->connectivity_type); @@ -1756,8 +1645,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_request(ogs_pkbuf_t *pkbu encoded += size; } - if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT) - { + if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT) { activate_default_eps_bearer_context_request->wlan_offload_indication.type = (OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE >> 4); size = ogs_nas_encode_wlan_offload_acceptability(pkbuf, &activate_default_eps_bearer_context_request->wlan_offload_indication); @@ -1765,8 +1653,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_request(ogs_pkbuf_t *pkbu encoded += size; } - if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT) - { + if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1776,8 +1663,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_request(ogs_pkbuf_t *pkbu encoded += size; } - if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT) - { + if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1787,8 +1673,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_request(ogs_pkbuf_t *pkbu encoded += size; } - if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONTROL_PLANE_ONLY_INDICATION_PRESENT) - { + if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONTROL_PLANE_ONLY_INDICATION_PRESENT) { activate_default_eps_bearer_context_request->control_plane_only_indication.type = (OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONTROL_PLANE_ONLY_INDICATION_TYPE >> 4); size = ogs_nas_encode_control_plane_only_indication(pkbuf, &activate_default_eps_bearer_context_request->control_plane_only_indication); @@ -1796,8 +1681,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_request(ogs_pkbuf_t *pkbu encoded += size; } - if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1807,8 +1691,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_request(ogs_pkbuf_t *pkbu encoded += size; } - if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_SERVING_PLMN_RATE_CONTROL_PRESENT) - { + if (activate_default_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_SERVING_PLMN_RATE_CONTROL_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_SERVING_PLMN_RATE_CONTROL_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1829,8 +1712,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_accept(ogs_pkbuf_t *pkbuf ogs_trace("[NAS] Encode ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT"); - if (activate_default_eps_bearer_context_accept->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (activate_default_eps_bearer_context_accept->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1840,8 +1722,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_accept(ogs_pkbuf_t *pkbuf encoded += size; } - if (activate_default_eps_bearer_context_accept->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (activate_default_eps_bearer_context_accept->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1866,8 +1747,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_reject(ogs_pkbuf_t *pkbuf ogs_assert(size >= 0); encoded += size; - if (activate_default_eps_bearer_context_reject->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (activate_default_eps_bearer_context_reject->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1877,8 +1757,7 @@ int ogs_nas_encode_activate_default_eps_bearer_context_reject(ogs_pkbuf_t *pkbuf encoded += size; } - if (activate_default_eps_bearer_context_reject->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (activate_default_eps_bearer_context_reject->presencemask & OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1911,8 +1790,7 @@ int ogs_nas_encode_activate_dedicated_eps_bearer_context_request(ogs_pkbuf_t *pk ogs_assert(size >= 0); encoded += size; - if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_PRESENT) - { + if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1922,8 +1800,7 @@ int ogs_nas_encode_activate_dedicated_eps_bearer_context_request(ogs_pkbuf_t *pk encoded += size; } - if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_PRESENT) - { + if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1933,8 +1810,7 @@ int ogs_nas_encode_activate_dedicated_eps_bearer_context_request(ogs_pkbuf_t *pk encoded += size; } - if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_PRESENT) - { + if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1944,8 +1820,7 @@ int ogs_nas_encode_activate_dedicated_eps_bearer_context_request(ogs_pkbuf_t *pk encoded += size; } - if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_PRESENT) - { + if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_PRESENT) { activate_dedicated_eps_bearer_context_request->radio_priority.type = (OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_TYPE >> 4); size = ogs_nas_encode_radio_priority(pkbuf, &activate_dedicated_eps_bearer_context_request->radio_priority); @@ -1953,8 +1828,7 @@ int ogs_nas_encode_activate_dedicated_eps_bearer_context_request(ogs_pkbuf_t *pk encoded += size; } - if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_PRESENT) - { + if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1964,8 +1838,7 @@ int ogs_nas_encode_activate_dedicated_eps_bearer_context_request(ogs_pkbuf_t *pk encoded += size; } - if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1975,8 +1848,7 @@ int ogs_nas_encode_activate_dedicated_eps_bearer_context_request(ogs_pkbuf_t *pk encoded += size; } - if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT) - { + if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT) { activate_dedicated_eps_bearer_context_request->wlan_offload_indication.type = (OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE >> 4); size = ogs_nas_encode_wlan_offload_acceptability(pkbuf, &activate_dedicated_eps_bearer_context_request->wlan_offload_indication); @@ -1984,8 +1856,7 @@ int ogs_nas_encode_activate_dedicated_eps_bearer_context_request(ogs_pkbuf_t *pk encoded += size; } - if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT) - { + if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -1995,8 +1866,7 @@ int ogs_nas_encode_activate_dedicated_eps_bearer_context_request(ogs_pkbuf_t *pk encoded += size; } - if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (activate_dedicated_eps_bearer_context_request->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2017,8 +1887,7 @@ int ogs_nas_encode_activate_dedicated_eps_bearer_context_accept(ogs_pkbuf_t *pkb ogs_trace("[NAS] Encode ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT"); - if (activate_dedicated_eps_bearer_context_accept->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (activate_dedicated_eps_bearer_context_accept->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2028,8 +1897,7 @@ int ogs_nas_encode_activate_dedicated_eps_bearer_context_accept(ogs_pkbuf_t *pkb encoded += size; } - if (activate_dedicated_eps_bearer_context_accept->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_PRESENT) - { + if (activate_dedicated_eps_bearer_context_accept->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2039,8 +1907,7 @@ int ogs_nas_encode_activate_dedicated_eps_bearer_context_accept(ogs_pkbuf_t *pkb encoded += size; } - if (activate_dedicated_eps_bearer_context_accept->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (activate_dedicated_eps_bearer_context_accept->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2065,8 +1932,7 @@ int ogs_nas_encode_activate_dedicated_eps_bearer_context_reject(ogs_pkbuf_t *pkb ogs_assert(size >= 0); encoded += size; - if (activate_dedicated_eps_bearer_context_reject->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (activate_dedicated_eps_bearer_context_reject->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2076,8 +1942,7 @@ int ogs_nas_encode_activate_dedicated_eps_bearer_context_reject(ogs_pkbuf_t *pkb encoded += size; } - if (activate_dedicated_eps_bearer_context_reject->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_PRESENT) - { + if (activate_dedicated_eps_bearer_context_reject->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2087,8 +1952,7 @@ int ogs_nas_encode_activate_dedicated_eps_bearer_context_reject(ogs_pkbuf_t *pkb encoded += size; } - if (activate_dedicated_eps_bearer_context_reject->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (activate_dedicated_eps_bearer_context_reject->presencemask & OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2109,8 +1973,7 @@ int ogs_nas_encode_modify_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs_nas ogs_trace("[NAS] Encode MODIFY_EPS_BEARER_CONTEXT_REQUEST"); - if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_EPS_QOS_PRESENT) - { + if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_EPS_QOS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_EPS_QOS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2120,8 +1983,7 @@ int ogs_nas_encode_modify_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs_nas encoded += size; } - if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_TFT_PRESENT) - { + if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_TFT_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_TFT_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2131,8 +1993,7 @@ int ogs_nas_encode_modify_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs_nas encoded += size; } - if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_QOS_PRESENT) - { + if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_QOS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_QOS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2142,8 +2003,7 @@ int ogs_nas_encode_modify_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs_nas encoded += size; } - if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_PRESENT) - { + if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2153,8 +2013,7 @@ int ogs_nas_encode_modify_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs_nas encoded += size; } - if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_PRESENT) - { + if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_PRESENT) { modify_eps_bearer_context_request->radio_priority.type = (OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_TYPE >> 4); size = ogs_nas_encode_radio_priority(pkbuf, &modify_eps_bearer_context_request->radio_priority); @@ -2162,8 +2021,7 @@ int ogs_nas_encode_modify_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs_nas encoded += size; } - if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_PRESENT) - { + if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2173,8 +2031,7 @@ int ogs_nas_encode_modify_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs_nas encoded += size; } - if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_PRESENT) - { + if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2184,8 +2041,7 @@ int ogs_nas_encode_modify_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs_nas encoded += size; } - if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2195,8 +2051,7 @@ int ogs_nas_encode_modify_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs_nas encoded += size; } - if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT) - { + if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT) { modify_eps_bearer_context_request->wlan_offload_indication.type = (OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE >> 4); size = ogs_nas_encode_wlan_offload_acceptability(pkbuf, &modify_eps_bearer_context_request->wlan_offload_indication); @@ -2204,8 +2059,7 @@ int ogs_nas_encode_modify_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs_nas encoded += size; } - if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT) - { + if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2215,8 +2069,7 @@ int ogs_nas_encode_modify_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs_nas encoded += size; } - if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT) - { + if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2226,8 +2079,7 @@ int ogs_nas_encode_modify_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs_nas encoded += size; } - if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (modify_eps_bearer_context_request->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2248,8 +2100,7 @@ int ogs_nas_encode_modify_eps_bearer_context_accept(ogs_pkbuf_t *pkbuf, ogs_nas_ ogs_trace("[NAS] Encode MODIFY_EPS_BEARER_CONTEXT_ACCEPT"); - if (modify_eps_bearer_context_accept->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (modify_eps_bearer_context_accept->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2259,8 +2110,7 @@ int ogs_nas_encode_modify_eps_bearer_context_accept(ogs_pkbuf_t *pkbuf, ogs_nas_ encoded += size; } - if (modify_eps_bearer_context_accept->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_PRESENT) - { + if (modify_eps_bearer_context_accept->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2270,8 +2120,7 @@ int ogs_nas_encode_modify_eps_bearer_context_accept(ogs_pkbuf_t *pkbuf, ogs_nas_ encoded += size; } - if (modify_eps_bearer_context_accept->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (modify_eps_bearer_context_accept->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2296,8 +2145,7 @@ int ogs_nas_encode_modify_eps_bearer_context_reject(ogs_pkbuf_t *pkbuf, ogs_nas_ ogs_assert(size >= 0); encoded += size; - if (modify_eps_bearer_context_reject->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (modify_eps_bearer_context_reject->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2307,8 +2155,7 @@ int ogs_nas_encode_modify_eps_bearer_context_reject(ogs_pkbuf_t *pkbuf, ogs_nas_ encoded += size; } - if (modify_eps_bearer_context_reject->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_PRESENT) - { + if (modify_eps_bearer_context_reject->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2318,8 +2165,7 @@ int ogs_nas_encode_modify_eps_bearer_context_reject(ogs_pkbuf_t *pkbuf, ogs_nas_ encoded += size; } - if (modify_eps_bearer_context_reject->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (modify_eps_bearer_context_reject->presencemask & OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2344,8 +2190,7 @@ int ogs_nas_encode_deactivate_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs ogs_assert(size >= 0); encoded += size; - if (deactivate_eps_bearer_context_request->presencemask & OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (deactivate_eps_bearer_context_request->presencemask & OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2355,8 +2200,7 @@ int ogs_nas_encode_deactivate_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs encoded += size; } - if (deactivate_eps_bearer_context_request->presencemask & OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_T3396_VALUE_PRESENT) - { + if (deactivate_eps_bearer_context_request->presencemask & OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_T3396_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_T3396_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2366,8 +2210,7 @@ int ogs_nas_encode_deactivate_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs encoded += size; } - if (deactivate_eps_bearer_context_request->presencemask & OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT) - { + if (deactivate_eps_bearer_context_request->presencemask & OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT) { deactivate_eps_bearer_context_request->wlan_offload_indication.type = (OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE >> 4); size = ogs_nas_encode_wlan_offload_acceptability(pkbuf, &deactivate_eps_bearer_context_request->wlan_offload_indication); @@ -2375,8 +2218,7 @@ int ogs_nas_encode_deactivate_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs encoded += size; } - if (deactivate_eps_bearer_context_request->presencemask & OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT) - { + if (deactivate_eps_bearer_context_request->presencemask & OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2386,8 +2228,7 @@ int ogs_nas_encode_deactivate_eps_bearer_context_request(ogs_pkbuf_t *pkbuf, ogs encoded += size; } - if (deactivate_eps_bearer_context_request->presencemask & OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (deactivate_eps_bearer_context_request->presencemask & OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2408,8 +2249,7 @@ int ogs_nas_encode_deactivate_eps_bearer_context_accept(ogs_pkbuf_t *pkbuf, ogs_ ogs_trace("[NAS] Encode DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT"); - if (deactivate_eps_bearer_context_accept->presencemask & OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (deactivate_eps_bearer_context_accept->presencemask & OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2419,8 +2259,7 @@ int ogs_nas_encode_deactivate_eps_bearer_context_accept(ogs_pkbuf_t *pkbuf, ogs_ encoded += size; } - if (deactivate_eps_bearer_context_accept->presencemask & OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (deactivate_eps_bearer_context_accept->presencemask & OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2445,8 +2284,7 @@ int ogs_nas_encode_pdn_connectivity_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_ ogs_assert(size >= 0); encoded += size; - if (pdn_connectivity_request->presencemask & OGS_NAS_PDN_CONNECTIVITY_REQUEST_ESM_INFORMATION_TRANSFER_FLAG_PRESENT) - { + if (pdn_connectivity_request->presencemask & OGS_NAS_PDN_CONNECTIVITY_REQUEST_ESM_INFORMATION_TRANSFER_FLAG_PRESENT) { pdn_connectivity_request->esm_information_transfer_flag.type = (OGS_NAS_PDN_CONNECTIVITY_REQUEST_ESM_INFORMATION_TRANSFER_FLAG_TYPE >> 4); size = ogs_nas_encode_esm_information_transfer_flag(pkbuf, &pdn_connectivity_request->esm_information_transfer_flag); @@ -2454,8 +2292,7 @@ int ogs_nas_encode_pdn_connectivity_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_ encoded += size; } - if (pdn_connectivity_request->presencemask & OGS_NAS_PDN_CONNECTIVITY_REQUEST_ACCESS_POINT_NAME_PRESENT) - { + if (pdn_connectivity_request->presencemask & OGS_NAS_PDN_CONNECTIVITY_REQUEST_ACCESS_POINT_NAME_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDN_CONNECTIVITY_REQUEST_ACCESS_POINT_NAME_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2465,8 +2302,7 @@ int ogs_nas_encode_pdn_connectivity_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_ encoded += size; } - if (pdn_connectivity_request->presencemask & OGS_NAS_PDN_CONNECTIVITY_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (pdn_connectivity_request->presencemask & OGS_NAS_PDN_CONNECTIVITY_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDN_CONNECTIVITY_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2476,8 +2312,7 @@ int ogs_nas_encode_pdn_connectivity_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_ encoded += size; } - if (pdn_connectivity_request->presencemask & OGS_NAS_PDN_CONNECTIVITY_REQUEST_DEVICE_PROPERTIES_PRESENT) - { + if (pdn_connectivity_request->presencemask & OGS_NAS_PDN_CONNECTIVITY_REQUEST_DEVICE_PROPERTIES_PRESENT) { pdn_connectivity_request->device_properties.type = (OGS_NAS_PDN_CONNECTIVITY_REQUEST_DEVICE_PROPERTIES_TYPE >> 4); size = ogs_nas_encode_device_properties(pkbuf, &pdn_connectivity_request->device_properties); @@ -2485,8 +2320,7 @@ int ogs_nas_encode_pdn_connectivity_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_ encoded += size; } - if (pdn_connectivity_request->presencemask & OGS_NAS_PDN_CONNECTIVITY_REQUEST_NBIFOM_CONTAINER_PRESENT) - { + if (pdn_connectivity_request->presencemask & OGS_NAS_PDN_CONNECTIVITY_REQUEST_NBIFOM_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDN_CONNECTIVITY_REQUEST_NBIFOM_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2496,8 +2330,7 @@ int ogs_nas_encode_pdn_connectivity_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_ encoded += size; } - if (pdn_connectivity_request->presencemask & OGS_NAS_PDN_CONNECTIVITY_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT) - { + if (pdn_connectivity_request->presencemask & OGS_NAS_PDN_CONNECTIVITY_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDN_CONNECTIVITY_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2507,8 +2340,7 @@ int ogs_nas_encode_pdn_connectivity_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_ encoded += size; } - if (pdn_connectivity_request->presencemask & OGS_NAS_PDN_CONNECTIVITY_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (pdn_connectivity_request->presencemask & OGS_NAS_PDN_CONNECTIVITY_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDN_CONNECTIVITY_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2533,8 +2365,7 @@ int ogs_nas_encode_pdn_connectivity_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t ogs_assert(size >= 0); encoded += size; - if (pdn_connectivity_reject->presencemask & OGS_NAS_PDN_CONNECTIVITY_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (pdn_connectivity_reject->presencemask & OGS_NAS_PDN_CONNECTIVITY_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDN_CONNECTIVITY_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2544,8 +2375,7 @@ int ogs_nas_encode_pdn_connectivity_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t encoded += size; } - if (pdn_connectivity_reject->presencemask & OGS_NAS_PDN_CONNECTIVITY_REJECT_BACK_OFF_TIMER_VALUE_PRESENT) - { + if (pdn_connectivity_reject->presencemask & OGS_NAS_PDN_CONNECTIVITY_REJECT_BACK_OFF_TIMER_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDN_CONNECTIVITY_REJECT_BACK_OFF_TIMER_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2555,8 +2385,7 @@ int ogs_nas_encode_pdn_connectivity_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t encoded += size; } - if (pdn_connectivity_reject->presencemask & OGS_NAS_PDN_CONNECTIVITY_REJECT_RE_ATTEMPT_INDICATOR_PRESENT) - { + if (pdn_connectivity_reject->presencemask & OGS_NAS_PDN_CONNECTIVITY_REJECT_RE_ATTEMPT_INDICATOR_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDN_CONNECTIVITY_REJECT_RE_ATTEMPT_INDICATOR_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2566,8 +2395,7 @@ int ogs_nas_encode_pdn_connectivity_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t encoded += size; } - if (pdn_connectivity_reject->presencemask & OGS_NAS_PDN_CONNECTIVITY_REJECT_NBIFOM_CONTAINER_PRESENT) - { + if (pdn_connectivity_reject->presencemask & OGS_NAS_PDN_CONNECTIVITY_REJECT_NBIFOM_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDN_CONNECTIVITY_REJECT_NBIFOM_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2577,8 +2405,7 @@ int ogs_nas_encode_pdn_connectivity_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t encoded += size; } - if (pdn_connectivity_reject->presencemask & OGS_NAS_PDN_CONNECTIVITY_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (pdn_connectivity_reject->presencemask & OGS_NAS_PDN_CONNECTIVITY_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDN_CONNECTIVITY_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2603,8 +2430,7 @@ int ogs_nas_encode_pdn_disconnect_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t ogs_assert(size >= 0); encoded += size; - if (pdn_disconnect_request->presencemask & OGS_NAS_PDN_DISCONNECT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (pdn_disconnect_request->presencemask & OGS_NAS_PDN_DISCONNECT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDN_DISCONNECT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2614,8 +2440,7 @@ int ogs_nas_encode_pdn_disconnect_request(ogs_pkbuf_t *pkbuf, ogs_nas_message_t encoded += size; } - if (pdn_disconnect_request->presencemask & OGS_NAS_PDN_DISCONNECT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (pdn_disconnect_request->presencemask & OGS_NAS_PDN_DISCONNECT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDN_DISCONNECT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2640,8 +2465,7 @@ int ogs_nas_encode_pdn_disconnect_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t * ogs_assert(size >= 0); encoded += size; - if (pdn_disconnect_reject->presencemask & OGS_NAS_PDN_DISCONNECT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (pdn_disconnect_reject->presencemask & OGS_NAS_PDN_DISCONNECT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDN_DISCONNECT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2651,8 +2475,7 @@ int ogs_nas_encode_pdn_disconnect_reject(ogs_pkbuf_t *pkbuf, ogs_nas_message_t * encoded += size; } - if (pdn_disconnect_reject->presencemask & OGS_NAS_PDN_DISCONNECT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (pdn_disconnect_reject->presencemask & OGS_NAS_PDN_DISCONNECT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_PDN_DISCONNECT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2685,8 +2508,7 @@ int ogs_nas_encode_bearer_resource_allocation_request(ogs_pkbuf_t *pkbuf, ogs_na ogs_assert(size >= 0); encoded += size; - if (bearer_resource_allocation_request->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (bearer_resource_allocation_request->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2696,8 +2518,7 @@ int ogs_nas_encode_bearer_resource_allocation_request(ogs_pkbuf_t *pkbuf, ogs_na encoded += size; } - if (bearer_resource_allocation_request->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_DEVICE_PROPERTIES_PRESENT) - { + if (bearer_resource_allocation_request->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_DEVICE_PROPERTIES_PRESENT) { bearer_resource_allocation_request->device_properties.type = (OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_DEVICE_PROPERTIES_TYPE >> 4); size = ogs_nas_encode_device_properties(pkbuf, &bearer_resource_allocation_request->device_properties); @@ -2705,8 +2526,7 @@ int ogs_nas_encode_bearer_resource_allocation_request(ogs_pkbuf_t *pkbuf, ogs_na encoded += size; } - if (bearer_resource_allocation_request->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_NBIFOM_CONTAINER_PRESENT) - { + if (bearer_resource_allocation_request->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_NBIFOM_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_NBIFOM_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2716,8 +2536,7 @@ int ogs_nas_encode_bearer_resource_allocation_request(ogs_pkbuf_t *pkbuf, ogs_na encoded += size; } - if (bearer_resource_allocation_request->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (bearer_resource_allocation_request->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2742,8 +2561,7 @@ int ogs_nas_encode_bearer_resource_allocation_reject(ogs_pkbuf_t *pkbuf, ogs_nas ogs_assert(size >= 0); encoded += size; - if (bearer_resource_allocation_reject->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (bearer_resource_allocation_reject->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2753,8 +2571,7 @@ int ogs_nas_encode_bearer_resource_allocation_reject(ogs_pkbuf_t *pkbuf, ogs_nas encoded += size; } - if (bearer_resource_allocation_reject->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_BACK_OFF_TIMER_VALUE_PRESENT) - { + if (bearer_resource_allocation_reject->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_BACK_OFF_TIMER_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_BACK_OFF_TIMER_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2764,8 +2581,7 @@ int ogs_nas_encode_bearer_resource_allocation_reject(ogs_pkbuf_t *pkbuf, ogs_nas encoded += size; } - if (bearer_resource_allocation_reject->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_RE_ATTEMPT_INDICATOR_PRESENT) - { + if (bearer_resource_allocation_reject->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_RE_ATTEMPT_INDICATOR_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_RE_ATTEMPT_INDICATOR_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2775,8 +2591,7 @@ int ogs_nas_encode_bearer_resource_allocation_reject(ogs_pkbuf_t *pkbuf, ogs_nas encoded += size; } - if (bearer_resource_allocation_reject->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_NBIFOM_CONTAINER_PRESENT) - { + if (bearer_resource_allocation_reject->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_NBIFOM_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_NBIFOM_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2786,8 +2601,7 @@ int ogs_nas_encode_bearer_resource_allocation_reject(ogs_pkbuf_t *pkbuf, ogs_nas encoded += size; } - if (bearer_resource_allocation_reject->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (bearer_resource_allocation_reject->presencemask & OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2816,8 +2630,7 @@ int ogs_nas_encode_bearer_resource_modification_request(ogs_pkbuf_t *pkbuf, ogs_ ogs_assert(size >= 0); encoded += size; - if (bearer_resource_modification_request->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_REQUIRED_TRAFFIC_FLOW_QOS_PRESENT) - { + if (bearer_resource_modification_request->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_REQUIRED_TRAFFIC_FLOW_QOS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_REQUIRED_TRAFFIC_FLOW_QOS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2827,8 +2640,7 @@ int ogs_nas_encode_bearer_resource_modification_request(ogs_pkbuf_t *pkbuf, ogs_ encoded += size; } - if (bearer_resource_modification_request->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_ESM_CAUSE_PRESENT) - { + if (bearer_resource_modification_request->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_ESM_CAUSE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_ESM_CAUSE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2838,8 +2650,7 @@ int ogs_nas_encode_bearer_resource_modification_request(ogs_pkbuf_t *pkbuf, ogs_ encoded += size; } - if (bearer_resource_modification_request->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (bearer_resource_modification_request->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2849,8 +2660,7 @@ int ogs_nas_encode_bearer_resource_modification_request(ogs_pkbuf_t *pkbuf, ogs_ encoded += size; } - if (bearer_resource_modification_request->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_DEVICE_PROPERTIES_PRESENT) - { + if (bearer_resource_modification_request->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_DEVICE_PROPERTIES_PRESENT) { bearer_resource_modification_request->device_properties.type = (OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_DEVICE_PROPERTIES_TYPE >> 4); size = ogs_nas_encode_device_properties(pkbuf, &bearer_resource_modification_request->device_properties); @@ -2858,8 +2668,7 @@ int ogs_nas_encode_bearer_resource_modification_request(ogs_pkbuf_t *pkbuf, ogs_ encoded += size; } - if (bearer_resource_modification_request->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_NBIFOM_CONTAINER_PRESENT) - { + if (bearer_resource_modification_request->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_NBIFOM_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_NBIFOM_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2869,8 +2678,7 @@ int ogs_nas_encode_bearer_resource_modification_request(ogs_pkbuf_t *pkbuf, ogs_ encoded += size; } - if (bearer_resource_modification_request->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT) - { + if (bearer_resource_modification_request->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2880,8 +2688,7 @@ int ogs_nas_encode_bearer_resource_modification_request(ogs_pkbuf_t *pkbuf, ogs_ encoded += size; } - if (bearer_resource_modification_request->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (bearer_resource_modification_request->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2906,8 +2713,7 @@ int ogs_nas_encode_bearer_resource_modification_reject(ogs_pkbuf_t *pkbuf, ogs_n ogs_assert(size >= 0); encoded += size; - if (bearer_resource_modification_reject->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (bearer_resource_modification_reject->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2917,8 +2723,7 @@ int ogs_nas_encode_bearer_resource_modification_reject(ogs_pkbuf_t *pkbuf, ogs_n encoded += size; } - if (bearer_resource_modification_reject->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_BACK_OFF_TIMER_VALUE_PRESENT) - { + if (bearer_resource_modification_reject->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_BACK_OFF_TIMER_VALUE_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_BACK_OFF_TIMER_VALUE_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2928,8 +2733,7 @@ int ogs_nas_encode_bearer_resource_modification_reject(ogs_pkbuf_t *pkbuf, ogs_n encoded += size; } - if (bearer_resource_modification_reject->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_RE_ATTEMPT_INDICATOR_PRESENT) - { + if (bearer_resource_modification_reject->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_RE_ATTEMPT_INDICATOR_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_RE_ATTEMPT_INDICATOR_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2939,8 +2743,7 @@ int ogs_nas_encode_bearer_resource_modification_reject(ogs_pkbuf_t *pkbuf, ogs_n encoded += size; } - if (bearer_resource_modification_reject->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_NBIFOM_CONTAINER_PRESENT) - { + if (bearer_resource_modification_reject->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_NBIFOM_CONTAINER_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_NBIFOM_CONTAINER_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2950,8 +2753,7 @@ int ogs_nas_encode_bearer_resource_modification_reject(ogs_pkbuf_t *pkbuf, ogs_n encoded += size; } - if (bearer_resource_modification_reject->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (bearer_resource_modification_reject->presencemask & OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2972,8 +2774,7 @@ int ogs_nas_encode_esm_information_response(ogs_pkbuf_t *pkbuf, ogs_nas_message_ ogs_trace("[NAS] Encode ESM_INFORMATION_RESPONSE"); - if (esm_information_response->presencemask & OGS_NAS_ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_PRESENT) - { + if (esm_information_response->presencemask & OGS_NAS_ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2983,8 +2784,7 @@ int ogs_nas_encode_esm_information_response(ogs_pkbuf_t *pkbuf, ogs_nas_message_ encoded += size; } - if (esm_information_response->presencemask & OGS_NAS_ESM_INFORMATION_RESPONSE_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (esm_information_response->presencemask & OGS_NAS_ESM_INFORMATION_RESPONSE_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ESM_INFORMATION_RESPONSE_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -2994,8 +2794,7 @@ int ogs_nas_encode_esm_information_response(ogs_pkbuf_t *pkbuf, ogs_nas_message_ encoded += size; } - if (esm_information_response->presencemask & OGS_NAS_ESM_INFORMATION_RESPONSE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) - { + if (esm_information_response->presencemask & OGS_NAS_ESM_INFORMATION_RESPONSE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_ESM_INFORMATION_RESPONSE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE); ogs_assert(size >= 0); encoded += size; @@ -3045,8 +2844,7 @@ ogs_pkbuf_t *ogs_nas_emm_encode(ogs_nas_message_t *message) encoded += size; if (message->emm.h.security_header_type >= - OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) - { + OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) { ogs_assert(ogs_pkbuf_push(pkbuf, 1)); encoded -= 1; size = ogs_nas_encode_service_request(pkbuf, message); @@ -3056,151 +2854,150 @@ ogs_pkbuf_t *ogs_nas_emm_encode(ogs_nas_message_t *message) goto out; } - switch(message->emm.h.message_type) - { - case OGS_NAS_ATTACH_REQUEST: - size = ogs_nas_encode_attach_request(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_ATTACH_ACCEPT: - size = ogs_nas_encode_attach_accept(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_ATTACH_COMPLETE: - size = ogs_nas_encode_attach_complete(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_ATTACH_REJECT: - size = ogs_nas_encode_attach_reject(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_DETACH_REQUEST: - size = ogs_nas_encode_detach_request_to_ue(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_DETACH_ACCEPT: - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST: - size = ogs_nas_encode_tracking_area_update_request(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT: - size = ogs_nas_encode_tracking_area_update_accept(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_TRACKING_AREA_UPDATE_COMPLETE: - break; - case OGS_NAS_TRACKING_AREA_UPDATE_REJECT: - size = ogs_nas_encode_tracking_area_update_reject(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_EXTENDED_SERVICE_REQUEST: - size = ogs_nas_encode_extended_service_request(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_SERVICE_REJECT: - size = ogs_nas_encode_service_reject(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_GUTI_REALLOCATION_COMMAND: - size = ogs_nas_encode_guti_reallocation_command(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_GUTI_REALLOCATION_COMPLETE: - break; - case OGS_NAS_AUTHENTICATION_REQUEST: - size = ogs_nas_encode_authentication_request(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_AUTHENTICATION_RESPONSE: - size = ogs_nas_encode_authentication_response(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_AUTHENTICATION_REJECT: - break; - case OGS_NAS_IDENTITY_REQUEST: - size = ogs_nas_encode_identity_request(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_IDENTITY_RESPONSE: - size = ogs_nas_encode_identity_response(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_AUTHENTICATION_FAILURE: - size = ogs_nas_encode_authentication_failure(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_SECURITY_MODE_COMMAND: - size = ogs_nas_encode_security_mode_command(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_SECURITY_MODE_COMPLETE: - size = ogs_nas_encode_security_mode_complete(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_SECURITY_MODE_REJECT: - size = ogs_nas_encode_security_mode_reject(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_EMM_STATUS: - size = ogs_nas_encode_emm_status(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_EMM_INFORMATION: - size = ogs_nas_encode_emm_information(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_DOWNLINK_NAS_TRANSPORT: - size = ogs_nas_encode_downlink_nas_transport(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_UPLINK_NAS_TRANSPORT: - size = ogs_nas_encode_uplink_nas_transport(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_CS_SERVICE_NOTIFICATION: - size = ogs_nas_encode_cs_service_notification(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_UPLINK_GENERIC_NAS_TRANSPORT: - size = ogs_nas_encode_uplink_generic_nas_transport(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_DOWNLINK_GENERIC_NAS_TRANSPORT: - size = ogs_nas_encode_downlink_generic_nas_transport(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - default: - ogs_error("Unknown message type (0x%x) or not implemented", - message->emm.h.message_type); - ogs_pkbuf_free(pkbuf); - return NULL; + switch (message->emm.h.message_type) { + case OGS_NAS_ATTACH_REQUEST: + size = ogs_nas_encode_attach_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_ATTACH_ACCEPT: + size = ogs_nas_encode_attach_accept(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_ATTACH_COMPLETE: + size = ogs_nas_encode_attach_complete(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_ATTACH_REJECT: + size = ogs_nas_encode_attach_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_DETACH_REQUEST: + size = ogs_nas_encode_detach_request_to_ue(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_DETACH_ACCEPT: + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REQUEST: + size = ogs_nas_encode_tracking_area_update_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_ACCEPT: + size = ogs_nas_encode_tracking_area_update_accept(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_TRACKING_AREA_UPDATE_COMPLETE: + break; + case OGS_NAS_TRACKING_AREA_UPDATE_REJECT: + size = ogs_nas_encode_tracking_area_update_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_EXTENDED_SERVICE_REQUEST: + size = ogs_nas_encode_extended_service_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_SERVICE_REJECT: + size = ogs_nas_encode_service_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_GUTI_REALLOCATION_COMMAND: + size = ogs_nas_encode_guti_reallocation_command(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_GUTI_REALLOCATION_COMPLETE: + break; + case OGS_NAS_AUTHENTICATION_REQUEST: + size = ogs_nas_encode_authentication_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_AUTHENTICATION_RESPONSE: + size = ogs_nas_encode_authentication_response(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_AUTHENTICATION_REJECT: + break; + case OGS_NAS_IDENTITY_REQUEST: + size = ogs_nas_encode_identity_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_IDENTITY_RESPONSE: + size = ogs_nas_encode_identity_response(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_AUTHENTICATION_FAILURE: + size = ogs_nas_encode_authentication_failure(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMMAND: + size = ogs_nas_encode_security_mode_command(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_SECURITY_MODE_COMPLETE: + size = ogs_nas_encode_security_mode_complete(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_SECURITY_MODE_REJECT: + size = ogs_nas_encode_security_mode_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_EMM_STATUS: + size = ogs_nas_encode_emm_status(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_EMM_INFORMATION: + size = ogs_nas_encode_emm_information(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_DOWNLINK_NAS_TRANSPORT: + size = ogs_nas_encode_downlink_nas_transport(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_UPLINK_NAS_TRANSPORT: + size = ogs_nas_encode_uplink_nas_transport(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_CS_SERVICE_NOTIFICATION: + size = ogs_nas_encode_cs_service_notification(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_UPLINK_GENERIC_NAS_TRANSPORT: + size = ogs_nas_encode_uplink_generic_nas_transport(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_DOWNLINK_GENERIC_NAS_TRANSPORT: + size = ogs_nas_encode_downlink_generic_nas_transport(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->emm.h.message_type); + ogs_pkbuf_free(pkbuf); + return NULL; } out: @@ -3231,120 +3028,119 @@ ogs_pkbuf_t *ogs_nas_esm_encode(ogs_nas_message_t *message) memcpy(pkbuf->data - size, &message->esm.h, size); encoded += size; - switch(message->esm.h.message_type) - { - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST: - size = ogs_nas_encode_activate_default_eps_bearer_context_request(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT: - size = ogs_nas_encode_activate_default_eps_bearer_context_accept(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT: - size = ogs_nas_encode_activate_default_eps_bearer_context_reject(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST: - size = ogs_nas_encode_activate_dedicated_eps_bearer_context_request(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT: - size = ogs_nas_encode_activate_dedicated_eps_bearer_context_accept(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT: - size = ogs_nas_encode_activate_dedicated_eps_bearer_context_reject(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST: - size = ogs_nas_encode_modify_eps_bearer_context_request(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT: - size = ogs_nas_encode_modify_eps_bearer_context_accept(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT: - size = ogs_nas_encode_modify_eps_bearer_context_reject(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST: - size = ogs_nas_encode_deactivate_eps_bearer_context_request(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT: - size = ogs_nas_encode_deactivate_eps_bearer_context_accept(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_PDN_CONNECTIVITY_REQUEST: - size = ogs_nas_encode_pdn_connectivity_request(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_PDN_CONNECTIVITY_REJECT: - size = ogs_nas_encode_pdn_connectivity_reject(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_PDN_DISCONNECT_REQUEST: - size = ogs_nas_encode_pdn_disconnect_request(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_PDN_DISCONNECT_REJECT: - size = ogs_nas_encode_pdn_disconnect_reject(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST: - size = ogs_nas_encode_bearer_resource_allocation_request(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT: - size = ogs_nas_encode_bearer_resource_allocation_reject(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST: - size = ogs_nas_encode_bearer_resource_modification_request(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT: - size = ogs_nas_encode_bearer_resource_modification_reject(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_ESM_INFORMATION_REQUEST: - break; - case OGS_NAS_ESM_INFORMATION_RESPONSE: - size = ogs_nas_encode_esm_information_response(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - case OGS_NAS_ESM_STATUS: - size = ogs_nas_encode_esm_status(pkbuf, message); - ogs_assert(size >= 0); - encoded += size; - break; - default: - ogs_error("Unknown message type (0x%x) or not implemented", - message->esm.h.message_type); - ogs_pkbuf_free(pkbuf); - return NULL; + switch (message->esm.h.message_type) { + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST: + size = ogs_nas_encode_activate_default_eps_bearer_context_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT: + size = ogs_nas_encode_activate_default_eps_bearer_context_accept(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT: + size = ogs_nas_encode_activate_default_eps_bearer_context_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST: + size = ogs_nas_encode_activate_dedicated_eps_bearer_context_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT: + size = ogs_nas_encode_activate_dedicated_eps_bearer_context_accept(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT: + size = ogs_nas_encode_activate_dedicated_eps_bearer_context_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REQUEST: + size = ogs_nas_encode_modify_eps_bearer_context_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT: + size = ogs_nas_encode_modify_eps_bearer_context_accept(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_MODIFY_EPS_BEARER_CONTEXT_REJECT: + size = ogs_nas_encode_modify_eps_bearer_context_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST: + size = ogs_nas_encode_deactivate_eps_bearer_context_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT: + size = ogs_nas_encode_deactivate_eps_bearer_context_accept(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDN_CONNECTIVITY_REQUEST: + size = ogs_nas_encode_pdn_connectivity_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDN_CONNECTIVITY_REJECT: + size = ogs_nas_encode_pdn_connectivity_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDN_DISCONNECT_REQUEST: + size = ogs_nas_encode_pdn_disconnect_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_PDN_DISCONNECT_REJECT: + size = ogs_nas_encode_pdn_disconnect_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REQUEST: + size = ogs_nas_encode_bearer_resource_allocation_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_ALLOCATION_REJECT: + size = ogs_nas_encode_bearer_resource_allocation_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REQUEST: + size = ogs_nas_encode_bearer_resource_modification_request(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_BEARER_RESOURCE_MODIFICATION_REJECT: + size = ogs_nas_encode_bearer_resource_modification_reject(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_ESM_INFORMATION_REQUEST: + break; + case OGS_NAS_ESM_INFORMATION_RESPONSE: + size = ogs_nas_encode_esm_information_response(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + case OGS_NAS_ESM_STATUS: + size = ogs_nas_encode_esm_status(pkbuf, message); + ogs_assert(size >= 0); + encoded += size; + break; + default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->esm.h.message_type); + ogs_pkbuf_free(pkbuf); + return NULL; } ogs_assert(ogs_pkbuf_push(pkbuf, encoded)); diff --git a/lib/nas/ies.c b/lib/nas/eps/ies.c similarity index 99% rename from lib/nas/ies.c rename to lib/nas/eps/ies.c index ead71f529b..c52995a412 100644 --- a/lib/nas/ies.c +++ b/lib/nas/eps/ies.c @@ -28,11 +28,11 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2020-04-24 08:50:31.629657 by acetcom + * Created on: 2020-05-21 20:07:15.937289 by acetcom * from 24301-d80.docx ******************************************************************************/ -#include "ogs-nas.h" +#include "ogs-nas-eps.h" int ogs_nas_encode_optional_type(ogs_pkbuf_t *pkbuf, uint8_t type) { @@ -217,8 +217,7 @@ int ogs_nas_decode_mobile_identity(ogs_nas_mobile_identity_t *mobile_identity, o ogs_assert(ogs_pkbuf_pull(pkbuf, size)); memcpy(mobile_identity, pkbuf->data - size, size); - if (mobile_identity->tmsi.type == OGS_NAS_MOBILE_IDENTITY_TMSI) - { + if (mobile_identity->tmsi.type == OGS_NAS_MOBILE_IDENTITY_TMSI) { mobile_identity->tmsi.tmsi = be32toh(mobile_identity->tmsi.tmsi); } @@ -234,8 +233,7 @@ int ogs_nas_encode_mobile_identity(ogs_pkbuf_t *pkbuf, ogs_nas_mobile_identity_t ogs_nas_mobile_identity_t target; memcpy(&target, mobile_identity, sizeof(ogs_nas_mobile_identity_t)); - if (mobile_identity->tmsi.type == OGS_NAS_MOBILE_IDENTITY_TMSI) - { + if (mobile_identity->tmsi.type == OGS_NAS_MOBILE_IDENTITY_TMSI) { target.tmsi.tmsi = htobe32(mobile_identity->tmsi.tmsi); target.tmsi.spare = 0xf; } @@ -508,8 +506,7 @@ int ogs_nas_decode_eps_mobile_identity(ogs_nas_eps_mobile_identity_t *eps_mobile ogs_assert(ogs_pkbuf_pull(pkbuf, size)); memcpy(eps_mobile_identity, pkbuf->data - size, size); - if (eps_mobile_identity->guti.type == OGS_NAS_EPS_MOBILE_IDENTITY_GUTI) - { + if (eps_mobile_identity->guti.type == OGS_NAS_EPS_MOBILE_IDENTITY_GUTI) { eps_mobile_identity->guti.mme_gid = be16toh(eps_mobile_identity->guti.mme_gid); eps_mobile_identity->guti.m_tmsi = be32toh(eps_mobile_identity->guti.m_tmsi); } @@ -526,8 +523,7 @@ int ogs_nas_encode_eps_mobile_identity(ogs_pkbuf_t *pkbuf, ogs_nas_eps_mobile_id ogs_nas_eps_mobile_identity_t target; memcpy(&target, eps_mobile_identity, sizeof(ogs_nas_eps_mobile_identity_t)); - if (target.guti.type == OGS_NAS_EPS_MOBILE_IDENTITY_GUTI) - { + if (target.guti.type == OGS_NAS_EPS_MOBILE_IDENTITY_GUTI) { target.guti.spare = 0xf; target.guti.mme_gid = htobe16(eps_mobile_identity->guti.mme_gid); target.guti.m_tmsi = htobe32(eps_mobile_identity->guti.m_tmsi); diff --git a/lib/nas/ies.h b/lib/nas/eps/ies.h similarity index 99% rename from lib/nas/ies.h rename to lib/nas/eps/ies.h index eab4cdb60d..6099fddbc8 100644 --- a/lib/nas/ies.h +++ b/lib/nas/eps/ies.h @@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2020-04-24 08:50:31.627584 by acetcom + * Created on: 2020-05-21 20:07:15.935158 by acetcom * from 24301-d80.docx ******************************************************************************/ @@ -36,8 +36,8 @@ #error "This header cannot be included directly." #endif -#ifndef OGS_NAS_IES_H -#define OGS_NAS_IES_H +#ifndef OGS_NAS_EPS_IES_H +#define OGS_NAS_EPS_IES_H #ifdef __cplusplus extern "C" { @@ -231,5 +231,5 @@ int ogs_nas_encode_pdn_address(ogs_pkbuf_t *pkbuf, ogs_nas_pdn_address_t *pdn_ad } #endif -#endif /* OGS_NAS_IES_H */ +#endif /* OGS_NAS_EPS_IES_H */ diff --git a/lib/nas/eps/meson.build b/lib/nas/eps/meson.build new file mode 100644 index 0000000000..89932abb35 --- /dev/null +++ b/lib/nas/eps/meson.build @@ -0,0 +1,37 @@ +# Copyright (C) 2019 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 . + +libnas_eps_sources = files(''' + ies.c + decoder.c + encoder.c +'''.split()) + +libnas_eps_inc = include_directories('.') + +libnas_eps = library('ogsnas-eps', + sources : libnas_eps_sources, + version : libogslib_version, + c_args : '-DOGS_NAS_COMPILATION', + include_directories : libnas_eps_inc, + dependencies : libnas_common_dep, + install : true) + +libnas_eps_dep = declare_dependency( + link_with : libnas_eps, + include_directories : libnas_eps_inc, + dependencies : libnas_common_dep) diff --git a/lib/nas/message.h b/lib/nas/eps/message.h similarity index 99% rename from lib/nas/message.h rename to lib/nas/eps/message.h index f597f0b588..08c490d71d 100644 --- a/lib/nas/message.h +++ b/lib/nas/eps/message.h @@ -28,7 +28,7 @@ /******************************************************************************* * This file had been created by nas-message.py script v0.1.0 * Please do not modify this file but regenerate it via script. - * Created on: 2020-04-24 08:50:31.635873 by acetcom + * Created on: 2020-05-21 20:07:15.943424 by acetcom * from 24301-d80.docx ******************************************************************************/ @@ -36,8 +36,8 @@ #error "This header cannot be included directly." #endif -#ifndef OGS_NAS_MESSAGE_H -#define OGS_NAS_MESSAGE_H +#ifndef OGS_NAS_EPS_MESSAGE_H +#define OGS_NAS_EPS_MESSAGE_H #ifdef __cplusplus extern "C" { @@ -1425,4 +1425,4 @@ ogs_pkbuf_t *ogs_nas_plain_encode(ogs_nas_message_t *message); } #endif -#endif /* OGS_NAS_MESSAGE_H */ +#endif /* OGS_NAS_EPS_MESSAGE_H */ diff --git a/lib/nas/eps/ogs-nas-eps.h b/lib/nas/eps/ogs-nas-eps.h new file mode 100644 index 0000000000..6d5c0a2dc4 --- /dev/null +++ b/lib/nas/eps/ogs-nas-eps.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2019 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 . + */ + +#ifndef OGS_NAS_EPS_H +#define OGS_NAS_EPS_H + +#include "ogs-nas-common.h" + +#define OGS_NAS_INSIDE + +#include "nas/eps/types.h" +#include "nas/eps/ies.h" +#include "nas/eps/message.h" + +#undef OGS_NAS_INSIDE + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* OGS_NAS_EPS_H */ diff --git a/lib/nas/support/24301-d80.docx b/lib/nas/eps/support/24301-d80.docx similarity index 100% rename from lib/nas/support/24301-d80.docx rename to lib/nas/eps/support/24301-d80.docx diff --git a/lib/nas/support/README.md b/lib/nas/eps/support/README.md similarity index 100% rename from lib/nas/support/README.md rename to lib/nas/eps/support/README.md diff --git a/lib/nas/support/cache/nas-msg-100.py b/lib/nas/eps/support/cache/nas-msg-100.py similarity index 100% rename from lib/nas/support/cache/nas-msg-100.py rename to lib/nas/eps/support/cache/nas-msg-100.py diff --git a/lib/nas/support/cache/nas-msg-101.py b/lib/nas/eps/support/cache/nas-msg-101.py similarity index 100% rename from lib/nas/support/cache/nas-msg-101.py rename to lib/nas/eps/support/cache/nas-msg-101.py diff --git a/lib/nas/support/cache/nas-msg-104.py b/lib/nas/eps/support/cache/nas-msg-104.py similarity index 100% rename from lib/nas/support/cache/nas-msg-104.py rename to lib/nas/eps/support/cache/nas-msg-104.py diff --git a/lib/nas/support/cache/nas-msg-193.py b/lib/nas/eps/support/cache/nas-msg-193.py similarity index 100% rename from lib/nas/support/cache/nas-msg-193.py rename to lib/nas/eps/support/cache/nas-msg-193.py diff --git a/lib/nas/support/cache/nas-msg-194.py b/lib/nas/eps/support/cache/nas-msg-194.py similarity index 100% rename from lib/nas/support/cache/nas-msg-194.py rename to lib/nas/eps/support/cache/nas-msg-194.py diff --git a/lib/nas/support/cache/nas-msg-195.py b/lib/nas/eps/support/cache/nas-msg-195.py similarity index 100% rename from lib/nas/support/cache/nas-msg-195.py rename to lib/nas/eps/support/cache/nas-msg-195.py diff --git a/lib/nas/support/cache/nas-msg-197.py b/lib/nas/eps/support/cache/nas-msg-197.py similarity index 100% rename from lib/nas/support/cache/nas-msg-197.py rename to lib/nas/eps/support/cache/nas-msg-197.py diff --git a/lib/nas/support/cache/nas-msg-198.py b/lib/nas/eps/support/cache/nas-msg-198.py similarity index 100% rename from lib/nas/support/cache/nas-msg-198.py rename to lib/nas/eps/support/cache/nas-msg-198.py diff --git a/lib/nas/support/cache/nas-msg-199.py b/lib/nas/eps/support/cache/nas-msg-199.py similarity index 100% rename from lib/nas/support/cache/nas-msg-199.py rename to lib/nas/eps/support/cache/nas-msg-199.py diff --git a/lib/nas/support/cache/nas-msg-201.py b/lib/nas/eps/support/cache/nas-msg-201.py similarity index 100% rename from lib/nas/support/cache/nas-msg-201.py rename to lib/nas/eps/support/cache/nas-msg-201.py diff --git a/lib/nas/support/cache/nas-msg-202.py b/lib/nas/eps/support/cache/nas-msg-202.py similarity index 100% rename from lib/nas/support/cache/nas-msg-202.py rename to lib/nas/eps/support/cache/nas-msg-202.py diff --git a/lib/nas/support/cache/nas-msg-203.py b/lib/nas/eps/support/cache/nas-msg-203.py similarity index 100% rename from lib/nas/support/cache/nas-msg-203.py rename to lib/nas/eps/support/cache/nas-msg-203.py diff --git a/lib/nas/support/cache/nas-msg-205.py b/lib/nas/eps/support/cache/nas-msg-205.py similarity index 100% rename from lib/nas/support/cache/nas-msg-205.py rename to lib/nas/eps/support/cache/nas-msg-205.py diff --git a/lib/nas/support/cache/nas-msg-206.py b/lib/nas/eps/support/cache/nas-msg-206.py similarity index 100% rename from lib/nas/support/cache/nas-msg-206.py rename to lib/nas/eps/support/cache/nas-msg-206.py diff --git a/lib/nas/support/cache/nas-msg-208.py b/lib/nas/eps/support/cache/nas-msg-208.py similarity index 100% rename from lib/nas/support/cache/nas-msg-208.py rename to lib/nas/eps/support/cache/nas-msg-208.py diff --git a/lib/nas/support/cache/nas-msg-209.py b/lib/nas/eps/support/cache/nas-msg-209.py similarity index 100% rename from lib/nas/support/cache/nas-msg-209.py rename to lib/nas/eps/support/cache/nas-msg-209.py diff --git a/lib/nas/support/cache/nas-msg-210.py b/lib/nas/eps/support/cache/nas-msg-210.py similarity index 100% rename from lib/nas/support/cache/nas-msg-210.py rename to lib/nas/eps/support/cache/nas-msg-210.py diff --git a/lib/nas/support/cache/nas-msg-211.py b/lib/nas/eps/support/cache/nas-msg-211.py similarity index 100% rename from lib/nas/support/cache/nas-msg-211.py rename to lib/nas/eps/support/cache/nas-msg-211.py diff --git a/lib/nas/support/cache/nas-msg-212.py b/lib/nas/eps/support/cache/nas-msg-212.py similarity index 100% rename from lib/nas/support/cache/nas-msg-212.py rename to lib/nas/eps/support/cache/nas-msg-212.py diff --git a/lib/nas/support/cache/nas-msg-213.py b/lib/nas/eps/support/cache/nas-msg-213.py similarity index 100% rename from lib/nas/support/cache/nas-msg-213.py rename to lib/nas/eps/support/cache/nas-msg-213.py diff --git a/lib/nas/support/cache/nas-msg-214.py b/lib/nas/eps/support/cache/nas-msg-214.py similarity index 100% rename from lib/nas/support/cache/nas-msg-214.py rename to lib/nas/eps/support/cache/nas-msg-214.py diff --git a/lib/nas/support/cache/nas-msg-215.py b/lib/nas/eps/support/cache/nas-msg-215.py similarity index 100% rename from lib/nas/support/cache/nas-msg-215.py rename to lib/nas/eps/support/cache/nas-msg-215.py diff --git a/lib/nas/support/cache/nas-msg-74.py b/lib/nas/eps/support/cache/nas-msg-217.py similarity index 100% rename from lib/nas/support/cache/nas-msg-74.py rename to lib/nas/eps/support/cache/nas-msg-217.py diff --git a/lib/nas/support/cache/nas-msg-218.py b/lib/nas/eps/support/cache/nas-msg-218.py similarity index 100% rename from lib/nas/support/cache/nas-msg-218.py rename to lib/nas/eps/support/cache/nas-msg-218.py diff --git a/lib/nas/support/cache/nas-msg-232.py b/lib/nas/eps/support/cache/nas-msg-232.py similarity index 100% rename from lib/nas/support/cache/nas-msg-232.py rename to lib/nas/eps/support/cache/nas-msg-232.py diff --git a/lib/nas/support/cache/nas-msg-65.py b/lib/nas/eps/support/cache/nas-msg-65.py similarity index 100% rename from lib/nas/support/cache/nas-msg-65.py rename to lib/nas/eps/support/cache/nas-msg-65.py diff --git a/lib/nas/support/cache/nas-msg-66.py b/lib/nas/eps/support/cache/nas-msg-66.py similarity index 100% rename from lib/nas/support/cache/nas-msg-66.py rename to lib/nas/eps/support/cache/nas-msg-66.py diff --git a/lib/nas/support/cache/nas-msg-67.py b/lib/nas/eps/support/cache/nas-msg-67.py similarity index 100% rename from lib/nas/support/cache/nas-msg-67.py rename to lib/nas/eps/support/cache/nas-msg-67.py diff --git a/lib/nas/support/cache/nas-msg-68.py b/lib/nas/eps/support/cache/nas-msg-68.py similarity index 100% rename from lib/nas/support/cache/nas-msg-68.py rename to lib/nas/eps/support/cache/nas-msg-68.py diff --git a/lib/nas/support/cache/nas-msg-69.1.py b/lib/nas/eps/support/cache/nas-msg-69.1.py similarity index 100% rename from lib/nas/support/cache/nas-msg-69.1.py rename to lib/nas/eps/support/cache/nas-msg-69.1.py diff --git a/lib/nas/support/cache/nas-msg-69.2.py b/lib/nas/eps/support/cache/nas-msg-69.2.py similarity index 100% rename from lib/nas/support/cache/nas-msg-69.2.py rename to lib/nas/eps/support/cache/nas-msg-69.2.py diff --git a/lib/nas/support/cache/nas-msg-81.py b/lib/nas/eps/support/cache/nas-msg-70.py similarity index 100% rename from lib/nas/support/cache/nas-msg-81.py rename to lib/nas/eps/support/cache/nas-msg-70.py diff --git a/lib/nas/support/cache/nas-msg-72.py b/lib/nas/eps/support/cache/nas-msg-72.py similarity index 100% rename from lib/nas/support/cache/nas-msg-72.py rename to lib/nas/eps/support/cache/nas-msg-72.py diff --git a/lib/nas/support/cache/nas-msg-73.py b/lib/nas/eps/support/cache/nas-msg-73.py similarity index 100% rename from lib/nas/support/cache/nas-msg-73.py rename to lib/nas/eps/support/cache/nas-msg-73.py diff --git a/lib/nas/support/cache/nas-msg-84.py b/lib/nas/eps/support/cache/nas-msg-74.py similarity index 100% rename from lib/nas/support/cache/nas-msg-84.py rename to lib/nas/eps/support/cache/nas-msg-74.py diff --git a/lib/nas/support/cache/nas-msg-75.py b/lib/nas/eps/support/cache/nas-msg-75.py similarity index 100% rename from lib/nas/support/cache/nas-msg-75.py rename to lib/nas/eps/support/cache/nas-msg-75.py diff --git a/lib/nas/support/cache/nas-msg-76.py b/lib/nas/eps/support/cache/nas-msg-76.py similarity index 100% rename from lib/nas/support/cache/nas-msg-76.py rename to lib/nas/eps/support/cache/nas-msg-76.py diff --git a/lib/nas/support/cache/nas-msg-77.1.py b/lib/nas/eps/support/cache/nas-msg-77.1.py similarity index 100% rename from lib/nas/support/cache/nas-msg-77.1.py rename to lib/nas/eps/support/cache/nas-msg-77.1.py diff --git a/lib/nas/support/cache/nas-msg-78.py b/lib/nas/eps/support/cache/nas-msg-78.py similarity index 100% rename from lib/nas/support/cache/nas-msg-78.py rename to lib/nas/eps/support/cache/nas-msg-78.py diff --git a/lib/nas/support/cache/nas-msg-80.py b/lib/nas/eps/support/cache/nas-msg-80.py similarity index 100% rename from lib/nas/support/cache/nas-msg-80.py rename to lib/nas/eps/support/cache/nas-msg-80.py diff --git a/lib/nas/eps/support/cache/nas-msg-81.py b/lib/nas/eps/support/cache/nas-msg-81.py new file mode 100644 index 0000000000..bdf2b4880f --- /dev/null +++ b/lib/nas/eps/support/cache/nas-msg-81.py @@ -0,0 +1,2 @@ +ies = [] +msg_list[key]["ies"] = ies diff --git a/lib/nas/support/cache/nas-msg-82.py b/lib/nas/eps/support/cache/nas-msg-82.py similarity index 100% rename from lib/nas/support/cache/nas-msg-82.py rename to lib/nas/eps/support/cache/nas-msg-82.py diff --git a/lib/nas/support/cache/nas-msg-83.py b/lib/nas/eps/support/cache/nas-msg-83.py similarity index 100% rename from lib/nas/support/cache/nas-msg-83.py rename to lib/nas/eps/support/cache/nas-msg-83.py diff --git a/lib/nas/eps/support/cache/nas-msg-84.py b/lib/nas/eps/support/cache/nas-msg-84.py new file mode 100644 index 0000000000..bdf2b4880f --- /dev/null +++ b/lib/nas/eps/support/cache/nas-msg-84.py @@ -0,0 +1,2 @@ +ies = [] +msg_list[key]["ies"] = ies diff --git a/lib/nas/support/cache/nas-msg-85.py b/lib/nas/eps/support/cache/nas-msg-85.py similarity index 100% rename from lib/nas/support/cache/nas-msg-85.py rename to lib/nas/eps/support/cache/nas-msg-85.py diff --git a/lib/nas/support/cache/nas-msg-86.py b/lib/nas/eps/support/cache/nas-msg-86.py similarity index 100% rename from lib/nas/support/cache/nas-msg-86.py rename to lib/nas/eps/support/cache/nas-msg-86.py diff --git a/lib/nas/support/cache/nas-msg-92.py b/lib/nas/eps/support/cache/nas-msg-92.py similarity index 100% rename from lib/nas/support/cache/nas-msg-92.py rename to lib/nas/eps/support/cache/nas-msg-92.py diff --git a/lib/nas/support/cache/nas-msg-93.py b/lib/nas/eps/support/cache/nas-msg-93.py similarity index 100% rename from lib/nas/support/cache/nas-msg-93.py rename to lib/nas/eps/support/cache/nas-msg-93.py diff --git a/lib/nas/support/cache/nas-msg-94.py b/lib/nas/eps/support/cache/nas-msg-94.py similarity index 100% rename from lib/nas/support/cache/nas-msg-94.py rename to lib/nas/eps/support/cache/nas-msg-94.py diff --git a/lib/nas/support/cache/nas-msg-95.py b/lib/nas/eps/support/cache/nas-msg-95.py similarity index 100% rename from lib/nas/support/cache/nas-msg-95.py rename to lib/nas/eps/support/cache/nas-msg-95.py diff --git a/lib/nas/support/cache/nas-msg-96.py b/lib/nas/eps/support/cache/nas-msg-96.py similarity index 100% rename from lib/nas/support/cache/nas-msg-96.py rename to lib/nas/eps/support/cache/nas-msg-96.py diff --git a/lib/nas/support/cache/nas-msg-97.py b/lib/nas/eps/support/cache/nas-msg-97.py similarity index 100% rename from lib/nas/support/cache/nas-msg-97.py rename to lib/nas/eps/support/cache/nas-msg-97.py diff --git a/lib/nas/support/cache/nas-msg-98.py b/lib/nas/eps/support/cache/nas-msg-98.py similarity index 100% rename from lib/nas/support/cache/nas-msg-98.py rename to lib/nas/eps/support/cache/nas-msg-98.py diff --git a/lib/nas/support/cache/nas-msg-99.py b/lib/nas/eps/support/cache/nas-msg-99.py similarity index 100% rename from lib/nas/support/cache/nas-msg-99.py rename to lib/nas/eps/support/cache/nas-msg-99.py diff --git a/lib/nas/support/nas-message.py b/lib/nas/eps/support/nas-message.py similarity index 91% rename from lib/nas/support/nas-message.py rename to lib/nas/eps/support/nas-message.py index d9a0b9df59..3c48be4620 100644 --- a/lib/nas/support/nas-message.py +++ b/lib/nas/eps/support/nas-message.py @@ -350,8 +350,8 @@ f.write("""#if !defined(OGS_NAS_INSIDE) && !defined(OGS_NAS_COMPILATION) #error "This header cannot be included directly." #endif -#ifndef OGS_NAS_IES_H -#define OGS_NAS_IES_H +#ifndef OGS_NAS_EPS_IES_H +#define OGS_NAS_EPS_IES_H #ifdef __cplusplus extern "C" { @@ -374,14 +374,14 @@ f.write("""#ifdef __cplusplus } #endif -#endif /* OGS_NAS_IES_H */ +#endif /* OGS_NAS_EPS_IES_H */ """) f.close() f = open(outdir + 'ies.c', 'w') output_header_to_file(f) -f.write("""#include "ogs-nas.h" +f.write("""#include "ogs-nas-eps.h" int ogs_nas_encode_optional_type(ogs_pkbuf_t *pkbuf, uint8_t type) { @@ -398,7 +398,7 @@ for (k, v) in sorted_type_list: # d_print("%s = %s\n" % (k, type_list[k])) f.write("/* %s %s\n" % (type_list[k]["reference"], k)) f.write(" * %s %s %s */\n" % (type_list[k]["presence"], type_list[k]["format"], type_list[k]["length"])) - if type_list[k]["format"] == "TV" and type_list[k]["length"] == "1": + if (type_list[k]["format"] == "TV" or type_list[k]["format"] == "T") and type_list[k]["length"] == "1": f.write("int ogs_nas_decode_%s(ogs_nas_%s_t *%s, ogs_pkbuf_t *pkbuf)\n" % (v_lower(k), v_lower(k), v_lower(k))) f.write("{\n") f.write(" memcpy(%s, pkbuf->data - 1, 1);\n\n" % v_lower(k)) @@ -512,8 +512,8 @@ f.write("""#if !defined(OGS_NAS_INSIDE) && !defined(OGS_NAS_COMPILATION) #error "This header cannot be included directly." #endif -#ifndef OGS_NAS_MESSAGE_H -#define OGS_NAS_MESSAGE_H +#ifndef OGS_NAS_EPS_MESSAGE_H +#define OGS_NAS_EPS_MESSAGE_H #ifdef __cplusplus extern "C" { @@ -647,7 +647,7 @@ ogs_pkbuf_t *ogs_nas_plain_encode(ogs_nas_message_t *message); } #endif -#endif /* OGS_NAS_MESSAGE_H */ +#endif /* OGS_NAS_EPS_MESSAGE_H */ """) f.close() @@ -656,7 +656,7 @@ f.close() f = open(outdir + 'decoder.c', 'w') output_header_to_file(f) -f.write("""#include "ogs-nas.h" +f.write("""#include "ogs-nas-eps.h" """) @@ -690,8 +690,7 @@ for (k, v) in sorted_msg_list: optional_fields = False; for ie in [ies for ies in msg_list[k]["ies"] if ies["presence"] == "O"]: if optional_fields is False: - f.write(""" while(pkbuf->len > 0) - { + f.write(""" while (pkbuf->len > 0) { uint8_t *buffer = pkbuf->data; uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer); @@ -699,22 +698,21 @@ for (k, v) in sorted_msg_list: ogs_assert(ogs_pkbuf_pull(pkbuf, size)); decoded += size; - switch(type) - { + switch (type) { """) optional_fields = True; - f.write(" case OGS_NAS_%s_%s_TYPE:\n" % (v_upper(k), v_upper(ie["value"]))) - f.write(" size = ogs_nas_decode_%s(&%s->%s, pkbuf);\n" % (v_lower(ie["type"]), v_lower(k), v_lower(ie["value"]))) - f.write(" ogs_assert(size >= 0);\n") - f.write(" %s->presencemask |= OGS_NAS_%s_%s_PRESENT;\n" % (v_lower(k), v_upper(k), v_upper(ie["value"]))) - f.write(" decoded += size;\n") - f.write(" break;\n") + f.write(" case OGS_NAS_%s_%s_TYPE:\n" % (v_upper(k), v_upper(ie["value"]))) + f.write(" size = ogs_nas_decode_%s(&%s->%s, pkbuf);\n" % (v_lower(ie["type"]), v_lower(k), v_lower(ie["value"]))) + f.write(" ogs_assert(size >= 0);\n") + f.write(" %s->presencemask |= OGS_NAS_%s_%s_PRESENT;\n" % (v_lower(k), v_upper(k), v_upper(ie["value"]))) + f.write(" decoded += size;\n") + f.write(" break;\n") if [ies for ies in msg_list[k]["ies"] if ies["presence"] == "O"]: - f.write(""" default: - ogs_warn("Unknown type(0x%x) or not implemented\\n", type); - break; + f.write(""" default: + ogs_warn("Unknown type(0x%x) or not implemented\\n", type); + break; } } @@ -741,8 +739,7 @@ f.write("""int ogs_nas_emm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf decoded += size; if (message->emm.h.security_header_type >= - OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) - { + OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) { ogs_assert(ogs_pkbuf_push(pkbuf, 1)); decoded -= 1; size = ogs_nas_decode_service_request(message, pkbuf); @@ -752,24 +749,23 @@ f.write("""int ogs_nas_emm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf goto out; } - switch(message->emm.h.message_type) - { + switch (message->emm.h.message_type) { """) for (k, v) in sorted_msg_list: if "ies" not in msg_list[k]: continue; if float(msg_list[k]["type"]) < 192 and k.find("TO UE") == -1 and k != "SERVICE REQUEST": - f.write(" case OGS_NAS_%s:\n" % v_upper(k)) + f.write(" case OGS_NAS_%s:\n" % v_upper(k)) if len(msg_list[k]["ies"]) != 0: - f.write(" size = ogs_nas_decode_%s(message, pkbuf);\n" % v_lower(k)) - f.write(" ogs_assert(size >= 0);\n") - f.write(" decoded += size;\n") - f.write(" break;\n") + f.write(" size = ogs_nas_decode_%s(message, pkbuf);\n" % v_lower(k)) + f.write(" ogs_assert(size >= 0);\n") + f.write(" decoded += size;\n") + f.write(" break;\n") -f.write(""" default: - ogs_error("Unknown message type (0x%x) or not implemented", - message->emm.h.message_type); - break; +f.write(""" default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->emm.h.message_type); + break; } out: @@ -795,24 +791,23 @@ f.write("""int ogs_nas_esm_decode(ogs_nas_message_t *message, ogs_pkbuf_t *pkbuf memcpy(&message->esm.h, pkbuf->data - size, size); decoded += size; - switch(message->esm.h.message_type) - { + switch (message->esm.h.message_type) { """) for (k, v) in sorted_msg_list: if "ies" not in msg_list[k]: continue; if float(msg_list[k]["type"]) >= 192: - f.write(" case OGS_NAS_%s:\n" % v_upper(k)) + f.write(" case OGS_NAS_%s:\n" % v_upper(k)) if len(msg_list[k]["ies"]) != 0: - f.write(" size = ogs_nas_decode_%s(message, pkbuf);\n" % v_lower(k)) - f.write(" ogs_assert(size >= 0);\n") - f.write(" decoded += size;\n") - f.write(" break;\n") + f.write(" size = ogs_nas_decode_%s(message, pkbuf);\n" % v_lower(k)) + f.write(" ogs_assert(size >= 0);\n") + f.write(" decoded += size;\n") + f.write(" break;\n") -f.write(""" default: - ogs_error("Unknown message type (0x%x) or not implemented", - message->esm.h.message_type); - break; +f.write(""" default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->esm.h.message_type); + break; } ogs_assert(ogs_pkbuf_push(pkbuf, decoded)); @@ -826,7 +821,7 @@ f.close() f = open(outdir + 'encoder.c', 'w') output_header_to_file(f) -f.write("""#include "ogs-nas.h" +f.write("""#include "ogs-nas-eps.h" """) @@ -858,10 +853,11 @@ for (k, v) in sorted_msg_list: f.write(" encoded += size;\n\n") for ie in [ies for ies in msg_list[k]["ies"] if ies["presence"] == "O"]: - f.write(" if (%s->presencemask & OGS_NAS_%s_%s_PRESENT)\n" % (v_lower(k), v_upper(k), v_upper(ie["value"]))) - f.write(" {\n") + f.write(" if (%s->presencemask & OGS_NAS_%s_%s_PRESENT) {\n" % (v_lower(k), v_upper(k), v_upper(ie["value"]))) if ie["length"] == "1" and ie["format"] == "TV": f.write(" %s->%s.type = (OGS_NAS_%s_%s_TYPE >> 4);\n\n" % (v_lower(k), v_lower(ie["value"]), v_upper(k), v_upper(ie["value"]))) + elif ie["length"] == "1" and ie["format"] == "T": + f.write(" %s->%s.type = OGS_NAS_%s_%s_TYPE;\n\n" % (get_value(k), get_value(ie["value"]), v_upper(k), v_upper(ie["value"]))) else: f.write(" size = ogs_nas_encode_optional_type(pkbuf, OGS_NAS_%s_%s_TYPE);\n" % (v_upper(k), v_upper(ie["value"]))) f.write(" ogs_assert(size >= 0);\n") @@ -899,8 +895,7 @@ f.write("""ogs_pkbuf_t *ogs_nas_emm_encode(ogs_nas_message_t *message) encoded += size; if (message->emm.h.security_header_type >= - OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) - { + OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) { ogs_assert(ogs_pkbuf_push(pkbuf, 1)); encoded -= 1; size = ogs_nas_encode_service_request(pkbuf, message); @@ -910,26 +905,25 @@ f.write("""ogs_pkbuf_t *ogs_nas_emm_encode(ogs_nas_message_t *message) goto out; } - switch(message->emm.h.message_type) - { + switch (message->emm.h.message_type) { """) for (k, v) in sorted_msg_list: if "ies" not in msg_list[k]: continue; if float(msg_list[k]["type"]) < 192 and k.find("FROM UE") == -1 and k != "SERVICE REQUEST": - f.write(" case OGS_NAS_%s:\n" % v_upper(k)) + f.write(" case OGS_NAS_%s:\n" % v_upper(k)) if len(msg_list[k]["ies"]) != 0: - f.write(" size = ogs_nas_encode_%s(pkbuf, message);\n" % v_lower(k)) - f.write(" ogs_assert(size >= 0);\n") - f.write(" encoded += size;\n") - f.write(" break;\n") + f.write(" size = ogs_nas_encode_%s(pkbuf, message);\n" % v_lower(k)) + f.write(" ogs_assert(size >= 0);\n") + f.write(" encoded += size;\n") + f.write(" break;\n") -f.write(""" default: - ogs_error("Unknown message type (0x%x) or not implemented", - message->emm.h.message_type); - ogs_pkbuf_free(pkbuf); - return NULL; +f.write(""" default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->emm.h.message_type); + ogs_pkbuf_free(pkbuf); + return NULL; } out: @@ -962,26 +956,25 @@ f.write("""ogs_pkbuf_t *ogs_nas_esm_encode(ogs_nas_message_t *message) memcpy(pkbuf->data - size, &message->esm.h, size); encoded += size; - switch(message->esm.h.message_type) - { + switch (message->esm.h.message_type) { """) for (k, v) in sorted_msg_list: if "ies" not in msg_list[k]: continue; if float(msg_list[k]["type"]) >= 192: - f.write(" case OGS_NAS_%s:\n" % v_upper(k)) + f.write(" case OGS_NAS_%s:\n" % v_upper(k)) if len(msg_list[k]["ies"]) != 0: - f.write(" size = ogs_nas_encode_%s(pkbuf, message);\n" % v_lower(k)) - f.write(" ogs_assert(size >= 0);\n") - f.write(" encoded += size;\n") - f.write(" break;\n") + f.write(" size = ogs_nas_encode_%s(pkbuf, message);\n" % v_lower(k)) + f.write(" ogs_assert(size >= 0);\n") + f.write(" encoded += size;\n") + f.write(" break;\n") -f.write(""" default: - ogs_error("Unknown message type (0x%x) or not implemented", - message->esm.h.message_type); - ogs_pkbuf_free(pkbuf); - return NULL; +f.write(""" default: + ogs_error("Unknown message type (0x%x) or not implemented", + message->esm.h.message_type); + ogs_pkbuf_free(pkbuf); + return NULL; } ogs_assert(ogs_pkbuf_push(pkbuf, encoded)); diff --git a/lib/nas/support/type-list.py b/lib/nas/eps/support/type-list.py similarity index 95% rename from lib/nas/support/type-list.py rename to lib/nas/eps/support/type-list.py index 1f699538f1..582289b0a4 100644 --- a/lib/nas/support/type-list.py +++ b/lib/nas/eps/support/type-list.py @@ -32,26 +32,22 @@ type_list["Tracking area identity"]["encode"] = \ " target.tac = htobe16(tracking_area_identity->tac);\n\n" type_list["Mobile identity"]["decode"] = \ -" if (mobile_identity->tmsi.type == OGS_NAS_MOBILE_IDENTITY_TMSI)\n" \ -" {\n" \ +" if (mobile_identity->tmsi.type == OGS_NAS_MOBILE_IDENTITY_TMSI) {\n" \ " mobile_identity->tmsi.tmsi = be32toh(mobile_identity->tmsi.tmsi);\n" \ " }\n\n" type_list["Mobile identity"]["encode"] = \ -" if (mobile_identity->tmsi.type == OGS_NAS_MOBILE_IDENTITY_TMSI)\n" \ -" {\n" \ +" if (mobile_identity->tmsi.type == OGS_NAS_MOBILE_IDENTITY_TMSI) {\n" \ " target.tmsi.tmsi = htobe32(mobile_identity->tmsi.tmsi);\n" \ " target.tmsi.spare = 0xf;\n" \ " }\n\n" type_list["EPS mobile identity"]["decode"] = \ -" if (eps_mobile_identity->guti.type == OGS_NAS_EPS_MOBILE_IDENTITY_GUTI)\n" \ -" {\n" \ +" if (eps_mobile_identity->guti.type == OGS_NAS_EPS_MOBILE_IDENTITY_GUTI) {\n" \ " eps_mobile_identity->guti.mme_gid = be16toh(eps_mobile_identity->guti.mme_gid);\n" \ " eps_mobile_identity->guti.m_tmsi = be32toh(eps_mobile_identity->guti.m_tmsi);\n" \ " }\n\n" type_list["EPS mobile identity"]["encode"] = \ -" if (target.guti.type == OGS_NAS_EPS_MOBILE_IDENTITY_GUTI)\n" \ -" {\n" \ +" if (target.guti.type == OGS_NAS_EPS_MOBILE_IDENTITY_GUTI) {\n" \ " target.guti.spare = 0xf;\n" \ " target.guti.mme_gid = htobe16(eps_mobile_identity->guti.mme_gid);\n" \ " target.guti.m_tmsi = htobe32(eps_mobile_identity->guti.m_tmsi);\n" \ diff --git a/lib/nas/types.h b/lib/nas/eps/types.h similarity index 55% rename from lib/nas/types.h rename to lib/nas/eps/types.h index bbfc5a58ad..397762f6f0 100644 --- a/lib/nas/types.h +++ b/lib/nas/eps/types.h @@ -21,68 +21,13 @@ #error "This header cannot be included directly." #endif -#ifndef OGS_NAS_TYPES_H -#define OGS_NAS_TYPES_H - -#include "ogs-core.h" +#ifndef OGS_NAS_EPS_TYPES_H +#define OGS_NAS_EPS_TYPES_H #ifdef __cplusplus extern "C" { #endif -#define OGS_NAS_CLEAR_DATA(__dATA) \ - do { \ - ogs_assert((__dATA)); \ - if ((__dATA)->buffer) { \ - ogs_free((__dATA)->buffer); \ - (__dATA)->buffer = NULL; \ - (__dATA)->length = 0; \ - } \ - } while(0) -#define OGS_NAS_STORE_DATA(__dST, __sRC) \ - do { \ - ogs_assert((__sRC)); \ - ogs_assert((__sRC)->buffer); \ - ogs_assert((__dST)); \ - OGS_NAS_CLEAR_DATA(__dST); \ - (__dST)->length = (__sRC)->length; \ - (__dST)->buffer = ogs_calloc((__dST)->length, sizeof(uint8_t)); \ - memcpy((__dST)->buffer, (__sRC)->buffer, (__dST)->length); \ - } while(0) - -#define OGS_NAS_KSI_NO_KEY_IS_AVAILABLE 0x7 - -/********************************** - * NAS PLMN_ID Structure */ -typedef struct ogs_nas_plmn_id_s { -ED2(uint8_t mcc2:4;, - uint8_t mcc1:4;) -ED2(uint8_t mnc3:4;, - uint8_t mcc3:4;) -ED2(uint8_t mnc2:4;, - uint8_t mnc1:4;) -} __attribute__ ((packed)) ogs_nas_plmn_id_t; - -void *ogs_nas_from_plmn_id( - ogs_nas_plmn_id_t *ogs_nas_plmn_id, ogs_plmn_id_t *plmn_id); -void *ogs_nas_to_plmn_id( - ogs_plmn_id_t *plmn_id, ogs_nas_plmn_id_t *ogs_nas_plmn_id); - -typedef struct ogs_nas_guti_s { - ogs_nas_plmn_id_t nas_plmn_id; - uint16_t mme_gid; - uint8_t mme_code; - uint32_t m_tmsi; -} __attribute__ ((packed)) ogs_nas_guti_t; - -/* 9.9.2.0 Additional information - * O TLV 3-n */ -#define NAX_MAX_ADDITIONAL_INFORMATION_LEN 255 -typedef struct ogs_nas_additional_information_s { - uint8_t length; - uint8_t buffer[NAX_MAX_ADDITIONAL_INFORMATION_LEN]; -} __attribute__ ((packed)) ogs_nas_additional_information_t; - /* 9.9.2.0A Device properties * See subclause 10.5.7.8 in 3GPP TS 24.008 [13]. * O TV 1 */ @@ -92,28 +37,6 @@ ED3(uint8_t type:4;, uint8_t low_priority:1;) } __attribute__ ((packed)) ogs_nas_device_properties_t; -/* 9.9.2.1 EPS bearer context status - * O TLV 4 */ -typedef struct ogs_nas_eps_bearer_context_status_s { - uint8_t length; -ED8(uint8_t ebi7:1;, - uint8_t ebi6:1;, - uint8_t ebi5:1;, - uint8_t ebi4:1;, - uint8_t ebi3:1;, - uint8_t ebi2:1;, - uint8_t ebi1:1;, - uint8_t ebi0:1;) -ED8(uint8_t ebi15:1;, - uint8_t ebi14:1;, - uint8_t ebi13:1;, - uint8_t ebi12:1;, - uint8_t ebi11:1;, - uint8_t ebi10:1;, - uint8_t ebi9:1;, - uint8_t ebi8:1;) -} __attribute__ ((packed)) ogs_nas_eps_bearer_context_status_t; - /* 9.9.2.2 Location area identification * See subclause 10.5.1.3 in 3GPP TS 24.008 [13] * O TV 6 */ @@ -124,124 +47,6 @@ typedef struct ogs_nas_location_area_identification_s { typedef ogs_nas_location_area_identification_t ogs_nas_lai_t; -/* 9.9.2.3 Mobile identity - * See subclause 10.5.1.4 in 3GPP TS 24.008 [13]. - * O TLV 7-10 */ -#define OGS_NAS_MOBILE_IDENTITY_NONE 0 -#define OGS_NAS_MOBILE_IDENTITY_IMSI 1 -#define OGS_NAS_MOBILE_IDENTITY_IMEI 2 -#define OGS_NAS_MOBILE_IDENTITY_IMEISV 3 -#define OGS_NAS_MOBILE_IDENTITY_TMSI 4 -#define OGS_NAS_MOBILE_IDENTITY_TMGI 5 -#define OGS_NAS_MOBILE_IDENTITY_GUTI 6 -typedef struct ogs_nas_mobile_identity_imsi_s { -ED3(uint8_t digit1:4;, - uint8_t odd_even:1;, - uint8_t type:3;) -ED2(uint8_t digit3:4;, - uint8_t digit2:4;) -ED2(uint8_t digit5:4;, - uint8_t digit4:4;) -ED2(uint8_t digit7:4;, - uint8_t digit6:4;) -ED2(uint8_t digit9:4;, - uint8_t digit8:4;) -ED2(uint8_t digit11:4;, - uint8_t digit10:4;) -ED2(uint8_t digit13:4;, - uint8_t digit12:4;) -ED2(uint8_t digit15:4;, - uint8_t digit14:4;) -} __attribute__ ((packed)) ogs_nas_mobile_identity_imsi_t; - -typedef struct ogs_nas_mobile_identity_tmsi_s { -ED3(uint8_t spare:4;, - uint8_t odd_even:1;, - uint8_t type:3;) - uint32_t tmsi; -} __attribute__ ((packed)) ogs_nas_mobile_identity_tmsi_t; - -typedef struct ogs_nas_mobile_identity_tmgi_s { -ED5(uint8_t spare:2;, - uint8_t mbms_session_id:1;, - uint8_t mcc_mnc:1;, - uint8_t odd_even:1;, - uint8_t type:3;) - uint8_t mbms_servicec_id[3]; - ogs_nas_plmn_id_t nas_plmn_id; - uint8_t mbms_session_identity; -} __attribute__ ((packed)) ogs_nas_mobile_identity_tmgi_t; - -typedef struct ogs_nas_mobile_identity_imeisv_s { -ED3(uint8_t digit1:4;, - uint8_t odd_even:1;, - uint8_t type:3;) -ED2(uint8_t digit3:4;, - uint8_t digit2:4;) -ED2(uint8_t digit5:4;, - uint8_t digit4:4;) -ED2(uint8_t digit7:4;, - uint8_t digit6:4;) -ED2(uint8_t digit9:4;, - uint8_t digit8:4;) -ED2(uint8_t digit11:4;, - uint8_t digit10:4;) -ED2(uint8_t digit13:4;, - uint8_t digit12:4;) -ED2(uint8_t digit15:4;, - uint8_t digit14:4;) -ED2(uint8_t digit17:4;, - uint8_t digit16:4;) -} __attribute__ ((packed)) ogs_nas_mobile_identity_imeisv_t; - -typedef struct ogs_nas_mobile_identity_s { - uint8_t length; - union { - ogs_nas_mobile_identity_imsi_t imsi; - ogs_nas_mobile_identity_tmsi_t tmsi; - ogs_nas_mobile_identity_tmgi_t tmgi; - ogs_nas_mobile_identity_imeisv_t imeisv; - }; -} ogs_nas_mobile_identity_t; - -/* 9.9.2.4 Mobile station classmark 2 - * See subclause 10.5.1.6 in 3GPP TS 24.008 - * O TLV 5 */ -#define OGS_NAS_MS_CLASSMARK_2_REVISION_GSM_PHASE1 0 -#define OGS_NAS_MS_CLASSMARK_2_REVISION_GSM_PHASE2 1 -#define OGS_NAS_MS_CLASSMARK_2_REVISION_R99 2 -#define OGS_NAS_MS_CLASSMARK_2_REVISION_RESERVED 2 - -#define OGS_NAS_MS_CLASSMARK_2_RF_CLASS1 0 -#define OGS_NAS_MS_CLASSMARK_2_RF_CLASS2 1 -#define OGS_NAS_MS_CLASSMARK_2_RF_CLASS3 2 -#define OGS_NAS_MS_CLASSMARK_2_RF_CLASS4 3 -#define OGS_NAS_MS_CLASSMARK_2_RF_CLASS5 4 -#define OGS_NAS_MS_CLASSMARK_2_RF_IRRELEVANT 7 -typedef struct ogs_nas_mobile_station_classmark_2_t { - uint8_t length; -ED5(uint8_t spare1:1;, - uint8_t revision_level:2;, - uint8_t es_ind:1;, - uint8_t a5_1:1;, - uint8_t rf_power_capability:3;) -ED7(uint8_t spare:1;, - uint8_t ps_capa:1;, - uint8_t ss_screen_indicator:2;, - uint8_t sm_capabi:1;, - uint8_t vbs:1;, - uint8_t vgcs:1;, - uint8_t fc:1;) -ED8(uint8_t cm3:1;, - uint8_t spare2:1;, - uint8_t lcsva_cap:1;, - uint8_t ucs2:1;, - uint8_t solsa:1;, - uint8_t cmsp:1;, - uint8_t a5_3:1;, - uint8_t a5_2:1;) -} __attribute__ ((packed)) ogs_nas_mobile_station_classmark_2_t; - /*9.9.2.5 Mobile station classmark 3 * See subclause 10.5.1.7 in 3GPP TS 24.008 [13]. * O TLV 2-34 */ @@ -251,30 +56,6 @@ typedef struct ogs_nas_mobile_station_classmark_3_s { uint8_t buffer[OGS_NAS_MAX_MOBILE_STATION_CLASSMARK_3_LEN]; } __attribute__ ((packed)) ogs_nas_mobile_station_classmark_3_t; -/* 9.9.2.8 PLMN list - * See subclause 10.5.1.13 in 3GPP TS 24.008 [13]. - * O TLV 5-47 */ -#define OGS_NAS_MAX_PLMN 15 -typedef struct ogs_nas_plmn_list_s { - uint8_t length; - ogs_nas_plmn_id_t nas_plmn_id[OGS_NAS_MAX_PLMN]; -} __attribute__ ((packed)) ogs_nas_plmn_list_t; - -/* 9.9.2.10 Supported codec list - * See subclause 10.5.4.32 in 3GPP TS 24.008 [13]. - * O TLV 5-n */ -typedef struct ogs_nas_supported_codec_item_s { - uint8_t system_identification; - uint8_t length_of_bitmap; - uint16_t codec_bitmap; -} __attribute__ ((packed)) ogs_nas_supported_codec_item_t; - -#define OGS_NAS_MAX_SUPPORTED_CODECS 8 -typedef struct ogs_nas_supported_codec_list_s { - uint8_t length; - ogs_nas_supported_codec_item_t item[OGS_NAS_MAX_SUPPORTED_CODECS]; -} __attribute__ ((packed)) ogs_nas_supported_codec_list_t; - /* 9.9.3.0A Additional update result * O TV 1 */ typedef struct ogs_nas_additional_update_result_s { @@ -296,36 +77,6 @@ ED4(uint8_t type:4;, uint8_t autv:1;) } __attribute__ ((packed)) ogs_nas_additional_update_type_t; -/* 9.9.3.1 Authentication failure parameter - * See subclause 10.5.3.2.2 in 3GPP TS 24.008 [13]. - * O TLV 16 */ -typedef struct ogs_nas_authentication_failure_parameter_s { - uint8_t length; - uint8_t auts[OGS_AUTS_LEN]; -} __attribute__ ((packed)) ogs_nas_authentication_failure_parameter_t; - -/* 9.9.3.2 Authentication parameter AUTN - * See subclause 10.5.3.1.1 in 3GPP TS 24.008 [13]. - * M LV 17 */ -typedef struct ogs_nas_authentication_parameter_autn_s { - uint8_t length; - uint8_t autn[OGS_AUTN_LEN]; -} ogs_nas_authentication_parameter_autn_t; - -/* 9.9.3.3 Authentication parameter RAND - * See subclause 10.5.3.1 in 3GPP TS 24.008 [13]. - * M V 16 */ -typedef struct ogs_nas_authentication_parameter_rand_s { - uint8_t rand[OGS_RAND_LEN]; -} ogs_nas_authentication_parameter_rand_t; - -/* 9.9.3.4 Authentication response parameter - * M LV 5-17 */ -typedef struct ogs_nas_authentication_response_parameter_s { - uint8_t length; - uint8_t res[OGS_MAX_RES_LEN]; -} ogs_nas_authentication_response_parameter_t; - /* 9.9.3.4a Ciphering key sequence number * See subclause 10.5.1.2 in 3GPP TS 24.008 [13]. * O TV 1 */ @@ -346,18 +97,6 @@ ED3(uint8_t type:4;, uint8_t response:3;) } __attribute__ ((packed)) ogs_nas_csfb_response_t; -/* 9.9.3.6 Daylight saving time - * See subclause 10.5.3.12 in 3GPP TS 24.008 [13]. - * O TLV 3 */ -#define OGS_NAS_NO_ADJUSTMENT_FOR_DAYLIGHT_SAVING_TIME 0 -#define OGS_NAS_PLUS_1_HOUR_ADJUSTMENT_FOR_DAYLIGHT_SAVING_TIME 1 -#define OGS_NAS_PLUS_2_HOURS_ADJUSTMENT_FOR_DAYLIGHT_SAVING_TIME 2 -typedef struct ogs_nas_daylight_saving_time_s { - uint8_t length; -ED2(uint8_t spare:6;, - uint8_t value:2;) -} __attribute__ ((packed)) ogs_nas_daylight_saving_time_t; - /* 9.9.3.7 Detach type * M V 1/2 * 9.9.3.21 NAS key set identifier @@ -400,7 +139,7 @@ ED3(uint8_t cn_specific_drx_cycle_length_coefficient_and_drx_value_for_s1_mode:4 /* 9.9.3.9 EMM cause * O TV 2 - * Annex A (informative):
Cause values for EPS mobility management + * Annex A (informative) Cause values for EPS mobility management * A.1 Causes related to UE identification */ #define EMM_CAUSE_IMSI_UNKNOWN_IN_HSS 2 #define EMM_CAUSE_ILLEGAL_UE 3 @@ -479,9 +218,6 @@ ED4(uint8_t tsc:1;, #define OGS_NAS_EPS_MOBILE_IDENTITY_IMSI 1 #define OGS_NAS_EPS_MOBILE_IDENTITY_GUTI 6 #define OGS_NAS_EPS_MOBILE_IDENTITY_IMEI 3 - -#define OGS_NAS_EPS_MOBILE_IDENTITY_EVEN 0 -#define OGS_NAS_EPS_MOBILE_IDENTITY_ODD 1 typedef struct ogs_nas_eps_mobile_identity_guti_s { ED3(uint8_t spare:4;, uint8_t odd_even:1;, @@ -491,16 +227,12 @@ ED3(uint8_t spare:4;, uint8_t mme_code; uint32_t m_tmsi; } __attribute__ ((packed)) ogs_nas_eps_mobile_identity_guti_t; - -typedef ogs_nas_mobile_identity_imsi_t ogs_nas_eps_mobile_identity_imsi_t; -typedef ogs_nas_eps_mobile_identity_imsi_t ogs_nas_eps_mobile_identity_imei_t; - typedef struct ogs_nas_eps_mobile_identity_s { uint8_t length; union { - ogs_nas_eps_mobile_identity_imsi_t imsi; + ogs_nas_mobile_identity_imsi_t imsi; ogs_nas_eps_mobile_identity_guti_t guti; - ogs_nas_eps_mobile_identity_imei_t imei; + ogs_nas_mobile_identity_imei_t imei; }; } __attribute__ ((packed)) ogs_nas_eps_mobile_identity_t; @@ -555,44 +287,6 @@ typedef struct ogs_nas_esm_message_container_s { uint8_t *buffer; } ogs_nas_esm_message_container_t; -/* 9.9.3.16 GPRS timer - * See subclause 10.5.7.3 in 3GPP TS 24.008 [13]. - * M V 1 or O TV 2 */ -#define OGS_NAS_GRPS_TIMER_UNIT_MULTIPLES_OF_2_SS 0 -#define OGS_NAS_GRPS_TIMER_UNIT_MULTIPLES_OF_1_MM 1 -#define OGS_NAS_GRPS_TIMER_UNIT_MULTIPLES_OF_DECI_HH 2 -#define OGS_NAS_GRPS_TIMER_UNIT_DEACTIVATED 7 -typedef struct ogs_nas_gprs_timer_s { -ED2(uint8_t unit:3;, - uint8_t value:5;) -} __attribute__ ((packed)) ogs_nas_gprs_timer_t; - -/* 9.9.3.16A GPRS timer 2 - * See subclause 10.5.7.4 in 3GPP TS 24.008 [13]. - * O TLV 3 */ -typedef struct ogs_nas_gprs_timer_2_s { - uint8_t length; - uint8_t gprs_timer_2_value; -} __attribute__ ((packed)) ogs_nas_gprs_timer_2_t; - -/* 9.9.3.16B GPRS timer 3 - * See subclause 10.5.7.4a in 3GPP TS 24.008 [13]. - * O TLV 3 */ -#define OGS_NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_10_MM 0 -#define OGS_NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_1_HH 1 -#define OGS_NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_10_HH 2 -#define OGS_NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_2_SS 3 -#define OGS_NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_30_SS 4 -#define OGS_NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_1_MM 5 -#define OGS_NAS_GRPS_TIMER_3_UNIT_MULTIPLES_OF_320_HH 6 -#define OGS_NAS_GRPS_TIMER_3_UNIT_DEACTIVATED 7 - -typedef struct ogs_nas_gprs_timer_3_s { - uint8_t length; -ED2(uint8_t unit:3;, - uint8_t timer_value:5;) -} __attribute__ ((packed)) ogs_nas_gprs_timer_3_t; - /* 9.9.3.17 Identity type 2 * See subclause 10.5.5.9 in 3GPP TS 24.008 [13]. * M V 1/2 */ @@ -605,18 +299,6 @@ ED2(uint8_t spare:5;, uint8_t type:3;) } __attribute__ ((packed)) ogs_nas_identity_type_2_t; -/* 9.9.3.18 IMEISV request - * See subclause 10.5.5.10 in 3GPP TS 24.008 [13]. - * O TV 1 */ -typedef struct ogs_nas_imeisv_request_s { -#define OGS_NAS_IMEISV_TYPE 0xc -ED3(uint8_t type:4;, - uint8_t spare:1;, -#define OGS_NAS_IMEISV_NOT_REQUESTED 0 -#define OGS_NAS_IMEISV_REQUESTED 1 - uint8_t imeisv_request_value:3;) -} __attribute__ ((packed)) ogs_nas_imeisv_request_t; - /* 9.9.3.19 KSI and sequence number * M V 1 */ typedef struct ogs_nas_ksi_and_sequence_number_s { @@ -670,16 +352,6 @@ ED3(uint8_t type:4;, uint8_t extended_periodic_timers:1;) } __attribute__ ((packed)) ogs_nas_ms_network_feature_support_t; -/* 9.9.3.21 NAS key set identifier - * M V 1/2 - * 9.9.2.9 Spare half octet - * M V 1/2 */ -typedef struct ogs_nas_key_set_identifier_s { -ED3(uint8_t type:4;, - uint8_t tsc:1;, - uint8_t nas_key_set_identifier:3;) -} __attribute__ ((packed)) ogs_nas_key_set_identifier_t; - /* 9.9.3.22 message container * M LV 3-252 */ #define OGS_NAS_MAX_MESSAGE_CONTAINER_LEN 250 @@ -705,19 +377,6 @@ ED4(uint8_t spare1:1;, uint8_t type_of_integrity_protection_algorithm:3;) } __attribute__ ((packed)) ogs_nas_security_algorithms_t; -/* 9.9.3.24 Network name - * See subclause 10.5.3.5a in 3GPP TS 24.008 [13]. - * O TLV 3-n */ -#define OGS_NAS_MAX_NETWORK_NAME_LEN 255 -typedef struct ogs_nas_network_name_s { - uint8_t length; -ED4(uint8_t ext:1;, - uint8_t coding_scheme:3;, - uint8_t add_ci:1;, - uint8_t number_of_spare_bits_in_last_octet:3;) - uint8_t name[OGS_NAS_MAX_NETWORK_NAME_LEN]; -} __attribute__ ((packed)) ogs_nas_network_name_t; - /* 9.9.3.24A Network resource identifier container * See subclause 10.5.5.31 in 3GPP TS 24.008 [13]. * O TLV 4 */ @@ -772,31 +431,6 @@ ED3(uint8_t tsc:1;, * M V 2 */ typedef uint16_t ogs_nas_short_mac_t; -/* 9.9.3.29 Time zone - * See subclause 10.5.3.8 in 3GPP TS 24.008 [13]. - * O TV 2 */ -typedef uint8_t ogs_nas_time_zone_t; - -/* 9.9.3.30 Time zone and time - * See subclause 10.5.3.9 in 3GPP TS 24.008 [13]. - * 9.2.3.11 TPServiceCentreTimeStamp (TPSCTS) in 3GPP TS 23.040 [90] - * O TV 8 */ -#define OGS_OGS_NAS_TIME_TO_BCD(x) OGS_TIME_TO_BCD(x) -typedef struct ogs_nas_time_zone_and_time_s { - uint8_t year; - uint8_t mon; - uint8_t mday; - uint8_t hour; - uint8_t min; - uint8_t sec; - /* The Time Zone indicates the difference, expressed in quarters of an hour, - * between the local time and GMT. In the first of the two semi-octets, - * the first bit (bit 3 of the seventh octet of - * the TP-Service-Centre-Time-Stamp field) represents - * the algebraic sign of this difference (0: positive, 1: negative). */ - uint8_t timezone; -} ogs_nas_time_zone_and_time_t; - /* 9.9.3.31 TMSI status * See subclause 10.5.5.4 in 3GPP TS 24.008 [13] * O TV 1 */ @@ -806,135 +440,6 @@ ED3(uint8_t type:4;, uint8_t tmsi_flag:1;) } __attribute__ ((packed)) ogs_nas_tmsi_status_t; -/* 9.9.3.32 Tracking area identity - * O TV 6 */ -typedef struct ogs_nas_tracking_area_identity_s { - ogs_nas_plmn_id_t nas_plmn_id; - uint16_t tac; -} __attribute__ ((packed)) ogs_nas_tracking_area_identity_t; - -typedef ogs_nas_tracking_area_identity_t ogs_nas_tai_t; - -/* 9.9.3.33 Tracking area identity list - * M LV 7-97 */ -#define OGS_NAS_MAX_TAI_LIST_LEN 96 -#define TAI0_TYPE 0 -#define TAI1_TYPE 1 -#define TAI2_TYPE 2 -typedef struct tai0_list_s { - struct { - ED3(uint8_t spare:1;, - uint8_t type:2;, - uint8_t num:5;) - /* - * Do not change 'ogs_plmn_id_t' to 'ogs_nas_plmn_id_t'. - * Use 'ogs_plmn_id_t' for easy implementation. - * ogs_nas_tai_list_build() changes to NAS format(ogs_nas_plmn_id_t) - * and is sent to the UE. - */ - ogs_plmn_id_t plmn_id; - uint16_t tac[OGS_MAX_NUM_OF_TAI]; - } __attribute__ ((packed)) tai[OGS_MAX_NUM_OF_TAI]; -} __attribute__ ((packed)) tai0_list_t; - -typedef struct tai2_list_s { -ED3(uint8_t spare:1;, - uint8_t type:2;, - uint8_t num:5;) - /* - * Do not change 'ogs_tai_t' to 'ogs_nas_tracking_area_identity_t'. - * Use 'ogs_tai_t' for easy implementation. - * ogs_nas_tai_list_build() changes to NAS format(ogs_nas_tracking_area_identity_t) - * and is sent to the UE. - */ - ogs_tai_t tai[OGS_MAX_NUM_OF_TAI]; -} __attribute__ ((packed)) tai2_list_t; - -typedef struct ogs_nas_tracking_area_identity_list_s { - uint8_t length; - uint8_t buffer[OGS_NAS_MAX_TAI_LIST_LEN]; -} __attribute__ ((packed)) ogs_nas_tracking_area_identity_list_t; - -void ogs_nas_tai_list_build( - ogs_nas_tracking_area_identity_list_t *target, - tai0_list_t *source0, tai2_list_t *source2); - -/* 9.9.3.34 UE network capability - * M LV 3-14 */ -typedef struct ogs_nas_ue_network_capability_s { - uint8_t length; - union { - struct { - ED8(uint8_t eea0:1;, - uint8_t eea1:1;, - uint8_t eea2:1;, - uint8_t eea3:1;, - uint8_t eea4:1;, - uint8_t eea5:1;, - uint8_t eea6:1;, - uint8_t eea7:1;) - }; - uint8_t eea; - }; - union { - struct { - ED8(uint8_t eia0:1;, - uint8_t eia1:1;, - uint8_t eia2:1;, - uint8_t eia3:1;, - uint8_t eia4:1;, - uint8_t eia5:1;, - uint8_t eia6:1;, - uint8_t eia7:1;) - }; - uint8_t eia; - }; - union { - struct { - ED8(uint8_t uea0:1;, - uint8_t uea1:1;, - uint8_t uea2:1;, - uint8_t uea3:1;, - uint8_t uea4:1;, - uint8_t uea5:1;, - uint8_t uea6:1;, - uint8_t uea7:1;) - }; - uint8_t uea; - }; - union { - struct { - ED8(uint8_t ucs2:1;, - uint8_t uia1:1;, - uint8_t uia2:1;, - uint8_t uia3:1;, - uint8_t uia4:1;, - uint8_t uia5:1;, - uint8_t uia6:1;, - uint8_t uia7:1;) - }; - uint8_t uia; - }; -ED8(uint8_t prose_dd:1;, - uint8_t prose:1;, - uint8_t h_245_ash:1;, - uint8_t acc_csfb:1;, - uint8_t lpp:1;, - uint8_t lcs:1;, - uint8_t srvcc:1;, - uint8_t nf:1;) -ED8(uint8_t epco:1;, - uint8_t hc_cp_ciot:1;, - uint8_t erw_opdn:1;, - uint8_t s1u_data:1;, - uint8_t up_ciot:1;, - uint8_t cp_ciot:1;, - uint8_t prose_relay:1;, - uint8_t prose_dc:1;) -ED2(uint8_t spare:7;, - uint8_t multiple_drb:1;) -} __attribute__ ((packed)) ogs_nas_ue_network_capability_t; - /* 9.9.3.35 UE radio capability information update needed * O TV 1 */ typedef struct ogs_nas_ue_radio_capability_information_update_needed_s { @@ -943,85 +448,13 @@ ED3(uint8_t type:4;, uint8_t update_needed:1;) } __attribute__ ((packed)) ogs_nas_ue_radio_capability_information_update_needed_t; +/* 9.9.3.34 UE network capability + * M LV 3-14 */ +typedef struct ogs_nas_s1_ue_network_capability_s ogs_nas_ue_network_capability_t; + /* 9.9.3.36 UE security capability * M LV 3-6 */ -typedef struct ogs_nas_ue_security_capability_s { - uint8_t length; - union { - struct { - ED8(uint8_t eea0:1;, - uint8_t eea1:1;, - uint8_t eea2:1;, - uint8_t eea3:1;, - uint8_t eea4:1;, - uint8_t eea5:1;, - uint8_t eea6:1;, - uint8_t eea7:1;) - }; - uint8_t eea; - }; - union { - struct { - ED8(uint8_t eia0:1;, - uint8_t eia1:1;, - uint8_t eia2:1;, - uint8_t eia3:1;, - uint8_t eia4:1;, - uint8_t eia5:1;, - uint8_t eia6:1;, - uint8_t eia7:1;) - }; - uint8_t eia; - }; - union { - struct { - ED8(uint8_t uea0:1;, - uint8_t uea1:1;, - uint8_t uea2:1;, - uint8_t uea3:1;, - uint8_t uea4:1;, - uint8_t uea5:1;, - uint8_t uea6:1;, - uint8_t uea7:1;) - }; - uint8_t uea; - }; - union { - struct { - ED8(uint8_t spare1:1;, - uint8_t uia1:1;, - uint8_t uia2:1;, - uint8_t uia3:1;, - uint8_t uia4:1;, - uint8_t uia5:1;, - uint8_t uia6:1;, - uint8_t uia7:1;) - }; - uint8_t uia; - }; - union { - struct { - ED8(uint8_t spare2:1;, - uint8_t gea1:1;, - uint8_t gea2:1;, - uint8_t gea3:1;, - uint8_t gea4:1;, - uint8_t gea5:1;, - uint8_t gea6:1;, - uint8_t gea7:1;) - }; - uint8_t gea; - }; -} __attribute__ ((packed)) ogs_nas_ue_security_capability_t; - -/* buffer : 9.9.3.37 Emergency number list - * See subclause 10.5.3.13 in 3GPP TS 24.008 [13]. - * O TLV 5-50 */ -#define OGS_NAS_MAX_EMERGENCY_NUMBER_LIST_LEN 48 -typedef struct ogs_nas_emergency_number_list_s { - uint16_t length; - uint8_t buffer[OGS_NAS_MAX_EMERGENCY_NUMBER_LIST_LEN]; -} __attribute__ ((packed)) ogs_nas_emergency_number_list_t; +typedef struct ogs_nas_s1_ue_security_capability_s ogs_nas_ue_security_capability_t; /* 9.9.3.38 CLI * O TLV 3-14 @@ -1084,15 +517,6 @@ ED3(uint8_t type:4;, uint8_t guti_type:1;) } __attribute__ ((packed)) ogs_nas_guti_type_t; -/* 9.9.3.46 Extended DRX parameters - * See subclause 10.5.5.32 in 3GPP TS 24.008 [13]. - * O TLV 3 */ -typedef struct ogs_nas_extended_drx_parameters_s { - uint8_t length; -ED2(uint8_t paging_time_window:4;, - uint8_t e_drx_value:4;) -} __attribute__ ((packed)) ogs_nas_extended_drx_parameters_t; - /* 9.9.4.1 Access point name * See subclause 10.5.6.1 in 3GPP TS 24.008 [13]. * O TLV 3-102 */ @@ -1101,22 +525,6 @@ typedef struct ogs_nas_access_point_name_s { char apn[OGS_MAX_APN_LEN]; } __attribute__ ((packed)) ogs_nas_access_point_name_t; -/* 9.9.4.2 APN aggregate maximum bit rate - * O TLV 4-8 */ -typedef struct ogs_nas_apn_aggregate_maximum_bit_rate_s { - uint8_t length; - uint8_t dl_apn_ambr; - uint8_t ul_apn_ambr; - uint8_t dl_apn_ambr_extended; - uint8_t ul_apn_ambr_extended; - uint8_t dl_apn_ambr_extended2; - uint8_t ul_apn_ambr_extended2; -} __attribute__ ((packed)) ogs_nas_apn_aggregate_maximum_bit_rate_t; - -void apn_ambr_build( - ogs_nas_apn_aggregate_maximum_bit_rate_t * apn_aggregate_maximum_bit_rate, - uint32_t dl_ambr, uint32_t ul_ambr); - /* 9.9.4.2A Connectivity type * See subclause 10.5.6.19 in 3GPP TS 24.008 [13]. * O TV 1 */ @@ -1126,32 +534,9 @@ ED3(uint8_t type:4;, uint8_t considered_lipa_pdn_connection:1;) } __attribute__ ((packed)) ogs_nas_connectivity_type_t; -/* 9.9.4.3 EPS quality of service - * M LV 2-14 */ -typedef struct ogs_nas_eps_quality_of_service_s { - uint8_t length; - uint8_t qci; - uint8_t ul_mbr; - uint8_t dl_mbr; - uint8_t ul_gbr; - uint8_t dl_gbr; - uint8_t ul_mbr_extended; - uint8_t dl_mbr_extended; - uint8_t ul_gbr_extended; - uint8_t dl_gbr_extended; - uint8_t ul_mbr_extended2; - uint8_t dl_mbr_extended2; - uint8_t ul_gbr_extended2; - uint8_t dl_gbr_extended2; -} ogs_nas_eps_quality_of_service_t; - -void eps_qos_build(ogs_nas_eps_quality_of_service_t *eps_qos, - uint8_t qci, - uint64_t dl_mbr, uint64_t ul_mbr, uint64_t dl_gbr, uint64_t ul_gbr); - /* 9.9.4.4 ESM cause * M V 1 - * Annex B (informative):
Cause values for EPS session management + * Annex B (informative) Cause values for EPS session management B.1 Causes related to nature of request */ #define ESM_CAUSE_OPERATOR_DETERMINED_BARRING 8 #define ESM_CAUSE_INSUFFICIENT_RESOURCES 26 @@ -1284,15 +669,6 @@ typedef struct ogs_nas_quality_of_service_s { uint8_t buffer[OGS_NAS_QOS_LEN]; } __attribute__ ((packed)) ogs_nas_quality_of_service_t; -/* 9.9.4.13A Re-attempt indicator - * O TLV 3 */ -typedef struct ogs_nas_re_attempt_indicator_s { - uint8_t length; -ED3(uint8_t spare:3;, /* allowed in A/Gb mode or Iu mode */ - uint8_t eplmnc:1;, /* allowed in an equivalent PLMN */ - uint8_t ratc:1;) -} __attribute__ ((packed)) ogs_nas_re_attempt_indicator_t; - /* 9.9.4.14 Request type * M V 1/2 * See subclause 10.5.6.17 in 3GPP TS 24.008 [13]. @@ -1348,56 +724,6 @@ ED4(uint8_t type:4;, uint8_t e_utran_via_wlan_acceptable:1;) } __attribute__ ((packed)) ogs_nas_wlan_offload_acceptability_t; -/* 9.9.4.19 NBIFOM container - * See subclause 10.5.6.21 in 3GPP TS 24.008 [4]. - * O TLV 3-257 */ -#define MAX_OGS_NAS_NBIFOM_CONTAINER_LEN 255 -typedef struct ogs_nas_nbifom_container_s { - uint8_t length; - uint8_t buffer[MAX_OGS_NAS_NBIFOM_CONTAINER_LEN]; -} __attribute__ ((packed)) ogs_nas_nbifom_container_t; - -/* 9.9.4.22 Header compression configuration - * O TLV 5-257 */ -#define MAX_OGS_NAS_HEADER_COMPRESSION_CONTAINER_LEN 251 -typedef struct ogs_nas_header_compression_configuration_s { - uint8_t length; -ED8(uint8_t spare:1;, - uint8_t profile0x0104:1;, - uint8_t profile0x0103:1;, - uint8_t profile0x0102:1;, - uint8_t profile0x0006:1;, - uint8_t profile0x0004:1;, - uint8_t profile0x0003:1;, - uint8_t profile0x0002:1;) - uint16_t max_cid; -#define OGS_NAS_HEADER_COMPRESSION_NO_COMPRESSION 0 -#define OGS_NAS_HEADER_COMPRESSION_PROFILE_0x0002_UDP_IP 1 -#define OGS_NAS_HEADER_COMPRESSION_PROFILE_0x0003_ESP_IP 2 -#define OGS_NAS_HEADER_COMPRESSION_PROFILE_0x0004 3 -#define OGS_NAS_HEADER_COMPRESSION_PROFILE_0x0006 4 -#define OGS_NAS_HEADER_COMPRESSION_PROFILE_0x0102_UDP_IP 5 -#define OGS_NAS_HEADER_COMPRESSION_PROFILE_0x0103_ESP_IP 6 -#define OGS_NAS_HEADER_COMPRESSION_PROFILE_0x0104_IP 7 - uint8_t type; - uint8_t container[MAX_OGS_NAS_NBIFOM_CONTAINER_LEN]; -} __attribute__ ((packed)) ogs_nas_header_compression_configuration_t; - -/* 9.9.4.23 Control plane only indication - * O TV 1 */ -typedef struct ogs_nas_control_plane_only_indication_s { -ED3(uint8_t type:4;, - uint8_t spare:3;, - uint8_t ciot_eps_optimization:1;) -} __attribute__ ((packed)) ogs_nas_control_plane_only_indication_t; - -/* 9.9.4.26 Extended protocol configuration options - * O TLV-E 4-65538 */ -typedef struct ogs_nas_extended_protocol_configuration_options_s { - uint16_t length; - uint8_t *buffer; -} __attribute__ ((packed)) ogs_nas_extended_protocol_configuration_options_t; - /* 9.9.4.27 Header compression configuration status * O TLV 4 */ typedef struct ogs_nas_header_compression_configuration_status_s { @@ -1405,31 +731,9 @@ typedef struct ogs_nas_header_compression_configuration_status_s { uint16_t value; } __attribute__ ((packed)) ogs_nas_header_compression_configuration_status_t; -/* 9.9.4.28 Serving PLMN rate control - * O TLV 4 */ -typedef struct ogs_nas_serving_plmn_rate_control_s { - uint8_t length; -ED8(uint8_t ebi7:1;, - uint8_t ebi6:1;, - uint8_t ebi5:1;, - uint8_t ebi4:1;, - uint8_t ebi3:1;, - uint8_t ebi2:1;, - uint8_t ebi1:1;, - uint8_t ebi0:1;) -ED8(uint8_t ebi15:1;, - uint8_t ebi14:1;, - uint8_t ebi13:1;, - uint8_t ebi12:1;, - uint8_t ebi11:1;, - uint8_t ebi10:1;, - uint8_t ebi9:1;, - uint8_t ebi8:1;) -} __attribute__ ((packed)) ogs_nas_serving_plmn_rate_control_t; - #ifdef __cplusplus } #endif -#endif /* OGS_NAS_TYPES_H */ +#endif /* OGS_NAS_EPS_TYPES_H */ diff --git a/lib/nas/meson.build b/lib/nas/meson.build index c5762059d4..a99fddc8fe 100644 --- a/lib/nas/meson.build +++ b/lib/nas/meson.build @@ -15,32 +15,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -libnas_sources = files(''' - ogs-nas.h - - ies.h - types.h - conv.h - message.h - - ies.c - types.c - conv.c - decoder.c - encoder.c -'''.split()) - -libnas_inc = include_directories('.') - -libnas = library('ogsnas', - sources : libnas_sources, - version : libogslib_version, - c_args : '-DOGS_NAS_COMPILATION', - include_directories : [libnas_inc, libcrypt_inc, libinc], - dependencies : libcore_dep, - install : true) - -libnas_dep = declare_dependency( - link_with : libnas, - include_directories : [libnas_inc, libcrypt_inc, libinc], - dependencies : libcore_dep) +subdir('common') +subdir('5gs') +subdir('eps') diff --git a/src/mme/emm-build.c b/src/mme/emm-build.c index 484721da13..1d259c943f 100644 --- a/src/mme/emm-build.c +++ b/src/mme/emm-build.c @@ -85,7 +85,7 @@ ogs_pkbuf_t *emm_build_attach_accept( if (mme_ue->guti_present) { attach_accept->presencemask |= OGS_NAS_ATTACH_ACCEPT_GUTI_PRESENT; nas_guti->length = sizeof(ogs_nas_eps_mobile_identity_guti_t); - nas_guti->guti.odd_even = OGS_NAS_EPS_MOBILE_IDENTITY_EVEN; + nas_guti->guti.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN; nas_guti->guti.type = OGS_NAS_EPS_MOBILE_IDENTITY_GUTI; nas_guti->guti.nas_plmn_id = mme_ue->guti.nas_plmn_id; nas_guti->guti.mme_gid = mme_ue->guti.mme_gid; @@ -250,7 +250,7 @@ ogs_pkbuf_t *emm_build_security_mode_command(mme_ue_t *mme_ue) mme_ue->selected_enc_algorithm; nas_key_set_identifier->tsc = 0; - nas_key_set_identifier->nas_key_set_identifier = 0; + nas_key_set_identifier->value = 0; replayed_ue_security_capabilities->eea = mme_ue->ue_network_capability.eea; replayed_ue_security_capabilities->eia = mme_ue->ue_network_capability.eia; diff --git a/src/mme/meson.build b/src/mme/meson.build index 0281c32023..78050ef629 100644 --- a/src/mme/meson.build +++ b/src/mme/meson.build @@ -83,7 +83,7 @@ libmme = static_library('mme', libcrypt_dep, libsctp_dep, libs1ap_dep, - libnas_dep, + libnas_eps_dep, libdiameter_s6a_dep, libgtp_dep], install : false) @@ -94,7 +94,7 @@ libmme_dep = declare_dependency( libcrypt_dep, libsctp_dep, libs1ap_dep, - libnas_dep, + libnas_eps_dep, libdiameter_s6a_dep, libgtp_dep]) diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 2871193b70..e067c58e04 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -25,7 +25,7 @@ #include "ogs-s1ap.h" #include "ogs-diameter-s6a.h" #include "ogs-gtp.h" -#include "ogs-nas.h" +#include "ogs-nas-eps.h" #include "ogs-app.h" /* S1AP */ diff --git a/src/mme/s1ap-sm.c b/src/mme/s1ap-sm.c index c0dd745767..a18a04f605 100644 --- a/src/mme/s1ap-sm.c +++ b/src/mme/s1ap-sm.c @@ -18,7 +18,7 @@ */ #include "ogs-gtp.h" -#include "ogs-nas.h" +#include "ogs-nas-eps.h" #include "s1ap-build.h" #include "s1ap-handler.h"