/* * Copyright 2013-2020 Software Radio Systems Limited * * This file is part of srsLTE. * * srsLTE 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. * * srsLTE 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 Affero General Public License for more details. * * A copy of the GNU Affero General Public License can be found in * the LICENSE file in the top-level directory of this distribution * and at http://www.gnu.org/licenses/. * */ #ifndef SRSLTE_LIBLTE_M2AP_H #define SRSLTE_LIBLTE_M2AP_H /******************************************************************************* * Warnings/Todos *******************************************************************************/ // Extensions are not yet handled correctly /******************************************************************************* * INCLUDES *******************************************************************************/ #include /******************************************************************************* LOGGING *******************************************************************************/ typedef void (*log_handler_t)(void* ctx, char* str); void liblte_log_register_handler(void* ctx, log_handler_t handler); /******************************************************************************* * MAX defines *******************************************************************************/ #define LIBLTE_M2AP_MAXPRIVATEIES 256 #define LIBLTE_M2AP_MAXNOOFMBSFNAREAS 8 #define LIBLTE_M2AP_MAXNOOFMBSFN_ALLOCATIONS 15 #define LIBLTE_M2AP_MAXNOOFPMCHSPERMBSFNAREA 256 #define LIBLTE_M2AP_MAXNOOFCELLS 256 #define LIBLTE_M2AP_MAXNOOFMBMSSERVICEAREASPERCELL 256 #define LIBLTE_M2AP_MAXNOOFSESSIONSPERPMCH 29 #define LIBLTE_M2AP_MAXNOOFERRORS 256 #define LIBLTE_M2AP_MAXNROFINDIVIDUALM2CONNECTIONSTORESET 256 #define LIBLTE_M2AP_MAXNOOFCOUNTINGSERVICE 16 /******************************************************************************* * Elementary Procedures *******************************************************************************/ typedef enum { LIBLTE_M2AP_PROC_ID_SESSIONSTART = 0, LIBLTE_M2AP_PROC_ID_SESSIONSTOP = 1, LIBLTE_M2AP_PROC_ID_MBMSSCHEDULINGINFORMATION = 2, LIBLTE_M2AP_PROC_ID_ERRORINDICATION = 3, LIBLTE_M2AP_PROC_ID_RESET = 4, LIBLTE_M2AP_PROC_ID_M2SETUP = 5, LIBLTE_M2AP_PROC_ID_ENBCONFIGURATIONUPDATE = 6, LIBLTE_M2AP_PROC_ID_MCECONFIGURATIONUPDATE = 7, LIBLTE_M2AP_PROC_ID_PRIVATEMESSAGE = 8, LIBLTE_M2AP_PROC_ID_SESSIONUPDATE = 9, LIBLTE_M2AP_PROC_ID_MBMSSERVICECOUNTING = 10, LIBLTE_M2AP_PROC_ID_MBMSSERVICECOUNTINGRESULTSREPORT = 11, LIBLTE_M2AP_PROC_N_ITEMS, } LIBLTE_M2AP_PROC_ENUM; static const char liblte_m2ap_proc_text[LIBLTE_M2AP_PROC_N_ITEMS][64] = {"id-sessionStart", "id-sessionStop", "id-mbmsSchedulingInformation", "id-errorIndication", "id-reset", "id-m2Setup", "id-eNBConfigurationUpdate", "id-mCEConfigurationUpdate", "id-privateMessage", "id-sessionUpdate", "id-mbmsServiceCounting", "id-mbmsServiceCountingResultsReport"}; /******************************************************************************* * ProtocolIE Ids *******************************************************************************/ typedef enum { LIBLTE_M2AP_IE_ID_MCE_MBMS_M2AP_ID = 0, LIBLTE_M2AP_IE_ID_ENB_MBMS_M2AP_ID = 1, LIBLTE_M2AP_IE_ID_TMGI = 2, LIBLTE_M2AP_IE_ID_MBMS_SESSION_ID = 3, LIBLTE_M2AP_IE_ID_MBMS_SERVICE_AREA = 6, LIBLTE_M2AP_IE_ID_TNL_INFORMATION = 7, LIBLTE_M2AP_IE_ID_CRITICALITYDIAGNOSTICS = 8, LIBLTE_M2AP_IE_ID_CAUSE = 9, LIBLTE_M2AP_IE_ID_MBSFN_AREA_CONFIGURATION_LIST = 10, LIBLTE_M2AP_IE_ID_PMCH_CONFIGURATION_LIST = 11, LIBLTE_M2AP_IE_ID_PMCH_CONFIGURATION_ITEM = 12, LIBLTE_M2AP_IE_ID_GLOBALENB_ID = 13, LIBLTE_M2AP_IE_ID_ENBNAME = 14, LIBLTE_M2AP_IE_ID_ENB_MBMS_CONFIGURATION_DATA_LIST = 15, LIBLTE_M2AP_IE_ID_ENB_MBMS_CONFIGURATION_DATA_ITEM = 16, LIBLTE_M2AP_IE_ID_GLOBALMCE_ID = 17, LIBLTE_M2AP_IE_ID_MCENAME = 18, LIBLTE_M2AP_IE_ID_MCCHRELATEDBCCH_CONFIGPERMBSFNAREA = 19, LIBLTE_M2AP_IE_ID_MCCHRELATEDBCCH_CONFIGPERMBSFNAREA_ITEM = 20, LIBLTE_M2AP_IE_ID_TIMETOWAIT = 21, LIBLTE_M2AP_IE_ID_MBSFN_SUBFRAME_CONFIGURATION_LIST = 22, LIBLTE_M2AP_IE_ID_MBSFN_SUBFRAME_CONFIGURATION_ITEM = 23, LIBLTE_M2AP_IE_ID_COMMON_SUBFRAME_ALLOCATION_PERIOD = 24, LIBLTE_M2AP_IE_ID_MCCH_UPDATE_TIME = 25, LIBLTE_M2AP_IE_ID_ENB_MBMS_CONFIGURATION_DATA_LIST_CONFIGUPDATE = 26, LIBLTE_M2AP_IE_ID_ENB_MBMS_CONFIGURATION_DATA_CONFIGUPDATE_ITEM = 27, LIBLTE_M2AP_IE_ID_MBMS_SERVICE_ASSOCIATEDLOGICALM2_CONNECTIONITEM = 28, LIBLTE_M2AP_IE_ID_MBSFN_AREA_ID = 29, LIBLTE_M2AP_IE_ID_RESETTYPE = 30, LIBLTE_M2AP_IE_ID_MBMS_SERVICE_ASSOCIATEDLOGICALM2_CONNECTIONLISTRESACK = 31, LIBLTE_M2AP_IE_ID_MBMS_COUNTING_REQUEST_SESSION = 32, LIBLTE_M2AP_IE_ID_MBMS_COUNTING_REQUEST_SESSION_ITEM = 33, LIBLTE_M2AP_IE_ID_MBMS_COUNTING_RESULT_LIST = 34, LIBLTE_M2AP_IE_ID_MBMS_COUNTING_RESULT_ITEM = 35, LIBLTE_M2AP_IE_N_ITEMS } LIBLTE_M2AP_IE_ENUM; static const char liblte_m2ap_ie_text[LIBLTE_M2AP_IE_N_ITEMS][64] = { "id-MCE-MBMS-M2AP-ID", "id-ENB-MBMS-M2AP-ID", "id-TMGI", "id-MBMS-Session-ID", "id-MBMS-Service-Area", "id-TNL-Information", "id-CriticalityDiagnostics", "id-Cause", "id-MBSFN-Area-Configuration-List", "id-PMCH-Configuration-List", "id-PMCH-Configuration-Item", "id-GlobalENB-ID", "id-ENBname", "id-ENB-MBMS-Configuration-data-List", "id-ENB-MBMS-Configuration-data-Item", "id-GlobalMCE-ID", "id-MCEname", "id-MCCHrelatedBCCH-ConfigPerMBSFNArea", "id-MCCHrelatedBCCH-ConfigPerMBSFNArea-Item", "id-TimeToWait", "id-MBSFN-Subframe-Configuration-List", "id-MBSFN-Subframe-Configuration-Item", "id-Common-Subframe-Allocation-Period", "id-MCCH-Update-Time", "id-ENB-MBMS-Configuration-data-List-ConfigUpdate", "id-ENB-MBMS-Configuration-data-ConfigUpdate-Item", "id-MBMS-Service-associatedLogicalM2-ConnectionItem", "id-MBSFN-Area-ID", "id-ResetType", "id-MBMS-Service-associatedLogicalM2-ConnectionListResAck", "id-MBMS-Counting-Request-Session", "id-MBMS-Counting-Request-Session-Item", "id-MBMS-Counting-Result-List", "id-MBMS-Counting-Result-Item"}; /******************************************************************************* * ProtocolIE AllocatedSubFramesEnd INTEGER *******************************************************************************/ // lb:0;ub:1535 typedef struct { uint16_t allocated_subframes_end; } LIBLTE_M2AP_ALLOCATED_SUBFRAMES_END_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_allocatedsubframesend(LIBLTE_M2AP_ALLOCATED_SUBFRAMES_END_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_allocatedsubframesend(uint8_t** ptr, LIBLTE_M2AP_ALLOCATED_SUBFRAMES_END_STRUCT* ie); /******************************************************************************* * ProtocolIE CauseMisc CHOICE *******************************************************************************/ typedef enum { LIBLTE_M2AP_CAUSE_MISC_CONTROL_PROCESSING_OVERLOAD, LIBLTE_M2AP_CAUSE_MISC_HARDWARE_FAILURE, LIBLTE_M2AP_CAUSE_MISC_OM_INTERVENTION, LIBLTE_M2AP_CAUSE_MISC_UNSPECIFIED, LIBLTE_M2AP_CAUSE_MISC_N_ITEMS } LIBLTE_M2AP_CAUSE_CHOICE_MISC_ENUM; static const char liblte_s1ap_cause_misc_text[LIBLTE_M2AP_CAUSE_MISC_N_ITEMS][80] = { "control-processing-overload", "hardware-failure", "om-intervention", "unspecified", }; typedef struct { bool ext; LIBLTE_M2AP_CAUSE_CHOICE_MISC_ENUM cause; } LIBLTE_M2AP_CAUSE_MISC_STRUCT; /******************************************************************************* * ProtocolIE CauseNas CHOICE *******************************************************************************/ typedef enum { LIBLTE_M2AP_CAUSE_NAS_UNSPECIFIED, LIBLTE_M2AP_CAUSE_NAS_N_ITEMS } LIBLTE_M2AP_CAUSE_CHOICE_NAS_ENUM; static const char liblte_s1ap_cause_nas_text[LIBLTE_M2AP_CAUSE_NAS_N_ITEMS][80] = { "unspecified", }; typedef struct { bool ext; LIBLTE_M2AP_CAUSE_CHOICE_NAS_ENUM cause; } LIBLTE_M2AP_CAUSE_NAS_STRUCT; /******************************************************************************* * ProtocolIE CauseProtocol CHOICE *******************************************************************************/ typedef enum { LIBLTE_M2AP_CAUSE_PROTOCOL_TRANSFER_SYNTAX_ERROR, LIBLTE_M2AP_CAUSE_PROTOCOL_ABSTRACT_SYNTAX_ERROR_REJECT, LIBLTE_M2AP_CAUSE_PROTOCOL_ABSTRACT_SYNTAX_ERROR_IGNORE_AND_NOTIFY, LIBLTE_M2AP_CAUSE_PROTOCOL_MESSAGE_NOT_COMPATIBLE_WITH_RECEIVER_STATE, LIBLTE_M2AP_CAUSE_PROTOCOL_SEMANTIC_ERROR, LIBLTE_M2AP_CAUSE_PROTOCOL_ABSTRACT_SYNTAX_ERROR_FALSELY_CONSTRUCTED_MESSAGE, LIBLTE_M2AP_CAUSE_PROTOCOL_UNSPECIFIED, LIBLTE_M2AP_CAUSE_PROTOCOL_N_ITEMS } LIBLTE_M2AP_CAUSE_CHOICE_PROTOCOL_ENUM; static const char liblte_m2ap_cause_protocol_text[LIBLTE_M2AP_CAUSE_PROTOCOL_N_ITEMS][80] = { "transfer-syntax-error", "abstract-syntax-error-reject", "abstract-syntax-error-ignore-and-notify", "message-not-compatible-with-receiver-state", "semantic-error", "abstract-syntax-error-falsely-constructed-message", "unspecified", }; typedef struct { bool ext; LIBLTE_M2AP_CAUSE_CHOICE_PROTOCOL_ENUM cause; } LIBLTE_M2AP_CAUSE_PROTOCOL_STRUCT; /******************************************************************************* * ProtocolIE CauseRadioNetwork CHOICE *******************************************************************************/ typedef enum { LIBLTE_M2AP_CAUSE_RADIONETWORK_UNKNOWN_OR_ALREADY_ALLOCATED_MCE_MBMS_M2AP_ID, LIBLTE_M2AP_CAUSE_RADIONETWORK_UNKNOWN_OR_ALREADY_ALLOCATED_ENB_MBMS_M2AP_ID, LIBLTE_M2AP_CAUSE_RADIONETWORK_UNKNOWN_OR_INCONSISTENT_PAIR_OF_MBMS_M2AP_IDS, LIBLTE_M2AP_CAUSE_RADIONETWORK_RADIO_RESOURCES_NOT_AVAILABLE, LIBLTE_M2AP_CAUSE_RADIONETWORK_INTERACTION_WITH_OTHER_PROCEDURE, LIBLTE_M2AP_CAUSE_RADIONETWORK_UNSPECIFIED, LIBLTE_M2AP_CAUSE_RADIONETWORK_N_ITEMS } LIBLTE_M2AP_CAUSE_CHOICE_RADIONETWORK_ENUM; static const char liblte_m2ap_cause_radionetwork_text[LIBLTE_M2AP_CAUSE_RADIONETWORK_N_ITEMS][80] = { "unknown-or-already-allocated-MCE-MBMS-M2AP-ID", "unknown-or-already-allocated-eNB-MBMS-M2AP-ID", "unknown-or-inconsistent-pair-of-MBMS-M2AP-IDs", "radio-resources-not-available", "interaction-with-other-procedure", "unspecified", }; typedef struct { bool ext; LIBLTE_M2AP_CAUSE_CHOICE_RADIONETWORK_ENUM cause; } LIBLTE_M2AP_CAUSE_RADIONETWORK_STRUCT; /******************************************************************************* * ProtocolIE CauseTransport CHOICE *******************************************************************************/ typedef enum { LIBLTE_M2AP_CAUSE_TRANSPORT_TRANSPORT_RESOURCE_UNAVAILABLE, LIBLTE_M2AP_CAUSE_TRANSPORT_UNSPECIFIED, LIBLTE_M2AP_CAUSE_TRANSPORT_N_ITEMS } LIBLTE_M2AP_CAUSE_CHOICE_TRANSPORT_ENUM; static const char liblte_m2ap_cause_transport_text[LIBLTE_M2AP_CAUSE_TRANSPORT_N_ITEMS][80] = { "transport-resource-unavailable", "unspecified", }; typedef struct { bool ext; LIBLTE_M2AP_CAUSE_CHOICE_TRANSPORT_ENUM cause; } LIBLTE_M2AP_CAUSE_TRANSPORT_STRUCT; /******************************************************************************* * ProtocolIE Cause CHOICE *******************************************************************************/ typedef enum { LIBLTE_M2AP_CAUSE_CHOICE_RADIONETWORK, LIBLTE_M2AP_CAUSE_CHOICE_TRANSPORT, LIBLTE_M2AP_CAUSE_CHOICE_NAS, LIBLTE_M2AP_CAUSE_CHOICE_PROTOCOL, LIBLTE_M2AP_CAUSE_CHOICE_MISC, LIBLTE_M2AP_CAUSE_CHOICE_N_ITEMS, } LIBLTE_M2AP_CAUSE_CHOICE_ENUM; static const char liblte_m2ap_cause_choice_text[LIBLTE_M2AP_CAUSE_CHOICE_N_ITEMS][50] = { "radioNetwork", "transport", "nas", "protocol", "misc", }; typedef union { LIBLTE_M2AP_CAUSE_RADIONETWORK_STRUCT radioNetwork; LIBLTE_M2AP_CAUSE_TRANSPORT_STRUCT transport; LIBLTE_M2AP_CAUSE_NAS_STRUCT nas; LIBLTE_M2AP_CAUSE_PROTOCOL_STRUCT protocol; LIBLTE_M2AP_CAUSE_MISC_STRUCT misc; } LIBLTE_M2AP_CAUSE_CHOICE_UNION; typedef struct { bool ext; LIBLTE_M2AP_CAUSE_CHOICE_UNION choice; LIBLTE_M2AP_CAUSE_CHOICE_ENUM choice_type; } LIBLTE_M2AP_CAUSE_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_cause(LIBLTE_M2AP_CAUSE_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_cause(uint8_t** ptr, LIBLTE_M2AP_CAUSE_STRUCT* ie); /******************************************************************************* * ProtocolIE Criticality ENUMERATED *******************************************************************************/ typedef enum { LIBLTE_M2AP_CRITICALITY_REJECT, LIBLTE_M2AP_CRITICALITY_IGNORE, LIBLTE_M2AP_CRITICALITY_NOTIFY, LIBLTE_M2AP_CRITICALITY_N_ITEMS, } LIBLTE_M2AP_CRITICALITY_ENUM; static const char liblte_m2ap_criticality_text[LIBLTE_M2AP_CRITICALITY_N_ITEMS][80] = { "reject", "ignore", "notify", }; LIBLTE_ERROR_ENUM liblte_m2ap_pack_criticality(LIBLTE_M2AP_CRITICALITY_ENUM* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_criticality(uint8_t** ptr, LIBLTE_M2AP_CRITICALITY_ENUM* ie); /******************************************************************************* * ProtocolIE ProtocolIE_ID INTEGER *******************************************************************************/ typedef struct { uint16_t ProtocolIE_ID; } LIBLTE_M2AP_PROTOCOLIE_ID_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_protocolie_id(LIBLTE_M2AP_PROTOCOLIE_ID_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_protocolie_id(uint8_t** ptr, LIBLTE_M2AP_PROTOCOLIE_ID_STRUCT* ie); /******************************************************************************* * ProtocolIE ProtocolExtensionID INTEGER *******************************************************************************/ typedef struct { uint16_t ProtocolExtensionID; } LIBLTE_M2AP_PROTOCOLEXTENSIONID_STRUCT; LIBLTE_ERROR_ENUM liblte_s1ap_pack_protocolextensionid(LIBLTE_M2AP_PROTOCOLEXTENSIONID_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_s1ap_unpack_protocolextensionid(uint8_t** ptr, LIBLTE_M2AP_PROTOCOLEXTENSIONID_STRUCT* ie); /******************************************************************************* * ProtocolIE ProtocolExtensionField SEQUENCE ********************************************************************************/ typedef struct { LIBLTE_M2AP_PROTOCOLEXTENSIONID_STRUCT id; LIBLTE_M2AP_CRITICALITY_ENUM criticality; LIBLTE_ASN1_OPEN_TYPE_STRUCT extensionValue; } LIBLTE_M2AP_PROTOCOLEXTENSIONFIELD_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_protocolextensionfield(LIBLTE_M2AP_PROTOCOLEXTENSIONFIELD_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_protocolextensionfield(uint8_t** ptr, LIBLTE_M2AP_PROTOCOLEXTENSIONFIELD_STRUCT* ie); /******************************************************************************* * ProtocolIE ProtocolIE_SingleContainer SEQUENCE *******************************************************************************/ typedef struct { LIBLTE_M2AP_PROTOCOLIE_ID_STRUCT id; LIBLTE_M2AP_CRITICALITY_ENUM criticality; LIBLTE_ASN1_OPEN_TYPE_STRUCT value; } LIBLTE_M2AP_PROTOCOLIE_SINGLECONTAINER_STRUCT; LIBLTE_ERROR_ENUM liblte_s1ap_pack_protocolie_singlecontainer(LIBLTE_M2AP_PROTOCOLIE_SINGLECONTAINER_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_s1ap_unpack_protocolie_singlecontainer(uint8_t** ptr, LIBLTE_M2AP_PROTOCOLIE_SINGLECONTAINER_STRUCT* ie); /******************************************************************************* * ProtocolIE ProtocolExtensionContainer DYNAMIC SEQUENCE OF *******************************************************************************/ // lb:1, ub:65535 typedef struct { uint32_t len; LIBLTE_M2AP_PROTOCOLEXTENSIONFIELD_STRUCT buffer[32]; // WARNING: Artificial limit to reduce memory footprint } LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_protocolextensioncontainer(LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_protocolextensioncontainer(uint8_t** ptr, LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT* ie); /******************************************************************************* * ProtocolIE PLMNidentity STATIC OCTET STRING *******************************************************************************/ #define LIBLTE_M2AP_PLMN_IDENTITY_OCTET_STRING_LEN 3 typedef struct { uint8_t buffer[LIBLTE_M2AP_PLMN_IDENTITY_OCTET_STRING_LEN]; } LIBLTE_M2AP_PLMN_IDENTITY_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_plmnidentity(LIBLTE_M2AP_PLMN_IDENTITY_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_plmnidentity(uint8_t** ptr, LIBLTE_M2AP_PLMN_IDENTITY_STRUCT* ie); /******************************************************************************* * ProtocolIE EUTRANCellIdentifier STATIC BIT STRING *******************************************************************************/ #define LIBLTE_M2AP_EUTRAN_CELL_IDENTIFIER_BIT_STRING_LEN 28 typedef struct { uint32_t eUTRANCellIdentifier; } LIBLTE_M2AP_EUTRAN_CELL_IDENTIFIER_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_eutrancellidentifier(LIBLTE_M2AP_EUTRAN_CELL_IDENTIFIER_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_eutrancellidentifier(uint8_t** ptr, LIBLTE_M2AP_EUTRAN_CELL_IDENTIFIER_STRUCT* ie); /******************************************************************************* * ProtocolIE ECGI SEQUENCE *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_PLMN_IDENTITY_STRUCT pLMN_Identity; LIBLTE_M2AP_EUTRAN_CELL_IDENTIFIER_STRUCT EUTRANCellIdentifier; bool iE_Extensions_present; LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT iE_Extensions; } LIBLTE_M2AP_ECGI_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_ecgi(LIBLTE_M2AP_ECGI_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_ecgi(uint8_t** ptr, LIBLTE_M2AP_ECGI_STRUCT* ie); /******************************************************************************* * ProtocolIE CellReservationInfo ENUMERATED *******************************************************************************/ typedef enum { LIBLTE_M2AP_CELL_RESERVATION_INFO_RESERVED_CELL, LIBLTE_M2AP_CELL_RESERVATION_INFO_NON_RESERVED_CELL, } LIBLTE_M2AP_CELL_RESERVATION_INFO_ENUM; typedef struct { bool ext; LIBLTE_M2AP_CELL_RESERVATION_INFO_ENUM e; } LIBLTE_M2AP_CELL_RESERVATION_INFO_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_cellreservationinfo(LIBLTE_M2AP_CELL_RESERVATION_INFO_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_cellreservationinfo(uint8_t** ptr, LIBLTE_M2AP_CELL_RESERVATION_INFO_STRUCT* ie); /******************************************************************************* * ProtocolIE CellInformation SEQUENCE *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_ECGI_STRUCT eCGI; LIBLTE_M2AP_CELL_RESERVATION_INFO_STRUCT cellReservationInfo; bool ie_extensions_present; LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT ie_extensions; } LIBLTE_M2AP_CELL_INFORMATION_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_cellinformation(LIBLTE_M2AP_CELL_INFORMATION_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_cellinformation(uint8_t** ptr, LIBLTE_M2AP_CELL_INFORMATION_STRUCT* ie); /******************************************************************************* * ProtocolIE CellInformationList SEQUENCE *******************************************************************************/ typedef struct { bool ext; uint16_t len; LIBLTE_M2AP_CELL_INFORMATION_STRUCT buffer[32]; // artificial limit to 32 } LIBLTE_M2AP_CELL_INFORMATION_LIST_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_cellinformationlist(LIBLTE_M2AP_CELL_INFORMATION_LIST_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_cellinformationlist(uint8_t** ptr, LIBLTE_M2AP_CELL_INFORMATION_LIST_STRUCT* ie); /******************************************************************************* * ProtocolIE ProcedureCode INTEGER *******************************************************************************/ typedef struct { uint8_t ProcedureCode; } LIBLTE_M2AP_PROCEDURECODE_STRUCT; /******************************************************************************* * ProtocolIE TriggeringMessage ENUMERATED *******************************************************************************/ typedef enum { LIBLTE_M2AP_TRIGGERINGMESSAGE_INITIATING_MESSAGE, LIBLTE_M2AP_TRIGGERINGMESSAGE_SUCCESSFUL_OUTCOME, LIBLTE_M2AP_TRIGGERINGMESSAGE_UNSUCCESSFULL_OUTCOME, LIBLTE_M2AP_TRIGGERINGMESSAGE_N_ITEMS, } LIBLTE_M2AP_TRIGGERINGMESSAGE_ENUM; static const char liblte_m2ap_triggeringmessage_text[LIBLTE_M2AP_TRIGGERINGMESSAGE_N_ITEMS][80] = { "initiating-message", "successful-outcome", "unsuccessfull-outcome", }; LIBLTE_ERROR_ENUM liblte_m2ap_pack_triggeringmessage(LIBLTE_M2AP_TRIGGERINGMESSAGE_ENUM* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_triggeringmessage(uint8_t** ptr, LIBLTE_M2AP_TRIGGERINGMESSAGE_ENUM* ie); /******************************************************************************* * ProtocolIE TypeOfError ENUMERATED *******************************************************************************/ typedef enum { LIBLTE_M2AP_TYPEOFERROR_NOT_UNDERSTOOD, LIBLTE_M2AP_TYPEOFERROR_MISSING, LIBLTE_M2AP_TYPEOFERROR_N_ITEMS, } LIBLTE_M2AP_TYPEOFERROR_ENUM; static const char liblte_M2ap_typeoferror_text[LIBLTE_M2AP_TYPEOFERROR_N_ITEMS][80] = { "not-understood", "missing", }; typedef struct { bool ext; LIBLTE_M2AP_TYPEOFERROR_ENUM e; } LIBLTE_M2AP_TYPEOFERROR_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_typeoferror(LIBLTE_M2AP_TYPEOFERROR_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_typeoferror(uint8_t** ptr, LIBLTE_M2AP_TYPEOFERROR_STRUCT* ie); /******************************************************************************* * ProtocolIE CriticalityDiagnostics_IE_Item SEQUENCE *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_CRITICALITY_ENUM iECriticality; LIBLTE_M2AP_PROTOCOLIE_ID_STRUCT iE_ID; LIBLTE_M2AP_TYPEOFERROR_STRUCT typeOfError; LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT iE_Extensions; bool iE_Extensions_present; } LIBLTE_M2AP_CRITICALITYDIAGNOSTICS_IE_ITEM_STRUCT; /******************************************************************************* * ProtocolIE CriticalityDiagnostics_IE_List DYNAMIC SEQUENCE OF *******************************************************************************/ // lb:1, ub:256 typedef struct { uint32_t len; LIBLTE_M2AP_CRITICALITYDIAGNOSTICS_IE_ITEM_STRUCT buffer[32]; // WARNING: Artificial limit to reduce memory footprint } LIBLTE_M2AP_CRITICALITYDIAGNOSTICS_IE_LIST_STRUCT; /******************************************************************************* * ProtocolIE CriticalityDiagnostics SEQUENCE *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_PROCEDURECODE_STRUCT procedureCode; bool procedureCode_present; LIBLTE_M2AP_TRIGGERINGMESSAGE_ENUM triggeringMessage; bool triggeringMessage_present; LIBLTE_M2AP_CRITICALITY_ENUM procedureCriticality; bool procedureCriticality_present; LIBLTE_M2AP_CRITICALITYDIAGNOSTICS_IE_LIST_STRUCT iEsCriticalityDiagnostics; bool iEsCriticalityDiagnostics_present; LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT iE_Extensions; bool iE_Extensions_present; } LIBLTE_M2AP_CRITICALITYDIAGNOSTICS_STRUCT; /******************************************************************************* * ProtocolIE ENB-ID STATIC BIT STRING *******************************************************************************/ #define LIBLTE_M2AP_ENBID_BIT_STRING_LEN 20 typedef struct { bool ext; uint8_t buffer[20]; } LIBLTE_M2AP_ENB_ID_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_enbid(LIBLTE_M2AP_ENB_ID_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_enbid(uint8_t** ptr, LIBLTE_M2AP_ENB_ID_STRUCT* ie); /******************************************************************************* * ProtocolIE MCE-ID STATIC OCTET STRING *******************************************************************************/ #define LIBLTE_M2AP_MCEID_OCTET_STRING_LEN 2 typedef struct { bool ext; uint8_t buffer[2]; } LIBLTE_M2AP_MCE_ID_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mceid(LIBLTE_M2AP_MCE_ID_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mceid(uint8_t** ptr, LIBLTE_M2AP_MCE_ID_STRUCT* ie); /******************************************************************************* * ProtocolIE MCE-Name PRINTABLE STRING *******************************************************************************/ typedef struct { bool ext; uint32_t n_octets; uint8_t buffer[150]; } LIBLTE_M2AP_MCE_NAME_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mcename(LIBLTE_M2AP_MCE_NAME_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mceid(uint8_t** ptr, LIBLTE_M2AP_MCE_NAME_STRUCT* ie); /******************************************************************************* * ProtocolIE MCE-MBMS-M2AP-ID INTEGER *******************************************************************************/ // lb:0;ub:16777215 typedef struct { uint32_t mce_mbms_m2ap_id; } LIBLTE_M2AP_MCE_MBMS_M2AP_ID_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mcembmsm2apid(LIBLTE_M2AP_MCE_MBMS_M2AP_ID_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mcembmsm2apid(uint8_t** ptr, LIBLTE_M2AP_MCE_MBMS_M2AP_ID_STRUCT* ie); /******************************************************************************* * ProtocolIE MBSFN-Synchronization-Area-Id INTEGER *******************************************************************************/ typedef struct { uint32_t mbsfn_synchronisation_area_id; } LIBLTE_M2AP_MBSFN_SYNCHRONISATION_AREA_ID_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbsfnsynchronisationareaid(LIBLTE_M2AP_MBSFN_SYNCHRONISATION_AREA_ID_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbsfnsynchronisationareaid(uint8_t** ptr, LIBLTE_M2AP_MBSFN_SYNCHRONISATION_AREA_ID_STRUCT* ie); /******************************************************************************* * ProtocolIE MBMS-Service-Area DYNAMIC OCTET STRING *******************************************************************************/ // lb:0, ub:512 typedef struct { uint32_t n_octets; uint8_t buffer[512]; } LIBLTE_M2AP_MBMS_SERVICE_AREA_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbmsservicearea(LIBLTE_M2AP_MBMS_SERVICE_AREA_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbmsservicearea(uint8_t** ptr, LIBLTE_M2AP_MBMS_SERVICE_AREA_STRUCT* ie); /******************************************************************************* * ProtocolIE MBMS-Service-Area-Id-List SEQUENCE *******************************************************************************/ typedef struct { uint8_t len; LIBLTE_M2AP_MBMS_SERVICE_AREA_STRUCT buffer[32]; // Waring: Artificial limit to reduce memory footprint } LIBLTE_M2AP_MBMS_SERVICE_AREA_ID_LIST_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbmsserviceareaidlist(LIBLTE_M2AP_MBMS_SERVICE_AREA_ID_LIST_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbmsserviceareaidlist(uint8_t** ptr, LIBLTE_M2AP_MBMS_SERVICE_AREA_ID_LIST_STRUCT* ie); /******************************************************************************* * ProtocolIE ENB-MBMS-ConfigurationDataItem SEQUENCE *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_ECGI_STRUCT eCGI; LIBLTE_M2AP_MBSFN_SYNCHRONISATION_AREA_ID_STRUCT mbsfnSynchronisationArea; LIBLTE_M2AP_MBMS_SERVICE_AREA_ID_LIST_STRUCT mbmsServiceAreaList; bool iE_Extensions_present; LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT iE_Extensions; } LIBLTE_M2AP_ENB_MBMS_CONFIGURATION_DATA_ITEM_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_enbmbmsconfigurationdataitem(LIBLTE_M2AP_ENB_MBMS_CONFIGURATION_DATA_ITEM_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_enbmbmsconfigurationdataitem(uint8_t** ptr, LIBLTE_M2AP_ENB_MBMS_CONFIGURATION_DATA_ITEM_STRUCT* ie); /******************************************************************************* * ProtocolIE ENB-MBMS-ConfigurationDataConfigUpdateItem SEQUENCE *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_ENB_MBMS_CONFIGURATION_DATA_ITEM_STRUCT mBMSConfigData; LIBLTE_M2AP_ECGI_STRUCT eCGI; } LIBLTE_M2AP_ENB_MBMS_CONFIGURATION_DATA_CONFIGUPDATE_ITEM_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_enbmbmsconfigurationdataconfigupdateitem( LIBLTE_M2AP_ENB_MBMS_CONFIGURATION_DATA_CONFIGUPDATE_ITEM_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_enbmbmsconfigurationdataconfigupdateitem( uint8_t** ptr, LIBLTE_M2AP_ENB_MBMS_CONFIGURATION_DATA_CONFIGUPDATE_ITEM_STRUCT* ie); /******************************************************************************* * ProtocolIE ENB-MBMS-M2AP-ID INTEGER *******************************************************************************/ // lb:0;ub:65535 typedef struct { uint16_t enb_mbms_m2ap_id; } LIBLTE_M2AP_ENB_MBMS_M2AP_ID_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_enbmbmsm2apid(LIBLTE_M2AP_ENB_MBMS_M2AP_ID_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_enbmbmsm2apid(uint8_t** ptr, LIBLTE_M2AP_ENB_MBMS_M2AP_ID_STRUCT* ie); /******************************************************************************* * ProtocolIE ENB-NAME PRINTABLE STRING *******************************************************************************/ typedef struct { bool ext; uint32_t n_octets; uint8_t buffer[150]; } LIBLTE_M2AP_ENBNAME_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_enbname(LIBLTE_M2AP_ENBNAME_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_enbname(uint8_t** ptr, LIBLTE_M2AP_ENBNAME_STRUCT* ie); /******************************************************************************* * ProtocolIE Global-ENB-Id SEQUENCE *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_PLMN_IDENTITY_STRUCT pLMNidentity; LIBLTE_M2AP_ENB_ID_STRUCT eNB_ID; bool iE_Extensions_present; LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT iE_Extensions; } LIBLTE_M2AP_GLOBAL_ENB_ID_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_globalenbid(LIBLTE_M2AP_GLOBAL_ENB_ID_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_globalenbid(uint8_t** ptr, LIBLTE_M2AP_GLOBAL_ENB_ID_STRUCT* ie); /******************************************************************************* * ProtocolIE Global-MCE-Id SEQUENCE *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_PLMN_IDENTITY_STRUCT pLMN_Identity; LIBLTE_M2AP_MCE_ID_STRUCT mCE_ID; bool iE_Extensions_present; LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT iE_extensions; } LIBLTE_M2AP_GLOBAL_MCE_ID_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_globalmceid(LIBLTE_M2AP_GLOBAL_MCE_ID_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_globalmceid(uint8_t** ptr, LIBLTE_M2AP_GLOBAL_MCE_ID_STRUCT* ie); /******************************************************************************* * ProtocolIE GTP-TEID STATIC OCTET STRING *******************************************************************************/ typedef struct { uint8_t buffer[4]; } LIBLTE_M2AP_GTP_TEID_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_gtpteid(LIBLTE_M2AP_GTP_TEID_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_gtpteid(uint8_t** ptr, LIBLTE_M2AP_GTP_TEID_STRUCT* ie); /******************************************************************************* * ProtocolIE IPAddress DYNAMIC OCTET STRING *******************************************************************************/ typedef struct { uint8_t len; uint8_t buffer[16]; } LIBLTE_M2AP_IP_ADDRESS_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_ipaddress(LIBLTE_M2AP_IP_ADDRESS_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_ipaddress(uint8_t** ptr, LIBLTE_M2AP_IP_ADDRESS_STRUCT* ie); /******************************************************************************* * ProtocolIE LCID INTEGER *******************************************************************************/ typedef struct { uint8_t lcid; } LIBLTE_M2AP_LCID_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_lcid(LIBLTE_M2AP_LCID_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_lcid(uint8_t** ptr, LIBLTE_M2AP_LCID_STRUCT* ie); /******************************************************************************* * ProtocolIE MBMS-Service-associatedLogicalM2-ConnectionItem SEQUENCE *******************************************************************************/ typedef struct { bool eNB_MBMS_M2AP_ID_present; LIBLTE_M2AP_ENB_MBMS_M2AP_ID_STRUCT eNB_MBMS_M2AP_ID; bool mCE_MBMS_M2AP_ID_present; LIBLTE_M2AP_ENB_MBMS_M2AP_ID_STRUCT mCE_MBMS_M2AP_ID; } LIBLTE_M2AP_MBMS_SERVICE_ASSOCIATEDLOGICALM2_CONNECTIONITEM_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbmsserviceassociatedlogicalm2connectionitem( LIBLTE_M2AP_MBMS_SERVICE_ASSOCIATEDLOGICALM2_CONNECTIONITEM_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbmsserviceassociatedlogicalm2connectionitem( uint8_t** ptr, LIBLTE_M2AP_MBMS_SERVICE_ASSOCIATEDLOGICALM2_CONNECTIONITEM_STRUCT* ie); /******************************************************************************* * ProtocolIE MBMS-Session-Id STATIC OCTET STRING *******************************************************************************/ typedef struct { uint8_t buffer[1]; } LIBLTE_M2AP_MBMS_SESSION_ID_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbmssessionid(LIBLTE_M2AP_MBMS_SESSION_ID_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbmssessionid(uint8_t** ptr, LIBLTE_M2AP_MBMS_SESSION_ID_STRUCT* ie); /******************************************************************************* * ProtocolIE MBSFN-Area-ID INTEGER *******************************************************************************/ typedef struct { uint8_t mbsfn_area_id; } LIBLTE_M2AP_MBSFN_AREA_ID_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbsfnareaid(LIBLTE_M2AP_MBSFN_AREA_ID_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbsfnareaid(uint8_t** ptr, LIBLTE_M2AP_MBSFN_AREA_ID_STRUCT* ie); /******************************************************************************* * ProtocolIE MBSFN-SynchronizationArea-ID INTEGER *******************************************************************************/ typedef struct { uint32_t mbsfn_synchronization_area_id; } LIBLTE_M2AP_MBSFN_SYNCHRONIZATION_AREA_ID_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbsfnsynchronizationareaid(LIBLTE_M2AP_MBSFN_SYNCHRONIZATION_AREA_ID_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbsfnsynchronizationareaid(uint8_t** ptr, LIBLTE_M2AP_MBSFN_SYNCHRONIZATION_AREA_ID_STRUCT* ie); /******************************************************************************* * ProtocolIE RadioframeAllocationPeriod ENUMERATED *******************************************************************************/ typedef enum { LIBLTE_M2AP_RADIOFRAME_ALLOCATION_PERIOD_N1, LIBLTE_M2AP_RADIOFRAME_ALLOCATION_PERIOD_N2, LIBLTE_M2AP_RADIOFRAME_ALLOCATION_PERIOD_N4, LIBLTE_M2AP_RADIOFRAME_ALLOCATION_PERIOD_N8, LIBLTE_M2AP_RADIOFRAME_ALLOCATION_PERIOD_N16, LIBLTE_M2AP_RADIOFRAME_ALLOCATION_PERIOD_N32 } LIBLTE_M2AP_RADIOFRAME_ALLOCATION_PERIOD_ENUM; typedef struct { LIBLTE_M2AP_RADIOFRAME_ALLOCATION_PERIOD_ENUM e; } LIBLTE_M2AP_RADIOFRAME_ALLOCATION_PERIOD_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_radioframeallocationperiod(LIBLTE_M2AP_RADIOFRAME_ALLOCATION_PERIOD_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_radioframeallocationperiod(uint8_t** ptr, LIBLTE_M2AP_RADIOFRAME_ALLOCATION_PERIOD_STRUCT* ie); /******************************************************************************* * ProtocolIE RadioframeAllocationOffset INTEGER *******************************************************************************/ typedef struct { uint8_t radioframeAllocationOffset; } LIBLTE_M2AP_RADIOFRAME_ALLOCATION_OFFSET_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_radioframeallocationoffset(LIBLTE_M2AP_RADIOFRAME_ALLOCATION_OFFSET_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_radioframeallocationoffset(uint8_t** ptr, LIBLTE_M2AP_RADIOFRAME_ALLOCATION_OFFSET_STRUCT* ie); /******************************************************************************* * ProtocolIE SubframeAllocation CHOICE *******************************************************************************/ typedef enum { LIBLTE_M2AP_SUBFRAME_ALLOCATION_ONE_FRAME, LIBLTE_M2AP_SUBFRAME_ALLOCATION_FOUR_FRAMES } LIBLTE_M2AP_SUBFRAME_ALLOCATION_ENUM; typedef struct { LIBLTE_M2AP_SUBFRAME_ALLOCATION_ENUM choice_type; union { uint8_t oneFrame[6]; // BIT STRING uint8_t fourFrames[24]; // BIT STRING } choice; } LIBLTE_M2AP_SUBFRAME_ALLOCATION_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_subframeallocation(LIBLTE_M2AP_SUBFRAME_ALLOCATION_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_subframeallocation(uint8_t** ptr, LIBLTE_M2AP_SUBFRAME_ALLOCATION_STRUCT* ie); /******************************************************************************* * ProtocolIE MBSFN-Subframe-Configuration SEQUENCE *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_RADIOFRAME_ALLOCATION_PERIOD_STRUCT radioFrameAllocationPeriod; LIBLTE_M2AP_RADIOFRAME_ALLOCATION_OFFSET_STRUCT radioFrameAllocationOffset; LIBLTE_M2AP_SUBFRAME_ALLOCATION_STRUCT subframeAllocation; bool iE_Extensions_present; LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT iE_Extensions; } LIBLTE_M2AP_MBSFN_SUBFRAME_CONFIGURATION_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbsfnsubframeconfiguration(LIBLTE_M2AP_MBSFN_SUBFRAME_CONFIGURATION_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbsfnsubframeconfiguration(uint8_t** ptr, LIBLTE_M2AP_MBSFN_SUBFRAME_CONFIGURATION_STRUCT* ie); /******************************************************************************* * ProtocolIE MBSFN-Subframe-Configuration-List SEQUENCE *******************************************************************************/ typedef struct { uint32_t len; LIBLTE_M2AP_MBSFN_SUBFRAME_CONFIGURATION_STRUCT buffer[32]; } LIBLTE_M2AP_MBSFN_SUBFRAME_CONFIGURATION_LIST_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbsfnsubframeconfigurationlist(LIBLTE_M2AP_MBSFN_SUBFRAME_CONFIGURATION_LIST_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbsfnsubframeconfigurationlist(uint8_t** ptr, LIBLTE_M2AP_MBSFN_SUBFRAME_CONFIGURATION_LIST_STRUCT* ie); /******************************************************************************* * ProtocolIE MCCH-Upadte-Time INTEGER *******************************************************************************/ // lb:0;ub:255 typedef struct { uint8_t mcchUpdateTime; } LIBLTE_M2AP_MCCH_UPDATE_TIME_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mcchupdatetime(LIBLTE_M2AP_MCCH_UPDATE_TIME_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mcchupdatetime(uint8_t** ptr, LIBLTE_M2AP_MCCH_UPDATE_TIME_STRUCT* ie); /******************************************************************************* * ProtocolIE PDCCH-Length ENUM *******************************************************************************/ typedef enum { LIBLTE_M2AP_PDCCH_LENGTH_S1, LIBLTE_M2AP_PDCCH_LENGTH_S2, } LIBLTE_M2AP_PDCCH_LENGTH_ENUM; typedef struct { bool ext; LIBLTE_M2AP_PDCCH_LENGTH_ENUM pdcchLength; } LIBLTE_M2AP_PDCCH_LENGTH_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_pdcchlength(LIBLTE_M2AP_PDCCH_LENGTH_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_pdcchlength(uint8_t** ptr, LIBLTE_M2AP_PDCCH_LENGTH_STRUCT* ie); /******************************************************************************* * ProtocolIE Repetition Period ENUM *******************************************************************************/ typedef enum { LIBLTE_M2AP_REPETITION_PERIOD_RF32, LIBLTE_M2AP_REPETITION_PERIOD_RF64, LIBLTE_M2AP_REPETITION_PERIOD_RF128, LIBLTE_M2AP_REPETITION_PERIOD_RF256, } LIBLTE_M2AP_REPETITION_PERIOD_ENUM; typedef struct { LIBLTE_M2AP_REPETITION_PERIOD_ENUM repetitionPeriod; } LIBLTE_M2AP_REPETITION_PERIOD_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_repetiotionperiod(LIBLTE_M2AP_REPETITION_PERIOD_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_repetiotionperiod(uint8_t** ptr, LIBLTE_M2AP_REPETITION_PERIOD_STRUCT* ie); /******************************************************************************* * ProtocolIE OFFSET INTEGER *******************************************************************************/ typedef struct { uint8_t offset; } LIBLTE_M2AP_OFFSET_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_offset(LIBLTE_M2AP_OFFSET_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_offset(uint8_t** ptr, LIBLTE_M2AP_OFFSET_STRUCT* ie); /******************************************************************************* * ProtocolIE Modification Period ENUM *******************************************************************************/ typedef enum { LIBLTE_M2AP_MODIFICATION_PERIOD_RF512, LIBLTE_M2AP_MODIFICATION_PERIOD_RF1024, } LIBLTE_M2AP_MODIFICATION_PERIOD_ENUM; typedef struct { LIBLTE_M2AP_MODIFICATION_PERIOD_ENUM modificationPeriod; } LIBLTE_M2AP_MODIFICATION_PERIOD_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_modificationperiod(LIBLTE_M2AP_MODIFICATION_PERIOD_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_modificationperiod(uint8_t** ptr, LIBLTE_M2AP_MODIFICATION_PERIOD_STRUCT* ie); /******************************************************************************* * ProtocolIE Subframe-Allocation-Info STATIC BIT STRING *******************************************************************************/ #define LIBLTE_M2AP_SUBFRAME_ALLOCATION_INFO_BIT_STRING_LEN 6 typedef struct { uint8_t buffer[6]; } LIBLTE_M2AP_SUBFRAME_ALLOCATION_INFO_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_subframeallocationinfo(LIBLTE_M2AP_SUBFRAME_ALLOCATION_INFO_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_subframeallocationinfo(uint8_t** ptr, LIBLTE_M2AP_SUBFRAME_ALLOCATION_INFO_STRUCT* ie); /******************************************************************************* * ProtocolIE Modulation-and-Coding-Scheme ENUM *******************************************************************************/ typedef enum { LIBLTE_M2AP_MODULATION_AND_CODING_SCHEME_N2, LIBLTE_M2AP_MODULATION_AND_CODING_SCHEME_N7, LIBLTE_M2AP_MODULATION_AND_CODING_SCHEME_N13, LIBLTE_M2AP_MODULATION_AND_CODING_SCHEME_N19 } LIBLTE_M2AP_MODULATION_AND_CODING_SCHEME_ENUM; typedef struct { LIBLTE_M2AP_MODULATION_AND_CODING_SCHEME_ENUM mcs; } LIBLTE_M2AP_MODULATION_AND_CODING_SCHEME_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_modulationandcodingscheme(LIBLTE_M2AP_MODULATION_AND_CODING_SCHEME_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_modulationandcodingscheme(uint8_t** ptr, LIBLTE_M2AP_MODULATION_AND_CODING_SCHEME_STRUCT* ie); /******************************************************************************* * ProtocolIE MCCHrelatedBCCH-ConfigPerMBSFNArea-Item SEQUENCE *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_MBSFN_AREA_ID_STRUCT mbsfnArea; LIBLTE_M2AP_PDCCH_LENGTH_STRUCT pdcchLength; LIBLTE_M2AP_REPETITION_PERIOD_STRUCT repetitionPeriod; LIBLTE_M2AP_OFFSET_STRUCT offset; LIBLTE_M2AP_MODIFICATION_PERIOD_STRUCT modificationPeriod; LIBLTE_M2AP_SUBFRAME_ALLOCATION_INFO_STRUCT subframeAllocationInfo; LIBLTE_M2AP_MODULATION_AND_CODING_SCHEME_STRUCT modulationAndCodingScheme; bool cellInformationList_present; LIBLTE_M2AP_CELL_INFORMATION_LIST_STRUCT cellInformationList; bool iE_Extensions_present; LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT iE_Extensions; } LIBLTE_M2AP_MCCH_RELATED_BCCH_CONFIG_PER_MBSFN_AREA_ITEM_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mcchrelatedbcchconfigpermbsfnareaitem( LIBLTE_M2AP_MCCH_RELATED_BCCH_CONFIG_PER_MBSFN_AREA_ITEM_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mcchrelatedbcchconfigpermbsfnareaitem( uint8_t** ptr, LIBLTE_M2AP_MCCH_RELATED_BCCH_CONFIG_PER_MBSFN_AREA_ITEM_STRUCT* ie); /******************************************************************************* * ProtocolIE MCCHrelatedBCCH-ConfigPerMBSFNArea DYNAMIC SEQUENCE *******************************************************************************/ typedef struct { uint16_t len; LIBLTE_M2AP_MCCH_RELATED_BCCH_CONFIG_PER_MBSFN_AREA_ITEM_STRUCT buffer[8]; } LIBLTE_M2AP_MCCH_RELATED_BCCH_CONFIG_PER_MBSFN_AREA_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mcchrelatedbcchconfigpermbsfnarea(LIBLTE_M2AP_MCCH_RELATED_BCCH_CONFIG_PER_MBSFN_AREA_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mcchrelatedbcchconfigpermbsfnarea(uint8_t** ptr, LIBLTE_M2AP_MCCH_RELATED_BCCH_CONFIG_PER_MBSFN_AREA_STRUCT* ie); /******************************************************************************* * ProtocolIE MCH-Scheduling-Period ENUM *******************************************************************************/ typedef enum { LIBLTE_M2AP_MCH_SCHEDULING_PERIOD_RF8, LIBLTE_M2AP_MCH_SCHEDULING_PERIOD_RF16, LIBLTE_M2AP_MCH_SCHEDULING_PERIOD_RF32, LIBLTE_M2AP_MCH_SCHEDULING_PERIOD_RF64, LIBLTE_M2AP_MCH_SCHEDULING_PERIOD_RF128, LIBLTE_M2AP_MCH_SCHEDULING_PERIOD_RF256, LIBLTE_M2AP_MCH_SCHEDULING_PERIOD_RF512, LIBLTE_M2AP_MCH_SCHEDULING_PERIOD_RF1024 } LIBLTE_M2AP_MCH_SCHEDULING_PERIOD_ENUM; typedef struct { LIBLTE_M2AP_MCH_SCHEDULING_PERIOD_ENUM e; } LIBLTE_M2AP_MCH_SCHEDULING_PERIOD_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mchschedulingperiod(LIBLTE_M2AP_MCH_SCHEDULING_PERIOD_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mchschedulingperiod(uint8_t** ptr, LIBLTE_M2AP_MCH_SCHEDULING_PERIOD_STRUCT* ie); /******************************************************************************* * ProtocolIE OFFSET INTEGER *******************************************************************************/ typedef struct { uint8_t dataMCS; } LIBLTE_M2AP_DATA_MCS_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_datamcs(LIBLTE_M2AP_DATA_MCS_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_datamcs(uint8_t** ptr, LIBLTE_M2AP_DATA_MCS_STRUCT* ie); /******************************************************************************* * ProtocolIE Service Id STATIC OCTET STRING *******************************************************************************/ #define LIBLTE_M2AP_SERVICE_ID_OCTET_STRING_LEN 3 typedef struct { uint8_t buffer[3]; } LIBLTE_M2AP_SERVICE_ID_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_serviceid(LIBLTE_M2AP_SERVICE_ID_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_serviceid(uint8_t** ptr, LIBLTE_M2AP_SERVICE_ID_STRUCT* ie); /******************************************************************************* * ProtocolIE TMGI SEQUENCE *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_PLMN_IDENTITY_STRUCT pLMN_Identity; LIBLTE_M2AP_SERVICE_ID_STRUCT serviceID; bool iE_Extensions_present; LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT iE_Extensions; } LIBLTE_M2AP_TMGI_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_tmgi(LIBLTE_M2AP_TMGI_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_tmgi(uint8_t** ptr, LIBLTE_M2AP_TMGI_STRUCT* ie); /******************************************************************************* * ProtocolIE MBMSSessionListPerPMCH-Item SEQUENCE (SIZE(1..maxnoofSessionsPerPMCH)) OF SEQUENCE *******************************************************************************/ typedef struct { uint16_t len; struct { bool ext; LIBLTE_M2AP_TMGI_STRUCT Tmgi; LIBLTE_M2AP_LCID_STRUCT Lcid; bool iE_Extensions_present; } buffer[8]; } LIBLTE_M2AP_MBMS_SESSION_LIST_PER_PMCH_ITEM_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbmssessionlistperpmchitem(LIBLTE_M2AP_MBMS_SESSION_LIST_PER_PMCH_ITEM_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbmssessionlistperpmchitem(uint8_t** ptr, LIBLTE_M2AP_MBMS_SESSION_LIST_PER_PMCH_ITEM_STRUCT* ie); /******************************************************************************* * ProtocolIE PMCH-Configuration SEQUENCE *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_ALLOCATED_SUBFRAMES_END_STRUCT allocatedSubframesEnd; LIBLTE_M2AP_DATA_MCS_STRUCT dataMCS; LIBLTE_M2AP_MCH_SCHEDULING_PERIOD_STRUCT mchSchedulingPeriod; bool iE_Extensions_present; LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT iE_Extensions; } LIBLTE_M2AP_PMCH_CONFIGURATION_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_pmchconfiguration(LIBLTE_M2AP_PMCH_CONFIGURATION_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_pmchconfiguration(uint8_t** ptr, LIBLTE_M2AP_PMCH_CONFIGURATION_STRUCT* ie); /******************************************************************************* * ProtocolIE PMCH-Configuration-Item SEQUENCE *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_PMCH_CONFIGURATION_STRUCT PMCHConfiguration; LIBLTE_M2AP_MBMS_SESSION_LIST_PER_PMCH_ITEM_STRUCT MBMSSessionListPerPMCHItem; bool iE_Extensions_present; LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT iE_Extensions; } LIBLTE_M2AP_PMCH_CONFIGURATION_ITEM_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_pmchconfigurationitem(LIBLTE_M2AP_PMCH_CONFIGURATION_ITEM_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_pmchconfigurationitem(uint8_t** ptr, LIBLTE_M2AP_PMCH_CONFIGURATION_ITEM_STRUCT* ie); /******************************************************************************* * ProtocolIE PMCH-Configuration-List SEQUENCE *******************************************************************************/ typedef struct { bool ext; uint16_t len; LIBLTE_M2AP_PMCH_CONFIGURATION_ITEM_STRUCT buffer[32]; bool iE_Extensions_present; LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT iE_Extensions; } LIBLTE_M2AP_PMCH_CONFIGURATION_LIST_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_pmchconfigurationlist(LIBLTE_M2AP_PMCH_CONFIGURATION_LIST_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_pmchconfigurationlist(uint8_t** ptr, LIBLTE_M2AP_PMCH_CONFIGURATION_LIST_STRUCT* ie); /******************************************************************************* * ProtocolIE Common-Subframe-Scheduling-Period ENUM *******************************************************************************/ typedef enum { LIBLTE_M2AP_COMMON_SUBFRAME_ALLOCATION_PERIOD_RF4, LIBLTE_M2AP_COMMON_SUBFRAME_ALLOCATION_PERIOD_RF8, LIBLTE_M2AP_COMMON_SUBFRAME_ALLOCATION_PERIOD_RF16, LIBLTE_M2AP_COMMON_SUBFRAME_ALLOCATION_PERIOD_RF32, LIBLTE_M2AP_COMMON_SUBFRAME_ALLOCATION_PERIOD_RF64, LIBLTE_M2AP_COMMON_SUBFRAME_ALLOCATION_PERIOD_RF128, LIBLTE_M2AP_COMMON_SUBFRAME_ALLOCATION_PERIOD_RF256, } LIBLTE_M2AP_COMMON_SUBFRAME_ALLOCATION_PERIOD_ENUM; typedef struct { LIBLTE_M2AP_COMMON_SUBFRAME_ALLOCATION_PERIOD_ENUM e; } LIBLTE_M2AP_COMMON_SUBFRAME_ALLOCATION_PERIOD_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_commonsubframeallocationperiod(LIBLTE_M2AP_COMMON_SUBFRAME_ALLOCATION_PERIOD_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_commonsubframeallocationperiod(uint8_t** ptr, LIBLTE_M2AP_COMMON_SUBFRAME_ALLOCATION_PERIOD_STRUCT* ie); /******************************************************************************* * ProtocolIE Time-to-Wait ENUM *******************************************************************************/ typedef enum { LIBLTE_M2AP_TIME_TO_WAIT_V1S, LIBLTE_M2AP_TIME_TO_WAIT_V2S, LIBLTE_M2AP_TIME_TO_WAIT_V5S, LIBLTE_M2AP_TIME_TO_WAIT_V10S, LIBLTE_M2AP_TIME_TO_WAIT_V20S, LIBLTE_M2AP_TIME_TO_WAIT_V60S, } LIBLTE_M2AP_TIME_TO_WAIT_ENUM; typedef struct { LIBLTE_M2AP_TIME_TO_WAIT_ENUM e; } LIBLTE_M2AP_TIME_TO_WAIT_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_timetowait(LIBLTE_M2AP_TIME_TO_WAIT_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_timetowait(uint8_t** ptr, LIBLTE_M2AP_TIME_TO_WAIT_STRUCT* ie); /******************************************************************************* * ProtocolIE TNL-Information SEQUENCE *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_IP_ADDRESS_STRUCT iPMCAddress; LIBLTE_M2AP_IP_ADDRESS_STRUCT iPSourceAddress; LIBLTE_M2AP_GTP_TEID_STRUCT gtpTeid; bool iE_Extensions_present; LIBLTE_M2AP_PROTOCOLEXTENSIONCONTAINER_STRUCT iE_Extensions; } LIBLTE_M2AP_TNL_INFORMATION_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_tnlinformation(LIBLTE_M2AP_TNL_INFORMATION_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_tnlinformation(uint8_t** ptr, LIBLTE_M2AP_TNL_INFORMATION_STRUCT* ie); /******************************************************************************* * ProtocolIE ENB-MBMS-Configuration-data-List SEQUENCE OF ProtocolIE-Single-Container *******************************************************************************/ // lb:1;ub:maxnofCells (256) typedef struct { uint8_t len; LIBLTE_M2AP_ENB_MBMS_CONFIGURATION_DATA_ITEM_STRUCT buffer[32]; // Waring: Artificial limit to reduce memory footprint } LIBLTE_M2AP_ENB_MBMS_CONFIGURATION_DATA_LIST_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_enbmbmsconfigurationdatalist(LIBLTE_M2AP_ENB_MBMS_CONFIGURATION_DATA_LIST_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_enbmbmsconfigurationdatalist(uint8_t** ptr, LIBLTE_M2AP_ENB_MBMS_CONFIGURATION_DATA_LIST_STRUCT* ie); /******************************************************************************* * ProtocolIE MBSFN-AreaConfiguration-Item ProtocolIE-Container *******************************************************************************/ typedef struct { LIBLTE_M2AP_PMCH_CONFIGURATION_LIST_STRUCT PMCHConfigurationList; LIBLTE_M2AP_MBSFN_SUBFRAME_CONFIGURATION_LIST_STRUCT MBSFNSubframeConfigurationList; LIBLTE_M2AP_COMMON_SUBFRAME_ALLOCATION_PERIOD_STRUCT CommonSubframeAllocationPeriod; LIBLTE_M2AP_MBSFN_AREA_ID_STRUCT MBSFNAreaId; } LIBLTE_M2AP_MBSFN_AREA_CONFIGURATION_ITEM_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbsfnareaconfigurationitem(LIBLTE_M2AP_MBSFN_AREA_CONFIGURATION_ITEM_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbsfnareaconfigurationitem(uint8_t** ptr, LIBLTE_M2AP_MBSFN_AREA_CONFIGURATION_ITEM_STRUCT* ie); /******************************************************************************* * ProtocolIE MBSFN-AreaConfiguration-List SEQUENCE OF ProtocolIE-Single-Container *******************************************************************************/ // lb:1;ub:maxnofCells (256) typedef struct { uint8_t len; LIBLTE_M2AP_MBSFN_AREA_CONFIGURATION_ITEM_STRUCT buffer[32]; // Waring: Artificial limit to reduce memory footprint } LIBLTE_M2AP_MBSFN_AREA_CONFIGURATION_LIST_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbsfnareaconfigurationlist(LIBLTE_M2AP_MBSFN_AREA_CONFIGURATION_LIST_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbsfnareaconfigurationlist(uint8_t** ptr, LIBLTE_M2AP_MBSFN_AREA_CONFIGURATION_LIST_STRUCT* ie); /******************************************************************************* * Protocol Message M2SetupRequest STRUCT *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_GLOBAL_ENB_ID_STRUCT Global_ENB_ID; bool eNBname_present; LIBLTE_M2AP_ENBNAME_STRUCT eNBname; LIBLTE_M2AP_ENB_MBMS_CONFIGURATION_DATA_LIST_STRUCT configurationDataList; } LIBLTE_M2AP_MESSAGE_M2SETUPREQUEST_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_m2setuprequest(LIBLTE_M2AP_MESSAGE_M2SETUPREQUEST_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_m2setuprequest(uint8_t** ptr, LIBLTE_M2AP_MESSAGE_M2SETUPREQUEST_STRUCT* ie); /******************************************************************************* * Protocol Message M2SetupResponse STRUCT *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_GLOBAL_MCE_ID_STRUCT Global_MCE_ID; bool MCEname_present; LIBLTE_M2AP_MCE_NAME_STRUCT MCEname; LIBLTE_M2AP_MCCH_RELATED_BCCH_CONFIG_PER_MBSFN_AREA_STRUCT MCCHrelatedBCCHConfigPerMBSFNArea; bool criticalityDiagnosis_present; LIBLTE_M2AP_CRITICALITYDIAGNOSTICS_STRUCT criticalityDiagnosis; } LIBLTE_M2AP_MESSAGE_M2SETUPRESPONSE_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_m2setupresponse(LIBLTE_M2AP_MESSAGE_M2SETUPRESPONSE_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_m2setupresponse(uint8_t** ptr, LIBLTE_M2AP_MESSAGE_M2SETUPRESPONSE_STRUCT* ie); /******************************************************************************* * Protocol Message MBMSSessionStartRequest STRUCT *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_MCE_MBMS_M2AP_ID_STRUCT MceMbmsM2apId; LIBLTE_M2AP_TMGI_STRUCT Tmgi; bool MbmsSessionId_present; LIBLTE_M2AP_MBMS_SESSION_ID_STRUCT MbmsSessionId; LIBLTE_M2AP_MBMS_SERVICE_AREA_STRUCT MbmsServiceArea; LIBLTE_M2AP_TNL_INFORMATION_STRUCT TnlInformation; } LIBLTE_M2AP_MESSAGE_MBMSSESSIONSTARTREQUEST_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbmssessionstartrequest(LIBLTE_M2AP_MESSAGE_MBMSSESSIONSTARTREQUEST_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbmssessionstartrequest(uint8_t** ptr, LIBLTE_M2AP_MESSAGE_MBMSSESSIONSTARTREQUEST_STRUCT* ie); /******************************************************************************* * Protocol Message MBMSSessionStartResponse STRUCT *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_MCE_MBMS_M2AP_ID_STRUCT MceMbmsM2apId; LIBLTE_M2AP_ENB_MBMS_M2AP_ID_STRUCT EnbMbmsM2apId; bool CriticalityDiagnostics_present; LIBLTE_M2AP_CRITICALITYDIAGNOSTICS_STRUCT CriticalityDiagnostics; } LIBLTE_M2AP_MESSAGE_MBMSSESSIONSTARTRESPONSE_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbmssessionstartresponse(LIBLTE_M2AP_MESSAGE_MBMSSESSIONSTARTRESPONSE_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbmssessionstartresponse(uint8_t** ptr, LIBLTE_M2AP_MESSAGE_MBMSSESSIONSTARTRESPONSE_STRUCT* ie); /******************************************************************************* * Protocol Message MBMSSchedulingInformation STRUCT *******************************************************************************/ typedef struct { bool ext; LIBLTE_M2AP_MCCH_UPDATE_TIME_STRUCT MCCHUpdateTime; LIBLTE_M2AP_MBSFN_AREA_CONFIGURATION_LIST_STRUCT MbsfnAreaConfigurationList; } LIBLTE_M2AP_MESSAGE_MBMSSCHEDULINGINFORMATION_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbmsschedulinginformation(LIBLTE_M2AP_MESSAGE_MBMSSCHEDULINGINFORMATION_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbmsschedulinginformation(uint8_t** ptr, LIBLTE_M2AP_MESSAGE_MBMSSCHEDULINGINFORMATION_STRUCT* ie); /******************************************************************************* * Protocol Message MBMSSchedulingInformationResponse STRUCT *******************************************************************************/ typedef struct { bool ext; bool CriticalityDiagnostics_present; LIBLTE_M2AP_CRITICALITYDIAGNOSTICS_STRUCT CriticalityDiagnostics; } LIBLTE_M2AP_MESSAGE_MBMSSCHEDULINGINFORMATIONRESPONSE_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_mbmsschedulinginformation(LIBLTE_M2AP_MESSAGE_MBMSSCHEDULINGINFORMATION_STRUCT* ie, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_mbmsschedulinginformation(uint8_t** ptr, LIBLTE_M2AP_MESSAGE_MBMSSCHEDULINGINFORMATION_STRUCT* ie); /******************************************************************************* * ProtocolIE-Field *******************************************************************************/ LIBLTE_ERROR_ENUM liblte_m2ap_pack_protocolie_header(uint32_t len, uint32_t ie_id, LIBLTE_M2AP_CRITICALITY_ENUM crit, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_protocolie_header(uint8_t** ptr, uint32_t* ie_id, LIBLTE_M2AP_CRITICALITY_ENUM* crit, uint32_t* len); /******************************************************************************* * Procedure code criticality lookups *******************************************************************************/ LIBLTE_M2AP_CRITICALITY_ENUM liblte_m2ap_procedure_criticality(uint8_t procedureCode); /******************************************************************************* * InitiatingMessage CHOICE ********************************************************************************/ typedef enum { LIBLTE_M2AP_INITIATINGMESSAGE_CHOICE_MBMSSESSIONSTARTREQUEST, LIBLTE_M2AP_INITIATINGMESSAGE_CHOICE_MBMSSESSIONSTOPREQUEST, LIBLTE_M2AP_INITIATINGMESSAGE_CHOICE_MBMSSESSION_UPDATEREQUEST, LIBLTE_M2AP_INITIATINGMESSAGE_CHOICE_MBMSSCHEDULINGINFORMATION, LIBLTE_M2AP_INITIATINGMESSAGE_CHOICE_RESET, LIBLTE_M2AP_INITIATINGMESSAGE_CHOICE_M2SETUPREQUEST, LIBLTE_M2AP_INITIATINGMESSAGE_CHOICE_ENBCONFIGURATIONUPDATE, LIBLTE_M2AP_INITIATINGMESSAGE_CHOICE_MCECONFIGURATIONUPDATE, LIBLTE_M2AP_INITIATINGMESSAGE_CHOICE_MBMSSERVICECOUNTINGREQUEST, LIBLTE_M2AP_INITIATINGMESSAGE_CHOICE_N_ITEMS, } LIBLTE_M2AP_INITIATINGMESSAGE_CHOICE_ENUM; static const char liblte_m2ap_initiatingmessage_choice_text[LIBLTE_M2AP_INITIATINGMESSAGE_CHOICE_N_ITEMS][50] = { "MbmsSessionStartRequest", "MbmsSessionStopRequest", "MbmsSessionUpdateRequest", "MbmsSchedulingInformation", "Reset", "M2SetupRequest", "EnbConfigurationUpdate", "MceConfigurationUpdate", "MbmsServiceCountingRequest"}; typedef union { LIBLTE_M2AP_MESSAGE_MBMSSESSIONSTARTREQUEST_STRUCT MbmsSessionStartRequest; // LIBLTE_M2AP_MBMS_SESSION_STOP_REQUEST MbmsSessionStopRequest; // LIBLTE_M2AP_MBMS_SESSION_UPDATE_REQUEST MbmsSessionUpdateRequest; LIBLTE_M2AP_MESSAGE_MBMSSCHEDULINGINFORMATION_STRUCT MbmsSchedulingInformation; // LIBLTE_M2AP_RESET Reset; LIBLTE_M2AP_MESSAGE_M2SETUPREQUEST_STRUCT M2SetupRequest; // LIBLTE_M2AP_ENB_CONFIGURATION_UPDATE EnbConfigurationUpdate; // LIBLTE_M2AP_MCE_CONFIGURATION_UPDATE MceConfigurationUpdate; // LIBLTE_M2AP_MBMS_SERVICE_COUNTING_REQUEST MbmsServiceCountingRequest } LIBLTE_M2AP_INITIATINGMESSAGE_CHOICE_UNION; typedef struct { uint8_t procedureCode; LIBLTE_M2AP_CRITICALITY_ENUM criticality; LIBLTE_M2AP_INITIATINGMESSAGE_CHOICE_UNION choice; LIBLTE_M2AP_INITIATINGMESSAGE_CHOICE_ENUM choice_type; } LIBLTE_M2AP_INITIATINGMESSAGE_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_initiatingmessage(LIBLTE_M2AP_INITIATINGMESSAGE_STRUCT* msg, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_initiatingmessage(uint8_t** ptr, LIBLTE_M2AP_INITIATINGMESSAGE_STRUCT* msg); /******************************************************************************* * UnsuccessfulOutcome CHOICE *******************************************************************************/ typedef enum { LIBLTE_M2AP_UNSUCCESSFULOUTCOME_CHOICE_MBMSSESSIONSTARTFAILURE, LIBLTE_M2AP_UNSUCCESSFULOUTCOME_CHOICE_MBMSSESSIONUPDATEFAILURE, LIBLTE_M2AP_UNSUCCESSFULOUTCOME_CHOICE_M2SETUPFAILURE, LIBLTE_M2AP_UNSUCCESSFULOUTCOME_CHOICE_ENBCONFIGURATIONUPDATEFAILURE, LIBLTE_M2AP_UNSUCCESSFULOUTCOME_CHOICE_MCECONFIGURATIONUPDATEFAILURE, LIBLTE_M2AP_UNSUCCESSFULOUTCOME_CHOICE_MBMSSERVICECOUNTINGFAILURE, LIBLTE_M2AP_UNSUCCESSFULOUTCOME_CHOICE_N_ITEMS, } LIBLTE_M2AP_UNSUCCESSFULOUTCOME_CHOICE_ENUM; static const char liblte_m2ap_unsuccessfuloutcome_choice_text[LIBLTE_M2AP_UNSUCCESSFULOUTCOME_CHOICE_N_ITEMS][50] = { "MbmsSessionStartFailure", "Mbmssessionupdatefailure", "M2SetupFailure", "EnbConfigurationUpdateFailure", "MceConfigurationUpdateFailure", }; typedef union { // LIBLTE_S1AP_MESSAGE_S1SETUPFAILURE_STRUCT S1SetupFailure; // LIBLTE_S1AP_MESSAGE_HANDOVERFAILURE_STRUCT HandoverFailure; // LIBLTE_S1AP_MESSAGE_MMECONFIGURATIONUPDATEFAILURE_STRUCT MMEConfigurationUpdateFailure; } LIBLTE_M2AP_UNSUCCESSFULOUTCOME_CHOICE_UNION; typedef struct { uint8_t procedureCode; LIBLTE_M2AP_CRITICALITY_ENUM criticality; LIBLTE_M2AP_UNSUCCESSFULOUTCOME_CHOICE_UNION choice; LIBLTE_M2AP_UNSUCCESSFULOUTCOME_CHOICE_ENUM choice_type; } LIBLTE_M2AP_UNSUCCESSFULOUTCOME_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_unsuccessfuloutcome(LIBLTE_M2AP_UNSUCCESSFULOUTCOME_STRUCT* msg, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_unsuccessfuloutcome(uint8_t** ptr, LIBLTE_M2AP_UNSUCCESSFULOUTCOME_STRUCT* msg); /******************************************************************************* * SuccessfulOutcome CHOICE *******************************************************************************/ typedef enum { LIBLTE_M2AP_SUCCESSFULOUTCOME_CHOICE_MBMSSESSIONSTARTRESPONSE, LIBLTE_M2AP_SUCCESSFULOUTCOME_CHOICE_MBMSSESSIONSTOPRESPONSE, LIBLTE_M2AP_SUCCESSFULOUTCOME_CHOICE_MBMSSESSIONUPDATERESPONSE, LIBLTE_M2AP_SUCCESSFULOUTCOME_CHOICE_MBMSSCHEDULINGINFORMATIONRESPONSE, LIBLTE_M2AP_SUCCESSFULOUTCOME_CHOICE_RESETACKNOWLEDGE, LIBLTE_M2AP_SUCCESSFULOUTCOME_CHOICE_M2SETUPRESPONSE, LIBLTE_M2AP_SUCCESSFULOUTCOME_CHOICE_ENBCONFIGURATIONUPDATEACKNOWLEDGE, LIBLTE_M2AP_SUCCESSFULOUTCOME_CHOICE_MCECONFIGURATIONUPDATEACKNOWLEDGE, LIBLTE_M2AP_SUCCESSFULOUTCOME_CHOICE_MBMSSERVICECOUNTINGRESPONSE, LIBLTE_M2AP_SUCCESSFULOUTCOME_CHOICE_N_ITEMS, } LIBLTE_M2AP_SUCCESSFULOUTCOME_CHOICE_ENUM; static const char liblte_m2ap_successfuloutcome_choice_text[LIBLTE_M2AP_SUCCESSFULOUTCOME_CHOICE_N_ITEMS][50] = { "MbmsSessionStartResponse", "MbmsSessionStopResponse", "MbmsSessionUpdateResponse", "MbmsSchedulingInformationResponse", "ResetAcknowledge", "M2SetupResponse", "EnbConfigurationUpdateAcknowledge", "MceConfigurationUpdateAcknowledge", "MbmsServiceCountingResponse", }; typedef union { LIBLTE_M2AP_MESSAGE_M2SETUPRESPONSE_STRUCT M2SetupResponse; LIBLTE_M2AP_MESSAGE_MBMSSESSIONSTARTRESPONSE_STRUCT MbmsSessionStartResponse; LIBLTE_M2AP_MESSAGE_MBMSSCHEDULINGINFORMATIONRESPONSE_STRUCT MbmsSchedulingInformationResponse; } LIBLTE_M2AP_SUCCESSFULOUTCOME_CHOICE_UNION; typedef struct { uint8_t procedureCode; LIBLTE_M2AP_CRITICALITY_ENUM criticality; LIBLTE_M2AP_SUCCESSFULOUTCOME_CHOICE_UNION choice; LIBLTE_M2AP_SUCCESSFULOUTCOME_CHOICE_ENUM choice_type; } LIBLTE_M2AP_SUCCESSFULOUTCOME_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_successfuloutcome(LIBLTE_M2AP_SUCCESSFULOUTCOME_STRUCT* msg, uint8_t** ptr); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_successfuloutcome(uint8_t** ptr, LIBLTE_M2AP_SUCCESSFULOUTCOME_STRUCT* msg); /******************************************************************************* * M2AP_PDU CHOICE *******************************************************************************/ typedef enum { LIBLTE_M2AP_M2AP_PDU_CHOICE_INITIATINGMESSAGE, LIBLTE_M2AP_M2AP_PDU_CHOICE_SUCCESSFULOUTCOME, LIBLTE_M2AP_M2AP_PDU_CHOICE_UNSUCCESSFULOUTCOME, LIBLTE_M2AP_M2AP_PDU_CHOICE_N_ITEMS, } LIBLTE_M2AP_M2AP_PDU_CHOICE_ENUM; static const char liblte_m2ap_m2ap_pdu_choice_text[LIBLTE_M2AP_M2AP_PDU_CHOICE_N_ITEMS][50] = { "initiatingMessage", "successfulOutcome", "unsuccessfulOutcome", }; typedef union { LIBLTE_M2AP_INITIATINGMESSAGE_STRUCT initiatingMessage; LIBLTE_M2AP_SUCCESSFULOUTCOME_STRUCT successfulOutcome; LIBLTE_M2AP_UNSUCCESSFULOUTCOME_STRUCT unsuccessfulOutcome; } LIBLTE_M2AP_M2AP_PDU_CHOICE_UNION; typedef struct { bool ext; LIBLTE_M2AP_M2AP_PDU_CHOICE_UNION choice; LIBLTE_M2AP_M2AP_PDU_CHOICE_ENUM choice_type; } LIBLTE_M2AP_M2AP_PDU_STRUCT; LIBLTE_ERROR_ENUM liblte_m2ap_pack_m2ap_pdu(LIBLTE_M2AP_M2AP_PDU_STRUCT* m2ap_pdu, LIBLTE_BYTE_MSG_STRUCT* msg); LIBLTE_ERROR_ENUM liblte_m2ap_unpack_m2ap_pdu(LIBLTE_BYTE_MSG_STRUCT* msg, LIBLTE_M2AP_M2AP_PDU_STRUCT* m2ap_pdu); #endif // SRSLTE_LIBLTE_M2AP_H