You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1503 lines
77 KiB
C

/*
* Copyright 2013-2019 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 <srslte/asn1/liblte_common.h>
/*******************************************************************************
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